diff --git a/fabro.toml b/.fabro/project.toml similarity index 97% rename from fabro.toml rename to .fabro/project.toml index 52c92cce5..24f0d8384 100644 --- a/fabro.toml +++ b/.fabro/project.toml @@ -1,8 +1,5 @@ _version = 1 -[project] -directory = "fabro/" - [run.pull_request] enabled = true draft = false diff --git a/fabro/workflows/gh-triage/workflow.fabro b/.fabro/workflows/gh-triage/workflow.fabro similarity index 100% rename from fabro/workflows/gh-triage/workflow.fabro rename to .fabro/workflows/gh-triage/workflow.fabro diff --git a/fabro/workflows/gh-triage/workflow.toml b/.fabro/workflows/gh-triage/workflow.toml similarity index 100% rename from fabro/workflows/gh-triage/workflow.toml rename to .fabro/workflows/gh-triage/workflow.toml diff --git a/fabro/workflows/implement-issue/workflow.fabro b/.fabro/workflows/implement-issue/workflow.fabro similarity index 100% rename from fabro/workflows/implement-issue/workflow.fabro rename to .fabro/workflows/implement-issue/workflow.fabro diff --git a/fabro/workflows/implement-issue/workflow.toml b/.fabro/workflows/implement-issue/workflow.toml similarity index 100% rename from fabro/workflows/implement-issue/workflow.toml rename to .fabro/workflows/implement-issue/workflow.toml diff --git a/fabro/workflows/implement-plan/workflow.fabro b/.fabro/workflows/implement-plan/workflow.fabro similarity index 100% rename from fabro/workflows/implement-plan/workflow.fabro rename to .fabro/workflows/implement-plan/workflow.fabro diff --git a/fabro/workflows/implement-plan/workflow.toml b/.fabro/workflows/implement-plan/workflow.toml similarity index 100% rename from fabro/workflows/implement-plan/workflow.toml rename to .fabro/workflows/implement-plan/workflow.toml diff --git a/fabro/workflows/smoke/workflow.fabro b/.fabro/workflows/smoke/workflow.fabro similarity index 82% rename from fabro/workflows/smoke/workflow.fabro rename to .fabro/workflows/smoke/workflow.fabro index d06725906..75d9be4a0 100644 --- a/fabro/workflows/smoke/workflow.fabro +++ b/.fabro/workflows/smoke/workflow.fabro @@ -8,8 +8,8 @@ digraph Smoke { toolchain [label="Toolchain", shape=parallelogram, script="rustc --version && cargo --version && bun --version 2>&1", goal_gate=true] compile_rust [label="Compile Rust", shape=parallelogram, script="cargo check -q --workspace 2>&1", goal_gate=true] compile_typescript [label="Compile TypeScript", shape=parallelogram, script="cd apps/fabro-web && bun install && bun run typecheck 2>&1", goal_gate=true] - lint_rust [label="Lint Rust", shape=parallelogram, script="cargo fmt --check --all 2>&1 && cargo clippy -q --workspace -- -D warnings 2>&1", goal_gate=true] - test_rust [label="Test Rust", shape=parallelogram, script="cargo nextest run --cargo-quiet --workspace --status-level fail 2>&1", goal_gate=true] + lint_rust [label="Lint Rust", shape=parallelogram, script="cargo +nightly fmt --check --all 2>&1 && cargo clippy -q --workspace -- -D warnings 2>&1", goal_gate=true] + test_rust [label="Test Rust", shape=parallelogram, script="ulimit -n 4096 && cargo nextest run --cargo-quiet --workspace --status-level fail 2>&1", goal_gate=true] test_typescript [label="Test TypeScript", shape=parallelogram, script="cd apps/fabro-web && bun test 2>&1", goal_gate=true] start -> toolchain diff --git a/fabro/workflows/smoke/workflow.toml b/.fabro/workflows/smoke/workflow.toml similarity index 100% rename from fabro/workflows/smoke/workflow.toml rename to .fabro/workflows/smoke/workflow.toml diff --git a/AGENTS.md b/AGENTS.md index c8fd5fafb..9412edeef 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -107,7 +107,7 @@ Never run `cargo insta accept` without first checking what's pending — it acce ## Testing workflows -- `fabro run ` — run a workflow by name (resolves `fabro/workflows//workflow.toml`), e.g. `fabro run repl` +- `fabro run ` — run a workflow by name (resolves `.fabro/workflows//workflow.toml`), e.g. `fabro run repl` - Use `--no-retro` to skip the retro step and finish faster - `#[e2e_test(twin, live("VAR"))]` — dual-mode test that runs against twin-openai or real API. `#[e2e_test(twin)]` for twin-only tests (e.g., scripted failures). `#[e2e_test(live("VAR"))]` for live-only tests requiring secrets. `#[e2e_test()]` for sandbox tests with no API deps. Behavior is controlled by `FABRO_TEST_MODE` (`live`, `strict`; default is `twin`), and `cargo nextest run --profile e2e ...` implies `strict`. Use `fabro_test::e2e_openai!()` in twin/dual-mode tests to get `(base_url, api_key)`. - Local test HTTP clients must use `.no_proxy()`. Prefer shared helpers like `fabro_test::test_http_client()` or crate-local equivalents instead of `reqwest::Client::new()`, bare `Client::builder().build()`, or `reqwest::get(...)`. diff --git a/apps/fabro-web/app/routes/run-files.tsx b/apps/fabro-web/app/routes/run-files.tsx index 7ce94bfe2..c8da42c63 100644 --- a/apps/fabro-web/app/routes/run-files.tsx +++ b/apps/fabro-web/app/routes/run-files.tsx @@ -32,13 +32,13 @@ export async function run(argv: string[]) { const { values } = parseArgs({ args: argv, options: { - config: { type: "string", short: "c", default: "fabro.toml" }, + config: { type: "string", short: "c", default: ".fabro/project.toml" }, "dry-run": { type: "boolean", default: false }, }, }); const opts: RunOptions = { - config: values.config ?? "fabro.toml", + config: values.config ?? ".fabro/project.toml", dryRun: values["dry-run"] ?? false, }; @@ -71,14 +71,14 @@ export async function run(argv: string[]) { const { values } = parseArgs({ args: argv, options: { - config: { type: "string", short: "c", default: "fabro.toml" }, + config: { type: "string", short: "c", default: ".fabro/project.toml" }, "dry-run": { type: "boolean", default: false }, verbose: { type: "boolean", short: "v", default: false }, }, }); const opts: RunOptions = { - config: values.config ?? "fabro.toml", + config: values.config ?? ".fabro/project.toml", dryRun: values["dry-run"] ?? false, verbose: values.verbose ?? false, }; diff --git a/apps/fabro-web/scripts/build.test.ts b/apps/fabro-web/scripts/build.test.ts index 5a038cdcb..446c3a7e4 100644 --- a/apps/fabro-web/scripts/build.test.ts +++ b/apps/fabro-web/scripts/build.test.ts @@ -28,5 +28,5 @@ test("watch mode keeps running until interrupted", async () => { } process.kill("SIGINT"); - expect(await process.exited).toBe(0); + expect([0, 130]).toContain(await process.exited); }); diff --git a/docs-internal/demo/14-search-imagegen.toml b/docs-internal/demo/14-search-imagegen.toml index 1d8a226f3..d6eb2b9a4 100644 --- a/docs-internal/demo/14-search-imagegen.toml +++ b/docs-internal/demo/14-search-imagegen.toml @@ -13,7 +13,7 @@ name = "imagegen-tools-v3" cpu = 4 memory = 8 disk = 10 -dockerfile = { path = "../../fabro/workflows/imagegen/Dockerfile.imagegen" } +dockerfile = { path = "../../.fabro/workflows/imagegen/Dockerfile.imagegen" } [assets] include = ["output/**"] diff --git a/docs/administration/server-configuration.mdx b/docs/administration/server-configuration.mdx index 3c0f575ee..eebf47394 100644 --- a/docs/administration/server-configuration.mdx +++ b/docs/administration/server-configuration.mdx @@ -18,7 +18,7 @@ Legacy `server.toml`, `user.toml`, and `cli.toml` are ignored with a warning. Re | Scope | Examples | |---|---| | Server-owned (runtime-only from local `settings.toml`) | `[server.listen]`, `[server.api]`, `[server.web]`, `[server.auth]`, `[server.storage]`, `[server.artifacts]`, `[server.slatedb]`, `[server.scheduler]`, `[server.logging]`, `[server.integrations]`, `[features]` | -| Shared run defaults (layered through `fabro.toml`/`workflow.toml`) | `[run.model]`, `[run.prepare]`, `[run.sandbox]`, `[run.checkpoint]`, `[run.inputs]`, `[run.pull_request]`, `[run.git]`, `[run.hooks]`, `[run.agent]` | +| Shared run defaults (layered through `.fabro/project.toml`/`workflow.toml`) | `[run.model]`, `[run.prepare]`, `[run.sandbox]`, `[run.checkpoint]`, `[run.inputs]`, `[run.pull_request]`, `[run.git]`, `[run.hooks]`, `[run.agent]` | The CLI-only `[cli.*]` sections (including `[cli.target]`) belong in the client machine's `settings.toml`. They tell CLI commands how to reach a server. The server process does not read `[cli.*]` for its own binding or routing. @@ -135,7 +135,7 @@ When `enabled = false`, the server still exposes the machine API and `/health`, The `[run.*]` sections in `settings.toml` act as defaults for every run. -On a same-machine setup, `settings.toml` is the shared machine-default layer under `workflow.toml` and `fabro.toml`. +On a same-machine setup, `settings.toml` is the shared machine-default layer under `workflow.toml` and `.fabro/project.toml`. On a remote setup, the client bundles workflow, project, and user config into the run manifest. The server then layers those bundled client configs over its own local defaults for run-shaped fields. Server-owned values like `[server.storage]`, `[server.api]`, `[server.web]`, `[features]`, and `[server.scheduler]` always come from the server machine's own `settings.toml` or `fabro server start` flags. @@ -194,7 +194,7 @@ Toggle experimental or opt-in features. All features default to `false`. |---|---| | `session_sandboxes` | Enable session sandboxes in the web UI | -The same `[features]` section can be set in `fabro.toml` (project-level) to enable features per-project. +The same `[features]` section can be set in `.fabro/project.toml` (project-level) to enable features per-project. ## Secrets and environment variables diff --git a/docs/agents/hooks.mdx b/docs/agents/hooks.mdx index c6d000a1e..ef634b4f8 100644 --- a/docs/agents/hooks.mdx +++ b/docs/agents/hooks.mdx @@ -105,9 +105,9 @@ Each hook fires on a specific lifecycle event: Hooks are defined as `[[hooks]]` entries in any of these TOML config files: -- **`fabro.toml`** — project-level hooks, apply to all workflows in the project +- **`.fabro/project.toml`** — project-level hooks, apply to all workflows in the project - **`workflow.toml`** — per-workflow hooks -- **`~/.fabro/settings.toml`** or **`~/.fabro/settings.toml`** — global defaults for all runs +- **`~/.fabro/settings.toml`** — global defaults for all runs See [Merging hook configs](#merging-hook-configs) for how these layers combine. @@ -344,11 +344,11 @@ Command hooks do **not** fail open. A non-zero exit code (other than 0 or 2) pro Hooks from multiple config files are merged in this order (later layers win on name collisions): -1. **`~/.fabro/settings.toml`** or **`~/.fabro/settings.toml`** — global defaults -2. **`fabro.toml`** — project-level overrides +1. **`~/.fabro/settings.toml`** — global defaults +2. **`.fabro/project.toml`** — project-level overrides 3. **`workflow.toml`** — per-workflow overrides -This lets you define global hooks at the server level, project-wide hooks in `fabro.toml`, and override or extend them per workflow. +This lets you define global hooks at the server level, project-wide hooks in `.fabro/project.toml`, and override or extend them per workflow. ## Full example diff --git a/docs/api-reference/fabro-api.yaml b/docs/api-reference/fabro-api.yaml index 0c719b47f..f523b75a0 100644 --- a/docs/api-reference/fabro-api.yaml +++ b/docs/api-reference/fabro-api.yaml @@ -2219,7 +2219,7 @@ components: path: type: string description: Resolved path that keys into the workflows map. - example: fabro/workflows/smoke/workflow.fabro + example: .fabro/workflows/smoke/workflow.fabro ManifestConfig: type: object diff --git a/docs/execution/retros.mdx b/docs/execution/retros.mdx index e52a6c355..200bd52c8 100644 --- a/docs/execution/retros.mdx +++ b/docs/execution/retros.mdx @@ -113,9 +113,9 @@ Both phases run automatically at the end of every CLI run. The API server derive ### CLI -To enable retros for your project, set `retros = true` under `[run.execution]` in your `fabro.toml`: +To enable retros for your project, set `retros = true` under `[run.execution]` in your `.fabro/project.toml`: -```toml title="fabro.toml" +```toml title=".fabro/project.toml" _version = 1 [run.execution] diff --git a/docs/execution/run-configuration.mdx b/docs/execution/run-configuration.mdx index e35b83bd3..3c5dc09e6 100644 --- a/docs/execution/run-configuration.mdx +++ b/docs/execution/run-configuration.mdx @@ -37,7 +37,7 @@ Goal precedence: CLI `--goal` > `[run].goal` > Graphviz graph attribute. _version = 1 [workflow] -graph = "fabro/workflows/ci.fabro" +graph = ".fabro/workflows/ci.fabro" [run] goal = "Run the CI pipeline" @@ -389,7 +389,7 @@ Settings can come from multiple sources. Fabro resolves them in this order (firs | Node-level [stylesheet](/workflows/stylesheets) | Highest | | CLI flags (`--model`, `--provider`, `--sandbox`) | | | Run config TOML (`workflow.toml` or equivalent) | | -| Project defaults (`fabro.toml`) | | +| Project defaults (`.fabro/project.toml`) | | | Machine defaults (`~/.fabro/settings.toml`) | | | Graphviz graph attributes (`default_model`, `default_provider`) | | | Built-in defaults | Lowest | @@ -398,16 +398,13 @@ Settings can come from multiple sources. Fabro resolves them in this order (firs Stylesheet rules on individual nodes always take priority over run config values. -### Project defaults (`fabro.toml`) +### Project defaults (`.fabro/project.toml`) -The `fabro.toml` project config can set default values for any of the `[run.*]` sections described above. These defaults apply to all runs in the project unless the workflow config overrides them: +The `.fabro/project.toml` project config can set default values for any of the `[run.*]` sections described above. These defaults apply to all runs in the project unless the workflow config overrides them: -```toml title="fabro.toml" +```toml title=".fabro/project.toml" _version = 1 -[project] -directory = "fabro/" - [run.model] name = "claude-sonnet-4-5" diff --git a/docs/getting-started/quick-start.mdx b/docs/getting-started/quick-start.mdx index 6fcd44250..561398101 100644 --- a/docs/getting-started/quick-start.mdx +++ b/docs/getting-started/quick-start.mdx @@ -37,7 +37,7 @@ cd my-repo/ fabro repo init ``` -This creates a default workflow and configuration in your project directory. +This creates `.fabro/project.toml` and a starter workflow under `.fabro/workflows/hello/`. ## Configure API keys diff --git a/docs/integrations/github.mdx b/docs/integrations/github.mdx index da7fad4e8..5ff271000 100644 --- a/docs/integrations/github.mdx +++ b/docs/integrations/github.mdx @@ -145,7 +145,7 @@ permissions = { contents = "write", pull_requests = "write" } Only the listed permissions are requested — the token is scoped to the minimum access needed. If the GitHub App isn't configured or the repository lacks an installation, the run logs a warning and continues without the token. -This also works in `fabro.toml` as a project-level default, so all workflows in the project automatically get a `GITHUB_TOKEN` without repeating the config in each run TOML. +This also works in `.fabro/project.toml` as a project-level default, so all workflows in the project automatically get a `GITHUB_TOKEN` without repeating the config in each run TOML. ### Checkpoint pushing diff --git a/docs/reference/cli.mdx b/docs/reference/cli.mdx index 05cadb9c7..ab523b131 100644 --- a/docs/reference/cli.mdx +++ b/docs/reference/cli.mdx @@ -62,7 +62,7 @@ fabro settings demo fabro settings run.toml ``` -With no argument, Fabro prints the merged ambient defaults from `~/.fabro/settings.toml` and the nearest `fabro.toml`. +With no argument, Fabro prints the merged ambient defaults from `~/.fabro/settings.toml` and the nearest `.fabro/project.toml`. When you pass a workflow name or path: @@ -86,7 +86,7 @@ fabro run run.toml | Argument / Flag | Description | |---|---| -| `` | Path to a `.fabro` workflow file, `.toml` task config, or workflow name (resolved from `fabro/workflows/` in the project, then `~/.fabro/workflows/`). | +| `` | Path to a `.fabro` workflow file, `.toml` task config, or workflow name (resolved from `.fabro/workflows/` in the project, then `~/.fabro/workflows/`). | | `--dry-run` | Execute with a simulated LLM backend | | `--auto-approve` | Auto-approve all human gates | | `--model ` | Override default LLM model | @@ -615,7 +615,7 @@ fabro workflow create my-workflow --goal "Run the CI pipeline" | `` | Name of the workflow (required) | | `-g, --goal ` | Goal description for the workflow | -Requires a `fabro.toml` project config in the current directory or a parent. +Requires a `.fabro/project.toml` project config in the current directory or a parent. --- @@ -648,22 +648,22 @@ fabro parse workflow.fabro ## `fabro repo init` -Initialize a new Fabro project in the current git repository. Creates a `fabro.toml` project config and a sample `hello` workflow. +Initialize a new Fabro project in the current git repository. Creates a `.fabro/project.toml` project config and a sample `hello` workflow. ```bash fabro repo init ``` The command must be run inside a git repository. It creates: -- `fabro.toml` — project configuration with comments and a link to docs -- `fabro/workflows/hello/workflow.fabro` — a simple greeting workflow -- `fabro/workflows/hello/workflow.toml` — run config for the hello workflow +- `.fabro/project.toml` — project configuration with comments and a link to docs +- `.fabro/workflows/hello/workflow.fabro` — a simple greeting workflow +- `.fabro/workflows/hello/workflow.toml` — run config for the hello workflow After creating files, it checks whether the GitHub App is installed for the repository. If the app is not installed and the repository owner differs from the app owner, it warns that the app may need to be [made public](/integrations/github#github-app-is-private-but-this-repo-belongs-to-a-different-owner) first. ## `fabro repo deinit` -Remove Fabro from a project by deleting `fabro.toml` and the `fabro/` directory. Fails with an error if the project is not initialized. +Remove Fabro from a project by deleting the `.fabro/` project directory. Fails with an error if the project is not initialized. ```bash fabro repo deinit diff --git a/docs/reference/user-configuration.mdx b/docs/reference/user-configuration.mdx index e12555b02..56c4f913d 100644 --- a/docs/reference/user-configuration.mdx +++ b/docs/reference/user-configuration.mdx @@ -29,7 +29,7 @@ Files that omit `_version` are treated as version `1`. The legacy top-level `ver ## Who reads what -`settings.toml` uses the same schema as `fabro.toml` and `workflow.toml`, but each process only reads the fields it understands. The top-level schema is strictly namespaced — the only allowed domains are `[project]`, `[workflow]`, `[run]`, `[cli]`, `[server]`, and `[features]`. +`settings.toml` uses the same schema as `.fabro/project.toml` and `workflow.toml`, but each process only reads the fields it understands. The top-level schema is strictly namespaced — the only allowed domains are `[project]`, `[workflow]`, `[run]`, `[cli]`, `[server]`, and `[features]`. | Scope | Examples | |---|---| @@ -37,7 +37,7 @@ Files that omit `_version` are treated as version `1`. The legacy top-level `ver | Shared run defaults | `[run.model]`, `[run.sandbox]`, `[run.checkpoint]`, `[run.inputs]`, `[run.prepare]`, `[run.pull_request]`, `[run.hooks]`, `[run.agent.mcps]` | | Server-only | `[server.listen]`, `[server.api]`, `[server.web]`, `[server.auth]`, `[server.storage]`, `[server.artifacts]`, `[server.slatedb]`, `[server.scheduler]`, `[server.logging]`, `[server.integrations]` | -`[cli.*]` and `[server.*]` stanzas are owner-specific: they are only consumed from `~/.fabro/settings.toml` (plus process-local flags and env overrides). The same stanzas in `fabro.toml` or `workflow.toml` remain schema-valid but runtime-inert. +`[cli.*]` and `[server.*]` stanzas are owner-specific: they are only consumed from `~/.fabro/settings.toml` (plus process-local flags and env overrides). The same stanzas in `.fabro/project.toml` or `workflow.toml` remain schema-valid but runtime-inert. See [Server Configuration](/administration/server-configuration) for the server-owned sections. @@ -48,7 +48,7 @@ Shared layered domains (`[project]`, `[workflow]`, `[run]`, `[features]`) use th 1. **CLI flags** — always win 2. **Environment overrides** — Fabro-defined override channels 3. **`workflow.toml`** — per-workflow overrides -4. **`fabro.toml`** — project defaults +4. **`.fabro/project.toml`** — project defaults 5. **`~/.fabro/settings.toml`** — machine defaults 6. **Built-in defaults** @@ -297,7 +297,7 @@ enabled = true | `auto_merge` | Enable GitHub auto-merge on the created PR (implies `draft = false`) | `false` | | `merge_strategy` | One of `"squash"`, `"merge"`, `"rebase"` | `"squash"` | -Precedence: `workflow.toml` > `fabro.toml` > `~/.fabro/settings.toml` > built-in default (`false`). +Precedence: `workflow.toml` > `.fabro/project.toml` > `~/.fabro/settings.toml` > built-in default (`false`). ## `[run.agent.mcps]` section diff --git a/docs/workflows/variables.mdx b/docs/workflows/variables.mdx index ad4be2a38..2680d5e37 100644 --- a/docs/workflows/variables.mdx +++ b/docs/workflows/variables.mdx @@ -97,7 +97,7 @@ You can also emit literal braces with expressions such as `{{ '{{' }}` when need |---|---| | CLI flags (`-V key=value`, repeated) | Highest | | `workflow.toml` `[run.inputs]` | | -| `fabro.toml` `[run.inputs]` | | +| `.fabro/project.toml` `[run.inputs]` | | | `~/.fabro/settings.toml` `[run.inputs]` | Lowest | If you need per-key overrides on top of inherited defaults, set each input explicitly in the winning layer. diff --git a/files-internal/testing-strategy.md b/files-internal/testing-strategy.md index e1fcd006d..264930629 100644 --- a/files-internal/testing-strategy.md +++ b/files-internal/testing-strategy.md @@ -113,7 +113,7 @@ Allowed setup: - checked-in workflow fixtures - temp `.fabro` workflow files -- temp `workflow.toml` and `fabro.toml` +- temp `workflow.toml` and `.fabro/project.toml` - temp git repositories - temp user config and environment variables - invoking commands to create runs, checkpoints, branches, and persisted state diff --git a/lib/crates/fabro-cli/src/args.rs b/lib/crates/fabro-cli/src/args.rs index ec09f63e1..216d0e532 100644 --- a/lib/crates/fabro-cli/src/args.rs +++ b/lib/crates/fabro-cli/src/args.rs @@ -1235,7 +1235,7 @@ pub(crate) struct RepoNamespace { pub(crate) enum RepoCommand { /// Initialize a new project Init(RepoInitArgs), - /// Remove fabro.toml and fabro/ directory + /// Remove .fabro/ project directory Deinit, } diff --git a/lib/crates/fabro-cli/src/commands/repo/deinit.rs b/lib/crates/fabro-cli/src/commands/repo/deinit.rs index ec602b68e..8155302c1 100644 --- a/lib/crates/fabro-cli/src/commands/repo/deinit.rs +++ b/lib/crates/fabro-cli/src/commands/repo/deinit.rs @@ -6,41 +6,27 @@ pub(crate) fn run_deinit(globals: &GlobalArgs) -> Result> { let repo_root = super::init::git_repo_root()?; let mut removed = Vec::new(); - let fabro_toml = repo_root.join("fabro.toml"); + let fabro_dir = repo_root.join(".fabro"); + let project_toml = fabro_dir.join("project.toml"); let green = console::Style::new().green(); let dim = console::Style::new().dim(); - match std::fs::remove_file(&fabro_toml) { - Ok(()) => {} - Err(e) if e.kind() == std::io::ErrorKind::NotFound => { - bail!("not initialized — fabro.toml not found"); - } - Err(e) => bail!("failed to remove {}: {e}", fabro_toml.display()), + if !project_toml.exists() { + bail!("not initialized — .fabro/project.toml not found"); } - removed.push("fabro.toml".to_string()); + + std::fs::remove_dir_all(&fabro_dir) + .with_context(|| format!("failed to remove {}", fabro_dir.display()))?; + removed.push(".fabro/".to_string()); if !globals.json { eprintln!( " {} {}", green.apply_to("✔"), - dim.apply_to("removed fabro.toml") + dim.apply_to("removed .fabro/") ); } - let fabro_dir = repo_root.join("fabro"); - if fabro_dir.exists() { - std::fs::remove_dir_all(&fabro_dir) - .with_context(|| format!("failed to remove {}", fabro_dir.display()))?; - removed.push("fabro/".to_string()); - if !globals.json { - eprintln!( - " {} {}", - green.apply_to("✔"), - dim.apply_to("removed fabro/") - ); - } - } - if !globals.json { eprintln!( "\n{}", diff --git a/lib/crates/fabro-cli/src/commands/repo/init.rs b/lib/crates/fabro-cli/src/commands/repo/init.rs index 8103d6423..97c319524 100644 --- a/lib/crates/fabro-cli/src/commands/repo/init.rs +++ b/lib/crates/fabro-cli/src/commands/repo/init.rs @@ -25,26 +25,27 @@ pub(crate) async fn run_init(args: &RepoInitArgs, globals: &GlobalArgs) -> Resul let repo_root = git_repo_root()?; let mut created = Vec::new(); - let fabro_toml = repo_root.join("fabro.toml"); - if fabro_toml.exists() { + let fabro_dir = repo_root.join(".fabro"); + let project_toml = fabro_dir.join("project.toml"); + if project_toml.exists() { bail!( - "already initialized — fabro.toml exists at {}", - fabro_toml.display() + "already initialized — .fabro/project.toml exists at {}", + project_toml.display() ); } - // Create fabro.toml + std::fs::create_dir_all(&fabro_dir) + .with_context(|| format!("failed to create {}", fabro_dir.display()))?; + + // Create .fabro/project.toml std::fs::write( - &fabro_toml, + &project_toml, "\ # Fabro project configuration # https://docs.fabro.computer/getting-started/quick-start _version = 1 -[project] -directory = \"fabro/\" - # Auto-create pull requests on successful workflow runs. [run.pull_request] enabled = true @@ -52,18 +53,22 @@ draft = true # auto_merge = true ", ) - .with_context(|| format!("failed to write {}", fabro_toml.display()))?; - created.push("fabro.toml".to_string()); + .with_context(|| format!("failed to write {}", project_toml.display()))?; + created.push(".fabro/project.toml".to_string()); let green = console::Style::new().green(); let bold = console::Style::new().bold(); let dim = console::Style::new().dim(); if !globals.json { - eprintln!(" {} {}", green.apply_to("✔"), dim.apply_to("fabro.toml")); + eprintln!( + " {} {}", + green.apply_to("✔"), + dim.apply_to(".fabro/project.toml") + ); } // Create hello workflow directory - let workflow_dir = repo_root.join("fabro/workflows/hello"); + let workflow_dir = repo_root.join(".fabro/workflows/hello"); std::fs::create_dir_all(&workflow_dir) .with_context(|| format!("failed to create {}", workflow_dir.display()))?; @@ -85,12 +90,12 @@ draft = true "#, ) .with_context(|| format!("failed to write {}", dot_path.display()))?; - created.push("fabro/workflows/hello/workflow.fabro".to_string()); + created.push(".fabro/workflows/hello/workflow.fabro".to_string()); if !globals.json { eprintln!( " {} {}", green.apply_to("✔"), - dim.apply_to("fabro/workflows/hello/workflow.fabro") + dim.apply_to(".fabro/workflows/hello/workflow.fabro") ); } @@ -101,12 +106,12 @@ draft = true "_version = 1\n\n[workflow]\ngraph = \"workflow.fabro\"\n\n[run.sandbox]\nprovider = \"local\"\n", ) .with_context(|| format!("failed to write {}", toml_path.display()))?; - created.push("fabro/workflows/hello/workflow.toml".to_string()); + created.push(".fabro/workflows/hello/workflow.toml".to_string()); if !globals.json { eprintln!( " {} {}", green.apply_to("✔"), - dim.apply_to("fabro/workflows/hello/workflow.toml") + dim.apply_to(".fabro/workflows/hello/workflow.toml") ); } diff --git a/lib/crates/fabro-cli/src/commands/workflow/create.rs b/lib/crates/fabro-cli/src/commands/workflow/create.rs index 2d00fae84..d6b80d058 100644 --- a/lib/crates/fabro-cli/src/commands/workflow/create.rs +++ b/lib/crates/fabro-cli/src/commands/workflow/create.rs @@ -11,7 +11,7 @@ pub(super) fn create_command(args: &WorkflowCreateArgs, globals: &GlobalArgs) -> let Some((config_path, config)) = discover_project_config(&cwd)? else { bail!( - "No fabro.toml found in {cwd} or any parent directory", + "No .fabro/project.toml found in {cwd} or any parent directory", cwd = cwd.display() ); }; diff --git a/lib/crates/fabro-cli/src/commands/workflow/list.rs b/lib/crates/fabro-cli/src/commands/workflow/list.rs index 023d8e5a9..79cabbe89 100644 --- a/lib/crates/fabro-cli/src/commands/workflow/list.rs +++ b/lib/crates/fabro-cli/src/commands/workflow/list.rs @@ -16,7 +16,7 @@ pub(super) fn list_command(_args: &WorkflowListArgs, globals: &GlobalArgs) -> Re let Some((config_path, config)) = discover_project_config(&cwd)? else { bail!( - "No fabro.toml found in {cwd} or any parent directory", + "No .fabro/project.toml found in {cwd} or any parent directory", cwd = cwd.display() ); }; diff --git a/lib/crates/fabro-cli/src/manifest_builder.rs b/lib/crates/fabro-cli/src/manifest_builder.rs index 6565f1908..4aefd3007 100644 --- a/lib/crates/fabro-cli/src/manifest_builder.rs +++ b/lib/crates/fabro-cli/src/manifest_builder.rs @@ -556,12 +556,12 @@ mod tests { fn build_manifest_bundles_imports_prompts_and_children() { let temp = tempfile::tempdir().unwrap(); let project = temp.path(); - let workflow_dir = project.join("fabro/workflows/demo"); - let child_dir = project.join("fabro/workflows/child"); + let workflow_dir = project.join(".fabro/workflows/demo"); + let child_dir = project.join(".fabro/workflows/child"); std::fs::create_dir_all(workflow_dir.join("prompts")).unwrap(); std::fs::create_dir_all(workflow_dir.join("imports")).unwrap(); std::fs::create_dir_all(&child_dir).unwrap(); - std::fs::write(project.join("fabro.toml"), "_version = 1\n").unwrap(); + std::fs::write(project.join(".fabro/project.toml"), "_version = 1\n").unwrap(); std::fs::write( workflow_dir.join("workflow.toml"), "_version = 1\n\n[workflow]\ngraph = \"workflow.fabro\"\n", @@ -600,7 +600,7 @@ mod tests { .unwrap(); let built = build_run_manifest(ManifestBuildInput { - workflow: PathBuf::from("fabro/workflows/demo/workflow.toml"), + workflow: PathBuf::from(".fabro/workflows/demo/workflow.toml"), cwd: project.to_path_buf(), args_layer: SettingsLayer::default(), args: None, @@ -612,49 +612,49 @@ mod tests { assert_eq!( built.manifest.target.path, - "fabro/workflows/demo/workflow.fabro" + ".fabro/workflows/demo/workflow.fabro" ); assert_eq!(built.manifest.workflows.len(), 2); - let root = &built.manifest.workflows["fabro/workflows/demo/workflow.fabro"]; + let root = &built.manifest.workflows[".fabro/workflows/demo/workflow.fabro"]; assert!( root.files - .contains_key("fabro/workflows/demo/prompts/goal.md") + .contains_key(".fabro/workflows/demo/prompts/goal.md") ); assert!( root.files - .contains_key("fabro/workflows/demo/prompts/plan.md") + .contains_key(".fabro/workflows/demo/prompts/plan.md") ); assert!( root.files - .contains_key("fabro/workflows/demo/imports/checks.fabro") + .contains_key(".fabro/workflows/demo/imports/checks.fabro") ); assert!( root.files - .contains_key("fabro/workflows/demo/prompts/lint.md") + .contains_key(".fabro/workflows/demo/prompts/lint.md") ); assert_eq!(built.manifest.goal.unwrap().text, "ship it"); assert!( built .manifest .workflows - .contains_key("fabro/workflows/child/workflow.fabro") + .contains_key(".fabro/workflows/child/workflow.fabro") ); } - /// A relative `[run.goal] file = "..."` declared in `fabro.toml` must - /// resolve against the directory of `fabro.toml`, not against the - /// invocation cwd. We exercise this by invoking from a subdirectory + /// A relative `[run.goal] file = "..."` declared in `.fabro/project.toml` + /// must resolve against the directory of `.fabro/project.toml`, not against + /// the invocation cwd. We exercise this by invoking from a subdirectory /// below the project root. #[test] fn build_manifest_resolves_relative_goal_file_in_project_config() { let temp = tempfile::tempdir().unwrap(); let project = temp.path(); - let workflow_dir = project.join("fabro/workflows/demo"); + let workflow_dir = project.join(".fabro/workflows/demo"); std::fs::create_dir_all(&workflow_dir).unwrap(); - std::fs::create_dir_all(project.join("prompts")).unwrap(); + std::fs::create_dir_all(project.join(".fabro/prompts")).unwrap(); std::fs::write( - project.join("fabro.toml"), + project.join(".fabro/project.toml"), r#"_version = 1 [run.goal] @@ -662,7 +662,11 @@ file = "prompts/goal.md" "#, ) .unwrap(); - std::fs::write(project.join("prompts/goal.md"), "ship from project root").unwrap(); + std::fs::write( + project.join(".fabro/prompts/goal.md"), + "ship from project root", + ) + .unwrap(); std::fs::write( workflow_dir.join("workflow.toml"), @@ -676,7 +680,7 @@ file = "prompts/goal.md" .unwrap(); let built = build_run_manifest(ManifestBuildInput { - workflow: PathBuf::from("fabro/workflows/demo/workflow.toml"), + workflow: PathBuf::from(".fabro/workflows/demo/workflow.toml"), cwd: project.to_path_buf(), args_layer: SettingsLayer::default(), args: None, @@ -690,7 +694,7 @@ file = "prompts/goal.md" assert_eq!(goal.text, "ship from project root"); assert_eq!(goal.type_, types::ManifestGoalType::File); let resolved = goal.path.expect("file goal must carry a path"); - let expected = project.join("prompts").join("goal.md"); + let expected = project.join(".fabro").join("prompts").join("goal.md"); assert_eq!(PathBuf::from(resolved), expected); } @@ -701,10 +705,10 @@ file = "prompts/goal.md" fn build_manifest_resolves_relative_goal_file_in_workflow_config() { let temp = tempfile::tempdir().unwrap(); let project = temp.path(); - let workflow_dir = project.join("fabro/workflows/demo"); + let workflow_dir = project.join(".fabro/workflows/demo"); std::fs::create_dir_all(workflow_dir.join("prompts")).unwrap(); - std::fs::write(project.join("fabro.toml"), "_version = 1\n").unwrap(); + std::fs::write(project.join(".fabro/project.toml"), "_version = 1\n").unwrap(); std::fs::write( workflow_dir.join("workflow.toml"), r#"_version = 1 @@ -729,7 +733,7 @@ file = "prompts/goal.md" .unwrap(); let built = build_run_manifest(ManifestBuildInput { - workflow: PathBuf::from("fabro/workflows/demo/workflow.toml"), + workflow: PathBuf::from(".fabro/workflows/demo/workflow.toml"), cwd: project.to_path_buf(), args_layer: SettingsLayer::default(), args: None, diff --git a/lib/crates/fabro-cli/tests/it/cmd/config.rs b/lib/crates/fabro-cli/tests/it/cmd/config.rs index 9a9aeb223..22e89b974 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/config.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/config.rs @@ -200,14 +200,12 @@ shared = "cli" ); let project = tempfile::tempdir().unwrap(); + std::fs::create_dir_all(project.path().join(".fabro")).unwrap(); std::fs::write( - project.path().join("fabro.toml"), + project.path().join(".fabro/project.toml"), r#" _version = 1 -[project] -directory = "fabro" - [run.model] name = "project-model" @@ -224,7 +222,7 @@ script = "echo project" ) .unwrap(); - let workflow_dir = project.path().join("fabro").join("workflows").join("demo"); + let workflow_dir = project.path().join(".fabro").join("workflows").join("demo"); std::fs::create_dir_all(&workflow_dir).unwrap(); std::fs::write( workflow_dir.join("workflow.toml"), @@ -315,8 +313,9 @@ script = "cli-setup" ); let project = tempfile::tempdir().unwrap(); + std::fs::create_dir_all(project.path().join(".fabro")).unwrap(); std::fs::write( - project.path().join("fabro.toml"), + project.path().join(".fabro/project.toml"), r#" _version = 1 @@ -387,7 +386,7 @@ fn settings_local_merges_cli_and_project_defaults() { assert_eq!(run_model_name(&cfg).as_deref(), Some("project-model")); assert_eq!(run_model_provider(&cfg).as_deref(), Some("openai")); assert_eq!(run_goal_inline(&cfg).as_deref(), None); - assert_eq!(resolve_project(&cfg).directory, "fabro"); + assert_eq!(resolve_project(&cfg).directory, "."); // v2 R22: run.inputs replaces the inherited map wholesale rather than // merging by key, so the project layer wipes out the CLI layer's inputs. diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo.rs b/lib/crates/fabro-cli/tests/it/cmd/repo.rs index 78b56a56f..656794cb2 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo.rs @@ -2,9 +2,9 @@ use fabro_test::{fabro_snapshot, test_context}; fn init_fabro_project(context: &fabro_test::TestContext) { context - .write_temp("fabro.toml", "_version = 1\n") - .write_temp("fabro/workflows/hello/workflow.fabro", "digraph {}") - .write_temp("fabro/workflows/hello/workflow.toml", "_version = 1\n"); + .write_temp(".fabro/project.toml", "_version = 1\n") + .write_temp(".fabro/workflows/hello/workflow.fabro", "digraph {}") + .write_temp(".fabro/workflows/hello/workflow.toml", "_version = 1\n"); } #[test] @@ -22,7 +22,7 @@ fn help() { Commands: init Initialize a new project - deinit Remove fabro.toml and fabro/ directory + deinit Remove .fabro/ project directory help Print this message or the help of the given subcommand(s) Options: @@ -42,18 +42,18 @@ fn test_repo_deinit_removes_fabro_toml_and_dir() { context.git_init(); init_fabro_project(&context); - assert!(context.temp_dir.join("fabro.toml").exists()); - assert!(context.temp_dir.join("fabro").exists()); + assert!(context.temp_dir.join(".fabro/project.toml").exists()); + assert!(context.temp_dir.join(".fabro").exists()); context.repo().arg("deinit").assert().success(); assert!( - !context.temp_dir.join("fabro.toml").exists(), - "fabro.toml should be removed" + !context.temp_dir.join(".fabro/project.toml").exists(), + ".fabro/project.toml should be removed" ); assert!( - !context.temp_dir.join("fabro").exists(), - "fabro/ directory should be removed" + !context.temp_dir.join(".fabro").exists(), + ".fabro/ directory should be removed" ); } @@ -69,6 +69,6 @@ fn test_repo_deinit_fails_when_not_initialized() { exit_code: 1 ----- stdout ----- ----- stderr ----- - error: not initialized — fabro.toml not found + error: not initialized — .fabro/project.toml not found "); } diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs b/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs index 586a29e66..50c0b4433 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs @@ -9,7 +9,7 @@ fn help() { success: true exit_code: 0 ----- stdout ----- - Remove fabro.toml and fabro/ directory + Remove .fabro/ project directory Usage: fabro repo deinit [OPTIONS] diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs b/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs index 0742d425f..161aa530b 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs @@ -27,7 +27,7 @@ fn help() { } #[test] -fn repo_init_creates_fabro_toml_and_hello_workflow() { +fn repo_init_creates_project_toml_and_hello_workflow() { let context = test_context!(); context.git_init(); @@ -39,9 +39,9 @@ fn repo_init_creates_fabro_toml_and_hello_workflow() { exit_code: 0 ----- stdout ----- ----- stderr ----- - ✔ fabro.toml - ✔ fabro/workflows/hello/workflow.fabro - ✔ fabro/workflows/hello/workflow.toml + ✔ .fabro/project.toml + ✔ .fabro/workflows/hello/workflow.fabro + ✔ .fabro/workflows/hello/workflow.toml Project initialized! Run a workflow with: @@ -52,16 +52,13 @@ fn repo_init_creates_fabro_toml_and_hello_workflow() { "); assert_snapshot!( - std::fs::read_to_string(context.temp_dir.join("fabro.toml")).unwrap(), + std::fs::read_to_string(context.temp_dir.join(".fabro/project.toml")).unwrap(), @r###" # Fabro project configuration # https://docs.fabro.computer/getting-started/quick-start _version = 1 - [project] - directory = "fabro/" - # Auto-create pull requests on successful workflow runs. [run.pull_request] enabled = true @@ -70,7 +67,7 @@ fn repo_init_creates_fabro_toml_and_hello_workflow() { "### ); assert_snapshot!( - std::fs::read_to_string(context.temp_dir.join("fabro/workflows/hello/workflow.fabro")) + std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.fabro")) .unwrap(), @r###" digraph Hello { @@ -87,7 +84,7 @@ fn repo_init_creates_fabro_toml_and_hello_workflow() { "### ); assert_snapshot!( - std::fs::read_to_string(context.temp_dir.join("fabro/workflows/hello/workflow.toml")) + std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.toml")) .unwrap(), @r###" _version = 1 @@ -105,7 +102,12 @@ fn repo_init_creates_fabro_toml_and_hello_workflow() { fn repo_init_rejects_already_initialized_repo() { let context = test_context!(); context.git_init(); - std::fs::write(context.temp_dir.join("fabro.toml"), "_version = 1\n").unwrap(); + std::fs::create_dir_all(context.temp_dir.join(".fabro")).unwrap(); + std::fs::write( + context.temp_dir.join(".fabro/project.toml"), + "_version = 1\n", + ) + .unwrap(); let mut cmd = context.command(); cmd.args(["repo", "init"]); @@ -115,7 +117,7 @@ fn repo_init_rejects_already_initialized_repo() { exit_code: 1 ----- stdout ----- ----- stderr ----- - error: already initialized — fabro.toml exists at [TEMP_DIR]/fabro.toml + error: already initialized — .fabro/project.toml exists at [TEMP_DIR]/.fabro/project.toml "); } diff --git a/lib/crates/fabro-cli/tests/it/cmd/runner.rs b/lib/crates/fabro-cli/tests/it/cmd/runner.rs index 11d50bed6..0b2fea0b0 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/runner.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/runner.rs @@ -635,7 +635,7 @@ fn worker_exits_with_retro_enabled_even_when_stdin_stays_open() { let workflow_path = context.temp_dir.join("retro-success.fabro"); context.write_temp( - "fabro.toml", + ".fabro/project.toml", r#"_version = 1 [run.execution] diff --git a/lib/crates/fabro-cli/tests/it/cmd/support.rs b/lib/crates/fabro-cli/tests/it/cmd/support.rs index d214351c3..5c78df473 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/support.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/support.rs @@ -268,11 +268,8 @@ pub(crate) fn setup_git_backed_noop_run(context: &TestContext) -> GitRunSetup { pub(crate) fn setup_project_fixture(context: &TestContext) -> ProjectFixture { let project_dir = context.temp_dir.join("project"); - let fabro_root = project_dir.join("fabro"); - write_text_file( - &project_dir.join("fabro.toml"), - "_version = 1\n\n[project]\ndirectory = \"fabro/\"\n", - ); + let fabro_root = project_dir.join(".fabro"); + write_text_file(&project_dir.join(".fabro/project.toml"), "_version = 1\n"); std::fs::create_dir_all(fabro_root.join("workflows")) .unwrap_or_else(|err| panic!("failed to create {}: {err}", fabro_root.display())); ProjectFixture { diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow.rs index 89143c2aa..b52bc2708 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow.rs @@ -35,8 +35,8 @@ fn list() { context .write_temp( - "fabro.toml", - "_version = 1\n\n[project]\ndirectory = \".\"\n", + ".fabro/project.toml", + "_version = 1\n\n[project]\ndirectory = \"..\"\n", ) .write_temp( "workflows/my_test_wf/workflow.toml", diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs index 027fe40c1..a4cf9abb6 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs @@ -46,12 +46,12 @@ fn workflow_create_writes_scaffold_files() { exit_code: 0 ----- stdout ----- ----- stderr ----- - ✔ fabro/workflows/hello-world/workflow.fabro - ✔ fabro/workflows/hello-world/workflow.toml + ✔ .fabro/workflows/hello-world/workflow.fabro + ✔ .fabro/workflows/hello-world/workflow.toml Workflow created! Next steps: - 1. Edit the graph: fabro/workflows/hello-world/workflow.fabro + 1. Edit the graph: .fabro/workflows/hello-world/workflow.fabro 2. Validate: fabro validate hello-world 3. Run: fabro run hello-world "); @@ -136,7 +136,7 @@ fn workflow_create_rejects_existing_workflow() { exit_code: 1 ----- stdout ----- ----- stderr ----- - error: Workflow 'existing' already exists at [TEMP_DIR]/project/fabro/workflows/existing + error: Workflow 'existing' already exists at [TEMP_DIR]/project/.fabro/workflows/existing "); } @@ -151,7 +151,7 @@ fn workflow_create_errors_without_project_config() { exit_code: 1 ----- stdout ----- ----- stderr ----- - error: No fabro.toml found in [TEMP_DIR] or any parent directory + error: No .fabro/project.toml found in [TEMP_DIR] or any parent directory "); } @@ -160,8 +160,8 @@ fn workflow_create_json_uses_resolved_custom_root_paths() { let context = test_context!(); let project_dir = context.temp_dir.join("project"); context.write_temp( - "project/fabro.toml", - "_version = 1\n\n[project]\ndirectory = \"custom/fabro-data\"\n", + "project/.fabro/project.toml", + "_version = 1\n\n[project]\ndirectory = \"../custom/fabro-data\"\n", ); let output = context diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs index 795080785..4252c6f54 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs @@ -37,7 +37,7 @@ fn workflow_list_errors_without_project_config() { exit_code: 1 ----- stdout ----- ----- stderr ----- - error: No fabro.toml found in [TEMP_DIR] or any parent directory + error: No .fabro/project.toml found in [TEMP_DIR] or any parent directory "); } @@ -69,7 +69,7 @@ fn workflow_list_shows_project_and_user_sections() { NAME DESCRIPTION user-beta User beta goal - Project Workflows (fabro/workflows) + Project Workflows (.fabro/workflows) NAME DESCRIPTION project-alpha Project alpha goal diff --git a/lib/crates/fabro-config/src/effective_settings.rs b/lib/crates/fabro-config/src/effective_settings.rs index c1eea1c6e..46fd13ee9 100644 --- a/lib/crates/fabro-config/src/effective_settings.rs +++ b/lib/crates/fabro-config/src/effective_settings.rs @@ -2,10 +2,12 @@ //! [`SettingsLayer`]. //! //! Shared layered domains (`project`, `workflow`, `run`, `features`) merge -//! across all three config files (settings.toml, fabro.toml, workflow.toml). +//! across all three config files (settings.toml, .fabro/project.toml, +//! workflow.toml). //! Owner-specific domains (`cli`, `server`) are consumed only from the local //! `~/.fabro/settings.toml` plus explicit process-local overrides — their -//! stanzas in `fabro.toml` and `workflow.toml` remain schema-valid but inert. +//! stanzas in `.fabro/project.toml` and `workflow.toml` remain schema-valid but +//! inert. use fabro_types::settings::SettingsLayer; use fabro_types::settings::run::{RunExecutionLayer, RunLayer}; @@ -67,7 +69,7 @@ pub fn resolve_settings( EffectiveSettingsMode::RemoteServer | EffectiveSettingsMode::LocalDaemon => { let server_settings = server_settings.ok_or(Error::MissingServerSettings)?; // Owner-specific domains (cli, server) may only come from the - // local ~/.fabro/settings.toml, never from fabro.toml or + // local ~/.fabro/settings.toml, never from .fabro/project.toml or // workflow.toml. The user layer keeps its cli/server fields. strip_owner_domains(&mut workflow); strip_owner_domains(&mut project); diff --git a/lib/crates/fabro-config/src/project.rs b/lib/crates/fabro-config/src/project.rs index 59c6cbd95..087fd619e 100644 --- a/lib/crates/fabro-config/src/project.rs +++ b/lib/crates/fabro-config/src/project.rs @@ -5,7 +5,7 @@ //! discovery helpers and re-exports resolved project settings. use std::fmt::Write; -use std::path::{Path, PathBuf}; +use std::path::{Component, Path, PathBuf}; use fabro_types::settings::SettingsLayer; use serde::Serialize; @@ -17,7 +17,7 @@ use crate::{ run, }; -const CONFIG_FILENAME: &str = "fabro.toml"; +const CONFIG_FILENAME: &str = ".fabro/project.toml"; #[derive(Clone, Debug)] pub struct WorkflowPathResolution { pub resolved_workflow_path: PathBuf, @@ -45,7 +45,7 @@ pub fn load_project_config(path: &Path) -> Result { Ok(config) } -/// Walk ancestor directories from `start` looking for `fabro.toml`. +/// Walk ancestor directories from `start` looking for `.fabro/project.toml`. /// Returns the config file path and parsed config, or `None` if not found. pub fn discover_project_config(start: &Path) -> Result> { for ancestor in start.ancestors() { @@ -360,9 +360,29 @@ pub fn is_retro_enabled() -> bool { } } +fn normalize_joined_path(base_dir: &Path, reference: &Path) -> PathBuf { + if reference.is_absolute() { + return reference.to_path_buf(); + } + + let mut normalized = PathBuf::new(); + for component in base_dir.join(reference).components() { + match component { + Component::CurDir => {} + Component::Normal(part) => normalized.push(part), + Component::ParentDir => { + normalized.pop(); + } + Component::RootDir => normalized.push(Path::new("/")), + Component::Prefix(prefix) => normalized.push(prefix.as_os_str()), + } + } + normalized +} + /// Resolve the fabro root directory from a config file path and its config. -/// The returned path is the directory containing `fabro.toml` joined with the -/// `project.directory` value (default: `fabro/`). +/// The returned path is the config file's parent directory joined with the +/// `project.directory` value (default: `.`). pub fn resolve_fabro_root(config_path: &Path, config: &SettingsLayer) -> PathBuf { let project_dir = config_path .parent() @@ -370,7 +390,7 @@ pub fn resolve_fabro_root(config_path: &Path, config: &SettingsLayer) -> PathBuf let root = resolve_project_from_file(config) .expect("project settings should resolve") .directory; - project_dir.join(root) + normalize_joined_path(project_dir, Path::new(&root)) } #[cfg(test)] @@ -395,13 +415,13 @@ mod tests { _version = 1 [project] -directory = "fabro/" +directory = "custom/" "#, ) .unwrap(); assert_eq!( resolve_project_from_file(&config).unwrap().directory, - "fabro/" + "custom/" ); } @@ -449,7 +469,9 @@ retros = true #[test] fn load_from_disk() { let tmp = TempDir::new().unwrap(); - let path = tmp.path().join("fabro.toml"); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + let path = config_dir.join("project.toml"); fs::write(&path, "_version = 1\n").unwrap(); let config = load_project_config(&path).unwrap(); assert_eq!(config.version, Some(1)); @@ -458,12 +480,14 @@ retros = true #[test] fn discover_walks_ancestors() { let tmp = TempDir::new().unwrap(); - fs::write(tmp.path().join("fabro.toml"), "_version = 1\n").unwrap(); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + fs::write(config_dir.join("project.toml"), "_version = 1\n").unwrap(); let sub = tmp.path().join("sub").join("dir"); fs::create_dir_all(&sub).unwrap(); let (found_path, config) = discover_project_config(&sub).unwrap().unwrap(); - assert_eq!(found_path, tmp.path().join("fabro.toml")); + assert_eq!(found_path, config_dir.join("project.toml")); assert_eq!(config.version, Some(1)); } @@ -472,7 +496,9 @@ retros = true use fabro_types::settings::run::RunGoalLayer; let tmp = TempDir::new().unwrap(); - let path = tmp.path().join("fabro.toml"); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + let path = config_dir.join("project.toml"); fs::write( &path, r#"_version = 1 @@ -489,7 +515,75 @@ file = "prompts/goal.md" else { panic!("expected file variant"); }; - let expected = tmp.path().join("prompts").join("goal.md"); + let expected = config_dir.join("prompts").join("goal.md"); assert_eq!(file.as_source(), expected.to_string_lossy()); } + + #[test] + fn default_directory_resolves_to_config_parent() { + let tmp = TempDir::new().unwrap(); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + let config_path = config_dir.join("project.toml"); + fs::write(&config_path, "_version = 1\n").unwrap(); + + let config = load_project_config(&config_path).unwrap(); + + assert_eq!(resolve_fabro_root(&config_path, &config), config_dir); + } + + #[test] + fn custom_relative_directory_resolves_from_config_parent() { + let tmp = TempDir::new().unwrap(); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + let config_path = config_dir.join("project.toml"); + fs::write( + &config_path, + r#"_version = 1 + +[project] +directory = "../custom" +"#, + ) + .unwrap(); + + let config = load_project_config(&config_path).unwrap(); + + assert_eq!( + resolve_fabro_root(&config_path, &config), + tmp.path().join("custom") + ); + } + + #[test] + fn relative_goal_file_resolves_from_config_dir() { + use fabro_types::settings::run::RunGoalLayer; + + let tmp = TempDir::new().unwrap(); + let config_dir = tmp.path().join(".fabro"); + fs::create_dir_all(&config_dir).unwrap(); + let config_path = config_dir.join("project.toml"); + fs::write( + &config_path, + r#"_version = 1 + +[run.goal] +file = "prompts/goal.md" +"#, + ) + .unwrap(); + + let config = load_project_config(&config_path).unwrap(); + let Some(RunGoalLayer::File { file }) = + config.run.as_ref().and_then(|run| run.goal.as_ref()) + else { + panic!("expected file variant"); + }; + + assert_eq!( + file.as_source(), + config_dir.join("prompts").join("goal.md").to_string_lossy() + ); + } } diff --git a/lib/crates/fabro-config/src/resolve/project.rs b/lib/crates/fabro-config/src/resolve/project.rs index c8ab5fc23..16d5db288 100644 --- a/lib/crates/fabro-config/src/resolve/project.rs +++ b/lib/crates/fabro-config/src/resolve/project.rs @@ -2,7 +2,7 @@ use fabro_types::settings::project::{ProjectLayer, ProjectSettings}; use super::ResolveError; -const DEFAULT_PROJECT_DIRECTORY: &str = "fabro/"; +const DEFAULT_PROJECT_DIRECTORY: &str = "."; pub fn resolve_project(layer: &ProjectLayer, _errors: &mut Vec) -> ProjectSettings { ProjectSettings { diff --git a/lib/crates/fabro-config/tests/resolve_project.rs b/lib/crates/fabro-config/tests/resolve_project.rs index 7c79646d5..345cf9f53 100644 --- a/lib/crates/fabro-config/tests/resolve_project.rs +++ b/lib/crates/fabro-config/tests/resolve_project.rs @@ -7,7 +7,7 @@ fn resolves_project_defaults_from_empty_settings() { let project = resolve_project_from_file(&settings).expect("empty settings should resolve"); - assert_eq!(project.directory, "fabro/"); + assert_eq!(project.directory, "."); assert!(project.name.is_none()); assert!(project.description.is_none()); assert!(project.metadata.is_empty()); diff --git a/lib/crates/fabro-config/tests/resolve_root.rs b/lib/crates/fabro-config/tests/resolve_root.rs index 4521a5b2f..579106455 100644 --- a/lib/crates/fabro-config/tests/resolve_root.rs +++ b/lib/crates/fabro-config/tests/resolve_root.rs @@ -11,7 +11,7 @@ fn resolves_root_settings_defaults() { let settings = fabro_config::resolve(&SettingsLayer::default()).expect("empty settings should resolve"); - assert_eq!(settings.project.directory, "fabro/"); + assert_eq!(settings.project.directory, "."); assert_eq!(settings.workflow.graph, "workflow.fabro"); assert!(settings.run.execution.retros); assert!(settings.cli.updates.check); diff --git a/lib/crates/fabro-server/src/error.rs b/lib/crates/fabro-server/src/error.rs index 0e675af67..dd855713b 100644 --- a/lib/crates/fabro-server/src/error.rs +++ b/lib/crates/fabro-server/src/error.rs @@ -3,6 +3,8 @@ use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; use serde::Serialize; +use crate::secret_store::SecretStoreError; + #[derive(Debug, thiserror::Error)] pub enum Error { #[error(transparent)] @@ -21,7 +23,7 @@ pub enum Error { Config(#[from] fabro_config::Error), #[error(transparent)] - SecretStore(#[from] crate::secret_store::SecretStoreError), + SecretStore(#[from] SecretStoreError), #[error("bad request: {0}")] BadRequest(String), diff --git a/lib/crates/fabro-spa/assets/assets/app.css b/lib/crates/fabro-spa/assets/assets/app.css index fccbfa3c1..7d9c96eee 100644 --- a/lib/crates/fabro-spa/assets/assets/app.css +++ b/lib/crates/fabro-spa/assets/assets/app.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-teal-100:oklch(95.3% .051 180.801);--color-teal-300:#b5ddef;--color-teal-500:#67b2d7;--color-teal-600:oklch(60% .118 184.704);--color-teal-700:#357f9e;--color-teal-950:oklch(27.7% .046 192.524);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--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);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-navy-950:#0f1729;--color-mint:#5ac8a8;--color-amber:#f0a45b;--color-coral:#e86b6b;--color-page:#0f1729;--color-panel:#252c3d;--color-panel-alt:#1a2133;--color-overlay:#ffffff0a;--color-overlay-strong:#ffffff1a;--color-fg:#fff;--color-fg-2:#e8edf3;--color-fg-3:#a8b5c5;--color-fg-muted:#4b5768;--color-line:#ffffff0f;--color-line-strong:#ffffff1f;--color-focus:#67b2d766}}@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}a[href],button,select,summary,[role=button],[role=link],[role=option],[role=menuitem],[role=tab]{cursor:pointer}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-0\.5{inset:calc(var(--spacing) * -.5)}.-inset-1\.5{inset:calc(var(--spacing) * -1.5)}.-inset-px{inset:-1px}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-6{top:calc(var(--spacing) * 6)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.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}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.-my-6{margin-block:calc(var(--spacing) * -6)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[7lh\]{min-height:7lh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-12{width:calc(var(--spacing) * 12)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[120px\]{max-width:120px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-prose{max-width:65ch}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[280px\]{min-width:280px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-top-right{transform-origin:100% 0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{appearance:none}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-amber\/10{border-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.border-amber\/10{border-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.border-amber\/20{border-color:#f0a45b33}@supports (color:color-mix(in lab, red, red)){.border-amber\/20{border-color:color-mix(in oklab, var(--color-amber) 20%, transparent)}}.border-fg-muted{border-color:var(--color-fg-muted)}.border-focus{border-color:var(--color-focus)}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-mint\/20{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.border-mint\/20{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-500\/10{border-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/10{border-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.border-teal-500\/20{border-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/20{border-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.border-teal-500\/30{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/30{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.border-transparent{border-color:#0000}.bg-amber{background-color:var(--color-amber)}.bg-amber\/5{background-color:#f0a45b0d}@supports (color:color-mix(in lab, red, red)){.bg-amber\/5{background-color:color-mix(in oklab, var(--color-amber) 5%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-coral{background-color:var(--color-coral)}.bg-mint{background-color:var(--color-mint)}.bg-mint\/5{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.bg-mint\/5{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.bg-overlay{background-color:var(--color-overlay)}.bg-overlay-strong{background-color:var(--color-overlay-strong)}.bg-page{background-color:var(--color-page)}.bg-page\/50{background-color:#0f172980}@supports (color:color-mix(in lab, red, red)){.bg-page\/50{background-color:color-mix(in oklab, var(--color-page) 50%, transparent)}}.bg-page\/60{background-color:#0f172999}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--color-page) 60%, transparent)}}.bg-page\/80{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.bg-page\/80{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-panel-alt\/40{background-color:#1a213366}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/40{background-color:color-mix(in oklab, var(--color-panel-alt) 40%, transparent)}}.bg-panel-alt\/60{background-color:#1a213399}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/60{background-color:color-mix(in oklab, var(--color-panel-alt) 60%, transparent)}}.bg-panel-alt\/90{background-color:#1a2133e6}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/90{background-color:color-mix(in oklab, var(--color-panel-alt) 90%, transparent)}}.bg-panel\/40{background-color:#252c3d66}@supports (color:color-mix(in lab, red, red)){.bg-panel\/40{background-color:color-mix(in oklab, var(--color-panel) 40%, transparent)}}.bg-panel\/50{background-color:#252c3d80}@supports (color:color-mix(in lab, red, red)){.bg-panel\/50{background-color:color-mix(in oklab, var(--color-panel) 50%, transparent)}}.bg-panel\/60{background-color:#252c3d99}@supports (color:color-mix(in lab, red, red)){.bg-panel\/60{background-color:color-mix(in oklab, var(--color-panel) 60%, transparent)}}.bg-panel\/80{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.bg-panel\/80{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.bg-panel\/90{background-color:#252c3de6}@supports (color:color-mix(in lab, red, red)){.bg-panel\/90{background-color:color-mix(in oklab, var(--color-panel) 90%, transparent)}}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/5{background-color:#67b2d70d}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/5{background-color:color-mix(in oklab, var(--color-teal-500) 5%, transparent)}}.bg-teal-500\/10{background-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/10{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.bg-teal-500\/50{background-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/50{background-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-950\/30{background-color:#022f2e4d}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/30{background-color:color-mix(in oklab, var(--color-teal-950) 30%, transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-teal-500\/30{--tw-gradient-from:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.from-teal-500\/30{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.from-teal-500\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-mint\/20{--tw-gradient-to:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.to-mint\/20{--tw-gradient-to:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.to-mint\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-24{padding-block:calc(var(--spacing) * 24)}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[12vh\]{padding-top:12vh}.pt-\[15vh\]{padding-top:15vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-lg\/6{font-size:var(--text-lg);line-height:calc(var(--spacing) * 6)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[2rem\]{font-size:2rem}.text-\[8rem\]{font-size:8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-\[1\.625rem\]{--tw-leading:1.625rem;line-height:1.625rem}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber{color:var(--color-amber)}.text-amber\/70{color:#f0a45bb3}@supports (color:color-mix(in lab, red, red)){.text-amber\/70{color:color-mix(in oklab, var(--color-amber) 70%, transparent)}}.text-coral{color:var(--color-coral)}.text-fg{color:var(--color-fg)}.text-fg-2{color:var(--color-fg-2)}.text-fg-3{color:var(--color-fg-3)}.text-fg-muted{color:var(--color-fg-muted)}.text-fg-muted\/60{color:#4b576899}@supports (color:color-mix(in lab, red, red)){.text-fg-muted\/60{color:color-mix(in oklab, var(--color-fg-muted) 60%, transparent)}}.text-mint{color:var(--color-mint)}.text-navy-950{color:var(--color-navy-950)}.text-teal-100{color:var(--color-teal-100)}.text-teal-300{color:var(--color-teal-300)}.text-teal-500{color:var(--color-teal-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-muted::placeholder{color:var(--color-fg-muted)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/30{--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.shadow-black\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.-outline-offset-1{outline-offset:calc(1px * -1)}.outline-line-strong{outline-color:var(--color-line-strong)}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--anchor-gap\:4px\]{--anchor-gap:4px}.group-focus-within\:border-focus:is(:where(.group):focus-within *){border-color:var(--color-focus)}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\:text-fg:is(:where(.group):hover *){color:var(--color-fg)}}.group-data-open\:block:is(:where(.group)[data-open] *){display:block}.group-data-open\:hidden:is(:where(.group)[data-open] *){display:none}.placeholder\:text-fg-muted::placeholder{color:var(--color-fg-muted)}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * 0)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.after\:bottom-0:after{content:var(--tw-content);bottom:calc(var(--spacing) * 0)}.after\:border-y:after{content:var(--tw-content);border-block-style:var(--tw-border-style);border-block-width:1px}.after\:border-line-strong:after{content:var(--tw-content);border-color:var(--color-line-strong)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-amber\/50:hover{border-color:#f0a45b80}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber\/50:hover{border-color:color-mix(in oklab, var(--color-amber) 50%, transparent)}}.hover\:border-line-strong:hover{border-color:var(--color-line-strong)}.hover\:border-mint\/50:hover{border-color:#5ac8a880}@supports (color:color-mix(in lab, red, red)){.hover\:border-mint\/50:hover{border-color:color-mix(in oklab, var(--color-mint) 50%, transparent)}}.hover\:border-teal-500\/30:hover{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/30:hover{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.hover\:border-teal-500\/40:hover{border-color:#67b2d766}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/40:hover{border-color:color-mix(in oklab, var(--color-teal-500) 40%, transparent)}}.hover\:border-teal-500\/50:hover{border-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/50:hover{border-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.hover\:bg-amber\/10:hover{background-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber\/10:hover{background-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.hover\:bg-mint\/10:hover{background-color:#5ac8a81a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-mint\/10:hover{background-color:color-mix(in oklab, var(--color-mint) 10%, transparent)}}.hover\:bg-overlay:hover{background-color:var(--color-overlay)}.hover\:bg-overlay-strong:hover{background-color:var(--color-overlay-strong)}.hover\:bg-page\/80:hover{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-page\/80:hover{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.hover\:bg-panel:hover{background-color:var(--color-panel)}.hover\:bg-panel\/80:hover{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-panel\/80:hover{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.hover\:bg-teal-300:hover{background-color:var(--color-teal-300)}.hover\:bg-teal-500:hover{background-color:var(--color-teal-500)}.hover\:bg-teal-500\/10:hover{background-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/10:hover{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.hover\:bg-teal-500\/15:hover{background-color:#67b2d726}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/15:hover{background-color:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.hover\:bg-teal-500\/20:hover{background-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/20:hover{background-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.hover\:text-fg:hover{color:var(--color-fg)}.hover\:text-fg-2:hover{color:var(--color-fg-2)}.hover\:text-fg-3:hover{color:var(--color-fg-3)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-black\/20:hover{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-black\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-focus:focus{border-color:var(--color-focus)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-teal-500:focus{outline-color:var(--color-teal-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-line:disabled{border-color:var(--color-line)}.disabled\:text-fg-muted:disabled{color:var(--color-fg-muted)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.disabled\:hover\:bg-teal-500:disabled:hover{background-color:var(--color-teal-500)}.disabled\:hover\:bg-teal-600:disabled:hover{background-color:var(--color-teal-600)}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-fg-muted:disabled:hover{color:var(--color-fg-muted)}.disabled\:hover\:text-mint:disabled:hover{color:var(--color-mint)}}.data-closed\:scale-95[data-closed]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-closed\:transform[data-closed]{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.data-closed\:opacity-0[data-closed]{opacity:0}.data-enter\:duration-100[data-enter]{--tw-duration:.1s;transition-duration:.1s}.data-enter\:ease-out[data-enter]{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.data-focus\:bg-overlay[data-focus]{background-color:var(--color-overlay)}.data-focus\:text-fg[data-focus]{color:var(--color-fg)}.data-focus\:outline-hidden[data-focus]{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.data-focus\:outline-hidden[data-focus]{outline-offset:2px;outline:2px solid #0000}}.data-leave\:duration-75[data-leave]{--tw-duration:75ms;transition-duration:75ms}.data-leave\:ease-in[data-leave]{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.data-selected\:text-teal-300[data-selected]{color:var(--color-teal-300)}@media (min-width:40rem){.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:inline{display:inline}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media (min-width:48rem){.md\:ml-6{margin-left:calc(var(--spacing) * 6)}.md\:block{display:block}.md\:hidden{display:none}}@media (min-width:64rem){.lg\:-mx-8{margin-inline:calc(var(--spacing) * -8)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}.light{--color-page:#fff;--color-panel:#f8fafc;--color-panel-alt:#f1f5f9;--color-overlay:#0000000a;--color-overlay-strong:#0000001a;--color-fg:#0f172a;--color-fg-2:#1e293b;--color-fg-3:#475569;--color-fg-muted:#94a3b8;--color-line:#00000014;--color-line-strong:#00000026;--color-focus:#0e749080;--color-mint:#0d9488;--color-amber:#d97706;--color-coral:#dc2626;--color-teal-300:#0891b2;--color-teal-500:#0e7490}:root{--chart-gridline:#ffffff0a;--chart-axis-label:#4b5768}.light{--chart-gridline:#0000000f;--chart-axis-label:#475569}.bg-atmosphere{background-color:var(--color-page);background-image:radial-gradient(120% 60% at 15% 5%,#357f9e1f 0%,#0000 50%),radial-gradient(80% 50% at 85% 90%,#5ac8a812 0%,#0000 45%);background-attachment:fixed}.light .bg-atmosphere,.light.bg-atmosphere{background-image:radial-gradient(120% 60% at 15% 5%,#0e74900f 0%,#0000 50%),radial-gradient(80% 50% at 85% 90%,#0d94880a 0%,#0000 45%)}.bg-atmosphere:before{content:"";z-index:1;pointer-events:none;opacity:.07;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;position:fixed;inset:0}.light .bg-atmosphere:before,.light.bg-atmosphere:before{opacity:.03}:root{--diffs-font-family:"JetBrains Mono", ui-monospace, monospace;--diffs-header-font-family:"Geist", ui-sans-serif, system-ui, sans-serif;--diffs-font-size:13px;--diffs-line-height:20px;--diffs-bg-buffer-override:#0f1729;--diffs-bg-context-override:#161d2e;--diffs-bg-hover-override:#1c2438;--diffs-bg-separator-override:#252c3d;--diffs-fg-number-override:#4b5768;--diffs-addition-color-override:#5ac8a8;--diffs-fg-number-addition-override:#5ac8a880;--diffs-deletion-color-override:#e86b6b;--diffs-fg-number-deletion-override:#e86b6b80}.light{--diffs-bg-buffer-override:#fff;--diffs-bg-context-override:#f8fafc;--diffs-bg-hover-override:#f1f5f9;--diffs-bg-separator-override:#e2e8f0;--diffs-fg-number-override:#94a3b8;--diffs-addition-color-override:#0d9488;--diffs-fg-number-addition-override:#0d948880;--diffs-deletion-color-override:#dc2626;--diffs-fg-number-deletion-override:#dc262680}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-teal-100:oklch(95.3% .051 180.801);--color-teal-300:#b5ddef;--color-teal-500:#67b2d7;--color-teal-600:oklch(60% .118 184.704);--color-teal-700:#357f9e;--color-teal-950:oklch(27.7% .046 192.524);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--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);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-navy-950:#0f1729;--color-mint:#5ac8a8;--color-amber:#f0a45b;--color-coral:#e86b6b;--color-page:#0f1729;--color-panel:#252c3d;--color-panel-alt:#1a2133;--color-overlay:#ffffff0a;--color-overlay-strong:#ffffff1a;--color-fg:#fff;--color-fg-2:#e8edf3;--color-fg-3:#a8b5c5;--color-fg-muted:#4b5768;--color-line:#ffffff0f;--color-line-strong:#ffffff1f;--color-focus:#67b2d766}}@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}a[href],button,select,summary,[role=button],[role=link],[role=option],[role=menuitem],[role=tab]{cursor:pointer}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.-inset-0\.5{inset:calc(var(--spacing) * -.5)}.-inset-1\.5{inset:calc(var(--spacing) * -1.5)}.-inset-px{inset:-1px}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-6{top:calc(var(--spacing) * 6)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.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}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.-my-6{margin-block:calc(var(--spacing) * -6)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[7lh\]{min-height:7lh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-12{width:calc(var(--spacing) * 12)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[120px\]{max-width:120px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-prose{max-width:65ch}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[280px\]{min-width:280px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-top-right{transform-origin:100% 0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{appearance:none}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-amber\/10{border-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.border-amber\/10{border-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.border-amber\/20{border-color:#f0a45b33}@supports (color:color-mix(in lab, red, red)){.border-amber\/20{border-color:color-mix(in oklab, var(--color-amber) 20%, transparent)}}.border-fg-muted{border-color:var(--color-fg-muted)}.border-focus{border-color:var(--color-focus)}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-mint\/20{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.border-mint\/20{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-500\/10{border-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/10{border-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.border-teal-500\/20{border-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/20{border-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.border-teal-500\/30{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/30{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.border-transparent{border-color:#0000}.bg-amber{background-color:var(--color-amber)}.bg-amber\/5{background-color:#f0a45b0d}@supports (color:color-mix(in lab, red, red)){.bg-amber\/5{background-color:color-mix(in oklab, var(--color-amber) 5%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-coral{background-color:var(--color-coral)}.bg-mint{background-color:var(--color-mint)}.bg-mint\/5{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.bg-mint\/5{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.bg-overlay{background-color:var(--color-overlay)}.bg-overlay-strong{background-color:var(--color-overlay-strong)}.bg-page{background-color:var(--color-page)}.bg-page\/50{background-color:#0f172980}@supports (color:color-mix(in lab, red, red)){.bg-page\/50{background-color:color-mix(in oklab, var(--color-page) 50%, transparent)}}.bg-page\/60{background-color:#0f172999}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--color-page) 60%, transparent)}}.bg-page\/80{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.bg-page\/80{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-panel-alt\/40{background-color:#1a213366}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/40{background-color:color-mix(in oklab, var(--color-panel-alt) 40%, transparent)}}.bg-panel-alt\/60{background-color:#1a213399}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/60{background-color:color-mix(in oklab, var(--color-panel-alt) 60%, transparent)}}.bg-panel-alt\/90{background-color:#1a2133e6}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/90{background-color:color-mix(in oklab, var(--color-panel-alt) 90%, transparent)}}.bg-panel\/40{background-color:#252c3d66}@supports (color:color-mix(in lab, red, red)){.bg-panel\/40{background-color:color-mix(in oklab, var(--color-panel) 40%, transparent)}}.bg-panel\/50{background-color:#252c3d80}@supports (color:color-mix(in lab, red, red)){.bg-panel\/50{background-color:color-mix(in oklab, var(--color-panel) 50%, transparent)}}.bg-panel\/60{background-color:#252c3d99}@supports (color:color-mix(in lab, red, red)){.bg-panel\/60{background-color:color-mix(in oklab, var(--color-panel) 60%, transparent)}}.bg-panel\/80{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.bg-panel\/80{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.bg-panel\/90{background-color:#252c3de6}@supports (color:color-mix(in lab, red, red)){.bg-panel\/90{background-color:color-mix(in oklab, var(--color-panel) 90%, transparent)}}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/5{background-color:#67b2d70d}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/5{background-color:color-mix(in oklab, var(--color-teal-500) 5%, transparent)}}.bg-teal-500\/10{background-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/10{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.bg-teal-500\/50{background-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/50{background-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-950\/30{background-color:#022f2e4d}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/30{background-color:color-mix(in oklab, var(--color-teal-950) 30%, transparent)}}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-teal-500\/30{--tw-gradient-from:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.from-teal-500\/30{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.from-teal-500\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-mint\/20{--tw-gradient-to:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.to-mint\/20{--tw-gradient-to:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.to-mint\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-24{padding-block:calc(var(--spacing) * 24)}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[12vh\]{padding-top:12vh}.pt-\[15vh\]{padding-top:15vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-lg\/6{font-size:var(--text-lg);line-height:calc(var(--spacing) * 6)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[2rem\]{font-size:2rem}.text-\[8rem\]{font-size:8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-\[1\.625rem\]{--tw-leading:1.625rem;line-height:1.625rem}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber{color:var(--color-amber)}.text-amber\/70{color:#f0a45bb3}@supports (color:color-mix(in lab, red, red)){.text-amber\/70{color:color-mix(in oklab, var(--color-amber) 70%, transparent)}}.text-coral{color:var(--color-coral)}.text-fg{color:var(--color-fg)}.text-fg-2{color:var(--color-fg-2)}.text-fg-3{color:var(--color-fg-3)}.text-fg-muted{color:var(--color-fg-muted)}.text-fg-muted\/60{color:#4b576899}@supports (color:color-mix(in lab, red, red)){.text-fg-muted\/60{color:color-mix(in oklab, var(--color-fg-muted) 60%, transparent)}}.text-mint{color:var(--color-mint)}.text-navy-950{color:var(--color-navy-950)}.text-teal-100{color:var(--color-teal-100)}.text-teal-300{color:var(--color-teal-300)}.text-teal-500{color:var(--color-teal-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-muted::placeholder{color:var(--color-fg-muted)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/30{--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.shadow-black\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.-outline-offset-1{outline-offset:calc(1px * -1)}.outline-line-strong{outline-color:var(--color-line-strong)}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--anchor-gap\:4px\]{--anchor-gap:4px}.group-focus-within\:border-focus:is(:where(.group):focus-within *){border-color:var(--color-focus)}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\:text-fg:is(:where(.group):hover *){color:var(--color-fg)}}.group-data-open\:block:is(:where(.group)[data-open] *){display:block}.group-data-open\:hidden:is(:where(.group)[data-open] *){display:none}.placeholder\:text-fg-muted::placeholder{color:var(--color-fg-muted)}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * 0)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.after\:bottom-0:after{content:var(--tw-content);bottom:calc(var(--spacing) * 0)}.after\:border-y:after{content:var(--tw-content);border-block-style:var(--tw-border-style);border-block-width:1px}.after\:border-line-strong:after{content:var(--tw-content);border-color:var(--color-line-strong)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-amber\/50:hover{border-color:#f0a45b80}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber\/50:hover{border-color:color-mix(in oklab, var(--color-amber) 50%, transparent)}}.hover\:border-line-strong:hover{border-color:var(--color-line-strong)}.hover\:border-mint\/50:hover{border-color:#5ac8a880}@supports (color:color-mix(in lab, red, red)){.hover\:border-mint\/50:hover{border-color:color-mix(in oklab, var(--color-mint) 50%, transparent)}}.hover\:border-teal-500\/30:hover{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/30:hover{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.hover\:border-teal-500\/40:hover{border-color:#67b2d766}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/40:hover{border-color:color-mix(in oklab, var(--color-teal-500) 40%, transparent)}}.hover\:border-teal-500\/50:hover{border-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/50:hover{border-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.hover\:bg-amber\/10:hover{background-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber\/10:hover{background-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.hover\:bg-mint\/10:hover{background-color:#5ac8a81a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-mint\/10:hover{background-color:color-mix(in oklab, var(--color-mint) 10%, transparent)}}.hover\:bg-overlay:hover{background-color:var(--color-overlay)}.hover\:bg-overlay-strong:hover{background-color:var(--color-overlay-strong)}.hover\:bg-page\/80:hover{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-page\/80:hover{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.hover\:bg-panel:hover{background-color:var(--color-panel)}.hover\:bg-panel\/80:hover{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-panel\/80:hover{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.hover\:bg-teal-300:hover{background-color:var(--color-teal-300)}.hover\:bg-teal-500:hover{background-color:var(--color-teal-500)}.hover\:bg-teal-500\/10:hover{background-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/10:hover{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.hover\:bg-teal-500\/15:hover{background-color:#67b2d726}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/15:hover{background-color:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.hover\:bg-teal-500\/20:hover{background-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/20:hover{background-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.hover\:text-fg:hover{color:var(--color-fg)}.hover\:text-fg-2:hover{color:var(--color-fg-2)}.hover\:text-fg-3:hover{color:var(--color-fg-3)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-black\/20:hover{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-black\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-focus:focus{border-color:var(--color-focus)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-teal-500:focus{outline-color:var(--color-teal-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-line:disabled{border-color:var(--color-line)}.disabled\:text-fg-muted:disabled{color:var(--color-fg-muted)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.disabled\:hover\:bg-teal-500:disabled:hover{background-color:var(--color-teal-500)}.disabled\:hover\:bg-teal-600:disabled:hover{background-color:var(--color-teal-600)}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-fg-muted:disabled:hover{color:var(--color-fg-muted)}.disabled\:hover\:text-mint:disabled:hover{color:var(--color-mint)}}.data-closed\:scale-95[data-closed]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-closed\:transform[data-closed]{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.data-closed\:opacity-0[data-closed]{opacity:0}.data-enter\:duration-100[data-enter]{--tw-duration:.1s;transition-duration:.1s}.data-enter\:ease-out[data-enter]{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.data-focus\:bg-overlay[data-focus]{background-color:var(--color-overlay)}.data-focus\:text-fg[data-focus]{color:var(--color-fg)}.data-focus\:outline-hidden[data-focus]{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.data-focus\:outline-hidden[data-focus]{outline-offset:2px;outline:2px solid #0000}}.data-leave\:duration-75[data-leave]{--tw-duration:75ms;transition-duration:75ms}.data-leave\:ease-in[data-leave]{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.data-selected\:text-teal-300[data-selected]{color:var(--color-teal-300)}@media (min-width:40rem){.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:inline{display:inline}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media (min-width:48rem){.md\:ml-6{margin-left:calc(var(--spacing) * 6)}.md\:block{display:block}.md\:hidden{display:none}}@media (min-width:64rem){.lg\:-mx-8{margin-inline:calc(var(--spacing) * -8)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}.light{--color-page:#fff;--color-panel:#f8fafc;--color-panel-alt:#f1f5f9;--color-overlay:#0000000a;--color-overlay-strong:#0000001a;--color-fg:#0f172a;--color-fg-2:#1e293b;--color-fg-3:#475569;--color-fg-muted:#94a3b8;--color-line:#00000014;--color-line-strong:#00000026;--color-focus:#0e749080;--color-mint:#0d9488;--color-amber:#d97706;--color-coral:#dc2626;--color-teal-300:#0891b2;--color-teal-500:#0e7490}:root{--chart-gridline:#ffffff0a;--chart-axis-label:#4b5768}.light{--chart-gridline:#0000000f;--chart-axis-label:#475569}.bg-atmosphere{background-color:var(--color-page);background-image:radial-gradient(120% 60% at 15% 5%,#357f9e1f 0%,#0000 50%),radial-gradient(80% 50% at 85% 90%,#5ac8a812 0%,#0000 45%);background-attachment:fixed}.light .bg-atmosphere,.light.bg-atmosphere{background-image:radial-gradient(120% 60% at 15% 5%,#0e74900f 0%,#0000 50%),radial-gradient(80% 50% at 85% 90%,#0d94880a 0%,#0000 45%)}.bg-atmosphere:before{content:"";z-index:1;pointer-events:none;opacity:.07;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;position:fixed;inset:0}.light .bg-atmosphere:before,.light.bg-atmosphere:before{opacity:.03}:root{--diffs-font-family:"JetBrains Mono", ui-monospace, monospace;--diffs-header-font-family:"Geist", ui-sans-serif, system-ui, sans-serif;--diffs-font-size:13px;--diffs-line-height:20px;--diffs-bg-buffer-override:#0f1729;--diffs-bg-context-override:#161d2e;--diffs-bg-hover-override:#1c2438;--diffs-bg-separator-override:#252c3d;--diffs-fg-number-override:#4b5768;--diffs-addition-color-override:#5ac8a8;--diffs-fg-number-addition-override:#5ac8a880;--diffs-deletion-color-override:#e86b6b;--diffs-fg-number-deletion-override:#e86b6b80}.light{--diffs-bg-buffer-override:#fff;--diffs-bg-context-override:#f8fafc;--diffs-bg-hover-override:#f1f5f9;--diffs-bg-separator-override:#e2e8f0;--diffs-fg-number-override:#94a3b8;--diffs-addition-color-override:#0d9488;--diffs-fg-number-addition-override:#0d948880;--diffs-deletion-color-override:#dc2626;--diffs-fg-number-deletion-override:#dc262680}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}} \ No newline at end of file diff --git a/lib/crates/fabro-spa/assets/assets/entry-9ys2gakq.js b/lib/crates/fabro-spa/assets/assets/entry-2zzbvk48.js similarity index 69% rename from lib/crates/fabro-spa/assets/assets/entry-9ys2gakq.js rename to lib/crates/fabro-spa/assets/assets/entry-2zzbvk48.js index 6109b407f..f019767d0 100644 --- a/lib/crates/fabro-spa/assets/assets/entry-9ys2gakq.js +++ b/lib/crates/fabro-spa/assets/assets/entry-2zzbvk48.js @@ -1,4 +1,4 @@ -import{X as g,Y as e8,Z as g5,_ as x}from"./chunk-q07bg6gn.js";var t=e8((bh,AW)=>{(function(){function Z(E,i){Object.defineProperty(z.prototype,E,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",i[0],i[1])}})}function J(E){if(E===null||typeof E!=="object")return null;return E=h1&&E[h1]||E["@@iterator"],typeof E==="function"?E:null}function X(E,i){E=(E=E.constructor)&&(E.displayName||E.name)||"ReactClass";var F0=E+"."+i;T0[F0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",i,E),T0[F0]=!0)}function z(E,i,F0){this.props=E,this.context=i,this.refs=s5,this.updater=F0||r1}function B(){}function U(E,i,F0){this.props=E,this.context=i,this.refs=s5,this.updater=F0||r1}function W(){}function $(E){return""+E}function M(E){try{$(E);var i=!1}catch(S0){i=!0}if(i){i=console;var F0=i.error,P0=typeof Symbol==="function"&&Symbol.toStringTag&&E[Symbol.toStringTag]||E.constructor.name||"Object";return F0.call(i,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",P0),$(E)}}function w(E){if(E==null)return null;if(typeof E==="function")return E.$$typeof===T6?null:E.displayName||E.name||null;if(typeof E==="string")return E;switch(E){case O0:return"Fragment";case B0:return"Profiler";case f:return"StrictMode";case O1:return"Suspense";case H0:return"SuspenseList";case s1:return"Activity"}if(typeof E==="object")switch(typeof E.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),E.$$typeof){case e:return"Portal";case W0:return E.displayName||"Context";case M0:return(E._context.displayName||"Context")+".Consumer";case u0:var i=E.render;return E=E.displayName,E||(E=i.displayName||i.name||"",E=E!==""?"ForwardRef("+E+")":"ForwardRef"),E;case G1:return i=E.displayName||null,i!==null?i:w(E.type)||"Memo";case C1:i=E._payload,E=E._init;try{return w(E(i))}catch(F0){}}return null}function N(E){if(E===O0)return"<>";if(typeof E==="object"&&E!==null&&E.$$typeof===C1)return"<...>";try{var i=w(E);return i?"<"+i+">":"<...>"}catch(F0){return"<...>"}}function O(){var E=Y1.A;return E===null?null:E.getOwner()}function A(){return Error("react-stack-top-frame")}function V(E){if(t7.call(E,"key")){var i=Object.getOwnPropertyDescriptor(E,"key").get;if(i&&i.isReactWarning)return!1}return E.key!==void 0}function P(E,i){function F0(){Y6||(Y6=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",i))}F0.isReactWarning=!0,Object.defineProperty(E,"key",{get:F0,configurable:!0})}function L(){var E=w(this.type);return R4[E]||(R4[E]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),E=this.props.ref,E!==void 0?E:null}function D(E,i,F0,P0,S0,a0){var x0=F0.ref;return E={$$typeof:G0,type:E,key:i,props:F0,_owner:P0},(x0!==void 0?x0:null)!==null?Object.defineProperty(E,"ref",{enumerable:!1,get:L}):Object.defineProperty(E,"ref",{enumerable:!1,value:null}),E._store={},Object.defineProperty(E._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(E,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(E,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:S0}),Object.defineProperty(E,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:a0}),Object.freeze&&(Object.freeze(E.props),Object.freeze(E)),E}function C(E,i){return i=D(E.type,i,E.props,E._owner,E._debugStack,E._debugTask),E._store&&(i._store.validated=E._store.validated),i}function R(E){T(E)?E._store&&(E._store.validated=1):typeof E==="object"&&E!==null&&E.$$typeof===C1&&(E._payload.status==="fulfilled"?T(E._payload.value)&&E._payload.value._store&&(E._payload.value._store.validated=1):E._store&&(E._store.validated=1))}function T(E){return typeof E==="object"&&E!==null&&E.$$typeof===G0}function y(E){var i={"=":"=0",":":"=2"};return"$"+E.replace(/[=:]/g,function(F0){return i[F0]})}function I(E,i){return typeof E==="object"&&E!==null&&E.key!=null?(M(E.key),y(""+E.key)):i.toString(36)}function c(E){switch(E.status){case"fulfilled":return E.value;case"rejected":throw E.reason;default:switch(typeof E.status==="string"?E.then(W,W):(E.status="pending",E.then(function(i){E.status==="pending"&&(E.status="fulfilled",E.value=i)},function(i){E.status==="pending"&&(E.status="rejected",E.reason=i)})),E.status){case"fulfilled":return E.value;case"rejected":throw E.reason}}throw E}function S(E,i,F0,P0,S0){var a0=typeof E;if(a0==="undefined"||a0==="boolean")E=null;var x0=!1;if(E===null)x0=!0;else switch(a0){case"bigint":case"string":case"number":x0=!0;break;case"object":switch(E.$$typeof){case G0:case e:x0=!0;break;case C1:return x0=E._init,S(x0(E._payload),i,F0,P0,S0)}}if(x0){x0=E,S0=S0(x0);var o0=P0===""?"."+I(x0,0):P0;return B1(S0)?(F0="",o0!=null&&(F0=o0.replace(r2,"$&/")+"/"),S(S0,i,F0,"",function(M5){return M5})):S0!=null&&(T(S0)&&(S0.key!=null&&(x0&&x0.key===S0.key||M(S0.key)),F0=C(S0,F0+(S0.key==null||x0&&x0.key===S0.key?"":(""+S0.key).replace(r2,"$&/")+"/")+o0),P0!==""&&x0!=null&&T(x0)&&x0.key==null&&x0._store&&!x0._store.validated&&(F0._store.validated=2),S0=F0),i.push(S0)),1}if(x0=0,o0=P0===""?".":P0+":",B1(E))for(var b0=0;b0{(function(){function Z(E,i){Object.defineProperty(z.prototype,E,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",i[0],i[1])}})}function Q(E){if(E===null||typeof E!=="object")return null;return E=h1&&E[h1]||E["@@iterator"],typeof E==="function"?E:null}function X(E,i){E=(E=E.constructor)&&(E.displayName||E.name)||"ReactClass";var F0=E+"."+i;T0[F0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",i,E),T0[F0]=!0)}function z(E,i,F0){this.props=E,this.context=i,this.refs=s5,this.updater=F0||r1}function B(){}function U(E,i,F0){this.props=E,this.context=i,this.refs=s5,this.updater=F0||r1}function W(){}function $(E){return""+E}function M(E){try{$(E);var i=!1}catch(S0){i=!0}if(i){i=console;var F0=i.error,P0=typeof Symbol==="function"&&Symbol.toStringTag&&E[Symbol.toStringTag]||E.constructor.name||"Object";return F0.call(i,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",P0),$(E)}}function w(E){if(E==null)return null;if(typeof E==="function")return E.$$typeof===T6?null:E.displayName||E.name||null;if(typeof E==="string")return E;switch(E){case O0:return"Fragment";case B0:return"Profiler";case f:return"StrictMode";case O1:return"Suspense";case H0:return"SuspenseList";case s1:return"Activity"}if(typeof E==="object")switch(typeof E.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),E.$$typeof){case e:return"Portal";case W0:return E.displayName||"Context";case M0:return(E._context.displayName||"Context")+".Consumer";case u0:var i=E.render;return E=E.displayName,E||(E=i.displayName||i.name||"",E=E!==""?"ForwardRef("+E+")":"ForwardRef"),E;case G1:return i=E.displayName||null,i!==null?i:w(E.type)||"Memo";case C1:i=E._payload,E=E._init;try{return w(E(i))}catch(F0){}}return null}function N(E){if(E===O0)return"<>";if(typeof E==="object"&&E!==null&&E.$$typeof===C1)return"<...>";try{var i=w(E);return i?"<"+i+">":"<...>"}catch(F0){return"<...>"}}function O(){var E=Y1.A;return E===null?null:E.getOwner()}function A(){return Error("react-stack-top-frame")}function V(E){if(t7.call(E,"key")){var i=Object.getOwnPropertyDescriptor(E,"key").get;if(i&&i.isReactWarning)return!1}return E.key!==void 0}function P(E,i){function F0(){Y6||(Y6=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",i))}F0.isReactWarning=!0,Object.defineProperty(E,"key",{get:F0,configurable:!0})}function L(){var E=w(this.type);return R4[E]||(R4[E]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),E=this.props.ref,E!==void 0?E:null}function D(E,i,F0,P0,S0,a0){var x0=F0.ref;return E={$$typeof:G0,type:E,key:i,props:F0,_owner:P0},(x0!==void 0?x0:null)!==null?Object.defineProperty(E,"ref",{enumerable:!1,get:L}):Object.defineProperty(E,"ref",{enumerable:!1,value:null}),E._store={},Object.defineProperty(E._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(E,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(E,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:S0}),Object.defineProperty(E,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:a0}),Object.freeze&&(Object.freeze(E.props),Object.freeze(E)),E}function C(E,i){return i=D(E.type,i,E.props,E._owner,E._debugStack,E._debugTask),E._store&&(i._store.validated=E._store.validated),i}function R(E){T(E)?E._store&&(E._store.validated=1):typeof E==="object"&&E!==null&&E.$$typeof===C1&&(E._payload.status==="fulfilled"?T(E._payload.value)&&E._payload.value._store&&(E._payload.value._store.validated=1):E._store&&(E._store.validated=1))}function T(E){return typeof E==="object"&&E!==null&&E.$$typeof===G0}function y(E){var i={"=":"=0",":":"=2"};return"$"+E.replace(/[=:]/g,function(F0){return i[F0]})}function I(E,i){return typeof E==="object"&&E!==null&&E.key!=null?(M(E.key),y(""+E.key)):i.toString(36)}function c(E){switch(E.status){case"fulfilled":return E.value;case"rejected":throw E.reason;default:switch(typeof E.status==="string"?E.then(W,W):(E.status="pending",E.then(function(i){E.status==="pending"&&(E.status="fulfilled",E.value=i)},function(i){E.status==="pending"&&(E.status="rejected",E.reason=i)})),E.status){case"fulfilled":return E.value;case"rejected":throw E.reason}}throw E}function S(E,i,F0,P0,S0){var a0=typeof E;if(a0==="undefined"||a0==="boolean")E=null;var x0=!1;if(E===null)x0=!0;else switch(a0){case"bigint":case"string":case"number":x0=!0;break;case"object":switch(E.$$typeof){case G0:case e:x0=!0;break;case C1:return x0=E._init,S(x0(E._payload),i,F0,P0,S0)}}if(x0){x0=E,S0=S0(x0);var o0=P0===""?"."+I(x0,0):P0;return B1(S0)?(F0="",o0!=null&&(F0=o0.replace(r2,"$&/")+"/"),S(S0,i,F0,"",function(M5){return M5})):S0!=null&&(T(S0)&&(S0.key!=null&&(x0&&x0.key===S0.key||M(S0.key)),F0=C(S0,F0+(S0.key==null||x0&&x0.key===S0.key?"":(""+S0.key).replace(r2,"$&/")+"/")+o0),P0!==""&&x0!=null&&T(x0)&&x0.key==null&&x0._store&&!x0._store.validated&&(F0._store.validated=2),S0=F0),i.push(S0)),1}if(x0=0,o0=P0===""?".":P0+":",B1(E))for(var b0=0;b0 import('./MyComponent')) @@ -10,67 +10,67 @@ Your code should look like: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app -See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),E}function o(){Y1.asyncTransitions--}function U0(E){if(n7===null)try{var i=("require"+Math.random()).slice(0,7);n7=(AW&&AW[i]).call(AW,"timers").setImmediate}catch(F0){n7=function(P0){z2===!1&&(z2=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var S0=new MessageChannel;S0.port1.onmessage=P0,S0.port2.postMessage(void 0)}}return n7(E)}function K0(E){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(b0,M5){S0=!0,x0.then(function(Q5){if(w0(i,F0),F0===0){try{z0(P0),U0(function(){return s(Q5,b0,M5)})}catch(o5){Y1.thrownErrors.push(o5)}if(0 ...)"))}),Y1.actQueue=null),0Y1.recentlyCreatedOwnerStacks++;return D(E,S0,P0,O(),b0?Error("react-stack-top-frame"):b2,b0?x1(N(E)):J6)},bh.createRef=function(){var E={current:null};return Object.seal(E),E},bh.forwardRef=function(E){E!=null&&E.$$typeof===G1?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof E!=="function"?console.error("forwardRef requires a render function but was given %s.",E===null?"null":typeof E):E.length!==0&&E.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",E.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),E!=null&&E.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var i={$$typeof:u0,render:E},F0;return Object.defineProperty(i,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(P0){F0=P0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:P0}),E.displayName=P0)}}),i},bh.isValidElement=T,bh.lazy=function(E){E={_status:-1,_result:E};var i={$$typeof:C1,_payload:E,_init:Y0},F0={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return E._ioInfo=F0,i._debugInfo=[{awaited:F0}],i},bh.memo=function(E,i){E==null&&console.error("memo: The first argument must be a component. Instead received: %s",E===null?"null":typeof E),i={$$typeof:G1,type:E,compare:i===void 0?null:i};var F0;return Object.defineProperty(i,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(P0){F0=P0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:P0}),E.displayName=P0)}}),i},bh.startTransition=function(E){var i=Y1.T,F0={};F0._updatedFibers=new Set,Y1.T=F0;try{var P0=E(),S0=Y1.S;S0!==null&&S0(F0,P0),typeof P0==="object"&&P0!==null&&typeof P0.then==="function"&&(Y1.asyncTransitions++,P0.then(o,o),P0.then(W,R5))}catch(a0){R5(a0)}finally{i===null&&F0._updatedFibers&&(E=F0._updatedFibers.size,F0._updatedFibers.clear(),10{(function(){function Z(){if(y=!1,d){var s=Eh.unstable_now();o=s;var z0=!0;try{Z:{R=!1,T&&(T=!1,c(Y0),Y0=-1),C=!0;var G0=D;try{Y:{U(s);for(L=X(A);L!==null&&!(L.expirationTime>s&&$());){var e=L.callback;if(typeof e==="function"){L.callback=null,D=L.priorityLevel;var O0=e(L.expirationTime<=s);if(s=Eh.unstable_now(),typeof O0==="function"){L.callback=O0,U(s),z0=!0;break Y}L===X(A)&&z(A),U(s)}else z(A);L=X(A)}if(L!==null)z0=!0;else{var f=X(V);f!==null&&M(W,f.startTime-s),z0=!1}}break Z}finally{L=null,D=G0,C=!1}z0=void 0}}finally{z0?U0():d=!1}}}function J(s,z0){var G0=s.length;s.push(z0);Z:for(;0>>1,O0=s[e];if(0>>1;eB(M0,G0))W0B(u0,M0)?(s[e]=u0,s[W0]=G0,e=W0):(s[e]=M0,s[B0]=G0,e=B0);else if(W0B(u0,G0))s[e]=u0,s[W0]=G0,e=W0;else break Z}}return z0}function B(s,z0){var G0=s.sortIndex-z0.sortIndex;return G0!==0?G0:s.id-z0.id}function U(s){for(var z0=X(V);z0!==null;){if(z0.callback===null)z(V);else if(z0.startTime<=s)z(V),z0.sortIndex=z0.expirationTime,J(A,z0);else break;z0=X(V)}}function W(s){if(T=!1,U(s),!R)if(X(A)!==null)R=!0,d||(d=!0,U0());else{var z0=X(V);z0!==null&&M(W,z0.startTime-s)}}function $(){return y?!0:Eh.unstable_now()-os||125e?(s.sortIndex=G0,J(V,s),X(A)===null&&s===X(V)&&(T?(c(Y0),Y0=-1):T=!0,M(W,G0-e))):(s.sortIndex=O0,J(A,s),R||C||(R=!0,d||(d=!0,U0()))),s},Eh.unstable_shouldYield=$,Eh.unstable_wrapCallback=function(s){var z0=D;return function(){var G0=D;D=z0;try{return s.apply(this,arguments)}finally{D=G0}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var $D=e8((yh)=>{var UO=g(t());(function(){function Z(){}function J(N){return""+N}function X(N,O,A){var V=3"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var S0=new MessageChannel;S0.port1.onmessage=P0,S0.port2.postMessage(void 0)}}return n7(E)}function K0(E){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(b0,M5){S0=!0,x0.then(function(J5){if(w0(i,F0),F0===0){try{z0(P0),U0(function(){return s(J5,b0,M5)})}catch(o5){Y1.thrownErrors.push(o5)}if(0 ...)"))}),Y1.actQueue=null),0Y1.recentlyCreatedOwnerStacks++;return D(E,S0,P0,O(),b0?Error("react-stack-top-frame"):b2,b0?x1(N(E)):Q6)},bh.createRef=function(){var E={current:null};return Object.seal(E),E},bh.forwardRef=function(E){E!=null&&E.$$typeof===G1?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof E!=="function"?console.error("forwardRef requires a render function but was given %s.",E===null?"null":typeof E):E.length!==0&&E.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",E.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),E!=null&&E.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var i={$$typeof:u0,render:E},F0;return Object.defineProperty(i,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(P0){F0=P0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:P0}),E.displayName=P0)}}),i},bh.isValidElement=T,bh.lazy=function(E){E={_status:-1,_result:E};var i={$$typeof:C1,_payload:E,_init:Y0},F0={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return E._ioInfo=F0,i._debugInfo=[{awaited:F0}],i},bh.memo=function(E,i){E==null&&console.error("memo: The first argument must be a component. Instead received: %s",E===null?"null":typeof E),i={$$typeof:G1,type:E,compare:i===void 0?null:i};var F0;return Object.defineProperty(i,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(P0){F0=P0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:P0}),E.displayName=P0)}}),i},bh.startTransition=function(E){var i=Y1.T,F0={};F0._updatedFibers=new Set,Y1.T=F0;try{var P0=E(),S0=Y1.S;S0!==null&&S0(F0,P0),typeof P0==="object"&&P0!==null&&typeof P0.then==="function"&&(Y1.asyncTransitions++,P0.then(o,o),P0.then(W,R5))}catch(a0){R5(a0)}finally{i===null&&F0._updatedFibers&&(E=F0._updatedFibers.size,F0._updatedFibers.clear(),10{(function(){function Z(){if(y=!1,d){var s=Eh.unstable_now();o=s;var z0=!0;try{Z:{R=!1,T&&(T=!1,c(Y0),Y0=-1),C=!0;var G0=D;try{Y:{U(s);for(L=X(A);L!==null&&!(L.expirationTime>s&&$());){var e=L.callback;if(typeof e==="function"){L.callback=null,D=L.priorityLevel;var O0=e(L.expirationTime<=s);if(s=Eh.unstable_now(),typeof O0==="function"){L.callback=O0,U(s),z0=!0;break Y}L===X(A)&&z(A),U(s)}else z(A);L=X(A)}if(L!==null)z0=!0;else{var f=X(V);f!==null&&M(W,f.startTime-s),z0=!1}}break Z}finally{L=null,D=G0,C=!1}z0=void 0}}finally{z0?U0():d=!1}}}function Q(s,z0){var G0=s.length;s.push(z0);Z:for(;0>>1,O0=s[e];if(0>>1;eB(M0,G0))W0B(u0,M0)?(s[e]=u0,s[W0]=G0,e=W0):(s[e]=M0,s[B0]=G0,e=B0);else if(W0B(u0,G0))s[e]=u0,s[W0]=G0,e=W0;else break Z}}return z0}function B(s,z0){var G0=s.sortIndex-z0.sortIndex;return G0!==0?G0:s.id-z0.id}function U(s){for(var z0=X(V);z0!==null;){if(z0.callback===null)z(V);else if(z0.startTime<=s)z(V),z0.sortIndex=z0.expirationTime,Q(A,z0);else break;z0=X(V)}}function W(s){if(T=!1,U(s),!R)if(X(A)!==null)R=!0,d||(d=!0,U0());else{var z0=X(V);z0!==null&&M(W,z0.startTime-s)}}function $(){return y?!0:Eh.unstable_now()-os||125e?(s.sortIndex=G0,Q(V,s),X(A)===null&&s===X(V)&&(T?(c(Y0),Y0=-1):T=!0,M(W,G0-e))):(s.sortIndex=O0,Q(A,s),R||C||(R=!0,d||(d=!0,U0()))),s},Eh.unstable_shouldYield=$,Eh.unstable_wrapCallback=function(s){var z0=D;return function(){var G0=D;D=z0;try{return s.apply(this,arguments)}finally{D=G0}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var $D=e8((yh)=>{var UO=g(t());(function(){function Z(){}function Q(N){return""+N}function X(N,O,A){var V=3` tag.%s',A),typeof N==="string"&&typeof O==="object"&&O!==null&&typeof O.as==="string"){A=O.as;var V=z(A,O.crossOrigin);$.d.L(N,A,{crossOrigin:V,integrity:typeof O.integrity==="string"?O.integrity:void 0,nonce:typeof O.nonce==="string"?O.nonce:void 0,type:typeof O.type==="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority==="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy==="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet==="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes==="string"?O.imageSizes:void 0,media:typeof O.media==="string"?O.media:void 0})}},yh.preloadModule=function(N,O){var A="";typeof N==="string"&&N||(A+=" The `href` argument encountered was "+B(N)+"."),O!==void 0&&typeof O!=="object"?A+=" The `options` argument encountered was "+B(O)+".":O&&("as"in O)&&typeof O.as!=="string"&&(A+=" The `as` option encountered was "+B(O.as)+"."),A&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',A),typeof N==="string"&&(O?(A=z(O.as,O.crossOrigin),$.d.m(N,{as:typeof O.as==="string"&&O.as!=="script"?O.as:void 0,crossOrigin:A,integrity:typeof O.integrity==="string"?O.integrity:void 0})):$.d.m(N))},yh.requestFormReset=function(N){$.d.r(N)},yh.unstable_batchedUpdates=function(N,O){return N(O)},yh.useFormState=function(N,O,A){return W().useFormState(N,O,A)},yh.useFormStatus=function(){return W().useHostTransitionStatus()},yh.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var X8=e8((S70,GD)=>{var Sh=g($D());GD.exports=Sh});var MD=e8((xh)=>{var a1=g(WD()),gJ=g(t()),KO=g(X8());(function(){function Z(Y,Q){for(Y=Y.memoizedState;Y!==null&&0=Q.length)return K;var G=Q[q],H=V2(Y)?Y.slice():D1({},Y);return H[G]=J(Y[G],Q,q+1,K),H}function X(Y,Q,q){if(Q.length!==q.length)console.warn("copyWithRename() expects paths of the same length");else{for(var K=0;Kj8?console.error("Unexpected pop."):(Q!==mw[j8]&&console.error("Unexpected Fiber popped."),Y.current=gw[j8],gw[j8]=null,mw[j8]=null,j8--)}function K0(Y,Q,q){j8++,gw[j8]=Y.current,mw[j8]=q,Y.current=Q}function w0(Y){return Y===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),Y}function s(Y,Q){K0(n3,Q,Y),K0(Pz,Y,Y),K0(t3,null,Y);var q=Q.nodeType;switch(q){case 9:case 11:q=q===9?"#document":"#fragment",Q=(Q=Q.documentElement)?(Q=Q.namespaceURI)?aL(Q):o8:o8;break;default:if(q=Q.tagName,Q=Q.namespaceURI)Q=aL(Q),Q=iL(Q,q);else switch(q){case"svg":Q=kJ;break;case"math":Q=GW;break;default:Q=o8}}q=q.toLowerCase(),q=h_(null,q),q={context:Q,ancestorInfo:q},U0(t3,Y),K0(t3,q,Y)}function z0(Y){U0(t3,Y),U0(Pz,Y),U0(n3,Y)}function G0(){return w0(t3.current)}function e(Y){Y.memoizedState!==null&&K0(wK,Y,Y);var Q=w0(t3.current),q=Y.type,K=iL(Q.context,q);q=h_(Q.ancestorInfo,q),K={context:K,ancestorInfo:q},Q!==K&&(K0(Pz,Y,Y),K0(t3,K,Y))}function O0(Y){Pz.current===Y&&(U0(t3,Y),U0(Pz,Y)),wK.current===Y&&(U0(wK,Y),Mq._currentValue=dZ)}function f(){}function B0(){if(Rz===0){LC=console.log,CC=console.info,vC=console.warn,TC=console.error,DC=console.group,bC=console.groupCollapsed,EC=console.groupEnd;var Y={configurable:!0,enumerable:!0,value:f,writable:!0};Object.defineProperties(console,{info:Y,log:Y,warn:Y,error:Y,group:Y,groupCollapsed:Y,groupEnd:Y})}Rz++}function M0(){if(Rz--,Rz===0){var Y={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:D1({},Y,{value:LC}),info:D1({},Y,{value:CC}),warn:D1({},Y,{value:vC}),error:D1({},Y,{value:TC}),group:D1({},Y,{value:DC}),groupCollapsed:D1({},Y,{value:bC}),groupEnd:D1({},Y,{value:EC})})}0>Rz&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function W0(Y){var Q=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,Y=Y.stack,Error.prepareStackTrace=Q,Y.startsWith(`Error: react-stack-top-frame -`)&&(Y=Y.slice(29)),Q=Y.indexOf(` -`),Q!==-1&&(Y=Y.slice(Q+1)),Q=Y.indexOf("react_stack_bottom_frame"),Q!==-1&&(Q=Y.lastIndexOf(` -`,Q)),Q!==-1)Y=Y.slice(0,Q);else return"";return Y}function u0(Y){if(hw===void 0)try{throw Error()}catch(q){var Q=q.stack.trim().match(/\n( *(at )?)/);hw=Q&&Q[1]||"",yC=-1` tag.%s',A),typeof N==="string"&&typeof O==="object"&&O!==null&&typeof O.as==="string"){A=O.as;var V=z(A,O.crossOrigin);$.d.L(N,A,{crossOrigin:V,integrity:typeof O.integrity==="string"?O.integrity:void 0,nonce:typeof O.nonce==="string"?O.nonce:void 0,type:typeof O.type==="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority==="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy==="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet==="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes==="string"?O.imageSizes:void 0,media:typeof O.media==="string"?O.media:void 0})}},yh.preloadModule=function(N,O){var A="";typeof N==="string"&&N||(A+=" The `href` argument encountered was "+B(N)+"."),O!==void 0&&typeof O!=="object"?A+=" The `options` argument encountered was "+B(O)+".":O&&("as"in O)&&typeof O.as!=="string"&&(A+=" The `as` option encountered was "+B(O.as)+"."),A&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',A),typeof N==="string"&&(O?(A=z(O.as,O.crossOrigin),$.d.m(N,{as:typeof O.as==="string"&&O.as!=="script"?O.as:void 0,crossOrigin:A,integrity:typeof O.integrity==="string"?O.integrity:void 0})):$.d.m(N))},yh.requestFormReset=function(N){$.d.r(N)},yh.unstable_batchedUpdates=function(N,O){return N(O)},yh.useFormState=function(N,O,A){return W().useFormState(N,O,A)},yh.useFormStatus=function(){return W().useHostTransitionStatus()},yh.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var X8=e8((S70,GD)=>{var Sh=g($D());GD.exports=Sh});var MD=e8((xh)=>{var a1=g(WD()),gQ=g(t()),KO=g(X8());(function(){function Z(Y,J){for(Y=Y.memoizedState;Y!==null&&0=J.length)return K;var G=J[q],H=V2(Y)?Y.slice():D1({},Y);return H[G]=Q(Y[G],J,q+1,K),H}function X(Y,J,q){if(J.length!==q.length)console.warn("copyWithRename() expects paths of the same length");else{for(var K=0;Kj8?console.error("Unexpected pop."):(J!==mw[j8]&&console.error("Unexpected Fiber popped."),Y.current=gw[j8],gw[j8]=null,mw[j8]=null,j8--)}function K0(Y,J,q){j8++,gw[j8]=Y.current,mw[j8]=q,Y.current=J}function w0(Y){return Y===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),Y}function s(Y,J){K0(n3,J,Y),K0(Pz,Y,Y),K0(t3,null,Y);var q=J.nodeType;switch(q){case 9:case 11:q=q===9?"#document":"#fragment",J=(J=J.documentElement)?(J=J.namespaceURI)?aL(J):o8:o8;break;default:if(q=J.tagName,J=J.namespaceURI)J=aL(J),J=iL(J,q);else switch(q){case"svg":J=kQ;break;case"math":J=GW;break;default:J=o8}}q=q.toLowerCase(),q=h_(null,q),q={context:J,ancestorInfo:q},U0(t3,Y),K0(t3,q,Y)}function z0(Y){U0(t3,Y),U0(Pz,Y),U0(n3,Y)}function G0(){return w0(t3.current)}function e(Y){Y.memoizedState!==null&&K0(wK,Y,Y);var J=w0(t3.current),q=Y.type,K=iL(J.context,q);q=h_(J.ancestorInfo,q),K={context:K,ancestorInfo:q},J!==K&&(K0(Pz,Y,Y),K0(t3,K,Y))}function O0(Y){Pz.current===Y&&(U0(t3,Y),U0(Pz,Y)),wK.current===Y&&(U0(wK,Y),Mq._currentValue=dZ)}function f(){}function B0(){if(Rz===0){LC=console.log,CC=console.info,vC=console.warn,TC=console.error,DC=console.group,bC=console.groupCollapsed,EC=console.groupEnd;var Y={configurable:!0,enumerable:!0,value:f,writable:!0};Object.defineProperties(console,{info:Y,log:Y,warn:Y,error:Y,group:Y,groupCollapsed:Y,groupEnd:Y})}Rz++}function M0(){if(Rz--,Rz===0){var Y={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:D1({},Y,{value:LC}),info:D1({},Y,{value:CC}),warn:D1({},Y,{value:vC}),error:D1({},Y,{value:TC}),group:D1({},Y,{value:DC}),groupCollapsed:D1({},Y,{value:bC}),groupEnd:D1({},Y,{value:EC})})}0>Rz&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function W0(Y){var J=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,Y=Y.stack,Error.prepareStackTrace=J,Y.startsWith(`Error: react-stack-top-frame +`)&&(Y=Y.slice(29)),J=Y.indexOf(` +`),J!==-1&&(Y=Y.slice(J+1)),J=Y.indexOf("react_stack_bottom_frame"),J!==-1&&(J=Y.lastIndexOf(` +`,J)),J!==-1)Y=Y.slice(0,J);else return"";return Y}function u0(Y){if(hw===void 0)try{throw Error()}catch(q){var J=q.stack.trim().match(/\n( *(at )?)/);hw=J&&J[1]||"",yC=-1)":-1F||b[H]!==l[F]){var r=` -`+b[H].replace(" at new "," at ");return Y.displayName&&r.includes("")&&(r=r.replace("",Y.displayName)),typeof Y==="function"&&cw.set(Y,r),r}while(1<=H&&0<=F);break}}}finally{dw=!1,Q0.H=K,M0(),Error.prepareStackTrace=q}return b=(b=Y?Y.displayName||Y.name:"")?u0(b):"",typeof Y==="function"&&cw.set(Y,b),b}function H0(Y,Q){switch(Y.tag){case 26:case 27:case 5:return u0(Y.type);case 16:return u0("Lazy");case 13:return Y.child!==Q&&Q!==null?u0("Suspense Fallback"):u0("Suspense");case 19:return u0("SuspenseList");case 0:case 15:return O1(Y.type,!1);case 11:return O1(Y.type.render,!1);case 1:return O1(Y.type,!0);case 31:return u0("Activity");default:return""}}function G1(Y){try{var Q="",q=null;do{Q+=H0(Y,q);var K=Y._debugInfo;if(K)for(var G=K.length-1;0<=G;G--){var H=K[G];if(typeof H.name==="string"){var F=Q;Z:{var{name:_,env:v,debugLocation:b}=H;if(b!=null){var l=W0(b),r=l.lastIndexOf(` +`+b[H].replace(" at new "," at ");return Y.displayName&&r.includes("")&&(r=r.replace("",Y.displayName)),typeof Y==="function"&&cw.set(Y,r),r}while(1<=H&&0<=F);break}}}finally{dw=!1,J0.H=K,M0(),Error.prepareStackTrace=q}return b=(b=Y?Y.displayName||Y.name:"")?u0(b):"",typeof Y==="function"&&cw.set(Y,b),b}function H0(Y,J){switch(Y.tag){case 26:case 27:case 5:return u0(Y.type);case 16:return u0("Lazy");case 13:return Y.child!==J&&J!==null?u0("Suspense Fallback"):u0("Suspense");case 19:return u0("SuspenseList");case 0:case 15:return O1(Y.type,!1);case 11:return O1(Y.type.render,!1);case 1:return O1(Y.type,!0);case 31:return u0("Activity");default:return""}}function G1(Y){try{var J="",q=null;do{J+=H0(Y,q);var K=Y._debugInfo;if(K)for(var G=K.length-1;0<=G;G--){var H=K[G];if(typeof H.name==="string"){var F=J;Z:{var{name:_,env:v,debugLocation:b}=H;if(b!=null){var l=W0(b),r=l.lastIndexOf(` `),m=r===-1?l:l.slice(r+1);if(m.indexOf(_)!==-1){var n=` -`+m;break Z}}n=u0(_+(v?" ["+v+"]":""))}Q=F+n}}q=Y,Y=Y.return}while(Y);return Q}catch(R0){return` +`+m;break Z}}n=u0(_+(v?" ["+v+"]":""))}J=F+n}}q=Y,Y=Y.return}while(Y);return J}catch(R0){return` Error generating stack: `+R0.message+` -`+R0.stack}}function C1(Y){return(Y=Y?Y.displayName||Y.name:"")?u0(Y):""}function s1(){if(B4===null)return null;var Y=B4._debugOwner;return Y!=null?Y0(Y):null}function h1(){if(B4===null)return"";var Y=B4;try{var Q="";switch(Y.tag===6&&(Y=Y.return),Y.tag){case 26:case 27:case 5:Q+=u0(Y.type);break;case 13:Q+=u0("Suspense");break;case 19:Q+=u0("SuspenseList");break;case 31:Q+=u0("Activity");break;case 30:case 0:case 15:case 1:Y._debugOwner||Q!==""||(Q+=C1(Y.type));break;case 11:Y._debugOwner||Q!==""||(Q+=C1(Y.type.render))}for(;Y;)if(typeof Y.tag==="number"){var q=Y;Y=q._debugOwner;var K=q._debugStack;if(Y&&K){var G=W0(K);G!==""&&(Q+=` -`+G)}}else if(Y.debugStack!=null){var H=Y.debugStack;(Y=Y.owner)&&H&&(Q+=` -`+W0(H))}else break;var F=Q}catch(_){F=` +`+R0.stack}}function C1(Y){return(Y=Y?Y.displayName||Y.name:"")?u0(Y):""}function s1(){if(B4===null)return null;var Y=B4._debugOwner;return Y!=null?Y0(Y):null}function h1(){if(B4===null)return"";var Y=B4;try{var J="";switch(Y.tag===6&&(Y=Y.return),Y.tag){case 26:case 27:case 5:J+=u0(Y.type);break;case 13:J+=u0("Suspense");break;case 19:J+=u0("SuspenseList");break;case 31:J+=u0("Activity");break;case 30:case 0:case 15:case 1:Y._debugOwner||J!==""||(J+=C1(Y.type));break;case 11:Y._debugOwner||J!==""||(J+=C1(Y.type.render))}for(;Y;)if(typeof Y.tag==="number"){var q=Y;Y=q._debugOwner;var K=q._debugStack;if(Y&&K){var G=W0(K);G!==""&&(J+=` +`+G)}}else if(Y.debugStack!=null){var H=Y.debugStack;(Y=Y.owner)&&H&&(J+=` +`+W0(H))}else break;var F=J}catch(_){F=` Error generating stack: `+_.message+` -`+_.stack}return F}function T0(Y,Q,q,K,G,H,F){var _=B4;r1(Y);try{return Y!==null&&Y._debugTask?Y._debugTask.run(Q.bind(null,q,K,G,H,F)):Q(q,K,G,H,F)}finally{r1(_)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function r1(Y){Q0.getCurrentStack=Y===null?null:h1,i6=!1,B4=Y}function i5(Y){return typeof Symbol==="function"&&Symbol.toStringTag&&Y[Symbol.toStringTag]||Y.constructor.name||"Object"}function s5(Y){try{return G5(Y),!1}catch(Q){return!0}}function G5(Y){return""+Y}function B1(Y,Q){if(s5(Y))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",Q,i5(Y)),G5(Y)}function T6(Y,Q){if(s5(Y))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",Q,i5(Y)),G5(Y)}function Y1(Y){if(s5(Y))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",i5(Y)),G5(Y)}function t7(Y){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var Q=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(Q.isDisabled)return!0;if(!Q.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{zJ=Q.inject(Y),G7=Q}catch(q){console.error("React instrumentation encountered an error: %o.",q)}return Q.checkDCE?!0:!1}function x1(Y){if(typeof rg==="function"&&ag(Y),G7&&typeof G7.setStrictMode==="function")try{G7.setStrictMode(zJ,Y)}catch(Q){s6||(s6=!0,console.error("React instrumentation encountered an error: %o",Q))}}function Y6(Y){return Y>>>=0,Y===0?32:31-(ig(Y)/sg|0)|0}function l2(Y){var Q=Y&42;if(Q!==0)return Q;switch(Y&-Y){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return Y&261888;case 262144:case 524288:case 1048576:case 2097152:return Y&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return Y&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),Y}}function R4(Y,Q,q){var K=Y.pendingLanes;if(K===0)return 0;var G=0,H=Y.suspendedLanes,F=Y.pingedLanes;Y=Y.warmLanes;var _=K&134217727;return _!==0?(K=_&~H,K!==0?G=l2(K):(F&=_,F!==0?G=l2(F):q||(q=_&~Y,q!==0&&(G=l2(q))))):(_=K&~H,_!==0?G=l2(_):F!==0?G=l2(F):q||(q=K&~Y,q!==0&&(G=l2(q)))),G===0?0:Q!==0&&Q!==G&&(Q&H)===0&&(H=G&-G,q=Q&-Q,H>=q||H===32&&(q&4194048)!==0)?Q:G}function b2(Y,Q){return(Y.pendingLanes&~(Y.suspendedLanes&~Y.pingedLanes)&Q)===0}function J6(Y,Q){switch(Y){case 1:case 2:case 4:case 8:case 64:return Q+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return Q+5000;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function Q6(){var Y=FK;return FK<<=1,(FK&62914560)===0&&(FK=4194304),Y}function r2(Y){for(var Q=[],q=0;31>q;q++)Q.push(Y);return Q}function R5(Y,Q){Y.pendingLanes|=Q,Q!==268435456&&(Y.suspendedLanes=0,Y.pingedLanes=0,Y.warmLanes=0)}function z2(Y,Q,q,K,G,H){var F=Y.pendingLanes;Y.pendingLanes=q,Y.suspendedLanes=0,Y.pingedLanes=0,Y.warmLanes=0,Y.expiredLanes&=q,Y.entangledLanes&=q,Y.errorRecoveryDisabledLanes&=q,Y.shellSuspendCounter=0;var{entanglements:_,expirationTimes:v,hiddenUpdates:b}=Y;for(q=F&~q;0"u")return null;try{return Y.activeElement||Y.body}catch(Q){return Y.body}}function y0(Y){return Y.replace(Zm,function(Q){return"\\"+Q.charCodeAt(0).toString(16)+" "})}function m0(Y,Q){Q.checked===void 0||Q.defaultChecked===void 0||kC||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",s1()||"A component",Q.type),kC=!0),Q.value===void 0||Q.defaultValue===void 0||jC||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",s1()||"A component",Q.type),jC=!0)}function c0(Y,Q,q,K,G,H,F,_){if(Y.name="",F!=null&&typeof F!=="function"&&typeof F!=="symbol"&&typeof F!=="boolean"?(B1(F,"type"),Y.type=F):Y.removeAttribute("type"),Q!=null)if(F==="number"){if(Q===0&&Y.value===""||Y.value!=Q)Y.value=""+a(Q)}else Y.value!==""+a(Q)&&(Y.value=""+a(Q));else F!=="submit"&&F!=="reset"||Y.removeAttribute("value");Q!=null?h0(Y,F,a(Q)):q!=null?h0(Y,F,a(q)):K!=null&&Y.removeAttribute("value"),G==null&&H!=null&&(Y.defaultChecked=!!H),G!=null&&(Y.checked=G&&typeof G!=="function"&&typeof G!=="symbol"),_!=null&&typeof _!=="function"&&typeof _!=="symbol"&&typeof _!=="boolean"?(B1(_,"name"),Y.name=""+a(_)):Y.removeAttribute("name")}function i0(Y,Q,q,K,G,H,F,_){if(H!=null&&typeof H!=="function"&&typeof H!=="symbol"&&typeof H!=="boolean"&&(B1(H,"type"),Y.type=H),Q!=null||q!=null){if(!(H!=="submit"&&H!=="reset"||Q!==void 0&&Q!==null)){V0(Y);return}q=q!=null?""+a(q):"",Q=Q!=null?""+a(Q):q,_||Q===Y.value||(Y.value=Q),Y.defaultValue=Q}K=K!=null?K:G,K=typeof K!=="function"&&typeof K!=="symbol"&&!!K,Y.checked=_?Y.checked:!!K,Y.defaultChecked=!!K,F!=null&&typeof F!=="function"&&typeof F!=="symbol"&&typeof F!=="boolean"&&(B1(F,"name"),Y.name=F),V0(Y)}function h0(Y,Q,q){Q==="number"&&E0(Y.ownerDocument)===Y||Y.defaultValue===""+q||(Y.defaultValue=""+q)}function d1(Y,Q){Q.value==null&&(typeof Q.children==="object"&&Q.children!==null?gJ.Children.forEach(Q.children,function(q){q==null||typeof q==="string"||typeof q==="number"||typeof q==="bigint"||gC||(gC=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to