diff --git a/src/engine/review.rs b/src/engine/review.rs index db0ae5f..185c3d3 100644 --- a/src/engine/review.rs +++ b/src/engine/review.rs @@ -478,6 +478,7 @@ fn apply_ignore_rules(mut issues: Vec, ignore_rules: &[String]) -> return issues; } + let before = issues.len(); issues.retain(|issue| { !ignore_rules.iter().any(|pattern| { let pattern_lower = pattern.to_lowercase(); @@ -486,6 +487,15 @@ fn apply_ignore_rules(mut issues: Vec, ignore_rules: &[String]) -> || issue.title.to_lowercase().contains(&pattern_lower) }) }); + let filtered = before - issues.len(); + if filtered > 0 { + debug!( + filtered, + remaining = issues.len(), + rules = ignore_rules.len(), + "filtered issues via ignore rules" + ); + } issues } @@ -695,4 +705,83 @@ mod tests { "unknown lines should be kept (better safe than sorry)" ); } + + #[test] + fn ignore_rules_filters_by_title_match() { + let issues = vec![ + ReviewIssue { + file: "cli.rs".to_string(), + line: Some(236), + severity: Severity::Critical, + issue_type: Some("rule".to_string()), + title: "Command injection via exec/system with dynamic input".to_string(), + body: "Static security scanner detected...".to_string(), + suggested_fix: None, + }, + ReviewIssue { + file: "main.rs".to_string(), + line: Some(10), + severity: Severity::Major, + issue_type: Some("security".to_string()), + title: "SQL injection via string concatenation".to_string(), + body: "...".to_string(), + suggested_fix: None, + }, + ]; + + let rules = vec!["Command injection via exec/system with dynamic input".to_string()]; + let result = apply_ignore_rules(issues, &rules); + assert_eq!(result.len(), 1); + assert_eq!(result[0].title, "SQL injection via string concatenation"); + } + + #[test] + fn ignore_rules_filters_by_issue_type_match() { + let issues = vec![ReviewIssue { + file: "test.py".to_string(), + line: Some(50), + severity: Severity::Minor, + issue_type: Some("style".to_string()), + title: "Some style issue".to_string(), + body: "...".to_string(), + suggested_fix: None, + }]; + + let rules = vec!["style".to_string()]; + let result = apply_ignore_rules(issues, &rules); + assert!(result.is_empty()); + } + + #[test] + fn ignore_rules_empty_keeps_all() { + let issues = vec![ReviewIssue { + file: "f.rs".to_string(), + line: Some(1), + severity: Severity::Critical, + issue_type: Some("rule".to_string()), + title: "Any finding".to_string(), + body: "...".to_string(), + suggested_fix: None, + }]; + + let result = apply_ignore_rules(issues, &[]); + assert_eq!(result.len(), 1); + } + + #[test] + fn ignore_rules_case_insensitive() { + let issues = vec![ReviewIssue { + file: "f.rs".to_string(), + line: Some(1), + severity: Severity::Critical, + issue_type: Some("rule".to_string()), + title: "HARDCODED password or SECRET in variable".to_string(), + body: "...".to_string(), + suggested_fix: None, + }]; + + let rules = vec!["Hardcoded Password Or Secret".to_string()]; + let result = apply_ignore_rules(issues, &rules); + assert!(result.is_empty()); + } } diff --git a/src/engine/security_scanner.rs b/src/engine/security_scanner.rs index 3bf5fa9..903671b 100644 --- a/src/engine/security_scanner.rs +++ b/src/engine/security_scanner.rs @@ -63,7 +63,10 @@ pub static PATTERNS: &[SecurityPattern] = &[ SecurityPattern { id: "injection/exec", name: "Command injection via exec/system with dynamic input", - regex: r"(?i)(?:exec|system|popen|subprocess\.(?:call|run))\s*\(", + // Only flag when there's a dynamic input signal on the same line + // (f-string, format(), string concat with +, shell=True, or raw user input). + // subprocess.run(["cmd", "arg"]) with literal list is safe and should not trigger. + regex: r#"(?i)(?:exec|system|popen|subprocess\.(?:call|run))\s*\((?:[^)]*(?:f"|f'|format\(|\.format\(|shell\s*=\s*True|\+\s*(?:req|request|input|params|data|user|query)|%s|%\(.*\)))"#, severity: Severity::Critical, }, // ── Auth issues ── @@ -302,6 +305,62 @@ mod tests { assert_eq!(findings.len(), 2); } + #[test] + fn subprocess_run_with_literal_list_no_false_positive() { + // subprocess.run(cmd) where cmd is a variable (controlled list) should NOT trigger. + let chunks = vec![make_chunk( + "src/provider.py", + &["cmd = [self._bin, 'recall', query]", "subprocess.run(cmd)"], + )]; + let findings = scan_security(&chunks, 10); + let exec_findings: Vec<_> = findings + .iter() + .filter(|f| f.rule_id == "injection/exec") + .collect(); + assert!( + exec_findings.is_empty(), + "subprocess.run(cmd) with controlled list should not trigger" + ); + } + + #[test] + fn subprocess_run_with_fstring_triggers() { + // subprocess.run(f"...") with f-string (dynamic interpolation) SHOULD trigger. + let chunks = vec![make_chunk( + "src/handler.py", + &["subprocess.run(f'cat {user_input}')"], + )]; + let findings = scan_security(&chunks, 10); + let exec_findings: Vec<_> = findings + .iter() + .filter(|f| f.rule_id == "injection/exec") + .collect(); + assert_eq!( + exec_findings.len(), + 1, + "subprocess.run with f-string should trigger" + ); + } + + #[test] + fn subprocess_run_with_shell_true_triggers() { + // subprocess.run(..., shell=True) SHOULD trigger. + let chunks = vec![make_chunk( + "src/handler.py", + &["subprocess.run(cmd, shell=True)"], + )]; + let findings = scan_security(&chunks, 10); + let exec_findings: Vec<_> = findings + .iter() + .filter(|f| f.rule_id == "injection/exec") + .collect(); + assert_eq!( + exec_findings.len(), + 1, + "subprocess.run with shell=True should trigger" + ); + } + #[test] fn sorts_by_severity() { let chunks = vec![make_chunk( diff --git a/website/.svelte-kit/ambient.d.ts b/website/.svelte-kit/ambient.d.ts new file mode 100644 index 0000000..2052878 --- /dev/null +++ b/website/.svelte-kit/ambient.d.ts @@ -0,0 +1,562 @@ + +// this file is generated — do not edit it + + +/// + +/** + * This module provides access to environment variables that are injected _statically_ into your bundle at build time and are limited to _private_ access. + * + * | | Runtime | Build time | + * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ | + * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) | + * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) | + * + * Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination. + * + * **_Private_ access:** + * + * - This module cannot be imported into client-side code + * - This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured) + * + * For example, given the following build time environment: + * + * ```env + * ENVIRONMENT=production + * PUBLIC_BASE_URL=http://site.com + * ``` + * + * With the default `publicPrefix` and `privatePrefix`: + * + * ```ts + * import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/private'; + * + * console.log(ENVIRONMENT); // => "production" + * console.log(PUBLIC_BASE_URL); // => throws error during build + * ``` + * + * The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values. + */ +declare module '$env/static/private' { + export const HERMES_GID: string; + export const HERMES_MODEL: string; + export const OPENAI_FALLBACK_API_KEY: string; + export const timezone: string; + export const PYTHONIOENCODING: string; + export const HERMES_RESTART_DRAIN_TIMEOUT: string; + export const _HERMES_GATEWAY: string; + export const HERMES_SESSION_KEY: string; + export const TG_AJIANAZBRIEF_CHAT_ID: string; + export const PLANE_AZFIRAZKA_WORKSPACE: string; + export const TG_BOT_TOKEN: string; + export const npm_config_user_agent: string; + export const TERMINAL_CONTAINER_CPU: string; + export const CARGO_TARGET_DIR: string; + export const AGENT_BROWSER_EXECUTABLE_PATH: string; + export const MATRIX_ALLOWED_ROOMS: string; + export const DISCORD_HISTORY_BACKFILL: string; + export const HERMES_SESSION_USER_NAME: string; + export const TERMINAL_DOCKER_ENV: string; + export const TERMINAL_CWD: string; + export const DISCORD_REACTIONS: string; + export const STALWART_APIKEY: string; + export const npm_node_execpath: string; + export const GHOST_WEBHOOK_SECRET: string; + export const SHLVL: string; + export const npm_config_noproxy: string; + export const HOME: string; + export const GOWA_CHANNEL_ADK_INFO: string; + export const GLM_PROXY_ADMIN_API_KEY: string; + export const OLDPWD: string; + export const TERMINAL_DOCKER_FORWARD_ENV: string; + export const X_CODECORA_USER: string; + export const THREADS_ANALYZE_PARENT_ID: string; + export const PEXELS_API_KEY: string; + export const HTTP_API_KEY: string; + export const HERMES_HOME: string; + export const npm_package_json: string; + export const MINIO_BUCKET: string; + export const TG_AJIANAZBRIEF_USERNAME: string; + export const GHOST_ADMIN_KEY: string; + export const TERMINAL_DOCKER_IMAGE: string; + export const HERMES_EXEC_ASK: string; + export const ASSEMBLYAI_API_KEY: string; + export const SLACK_FREE_RESPONSE_CHANNELS: string; + export const JINA_API_KEY: string; + export const TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE: string; + export const TERMINAL_CONTAINER_MEMORY: string; + export const LC_CTYPE: string; + export const SSL_CERT_FILE: string; + export const TERMINAL_CONTAINER_PERSISTENT: string; + export const npm_config_userconfig: string; + export const npm_config_local_prefix: string; + export const HERMES_SESSION_USER_ID: string; + export const OPENSSL_INCLUDE_DIR: string; + export const HERMES_SESSION_CHAT_NAME: string; + export const TERMINAL_MODAL_IMAGE: string; + export const CORA_PROVIDER: string; + export const ZAI_CUSTOMER_ID: string; + export const file_read_max_chars: string; + export const MINIO_ACCESS_KEY: string; + export const COLOR: string; + export const DISCORD_HISTORY_BACKFILL_LIMIT: string; + export const CLOUDFLARE_ACCOUNT_ID: string; + export const TERMINAL_DOCKER_VOLUMES: string; + export const npm_config_metrics_registry: string; + export const THREADS_KARIRDEV_USER_ID: string; + export const MINIO_REGION: string; + export const TERMINAL_ENV: string; + export const HERMES_UID: string; + export const AUXILIARY_VISION_PROVIDER: string; + export const CORA_BASE_URL: string; + export const TERMINAL_VERCEL_RUNTIME: string; + export const MODAL_API_KEY: string; + export const MINIO_ENDPOINT: string; + export const SESSION_IDLE_MINUTES: string; + export const TELEGRAM_ALLOWED_CHATS: string; + export const PYTHONDONTWRITEBYTECODE: string; + export const HERMES_SESSION_THREAD_ID: string; + export const GLM_PROXY_BASE_URL: string; + export const LYNK_MERCHANT_KEY: string; + export const LLM_BASE_URL: string; + export const ADK_COMPANY_LOGO: string; + export const AUXILIARY_VISION_BASE_URL: string; + export const QDRANT_API_KEY: string; + export const _: string; + export const npm_config_prefix: string; + export const PKG_CONFIG_PATH: string; + export const group_sessions_per_user: string; + export const LITELLM_MASTER_KEY: string; + export const CORA_API_KEY: string; + export const HERMES_PROVIDER: string; + export const GHOST_ADMIN_URL: string; + export const TERMINAL_DAYTONA_IMAGE: string; + export const GLM_PROXY_API_KEY: string; + export const npm_config_cache: string; + export const AUXILIARY_VISION_API_KEY: string; + export const HERMES_SESSION_CHAT_ID: string; + export const DISCORD_THREAD_REQUIRE_MENTION: string; + export const ZAI_JWT: string; + export const RUSTUP_HOME: string; + export const THREADS_CODECORA_PASS: string; + export const TERMINAL_LIFETIME_SECONDS: string; + export const DISCORD_ALLOWED_CHANNELS: string; + export const TERMINAL_TIMEOUT: string; + export const HERMES_GATEWAY_BUSY_INPUT_MODE: string; + export const npm_config_node_gyp: string; + export const PATH: string; + export const MEMPALACE_PALACE_PATH: string; + export const TELEGRAM_REACTIONS: string; + export const MAYAR_WEBHOOK_TOKEN: string; + export const HERMES_AGENT_TIMEOUT: string; + export const NODE: string; + export const npm_package_name: string; + export const THREADS_KARIRDEV_ACCESS_TOKEN: string; + export const OPENSSL_LIB_DIR: string; + export const DISCORD_ACTIVITY: string; + export const HERMES_WEB_DIST: string; + export const HERMES_RPC_SOCKET: string; + export const TERMINAL_PERSISTENT_SHELL: string; + export const THREADS_ANALYZE_COLLECTION_ID: string; + export const PLANE_BASE_URL: string; + export const HERMES_QUIET: string; + export const PLANE_AKALA_WORKSPACE: string; + export const VIRTUAL_ENV_PROMPT: string; + export const MQTT_URL: string; + export const THREADS_GUYONLELUCON_PASS: string; + export const QDRANT_URL: string; + export const HERMES_MAX_ITERATIONS: string; + export const npm_lifecycle_script: string; + export const HERMES_SESSION_ID: string; + export const GOWA_BASIC_AUTH: string; + export const HERMES_AGENT_TIMEOUT_WARNING: string; + export const prefill_messages_file: string; + export const HERMES_AGENT_NOTIFY_INTERVAL: string; + export const OPENAI_MODEL: string; + export const PLANE_API_KEY: string; + export const THREADS_CODECORA_USER: string; + export const CLOUDFLARE_TOKEN: string; + export const npm_package_version: string; + export const npm_lifecycle_event: string; + export const SLACK_ALLOWED_CHANNELS: string; + export const OUTLINE_BASE_URL: string; + export const MAYAR_API_KEY: string; + export const HERMES_DAEMON: string; + export const AGENTBOARD_API_KEY: string; + export const PIXABAY_API_KEY: string; + export const PYTHONUTF8: string; + export const THREADS_CODECORA_USER_ID: string; + export const GOWA_CHANNEL_AZFEED: string; + export const PLANE_AKALA_PROJECT_ID: string; + export const NINE_ROUTER_BASE_URL: string; + export const HERMES_SESSION_PLATFORM: string; + export const TERMINAL_CONTAINER_DISK: string; + export const OUTLINE_API_KEY: string; + export const MINIO_SECRET_KEY: string; + export const THREADS_GUYONLELUCON_USER: string; + export const VIRTUAL_ENV: string; + export const TERMINAL_DOCKER_RUN_AS_HOST_USER: string; + export const npm_config_globalconfig: string; + export const npm_config_init_module: string; + export const NINE_ROUTER_API_KEY: string; + export const PWD: string; + export const _config_version: string; + export const HERMES_AUTO_CONTINUE_FRESHNESS: string; + export const npm_config_globalignorefile: string; + export const npm_execpath: string; + export const TG_CRYPTOTECHTALKID_CHAT_ID: string; + export const CARGO_HOME: string; + export const npm_config_global_prefix: string; + export const HERMES_CRON_SESSION: string; + export const GOWA_WEBHOOK_SECRET: string; + export const PYTHONPATH: string; + export const hooks_auto_accept: string; + export const npm_command: string; + export const BROWSER_INACTIVITY_TIMEOUT: string; + export const ALLOW_SCRIPT_EDIT: string; + export const HERMES_REDACT_SECRETS: string; + export const OPENAI_FALLBACK_BASE_URL: string; + export const THREADS_CODECORA_ACCESS_TOKEN: string; + export const AUXILIARY_VISION_MODEL: string; + export const MEMPALACE_CONFIG_DIR: string; + export const TERMINAL_SINGULARITY_IMAGE: string; + export const X_CODECORA_PASS: string; + export const MATTERMOST_ALLOWED_CHANNELS: string; + export const SLACK_REQUIRE_MENTION: string; + export const AGENTBOARD_URL: string; + export const INIT_CWD: string; + export const EDITOR: string; + export const NODE_ENV: string; +} + +/** + * This module provides access to environment variables that are injected _statically_ into your bundle at build time and are _publicly_ accessible. + * + * | | Runtime | Build time | + * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ | + * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) | + * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) | + * + * Static environment variables are [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env` at build time and then statically injected into your bundle at build time, enabling optimisations like dead code elimination. + * + * **_Public_ access:** + * + * - This module _can_ be imported into client-side code + * - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included + * + * For example, given the following build time environment: + * + * ```env + * ENVIRONMENT=production + * PUBLIC_BASE_URL=http://site.com + * ``` + * + * With the default `publicPrefix` and `privatePrefix`: + * + * ```ts + * import { ENVIRONMENT, PUBLIC_BASE_URL } from '$env/static/public'; + * + * console.log(ENVIRONMENT); // => throws error during build + * console.log(PUBLIC_BASE_URL); // => "http://site.com" + * ``` + * + * The above values will be the same _even if_ different values for `ENVIRONMENT` or `PUBLIC_BASE_URL` are set at runtime, as they are statically replaced in your code with their build time values. + */ +declare module '$env/static/public' { + +} + +/** + * This module provides access to environment variables set _dynamically_ at runtime and that are limited to _private_ access. + * + * | | Runtime | Build time | + * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ | + * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) | + * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) | + * + * Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`. + * + * **_Private_ access:** + * + * - This module cannot be imported into client-side code + * - This module includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured) + * + * > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter. + * + * > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed: + * > + * > ```env + * > MY_FEATURE_FLAG= + * > ``` + * > + * > You can override `.env` values from the command line like so: + * > + * > ```sh + * > MY_FEATURE_FLAG="enabled" npm run dev + * > ``` + * + * For example, given the following runtime environment: + * + * ```env + * ENVIRONMENT=production + * PUBLIC_BASE_URL=http://site.com + * ``` + * + * With the default `publicPrefix` and `privatePrefix`: + * + * ```ts + * import { env } from '$env/dynamic/private'; + * + * console.log(env.ENVIRONMENT); // => "production" + * console.log(env.PUBLIC_BASE_URL); // => undefined + * ``` + */ +declare module '$env/dynamic/private' { + export const env: { + HERMES_GID: string; + HERMES_MODEL: string; + OPENAI_FALLBACK_API_KEY: string; + timezone: string; + PYTHONIOENCODING: string; + HERMES_RESTART_DRAIN_TIMEOUT: string; + _HERMES_GATEWAY: string; + HERMES_SESSION_KEY: string; + TG_AJIANAZBRIEF_CHAT_ID: string; + PLANE_AZFIRAZKA_WORKSPACE: string; + TG_BOT_TOKEN: string; + npm_config_user_agent: string; + TERMINAL_CONTAINER_CPU: string; + CARGO_TARGET_DIR: string; + AGENT_BROWSER_EXECUTABLE_PATH: string; + MATRIX_ALLOWED_ROOMS: string; + DISCORD_HISTORY_BACKFILL: string; + HERMES_SESSION_USER_NAME: string; + TERMINAL_DOCKER_ENV: string; + TERMINAL_CWD: string; + DISCORD_REACTIONS: string; + STALWART_APIKEY: string; + npm_node_execpath: string; + GHOST_WEBHOOK_SECRET: string; + SHLVL: string; + npm_config_noproxy: string; + HOME: string; + GOWA_CHANNEL_ADK_INFO: string; + GLM_PROXY_ADMIN_API_KEY: string; + OLDPWD: string; + TERMINAL_DOCKER_FORWARD_ENV: string; + X_CODECORA_USER: string; + THREADS_ANALYZE_PARENT_ID: string; + PEXELS_API_KEY: string; + HTTP_API_KEY: string; + HERMES_HOME: string; + npm_package_json: string; + MINIO_BUCKET: string; + TG_AJIANAZBRIEF_USERNAME: string; + GHOST_ADMIN_KEY: string; + TERMINAL_DOCKER_IMAGE: string; + HERMES_EXEC_ASK: string; + ASSEMBLYAI_API_KEY: string; + SLACK_FREE_RESPONSE_CHANNELS: string; + JINA_API_KEY: string; + TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE: string; + TERMINAL_CONTAINER_MEMORY: string; + LC_CTYPE: string; + SSL_CERT_FILE: string; + TERMINAL_CONTAINER_PERSISTENT: string; + npm_config_userconfig: string; + npm_config_local_prefix: string; + HERMES_SESSION_USER_ID: string; + OPENSSL_INCLUDE_DIR: string; + HERMES_SESSION_CHAT_NAME: string; + TERMINAL_MODAL_IMAGE: string; + CORA_PROVIDER: string; + ZAI_CUSTOMER_ID: string; + file_read_max_chars: string; + MINIO_ACCESS_KEY: string; + COLOR: string; + DISCORD_HISTORY_BACKFILL_LIMIT: string; + CLOUDFLARE_ACCOUNT_ID: string; + TERMINAL_DOCKER_VOLUMES: string; + npm_config_metrics_registry: string; + THREADS_KARIRDEV_USER_ID: string; + MINIO_REGION: string; + TERMINAL_ENV: string; + HERMES_UID: string; + AUXILIARY_VISION_PROVIDER: string; + CORA_BASE_URL: string; + TERMINAL_VERCEL_RUNTIME: string; + MODAL_API_KEY: string; + MINIO_ENDPOINT: string; + SESSION_IDLE_MINUTES: string; + TELEGRAM_ALLOWED_CHATS: string; + PYTHONDONTWRITEBYTECODE: string; + HERMES_SESSION_THREAD_ID: string; + GLM_PROXY_BASE_URL: string; + LYNK_MERCHANT_KEY: string; + LLM_BASE_URL: string; + ADK_COMPANY_LOGO: string; + AUXILIARY_VISION_BASE_URL: string; + QDRANT_API_KEY: string; + _: string; + npm_config_prefix: string; + PKG_CONFIG_PATH: string; + group_sessions_per_user: string; + LITELLM_MASTER_KEY: string; + CORA_API_KEY: string; + HERMES_PROVIDER: string; + GHOST_ADMIN_URL: string; + TERMINAL_DAYTONA_IMAGE: string; + GLM_PROXY_API_KEY: string; + npm_config_cache: string; + AUXILIARY_VISION_API_KEY: string; + HERMES_SESSION_CHAT_ID: string; + DISCORD_THREAD_REQUIRE_MENTION: string; + ZAI_JWT: string; + RUSTUP_HOME: string; + THREADS_CODECORA_PASS: string; + TERMINAL_LIFETIME_SECONDS: string; + DISCORD_ALLOWED_CHANNELS: string; + TERMINAL_TIMEOUT: string; + HERMES_GATEWAY_BUSY_INPUT_MODE: string; + npm_config_node_gyp: string; + PATH: string; + MEMPALACE_PALACE_PATH: string; + TELEGRAM_REACTIONS: string; + MAYAR_WEBHOOK_TOKEN: string; + HERMES_AGENT_TIMEOUT: string; + NODE: string; + npm_package_name: string; + THREADS_KARIRDEV_ACCESS_TOKEN: string; + OPENSSL_LIB_DIR: string; + DISCORD_ACTIVITY: string; + HERMES_WEB_DIST: string; + HERMES_RPC_SOCKET: string; + TERMINAL_PERSISTENT_SHELL: string; + THREADS_ANALYZE_COLLECTION_ID: string; + PLANE_BASE_URL: string; + HERMES_QUIET: string; + PLANE_AKALA_WORKSPACE: string; + VIRTUAL_ENV_PROMPT: string; + MQTT_URL: string; + THREADS_GUYONLELUCON_PASS: string; + QDRANT_URL: string; + HERMES_MAX_ITERATIONS: string; + npm_lifecycle_script: string; + HERMES_SESSION_ID: string; + GOWA_BASIC_AUTH: string; + HERMES_AGENT_TIMEOUT_WARNING: string; + prefill_messages_file: string; + HERMES_AGENT_NOTIFY_INTERVAL: string; + OPENAI_MODEL: string; + PLANE_API_KEY: string; + THREADS_CODECORA_USER: string; + CLOUDFLARE_TOKEN: string; + npm_package_version: string; + npm_lifecycle_event: string; + SLACK_ALLOWED_CHANNELS: string; + OUTLINE_BASE_URL: string; + MAYAR_API_KEY: string; + HERMES_DAEMON: string; + AGENTBOARD_API_KEY: string; + PIXABAY_API_KEY: string; + PYTHONUTF8: string; + THREADS_CODECORA_USER_ID: string; + GOWA_CHANNEL_AZFEED: string; + PLANE_AKALA_PROJECT_ID: string; + NINE_ROUTER_BASE_URL: string; + HERMES_SESSION_PLATFORM: string; + TERMINAL_CONTAINER_DISK: string; + OUTLINE_API_KEY: string; + MINIO_SECRET_KEY: string; + THREADS_GUYONLELUCON_USER: string; + VIRTUAL_ENV: string; + TERMINAL_DOCKER_RUN_AS_HOST_USER: string; + npm_config_globalconfig: string; + npm_config_init_module: string; + NINE_ROUTER_API_KEY: string; + PWD: string; + _config_version: string; + HERMES_AUTO_CONTINUE_FRESHNESS: string; + npm_config_globalignorefile: string; + npm_execpath: string; + TG_CRYPTOTECHTALKID_CHAT_ID: string; + CARGO_HOME: string; + npm_config_global_prefix: string; + HERMES_CRON_SESSION: string; + GOWA_WEBHOOK_SECRET: string; + PYTHONPATH: string; + hooks_auto_accept: string; + npm_command: string; + BROWSER_INACTIVITY_TIMEOUT: string; + ALLOW_SCRIPT_EDIT: string; + HERMES_REDACT_SECRETS: string; + OPENAI_FALLBACK_BASE_URL: string; + THREADS_CODECORA_ACCESS_TOKEN: string; + AUXILIARY_VISION_MODEL: string; + MEMPALACE_CONFIG_DIR: string; + TERMINAL_SINGULARITY_IMAGE: string; + X_CODECORA_PASS: string; + MATTERMOST_ALLOWED_CHANNELS: string; + SLACK_REQUIRE_MENTION: string; + AGENTBOARD_URL: string; + INIT_CWD: string; + EDITOR: string; + NODE_ENV: string; + [key: `PUBLIC_${string}`]: undefined; + [key: `${string}`]: string | undefined; + } +} + +/** + * This module provides access to environment variables set _dynamically_ at runtime and that are _publicly_ accessible. + * + * | | Runtime | Build time | + * | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ | + * | Private | [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private) | [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) | + * | Public | [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public) | [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) | + * + * Dynamic environment variables are defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`. + * + * **_Public_ access:** + * + * - This module _can_ be imported into client-side code + * - **Only** variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`) are included + * + * > [!NOTE] In `dev`, `$env/dynamic` includes environment variables from `.env`. In `prod`, this behavior will depend on your adapter. + * + * > [!NOTE] To get correct types, environment variables referenced in your code should be declared (for example in an `.env` file), even if they don't have a value until the app is deployed: + * > + * > ```env + * > MY_FEATURE_FLAG= + * > ``` + * > + * > You can override `.env` values from the command line like so: + * > + * > ```sh + * > MY_FEATURE_FLAG="enabled" npm run dev + * > ``` + * + * For example, given the following runtime environment: + * + * ```env + * ENVIRONMENT=production + * PUBLIC_BASE_URL=http://example.com + * ``` + * + * With the default `publicPrefix` and `privatePrefix`: + * + * ```ts + * import { env } from '$env/dynamic/public'; + * console.log(env.ENVIRONMENT); // => undefined, not public + * console.log(env.PUBLIC_BASE_URL); // => "http://example.com" + * ``` + * + * ``` + * + * ``` + */ +declare module '$env/dynamic/public' { + export const env: { + [key: `PUBLIC_${string}`]: string | undefined; + } +} diff --git a/website/.svelte-kit/generated/client-optimized/app.js b/website/.svelte-kit/generated/client-optimized/app.js new file mode 100644 index 0000000..047104f --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/app.js @@ -0,0 +1,50 @@ +export { matchers } from './matchers.js'; + +export const nodes = [ + () => import('./nodes/0'), + () => import('./nodes/1'), + () => import('./nodes/2'), + () => import('./nodes/3'), + () => import('./nodes/4'), + () => import('./nodes/5'), + () => import('./nodes/6'), + () => import('./nodes/7'), + () => import('./nodes/8'), + () => import('./nodes/9'), + () => import('./nodes/10'), + () => import('./nodes/11'), + () => import('./nodes/12'), + () => import('./nodes/13') +]; + +export const server_loads = []; + +export const dictionary = { + "/": [3], + "/docs": [4,[2]], + "/docs/changelog": [5,[2]], + "/docs/cli-reference": [6,[2]], + "/docs/configuration": [7,[2]], + "/docs/examples": [8,[2]], + "/docs/getting-started": [9,[2]], + "/docs/installation": [10,[2]], + "/docs/providers": [11,[2]], + "/docs/roadmap": [12,[2]], + "/docs/usage": [13,[2]] + }; + +export const hooks = { + handleError: (({ error }) => { console.error(error) }), + + reroute: (() => {}), + transport: {} +}; + +export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode])); +export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode])); + +export const hash = false; + +export const decode = (type, value) => decoders[type](value); + +export { default as root } from '../root.js'; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/matchers.js b/website/.svelte-kit/generated/client-optimized/matchers.js new file mode 100644 index 0000000..f6bd30a --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/matchers.js @@ -0,0 +1 @@ +export const matchers = {}; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/0.js b/website/.svelte-kit/generated/client-optimized/nodes/0.js new file mode 100644 index 0000000..b2e56b2 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/0.js @@ -0,0 +1,3 @@ +import * as universal from "../../../../src/routes/+layout.ts"; +export { universal }; +export { default as component } from "../../../../src/routes/+layout.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/1.js b/website/.svelte-kit/generated/client-optimized/nodes/1.js new file mode 100644 index 0000000..bf58bad --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/1.js @@ -0,0 +1 @@ +export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/10.js b/website/.svelte-kit/generated/client-optimized/nodes/10.js new file mode 100644 index 0000000..62db904 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/10.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/installation/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/11.js b/website/.svelte-kit/generated/client-optimized/nodes/11.js new file mode 100644 index 0000000..e7b44fd --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/11.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/providers/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/12.js b/website/.svelte-kit/generated/client-optimized/nodes/12.js new file mode 100644 index 0000000..b374aa5 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/12.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/roadmap/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/13.js b/website/.svelte-kit/generated/client-optimized/nodes/13.js new file mode 100644 index 0000000..92421e3 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/13.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/usage/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/2.js b/website/.svelte-kit/generated/client-optimized/nodes/2.js new file mode 100644 index 0000000..86f896e --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/2.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/+layout.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/3.js b/website/.svelte-kit/generated/client-optimized/nodes/3.js new file mode 100644 index 0000000..1cb4f85 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/3.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/4.js b/website/.svelte-kit/generated/client-optimized/nodes/4.js new file mode 100644 index 0000000..eb26907 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/4.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/5.js b/website/.svelte-kit/generated/client-optimized/nodes/5.js new file mode 100644 index 0000000..998e377 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/5.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/changelog/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/6.js b/website/.svelte-kit/generated/client-optimized/nodes/6.js new file mode 100644 index 0000000..a258c98 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/6.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/cli-reference/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/7.js b/website/.svelte-kit/generated/client-optimized/nodes/7.js new file mode 100644 index 0000000..fbd0e8e --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/7.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/configuration/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/8.js b/website/.svelte-kit/generated/client-optimized/nodes/8.js new file mode 100644 index 0000000..88cec62 --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/8.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/examples/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client-optimized/nodes/9.js b/website/.svelte-kit/generated/client-optimized/nodes/9.js new file mode 100644 index 0000000..3b0c4ae --- /dev/null +++ b/website/.svelte-kit/generated/client-optimized/nodes/9.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/getting-started/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/app.js b/website/.svelte-kit/generated/client/app.js new file mode 100644 index 0000000..047104f --- /dev/null +++ b/website/.svelte-kit/generated/client/app.js @@ -0,0 +1,50 @@ +export { matchers } from './matchers.js'; + +export const nodes = [ + () => import('./nodes/0'), + () => import('./nodes/1'), + () => import('./nodes/2'), + () => import('./nodes/3'), + () => import('./nodes/4'), + () => import('./nodes/5'), + () => import('./nodes/6'), + () => import('./nodes/7'), + () => import('./nodes/8'), + () => import('./nodes/9'), + () => import('./nodes/10'), + () => import('./nodes/11'), + () => import('./nodes/12'), + () => import('./nodes/13') +]; + +export const server_loads = []; + +export const dictionary = { + "/": [3], + "/docs": [4,[2]], + "/docs/changelog": [5,[2]], + "/docs/cli-reference": [6,[2]], + "/docs/configuration": [7,[2]], + "/docs/examples": [8,[2]], + "/docs/getting-started": [9,[2]], + "/docs/installation": [10,[2]], + "/docs/providers": [11,[2]], + "/docs/roadmap": [12,[2]], + "/docs/usage": [13,[2]] + }; + +export const hooks = { + handleError: (({ error }) => { console.error(error) }), + + reroute: (() => {}), + transport: {} +}; + +export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode])); +export const encoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.encode])); + +export const hash = false; + +export const decode = (type, value) => decoders[type](value); + +export { default as root } from '../root.js'; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/matchers.js b/website/.svelte-kit/generated/client/matchers.js new file mode 100644 index 0000000..f6bd30a --- /dev/null +++ b/website/.svelte-kit/generated/client/matchers.js @@ -0,0 +1 @@ +export const matchers = {}; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/0.js b/website/.svelte-kit/generated/client/nodes/0.js new file mode 100644 index 0000000..b2e56b2 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/0.js @@ -0,0 +1,3 @@ +import * as universal from "../../../../src/routes/+layout.ts"; +export { universal }; +export { default as component } from "../../../../src/routes/+layout.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/1.js b/website/.svelte-kit/generated/client/nodes/1.js new file mode 100644 index 0000000..bf58bad --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/1.js @@ -0,0 +1 @@ +export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/10.js b/website/.svelte-kit/generated/client/nodes/10.js new file mode 100644 index 0000000..62db904 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/10.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/installation/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/11.js b/website/.svelte-kit/generated/client/nodes/11.js new file mode 100644 index 0000000..e7b44fd --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/11.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/providers/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/12.js b/website/.svelte-kit/generated/client/nodes/12.js new file mode 100644 index 0000000..b374aa5 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/12.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/roadmap/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/13.js b/website/.svelte-kit/generated/client/nodes/13.js new file mode 100644 index 0000000..92421e3 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/13.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/usage/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/2.js b/website/.svelte-kit/generated/client/nodes/2.js new file mode 100644 index 0000000..86f896e --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/2.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/+layout.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/3.js b/website/.svelte-kit/generated/client/nodes/3.js new file mode 100644 index 0000000..1cb4f85 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/3.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/4.js b/website/.svelte-kit/generated/client/nodes/4.js new file mode 100644 index 0000000..eb26907 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/4.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/5.js b/website/.svelte-kit/generated/client/nodes/5.js new file mode 100644 index 0000000..998e377 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/5.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/changelog/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/6.js b/website/.svelte-kit/generated/client/nodes/6.js new file mode 100644 index 0000000..a258c98 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/6.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/cli-reference/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/7.js b/website/.svelte-kit/generated/client/nodes/7.js new file mode 100644 index 0000000..fbd0e8e --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/7.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/configuration/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/8.js b/website/.svelte-kit/generated/client/nodes/8.js new file mode 100644 index 0000000..88cec62 --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/8.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/examples/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/client/nodes/9.js b/website/.svelte-kit/generated/client/nodes/9.js new file mode 100644 index 0000000..3b0c4ae --- /dev/null +++ b/website/.svelte-kit/generated/client/nodes/9.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/docs/getting-started/+page.svelte"; \ No newline at end of file diff --git a/website/.svelte-kit/generated/root.js b/website/.svelte-kit/generated/root.js new file mode 100644 index 0000000..4d1e892 --- /dev/null +++ b/website/.svelte-kit/generated/root.js @@ -0,0 +1,3 @@ +import { asClassComponent } from 'svelte/legacy'; +import Root from './root.svelte'; +export default asClassComponent(Root); \ No newline at end of file diff --git a/website/.svelte-kit/generated/root.svelte b/website/.svelte-kit/generated/root.svelte new file mode 100644 index 0000000..1c16fc8 --- /dev/null +++ b/website/.svelte-kit/generated/root.svelte @@ -0,0 +1,80 @@ + + + + +{#if constructors[1]} + {@const Pyramid_0 = constructors[0]} + + + {#if constructors[2]} + {@const Pyramid_1 = constructors[1]} + + + + + + + {:else} + {@const Pyramid_1 = constructors[1]} + + + + {/if} + + +{:else} + {@const Pyramid_0 = constructors[0]} + + + +{/if} + +{#if mounted} +
+ {#if navigated} + {title} + {/if} +
+{/if} \ No newline at end of file diff --git a/website/.svelte-kit/generated/server/internal.js b/website/.svelte-kit/generated/server/internal.js new file mode 100644 index 0000000..13b4539 --- /dev/null +++ b/website/.svelte-kit/generated/server/internal.js @@ -0,0 +1,54 @@ + +import root from '../root.js'; +import { set_building, set_prerendering } from '__sveltekit/environment'; +import { set_assets } from '$app/paths/internal/server'; +import { set_manifest, set_read_implementation } from '__sveltekit/server'; +import { set_private_env, set_public_env } from '../../../node_modules/@sveltejs/kit/src/runtime/shared-server.js'; + +export const options = { + app_template_contains_nonce: false, + async: false, + csp: {"mode":"auto","directives":{"upgrade-insecure-requests":false,"block-all-mixed-content":false},"reportOnly":{"upgrade-insecure-requests":false,"block-all-mixed-content":false}}, + csrf_check_origin: true, + csrf_trusted_origins: [], + embedded: false, + env_public_prefix: 'PUBLIC_', + env_private_prefix: '', + hash_routing: false, + hooks: null, // added lazily, via `get_hooks` + preload_strategy: "modulepreload", + root, + service_worker: false, + service_worker_options: undefined, + server_error_boundaries: false, + templates: { + app: ({ head, body, assets, nonce, env }) => "\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\n\t\tcora — AI Code Review CLI\n\t\t\n\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\n\t\t" + head + "\n\t\n\t\n\t\t
" + body + "
\n\t\n\n", + error: ({ status, message }) => "\n\n\t\n\t\t\n\t\t" + message + "\n\n\t\t\n\t\n\t\n\t\t
\n\t\t\t" + status + "\n\t\t\t
\n\t\t\t\t

" + message + "

\n\t\t\t
\n\t\t
\n\t\n\n" + }, + version_hash: "op75zz" +}; + +export async function get_hooks() { + let handle; + let handleFetch; + let handleError; + let handleValidationError; + let init; + + + let reroute; + let transport; + + + return { + handle, + handleFetch, + handleError, + handleValidationError, + init, + reroute, + transport + }; +} + +export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation }; diff --git a/website/.svelte-kit/non-ambient.d.ts b/website/.svelte-kit/non-ambient.d.ts new file mode 100644 index 0000000..220d156 --- /dev/null +++ b/website/.svelte-kit/non-ambient.d.ts @@ -0,0 +1,53 @@ + +// this file is generated — do not edit it + + +declare module "svelte/elements" { + export interface HTMLAttributes { + 'data-sveltekit-keepfocus'?: true | '' | 'off' | undefined | null; + 'data-sveltekit-noscroll'?: true | '' | 'off' | undefined | null; + 'data-sveltekit-preload-code'?: + | true + | '' + | 'eager' + | 'viewport' + | 'hover' + | 'tap' + | 'off' + | undefined + | null; + 'data-sveltekit-preload-data'?: true | '' | 'hover' | 'tap' | 'off' | undefined | null; + 'data-sveltekit-reload'?: true | '' | 'off' | undefined | null; + 'data-sveltekit-replacestate'?: true | '' | 'off' | undefined | null; + } +} + +export {}; + + +declare module "$app/types" { + type MatcherParam = M extends (param : string) => param is (infer U extends string) ? U : string; + + export interface AppTypes { + RouteId(): "/" | "/docs" | "/docs/changelog" | "/docs/cli-reference" | "/docs/configuration" | "/docs/examples" | "/docs/getting-started" | "/docs/installation" | "/docs/providers" | "/docs/roadmap" | "/docs/usage"; + RouteParams(): { + + }; + LayoutParams(): { + "/": Record; + "/docs": Record; + "/docs/changelog": Record; + "/docs/cli-reference": Record; + "/docs/configuration": Record; + "/docs/examples": Record; + "/docs/getting-started": Record; + "/docs/installation": Record; + "/docs/providers": Record; + "/docs/roadmap": Record; + "/docs/usage": Record + }; + Pathname(): "/" | "/docs" | "/docs/changelog" | "/docs/cli-reference" | "/docs/configuration" | "/docs/examples" | "/docs/getting-started" | "/docs/installation" | "/docs/providers" | "/docs/roadmap" | "/docs/usage"; + ResolvedPathname(): `${"" | `/${string}`}${ReturnType}`; + Asset(): "/favicon.png" | "/og.png" | "/robots.txt" | string & {}; + } +} \ No newline at end of file diff --git a/website/.svelte-kit/output/client/.vite/manifest.json b/website/.svelte-kit/output/client/.vite/manifest.json new file mode 100644 index 0000000..7a6ec62 --- /dev/null +++ b/website/.svelte-kit/output/client/.vite/manifest.json @@ -0,0 +1,243 @@ +{ + ".svelte-kit/generated/client-optimized/app.js": { + "file": "_app/immutable/entry/app.DyiyvRxF.js", + "name": "entry/app", + "src": ".svelte-kit/generated/client-optimized/app.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_kNaey6uv.js", + "_xihTtKlq.js" + ], + "dynamicImports": [ + ".svelte-kit/generated/client-optimized/nodes/0.js", + ".svelte-kit/generated/client-optimized/nodes/1.js", + ".svelte-kit/generated/client-optimized/nodes/2.js", + ".svelte-kit/generated/client-optimized/nodes/3.js", + ".svelte-kit/generated/client-optimized/nodes/4.js", + ".svelte-kit/generated/client-optimized/nodes/5.js", + ".svelte-kit/generated/client-optimized/nodes/6.js", + ".svelte-kit/generated/client-optimized/nodes/7.js", + ".svelte-kit/generated/client-optimized/nodes/8.js", + ".svelte-kit/generated/client-optimized/nodes/9.js", + ".svelte-kit/generated/client-optimized/nodes/10.js", + ".svelte-kit/generated/client-optimized/nodes/11.js", + ".svelte-kit/generated/client-optimized/nodes/12.js", + ".svelte-kit/generated/client-optimized/nodes/13.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/0.js": { + "file": "_app/immutable/nodes/0.BZeUAe05.js", + "name": "nodes/0", + "src": ".svelte-kit/generated/client-optimized/nodes/0.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_BuBrZOIh.js", + "_DozEvg9T.js", + "_xihTtKlq.js" + ], + "css": [ + "_app/immutable/assets/0.D7nPmqCL.css" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/1.js": { + "file": "_app/immutable/nodes/1.BSJLBHmD.js", + "name": "nodes/1", + "src": ".svelte-kit/generated/client-optimized/nodes/1.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_DyVSz01m.js", + "_xihTtKlq.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/10.js": { + "file": "_app/immutable/nodes/10.CyIl61W5.js", + "name": "nodes/10", + "src": ".svelte-kit/generated/client-optimized/nodes/10.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/11.js": { + "file": "_app/immutable/nodes/11.CBJLxlCn.js", + "name": "nodes/11", + "src": ".svelte-kit/generated/client-optimized/nodes/11.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/12.js": { + "file": "_app/immutable/nodes/12.D8T_BCyX.js", + "name": "nodes/12", + "src": ".svelte-kit/generated/client-optimized/nodes/12.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/13.js": { + "file": "_app/immutable/nodes/13.CfK385I2.js", + "name": "nodes/13", + "src": ".svelte-kit/generated/client-optimized/nodes/13.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/2.js": { + "file": "_app/immutable/nodes/2.DnuVmUIJ.js", + "name": "nodes/2", + "src": ".svelte-kit/generated/client-optimized/nodes/2.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_DozEvg9T.js", + "_xihTtKlq.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/3.js": { + "file": "_app/immutable/nodes/3.D0TU24-D.js", + "name": "nodes/3", + "src": ".svelte-kit/generated/client-optimized/nodes/3.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_BuBrZOIh.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ], + "css": [ + "_app/immutable/assets/3.DTuVOu2m.css" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/4.js": { + "file": "_app/immutable/nodes/4.DOawxC2l.js", + "name": "nodes/4", + "src": ".svelte-kit/generated/client-optimized/nodes/4.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_DyVSz01m.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/5.js": { + "file": "_app/immutable/nodes/5.CZek6GP7.js", + "name": "nodes/5", + "src": ".svelte-kit/generated/client-optimized/nodes/5.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/6.js": { + "file": "_app/immutable/nodes/6.ChPTFH0w.js", + "name": "nodes/6", + "src": ".svelte-kit/generated/client-optimized/nodes/6.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/7.js": { + "file": "_app/immutable/nodes/7.BG-S3wet.js", + "name": "nodes/7", + "src": ".svelte-kit/generated/client-optimized/nodes/7.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/8.js": { + "file": "_app/immutable/nodes/8.FgjeHYDF.js", + "name": "nodes/8", + "src": ".svelte-kit/generated/client-optimized/nodes/8.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + ".svelte-kit/generated/client-optimized/nodes/9.js": { + "file": "_app/immutable/nodes/9.9IQ7DCMm.js", + "name": "nodes/9", + "src": ".svelte-kit/generated/client-optimized/nodes/9.js", + "isEntry": true, + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js", + "_qiBCaaew.js" + ] + }, + "_BuBrZOIh.js": { + "file": "_app/immutable/chunks/BuBrZOIh.js", + "name": "Icon", + "imports": [ + "_Du04-Wio.js", + "_xihTtKlq.js" + ] + }, + "_DozEvg9T.js": { + "file": "_app/immutable/chunks/DozEvg9T.js", + "name": "stores", + "imports": [ + "_Du04-Wio.js", + "_DyVSz01m.js" + ] + }, + "_Du04-Wio.js": { + "file": "_app/immutable/chunks/Du04-Wio.js", + "name": "index-client" + }, + "_DyVSz01m.js": { + "file": "_app/immutable/chunks/DyVSz01m.js", + "name": "client", + "imports": [ + "_Du04-Wio.js" + ] + }, + "_kNaey6uv.js": { + "file": "_app/immutable/chunks/kNaey6uv.js", + "name": "preload-helper" + }, + "_qiBCaaew.js": { + "file": "_app/immutable/chunks/qiBCaaew.js", + "name": "legacy", + "imports": [ + "_Du04-Wio.js" + ] + }, + "_xihTtKlq.js": { + "file": "_app/immutable/chunks/xihTtKlq.js", + "name": "disclose-version" + }, + "node_modules/@sveltejs/kit/src/runtime/client/entry.js": { + "file": "_app/immutable/entry/start.CmvPVbW8.js", + "name": "entry/start", + "src": "node_modules/@sveltejs/kit/src/runtime/client/entry.js", + "isEntry": true, + "imports": [ + "_DyVSz01m.js" + ] + } +} \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/assets/0.D7nPmqCL.css b/website/.svelte-kit/output/client/_app/immutable/assets/0.D7nPmqCL.css new file mode 100644 index 0000000..c686f67 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/assets/0.D7nPmqCL.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-4xl:2rem;--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-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-destructive:var(--destructive);--color-border:var(--border);--color-ring:var(--ring)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-\[10\%\]{top:10%}.right-\[15\%\]{right:15%}.bottom-\[10\%\]{bottom:10%}.left-\[20\%\]{left:20%}.z-10{z-index:10}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-20{margin-top:calc(var(--spacing) * 20)}.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)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-\[1\.45em\]{min-height:1.45em}.min-h-\[calc\(100vh-3\.5rem\)\]{min-height:calc(100vh - 3.5rem)}.min-h-screen{min-height:100vh}.w-1\/3{width:33.3333%}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-\[400px\]{width:400px}.w-\[500px\]{width:500px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[32rem\]{max-width:32rem}.max-w-\[40rem\]{max-width:40rem}.max-w-\[56rem\]{max-width:56rem}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-outside{list-style-position:outside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-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-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-\[min\(var\(--radius-md\)\,8px\)\]{border-radius:min(var(--radius-md), 8px)}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.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-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[var\(--accent\)\]\/25{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-\[var\(--accent\)\]\/25{border-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.border-\[var\(--border\)\]{border-color:var(--border)}.border-border{border-color:var(--color-border)}.border-transparent{border-color:#0000}.bg-\[var\(--accent\)\],.bg-\[var\(--accent\)\]\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-\[var\(--accent\)\]\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-\[var\(--background\)\]{background-color:var(--background)}.bg-background{background-color:var(--color-background)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-card{background-color:var(--color-card)}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive) 10%, transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/20{background-color:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.bg-clip-padding{background-clip:padding-box}.p-0{padding:calc(var(--spacing) * 0)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[13px\]{font-size:13px}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-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:calc(var(--tracking-tight) * -1);letter-spacing:calc(var(--tracking-tight) * -1)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--accent-foreground\)\]{color:var(--accent-foreground)}.text-\[var\(--foreground\)\]{color:var(--foreground)}.text-\[var\(--muted-foreground\)\]{color:var(--muted-foreground)}.text-\[var\(--success\)\]{color:var(--success)}.text-blue-400{color:var(--color-blue-400)}.text-card-foreground{color:var(--color-card-foreground)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-\[0\.02\]{opacity:.02}.opacity-\[0\.03\]{opacity:.03}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--color-foreground) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-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-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[transition-delay\:100ms\]{transition-delay:.1s}.\[transition-delay\:200ms\]{transition-delay:.2s}.delay-100{transition-delay:.1s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-400{transition-delay:.4s}.delay-500{transition-delay:.5s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.group-data-\[size\=sm\]\/card\:px-4:is(:where(.group\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}@media (hover:hover){.hover\:border-\[var\(--accent\)\]:hover{border-color:var(--accent)}.hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-\[var\(--foreground\)\]:hover{color:var(--foreground)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-muted-foreground:hover{color:var(--color-muted-foreground)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-md{border-radius:var(--radius-md)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--color-muted)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--color-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[size\=sm\]\:gap-4[data-size=sm]{gap:calc(var(--spacing) * 4)}.data-\[size\=sm\]\:py-4[data-size=sm]{padding-block:calc(var(--spacing) * 4)}@media (width>=40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (width>=48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}}@media (width>=64rem){.lg\:block{display:block}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:bg-destructive\/20{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.dark\:opacity-\[0\.04\]{opacity:.04}.dark\:opacity-\[0\.06\]{opacity:.06}@media (hover:hover){.dark\:hover\:bg-destructive\/30:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:hover{background-color:color-mix(in oklab, var(--color-destructive) 30%, transparent)}}.dark\:hover\:bg-muted\/50:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:color-mix(in oklab, var(--color-destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-b\]\:pb-4:is(:where(.group\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 4)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-t\]\:pt-4:is(:where(.group\/card)[data-size=sm] *).border-t{padding-top:calc(var(--spacing) * 4)}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--color-muted)}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--color-muted-foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}}:root{--background:oklch(99% .002 270);--foreground:oklch(13% .02 270);--card:oklch(100% 0 0);--card-foreground:oklch(13% .02 270);--muted:oklch(96% .005 270);--muted-foreground:oklch(50% .02 270);--accent:oklch(55% .22 270);--accent-bright:oklch(60% .24 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(70% .12 270);--success:oklch(55% .19 145);--warning:oklch(65% .15 85);--destructive:oklch(50% .22 25);--border:oklch(91% .005 270);--border-subtle:oklch(94% .003 270);--ring:oklch(55% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.06);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.1);--font-sans:"Inter", system-ui, -apple-system, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--space-0:0;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-10:2.5rem;--space-12:3rem;--space-16:4rem;--space-20:5rem;--space-24:6rem;--space-32:8rem}.dark{--background:oklch(13% .01 270);--foreground:oklch(92% .01 270);--card:oklch(17% .01 270);--card-foreground:oklch(92% .01 270);--muted:oklch(22% .01 270);--muted-foreground:oklch(65% .01 270);--accent:oklch(65% .22 270);--accent-bright:oklch(72% .2 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(45% .12 270);--success:oklch(72% .19 145);--warning:oklch(78% .15 85);--destructive:oklch(55% .22 25);--border:oklch(27% .01 270);--border-subtle:oklch(22% .01 270);--ring:oklch(65% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.3);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.4)}html{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}body{min-height:100vh;line-height:1.5}::selection{color:var(--accent-foreground);background:oklch(55% .22 270/.3)}code,.font-mono{font-family:var(--font-mono)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--muted)}::-webkit-scrollbar-thumb{background:var(--muted-foreground);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:oklch(75% .01 270)}@media (prefers-reduced-motion:no-preference){@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes blink{0%,50%{opacity:1}51%,to{opacity:0}}@keyframes accordion-down{0%{height:0}to{height:var(--bits-accordion-content-height)}}@keyframes accordion-up{0%{height:var(--bits-accordion-content-height)}to{height:0}}@keyframes glow-pulse{0%,to{opacity:.4;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}.animate-fade-in{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-delay-1{opacity:0;animation:.6s ease-out .1s forwards fade-in-up}.animate-fade-in-delay-2{opacity:0;animation:.6s ease-out .2s forwards fade-in-up}.animate-fade-in-delay-3{opacity:0;animation:.6s ease-out .3s forwards fade-in-up}.animate-fade-in-delay-4{opacity:0;animation:.6s ease-out .4s forwards fade-in-up}.cursor-blink{animation:1s step-end infinite blink}.animate-accordion-down{animation:.2s ease-out accordion-down}.animate-accordion-up{animation:.2s ease-out accordion-up}.animate-glow-pulse{animation:4s ease-in-out infinite glow-pulse}.animate-float{animation:6s ease-in-out infinite float}.animate-fade-in-up{opacity:0;animation:.6s ease-out forwards fade-in-up;transform:translateY(20px)}.delay-100{animation-delay:.1s}.delay-200{animation-delay:.2s}.delay-300{animation-delay:.3s}.delay-400{animation-delay:.4s}.delay-500{animation-delay:.5s}.scroll-reveal{opacity:0;transition:opacity .6s ease-out,transform .6s ease-out;transform:translateY(20px)}.scroll-reveal.revealed{opacity:1;transform:translateY(0)}@keyframes fade-in-line{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes number-pulse{0%,to{box-shadow:0 0 oklch(55% .22 270/.4)}50%{box-shadow:0 0 0 8px oklch(55% .22 270/0)}}.timeline-number.revealed{animation:2s ease-in-out forwards number-pulse}.compare-table tbody tr{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-table tbody tr.revealed{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}html{scroll-behavior:auto}.animate-fade-in,.animate-fade-in-up,.animate-fade-in-delay-1,.animate-fade-in-delay-2,.animate-fade-in-delay-3,.animate-fade-in-delay-4,.scroll-reveal{opacity:1!important;transform:none!important}}.hero-gradient{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,oklch(60% .24 270),oklch(55% .22 270),oklch(50% .18 240));-webkit-background-clip:text;background-clip:text}.dark .hero-gradient{background:linear-gradient(135deg,oklch(72% .2 270),oklch(65% .22 270),oklch(60% .18 240));-webkit-background-clip:text;background-clip:text}.glow-purple{box-shadow:0 0 60px -12px oklch(55% .22 270/.2)}.dark .glow-purple{box-shadow:0 0 60px -12px oklch(65% .22 270/.2)}.glow-text{text-shadow:0 0 40px oklch(55% .22 270/.2)}.dark .glow-text{text-shadow:0 0 40px oklch(65% .22 270/.25)}.grid-bg{background-image:linear-gradient(oklch(55% .22 270/.04) 1px,#0000 1px),linear-gradient(90deg,oklch(55% .22 270/.04) 1px,#0000 1px);background-size:64px 64px}.dark .grid-bg{background-image:linear-gradient(oklch(65% .22 270/.03) 1px,#0000 1px),linear-gradient(90deg,oklch(65% .22 270/.03) 1px,#0000 1px)}.hero-glow{filter:blur(80px);pointer-events:none;border-radius:50%;position:absolute}.section{width:100%;max-width:1152px;padding-left:var(--space-6);padding-right:var(--space-6);margin-left:auto;margin-right:auto}@media (width>=768px){.section{padding-left:var(--space-8);padding-right:var(--space-8)}}@media (width>=1280px){.section{padding-left:var(--space-10);padding-right:var(--space-10)}}.section-hero{padding-top:var(--space-24);padding-bottom:var(--space-16)}.section-compact{padding-top:var(--space-16);padding-bottom:var(--space-16)}.section-tall{padding-top:var(--space-24);padding-bottom:var(--space-24)}.glass-card{-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--space-4);background:oklch(100% 0 0/.7);transition:border-color .2s ease-out,box-shadow .2s ease-out}.glass-card:hover{box-shadow:var(--shadow-card-hover);border-color:oklch(55% .22 270/.4)}.dark .glass-card{background:oklch(17% .01 270/.6);border-color:oklch(27% .01 270/.5)}.dark .glass-card:hover{border-color:oklch(65% .22 270/.3);box-shadow:0 0 24px oklch(65% .22 270/.08)}.feature-icon{width:var(--space-10);height:var(--space-10);border-radius:var(--space-3);color:var(--accent);background:oklch(55% .22 270/.08);flex-shrink:0;justify-content:center;align-items:center;display:flex}.dark .feature-icon{background:oklch(65% .22 270/.1)}.connect-line{padding:var(--space-1) 0;flex-direction:column;align-items:center;display:flex}.connect-line:before{content:"";width:1px;height:var(--space-4);background:oklch(55% .22 270/.2);display:block}.dark .connect-line:before{background:oklch(65% .22 270/.3)}.btn-primary{justify-content:center;align-items:center;gap:var(--space-2);background:var(--accent);color:var(--accent-foreground);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:600;font-family:var(--font-sans);cursor:pointer;border:none;min-height:44px;text-decoration:none;transition:transform .15s ease-out,box-shadow .2s ease-out;display:inline-flex}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 0 24px oklch(55% .22 270/.3)}.btn-primary:active{transform:translateY(0)}.dark .btn-primary:hover{box-shadow:0 0 24px oklch(65% .22 270/.35)}.btn-ghost{justify-content:center;align-items:center;gap:var(--space-2);color:var(--muted-foreground);border:1px solid var(--border);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:500;font-family:var(--font-sans);cursor:pointer;background:0 0;min-height:44px;text-decoration:none;transition:border-color .15s ease-out,color .15s ease-out;display:inline-flex}.btn-ghost:hover{border-color:var(--accent);color:var(--accent)}.accent-badge{align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-3);color:var(--accent);letter-spacing:.02em;background:oklch(55% .22 270/.08);border-radius:9999px;font-size:12px;font-weight:600;display:inline-flex}.badge-dot{background:var(--accent);border-radius:9999px;width:6px;height:6px}.terminal-block{background:linear-gradient(135deg, var(--card), var(--muted));border:1px solid var(--border);position:relative}.terminal-block:before{content:"";background:linear-gradient(90deg, transparent, var(--accent), transparent);opacity:.4;height:1px;position:absolute;top:0;left:0;right:0}.terminal{border:1px solid var(--border);border-radius:var(--space-3);font-family:var(--font-mono);background:oklch(10% 0 0);overflow:hidden}.terminal-header{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);background:oklch(10% 0 0);display:flex}.terminal-body{padding:var(--space-4) var(--space-5);color:var(--foreground);font-size:.8125rem;line-height:1.625;overflow-x:auto}.terminal-title{color:var(--muted-foreground);margin-left:var(--space-2);font-size:12px;font-weight:500;font-family:var(--font-sans)}.terminal-dot{width:var(--space-2);height:var(--space-2);border-radius:9999px}.terminal-dot-red{background:var(--destructive)}.terminal-dot-yellow{background:var(--warning)}.terminal-dot-green{background:var(--success)}.syntax-cmd{color:var(--accent-bright);font-weight:600}.syntax-flag{color:oklch(75% .15 240)}.syntax-highlight{color:var(--accent)}.syntax-string{color:oklch(78% .16 155)}.typing-cursor{background:var(--accent);vertical-align:text-bottom;width:8px;height:1.2em;animation:1s step-end infinite blink;display:inline-block}.copy-btn{top:var(--space-3);right:var(--space-3);border-radius:var(--space-1);border:1px solid var(--border);background:var(--card);width:32px;height:32px;color:var(--muted-foreground);cursor:pointer;opacity:0;justify-content:center;align-items:center;transition:opacity .15s,color .15s;display:flex;position:absolute}.terminal:hover .copy-btn,.terminal-block:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--foreground)}.timeline-step{text-align:center;align-items:center;gap:var(--space-3);flex-direction:column;display:flex}.timeline-number{width:var(--space-10);height:var(--space-10);color:var(--accent);background:oklch(55% .22 270/.08);border-radius:9999px;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex}.dark .timeline-number{background:oklch(65% .22 270/.1)}.cora-col{background:oklch(55% .22 270/.04)}.cora-col th,.cora-col td{color:var(--accent)}.dark .cora-col{background:oklch(65% .22 270/.06)}.site-header{z-index:50;border-bottom:1px solid var(--border);-webkit-backdrop-filter:blur(12px);background:oklch(99% .002 270/.8);position:sticky;top:0}.dark .site-header{background:oklch(13% .01 270/.8)}.site-header-link{color:var(--muted-foreground);font-size:14px;text-decoration:none;transition:color .15s}.site-header-link:hover,.site-header-link.active{color:var(--foreground)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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-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} diff --git a/website/.svelte-kit/output/client/_app/immutable/assets/3.DTuVOu2m.css b/website/.svelte-kit/output/client/_app/immutable/assets/3.DTuVOu2m.css new file mode 100644 index 0000000..57f47e6 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/assets/3.DTuVOu2m.css @@ -0,0 +1 @@ +.compare-glass-card.svelte-14kdxof{border:1px solid var(--border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:oklch(99% .002 270/.6);border-radius:16px;overflow:hidden;box-shadow:0 4px 24px -4px oklch(40% .02 270/.08)}.dark .compare-glass-card.svelte-14kdxof{background:oklch(16% .015 270/.6);box-shadow:0 4px 24px -4px oklch(10% .02 270/.2)}.compare-table.svelte-14kdxof{border-collapse:collapse}.compare-table.svelte-14kdxof th:where(.svelte-14kdxof),.compare-table.svelte-14kdxof td:where(.svelte-14kdxof){border-bottom:1px solid var(--border);white-space:nowrap;padding:14px 16px;font-size:14px}.compare-table.svelte-14kdxof thead:where(.svelte-14kdxof) th:where(.svelte-14kdxof){text-transform:uppercase;letter-spacing:.05em;color:var(--muted-foreground);border-bottom:2px solid var(--border);padding:16px;font-size:13px;font-weight:600}.compare-table.svelte-14kdxof tbody:where(.svelte-14kdxof) tr:where(.svelte-14kdxof):last-child td:where(.svelte-14kdxof){border-bottom:none}.cora-highlight-col.svelte-14kdxof{background:oklch(55% .22 270/.05)}.dark .cora-highlight-col.svelte-14kdxof{background:oklch(65% .22 270/.08)}.cora-badge.svelte-14kdxof{color:oklch(55% .22 270);background:oklch(55% .22 270/.12);border-radius:6px;align-items:center;padding:2px 10px;font-size:13px;font-weight:700;display:inline-flex}.dark .cora-badge.svelte-14kdxof{color:oklch(75% .2 270);background:oklch(65% .22 270/.18)}.check-badge.svelte-14kdxof{color:oklch(50% .18 150);background:oklch(60% .18 150/.12);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:700;display:inline-flex}.dark .check-badge.svelte-14kdxof{color:oklch(70% .15 150);background:oklch(60% .18 150/.18)}.check-muted.svelte-14kdxof{width:26px;height:26px;color:var(--muted-foreground);border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:inline-flex}.cross-badge.svelte-14kdxof{color:oklch(55% .15 25);background:oklch(55% .15 25/.08);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:600;display:inline-flex}.dark .cross-badge.svelte-14kdxof{color:oklch(60% .15 25);background:oklch(60% .15 25/.12)}.dash-muted.svelte-14kdxof{color:var(--muted-foreground);opacity:.5}.compare-row.svelte-14kdxof{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-row.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.compare-card.svelte-14kdxof{border:1px solid var(--border);opacity:0;background:oklch(99% .002 270/.6);border-radius:12px;transition:opacity .4s ease-out,transform .4s ease-out;overflow:hidden;transform:translateY(8px)}.compare-card.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.dark .compare-card.svelte-14kdxof{background:oklch(16% .015 270/.6)}.compare-card-header.svelte-14kdxof{border-bottom:1px solid var(--border);background:oklch(96% .003 270);padding:10px 14px}.dark .compare-card-header.svelte-14kdxof{background:oklch(14% .012 270)}.compare-card-body.svelte-14kdxof{grid-template-columns:1fr 1fr 1fr 1fr;gap:0;display:grid}.compare-card-cora.svelte-14kdxof{border-right:1px solid var(--border);background:oklch(55% .22 270/.05);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.dark .compare-card-cora.svelte-14kdxof{background:oklch(65% .22 270/.08)}.compare-card-comp.svelte-14kdxof{border-right:1px solid var(--border);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.compare-card-comp.svelte-14kdxof:last-child{border-right:none} diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/BuBrZOIh.js b/website/.svelte-kit/output/client/_app/immutable/chunks/BuBrZOIh.js new file mode 100644 index 0000000..f25a39f --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/BuBrZOIh.js @@ -0,0 +1 @@ +import{D as e,G as t,K as n,M as r,P as i,T as a,W as o,X as s,Z as c,a as l,b as u,ct as d,g as f,i as p,it as m,l as h,lt as g,rt as _,tt as v,ut as y,v as b,w as x,x as S}from"./Du04-Wio.js";import"./xihTtKlq.js";var C=class{#e;#t;constructor(e,t){this.#e=e,this.#t=c(t)}get current(){return this.#t(),this.#e()}},w=/\(.+\)/,T=new Set([`all`,`print`,`screen`,`and`,`or`,`not`,`only`]),E=class extends C{constructor(e,t){let n=w.test(e)||e.split(/[\s,]+/).some(e=>T.has(e.trim()))?e:`(${e})`,i=window.matchMedia(n);super(()=>i.matches,e=>r(i,`change`,e))}},D={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},O=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},k=Symbol(`lucide-context`),A=()=>v(k),j=new Set([`$$slots`,`$$events`,`$$legacy`,`name`,`color`,`size`,`strokeWidth`,`absoluteStrokeWidth`,`iconNode`,`children`]),M=e(``);function N(e,r){m(r,!0);let c=A()??{},v=p(r,`color`,19,()=>c.color??`currentColor`),C=p(r,`size`,19,()=>c.size??24),w=p(r,`strokeWidth`,19,()=>c.strokeWidth??2),T=p(r,`absoluteStrokeWidth`,19,()=>c.absoluteStrokeWidth??!1),E=p(r,`iconNode`,19,()=>[]),k=l(r,j),N=s(()=>T()?Number(w())*24/Number(C()):w());var P=M();h(P,e=>({...D,...e,...k,width:C(),height:C(),stroke:v(),"stroke-width":i(N),class:[`lucide-icon lucide`,c.class,r.name&&`lucide-${r.name}`,r.class]}),[()=>!r.children&&!O(k)&&{"aria-hidden":`true`}]);var F=o(P);u(F,17,E,S,(e,n)=>{var r=s(()=>y(i(n),2));let o=()=>i(r)[0],c=()=>i(r)[1];var l=a();f(t(l),o,!0,(e,t)=>{h(e,()=>({...c()}))}),x(e,l)}),b(n(F),()=>r.children??g),d(P),x(e,P),_()}export{E as n,N as t}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/DozEvg9T.js b/website/.svelte-kit/output/client/_app/immutable/chunks/DozEvg9T.js new file mode 100644 index 0000000..441a849 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/DozEvg9T.js @@ -0,0 +1 @@ +import"./Du04-Wio.js";import{r as e}from"./DyVSz01m.js";var t=()=>{let t=e;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},n={subscribe(e){return t().page.subscribe(e)}};export{n as t}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/Du04-Wio.js b/website/.svelte-kit/output/client/_app/immutable/chunks/Du04-Wio.js new file mode 100644 index 0000000..13623c5 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/Du04-Wio.js @@ -0,0 +1,3 @@ +var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var y=1<<24,b=1024,x=2048,S=4096,ee=8192,te=16384,ne=32768,re=1<<25,ie=65536,ae=1<<18,oe=1<<19,se=1<<20,ce=1<<25,le=65536,ue=1<<21,de=1<<22,fe=1<<23,C=Symbol(`$state`),pe=Symbol(`legacy props`),me=Symbol(``),he=Symbol(`attributes`),ge=Symbol(`class`),_e=Symbol(`style`),ve=Symbol(`text`),ye=Symbol(`form reset`),be=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},xe=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function Se(e){throw Error(`https://svelte.dev/e/experimental_async_required`)}function Ce(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function we(){throw Error(`https://svelte.dev/e/missing_context`)}function Te(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ee(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function De(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Oe(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function ke(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Ae(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function je(){throw Error(`https://svelte.dev/e/fork_discarded`)}function Me(){throw Error(`https://svelte.dev/e/fork_timing`)}function Ne(){throw Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`)}function Pe(){throw Error(`https://svelte.dev/e/hydration_failed`)}function Fe(e){throw Error(`https://svelte.dev/e/lifecycle_legacy_only`)}function Ie(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Le(){throw Error(`https://svelte.dev/e/set_context_after_init`)}function Re(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function ze(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Be(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ve(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var He={},w=Symbol(`uninitialized`),Ue=`http://www.w3.org/1999/xhtml`,We=`http://www.w3.org/2000/svg`,Ge=`http://www.w3.org/1998/Math/MathML`,Ke=`@attach`;function qe(){console.warn(`https://svelte.dev/e/derived_inert`)}function Je(e){console.warn(`https://svelte.dev/e/hydratable_missing_but_expected`)}function Ye(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Xe(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function Ze(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var T=!1;function E(e){T=e}var D;function O(e){if(e===null)throw Ye(),He;return D=e}function k(){return O(z(D))}function Qe(e){if(T){if(z(D)!==null)throw Ye(),He;D=e}}function $e(e=1){if(T){for(var t=e,n=D;t--;)n=z(n);D=n}}function et(e=!0){for(var t=0,n=D;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else (r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=z(n);e&&n.remove(),n=i}}function tt(e){if(!e||e.nodeType!==8)throw Ye(),He;return e.data}function nt(e){return e===this.v}function rt(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function it(e){return!rt(e,this.v)}var A=!1,at=!1;function ot(){at=!0}var j=null;function st(e){j=e}function ct(){let e={};return[()=>(dt(e)||we(),lt(e)),t=>ut(e,t)]}function lt(e){return gt(`getContext`).get(e)}function ut(e,t){let n=gt(`setContext`);if(A){var r=K.f;!U&&r&32&&!j.i||Le()}return n.set(e,t),t}function dt(e){return gt(`hasContext`).has(e)}function ft(){return gt(`getAllContexts`)}function pt(e,t=!1,n){j={p:j,i:!1,c:null,e:null,s:e,x:null,r:K,l:at&&!t?{s:null,u:null,$:[]}:null}}function mt(e){var t=j,n=t.e;if(n!==null){t.e=null;for(var r of n)or(r)}return e!==void 0&&(t.x=e),t.i=!0,j=t.p,e??{}}function ht(){return!at||j!==null&&j.l===null}function gt(e){return j===null&&Ce(e),j.c??=new Map(_t(j)||void 0)}function _t(e){let t=e.p;for(;t!==null;){let e=t.c;if(e!==null)return e;t=t.p}return null}var vt=[];function yt(){var e=vt;vt=[],g(e)}function bt(e){if(vt.length===0&&!Ht){var t=vt;queueMicrotask(()=>{t===vt&&yt()})}vt.push(e)}function xt(){for(;vt.length>0;)yt()}function St(e){var t=K;if(t===null)return U.f|=fe,e;if(!(t.f&32768)&&!(t.f&4))throw e;Ct(e,t)}function Ct(e,t){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}var wt=~(x|S|b);function M(e,t){e.f=e.f&wt|t}function Tt(e){e.f&512||e.deps===null?M(e,b):M(e,S)}function Et(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=le,Et(t.deps))}function Dt(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),Et(e.deps),M(e,b)}function Ot(e,t,n){if(e==null)return t(void 0),n&&n(void 0),m;let r=qr(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}var kt=[];function At(e,t=m){let n=null,r=new Set;function i(t){if(rt(e,t)&&(e=t,n)){let t=!kt.length;for(let t of r)t[1](),kt.push(t,e);if(t){for(let e=0;e{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:i,update:a,subscribe:o}}function jt(e){let t;return Ot(e,e=>t=e)(),t}var Mt=!1,Nt=!1,Pt=Symbol(`unmounted`);function Ft(e,t,n){let r=n[t]??={store:null,source:An(void 0),unsubscribe:m};if(r.store!==e&&!(Pt in n))if(r.unsubscribe(),r.store=e??null,e==null)r.source.v=void 0,r.unsubscribe=m;else{var i=!0;r.unsubscribe=Ot(e,e=>{i?r.source.v=e:I(r.source,e)}),i=!1}return e&&Pt in n?jt(e):Q(r.source)}function It(){let e={};function t(){ir(()=>{for(var t in e)e[t].unsubscribe();o(e,Pt,{enumerable:!1,value:!0})})}return[e,t]}function Lt(e){var t=Nt;try{return Nt=!1,[e(),Nt]}finally{Nt=t}}var Rt=null,zt=null,N=null,Bt=null,P=null,Vt=null,Ht=!1,Ut=!1,Wt=null,Gt=null,Kt=0,qt=1,Jt=class e{id=qt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){zt===null?Rt=zt=this:(zt.#n=this,this.#t=zt),zt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)M(r,x),t(r);for(r of n.m)M(r,S),t(r)}this.#p.add(e)}#g(){this.#e=!0,Kt++>1e3&&(this.#S(),Xt());for(let e of this.#u)this.#d.delete(e),M(e,x),this.schedule(e);for(let e of this.#d)M(e,S),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Wt=[],r=[],i=Gt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw rn(e),this.#h()||this.discard(),t}if(N=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Wt=null,Gt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)nn(e,t);i.length>0&&N.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),Bt=this,Zt(r),Zt(n),Bt=null,this.#s?.resolve();var s=N;if(this.#a===0&&(this.#c.length===0||s!==null)&&(this.#S(),A&&(this.#x(),N=s)),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=b;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=b:i&4?t.push(r):A&&i&16777224?n.push(r):Lr(r)&&(i&16&&this.#d.add(r),Hr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),M(i,x),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),N=this,this.#g()}#b(e){for(var t=0;t!l.current.get(e)[1]&&!this.current.has(e));if(r.length===0)e&&l.discard();else if(t.length>0){if(e)for(let e of this.#p)l.unskip_effect(e,e=>{e.f&4194320?l.schedule(e):l.#b([e])});l.activate();var i=new Set,a=new Map;for(var o of t)Qt(o,r,i,a);a=new Map;var s=[...l.current].filter(([e,t])=>{let n=this.current.get(e);return n?n[0]!==t[0]||n[1]!==t[1]:!0}).map(([e])=>e);if(s.length>0)for(let e of this.#l)!(e.f&155648)&&en(e,s,a)&&(e.f&4194320?(M(e,x),l.schedule(e)):l.#u.add(e));if(l.#c.length>0&&!l.#m){l.apply();for(var c of l.#c)l.#_(c,[],[]);l.#c=[]}l.deactivate()}}}}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,bt(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=_()).promise}static ensure(){if(N===null){let t=N=new e;!Ut&&!Ht&&bt(()=>{t.#e||t.flush()})}return N}apply(){if(!A||!this.is_fork&&this.#t===null&&this.#n===null){P=null;return}P=new Map;for(let[e,[t]]of this.current)P.set(e,t);for(let t=Rt;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id0)){Tn.clear();for(let e of F){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)F.has(n)&&(F.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||Hr(n)}}F.clear()}}F=null}}function Qt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Qt(i,t,n,r):e&4194320&&!(e&2048)&&en(i,t,r)&&(M(i,x),tn(i))}}function $t(e,t){if(e.reactions!==null)for(let n of e.reactions){let e=n.f;e&2?$t(n,t):e&131072&&(M(n,x),t.add(n))}}function en(e,t,n){let r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(let r of e.deps){if(i.call(t,r))return!0;if(r.f&2&&en(r,t,n))return n.set(r,!0),!0}return n.set(e,!1),!1}function tn(e){N.schedule(e)}function nn(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),M(e,b);for(var n=e.first;n!==null;)nn(n,t),n=n.next}}function rn(e){M(e,b);for(var t=e.first;t!==null;)rn(t),t=t.next}function an(e){A||Se(`fork`),N!==null&&Me();var t=Jt.ensure();t.is_fork=!0,P=new Map;var n=!1,r=t.settled();return Yt(e),{commit:async()=>{if(n){await r;return}t.linked||je(),n=!0,t.is_fork=!1;for(var[e,[i]]of t.current)e.v=i,e.wv=Ir();Yt(()=>{var e=new Set;for(var n of t.current.keys())$t(n,e);En(e),Mn()}),t.flush(),await r},discard:()=>{for(var e of t.current.keys())e.wv=Ir();!n&&t.linked&&t.discard()}}}function on(e){let t=0,n=On(0),r;return()=>{rr()&&(Q(n),fr(()=>(t===0&&(r=qr(()=>e(()=>Nn(n)))),t+=1,()=>{bt(()=>{--t,t===0&&(r?.(),r=void 0,Nn(n))})})))}}var sn=ie|oe;function cn(e,t,n,r){new ln(e,t,n,r)}var ln=class{parent;is_pending=!1;transform_error;#e;#t=T?D:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=on(()=>(this.#m=On(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=K;t.b=this,t.f|=128,n(e)},this.parent=K.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=mr(()=>{if(T){let e=this.#t;k();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},sn),T&&(this.#e=D)}#g(){try{this.#a=V(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=V(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=V(()=>e(this.#e)),bt(()=>{var e=this.#c=document.createDocumentFragment(),t=L();e.append(t),this.#a=this.#x(()=>V(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,xr(this.#o,()=>{this.#o=null}),this.#b(N))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=V(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Tr(this.#a,e);let t=this.#n.pending;this.#o=V(()=>t(this.#e))}else this.#b(N)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){Dt(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=K,n=U,r=j;q(this.#i),G(this.#i),st(this.#i.ctx);try{return Jt.ensure(),e()}catch(e){return St(e),null}finally{q(t),G(n),st(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&xr(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,bt(()=>{this.#d=!1,this.#m&&jn(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),Q(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;N?.is_fork?(this.#a&&N.skip_effect(this.#a),this.#o&&N.skip_effect(this.#o),this.#s&&N.skip_effect(this.#s),N.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(H(this.#a),null),this.#o&&=(H(this.#o),null),this.#s&&=(H(this.#s),null),T&&(O(this.#t),$e(),O(et()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Ze();return}r=!0,i&&Ve(),this.#s!==null&&xr(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){Ct(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return V(()=>{var t=K;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return Ct(e,this.#i.parent),null}}))};bt(()=>{var t;try{t=this.transform_error(e)}catch(e){Ct(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>Ct(e,this.#i&&this.#i.parent)):o(t)})}};function un(e,t,n,r){let i=ht()?mn:vn;var a=e.filter(e=>!e.settled);if(n.length===0&&a.length===0){r(t.map(i));return}var o=K,s=dn(),c=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function l(e){if(!(o.f&16384)){s();try{r(e)}catch(e){Ct(e,o)}fn()}}var u=pn();if(n.length===0){c.then(()=>l(t.map(i))).finally(u);return}function d(){Promise.all(n.map(e=>gn(e))).then(e=>l([...t.map(i),...e])).catch(e=>Ct(e,o)).finally(u)}c?c.then(()=>{s(),d(),fn()}):d()}function dn(){var e=K,t=U,n=j,r=N;return function(i=!0){q(e),G(t),st(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function fn(e=!0){q(null),G(null),st(null),e&&N?.deactivate()}function pn(){var e=K,t=e.b,n=N,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function mn(e){var t=2|x;return K!==null&&(K.f|=oe),{ctx:j,deps:null,effects:null,equals:nt,f:t,fn:e,reactions:null,rv:0,v:w,wv:0,parent:K,ac:null}}var hn=Symbol(`obsolete`);function gn(e,t,n){let r=K;r===null&&Te();var i=void 0,a=On(w),o=!U,s=new Set;return dr(()=>{var t=K,n=_();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==be&&n.reject(e)}).finally(fn)}catch(e){n.reject(e),fn()}var c=N;if(o){if(t.f&32768)var l=pn();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(hn);else for(let e of s.values())e.reject(hn);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==hn&&(c.activate(),t?(a.f|=fe,jn(a,t)):(a.f&8388608&&(a.f^=fe),jn(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),ir(()=>{for(let e of s)e.reject(hn)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function _n(e){let t=mn(e);return A||Ar(t),t}function vn(e){let t=mn(e);return t.equals=it,t}function yn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Dn&&Mn()}return t}function Mn(){Dn=!1;for(let e of wn){e.f&1024&&M(e,S);let t;try{t=Lr(e)}catch{t=!0}t&&Hr(e)}wn.clear()}function Nn(e){I(e,e.v+1)}function Pn(e,t,n){var r=e.reactions;if(r!==null)for(var i=ht(),a=r.length,o=0;o{if(Pr===c)return e();var t=U,n=Pr;G(null),Fr(c);var r=e();return G(t),Fr(n),r};return i&&r.set(`length`,kn(e.length,o)),new Proxy(e,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&Re();var i=r.get(t);return i===void 0?f(()=>{var e=kn(n.value,o);return r.set(t,e),e}):I(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>kn(w,o));r.set(t,e),Nn(a)}}else I(n,w),Nn(a);return!0},get(t,n,i){if(n===C)return e;var a=r.get(n),c=n in t;if(a===void 0&&(!c||s(t,n)?.writable)&&(a=f(()=>kn(Fn(c?t[n]:w),o)),r.set(n,a)),a!==void 0){var l=Q(a);return l===w?void 0:l}return Reflect.get(t,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=Q(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==w)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===C)return!0;var n=r.get(t),i=n!==void 0&&n.v!==w||Reflect.has(e,t);return(n!==void 0||K!==null&&(!i||s(e,t)?.writable))&&(n===void 0&&(n=f(()=>kn(i?Fn(e[t]):w,o)),r.set(t,n)),Q(n)===w)?!1:i},set(e,t,n,c){var l=r.get(t),u=t in e;if(i&&t===`length`)for(var d=n;dkn(w,o)),r.set(d+``,p)):I(p,w)}if(l===void 0)(!u||s(e,t)?.writable)&&(l=f(()=>kn(void 0,o)),I(l,Fn(n)),r.set(t,l));else{u=l.v!==w;var m=f(()=>Fn(n));I(l,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(c,n),!u){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&I(g,_+1)}Nn(a)}return!0},ownKeys(e){Q(a);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==w});for(var[n,i]of r)i.v!==w&&!(n in e)&&t.push(n);return t},setPrototypeOf(){ze()}})}function In(e){try{if(typeof e==`object`&&e&&C in e)return e[C]}catch{}return e}function Ln(e,t){return Object.is(In(e),In(t))}new Set([`copyWithin`,`fill`,`pop`,`push`,`reverse`,`shift`,`sort`,`splice`,`unshift`]);var Rn,zn,Bn,Vn,Hn;function Un(){if(Rn===void 0){Rn=window,zn=document,Bn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Vn=s(t,`firstChild`).get,Hn=s(t,`nextSibling`).get,f(e)&&(e[ge]=void 0,e[he]=null,e[_e]=void 0,e.__e=void 0),f(n)&&(n[ve]=void 0)}}function L(e=``){return document.createTextNode(e)}function R(e){return Vn.call(e)}function z(e){return Hn.call(e)}function Wn(e,t){if(!T)return R(e);var n=R(D);if(n===null)n=D.appendChild(L());else if(t&&n.nodeType!==3){var r=L();return n?.before(r),O(r),r}return t&&Xn(n),O(n),n}function Gn(e,t=!1){if(!T){var n=R(e);return n instanceof Comment&&n.data===``?z(n):n}if(t){if(D?.nodeType!==3){var r=L();return D?.before(r),O(r),r}Xn(D)}return D}function Kn(e,t=1,n=!1){let r=T?D:e;for(var i;t--;)i=r,r=z(r);if(!T)return r;if(n){if(r?.nodeType!==3){var a=L();return r===null?i?.after(a):r.before(a),O(a),a}Xn(r)}return O(r),r}function qn(e){e.textContent=``}function Jn(){return!A||F!==null?!1:(K.f&ne)!==0}function Yn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function Xn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Zn(e,t){if(t){let t=document.body;e.autofocus=!0,bt(()=>{document.activeElement===t&&e.focus()})}}var Qn=!1;function $n(){Qn||(Qn=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ye]?.()})},{capture:!0}))}function er(e){var t=U,n=K;G(null),q(null);try{return e()}finally{G(t),q(n)}}function tr(e){K===null&&(U===null&&ke(e),Oe()),Or&&De(e)}function nr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function B(e,t){var n=K;n!==null&&n.f&8192&&(e|=ee);var r={ctx:j,deps:null,nodes:null,f:e|x|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};N?.register_created_effect(r);var i=r;if(e&4)Wt===null?Jt.ensure().schedule(r):Wt.push(r);else if(t!==null){try{Hr(r)}catch(e){throw H(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=ie))}if(i!==null&&(i.parent=n,n!==null&&nr(i,n),U!==null&&U.f&2&&!(e&64))){var a=U;(a.effects??=[]).push(i)}return r}function rr(){return U!==null&&!W}function ir(e){let t=B(8,null);return M(t,b),t.teardown=e,t}function ar(e){tr(`$effect`);var t=K.f;if(!U&&t&32&&j!==null&&!j.i){var n=j;(n.e??=[]).push(e)}else return or(e)}function or(e){return B(4|se,e)}function sr(e){return tr(`$effect.pre`),B(8|se,e)}function cr(e){Jt.ensure();let t=B(64|oe,e);return()=>{H(t)}}function lr(e){Jt.ensure();let t=B(64|oe,e);return(e={})=>new Promise(n=>{e.outro?xr(t,()=>{H(t),n(void 0)}):(H(t),n(void 0))})}function ur(e){return B(4,e)}function dr(e){return B(de|oe,e)}function fr(e,t=0){return B(8|t,e)}function pr(e,t=[],n=[],r=[]){un(r,t,n,t=>{B(8,()=>e(...t.map(Q)))})}function mr(e,t=0){return B(16|t,e)}function hr(e,t=0){return B(y|t,e)}function V(e){return B(32|oe,e)}function gr(e){var t=e.teardown;if(t!==null){let e=Or,n=U;kr(!0),G(null);try{t.call(null)}finally{kr(e),G(n)}}}function _r(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&er(()=>{e.abort(be)});var r=n.next;n.f&64?n.parent=null:H(n,t),n=r}}function vr(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||H(t),t=n}}function H(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(yr(e.nodes.start,e.nodes.end),n=!0),M(e,re),_r(e,t&&!n),Vr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();gr(e),e.f^=re,e.f|=te;var i=e.parent;i!==null&&i.first!==null&&br(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function yr(e,t){for(;e!==null;){var n=e===t?null:z(e);e.remove(),e=n}}function br(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function xr(e,t,n=!0){var r=[];Sr(e,r,!0);var i=()=>{n&&H(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Sr(e,t,n){if(!(e.f&8192)){e.f^=ee;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Sr(i,t,o?n:!1)}i=a}}}function Cr(e){wr(e,!0)}function wr(e,t){if(e.f&8192){e.f^=ee,e.f&1024||(M(e,x),Jt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;wr(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Tr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:z(n);t.append(n),n=i}}var Er=null,Dr=!1,Or=!1;function kr(e){Or=e}var U=null,W=!1;function G(e){U=e}var K=null;function q(e){K=e}var J=null;function Ar(e){U!==null&&(!A||U.f&2)&&(J??=new Set).add(e)}var Y=null,X=0,Z=null;function jr(e){Z=e}var Mr=1,Nr=0,Pr=Nr;function Fr(e){Pr=e}function Ir(){return++Mr}function Lr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~le),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&P===null&&M(e,b)}return!1}function Rr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!A&&J!==null&&J.has(e)))for(var i=0;i{e.ac.abort(be)}),e.ac=null);try{e.f|=ue;var u=e.fn,d=u();e.f|=ne;var f=e.deps,p=N?.is_fork;if(Y!==null){var m;if(p||Vr(e,X),f!==null&&X>0)for(f.length=X+Y.length,m=0;m{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),Yt()}function Wr(){return Jt.ensure().settled()}function Q(e){var t=(e.f&2)!=0;if(Er?.add(e),U!==null&&!W&&!(K!==null&&K.f&16384)&&(J===null||!J.has(e))){var n=U.deps;if(U.f&2097152)e.rvn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?bt(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function di(e,t,n,r={}){var i=ui(t,e,n,r);return()=>{e.removeEventListener(t,i,r)}}function fi(e,t,n){(t[si]??={})[e]=n}function pi(e){for(var t=0;t{throw e});throw p}}finally{e[si]=t,delete e.currentTarget,G(d),q(f)}}}var gi=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function _i(e){return gi?.createHTML(e)??e}function vi(e){var t=Yn(`template`);return t.innerHTML=_i(e.replaceAll(``,``)),t.content}function $(e,t){var n=K;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function yi(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(T)return $(D,null),D;i===void 0&&(i=vi(a?e:``+e),n||(i=R(i)));var t=r||Bn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=R(t),s=t.lastChild;$(o,s)}else $(t,t);return t}}function bi(e,t,n=`svg`){var r=!e.startsWith(``),i=(t&1)!=0,a=`<${n}>${r?e:``+e}`,o;return()=>{if(T)return $(D,null),D;if(!o){var e=R(vi(a));if(i)for(o=document.createDocumentFragment();R(e);)o.appendChild(R(e));else o=R(e)}var t=o.cloneNode(!0);if(i){var n=R(t),r=t.lastChild;$(n,r)}else $(t,t);return t}}function xi(e,t){return bi(e,t,`svg`)}function Si(e=``){if(!T){var t=L(e+``);return $(t,t),t}var n=D;return n.nodeType===3?Xn(n):(n.before(n=L()),O(n)),$(n,n),n}function Ci(){if(T)return $(D,null),D;var e=document.createDocumentFragment(),t=document.createComment(``),n=L();return e.append(t,n),$(t,n),e}function wi(e,t){if(T){var n=K;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=D),k();return}e!==null&&e.before(t)}function Ti(){if(T&&D&&D.nodeType===8&&D.textContent?.startsWith(`$`)){let e=D.textContent.substring(1);return k(),e}return(window.__svelte??={}).uid??=1,`c${window.__svelte.uid++}`}function Ei(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ve]??=e.nodeValue)&&(e[ve]=n,e.nodeValue=`${n}`)}function Di(e,t){return Ai(e,t)}function Oi(e,t){Un(),t.intro=t.intro??!1;let n=t.target,r=T,i=D;try{for(var a=R(n);a&&(a.nodeType!==8||a.data!==`[`);)a=z(a);if(!a)throw He;E(!0),O(a);let r=Ai(e,{...t,anchor:a});return E(!1),r}catch(r){if(r instanceof Error&&r.message.split(` +`).some(e=>e.startsWith(`https://svelte.dev/e/`)))throw r;return r!==He&&console.warn(`Failed to hydrate: `,r),t.recover===!1&&Pe(),Un(),qn(n),E(!1),Di(e,t)}finally{E(r),O(i)}}var ki=new Map;function Ai(e,{target:t,anchor:n,props:r={},events:i,context:o,intro:s=!0,transformError:c}){Un();var l=void 0,u=lr(()=>{var s=n??t.appendChild(L());cn(s,{pending:()=>{}},t=>{pt({});var n=j;if(o&&(n.c=o),i&&(r.$$events=i),T&&$(t,null),l=e(t,r)||{},T&&(K.nodes.end=D,D===null||D.nodeType!==8||D.data!==`]`))throw Ye(),He;mt()},c);var u=new Set,d=e=>{for(var n=0;n{for(var e of u)for(let n of[t,document]){var r=ki.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,hi),r.delete(e),r.size===0&&ki.delete(n)):r.set(e,i)}li.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return ji.set(l,u),l}var ji=new WeakMap;function Mi(e,t){let n=ji.get(e);return n?(ji.delete(e),n(t)):Promise.resolve()}var Ni=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)Cr(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(Cr(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(H(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Tr(r,t),t.append(L()),this.#n.set(e,{effect:r,fragment:t})}else H(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),xr(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(H(n.effect),this.#n.delete(e))};ensure(e,t){var n=N,r=Jn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=L();i.append(a),this.#n.set(e,{effect:V(()=>t(a)),fragment:i})}else this.#t.set(e,V(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else T&&(this.anchor=D),this.#a(n)}};function Pi(e,t,n=!1){var r;T&&(r=D,k());var i=new Ni(e),a=n?ie:0;function o(e,t){if(T){var n=tt(r);if(e!==parseInt(n.substring(1))){var a=et();O(a),i.anchor=a,E(!1),i.ensure(e,t),E(!0);return}}i.ensure(e,t)}mr(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Fi(e,t){return t}function Ii(e,t,n){for(var r=[],i=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Li(e,a(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else --s},!1)}if(s===0){var l=r.length===0&&n!==null;if(l){var u=n,d=u.parentNode;qn(d),d.append(u),e.items.clear()}Li(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Li(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=r();return n(e)?e:e==null?[]:a(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Vi(v,p,c,t,i),d!==null&&(p.length===0?d.f&33554432?(d.f^=ce,Ui(d,null,c)):Cr(d):xr(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:mr(()=>{p=Q(f);var e=p.length;let n=!1;T&&tt(c)===`[!`!=(e===0)&&(c=et(),O(c),E(!1),n=!0);for(var a=new Set,u=N,v=Jn(),y=0;ys(c)):(d=V(()=>s(Ri??=L())),d.f|=ce)),e>a.size&&Ee(``,``,``),T&&e>0&&O(et()),!h)if(m.set(u,a),v){for(let[e,t]of l)a.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);n&&E(!0),Q(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,T&&(c=D)}function Bi(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Vi(e,t,n,r,i){var o=(r&8)!=0,s=t.length,c=e.items,l=Bi(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var re=r&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Hi(e,t,n,r,i,a,o,s){var c=o&1?o&16?On(n):An(n,!1,!1):null,l=o&2?On(i):null;return{v:c,i:l,e:V(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Ui(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=z(r);if(a.before(r),r===i)return;r=o}}function Wi(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Gi(e,t,n=!1,r=!1,i=!1,a=!1){var o=e,s=``;if(n){var c=e;T&&(o=O(R(c)))}pr(()=>{var e=K;if(s===(s=t()??``)){T&&k();return}if(n&&!T){e.nodes=null,c.innerHTML=s,s!==``&&$(R(c),c.lastChild);return}if(e.nodes!==null&&(yr(e.nodes.start,e.nodes.end),e.nodes=null),s!==``){if(T){for(var a=D.data,l=k(),u=l;l!==null&&(l.nodeType!==8||l.data!==``);)u=l,l=z(l);if(l===null)throw Ye(),He;$(D,u),o=O(l);return}var d=Yn(r?`svg`:i?`math`:`template`,r?We:i?Ge:void 0);d.innerHTML=s;var f=r||i?d:d.content;if($(R(f),f.lastChild),r||i)for(;R(f);)o.before(R(f));else o.before(f)}})}function Ki(e,t,...n){var r=new Ni(e);mr(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},ie)}function qi(e){return(t,...n)=>{var r=e(...n),i;T?(i=D,k()):(i=R(vi(r.render().trim())),t.before(i));let a=r.setup?.(i);$(i,i),typeof a==`function`&&ir(a)}}function Ji(e,t,n){var r;T&&(r=D,k());var i=new Ni(e);mr(()=>{var e=t()??null;if(T&&tt(r)===`[`!=(e!==null)){var a=et();O(a),i.anchor=a,E(!1),i.ensure(e,e&&(t=>n(t,e))),E(!0);return}i.ensure(e,e&&(t=>n(t,e)))},ie)}function Yi(e,t,n,r,i,a){let o=T;T&&k();var s=null;T&&D.nodeType===1&&(s=D,k());var c=T?D:e,l=new Ni(c,!1);mr(()=>{let e=t()||null;var a=i?i():n||e===`svg`?We:void 0;if(e===null){l.ensure(null,null);return}return l.ensure(e,t=>{if(e){if(s=T?s:Yn(e,a),$(s,s),r){var n=null;T&&oi(e)&&s.append(n=document.createComment(``));var i=T?R(s):s.appendChild(L());T&&(i===null?E(!1):O(i)),r(s,i),n?.remove()}K.nodes.end=s,t.before(s)}T&&O(t)}),()=>{}},ie),ir(()=>{}),o&&(E(!0),O(c))}function Xi(e,t){let n=null,r=T;var i;if(T){n=D;for(var a=R(document.head);a!==null&&(a.nodeType!==8||a.data!==e);)a=z(a);if(a===null)E(!1);else{var o=z(a);a.remove(),O(o)}}T||(i=document.head.appendChild(L()));try{mr(()=>{var e=V(()=>t(i));e.f|=ae})}finally{r&&(E(!0),O(n))}}function Zi(e,t){var n=void 0,r;hr(()=>{n!==(n=t())&&(r&&=(H(r),null),n&&(r=V(()=>{ur(()=>n(e))})))})}function Qi(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||ta.includes(r[o-1]))&&(s===r.length||ta.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function ra(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function ia(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function aa(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(ia)),i&&c.push(...Object.keys(i).map(ia));var l=0,u=-1;let t=e.length;for(var d=0;d{la(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),ir(()=>{t.disconnect()})}function da(e){return`__value`in e?e.__value:e.value}var fa=Symbol(`class`),pa=Symbol(`style`),ma=Symbol(`is custom element`),ha=Symbol(`is html`),ga=xe?`link`:`LINK`,_a=xe?`input`:`INPUT`,va=xe?`option`:`OPTION`,ya=xe?`select`:`SELECT`;function ba(e){if(T){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Sa(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Sa(e,`checked`,null),e.checked=r}}};e[ye]=n,bt(n),$n()}}function xa(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function Sa(e,t,n,r){var i=Ta(e);T&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===ga)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[me]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Da(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function Ca(e,t,n,r,i=!1,a=!1){if(T&&i&&e.nodeName===_a){var o=e;(o.type===`checkbox`?`defaultChecked`:`defaultValue`)in n||ba(o)}var s=Ta(e),c=s[ma],l=!s[ha];let u=T&&c;u&&E(!1);var d=t||{},f=e.nodeName===va;for(var p in t)p in n||(n[p]=null);n.class?n.class=ea(n.class):(r||n[fa])&&(n.class=null),n[pa]&&(n.style??=null);var m=Da(e);for(let i in n){let o=n[i];if(f&&i===`value`&&o==null){e.value=e.__value=``,d[i]=o;continue}if(i===`class`){oa(e,e.namespaceURI===`http://www.w3.org/1999/xhtml`,o,r,t?.[fa],n[fa]),d[i]=o,d[fa]=n[fa];continue}if(i===`style`){ca(e,o,t?.[pa],n[pa]),d[i]=o,d[pa]=n[pa];continue}var h=d[i];if(!(o===h&&!(o===void 0&&e.hasAttribute(i)))){d[i]=o;var g=i[0]+i[1];if(g!==`$$`)if(g===`on`){let t={},n=`$$`+i,r=i.slice(2);var _=$r(r);if(Zr(r)&&(r=r.slice(0,-7),t.capture=!0),!_&&h){if(o!=null)continue;e.removeEventListener(r,d[n],t),d[n]=null}if(_)fi(r,e,o),pi([r]);else if(o!=null){function a(e){d[i].call(this,e)}d[n]=ui(r,e,a,t)}}else if(i===`style`)Sa(e,i,o);else if(i===`autofocus`)Zn(e,!!o);else if(!c&&(i===`__value`||i===`value`&&o!=null))e.value=e.__value=o;else if(i===`selected`&&f)xa(e,o);else{var v=i;l||(v=ni(v));var y=v===`defaultValue`||v===`defaultChecked`;if(o==null&&!c&&!y)if(s[i]=null,v===`value`||v===`checked`){let n=e,r=t===void 0;if(v===`value`){let e=n.defaultValue;n.removeAttribute(v),n.defaultValue=e,n.value=n.__value=r?e:null}else{let e=n.defaultChecked;n.removeAttribute(v),n.defaultChecked=e,n.checked=r?e:!1}}else e.removeAttribute(i);else y||m.includes(v)&&(c||typeof o!=`string`)?(e[v]=o,v in s&&(s[v]=w)):typeof o!=`function`&&Sa(e,v,o,a)}}}return u&&E(!0),d}function wa(e,t,n=[],r=[],i=[],a,o=!1,s=!1){un(i,n,r,n=>{var r=void 0,i={},c=e.nodeName===ya,l=!1;if(hr(()=>{var u=t(...n.map(Q)),d=Ca(e,r,u,a,o,s);l&&c&&`value`in u&&la(e,u.value);for(let e of Object.getOwnPropertySymbols(i))u[e]||H(i[e]);for(let t of Object.getOwnPropertySymbols(u)){var f=u[t];t.description===`@attach`&&(!r||f!==r[t])&&(i[t]&&H(i[t]),i[t]=V(()=>Zi(e,()=>f))),d[t]=f}r=d}),c){var u=e;ur(()=>{la(u,r.value,!0),ua(u)})}l=!0})}function Ta(e){return e[he]??={[ma]:e.nodeName.includes(`-`),[ha]:e.namespaceURI===Ue}}var Ea=new Map;function Da(e){var t=e.getAttribute(`is`)||e.nodeName,n=Ea.get(t);if(n)return n;Ea.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=c(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.push(o);i=d(i)}return n}function Oa(e,t){return e===t||e?.[C]===t}function ka(e={},t,n,r){var i=j.r,a=K;return ur(()=>{var o,s;return fr(()=>{o=s,s=r?.()||[],qr(()=>{Oa(n(...s),e)||(t(e,...s),o&&Oa(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Oa(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Aa(e=!1){let t=j,n=t.l.u;if(!n)return;let r=()=>Jr(t.s);if(e){let e=0,n={},i=mn(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>Q(i)}n.b.length&&sr(()=>{ja(t,r),g(n.b)}),ar(()=>{let e=qr(()=>n.m.map(h));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&ar(()=>{ja(t,r),g(n.a)})}function ja(e,t){if(e.l.s)for(let t of e.l.s)Q(t);t()}var Ma={get(e,t){if(!e.exclude.has(t))return e.props[t]},set(e,t){return!1},getOwnPropertyDescriptor(e,t){if(!e.exclude.has(t)&&t in e.props)return{enumerable:!0,configurable:!0,value:e.props[t]}},has(e,t){return e.exclude.has(t)?!1:t in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(t=>!e.exclude.has(t))}};function Na(e,t,n){return new Proxy({props:e,exclude:t},Ma)}var Pa={get(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(p(r)&&(r=r()),typeof r==`object`&&r&&t in r)return r[t]}},set(e,t,n){let r=e.props.length;for(;r--;){let i=e.props[r];p(i)&&(i=i());let a=s(i,t);if(a&&a.set)return a.set(n),!0}return!1},getOwnPropertyDescriptor(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(p(r)&&(r=r()),typeof r==`object`&&r&&t in r){let e=s(r,t);return e&&!e.configurable&&(e.configurable=!0),e}}},has(e,t){if(t===C||t===pe)return!1;for(let n of e.props)if(p(n)&&(n=n()),n!=null&&t in n)return!0;return!1},ownKeys(e){let t=[];for(let n of e.props)if(p(n)&&(n=n()),n){for(let e in n)t.includes(e)||t.push(e);for(let e of Object.getOwnPropertySymbols(n))t.includes(e)||t.push(e)}return t}};function Fa(...e){return new Proxy({props:e},Pa)}function Ia(e,t,n,r){var i=!at||(n&2)!=0,a=(n&8)!=0,o=(n&16)!=0,c=r,l=!0,u=void 0,d=()=>o&&i?(u??=mn(r),Q(u)):(l&&(l=!1,c=o?qr(r):r),c);let f;if(a){var p=C in e||pe in e;f=s(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=Lt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Ie(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?mn:vn)(()=>(v=!1,g()));a&&Q(y);var b=K;return(function(e,t){if(arguments.length>0){let n=t?Q(y):i&&a?Fn(e):e;return I(y,n),v=!0,c!==void 0&&(c=n),e}return Or&&v||b.f&16384?y.v:Q(y)})}function La(e){return class extends Ra{constructor(t){super({component:e,...t})}}}var Ra=class{#e;#t;constructor(e){var t=new Map,n=(e,n)=>{var r=An(n,!1,!1);return t.set(e,r),r};let r=new Proxy({...e.props||{},$$events:{}},{get(e,r){return Q(t.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===pe?!0:(Q(t.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,i){return I(t.get(r)??n(r,i),i),Reflect.set(e,r,i)}});this.#t=(e.hydrate?Oi:Di)(e.component,{target:e.target,anchor:e.anchor,props:r,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError}),!A&&(!e?.props?.$$host||e.sync===!1)&&Yt(),this.#e=r.$$events;for(let e of Object.keys(this.#t))e===`$set`||e===`$destroy`||e===`$on`||o(this,e,{get(){return this.#t[e]},set(t){this.#t[e]=t},enumerable:!0});this.#t.$set=e=>{Object.assign(r,e)},this.#t.$destroy=()=>{Mi(this.#t)}}$set(e){this.#t.$set(e)}$on(e,t){this.#e[e]=this.#e[e]||[];let n=(...e)=>t.call(this,...e);return this.#e[e].push(n),()=>{this.#e[e]=this.#e[e].filter(e=>e!==n)}}$destroy(){this.#t.$destroy()}};function za(e,t){if(A||Se(`hydratable`),T){let t=window.__svelte?.h;if(t?.has(e))return t.get(e);Je(e)}return t()}var Ba=t({afterUpdate:()=>qa,beforeUpdate:()=>Ka,createContext:()=>ct,createEventDispatcher:()=>Ga,createRawSnippet:()=>qi,flushSync:()=>Yt,fork:()=>an,getAbortSignal:()=>Va,getAllContexts:()=>ft,getContext:()=>lt,hasContext:()=>dt,hydratable:()=>za,hydrate:()=>Oi,mount:()=>Di,onDestroy:()=>Ua,onMount:()=>Ha,setContext:()=>ut,settled:()=>Wr,tick:()=>Ur,unmount:()=>Mi,untrack:()=>qr});function Va(){return U===null&&Ne(),(U.ac??=new AbortController).signal}function Ha(e){j===null&&Ce(`onMount`),at&&j.l!==null?Ja(j).m.push(e):ar(()=>{let t=qr(e);if(typeof t==`function`)return t})}function Ua(e){j===null&&Ce(`onDestroy`),Ha(()=>()=>qr(e))}function Wa(e,t,{bubbles:n=!1,cancelable:r=!1}={}){return new CustomEvent(e,{detail:t,bubbles:n,cancelable:r})}function Ga(){let e=j;return e===null&&Ce(`createEventDispatcher`),(t,r,i)=>{let a=e.s.$$events?.[t];if(a){let o=n(a)?a.slice():[a],s=Wa(t,r,i);for(let t of o)t.call(e.x,s);return!s.defaultPrevented}return!0}}function Ka(e){j===null&&Ce(`beforeUpdate`),j.l===null&&Fe(`beforeUpdate`),Ja(j).b.push(e)}function qa(e){j===null&&Ce(`afterUpdate`),j.l===null&&Fe(`afterUpdate`),Ja(j).a.push(e)}function Ja(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}export{Ft as $,pi as A,pr as B,Ei as C,xi as D,yi as E,Wr as F,Gn as G,sr as H,Ur as I,I as J,Kn as K,qr as L,di as M,Xr as N,Ti as O,Q as P,It as Q,ur as R,Pi as S,Ci as T,zn as U,ar as V,Wn as W,_n as X,kn as Y,on as Z,Ji as _,Na as a,ut as at,zi as b,ka as c,Qe as ct,ca as d,t as dt,At as et,oa as f,Yi as g,Xi as h,Ia as i,pt as it,fi as j,Si as k,wa as l,m as lt,$i as m,Ha as n,dt as nt,Fa as o,ot,ea as p,Fn as q,La as r,mt as rt,Aa as s,$e as st,Ba as t,lt as tt,Sa as u,v as ut,Ki as v,wi as w,Fi as x,Gi as y,cr as z}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/DyVSz01m.js b/website/.svelte-kit/output/client/_app/immutable/chunks/DyVSz01m.js new file mode 100644 index 0000000..299dfab --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/DyVSz01m.js @@ -0,0 +1 @@ +import{F as e,I as t,J as n,P as r,Y as i,et as a,n as o,t as s}from"./Du04-Wio.js";var c=class{constructor(e,t){this.status=e,typeof t==`string`?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(){}function g(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function _(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&y.delete(x(e)),v(e,t));var y=new Map;function ee(e,t){let n=x(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent),i=r.getAttribute(`data-ttl`);return i&&y.set(n,{body:e,init:t,ttl:1e3*Number(i)}),r.getAttribute(`data-b64`)!==null&&(e=_(e)),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function b(e,t,n){if(y.size>0){let t=x(e,n),r=y.get(t);if(r){if(performance.now(){let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return se(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return se(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=te.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return se(e)}).join(``)}).join(``)}/?$`),params:t}}function ie(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function ae(e){return e.slice(1).split(`/`).filter(ie)}function oe(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;ee).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function se(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function ce({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=re(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return oe(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function le(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ue(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_op75zz?.base??``,de=globalThis.__sveltekit_op75zz?.assets??S??``,fe=`1780713979666`,pe=`sveltekit:snapshot`,me=`sveltekit:scroll`,he=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},ge=location.origin;function _e(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function E(){return{x:pageXOffset,y:pageYOffset}}function D(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var ve={...T,"":T.hover};function ye(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function be(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=ye(e)}}function xe(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||k(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===ge&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function O(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=D(s,`preload-code`)),i===null&&(i=D(s,`preload-data`)),t===null&&(t=D(s,`keepfocus`)),n===null&&(n=D(s,`noscroll`)),a===null&&(a=D(s,`reload`)),o===null&&(o=D(s,`replacestate`)),s=ye(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:ve[r??`off`],preload_data:ve[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Se(e){let t=a(e),n=!0;function r(){n=!0,t.update(e=>e)}function i(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:i,subscribe:o}}var Ce={v:h};function we(){let{set:e,subscribe:t}=a(!1);async function n(){clearTimeout(void 0);try{let t=await fetch(`${de}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let n=(await t.json()).version!==fe;return n&&(e(!0),Ce.v(),clearTimeout(void 0)),n}catch{return!1}}return{subscribe:t,check:n}}function k(e,t,n){return e.origin!==ge||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Te(e){}var Ee=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);new Set([...Ee,`entries`]);var De=new Set([...Ee]);new Set([...De,`actions`,`entries`]),new Set([`GET`,`POST`,`PATCH`,`PUT`,`DELETE`,`OPTIONS`,`HEAD`,`fallback`,`prerender`,`trailingSlash`,`config`,`entries`]);function Oe(e){return e.filter(e=>e!=null)}function A(e,t){return e+`/`+t}function ke(e){return e instanceof c||e instanceof u?e.status:500}function Ae(e){return e instanceof u?e.text:`Internal Error`}var j,M,N,je=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),Me=`a:`;je?(j={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Me)},M={current:null},N={current:!1}):(j=new class{#e=i({});get data(){return r(this.#e)}set data(e){n(this.#e,e)}#t=i(null);get form(){return r(this.#t)}set form(e){n(this.#t,e)}#n=i(null);get error(){return r(this.#n)}set error(e){n(this.#n,e)}#r=i({});get params(){return r(this.#r)}set params(e){n(this.#r,e)}#i=i({id:null});get route(){return r(this.#i)}set route(e){n(this.#i,e)}#a=i({});get state(){return r(this.#a)}set state(e){n(this.#a,e)}#o=i(-1);get status(){return r(this.#o)}set status(e){n(this.#o,e)}#s=i(new URL(Me));get url(){return r(this.#s)}set url(e){n(this.#s,e)}},M=new class{#e=i(null);get current(){return r(this.#e)}set current(e){n(this.#e,e)}},N=new class{#e=i(!1);get current(){return r(this.#e)}set current(e){n(this.#e,e)}},Ce.v=()=>N.current=!0);function Ne(e){Object.assign(j,e)}var{onMount:Pe,tick:Fe}=s,Ie=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),P=null,F=le(`sveltekit:scroll`)??{},I=le(`sveltekit:snapshot`)??{},L={url:Se({}),page:Se({}),navigating:a(null),updated:we()};function Le(e){F[e]=E()}function Re(e,t){let n=e+1;for(;F[n];)delete F[n],n+=1;for(n=t+1;I[n];)delete I[n],n+=1}function R(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(h)}async function ze(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var Be,Ve,z,B,He,V,Ue=[],H=[],U=null;function We(){U?.fork?.then(e=>e?.discard()),U=null}var Ge=new Map,Ke=new Set,qe=new Set,W=new Set,G={branch:[],error:null,url:null,nav:null},Je=!1,Ye=!1,Xe=!0,K=!1,q=!1,Ze=!1,Qe=!1,$e,J,Y,X,et=new Set,tt=new Map,nt=new Map;async function rt(e,t,n){globalThis.__sveltekit_op75zz&&(globalThis.__sveltekit_op75zz.query,globalThis.__sveltekit_op75zz.prerender),document.URL!==location.href&&(location.href=location.href),V=e,await e.hooks.init?.(),Be=ce(e),B=document.documentElement,He=t,Ve=e.nodes[0],z=e.nodes[1],Ve(),z(),J=history.state?.[C],Y=history.state?.[w],J||(J=Y=Date.now(),history.replaceState({...history.state,[C]:J,[w]:Y},``));let r=F[J];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await jt(He,n)):(await Q({type:`enter`,url:_e(V.hash?Lt(new URL(location.href)):location.href),replace_state:!0}),i()),At()}function it(){Ue.length=0,Qe=!1}function at(e){H.some(e=>e?.snapshot)&&(I[e]=H.map(e=>e?.snapshot?.capture()))}function ot(e){I[e]?.forEach((e,t)=>{H[t]?.snapshot?.restore(e)})}function st(){Le(J),ue(me,F),at(Y),ue(pe,I)}async function ct(e,n,r,i){let a,o;n.invalidateAll&&We(),await Q({type:`goto`,url:_e(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:r,nav_token:i,accept:()=>{if(n.invalidateAll){Qe=!0,a=new Set;for(let[e,t]of tt)for(let n of t.keys())a.add(A(e,n));o=new Set;for(let[e,t]of nt)for(let n of t.keys())o.add(A(e,n))}n.invalidate&&n.invalidate.forEach(kt)}}),n.invalidateAll&&t().then(t).then(()=>{for(let[e,t]of tt)for(let[n,{resource:r}]of t)a?.has(A(e,n))&&r.refresh();for(let[e,t]of nt)for(let[n,{resource:r}]of t)o?.has(A(e,n))&&r.reconnect()})}async function lt(e){if(e.id!==U?.id){We();let t={};et.add(t),U={id:e.id,token:t,promise:yt({...e,preload:t}).then(e=>(et.delete(t),e.type===`loaded`&&e.state.error&&We(),e)),fork:null}}return U.promise}async function ut(e){let t=(await Ct(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function dt(e,t,n){let r={params:G.params,route:{id:G.route?.id??null},url:new URL(location.href)};if(G={...e.state,nav:r},Ne(e.props.page),$e=new V.root({target:t,props:{...e.props,stores:L,components:H},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ot(Y),n){let e={from:null,to:{...r,scroll:F[J]??E()},willUnload:!1,type:`enter`,complete:Promise.resolve()};W.forEach(t=>t(e))}Ye=!0}async function ft({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Oe(n).map(e=>e.node.component),page:It(j)}};s!==void 0&&(l.props.form=s);let u={},f=!j,p=0;for(let e=0;et(new URL(e))))return!0;return!1}function gt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function _t(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function vt({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:It(j),constructors:[]}}}async function yt({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(U?.id===e)return et.delete(U.token),U.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(h)),d.forEach(e=>e?.[1]().catch(h));let f=G.url?e!==Z(G.url):!1,p=G.route?i.id!==G.route.id:!1,m=_t(G.url,n),g=!1,_=d.map(async(e,t)=>{if(!e)return;let a=G.branch[t];return e[1]===a?.loader&&!ht(g,p,f,m,a.universal?.uses,r)?a:(g=!0,pt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;nPromise.resolve({}),server_data_node:gt(null)}),{node:await z(),loader:z,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(e){if(e instanceof l)return ct(new URL(e.location,location.href),{},0);throw e}}async function St(e){let t=e.href;if(Ge.has(t))return Ge.get(t);let n;try{let r=(async()=>{let t=await V.hooks.reroute({url:new URL(e),fetch:async(t,n)=>mt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);V.hash?n.hash=t:n.pathname=t,t=n}return t})();Ge.set(t,r),n=await r}catch{Ge.delete(t);return}return n}async function Ct(e,t){if(e&&!k(e,S,V.hash)){let n=await St(e);if(!n)return;let r=wt(n);for(let n of Be){let i=n.exec(r);if(i)return{id:Z(e),invalidating:t,route:n,params:p(i),url:e}}}}function wt(e){return f(V.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function Z(e){return(V.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function Tt({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Ft(G,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return K||Ke.forEach(e=>e(c)),o?null:s}async function Q({type:n,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=h,block:p=h,event:m}){let g=X;X=d;let _=await Ct(r,!1),v=n===`enter`?Ft(G,_,r,n):Tt({url:r,type:n,delta:i?.delta,intent:_,scroll:i?.scroll,event:m});if(!v){p(),X===d&&(X=g);return}let y=J,ee=Y;f(),K=!0,Ye&&v.navigation.type!==`enter`&&L.navigating.set(M.current=v.navigation);let b=_&&await yt(_);if(!b){if(k(r,S,V.hash))return await R(r,s);b=await Et(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=_?.url||r,X!==d)return v.reject(Error(`navigation aborted`)),!1;if(b.type===`redirect`){if(l<20){await Q({type:n,url:new URL(b.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),v.fulfil(void 0);return}b=await xt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}})}else b.props.page.status>=400&&await L.updated.check()&&(await ze(),await R(r,s));if(it(),Le(y),at(ee),b.props.page.url.pathname!==r.pathname&&(r.pathname=b.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:J+=e,[w]:Y+=e,[he]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||Re(J,Y)}let x=_&&U?.id===_.id?U.fork:null;U?.fork&&!x&&We(),U=null,b.props.page.state=c;let te;if(Ye){let t=(await Promise.all(Array.from(qe,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(t.length>0){function e(){t.forEach(e=>{W.delete(e)})}t.push(e),t.forEach(e=>{W.add(e)})}let n=v.navigation.to;G={...b.state,nav:{params:n.params,route:n.route,url:n.url}},b.props.page&&(b.props.page.url=r);let i=x&&await x;i?te=i.commit():(P=null,$e.$set(b.props),P&&Object.assign(b.props.page,P),Ne(b.props.page),te=e?.()),Ze=!0}else await dt(b,He,!1);let{activeElement:ne}=document;if(await te,await t(),await t(),X!==d)return v.reject(Error(`navigation aborted`)),!1;b.props.page&&P&&Object.assign(b.props.page,P);let re=null;if(Xe){let e=i?i.scroll:o?E():null;e?scrollTo(e.x,e.y):(re=r.hash&&document.getElementById(Rt(r)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!a&&!ie&&Pt(r,!re),Xe=!0,K=!1,n===`popstate`&&ot(Y),v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=E()),W.forEach(e=>e(v.navigation)),L.navigating.set(M.current=null)}async function Et(e,t,n,r,i){return e.origin===ge&&e.pathname===location.pathname&&!Je?await xt({status:r,error:n,url:e,route:t}):await R(e,i)}function Dt(){let e,t={element:void 0,href:void 0},n;B.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{a(n,T.hover)},20)});function r(e){e.defaultPrevented||a(e.composedPath()[0],T.tap)}B.addEventListener(`mousedown`,r),B.addEventListener(`touchstart`,r,{passive:!0});let i=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(ut(new URL(t.target.href)),i.unobserve(t.target))},{threshold:0});async function a(e,r){let i=be(e,B),a=i===t.element&&i?.href===t.href&&r>=n;if(!i||a)return;let{url:o,external:s,download:c}=xe(i,S,V.hash);if(s||c)return;let l=O(i),u=o&&Z(G.url)===Z(o);if(!(l.reload||u))if(r<=l.preload_data){t={element:i,href:i.href},n=T.tap;let e=await Ct(o,!1);if(!e)return;lt(e)}else r<=l.preload_code&&(t={element:i,href:i.href},n=r,ut(o))}function o(){i.disconnect();for(let e of B.querySelectorAll(`a`)){let{url:t,external:n,download:r}=xe(e,S,V.hash);if(n||r)continue;let a=O(e);a.reload||(a.preload_code===T.viewport&&i.observe(e),a.preload_code===T.eager&&ut(t))}}W.add(o),o()}function $(e,t){if(e instanceof c)return e.body;let n=ke(e),r=Ae(e);return V.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Ot(e,t={}){return e=new URL(_e(e)),e.origin===ge?ct(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function kt(e){if(typeof e==`function`)Ue.push(e);else{let{href:t}=new URL(e,location.href);Ue.push(e=>e.href===t)}}function At(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(st(),!K){let e=Ft(G,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Ke.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&st()}),!navigator.connection?.saveData&&!/2g/.test(navigator.connection?.effectiveType)&&Dt(),B.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=be(t.composedPath()[0],B);if(!n)return;let{url:r,external:i,target:a,download:o}=xe(n,S,V.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=O(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol===`https:`||r.protocol===`http:`)||o)return;let[c,l]=(V.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){Tt({url:r,type:`link`,event:t})?K=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=G.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(q=!0,Le(J),e(r),!s.replace_state)return;q=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Q({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),B.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(k(r,S,!1))return;let i=e.target,a=O(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Q({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!Nt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(X={},n===J)return;let r=F[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=G.url?m(location)===m(G.url):!1;if(o===Y&&(Ze||s)){i!==j.state&&(j.state=i),e(a),F[J]=E(),r&&scrollTo(r.x,r.y),J=n;return}let c=n-J;await Q({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{J=n,Y=o},block:()=>{history.go(-c)},nav_token:X,event:t})}else q||(e(new URL(location.href)),V.hash&&location.reload())}),addEventListener(`hashchange`,()=>{q&&(q=!1,history.replaceState({...history.state,[C]:++J,[w]:Y},``,location.href))});for(let e of document.querySelectorAll(`link`))Ie.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&L.navigating.set(M.current=null)});function e(e){G.url=j.url=e,L.page.set(It(j)),L.page.notify()}}async function jt(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){Je=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await Ct(u,!1)||{}),d=Be.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Mt(r.uses)),pt({loader:V.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r{let a=history.state;Nt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),Nt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t{if(r.rangeCount===e.length){for(let t=0;t{a=e,o=t});return s.catch(h),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:E()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function It(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Lt(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Rt(e){let t;if(V.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{j as a,M as i,rt as n,N as o,L as r,Te as s,Ot as t}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/kNaey6uv.js b/website/.svelte-kit/output/client/_app/immutable/chunks/kNaey6uv.js new file mode 100644 index 0000000..2994da7 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/kNaey6uv.js @@ -0,0 +1 @@ +var e=`modulepreload`,t=function(e,t){return new URL(e,t).href},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};export{r as t}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/qiBCaaew.js b/website/.svelte-kit/output/client/_app/immutable/chunks/qiBCaaew.js new file mode 100644 index 0000000..91bca22 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/qiBCaaew.js @@ -0,0 +1 @@ +import{ot as e}from"./Du04-Wio.js";e(); \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/chunks/xihTtKlq.js b/website/.svelte-kit/output/client/_app/immutable/chunks/xihTtKlq.js new file mode 100644 index 0000000..afdd2d0 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/chunks/xihTtKlq.js @@ -0,0 +1 @@ +typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`); \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/entry/app.DyiyvRxF.js b/website/.svelte-kit/output/client/_app/immutable/entry/app.DyiyvRxF.js new file mode 100644 index 0000000..05e0afd --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/entry/app.DyiyvRxF.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BZeUAe05.js","../chunks/Du04-Wio.js","../chunks/BuBrZOIh.js","../chunks/xihTtKlq.js","../chunks/DozEvg9T.js","../chunks/DyVSz01m.js","../assets/0.D7nPmqCL.css","../nodes/1.BSJLBHmD.js","../nodes/2.DnuVmUIJ.js","../nodes/3.D0TU24-D.js","../chunks/qiBCaaew.js","../assets/3.DTuVOu2m.css","../nodes/4.DOawxC2l.js","../nodes/5.CZek6GP7.js","../nodes/6.ChPTFH0w.js","../nodes/7.BG-S3wet.js","../nodes/8.FgjeHYDF.js","../nodes/9.9IQ7DCMm.js","../nodes/10.CyIl61W5.js","../nodes/11.CBJLxlCn.js","../nodes/12.D8T_BCyX.js","../nodes/13.CfK385I2.js"])))=>i.map(i=>d[i]); +import{B as e,C as t,E as n,G as r,H as i,I as a,J as o,K as s,P as c,S as l,T as u,V as d,W as f,X as p,Y as m,_ as h,c as g,ct as _,i as v,it as y,k as b,n as x,r as S,rt as C,w}from"../chunks/Du04-Wio.js";import{t as T}from"../chunks/kNaey6uv.js";import"../chunks/xihTtKlq.js";var E={},D=n(`
`),O=n(` `,1);function k(n,S){y(S,!0);let T=v(S,`components`,23,()=>[]),E=v(S,`data_0`,3,null),k=v(S,`data_1`,3,null),A=v(S,`data_2`,3,null);i(()=>S.stores.page.set(S.page)),d(()=>{S.stores,S.page,S.constructors,T(),S.form,E(),k(),A(),S.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=S.stores.page.subscribe(()=>{c(j)&&(o(M,!0),a().then(()=>{o(N,document.title||`untitled page`,!0)}))});return o(j,!0),e});let P=p(()=>S.constructors[2]);var F=O(),I=r(F),L=e=>{let t=p(()=>S.constructors[0]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return E()},get form(){return S.form},get params(){return S.page.params},children:(e,t)=>{var n=u(),i=r(n),a=e=>{let t=p(()=>S.constructors[1]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return k()},get form(){return S.form},get params(){return S.page.params},children:(e,t)=>{var n=u();h(r(n),()=>c(P),(e,t)=>{g(t(e,{get data(){return A()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),w(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)},o=e=>{let t=p(()=>S.constructors[1]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return k()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)};l(i,e=>{S.constructors[2]?e(a):e(o,-1)}),w(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)},R=e=>{let t=p(()=>S.constructors[0]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return E()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)};l(I,e=>{S.constructors[1]?e(L):e(R,-1)});var z=s(I,2),B=n=>{var r=D(),i=f(r),a=n=>{var r=b();e(()=>t(r,c(N))),w(n,r)};l(i,e=>{c(M)&&e(a)}),_(r),w(n,r)};l(z,e=>{c(j)&&e(B)}),w(n,F),C()}var A=S(k),j=[()=>T(()=>import(`../nodes/0.BZeUAe05.js`),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url),()=>T(()=>import(`../nodes/1.BSJLBHmD.js`),__vite__mapDeps([7,1,5,3]),import.meta.url),()=>T(()=>import(`../nodes/2.DnuVmUIJ.js`),__vite__mapDeps([8,1,4,5,3]),import.meta.url),()=>T(()=>import(`../nodes/3.D0TU24-D.js`),__vite__mapDeps([9,1,2,3,10,11]),import.meta.url),()=>T(()=>import(`../nodes/4.DOawxC2l.js`),__vite__mapDeps([12,1,5,3,10]),import.meta.url),()=>T(()=>import(`../nodes/5.CZek6GP7.js`),__vite__mapDeps([13,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/6.ChPTFH0w.js`),__vite__mapDeps([14,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/7.BG-S3wet.js`),__vite__mapDeps([15,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/8.FgjeHYDF.js`),__vite__mapDeps([16,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/9.9IQ7DCMm.js`),__vite__mapDeps([17,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/10.CyIl61W5.js`),__vite__mapDeps([18,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/11.CBJLxlCn.js`),__vite__mapDeps([19,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/12.D8T_BCyX.js`),__vite__mapDeps([20,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/13.CfK385I2.js`),__vite__mapDeps([21,1,3,10]),import.meta.url)],M=[],N={"/":[3],"/docs":[4,[2]],"/docs/changelog":[5,[2]],"/docs/cli-reference":[6,[2]],"/docs/configuration":[7,[2]],"/docs/examples":[8,[2]],"/docs/getting-started":[9,[2]],"/docs/installation":[10,[2]],"/docs/providers":[11,[2]],"/docs/roadmap":[12,[2]],"/docs/usage":[13,[2]]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t);export{R as decode,F as decoders,N as dictionary,I as encoders,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/entry/start.CmvPVbW8.js b/website/.svelte-kit/output/client/_app/immutable/entry/start.CmvPVbW8.js new file mode 100644 index 0000000..f05e81b --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/entry/start.CmvPVbW8.js @@ -0,0 +1 @@ +import{n as e,s as t}from"../chunks/DyVSz01m.js";export{t as load_css,e as start}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/0.BZeUAe05.js b/website/.svelte-kit/output/client/_app/immutable/nodes/0.BZeUAe05.js new file mode 100644 index 0000000..55d933b --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/0.BZeUAe05.js @@ -0,0 +1,9 @@ +import{$ as e,A as t,B as n,E as r,G as i,H as a,J as o,K as s,L as c,M as l,P as u,Q as d,S as f,T as p,V as m,W as h,X as g,Y as _,Z as v,a as y,ct as b,dt as x,f as ee,h as S,i as C,it as w,j as T,n as E,o as D,q as O,rt as k,st as te,u as A,v as ne,w as j,y as M,z as N}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as re}from"../chunks/DozEvg9T.js";import{n as P,t as F}from"../chunks/BuBrZOIh.js";var I=x({prerender:()=>!0,ssr:()=>!0}),L=typeof window<`u`?window:void 0;typeof window<`u`&&window.document,typeof window<`u`&&window.navigator,typeof window<`u`&&window.location;function ie(e){let t=e.activeElement;for(;t?.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}new class{#e;#t;constructor(e={}){let{window:t=L,document:n=t?.document}=e;t!==void 0&&(this.#e=n,this.#t=v(e=>{let n=l(t,`focusin`,e),r=l(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?ie(this.#e):null}};function ae(e,t){switch(e){case`post`:m(t);break;case`pre`:a(t);break}}function R(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;ae(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=c(()=>n(t,o));return o=t,r})}function z(e,t,n){let r=N(()=>{let i=!1;R(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});m(()=>r)}function B(e,t,n){R(e,`post`,t,n)}function V(e,t,n){R(e,`pre`,t,n)}B.pre=V;function oe(e,t){z(e,`post`,t)}function se(e,t){z(e,`pre`,t)}oe.pre=se;function ce(e,t){switch(e){case`local`:return t.localStorage;case`session`:return t.sessionStorage}}var le=class{#e;#t;#n;#r;#i;#a=_(0);constructor(e,t,n={}){let{storage:r=`local`,serializer:i={serialize:JSON.stringify,deserialize:JSON.parse},syncTabs:a=!0,window:o=L}=n;if(this.#e=t,this.#t=e,this.#n=i,o===void 0)return;let s=ce(r,o);this.#r=s;let c=s.getItem(e);c===null?this.#c(t):this.#e=this.#s(c),a&&r===`local`&&(this.#i=v(()=>l(o,`storage`,this.#o)))}get current(){this.#i?.(),u(this.#a);let e=this.#s(this.#r?.getItem(this.#t))??this.#e,t=new WeakMap,n=r=>{if(r===null||r?.constructor.name===`Date`||typeof r!=`object`)return r;let i=t.get(r);return i||(i=new Proxy(r,{get:(e,t)=>(u(this.#a),n(Reflect.get(e,t))),set:(t,n,r)=>(o(this.#a,u(this.#a)+1),Reflect.set(t,n,r),this.#c(e),!0)}),t.set(r,i)),i};return n(e)}set current(e){this.#c(e),o(this.#a,u(this.#a)+1)}#o=e=>{e.key!==this.#t||e.newValue===null||(this.#e=this.#s(e.newValue),o(this.#a,u(this.#a)+1))};#s(e){try{return this.#n.deserialize(e)}catch(t){console.error(`Error when parsing "${e}" from persisted store "${this.#t}"`,t);return}}#c(e){try{e!=null&&this.#r?.setItem(this.#t,this.#n.serialize(e))}catch(e){console.error(`Error when writing value from persisted store "${this.#t}" to ${this.#r}`,e)}}};function ue(e,t){let n,r=null;return(...i)=>new Promise(a=>{r&&r(void 0),r=a,clearTimeout(n),n=setTimeout(async()=>{let t=await e(...i);r&&=(r(t),null)},t)})}function de(e,t){let n=0,r=null;return(...i)=>{let a=Date.now();return n&&a-n{u(m).forEach(e=>e()),o(m,[],!0)},g=e=>{o(m,[...u(m),e],!0)},v=async(e,n,r=!1)=>{try{o(f,!0),o(p,void 0),h();let i=new AbortController;g(()=>i.abort());let a=await t(e,n,{data:u(d),refetching:r,onCleanup:g,signal:i.signal});return o(d,a,!0),a}catch(e){e instanceof DOMException&&e.name===`AbortError`||o(p,e,!0);return}finally{o(f,!1)}},y=c?ue(v,c):l?de(v,l):v,b=Array.isArray(e)?e:[e],x;return r((t,n)=>{a&&x||x&&JSON.stringify(t)===JSON.stringify(x)||(x=t,y(Array.isArray(e)?t:t[0],Array.isArray(e)?n:n?.[0]))},{lazy:i}),{get current(){return u(d)},get loading(){return u(f)},get error(){return u(p)},mutate:e=>{o(d,e,!0)},refetch:t=>{let n=b.map(e=>e());return y(Array.isArray(e)?n:n[0],Array.isArray(e)?n:n[0],t??!0)}}}function pe(e,t,n){return fe(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];B(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}function me(e,t,n){return fe(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];B.pre(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}pe.pre=me;function he(e){return e.filter(e=>e.length>0)}var ge={getItem:e=>null,setItem:(e,t)=>{}},H=typeof document<`u`;function _e(e){return typeof e==`function`}function ve(e){return typeof e==`object`&&!!e}var U=Symbol(`box`),W=Symbol(`is-writable`);function ye(e){return ve(e)&&U in e}function be(e){return G.isBox(e)&&W in e}function G(e){let t=_(O(e));return{[U]:!0,[W]:!0,get current(){return u(t)},set current(e){o(t,e,!0)}}}function xe(e,t){let n=g(e);return t?{[U]:!0,[W]:!0,get current(){return u(n)},set current(e){t(e)}}:{[U]:!0,get current(){return e()}}}function Se(e){return G.isBox(e)?e:_e(e)?G.with(e):G(e)}function Ce(e){return Object.entries(e).reduce((e,[t,n])=>G.isBox(n)?(G.isWritableBox(n)?Object.defineProperty(e,t,{get(){return n.current},set(e){n.current=e}}):Object.defineProperty(e,t,{get(){return n.current}}),e):Object.assign(e,{[t]:n}),{})}function we(e){return G.isWritableBox(e)?{[U]:!0,get current(){return e.current}}:e}G.from=Se,G.with=xe,G.flatten=Ce,G.readonly=we,G.isBox=ye,G.isWritableBox=be;function Te(e,t){let n=RegExp(e,`g`);return e=>{if(typeof e!=`string`)throw TypeError(`expected an argument of type string, but got ${typeof e}`);return e.match(n)?e.replace(n,t):e}}var Ee=Te(/[A-Z]/,e=>`-${e.toLowerCase()}`);function De(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`expected an argument of type object, but got ${typeof e}`);return Object.keys(e).map(t=>`${Ee(t)}: ${e[t]};`).join(` +`)}function Oe(e={}){return De(e).replace(` +`,` `)}Oe({position:`absolute`,width:`1px`,height:`1px`,padding:`0`,margin:`-1px`,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,borderWidth:`0`,transform:`translateX(-100%)`});var ke=typeof window<`u`?window:void 0;typeof window<`u`&&window.document,typeof window<`u`&&window.navigator,typeof window<`u`&&window.location;function Ae(e){let t=e.activeElement;for(;t?.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}new class{#e;#t;constructor(e={}){let{window:t=ke,document:n=t?.document}=e;t!==void 0&&(this.#e=n,this.#t=v(e=>{let n=l(t,`focusin`,e),r=l(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?Ae(this.#e):null}};function je(e,t){switch(e){case`post`:m(t);break;case`pre`:a(t);break}}function K(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;je(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=c(()=>n(t,o));return o=t,r})}function Me(e,t,n){let r=N(()=>{let i=!1;K(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});m(()=>r)}function Ne(e,t,n){K(e,`post`,t,n)}function Pe(e,t,n){K(e,`pre`,t,n)}Ne.pre=Pe;function Fe(e,t){Me(e,`post`,t)}function Ie(e,t){Me(e,`pre`,t)}Fe.pre=Ie;var q=G(`mode-watcher-mode`),J=G(`mode-watcher-theme`),Le=[`dark`,`light`,`system`];function Re(e){return typeof e==`string`?Le.includes(e):!1}var ze=class{#e=`system`;#t=H?localStorage:ge;#n=this.#t.getItem(q.current);#r=Re(this.#n)?this.#n:this.#e;#i=_(O(this.#a()));#a(e=this.#r){return new le(q.current,e,{serializer:{serialize:e=>e,deserialize:e=>Re(e)?e:this.#e}})}constructor(){N(()=>B.pre(()=>q.current,(e,t)=>{let n=u(this.#i).current;o(this.#i,this.#a(n),!0),t&&localStorage.removeItem(t)}))}get current(){return u(this.#i).current}set current(e){u(this.#i).current=e}},Be=class{#e=void 0;#t=!0;#n=_(O(this.#e));#r=typeof window<`u`&&typeof window.matchMedia==`function`?new P(`prefers-color-scheme: light`):{current:!1};query(){H&&o(this.#n,this.#r.current?`light`:`dark`,!0)}tracking(e){this.#t=e}constructor(){N(()=>{a(()=>{this.#t&&this.query()})}),this.query=this.query.bind(this),this.tracking=this.tracking.bind(this)}get current(){return u(this.#n)}},Ve=new ze,He=new Be,Y=new class{#e=H?localStorage:ge;#t=this.#e.getItem(J.current);#n=this.#t===null||this.#t===void 0?``:this.#t;#r=_(O(this.#i()));#i(e=this.#n){return new le(J.current,e,{serializer:{serialize:e=>typeof e==`string`?e:``,deserialize:e=>e}})}constructor(){N(()=>B.pre(()=>J.current,(e,t)=>{let n=u(this.#r).current;o(this.#r,this.#i(n),!0),t&&localStorage.removeItem(t)}))}get current(){return u(this.#r).current}set current(e){u(this.#r).current=e}},Ue,We,Ge=!1,X=null;function Ke(){return X||(X=document.createElement(`style`),X.appendChild(document.createTextNode(`* { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; + }`)),X)}function qe(e,t=!1){if(typeof document>`u`)return;if(!Ge){Ge=!0,e();return}if(typeof window<`u`&&window.__vitest_worker__){e();return}clearTimeout(Ue),clearTimeout(We);let n=Ke(),r=()=>document.head.appendChild(n),i=()=>{n.parentNode&&document.head.removeChild(n)};function a(){e(),window.requestAnimationFrame(i)}if(window.requestAnimationFrame!==void 0){r(),t?a():window.requestAnimationFrame(()=>{a()});return}r(),Ue=window.setTimeout(()=>{e(),We=window.setTimeout(i,16)},16)}var Z=G(void 0),Q=G(!0),$=G(!1),Je=G([]),Ye=G([]);function Xe(){let e=g(()=>{if(!H)return;let e=Ve.current===`system`?He.current:Ve.current,t=he(Je.current),n=he(Ye.current);function r(){let r=document.documentElement,i=document.querySelector(`meta[name="theme-color"]`);e===`light`?(t.length&&r.classList.remove(...t),n.length&&r.classList.add(...n),r.style.colorScheme=`light`,i&&Z.current&&i.setAttribute(`content`,Z.current.light)):(n.length&&r.classList.remove(...n),t.length&&r.classList.add(...t),r.style.colorScheme=`dark`,i&&Z.current&&i.setAttribute(`content`,Z.current.dark))}return Q.current?qe(r,$.current):r(),e});return{get current(){return u(e)}}}function Ze(){let e=g(()=>{if(Y.current,!H)return;function e(){document.documentElement.setAttribute(`data-theme`,Y.current)}return Q.current?qe(e,c(()=>$.current)):e(),Y.current});return{get current(){return u(e)}}}var Qe=Xe(),$e=Ze();function et(e){Ve.current=e}function tt(e){Y.current=e}function nt(e){return e}function rt({defaultMode:e=`system`,themeColors:t,darkClassNames:n=[`dark`],lightClassNames:r=[],defaultTheme:i=``,modeStorageKey:a=`mode-watcher-mode`,themeStorageKey:o=`mode-watcher-theme`}){let s=document.documentElement,c=localStorage.getItem(a)??e,l=localStorage.getItem(o)??i,u=c===`light`||c===`system`&&window.matchMedia(`(prefers-color-scheme: light)`).matches;if(u?(n.length&&s.classList.remove(...n.filter(Boolean)),r.length&&s.classList.add(...r.filter(Boolean))):(r.length&&s.classList.remove(...r.filter(Boolean)),n.length&&s.classList.add(...n.filter(Boolean))),s.style.colorScheme=u?`light`:`dark`,t){let e=document.querySelector(`meta[name="theme-color"]`);e&&e.setAttribute(`content`,c===`light`?t.light:t.dark)}l&&(s.setAttribute(`data-theme`,l),localStorage.setItem(o,l)),localStorage.setItem(a,c)}var it=r(``);function at(e,t){w(t,!0);var r=p(),a=i(r),o=e=>{var r=it();n(()=>A(r,`content`,t.themeColors.dark)),j(e,r)};f(a,e=>{t.themeColors&&e(o)}),j(e,r),k()}var ot=r(``),st=r(` `,1);function ct(e,t){w(t,!0);let r=C(t,`trueNonce`,3,``);S(`1funsus`,e=>{var a=st(),o=i(a),c=e=>{var r=ot();n(()=>A(r,`content`,t.themeColors.dark)),j(e,r)};f(o,e=>{t.themeColors&&e(c)}),M(s(o,2),()=>`(`+rt.toString()+`)(`+JSON.stringify(t.initConfig)+`);<\/script>`),j(e,a)}),k()}function lt(e,t){w(t,!0);let n=C(t,`track`,3,!0),r=C(t,`defaultMode`,3,`system`),o=C(t,`disableTransitions`,3,!0),s=C(t,`darkClassNames`,19,()=>[`dark`]),c=C(t,`lightClassNames`,19,()=>[]),l=C(t,`defaultTheme`,3,``),d=C(t,`nonce`,3,``),m=C(t,`themeStorageKey`,3,`mode-watcher-theme`),h=C(t,`modeStorageKey`,3,`mode-watcher-mode`),_=C(t,`disableHeadScriptInjection`,3,!1),v=C(t,`synchronousModeChanges`,3,!1);q.current=h(),J.current=m(),Je.current=s(),Ye.current=c(),Q.current=o(),Z.current=t.themeColors,$.current=v(),a(()=>{$.current=v()}),a(()=>{Q.current=o()}),a(()=>{Z.current=t.themeColors}),a(()=>{Je.current=s()}),a(()=>{Ye.current=c()}),a(()=>{q.current=h()}),a(()=>{J.current=m()}),a(()=>{Qe.current,q.current,J.current,$e.current}),E(()=>{He.tracking(n()),He.query();let e=localStorage.getItem(q.current);et(Re(e)?e:r()),tt(localStorage.getItem(J.current)||l())});let y=nt({defaultMode:r(),themeColors:t.themeColors,darkClassNames:s(),lightClassNames:c(),defaultTheme:l(),modeStorageKey:h(),themeStorageKey:m()}),b=g(()=>typeof window>`u`?d():``);var x=p(),ee=i(x),S=e=>{at(e,{get themeColors(){return Z.current}})},T=e=>{ct(e,{get trueNonce(){return u(b)},get initConfig(){return y},get themeColors(){return Z.current}})};f(ee,e=>{_()?e(S):e(T,-1)}),j(e,x),k()}var ut=new Set([`$$slots`,`$$events`,`$$legacy`]);function dt(e,t){let n=y(t,ut),r=[[`path`,{d:`M4 5h16`}],[`path`,{d:`M4 12h16`}],[`path`,{d:`M4 19h16`}]];F(e,D({name:`menu`},()=>n,{get iconNode(){return r}}))}var ft=new Set([`$$slots`,`$$events`,`$$legacy`]);function pt(e,t){let n=y(t,ft),r=[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`}]];F(e,D({name:`moon`},()=>n,{get iconNode(){return r}}))}var mt=new Set([`$$slots`,`$$events`,`$$legacy`]);function ht(e,t){let n=y(t,mt),r=[[`circle`,{cx:`12`,cy:`12`,r:`4`}],[`path`,{d:`M12 2v2`}],[`path`,{d:`M12 20v2`}],[`path`,{d:`m4.93 4.93 1.41 1.41`}],[`path`,{d:`m17.66 17.66 1.41 1.41`}],[`path`,{d:`M2 12h2`}],[`path`,{d:`M20 12h2`}],[`path`,{d:`m6.34 17.66-1.41 1.41`}],[`path`,{d:`m19.07 4.93-1.41 1.41`}]];F(e,D({name:`sun`},()=>n,{get iconNode(){return r}}))}var gt=new Set([`$$slots`,`$$events`,`$$legacy`]);function _t(e,t){let n=y(t,gt),r=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]];F(e,D({name:`x`},()=>n,{get iconNode(){return r}}))}var vt=r(``),yt=r(` `,1);function bt(t,r){w(r,!0);let a=()=>e(re,`$page`,c),[c,l]=d(),p=g(()=>a().url.pathname.startsWith(`/docs`)),m=_(!1);var v=yt(),y=i(v);lt(y,{});var x=s(y,2),S=h(x),C=h(S),E=s(h(C),2),D=h(E);let O;te(4),b(E);var A=s(E,2),M=h(A),N=h(M);ht(N,{class:`w-4 h-4 hidden dark:block`}),pt(s(N,2),{class:`w-4 h-4 block dark:hidden`}),b(M),te(2),b(A);var P=s(A,2),F=h(P),I=h(F);ht(I,{class:`w-4 h-4 hidden dark:block`}),pt(s(I,2),{class:`w-4 h-4 block dark:hidden`}),b(F);var L=s(F,2),ie=h(L),ae=e=>{_t(e,{class:`w-5 h-5`})},R=e=>{dt(e,{class:`w-5 h-5`})};f(ie,e=>{u(m)?e(ae):e(R,-1)}),b(L),b(P),b(C);var z=s(C,2),B=e=>{var t=vt(),n=h(t),r=s(n,2),i=s(r,4),a=h(i);b(i),b(t),T(`click`,n,()=>o(m,!1)),T(`click`,r,()=>o(m,!1)),T(`click`,a,()=>o(m,!1)),j(e,t)};f(z,e=>{u(m)&&e(B)}),b(S);var V=s(S,2);ne(h(V),()=>r.children),b(V),b(x),n(()=>O=ee(D,1,`site-header-link`,null,O,{active:u(p)})),T(`click`,M,()=>{let e=document.documentElement.classList.contains(`dark`);document.documentElement.classList.toggle(`dark`,!e),localStorage.setItem(`mode`,e?`light`:`dark`)}),T(`click`,F,()=>{let e=document.documentElement.classList.contains(`dark`);document.documentElement.classList.toggle(`dark`,!e),localStorage.setItem(`mode`,e?`light`:`dark`)}),T(`click`,L,()=>o(m,!u(m))),j(t,v),k(),l()}t([`click`]);export{bt as component,I as universal}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/1.BSJLBHmD.js b/website/.svelte-kit/output/client/_app/immutable/nodes/1.BSJLBHmD.js new file mode 100644 index 0000000..d4066dd --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/1.BSJLBHmD.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,G as r,K as i,W as a,ct as o,it as s,rt as c,w as l}from"../chunks/Du04-Wio.js";import{a as u,i as d,r as f}from"../chunks/DyVSz01m.js";import"../chunks/xihTtKlq.js";var p={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};Object.defineProperty({get from(){return d.current?d.current.from:null},get to(){return d.current?d.current.to:null},get type(){return d.current?d.current.type:null},get willUnload(){return d.current?d.current.willUnload:null},get delta(){return d.current?d.current.delta:null},get complete(){return d.current?d.current.complete:null}},"current",{get(){throw Error(`Replace navigating.current. with navigating.`)}}),f.updated.check;var m=p,h=n(`

`,1);function g(n,u){s(u,!0);var d=h(),f=r(d),p=a(f,!0);o(f);var g=i(f,2),_=a(g,!0);o(g),e(()=>{t(p,m.status),t(_,m.error?.message)}),l(n,d),c()}export{g as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/10.CyIl61W5.js b/website/.svelte-kit/output/client/_app/immutable/nodes/10.CyIl61W5.js new file mode 100644 index 0000000..216d2b7 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/10.CyIl61W5.js @@ -0,0 +1 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(`

Installation

Prerequisites

cora is a Rust binary. You have two installation paths:

Via Cargo (recommended) — Requires Rust 1.85 or later with Cargo installed
Binary download — No Rust required; just download and place in your PATH

cora works on Linux (x86_64 and arm64), macOS (arm64), and Windows.

Install via Cargo

The recommended way to install cora is through Cargo:

$ cargo install cora-cli

This compiles cora from source and installs it to Cargo's binary directory (typically ~/.cargo/bin/).

Download Binary

Pre-built binaries are available from the GitHub Releases page.

Supported platforms:

Linux x86_64 (glibc)
Linux arm64 (aarch64)
macOS arm64 (Apple Silicon)
Windows x86_64
# Download and extract
$ curl -sL https://github.com/codecoradev/cora-cli/releases/latest/download/cora-linux-x86_64.tar.gz | tar xz
$ mv cora ~/.local/bin/cora

Build from Source

If you prefer to build from the latest source:

$ git clone https://github.com/codecoradev/cora-cli.git
$ cd cora-cli
$ cargo build --release
# Binary at target/release/cora

Shell Completions

cora provides shell completions for bash, zsh, and fish:

# Bash
$ cora completion bash > ~/.cora/completion.bash
$ echo 'source ~/.cora/completion.bash' >> ~/.bashrc
# Zsh
$ cora completion zsh > ~/.cora/completion.zsh
$ echo 'source ~/.cora/completion.zsh' >> ~/.zshrc
# Fish
$ cora completion fish > ~/.config/fish/completions/cora.fish

Verify Installation

Confirm cora is installed correctly:

$ cora --version
cora 0.x.x
$ cora auth status
Provider: openai
API key: configured

Updating

To update cora to the latest version:

Via Cargo: cargo install cora-cli --force
Via Binary: Download the latest release from GitHub and replace the existing binary
`);function u(e,u){i(u,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),s();var d=l();r(`t7c0hb`,e=>{t(()=>{n.title=`Installation — cora docs`})}),c(e,d),o()}export{u as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/11.CBJLxlCn.js b/website/.svelte-kit/output/client/_app/immutable/nodes/11.CBJLxlCn.js new file mode 100644 index 0000000..811c9a5 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/11.CBJLxlCn.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,K as r,R as i,U as a,W as o,b as s,ct as c,h as l,it as u,n as d,rt as f,s as p,st as m,w as h,x as g}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var _=n(``),v=n(`
`),y=n(`

Providers

cora supports multiple AI providers. Use your own API key — no subscriptions to us.

Supported Providers

ProviderDefault ModelEnv VarCustom Base URL
OpenAIgpt-4o-miniOPENAI_API_KEYOPENAI_BASE_URL
Anthropicclaude-sonnet-4-20250514ANTHROPIC_API_KEYANTHROPIC_BASE_URL
Groqllama-3.1-8b-instantGROQ_API_KEYGROQ_BASE_URL
Ollamallama3.1— (local)OLLAMA_HOST (default: http://localhost:11434)
Z.AIglm-5.1ZAI_API_KEYZAI_BASE_URL

Auto-Detection

cora automatically detects which provider to use by checking environment variables in this order:

Override auto-detection with CORA_PROVIDER env var or --provider flag.

Usage Examples

# Use OpenAI (auto-detected from OPENAI_API_KEY)
$ OPENAI_API_KEY=sk-... cora review --staged
# Use Anthropic with explicit provider
$ CORA_PROVIDER=anthropic CORA_API_KEY=sk-ant-... cora review --staged
# Use Ollama locally (no API key needed)
$ CORA_PROVIDER=ollama cora review --staged
# Use a custom model
$ CORA_MODEL=gpt-4o-mini cora review --staged
`);function b(n,b){u(b,!1),d(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),p();var x=y();l(`1s16pkr`,e=>{var t=_();i(()=>{a.title=`Providers — cora docs`}),h(e,t)});var S=r(o(x),6),C=r(o(S),4);s(C,4,()=>[`OPENAI_API_KEY → uses OpenAI`,`ANTHROPIC_API_KEY → uses Anthropic`,`GROQ_API_KEY → uses Groq`,`ZAI_API_KEY → uses Z.AI`,`OLLAMA_HOST → uses Ollama (localhost)`],g,(n,i,a)=>{var s=v(),l=o(s);l.textContent=a+1;var u=r(l,2),d=o(u,!0);c(u),c(s),e(()=>t(d,i)),h(n,s)}),c(C),m(2),c(S),m(2),c(x),h(n,x),f()}export{b as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/12.D8T_BCyX.js b/website/.svelte-kit/output/client/_app/immutable/nodes/12.D8T_BCyX.js new file mode 100644 index 0000000..a935c69 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/12.D8T_BCyX.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,G as r,K as i,R as a,S as o,U as s,W as c,b as l,ct as u,h as d,st as f,u as p,w as m,x as h}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var g=n(`
✓ Done
`),_=n(`✓ Done`),v=n(`◎ Planned`),y=n(`
`),b=n(`
→ Planned
`),x=n(`

Roadmap

Demand-gated — we build what people actually need. Track progress on GitHub Issues.

v0.1.5 Initial Release

v0.1.6 Custom Prompts & Path Injection

v0.1.7 Deterministic & Reliable

v0.2.0 Multi-Provider & SARIF

v0.3 Progress & CI Hardening

v0.4 Deterministic Engine Pipeline

v0.5 Install & Distribution

Future What's Next

`,1);function S(n){var S=x();d(`5gq709`,e=>{a(()=>{s.title=`Roadmap — cora Docs`})});var C=i(r(S),4),w=c(C),T=i(c(w),2);l(T,4,()=>[{title:`Basic diff review with OpenAI`,issue:90},{title:`JSON response repair & unicode handling`,issue:89},{title:`CLI interface with review command`,issue:90}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(T),u(w);var E=i(w,2),D=i(c(E),2);l(D,4,()=>[{title:`Enhanced default system prompts`,issue:95},{title:`Custom system prompt via .cora.yaml config`,issue:94},{title:`Inject valid file paths into system prompt`,issue:93},{title:`JSON object response format (opt-in)`,issue:92}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(D),u(E);var O=i(E,2),k=i(c(O),2);l(k,4,()=>[{title:`Deterministic reviews — temperature=0`,issue:98},{title:`Non-deterministic output bug fix`,issue:97},{title:`HTTP timeout + connection pooling`,issue:99},{title:`Diff-hash caching for repeat reviews`,issue:100},{title:`Configurable max_tokens`,issue:101}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(k),u(O);var A=i(O,2),j=i(c(A),2);l(j,4,()=>[{title:`BYOK — Anthropic, Groq, Ollama support`,issue:106},{title:`SARIF output format`,issue:106},{title:`Branch review mode`,issue:106},{title:`Output footer watermark`,issue:106}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(j),u(A);var M=i(A,2),N=i(c(M),2);l(N,4,()=>[{title:`Static analysis context injection (reduce false positives)`,issue:140},{title:`--progress flag for machine-readable output`,issue:108},{title:`Composite action crash fix (KeyError)`,issue:102},{title:`Config validate command`,issue:88}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(N),u(M);var P=i(M,2),F=i(c(P),2);l(F,4,()=>[{title:`Deterministic rule engine — 12 built-in rules`,issue:116},{title:`File bundling — parallel per-bundle review`,issue:115},{title:`AST-based cross-file dependency extraction`,issue:114},{title:`Hunk header regex panic fix + 5MB diff support`,issue:159}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(F),u(P);var I=i(P,2),L=i(c(I),2);l(L,4,()=>[{title:`Easy install — Homebrew tap & install script`,issue:151,status:`done`},{title:`CI gate mode — block PRs on review findings`,issue:149,status:`done`},{title:`Website redesign — landing page + docs`,issue:163,status:`done`},{title:`Interactive auth login with tiered provider selection`,issue:172,status:`done`},{title:`README overhaul — market-facing copy`,issue:162,status:`planned`}],h,(n,r)=>{var a=y(),s=c(a),l=c(s),d=c(l);u(l);var f=i(l,2),h=c(f,!0);u(f),u(s);var g=i(s,2),b=e=>{m(e,_())},x=e=>{m(e,v())};o(g,e=>{r.status===`done`?e(b):e(x,-1)}),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(d,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(L),u(I);var R=i(I,2),z=i(c(R),2);l(z,4,()=>[{title:`Lightweight agent follow-up — 1 capped tool-call`,issue:117},{title:"`cora gain` — local productivity stats + viral sharing",issue:161},{title:`GitHub App backend MVP in Rust (Axum)`,issue:132},{title:`Publish cora-review as GitHub Marketplace action`,issue:47}],h,(n,r)=>{var a=b(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(z),u(R),u(C),m(n,S)}export{S as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/13.CfK385I2.js b/website/.svelte-kit/output/client/_app/immutable/nodes/13.CfK385I2.js new file mode 100644 index 0000000..0046c4d --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/13.CfK385I2.js @@ -0,0 +1 @@ +import{E as e,K as t,R as n,U as r,W as i,ct as a,h as o,it as s,n as c,rt as l,s as u,st as d,w as f}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var p=e(`

Usage

Review Modes

cora supports multiple review modes, each suited to a different workflow:

ModeFlagScopeBest For
Default(no flag)Tries staged first, then unpushedQuick feedback
Staged--stagedFiles in git staging areaPre-commit review
Unstaged--unstagedUnstaged working changesReview work in progress
Unpushed--unpushedCommits not yet pushedReview before push
Base Branch--base <branch>Diff against base branchPR review workflow
Commit--commit <ref>Specific commit or rangeReview specific changes
Diff File--diff-file <path>External diff fileReview patch files
# Review staged changes (default)
$ cora review
# Review against a branch
$ cora review --base main
# Review a specific commit
$ cora review --commit HEAD
# Review from a diff file
$ cora review --diff-file pr.diff
# Full project scan (use cora scan)
$ cora scan .

Output Formats

cora can output results in three formats:

--format pretty — Human-readable terminal output (default)
--format json — Machine-readable JSON for CI/CD pipelines
--format sarif — SARIF format for GitHub Code Scanning
# JSON output example
$ cora review --staged --format json
"files": [
"path": "src/auth/login.ts",
"issues": [
"line": 42,
"severity": "warning",
"message": "Potential SQL injection"
]
],
"summary"
"total_files": 3,
"total_issues": 3

Configuration File

The .cora.yaml file provides persistent configuration. Place it in your project root. API keys are stored at ~/.cora/config.toml.

# .cora.yaml — example
review:
severity: warning
focus: security,performance
ignore:
- "vendor/**"
- "*.min.js"
providers:
openai:
model: gpt-4o

Environment Variables

Environment variables override configuration file settings:

VariableDescriptionRequired
CORA_API_KEYAPI key for the configured providerYes (unless using cora auth)
CORA_PROVIDEROverride the LLM providerNo
CORA_MODELOverride the model nameNo
CORA_BASE_URLOverride the API base URLNo
CORA_CONFIGPath to alternative config fileNo

Working with Monorepos

cora works well in monorepo setups. Use include patterns to limit review scope to specific packages:

# Review only the backend package
$ cora review --staged --include "packages/backend/**"
# Exclude test and generated files
$ cora review --staged --exclude "**/*.test.ts" --exclude "**/generated/**"

Alternatively, set include/exclude patterns in .cora.yaml for persistent configuration.

Exit Codes

cora uses standard exit codes for scripting and CI integration:

CodeMeaningCI Behavior
0No issues foundPass
1Issues foundFail (warning/error)
2Review blockedFail (auth/config error)
3Authentication errorFail (missing API key)

Tips

Use cora review with no flags for the fastest pre-commit feedback
Combine --format json with --base main in CI pipelines
Use cora scan . --incremental for large codebases — only changed files are analyzed
Use --quiet for minimal output and --severity to filter by severity level
Use cora auth login to store API keys securely instead of environment variables
`);function m(e,m){s(m,!1),c(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),u();var h=p();o(`1hpl1g`,e=>{n(()=>{r.title=`Usage — cora docs`})});var g=t(i(h),4),_=t(i(g),6),v=t(i(_),2),y=t(i(v),6);y.textContent=`{`;var b=t(y,4);b.textContent=`{`;var x=t(b,6);x.textContent=`{`;var S=t(x,8);S.textContent=`}`;var C=t(S,4);C.textContent=`}`;var w=t(C,4),T=t(i(w));T.nodeValue=`: {`,a(w);var E=t(w,6);E.textContent=`}`;var D=t(E,2);D.textContent=`}`,a(v),a(_),a(g),d(10),a(h),f(e,h),l()}export{m as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/2.DnuVmUIJ.js b/website/.svelte-kit/output/client/_app/immutable/nodes/2.DnuVmUIJ.js new file mode 100644 index 0000000..bf551f5 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/2.DnuVmUIJ.js @@ -0,0 +1 @@ +import{$ as e,B as t,C as n,E as r,K as i,P as a,Q as o,R as s,U as c,W as l,b as u,ct as d,f,h as p,it as m,rt as h,u as g,v as _,w as v,x as y}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as b}from"../chunks/DozEvg9T.js";var x=r(` `),S=r(``);function C(r,C){m(C,!0);let w=()=>e(b,`$page`,T),[T,E]=o(),D=[{href:`/docs/getting-started`,label:`Getting Started`},{href:`/docs/installation`,label:`Installation`},{href:`/docs/usage`,label:`Usage`},{href:`/docs/configuration`,label:`Configuration`},{href:`/docs/providers`,label:`Providers`},{href:`/docs/examples`,label:`Examples`},{href:`/docs/roadmap`,label:`Roadmap`},{href:`/docs/cli-reference`,label:`CLI Reference`},{href:`/docs/changelog`,label:`Changelog`}];var O=S();p(`1bpnej`,e=>{s(()=>{c.title=`Docs — cora`})});var k=l(O),A=l(k),j=i(l(A),4);u(j,21,()=>D,y,(e,r)=>{var i=x();let o;var s=l(i,!0);d(i),t(()=>{g(i,`href`,a(r).href),o=f(i,1,`docs-sidebar-link`,null,o,{active:w().url.pathname===a(r).href}),n(s,a(r).label)}),v(e,i)}),d(j),d(A),d(k);var M=i(k,2);u(i(l(M),2),17,()=>D,y,(e,r)=>{var i=x();let o;var s=l(i,!0);d(i),t(()=>{g(i,`href`,a(r).href),o=f(i,1,``,null,o,{active:w().url.pathname===a(r).href}),n(s,a(r).label)}),v(e,i)}),d(M);var N=i(M,2),P=l(N);_(l(P),()=>C.children),d(P),d(N),d(O),v(r,O),h(),E()}export{C as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/3.D0TU24-D.js b/website/.svelte-kit/output/client/_app/immutable/nodes/3.D0TU24-D.js new file mode 100644 index 0000000..2226628 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/3.D0TU24-D.js @@ -0,0 +1,6 @@ +import{A as e,B as t,C as n,E as r,G as i,H as a,I as o,J as s,K as c,L as l,M as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,X as b,Y as x,Z as S,_ as C,a as w,at as T,b as E,c as ee,ct as D,d as te,f as O,h as k,i as A,it as j,j as ne,k as re,l as M,lt as N,m as ie,n as ae,nt as oe,o as P,p as F,q as I,rt as L,s as R,st as z,tt as se,u as ce,v as B,w as V,x as le,y as ue,z as de}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as H}from"../chunks/BuBrZOIh.js";import"../chunks/qiBCaaew.js";var fe=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,pe=/\n/g,me=/^\s*/,he=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,ge=/^:\s*/,_e=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,ve=/^[;\s]*/,ye=/^\s+|\s+$/g,be=` +`,xe=`/`,Se=`*`,Ce=``,we=`comment`,Te=`declaration`;function Ee(e,t){if(typeof e!=`string`)throw TypeError(`First argument must be a string`);if(!e)return[];t||={};var n=1,r=1;function i(e){var t=e.match(pe);t&&(n+=t.length);var i=e.lastIndexOf(be);r=~i?e.length-i:r+e.length}function a(){var e={line:n,column:r};return function(t){return t.position=new o(e),l(),t}}function o(e){this.start=e,this.end={line:n,column:r},this.source=t.source}o.prototype.content=e;function s(i){var a=Error(t.source+`:`+n+`:`+r+`: `+i);if(a.reason=i,a.filename=t.source,a.line=n,a.column=r,a.source=e,!t.silent)throw a}function c(t){var n=t.exec(e);if(n){var r=n[0];return i(r),e=e.slice(r.length),n}}function l(){c(me)}function u(e){var t;for(e||=[];t=d();)t!==!1&&e.push(t);return e}function d(){var t=a();if(!(xe!=e.charAt(0)||Se!=e.charAt(1))){for(var n=2;Ce!=e.charAt(n)&&(Se!=e.charAt(n)||xe!=e.charAt(n+1));)++n;if(n+=2,Ce===e.charAt(n-1))return s(`End of comment missing`);var o=e.slice(2,n-2);return r+=2,i(o),e=e.slice(n),r+=2,t({type:we,comment:o})}}function f(){var e=a(),t=c(he);if(t){if(d(),!c(ge))return s(`property missing ':'`);var n=c(_e),r=e({type:Te,property:De(t[0].replace(fe,Ce)),value:n?De(n[0].replace(fe,Ce)):Ce});return c(ve),r}}function p(){var e=[];u(e);for(var t;t=f();)t!==!1&&(e.push(t),u(e));return e}return l(),p()}function De(e){return e?e.replace(ye,Ce):Ce}function Oe(e,t){let n=null;if(!e||typeof e!=`string`)return n;let r=Ee(e),i=typeof t==`function`;return r.forEach(e=>{if(e.type!==`declaration`)return;let{property:r,value:a}=e;i?t(r,a,e):a&&(n||={},n[r]=a)}),n}var ke=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ae(e,t){let n=w(t,ke),r=[[`path`,{d:`M5 12h14`}],[`path`,{d:`m12 5 7 7-7 7`}]];H(e,P({name:`arrow-right`},()=>n,{get iconNode(){return r}}))}var je=new Set([`$$slots`,`$$events`,`$$legacy`]);function Me(e,t){let n=w(t,je),r=[[`path`,{d:`M20 6 9 17l-5-5`}]];H(e,P({name:`check`},()=>n,{get iconNode(){return r}}))}var Ne=new Set([`$$slots`,`$$events`,`$$legacy`]);function Pe(e,t){let n=w(t,Ne),r=[[`path`,{d:`m6 9 6 6 6-6`}]];H(e,P({name:`chevron-down`},()=>n,{get iconNode(){return r}}))}var Fe=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ie(e,t){let n=w(t,Fe),r=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`}],[`path`,{d:`m9 11 3 3L22 4`}]];H(e,P({name:`circle-check-big`},()=>n,{get iconNode(){return r}}))}var Le=new Set([`$$slots`,`$$events`,`$$legacy`]);function Re(e,t){let n=w(t,Le),r=[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`}]];H(e,P({name:`copy`},()=>n,{get iconNode(){return r}}))}var ze=new Set([`$$slots`,`$$events`,`$$legacy`]);function Be(e,t){let n=w(t,ze),r=[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}]];H(e,P({name:`eye`},()=>n,{get iconNode(){return r}}))}var Ve=new Set([`$$slots`,`$$events`,`$$legacy`]);function He(e,t){let n=w(t,Ve),r=[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`}],[`path`,{d:`m9 15 2 2 4-4`}]];H(e,P({name:`file-check`},()=>n,{get iconNode(){return r}}))}var Ue=new Set([`$$slots`,`$$events`,`$$legacy`]);function We(e,t){let n=w(t,Ue),r=[[`path`,{d:`M15 6a9 9 0 0 0-9 9V3`}],[`circle`,{cx:`18`,cy:`6`,r:`3`}],[`circle`,{cx:`6`,cy:`18`,r:`3`}]];H(e,P({name:`git-branch`},()=>n,{get iconNode(){return r}}))}var Ge=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ke(e,t){let n=w(t,Ge),r=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]];H(e,P({name:`key-round`},()=>n,{get iconNode(){return r}}))}var qe=new Set([`$$slots`,`$$events`,`$$legacy`]);function Je(e,t){let n=w(t,qe),r=[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`}]];H(e,P({name:`layers`},()=>n,{get iconNode(){return r}}))}var Ye=new Set([`$$slots`,`$$events`,`$$legacy`]);function Xe(e,t){let n=w(t,Ye),r=[[`path`,{d:`M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5`}],[`path`,{d:`M9 18h6`}],[`path`,{d:`M10 22h4`}]];H(e,P({name:`lightbulb`},()=>n,{get iconNode(){return r}}))}var Ze=new Set([`$$slots`,`$$events`,`$$legacy`]);function Qe(e,t){let n=w(t,Ze),r=[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`}]];H(e,P({name:`lock`},()=>n,{get iconNode(){return r}}))}var $e=new Set([`$$slots`,`$$events`,`$$legacy`]);function et(e,t){let n=w(t,$e),r=[[`path`,{d:`M3 7V5a2 2 0 0 1 2-2h2`}],[`path`,{d:`M17 3h2a2 2 0 0 1 2 2v2`}],[`path`,{d:`M21 17v2a2 2 0 0 1-2 2h-2`}],[`path`,{d:`M7 21H5a2 2 0 0 1-2-2v-2`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}],[`path`,{d:`m16 16-1.9-1.9`}]];H(e,P({name:`scan-search`},()=>n,{get iconNode(){return r}}))}var tt=new Set([`$$slots`,`$$events`,`$$legacy`]);function nt(e,t){let n=w(t,tt),r=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}],[`path`,{d:`m9 12 2 2 4-4`}]];H(e,P({name:`shield-check`},()=>n,{get iconNode(){return r}}))}var rt=new Set([`$$slots`,`$$events`,`$$legacy`]);function it(e,t){let n=w(t,rt),r=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}]];H(e,P({name:`shield`},()=>n,{get iconNode(){return r}}))}var at=new Set([`$$slots`,`$$events`,`$$legacy`]);function ot(e,t){let n=w(t,at),r=[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`}]];H(e,P({name:`star`},()=>n,{get iconNode(){return r}}))}var st=new Set([`$$slots`,`$$events`,`$$legacy`]);function ct(e,t){let n=w(t,st),r=[[`path`,{d:`M12 3v12`}],[`path`,{d:`m17 8-5-5-5 5`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}]];H(e,P({name:`upload`},()=>n,{get iconNode(){return r}}))}var lt=new Set([`$$slots`,`$$events`,`$$legacy`]);function ut(e,t){let n=w(t,lt),r=[[`path`,{d:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`}]];H(e,P({name:`zap`},()=>n,{get iconNode(){return r}}))}var dt=(e,t)=>{let n=Array(e.length+t.length);for(let t=0;t({classGroupId:e,validator:t}),pt=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),mt=`-`,ht=[],gt=`arbitrary..`,_t=e=>{let t=bt(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return yt(e);let n=e.split(mt);return vt(n,+(n[0]===``&&n.length>1),t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?dt(i,t):t:i||ht}return n[e]||ht}}},vt=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=vt(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(mt):e.slice(t).join(mt),s=a.length;for(let e=0;ee.slice(1,-1).indexOf(`:`)===-1?void 0:(()=>{let t=e.slice(1,-1),n=t.indexOf(`:`),r=t.slice(0,n);return r?gt+r:void 0})(),bt=e=>{let{theme:t,classGroups:n}=e;return xt(n,t)},xt=(e,t)=>{let n=pt();for(let r in e){let i=e[r];St(i,n,r,t)}return n},St=(e,t,n,r)=>{let i=e.length;for(let a=0;a{if(typeof e==`string`){wt(e,t,n);return}if(typeof e==`function`){Tt(e,t,n,r);return}Et(e,t,n,r)},wt=(e,t,n)=>{let r=e===``?t:Dt(t,e);r.classGroupId=n},Tt=(e,t,n,r)=>{if(Ot(e)){St(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(ft(n,e))},Et=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e{let n=e,r=t.split(mt),i=r.length;for(let e=0;e`isThemeGetter`in e&&e.isThemeGetter===!0,kt=e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let t=0,n=Object.create(null),r=Object.create(null),i=(i,a)=>{n[i]=a,t++,t>e&&(t=0,r=n,n=Object.create(null))};return{get(e){let t=n[e];if(t!==void 0)return t;if((t=r[e])!==void 0)return i(e,t),t},set(e,t){e in n?n[e]=t:i(e,t)}}},At=`!`,jt=`:`,Mt=[],Nt=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),Pt=e=>{let{prefix:t,experimentalParseClassName:n}=e,r=e=>{let t=[],n=0,r=0,i=0,a,o=e.length;for(let s=0;si?a-i:void 0;return Nt(t,l,c,u)};if(t){let e=t+jt,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):Nt(Mt,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},Ft=e=>{let t=new Map;return e.orderSensitiveModifiers.forEach((e,n)=>{t.set(e,1e6+n)}),e=>{let n=[],r=[];for(let i=0;i0&&(r.sort(),n.push(...r),r=[]),n.push(a)):r.push(a)}return r.length>0&&(r.sort(),n.push(...r)),n}},It=e=>({cache:kt(e.cacheSize),parseClassName:Pt(e),sortModifiers:Ft(e),postfixLookupClassGroupIds:Lt(e),..._t(e)}),Lt=e=>{let t=Object.create(null),n=e.postfixLookupClassGroups;if(n)for(let e=0;e{let{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i,sortModifiers:a,postfixLookupClassGroupIds:o}=t,s=[],c=e.trim().split(Rt),l=``;for(let e=c.length-1;e>=0;--e){let t=c[e],{isExternal:u,modifiers:d,hasImportantModifier:f,baseClassName:p,maybePostfixModifierPosition:m}=n(t);if(u){l=t+(l.length>0?` `+l:l);continue}let h=!!m,g;if(h){g=r(p.substring(0,m));let e=g&&o[g]?r(p):void 0;e&&e!==g&&(g=e,h=!1)}else g=r(p);if(!g){if(!h){l=t+(l.length>0?` `+l:l);continue}if(g=r(p),!g){l=t+(l.length>0?` `+l:l);continue}h=!1}let _=d.length===0?``:d.length===1?d[0]:a(d).join(`:`),v=f?_+At:_,y=v+g;if(s.indexOf(y)>-1)continue;s.push(y);let b=i(g,h);for(let e=0;e0?` `+l:l)}return l},Bt=(...e)=>{let t=0,n,r,i=``;for(;t{if(typeof e==`string`)return e;let t,n=``;for(let r=0;r{let n,r,i,a,o=o=>(n=It(t.reduce((e,t)=>t(e),e())),r=n.cache.get,i=n.cache.set,a=s,s(o)),s=e=>{let t=r(e);if(t)return t;let a=zt(e,n);return i(e,a),a};return a=o,(...e)=>a(Bt(...e))},Ut=[],U=e=>{let t=t=>t[e]||Ut;return t.isThemeGetter=!0,t},Wt=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Gt=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Kt=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,qt=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Jt=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Yt=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Xt=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Zt=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,W=e=>Kt.test(e),G=e=>!!e&&!Number.isNaN(Number(e)),K=e=>!!e&&Number.isInteger(Number(e)),Qt=e=>e.endsWith(`%`)&&G(e.slice(0,-1)),q=e=>qt.test(e),$t=()=>!0,en=e=>Jt.test(e)&&!Yt.test(e),tn=()=>!1,nn=e=>Xt.test(e),rn=e=>Zt.test(e),an=e=>!J(e)&&!Y(e),on=e=>e.startsWith(`@container`)&&(e[10]===`/`&&e[11]!==void 0||e[11]===`s`&&e[16]!==void 0&&e.startsWith(`-size/`,10)||e[11]===`n`&&e[18]!==void 0&&e.startsWith(`-normal/`,10)),sn=e=>X(e,Tn,tn),J=e=>Wt.test(e),cn=e=>X(e,En,en),ln=e=>X(e,Dn,G),un=e=>X(e,kn,$t),dn=e=>X(e,On,tn),fn=e=>X(e,Cn,tn),pn=e=>X(e,wn,rn),mn=e=>X(e,An,nn),Y=e=>Gt.test(e),hn=e=>Sn(e,En),gn=e=>Sn(e,On),_n=e=>Sn(e,Cn),vn=e=>Sn(e,Tn),yn=e=>Sn(e,wn),bn=e=>Sn(e,An,!0),xn=e=>Sn(e,kn,!0),X=(e,t,n)=>{let r=Wt.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},Sn=(e,t,n=!1)=>{let r=Gt.exec(e);return r?r[1]?t(r[1]):n:!1},Cn=e=>e===`position`||e===`percentage`,wn=e=>e===`image`||e===`url`,Tn=e=>e===`length`||e===`size`||e===`bg-size`,En=e=>e===`length`,Dn=e=>e===`number`,On=e=>e===`family-name`,kn=e=>e===`number`||e===`weight`,An=e=>e===`shadow`,jn=Ht(()=>{let e=U(`color`),t=U(`font`),n=U(`text`),r=U(`font-weight`),i=U(`tracking`),a=U(`leading`),o=U(`breakpoint`),s=U(`container`),c=U(`spacing`),l=U(`radius`),u=U(`shadow`),d=U(`inset-shadow`),f=U(`text-shadow`),p=U(`drop-shadow`),m=U(`blur`),h=U(`perspective`),g=U(`aspect`),_=U(`ease`),v=U(`animate`),y=()=>[`auto`,`avoid`,`all`,`avoid-page`,`page`,`left`,`right`,`column`],b=()=>[`center`,`top`,`bottom`,`left`,`right`,`top-left`,`left-top`,`top-right`,`right-top`,`bottom-right`,`right-bottom`,`bottom-left`,`left-bottom`],x=()=>[...b(),Y,J],S=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],C=()=>[`auto`,`contain`,`none`],w=()=>[Y,J,c],T=()=>[W,`full`,`auto`,...w()],E=()=>[K,`none`,`subgrid`,Y,J],ee=()=>[`auto`,{span:[`full`,K,Y,J]},K,Y,J],D=()=>[K,`auto`,Y,J],te=()=>[`auto`,`min`,`max`,`fr`,Y,J],O=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],k=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],A=()=>[`auto`,...w()],j=()=>[W,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...w()],ne=()=>[W,`screen`,`full`,`dvw`,`lvw`,`svw`,`min`,`max`,`fit`,...w()],re=()=>[W,`screen`,`full`,`lh`,`dvh`,`lvh`,`svh`,`min`,`max`,`fit`,...w()],M=()=>[e,Y,J],N=()=>[...b(),_n,fn,{position:[Y,J]}],ie=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],ae=()=>[`auto`,`cover`,`contain`,vn,sn,{size:[Y,J]}],oe=()=>[Qt,hn,cn],P=()=>[``,`none`,`full`,l,Y,J],F=()=>[``,G,hn,cn],I=()=>[`solid`,`dashed`,`dotted`,`double`],L=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],R=()=>[G,Qt,_n,fn],z=()=>[``,`none`,m,Y,J],se=()=>[`none`,G,Y,J],ce=()=>[`none`,G,Y,J],B=()=>[G,Y,J],V=()=>[W,`full`,...w()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[q],breakpoint:[q],color:[$t],container:[q],"drop-shadow":[q],ease:[`in`,`out`,`in-out`],font:[an],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[q],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[q],shadow:[q],spacing:[`px`,G],text:[q],"text-shadow":[q],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,W,J,Y,g]}],container:[`container`],"container-type":[{"@container":[``,`normal`,`size`,Y,J]}],"container-named":[on],columns:[{columns:[G,J,Y,s]}],"break-after":[{"break-after":y()}],"break-before":[{"break-before":y()}],"break-inside":[{"break-inside":[`auto`,`avoid`,`avoid-page`,`avoid-column`]}],"box-decoration":[{"box-decoration":[`slice`,`clone`]}],box:[{box:[`border`,`content`]}],display:[`block`,`inline-block`,`inline`,`flex`,`inline-flex`,`table`,`inline-table`,`table-caption`,`table-cell`,`table-column`,`table-column-group`,`table-footer-group`,`table-header-group`,`table-row-group`,`table-row`,`flow-root`,`grid`,`inline-grid`,`contents`,`list-item`,`hidden`],sr:[`sr-only`,`not-sr-only`],float:[{float:[`right`,`left`,`none`,`start`,`end`]}],clear:[{clear:[`left`,`right`,`both`,`none`,`start`,`end`]}],isolation:[`isolate`,`isolation-auto`],"object-fit":[{object:[`contain`,`cover`,`fill`,`none`,`scale-down`]}],"object-position":[{object:x()}],overflow:[{overflow:S()}],"overflow-x":[{"overflow-x":S()}],"overflow-y":[{"overflow-y":S()}],overscroll:[{overscroll:C()}],"overscroll-x":[{"overscroll-x":C()}],"overscroll-y":[{"overscroll-y":C()}],position:[`static`,`fixed`,`absolute`,`relative`,`sticky`],inset:[{inset:T()}],"inset-x":[{"inset-x":T()}],"inset-y":[{"inset-y":T()}],start:[{"inset-s":T(),start:T()}],end:[{"inset-e":T(),end:T()}],"inset-bs":[{"inset-bs":T()}],"inset-be":[{"inset-be":T()}],top:[{top:T()}],right:[{right:T()}],bottom:[{bottom:T()}],left:[{left:T()}],visibility:[`visible`,`invisible`,`collapse`],z:[{z:[K,`auto`,Y,J]}],basis:[{basis:[W,`full`,`auto`,s,...w()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[G,W,`auto`,`initial`,`none`,J]}],grow:[{grow:[``,G,Y,J]}],shrink:[{shrink:[``,G,Y,J]}],order:[{order:[K,`first`,`last`,`none`,Y,J]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:ee()}],"col-start":[{"col-start":D()}],"col-end":[{"col-end":D()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:ee()}],"row-start":[{"row-start":D()}],"row-end":[{"row-end":D()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":te()}],"auto-rows":[{"auto-rows":te()}],gap:[{gap:w()}],"gap-x":[{"gap-x":w()}],"gap-y":[{"gap-y":w()}],"justify-content":[{justify:[...O(),`normal`]}],"justify-items":[{"justify-items":[...k(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...k()]}],"align-content":[{content:[`normal`,...O()]}],"align-items":[{items:[...k(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...k(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":O()}],"place-items":[{"place-items":[...k(),`baseline`]}],"place-self":[{"place-self":[`auto`,...k()]}],p:[{p:w()}],px:[{px:w()}],py:[{py:w()}],ps:[{ps:w()}],pe:[{pe:w()}],pbs:[{pbs:w()}],pbe:[{pbe:w()}],pt:[{pt:w()}],pr:[{pr:w()}],pb:[{pb:w()}],pl:[{pl:w()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mbs:[{mbs:A()}],mbe:[{mbe:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":w()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":w()}],"space-y-reverse":[`space-y-reverse`],size:[{size:j()}],"inline-size":[{inline:[`auto`,...ne()]}],"min-inline-size":[{"min-inline":[`auto`,...ne()]}],"max-inline-size":[{"max-inline":[`none`,...ne()]}],"block-size":[{block:[`auto`,...re()]}],"min-block-size":[{"min-block":[`auto`,...re()]}],"max-block-size":[{"max-block":[`none`,...re()]}],w:[{w:[s,`screen`,...j()]}],"min-w":[{"min-w":[s,`screen`,`none`,...j()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...j()]}],h:[{h:[`screen`,`lh`,...j()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...j()]}],"max-h":[{"max-h":[`screen`,`lh`,...j()]}],"font-size":[{text:[`base`,n,hn,cn]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,xn,un]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,Qt,J]}],"font-family":[{font:[gn,dn,t]}],"font-features":[{"font-features":[J]}],"fvn-normal":[`normal-nums`],"fvn-ordinal":[`ordinal`],"fvn-slashed-zero":[`slashed-zero`],"fvn-figure":[`lining-nums`,`oldstyle-nums`],"fvn-spacing":[`proportional-nums`,`tabular-nums`],"fvn-fraction":[`diagonal-fractions`,`stacked-fractions`],tracking:[{tracking:[i,Y,J]}],"line-clamp":[{"line-clamp":[G,`none`,Y,ln]}],leading:[{leading:[a,...w()]}],"list-image":[{"list-image":[`none`,Y,J]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,Y,J]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:M()}],"text-color":[{text:M()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...I(),`wavy`]}],"text-decoration-thickness":[{decoration:[G,`from-font`,`auto`,Y,cn]}],"text-decoration-color":[{decoration:M()}],"underline-offset":[{"underline-offset":[G,`auto`,Y,J]}],"text-transform":[`uppercase`,`lowercase`,`capitalize`,`normal-case`],"text-overflow":[`truncate`,`text-ellipsis`,`text-clip`],"text-wrap":[{text:[`wrap`,`nowrap`,`balance`,`pretty`]}],indent:[{indent:w()}],"tab-size":[{tab:[K,Y,J]}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,Y,J]}],whitespace:[{whitespace:[`normal`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]}],break:[{break:[`normal`,`words`,`all`,`keep`]}],wrap:[{wrap:[`break-word`,`anywhere`,`normal`]}],hyphens:[{hyphens:[`none`,`manual`,`auto`]}],content:[{content:[`none`,Y,J]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:N()}],"bg-repeat":[{bg:ie()}],"bg-size":[{bg:ae()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},K,Y,J],radial:[``,Y,J],conic:[K,Y,J]},yn,pn]}],"bg-color":[{bg:M()}],"gradient-from-pos":[{from:oe()}],"gradient-via-pos":[{via:oe()}],"gradient-to-pos":[{to:oe()}],"gradient-from":[{from:M()}],"gradient-via":[{via:M()}],"gradient-to":[{to:M()}],rounded:[{rounded:P()}],"rounded-s":[{"rounded-s":P()}],"rounded-e":[{"rounded-e":P()}],"rounded-t":[{"rounded-t":P()}],"rounded-r":[{"rounded-r":P()}],"rounded-b":[{"rounded-b":P()}],"rounded-l":[{"rounded-l":P()}],"rounded-ss":[{"rounded-ss":P()}],"rounded-se":[{"rounded-se":P()}],"rounded-ee":[{"rounded-ee":P()}],"rounded-es":[{"rounded-es":P()}],"rounded-tl":[{"rounded-tl":P()}],"rounded-tr":[{"rounded-tr":P()}],"rounded-br":[{"rounded-br":P()}],"rounded-bl":[{"rounded-bl":P()}],"border-w":[{border:F()}],"border-w-x":[{"border-x":F()}],"border-w-y":[{"border-y":F()}],"border-w-s":[{"border-s":F()}],"border-w-e":[{"border-e":F()}],"border-w-bs":[{"border-bs":F()}],"border-w-be":[{"border-be":F()}],"border-w-t":[{"border-t":F()}],"border-w-r":[{"border-r":F()}],"border-w-b":[{"border-b":F()}],"border-w-l":[{"border-l":F()}],"divide-x":[{"divide-x":F()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":F()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...I(),`hidden`,`none`]}],"divide-style":[{divide:[...I(),`hidden`,`none`]}],"border-color":[{border:M()}],"border-color-x":[{"border-x":M()}],"border-color-y":[{"border-y":M()}],"border-color-s":[{"border-s":M()}],"border-color-e":[{"border-e":M()}],"border-color-bs":[{"border-bs":M()}],"border-color-be":[{"border-be":M()}],"border-color-t":[{"border-t":M()}],"border-color-r":[{"border-r":M()}],"border-color-b":[{"border-b":M()}],"border-color-l":[{"border-l":M()}],"divide-color":[{divide:M()}],"outline-style":[{outline:[...I(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[G,Y,J]}],"outline-w":[{outline:[``,G,hn,cn]}],"outline-color":[{outline:M()}],shadow:[{shadow:[``,`none`,u,bn,mn]}],"shadow-color":[{shadow:M()}],"inset-shadow":[{"inset-shadow":[`none`,d,bn,mn]}],"inset-shadow-color":[{"inset-shadow":M()}],"ring-w":[{ring:F()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:M()}],"ring-offset-w":[{"ring-offset":[G,cn]}],"ring-offset-color":[{"ring-offset":M()}],"inset-ring-w":[{"inset-ring":F()}],"inset-ring-color":[{"inset-ring":M()}],"text-shadow":[{"text-shadow":[`none`,f,bn,mn]}],"text-shadow-color":[{"text-shadow":M()}],opacity:[{opacity:[G,Y,J]}],"mix-blend":[{"mix-blend":[...L(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":L()}],"mask-clip":[{"mask-clip":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]},`mask-no-clip`],"mask-composite":[{mask:[`add`,`subtract`,`intersect`,`exclude`]}],"mask-image-linear-pos":[{"mask-linear":[G]}],"mask-image-linear-from-pos":[{"mask-linear-from":R()}],"mask-image-linear-to-pos":[{"mask-linear-to":R()}],"mask-image-linear-from-color":[{"mask-linear-from":M()}],"mask-image-linear-to-color":[{"mask-linear-to":M()}],"mask-image-t-from-pos":[{"mask-t-from":R()}],"mask-image-t-to-pos":[{"mask-t-to":R()}],"mask-image-t-from-color":[{"mask-t-from":M()}],"mask-image-t-to-color":[{"mask-t-to":M()}],"mask-image-r-from-pos":[{"mask-r-from":R()}],"mask-image-r-to-pos":[{"mask-r-to":R()}],"mask-image-r-from-color":[{"mask-r-from":M()}],"mask-image-r-to-color":[{"mask-r-to":M()}],"mask-image-b-from-pos":[{"mask-b-from":R()}],"mask-image-b-to-pos":[{"mask-b-to":R()}],"mask-image-b-from-color":[{"mask-b-from":M()}],"mask-image-b-to-color":[{"mask-b-to":M()}],"mask-image-l-from-pos":[{"mask-l-from":R()}],"mask-image-l-to-pos":[{"mask-l-to":R()}],"mask-image-l-from-color":[{"mask-l-from":M()}],"mask-image-l-to-color":[{"mask-l-to":M()}],"mask-image-x-from-pos":[{"mask-x-from":R()}],"mask-image-x-to-pos":[{"mask-x-to":R()}],"mask-image-x-from-color":[{"mask-x-from":M()}],"mask-image-x-to-color":[{"mask-x-to":M()}],"mask-image-y-from-pos":[{"mask-y-from":R()}],"mask-image-y-to-pos":[{"mask-y-to":R()}],"mask-image-y-from-color":[{"mask-y-from":M()}],"mask-image-y-to-color":[{"mask-y-to":M()}],"mask-image-radial":[{"mask-radial":[Y,J]}],"mask-image-radial-from-pos":[{"mask-radial-from":R()}],"mask-image-radial-to-pos":[{"mask-radial-to":R()}],"mask-image-radial-from-color":[{"mask-radial-from":M()}],"mask-image-radial-to-color":[{"mask-radial-to":M()}],"mask-image-radial-shape":[{"mask-radial":[`circle`,`ellipse`]}],"mask-image-radial-size":[{"mask-radial":[{closest:[`side`,`corner`],farthest:[`side`,`corner`]}]}],"mask-image-radial-pos":[{"mask-radial-at":b()}],"mask-image-conic-pos":[{"mask-conic":[G]}],"mask-image-conic-from-pos":[{"mask-conic-from":R()}],"mask-image-conic-to-pos":[{"mask-conic-to":R()}],"mask-image-conic-from-color":[{"mask-conic-from":M()}],"mask-image-conic-to-color":[{"mask-conic-to":M()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:N()}],"mask-repeat":[{mask:ie()}],"mask-size":[{mask:ae()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,Y,J]}],filter:[{filter:[``,`none`,Y,J]}],blur:[{blur:z()}],brightness:[{brightness:[G,Y,J]}],contrast:[{contrast:[G,Y,J]}],"drop-shadow":[{"drop-shadow":[``,`none`,p,bn,mn]}],"drop-shadow-color":[{"drop-shadow":M()}],grayscale:[{grayscale:[``,G,Y,J]}],"hue-rotate":[{"hue-rotate":[G,Y,J]}],invert:[{invert:[``,G,Y,J]}],saturate:[{saturate:[G,Y,J]}],sepia:[{sepia:[``,G,Y,J]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,Y,J]}],"backdrop-blur":[{"backdrop-blur":z()}],"backdrop-brightness":[{"backdrop-brightness":[G,Y,J]}],"backdrop-contrast":[{"backdrop-contrast":[G,Y,J]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,G,Y,J]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[G,Y,J]}],"backdrop-invert":[{"backdrop-invert":[``,G,Y,J]}],"backdrop-opacity":[{"backdrop-opacity":[G,Y,J]}],"backdrop-saturate":[{"backdrop-saturate":[G,Y,J]}],"backdrop-sepia":[{"backdrop-sepia":[``,G,Y,J]}],"border-collapse":[{border:[`collapse`,`separate`]}],"border-spacing":[{"border-spacing":w()}],"border-spacing-x":[{"border-spacing-x":w()}],"border-spacing-y":[{"border-spacing-y":w()}],"table-layout":[{table:[`auto`,`fixed`]}],caption:[{caption:[`top`,`bottom`]}],transition:[{transition:[``,`all`,`colors`,`opacity`,`shadow`,`transform`,`none`,Y,J]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[G,`initial`,Y,J]}],ease:[{ease:[`linear`,`initial`,_,Y,J]}],delay:[{delay:[G,Y,J]}],animate:[{animate:[`none`,v,Y,J]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[h,Y,J]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:se()}],"rotate-x":[{"rotate-x":se()}],"rotate-y":[{"rotate-y":se()}],"rotate-z":[{"rotate-z":se()}],scale:[{scale:ce()}],"scale-x":[{"scale-x":ce()}],"scale-y":[{"scale-y":ce()}],"scale-z":[{"scale-z":ce()}],"scale-3d":[`scale-3d`],skew:[{skew:B()}],"skew-x":[{"skew-x":B()}],"skew-y":[{"skew-y":B()}],transform:[{transform:[Y,J,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:V()}],"translate-x":[{"translate-x":V()}],"translate-y":[{"translate-y":V()}],"translate-z":[{"translate-z":V()}],"translate-none":[`translate-none`],zoom:[{zoom:[K,Y,J]}],accent:[{accent:M()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:M()}],"color-scheme":[{scheme:[`normal`,`dark`,`light`,`light-dark`,`only-dark`,`only-light`]}],cursor:[{cursor:[`auto`,`default`,`pointer`,`wait`,`text`,`move`,`help`,`not-allowed`,`none`,`context-menu`,`progress`,`cell`,`crosshair`,`vertical-text`,`alias`,`copy`,`no-drop`,`grab`,`grabbing`,`all-scroll`,`col-resize`,`row-resize`,`n-resize`,`e-resize`,`s-resize`,`w-resize`,`ne-resize`,`nw-resize`,`se-resize`,`sw-resize`,`ew-resize`,`ns-resize`,`nesw-resize`,`nwse-resize`,`zoom-in`,`zoom-out`,Y,J]}],"field-sizing":[{"field-sizing":[`fixed`,`content`]}],"pointer-events":[{"pointer-events":[`auto`,`none`]}],resize:[{resize:[`none`,``,`y`,`x`]}],"scroll-behavior":[{scroll:[`auto`,`smooth`]}],"scrollbar-thumb-color":[{"scrollbar-thumb":M()}],"scrollbar-track-color":[{"scrollbar-track":M()}],"scrollbar-gutter":[{"scrollbar-gutter":[`auto`,`stable`,`both`]}],"scrollbar-w":[{scrollbar:[`auto`,`thin`,`none`]}],"scroll-m":[{"scroll-m":w()}],"scroll-mx":[{"scroll-mx":w()}],"scroll-my":[{"scroll-my":w()}],"scroll-ms":[{"scroll-ms":w()}],"scroll-me":[{"scroll-me":w()}],"scroll-mbs":[{"scroll-mbs":w()}],"scroll-mbe":[{"scroll-mbe":w()}],"scroll-mt":[{"scroll-mt":w()}],"scroll-mr":[{"scroll-mr":w()}],"scroll-mb":[{"scroll-mb":w()}],"scroll-ml":[{"scroll-ml":w()}],"scroll-p":[{"scroll-p":w()}],"scroll-px":[{"scroll-px":w()}],"scroll-py":[{"scroll-py":w()}],"scroll-ps":[{"scroll-ps":w()}],"scroll-pe":[{"scroll-pe":w()}],"scroll-pbs":[{"scroll-pbs":w()}],"scroll-pbe":[{"scroll-pbe":w()}],"scroll-pt":[{"scroll-pt":w()}],"scroll-pr":[{"scroll-pr":w()}],"scroll-pb":[{"scroll-pb":w()}],"scroll-pl":[{"scroll-pl":w()}],"snap-align":[{snap:[`start`,`end`,`center`,`align-none`]}],"snap-stop":[{snap:[`normal`,`always`]}],"snap-type":[{snap:[`none`,`x`,`y`,`both`]}],"snap-strictness":[{snap:[`mandatory`,`proximity`]}],touch:[{touch:[`auto`,`none`,`manipulation`]}],"touch-x":[{"touch-pan":[`x`,`left`,`right`]}],"touch-y":[{"touch-pan":[`y`,`up`,`down`]}],"touch-pz":[`touch-pinch-zoom`],select:[{select:[`none`,`text`,`all`,`auto`]}],"will-change":[{"will-change":[`auto`,`scroll`,`contents`,`transform`,Y,J]}],fill:[{fill:[`none`,...M()]}],"stroke-w":[{stroke:[G,hn,cn,ln]}],stroke:[{stroke:[`none`,...M()]}],"forced-color-adjust":[{"forced-color-adjust":[`auto`,`none`]}]},conflictingClassGroups:{"container-named":[`container-type`],overflow:[`overflow-x`,`overflow-y`],overscroll:[`overscroll-x`,`overscroll-y`],inset:[`inset-x`,`inset-y`,`inset-bs`,`inset-be`,`start`,`end`,`top`,`right`,`bottom`,`left`],"inset-x":[`right`,`left`],"inset-y":[`top`,`bottom`],flex:[`basis`,`grow`,`shrink`],gap:[`gap-x`,`gap-y`],p:[`px`,`py`,`ps`,`pe`,`pbs`,`pbe`,`pt`,`pr`,`pb`,`pl`],px:[`pr`,`pl`],py:[`pt`,`pb`],m:[`mx`,`my`,`ms`,`me`,`mbs`,`mbe`,`mt`,`mr`,`mb`,`ml`],mx:[`mr`,`ml`],my:[`mt`,`mb`],size:[`w`,`h`],"font-size":[`leading`],"fvn-normal":[`fvn-ordinal`,`fvn-slashed-zero`,`fvn-figure`,`fvn-spacing`,`fvn-fraction`],"fvn-ordinal":[`fvn-normal`],"fvn-slashed-zero":[`fvn-normal`],"fvn-figure":[`fvn-normal`],"fvn-spacing":[`fvn-normal`],"fvn-fraction":[`fvn-normal`],"line-clamp":[`display`,`overflow`],rounded:[`rounded-s`,`rounded-e`,`rounded-t`,`rounded-r`,`rounded-b`,`rounded-l`,`rounded-ss`,`rounded-se`,`rounded-ee`,`rounded-es`,`rounded-tl`,`rounded-tr`,`rounded-br`,`rounded-bl`],"rounded-s":[`rounded-ss`,`rounded-es`],"rounded-e":[`rounded-se`,`rounded-ee`],"rounded-t":[`rounded-tl`,`rounded-tr`],"rounded-r":[`rounded-tr`,`rounded-br`],"rounded-b":[`rounded-br`,`rounded-bl`],"rounded-l":[`rounded-tl`,`rounded-bl`],"border-spacing":[`border-spacing-x`,`border-spacing-y`],"border-w":[`border-w-x`,`border-w-y`,`border-w-s`,`border-w-e`,`border-w-bs`,`border-w-be`,`border-w-t`,`border-w-r`,`border-w-b`,`border-w-l`],"border-w-x":[`border-w-r`,`border-w-l`],"border-w-y":[`border-w-t`,`border-w-b`],"border-color":[`border-color-x`,`border-color-y`,`border-color-s`,`border-color-e`,`border-color-bs`,`border-color-be`,`border-color-t`,`border-color-r`,`border-color-b`,`border-color-l`],"border-color-x":[`border-color-r`,`border-color-l`],"border-color-y":[`border-color-t`,`border-color-b`],translate:[`translate-x`,`translate-y`,`translate-none`],"translate-none":[`translate`,`translate-x`,`translate-y`,`translate-z`],"scroll-m":[`scroll-mx`,`scroll-my`,`scroll-ms`,`scroll-me`,`scroll-mbs`,`scroll-mbe`,`scroll-mt`,`scroll-mr`,`scroll-mb`,`scroll-ml`],"scroll-mx":[`scroll-mr`,`scroll-ml`],"scroll-my":[`scroll-mt`,`scroll-mb`],"scroll-p":[`scroll-px`,`scroll-py`,`scroll-ps`,`scroll-pe`,`scroll-pbs`,`scroll-pbe`,`scroll-pt`,`scroll-pr`,`scroll-pb`,`scroll-pl`],"scroll-px":[`scroll-pr`,`scroll-pl`],"scroll-py":[`scroll-pt`,`scroll-pb`],touch:[`touch-x`,`touch-y`,`touch-pz`],"touch-x":[`touch`],"touch-y":[`touch`],"touch-pz":[`touch`]},conflictingClassGroupModifiers:{"font-size":[`leading`]},postfixLookupClassGroups:[`container-type`],orderSensitiveModifiers:[`*`,`**`,`after`,`backdrop`,`before`,`details-content`,`file`,`first-letter`,`first-line`,`marker`,`placeholder`,`selection`]}});function Z(...e){return jn(ie(e))}var Mn=new Set([`$$slots`,`$$events`,`$$legacy`,`title`,`showCopy`,`copyText`,`children`,`class`]),Nn=r(``),Pn=r(`
`);function Fn(e,r){j(r,!0);let i=A(r,`title`,3,`Terminal`),a=A(r,`showCopy`,3,!1),o=w(r,Mn),l=x(!1);async function u(){if(!p(l))try{let e=r.copyText??``;e&&(await navigator.clipboard.writeText(e),s(l,!0),setTimeout(()=>{s(l,!1)},2e3))}catch{}}var d=Pn();M(d,e=>({class:e,...o}),[()=>Z(`terminal relative`,r.class)]);var f=y(d),m=c(y(f),6),g=y(m,!0);D(m),D(f);var _=c(f,2),v=y(_);B(v,()=>r.children);var b=c(v,2),S=e=>{var n=Nn();let r;var i=y(n),a=e=>{Me(e,{size:14})},o=e=>{Re(e,{size:14})};h(i,e=>{p(l)?e(a):e(o,-1)}),D(n),t(()=>r=O(n,1,`copy-btn`,null,r,{copied:p(l)})),ne(`click`,n,function(...e){(p(l)?void 0:u)?.apply(this,e)}),V(e,n)};h(b,e=>{a()&&e(S)}),D(_),D(d),t(()=>n(g,i())),V(e,d),L()}e([`click`]);var In=r(`
cargo install cora-cli
cora auth login
cora review --staged
`,1),Ln=r(`
Open source · BYOK · Zero config

AI code review in your terminal

cora catches bugs, security issues, and code smells before they land in your PR. + Bring your own API key. Your code never leaves your machine.

Local-first 5 LLM providers CI/CD ready
`);function Rn(e){var t=Ln(),n=c(y(t),6),r=c(y(n),6),i=y(r);Ae(c(y(i)),{class:`w-4 h-4 transition-transform group-hover:translate-x-1`}),D(i),z(2),D(r);var a=c(r,2);Fn(y(a),{title:`install`,children:(e,t)=>{var n=In();z(4),V(e,n)},$$slots:{default:!0}}),D(a);var o=c(a,2),s=y(o);it(y(s),{class:`w-3.5 h-3.5`}),z(),D(s);var l=c(s,2);ut(y(l),{class:`w-3.5 h-3.5`}),z(),D(l);var u=c(l,2);Be(y(u),{class:`w-3.5 h-3.5`}),z(),D(u),D(o),D(n),D(t),V(e,t)}var zn=r(`

Trusted by developers who ship fast

5
AI Providers
< 3s
Review Time
Zero
Config Required
`);function Bn(e){V(e,zn())}var Vn=r(`
`),Hn=r(``),Un=r(` `,1),Wn=r(`

See it in action

Run cora against staged changes. Results in seconds, not minutes.

`);function Gn(e,r){j(r,!0);let a=x(I([])),o=x(!1),l=x(!1),u=null,d=[{text:`$ cora review --staged`,color:`var(--muted-foreground)`},{text:``,color:``},{text:`Analyzing 3 files...`,color:`var(--muted-foreground)`},{text:`✓ src/auth/login.ts — 2 issues found`,color:`var(--success)`},{text:` ⚠ Line 42: Potential SQL injection`,color:`var(--warning)`},{text:` ⚠ Line 87: Hardcoded secret`,color:`var(--warning)`},{text:`✓ src/utils/parser.ts — clean`,color:`var(--muted-foreground)`},{text:`✓ src/api/routes.ts — 1 issue found`,color:`var(--success)`},{text:` ✗ Line 23: Missing error handling`,color:`var(--destructive)`},{text:``,color:``},{text:`3 issues found in 3 files`,color:`var(--foreground)`}],f=x(void 0);v(()=>{if(!p(f))return;let e=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting&&!p(l)){s(l,!0);let e=0;u=setInterval(()=>{e{e.disconnect(),u&&clearInterval(u)}});var m=Wn(),g=c(y(m),4);Fn(y(g),{title:`cora \\u2014 review`,children:(e,r)=>{var s=Un(),l=i(s);E(l,17,()=>p(a),le,(e,r,i)=>{var a=Vn(),o=y(a,!0);D(a),t(()=>{te(a,`color: ${(d[i]?.color||`var(--foreground)`)??``};`),n(o,p(r))}),V(e,a)});var u=c(l,2),f=e=>{V(e,Hn())};h(u,e=>{p(o)&&e(f)}),V(e,s)},$$slots:{default:!0}}),D(g),D(m),ee(m,e=>s(f,e),()=>p(f)),V(e,m),L()}var Kn=r(`

`);function qn(e,r){j(r,!0);let i=A(r,`delayMs`,3,0);var a=Kn();let o;var s=y(a),l=y(s,!0);D(s);var u=c(s,2);ce(y(u),`size`,24),D(u);var d=c(u,2),f=y(d,!0);D(d);var p=c(d,2),m=y(p,!0);D(p),D(a),t(e=>{O(a,1,e),o=te(a,``,o,{"transition-delay":i()?`${i()}ms`:void 0}),n(l,r.number),n(f,r.title),n(m,r.description)},[()=>F(Z(`glass-card flex-1 text-center scroll-reveal`,r.class))]),V(e,a),L()}var Jn=r(`

How it works

Three steps from code to confidence.

`);function Yn(e){var t=Jn(),n=c(y(t),4),r=y(n);qn(r,{number:`01`,get icon(){return Ae},title:`Write code`,description:`Push your changes as normal. cora only sees your diff.`});var i=c(r,4);qn(i,{number:`02`,get icon(){return Xe},title:`Review with AI`,description:`cora analyzes your diff with the LLM of your choice.`,delayMs:100}),qn(c(i,4),{number:`03`,get icon(){return Ie},title:`Ship with confidence`,description:`Merge clean, production-ready code. Every time.`,delayMs:200}),D(n),D(t),V(e,t)}var Xn=r(`

`);function Q(e,r){j(r,!0);let i=A(r,`delayMs`,3,0);var a=Xn();let o;var s=y(a);ce(y(s),`size`,24),D(s);var l=c(s,2),u=y(l,!0);D(l);var d=c(l,2),f=y(d,!0);D(d);var p=c(d,2);ue(p,()=>r.description,!0),D(p),D(a),t(e=>{O(a,1,e),o=te(a,``,o,{"transition-delay":i()?`${i()}ms`:void 0}),n(u,r.title),n(f,r.accent)},[()=>F(Z(`glass-card scroll-reveal`,r.class))]),V(e,a),L()}var Zn=r(`

Built for developers who value control

Everything you need, nothing you don't.

`);function Qn(e){var t=Zn(),n=c(y(t),4),r=y(n);Q(r,{get icon(){return et},title:`AI Code Review`,accent:`Diff, branch, or full scan`,description:`Three review modes: staged diff, branch comparison, or full project scan. LLM-powered analysis catches bugs, security issues, and style violations.`});var i=c(r,2);Q(i,{get icon(){return Ke},title:`Bring Your Own Key`,accent:`No subscriptions, no lock-in`,description:`Uses YOUR OpenAI, Anthropic, Groq, Ollama, or Z.AI API key. No data stored on our servers. You control the model, you control the cost.`,delayMs:100});var a=c(i,2);Q(a,{get icon(){return We},title:`Pre-commit Hooks`,accent:`Review before you push`,description:`Install once. Every commit gets reviewed automatically. Block bad code from entering your branch before it ships.`,delayMs:200});var o=c(a,2);Q(o,{get icon(){return Je},title:`Incremental Scan`,accent:`Only scan what changed`,description:`SHA256 content hash cache. First scan indexes your codebase. Subsequent scans only review new or modified files.`,delayMs:300});var s=c(o,2);Q(s,{get icon(){return nt},title:`SARIF Output`,accent:`GitHub Code Scanning`,description:`Upload review findings directly to GitHub's Security tab. Track issues across PRs. Works with any CI/CD pipeline.`,delayMs:400});var l=c(s,2);Q(l,{get icon(){return Qe},title:`Fully Private`,accent:`Your code stays yours`,description:`Runs entirely on your machine. No cloud, no telemetry, no data leaving your network. Perfect for Gitea and air-gapped environments.`,delayMs:500});var u=c(l,2);Q(u,{get icon(){return Xe},title:`Deterministic Reviews`,accent:`Same diff, same issues`,description:`Temperature defaults to 0. Identical diffs always produce identical findings — perfect for CI reproducibility.`,delayMs:600});var d=c(u,2);Q(d,{get icon(){return ct},title:`Smart Caching`,accent:`Never review the same diff twice`,description:`Reviews are cached by diff hash in ~/.cache/cora/reviews/. Re-reviewing an unchanged diff returns cached results instantly. Use --no-cache to bypass.`,delayMs:700}),Q(c(d,2),{get icon(){return He},title:`Custom Prompts & Anti-Hallucination`,accent:`Control the review, trust the output`,description:`Override system prompts for review and scan. File path injection and post-parse filtering ensure the LLM only reports issues that exist in your actual diff.`,delayMs:800}),D(n),D(t),V(e,t)}var $n=r(``),er=r(` `),tr=r(``),nr=r(``),rr=r(``),ir=r(` `),ar=r(` `),or=r(` `),sr=r(``),cr=r(``),lr=r(``),ur=r(`
`),dr=r(`
cora
`),fr=r(`

Why developers choose cora

Compared to popular code review tools.

`);function pr(e,r){j(r,!0);let i=x(!1),a;ae(()=>{let e=new IntersectionObserver(([t])=>{t.isIntersecting&&(s(i,!0),e.disconnect())},{threshold:.15});return a&&e.observe(a),()=>e.disconnect()});let o=[{name:`BYOK`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:null},{name:`Self-hosted`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!0},{name:`Gitea / Forgejo`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!0},{name:`CLI`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!1},{name:`Pre-commit hooks`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!1},{name:`SARIF output`,cora:!0,coderabbit:!0,copilot:!0,sonarqube:!0},{name:`Cost`,cora:`Free + API`,coderabbit:`$12–39/mo`,copilot:`$10–39/mo`,sonarqube:`Free / $150+`},{name:`License`,cora:`MIT`,coderabbit:`Apache 2.0`,copilot:`Proprietary`,sonarqube:`LGPL`}],l=[{key:`coderabbit`,label:`CodeRabbit`},{key:`copilot`,label:`Copilot`},{key:`sonarqube`,label:`SonarQube`}];function u(e){return e===!0?`check`:e===!1?`cross`:e===null?`dash`:`text`}var d=fr(),f=c(y(d),4),m=y(f),g=y(m),_=c(y(g));E(_,21,()=>o,le,(e,r,a)=>{var o=ar();let s;te(o,`transition-delay: ${a*60}ms`);var d=y(o),f=y(d,!0);D(d);var m=c(d),g=y(m),_=e=>{V(e,$n())},v=b(()=>u(p(r).cora)===`check`),x=e=>{var i=er(),a=y(i,!0);D(i),t(()=>n(a,p(r).cora)),V(e,i)};h(g,e=>{p(v)?e(_):e(x,-1)}),D(m);var S=c(m),C=y(S),w=e=>{V(e,tr())},T=b(()=>u(p(r)[l[0].key])===`check`),E=e=>{V(e,nr())},ee=b(()=>u(p(r)[l[0].key])===`cross`),k=e=>{V(e,rr())},A=b(()=>u(p(r)[l[0].key])===`dash`),j=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[0].key])),V(e,i)};h(C,e=>{p(T)?e(w):p(ee)?e(E,1):p(A)?e(k,2):e(j,-1)}),D(S);var ne=c(S),re=y(ne),M=e=>{V(e,tr())},N=b(()=>u(p(r)[l[1].key])===`check`),ie=e=>{V(e,nr())},ae=b(()=>u(p(r)[l[1].key])===`cross`),oe=e=>{V(e,rr())},P=b(()=>u(p(r)[l[1].key])===`dash`),F=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[1].key])),V(e,i)};h(re,e=>{p(N)?e(M):p(ae)?e(ie,1):p(P)?e(oe,2):e(F,-1)}),D(ne);var I=c(ne),L=y(I),R=e=>{V(e,tr())},z=b(()=>u(p(r)[l[2].key])===`check`),se=e=>{V(e,nr())},ce=b(()=>u(p(r)[l[2].key])===`cross`),B=e=>{V(e,rr())},le=b(()=>u(p(r)[l[2].key])===`dash`),ue=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[2].key])),V(e,i)};h(L,e=>{p(z)?e(R):p(ce)?e(se,1):p(le)?e(B,2):e(ue,-1)}),D(I),D(o),t(()=>{s=O(o,1,`compare-row svelte-14kdxof`,null,s,{revealed:p(i)}),n(f,p(r).name)}),V(e,o)}),D(_),D(g),D(m),D(f);var v=c(f,2);E(v,21,()=>o,le,(e,r,a)=>{var o=dr();let s;te(o,`transition-delay: ${a*60}ms`);var d=y(o),f=y(d),m=y(f,!0);D(f),D(d);var g=c(d,2),_=y(g),v=c(y(_),2),x=e=>{V(e,$n())},S=b(()=>u(p(r).cora)===`check`),C=e=>{var i=or(),a=y(i,!0);D(i),t(()=>n(a,p(r).cora)),V(e,i)};h(v,e=>{p(S)?e(x):e(C,-1)}),D(_),E(c(_,2),17,()=>l,le,(e,i)=>{var a=ur(),o=y(a),s=y(o,!0);D(o);var l=c(o,2),d=e=>{V(e,sr())},f=b(()=>u(p(r)[p(i).key])===`check`),m=e=>{V(e,cr())},g=b(()=>u(p(r)[p(i).key])===`cross`),_=e=>{V(e,lr())},v=b(()=>u(p(r)[p(i).key])===`dash`),x=e=>{var a=ir(),o=y(a,!0);D(a),t(()=>n(o,p(r)[p(i).key])),V(e,a)};h(l,e=>{p(f)?e(d):p(g)?e(m,1):p(v)?e(_,2):e(x,-1)}),D(a),t(()=>n(s,p(i).label)),V(e,a)}),D(g),D(o),t(()=>{s=O(o,1,`compare-card svelte-14kdxof`,null,s,{revealed:p(i)}),n(m,p(r).name)}),V(e,o)}),D(v),D(d),ee(d,e=>a=e,()=>a),V(e,d),L()}function mr(e){return typeof e==`function`}function hr(e){return typeof e==`object`&&!!e}var gr=[`string`,`number`,`bigint`,`boolean`];function _r(e){return e==null||gr.includes(typeof e)?!0:Array.isArray(e)?e.every(e=>_r(e)):typeof e==`object`?Object.getPrototypeOf(e)===Object.prototype:!1}var vr=Symbol(`box`),yr=Symbol(`is-writable`);function $(e,t){let n=b(e);return t?{[vr]:!0,[yr]:!0,get current(){return p(n)},set current(e){t(e)}}:{[vr]:!0,get current(){return e()}}}function br(e){return hr(e)&&vr in e}function xr(e){return br(e)&&yr in e}function Sr(e){return br(e)?e:mr(e)?$(e):Tr(e)}function Cr(e){return Object.entries(e).reduce((e,[t,n])=>br(n)?(xr(n)?Object.defineProperty(e,t,{get(){return n.current},set(e){n.current=e}}):Object.defineProperty(e,t,{get(){return n.current}}),e):Object.assign(e,{[t]:n}),{})}function wr(e){return xr(e)?{[vr]:!0,get current(){return e.current}}:e}function Tr(e){let t=x(I(e));return{[vr]:!0,[yr]:!0,get current(){return p(t)},set current(e){s(t,e,!0)}}}function Er(e){let t=x(I(e));return{[vr]:!0,[yr]:!0,get current(){return p(t)},set current(e){s(t,e,!0)}}}Er.from=Sr,Er.with=$,Er.flatten=Cr,Er.readonly=wr,Er.isBox=br,Er.isWritableBox=xr;function Dr(...e){return function(t){for(let n of e)if(n){if(t.defaultPrevented)return;typeof n==`function`?n.call(this,t):n.current?.call(this,t)}}}var Or=/\d/,kr=[`-`,`_`,`/`,`.`];function Ar(e=``){if(!Or.test(e))return e!==e.toLowerCase()}function jr(e){let t=[],n=``,r,i;for(let a of e){let e=kr.includes(a);if(e===!0){t.push(n),n=``,r=void 0;continue}let o=Ar(a);if(i===!1){if(r===!1&&o===!0){t.push(n),n=a,r=o;continue}if(r===!0&&o===!1&&n.length>1){let e=n.at(-1);t.push(n.slice(0,Math.max(0,n.length-1))),n=e+a,r=o;continue}}n+=a,r=o,i=e}return t.push(n),t}function Mr(e){return e?jr(e).map(e=>Pr(e)).join(``):``}function Nr(e){return Fr(Mr(e||``))}function Pr(e){return e?e[0].toUpperCase()+e.slice(1):``}function Fr(e){return e?e[0].toLowerCase()+e.slice(1):``}function Ir(e){if(!e)return{};let t={};function n(e,n){if(e.startsWith(`-moz-`)||e.startsWith(`-webkit-`)||e.startsWith(`-ms-`)||e.startsWith(`-o-`)){t[Mr(e)]=n;return}if(e.startsWith(`--`)){t[e]=n;return}t[Nr(e)]=n}return Oe(e,n),t}function Lr(...e){return(...t)=>{for(let n of e)typeof n==`function`&&n(...t)}}function Rr(e,t){let n=RegExp(e,`g`);return e=>{if(typeof e!=`string`)throw TypeError(`expected an argument of type string, but got ${typeof e}`);return e.match(n)?e.replace(n,t):e}}var zr=Rr(/[A-Z]/,e=>`-${e.toLowerCase()}`);function Br(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`expected an argument of type object, but got ${typeof e}`);return Object.keys(e).map(t=>`${zr(t)}: ${e[t]};`).join(` +`)}function Vr(e={}){return Br(e).replace(` +`,` `)}var Hr=new Set(`onabort.onanimationcancel.onanimationend.onanimationiteration.onanimationstart.onauxclick.onbeforeinput.onbeforetoggle.onblur.oncancel.oncanplay.oncanplaythrough.onchange.onclick.onclose.oncompositionend.oncompositionstart.oncompositionupdate.oncontextlost.oncontextmenu.oncontextrestored.oncopy.oncuechange.oncut.ondblclick.ondrag.ondragend.ondragenter.ondragleave.ondragover.ondragstart.ondrop.ondurationchange.onemptied.onended.onerror.onfocus.onfocusin.onfocusout.onformdata.ongotpointercapture.oninput.oninvalid.onkeydown.onkeypress.onkeyup.onload.onloadeddata.onloadedmetadata.onloadstart.onlostpointercapture.onmousedown.onmouseenter.onmouseleave.onmousemove.onmouseout.onmouseover.onmouseup.onpaste.onpause.onplay.onplaying.onpointercancel.onpointerdown.onpointerenter.onpointerleave.onpointermove.onpointerout.onpointerover.onpointerup.onprogress.onratechange.onreset.onresize.onscroll.onscrollend.onsecuritypolicyviolation.onseeked.onseeking.onselect.onselectionchange.onselectstart.onslotchange.onstalled.onsubmit.onsuspend.ontimeupdate.ontoggle.ontouchcancel.ontouchend.ontouchmove.ontouchstart.ontransitioncancel.ontransitionend.ontransitionrun.ontransitionstart.onvolumechange.onwaiting.onwebkitanimationend.onwebkitanimationiteration.onwebkitanimationstart.onwebkittransitionend.onwheel`.split(`.`));function Ur(e){return Hr.has(e)}function Wr(...e){let t={...e[0]};for(let n=1;n{let n=u(t,`focusin`,e),r=u(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?Kr(this.#e):null}};var qr=class{#e;#t;constructor(e){this.#e=e,this.#t=Symbol(e)}get key(){return this.#t}exists(){return oe(this.#t)}get(){let e=se(this.#t);if(e===void 0)throw Error(`Context "${this.#e}" not found`);return e}getOr(e){let t=se(this.#t);return t===void 0?e:t}set(e){return T(this.#t,e)}};function Jr(e,t){switch(e){case`post`:v(t);break;case`pre`:a(t);break}}function Yr(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;Jr(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=l(()=>n(t,o));return o=t,r})}function Xr(e,t,n){let r=de(()=>{let i=!1;Yr(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});v(()=>r)}function Zr(e,t,n){Yr(e,`post`,t,n)}function Qr(e,t,n){Yr(e,`pre`,t,n)}Zr.pre=Qr;function $r(e,t){Xr(e,`post`,t)}function ei(e,t){Xr(e,`pre`,t)}$r.pre=ei;function ti(e,t){let n,r=null;return(...i)=>new Promise(a=>{r&&r(void 0),r=a,clearTimeout(n),n=setTimeout(async()=>{let t=await e(...i);r&&=(r(t),null)},t)})}function ni(e,t){let n=0,r=null;return(...i)=>{let a=Date.now();return n&&a-n{p(m).forEach(e=>e()),s(m,[],!0)},g=e=>{s(m,[...p(m),e],!0)},_=async(e,n,r=!1)=>{try{s(d,!0),s(f,void 0),h();let i=new AbortController;g(()=>i.abort());let a=await t(e,n,{data:p(u),refetching:r,onCleanup:g,signal:i.signal});return s(u,a,!0),a}catch(e){e instanceof DOMException&&e.name===`AbortError`||s(f,e,!0);return}finally{s(d,!1)}},v=c?ti(_,c):l?ni(_,l):_,y=Array.isArray(e)?e:[e],b;return r((t,n)=>{a&&b||(b=t,v(Array.isArray(e)?t:t[0],Array.isArray(e)?n:n?.[0]))},{lazy:i}),{get current(){return p(u)},get loading(){return p(d)},get error(){return p(f)},mutate:e=>{s(u,e,!0)},refetch:t=>{let n=y.map(e=>e());return v(Array.isArray(e)?n:n[0],Array.isArray(e)?n:n[0],t??!0)}}}function ii(e,t,n){return ri(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];Zr(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}function ai(e,t,n){return ri(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];Zr.pre(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}ii.pre=ai;function oi(e){v(()=>()=>{e()})}function si(e){o().then(e)}function ci(e,t){return{[d()]:n=>br(e)?(e.current=n,l(()=>t?.(n)),()=>{`isConnected`in n&&n.isConnected||(e.current=null,t?.(null))}):(e(n),l(()=>t?.(n)),()=>{`isConnected`in n&&n.isConnected||(e(null),t?.(null))})}}function li(e){return e?`true`:`false`}function ui(e){return e?``:void 0}function di(e){return e?`open`:`closed`}function fi(e){return e===`starting`?{"data-starting-style":``}:e===`ending`?{"data-ending-style":``}:{}}var pi=class{#e;#t;attrs;constructor(e){this.#e=e.getVariant?e.getVariant():null,this.#t=this.#e?`data-${this.#e}-`:`data-${e.component}-`,this.getAttr=this.getAttr.bind(this),this.selector=this.selector.bind(this),this.attrs=Object.fromEntries(e.parts.map(e=>[e,this.getAttr(e)]))}getAttr(e,t){return t?`data-${t}-${e}`:`${this.#t}${e}`}selector(e,t){return`[${this.getAttr(e,t)}]`}};function mi(e){let t=new pi(e);return{...t.attrs,selector:t.selector,getAttr:t.getAttr}}var hi=`ArrowDown`,gi=`ArrowLeft`,_i=`ArrowRight`,vi=`ArrowUp`,yi=`Home`,bi=`PageDown`,xi=`PageUp`;function Si(e){return window.getComputedStyle(e).getPropertyValue(`direction`)}var Ci=[hi,xi,yi],wi=[vi,bi,`End`];[...Ci,...wi];function Ti(e=`ltr`,t=`horizontal`){return{horizontal:e===`rtl`?gi:_i,vertical:hi}[t]}function Ei(e=`ltr`,t=`horizontal`){return{horizontal:e===`rtl`?_i:gi,vertical:vi}[t]}function Di(e=`ltr`,t=`horizontal`){return[`ltr`,`rtl`].includes(e)||(e=`ltr`),[`horizontal`,`vertical`].includes(t)||(t=`horizontal`),{nextKey:Ti(e,t),prevKey:Ei(e,t)}}var Oi=typeof document<`u`;ki();function ki(){return Oi&&window?.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window?.navigator?.maxTouchPoints>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function Ai(e){return e instanceof HTMLElement}var ji=class{#e;#t=Er(null);constructor(e){this.#e=e}getCandidateNodes(){return this.#e.rootNode.current?this.#e.candidateSelector?Array.from(this.#e.rootNode.current.querySelectorAll(this.#e.candidateSelector)):this.#e.candidateAttr?Array.from(this.#e.rootNode.current.querySelectorAll(`[${this.#e.candidateAttr}]:not([data-disabled])`)):[]:[]}focusFirstCandidate(){let e=this.getCandidateNodes();e.length&&e[0]?.focus()}handleKeydown(e,t,n=!1){let r=this.#e.rootNode.current;if(!r||!e)return;let i=this.getCandidateNodes();if(!i.length)return;let a=i.indexOf(e),{nextKey:o,prevKey:s}=Di(Si(r),this.#e.orientation.current),c=this.#e.loop.current,l={[o]:a+1,[s]:a-1,[yi]:0,End:i.length-1};if(n){let e=o===`ArrowDown`?_i:hi,t=s===`ArrowUp`?gi:vi;l[e]=a+1,l[t]=a-1}let u=l[t.key];if(u===void 0)return;t.preventDefault(),u<0&&c?u=i.length-1:u===i.length&&c&&(u=0);let d=i[u];if(d)return d.focus(),this.#t.current=d.id,this.#e.onCandidateFocus?.(d),d}getTabIndex(e){let t=this.getCandidateNodes(),n=this.#t.current!==null;return e&&!n&&t[0]===e?(this.#t.current=e.id,0):e?.id===this.#t.current?0:-1}setCurrentTabStopId(e){this.#t.current=e}focusCurrentTabStop(){let e=this.#t.current;if(!e)return;let t=this.#e.rootNode.current?.querySelector(`#${e}`);!t||!Ai(t)||t.focus()}},Mi=class{#e;#t=null;#n=null;#r=0;constructor(e){this.#e=e,oi(()=>this.#i())}#i(){this.#t!==null&&(window.cancelAnimationFrame(this.#t),this.#t=null),this.#n?.disconnect(),this.#n=null,this.#r++}run(e){this.#i();let t=this.#e.ref.current;if(!t)return;if(typeof t.getAnimations!=`function`){this.#a(e);return}let n=this.#r,r=()=>{n===this.#r&&this.#a(e)},i=()=>{if(n!==this.#r)return;let e=t.getAnimations();if(e.length===0){r();return}Promise.all(e.map(e=>e.finished)).then(()=>{r()}).catch(()=>{if(n===this.#r){if(t.getAnimations().some(e=>e.pending||e.playState!==`finished`)){i();return}r()}})},a=()=>{this.#t=window.requestAnimationFrame(()=>{this.#t=null,i()})};if(!this.#e.afterTick.current){a();return}this.#t=window.requestAnimationFrame(()=>{this.#t=null;let e=`data-starting-style`;if(!t.hasAttribute(e)){a();return}this.#n=new MutationObserver(()=>{n===this.#r&&(t.hasAttribute(e)||(this.#n?.disconnect(),this.#n=null,a()))}),this.#n.observe(t,{attributes:!0,attributeFilter:[e]})})}#a(e){let t=()=>{e()};this.#e.afterTick?si(t):t()}},Ni=class{#e;#t;#n;#r=x(!1);#i=x(void 0);#a=!1;#o=null;constructor(e){this.#e=e,s(this.#r,e.open.current,!0),this.#t=e.enabled??!0,this.#n=new Mi({ref:this.#e.ref,afterTick:this.#e.open}),oi(()=>this.#s()),Zr(()=>this.#e.open.current,e=>{if(!this.#a){this.#a=!0;return}if(this.#s(),!e&&this.#e.shouldSkipExitAnimation?.()){s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.();return}if(e&&s(this.#r,!0),s(this.#i,e?`starting`:`ending`,!0),e&&(this.#o=window.requestAnimationFrame(()=>{this.#o=null,this.#e.open.current&&s(this.#i,void 0)})),!this.#t){e||s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.();return}this.#n.run(()=>{e===this.#e.open.current&&(this.#e.open.current||s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.())})})}get shouldRender(){return p(this.#r)}get transitionStatus(){return p(this.#i)}#s(){this.#o!==null&&(window.cancelAnimationFrame(this.#o),this.#o=null)}},Pi=mi({component:`accordion`,parts:[`root`,`trigger`,`content`,`item`,`header`]}),Fi=new qr(`Accordion.Root`),Ii=new qr(`Accordion.Item`),Li=class{opts;rovingFocusGroup;attachment;constructor(e){this.opts=e,this.rovingFocusGroup=new ji({rootNode:this.opts.ref,candidateAttr:Pi.trigger,loop:this.opts.loop,orientation:this.opts.orientation}),this.attachment=ci(this.opts.ref)}#e=b(()=>({id:this.opts.id.current,"data-orientation":this.opts.orientation.current,"data-disabled":ui(this.opts.disabled.current),[Pi.root]:``,...this.attachment}));get props(){return p(this.#e)}set props(e){s(this.#e,e)}},Ri=class extends Li{opts;isMulti=!1;constructor(e){super(e),this.opts=e,this.includesItem=this.includesItem.bind(this),this.toggleItem=this.toggleItem.bind(this)}includesItem(e){return this.opts.value.current===e}toggleItem(e){this.opts.value.current=this.includesItem(e)?``:e}},zi=class extends Li{#e;isMulti=!0;constructor(e){super(e),this.#e=e.value,this.includesItem=this.includesItem.bind(this),this.toggleItem=this.toggleItem.bind(this)}includesItem(e){return this.#e.current.includes(e)}toggleItem(e){this.#e.current=this.includesItem(e)?this.#e.current.filter(t=>t!==e):[...this.#e.current,e]}},Bi=class{static create(e){let{type:t,...n}=e,r=t===`single`?new Ri(n):new zi(n);return Fi.set(r)}},Vi=class e{static create(t){return Ii.set(new e({...t,rootState:Fi.get()}))}opts;root;#e=b(()=>this.root.includesItem(this.opts.value.current));get isActive(){return p(this.#e)}set isActive(e){s(this.#e,e)}#t=b(()=>this.opts.disabled.current||this.root.opts.disabled.current);get isDisabled(){return p(this.#t)}set isDisabled(e){s(this.#t,e)}attachment;#n=x(null);get contentNode(){return p(this.#n)}set contentNode(e){s(this.#n,e,!0)}contentPresence;constructor(e){this.opts=e,this.root=e.rootState,this.updateValue=this.updateValue.bind(this),this.attachment=ci(this.opts.ref),this.contentPresence=new Ni({ref:$(()=>this.contentNode),open:$(()=>this.isActive)})}updateValue(){this.root.toggleItem(this.opts.value.current)}#r=b(()=>({id:this.opts.id.current,"data-state":di(this.isActive),"data-disabled":ui(this.isDisabled),"data-orientation":this.root.opts.orientation.current,[Pi.item]:``,...this.attachment}));get props(){return p(this.#r)}set props(e){s(this.#r,e)}},Hi=class e{opts;itemState;#e;#t=b(()=>this.opts.disabled.current||this.itemState.opts.disabled.current||this.#e.opts.disabled.current);attachment;constructor(e,t){this.opts=e,this.itemState=t,this.#e=t.root,this.onclick=this.onclick.bind(this),this.onkeydown=this.onkeydown.bind(this),this.attachment=ci(this.opts.ref)}static create(t){return new e(t,Ii.get())}onclick(e){if(p(this.#t)||e.button!==0){e.preventDefault();return}this.itemState.updateValue()}onkeydown(e){if(!p(this.#t)){if(e.key===` `||e.key===`Enter`){e.preventDefault(),this.itemState.updateValue();return}this.#e.rovingFocusGroup.handleKeydown(this.opts.ref.current,e)}}#n=b(()=>({id:this.opts.id.current,disabled:p(this.#t),"aria-expanded":li(this.itemState.isActive),"aria-disabled":li(p(this.#t)),"data-disabled":ui(p(this.#t)),"data-state":di(this.itemState.isActive),"data-orientation":this.#e.opts.orientation.current,[Pi.trigger]:``,tabindex:this.opts.tabindex.current,onclick:this.onclick,onkeydown:this.onkeydown,...this.attachment}));get props(){return p(this.#n)}set props(e){s(this.#n,e)}},Ui=class e{opts;item;attachment;#e=void 0;#t=!1;#n=x(I({width:0,height:0}));#r=b(()=>this.opts.hiddenUntilFound.current?this.item.isActive:this.opts.forceMount.current||this.item.isActive);get open(){return p(this.#r)}set open(e){s(this.#r,e)}constructor(e,t){this.opts=e,this.item=t,this.#t=this.item.isActive,this.attachment=ci(this.opts.ref,e=>this.item.contentNode=e),v(()=>{let e=requestAnimationFrame(()=>{this.#t=!1});return()=>cancelAnimationFrame(e)}),Zr.pre([()=>this.opts.ref.current,()=>this.opts.hiddenUntilFound.current],([e,t])=>!e||!t?void 0:u(e,`beforematch`,()=>{this.item.isActive||requestAnimationFrame(()=>{this.item.updateValue()})})),Zr([()=>this.open,()=>this.opts.ref.current],this.#i)}static create(t){return new e(t,Ii.get())}#i=([e,t])=>{t&&si(()=>{let e=this.opts.ref.current;if(!e)return;this.#e??={transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();s(this.#n,{width:t.width,height:t.height},!0),!this.#t&&this.#e&&(e.style.transitionDuration=this.#e.transitionDuration,e.style.animationName=this.#e.animationName)})};get shouldRender(){return this.item.contentPresence.shouldRender}#a=b(()=>({open:this.item.isActive}));get snippetProps(){return p(this.#a)}set snippetProps(e){s(this.#a,e)}#o=b(()=>({id:this.opts.id.current,"data-state":di(this.item.isActive),...fi(this.item.contentPresence.transitionStatus),"data-disabled":ui(this.item.isDisabled),"data-orientation":this.item.root.opts.orientation.current,[Pi.content]:``,style:{"--bits-accordion-content-height":`${p(this.#n).height}px`,"--bits-accordion-content-width":`${p(this.#n).width}px`},hidden:this.opts.hiddenUntilFound.current&&!this.item.isActive?`until-found`:void 0,...this.opts.hiddenUntilFound.current&&!this.shouldRender?{}:{hidden:this.opts.hiddenUntilFound.current?!this.shouldRender:this.opts.forceMount.current?void 0:!this.shouldRender},...this.attachment}));get props(){return p(this.#o)}set props(e){s(this.#o,e)}},Wi=class e{opts;item;attachment;constructor(e,t){this.opts=e,this.item=t,this.attachment=ci(this.opts.ref)}static create(t){return new e(t,Ii.get())}#e=b(()=>({id:this.opts.id.current,role:`heading`,"aria-level":this.opts.level.current,"data-heading-level":this.opts.level.current,"data-state":di(this.item.isActive),"data-orientation":this.item.root.opts.orientation.current,[Pi.header]:``,...this.attachment}));get props(){return p(this.#e)}set props(e){s(this.#e,e)}};function Gi(){}function Ki(e,t){return t===void 0?`bits-${e}`:`bits-${e}-${t}`}var qi=new Set([`$$slots`,`$$events`,`$$legacy`,`disabled`,`children`,`child`,`type`,`value`,`ref`,`id`,`onValueChange`,`loop`,`orientation`]),Ji=r(`
`);function Yi(e,t){let n=f();j(t,!0);let r=A(t,`disabled`,3,!1),a=A(t,`value`,15),o=A(t,`ref`,15,null),s=A(t,`id`,19,()=>Ki(n)),c=A(t,`onValueChange`,3,Gi),l=A(t,`loop`,3,!0),u=A(t,`orientation`,3,`vertical`),d=w(t,qi);function m(){a()===void 0&&a(t.type===`single`?``:[])}m(),Zr.pre(()=>a(),()=>{m()});let _=Bi.create({type:t.type,value:$(()=>a(),e=>{a(e),c()(e)}),id:$(()=>s()),disabled:$(()=>r()),loop:$(()=>l()),orientation:$(()=>u()),ref:$(()=>o(),e=>o(e))}),v=b(()=>Wr(d,_.props));var x=g(),S=i(x),C=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(v)})),V(e,n)},T=e=>{var n=Ji();M(n,()=>({...p(v)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(S,e=>{t.child?e(C):e(T,-1)}),V(e,x),L()}var Xi=new Set([`$$slots`,`$$events`,`$$legacy`,`id`,`disabled`,`value`,`children`,`child`,`ref`]),Zi=r(`
`);function Qi(e,t){let n=f();j(t,!0);let r=Ki(n),a=A(t,`id`,3,r),o=A(t,`disabled`,3,!1),s=A(t,`value`,3,r),c=A(t,`ref`,15,null),l=w(t,Xi),u=Vi.create({value:$(()=>s()),disabled:$(()=>o()),id:$(()=>a()),ref:$(()=>c(),e=>c(e))}),d=b(()=>Wr(l,u.props));var m=g(),_=i(m),v=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(d)})),V(e,n)},x=e=>{var n=Zi();M(n,()=>({...p(d)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(_,e=>{t.child?e(v):e(x,-1)}),V(e,m),L()}var $i=new Set([`$$slots`,`$$events`,`$$legacy`,`id`,`level`,`children`,`child`,`ref`]),ea=r(`
`);function ta(e,t){let n=f();j(t,!0);let r=A(t,`id`,19,()=>Ki(n)),a=A(t,`level`,3,2),o=A(t,`ref`,15,null),s=w(t,$i),c=Wi.create({id:$(()=>r()),level:$(()=>a()),ref:$(()=>o(),e=>o(e))}),l=b(()=>Wr(s,c.props));var u=g(),d=i(u),m=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(l)})),V(e,n)},_=e=>{var n=ea();M(n,()=>({...p(l)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(d,e=>{t.child?e(m):e(_,-1)}),V(e,u),L()}var na=new Set([`$$slots`,`$$events`,`$$legacy`,`disabled`,`ref`,`id`,`tabindex`,`children`,`child`]),ra=r(``);function ia(e,t){let n=f();j(t,!0);let r=A(t,`disabled`,3,!1),a=A(t,`ref`,15,null),o=A(t,`id`,19,()=>Ki(n)),s=A(t,`tabindex`,3,0),c=w(t,na),l=Hi.create({disabled:$(()=>r()),id:$(()=>o()),tabindex:$(()=>s()??0),ref:$(()=>a(),e=>a(e))}),u=b(()=>Wr(c,l.props));var d=g(),m=i(d),_=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(u)})),V(e,n)},v=e=>{var n=ra();M(n,()=>({type:`button`,...p(u)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(m,e=>{t.child?e(_):e(v,-1)}),V(e,d),L()}var aa=new Set([`$$slots`,`$$events`,`$$legacy`,`child`,`ref`,`id`,`forceMount`,`children`,`hiddenUntilFound`]),oa=r(`
`);function sa(e,t){let n=f();j(t,!0);let r=A(t,`ref`,15,null),a=A(t,`id`,19,()=>Ki(n)),o=A(t,`forceMount`,3,!1),s=A(t,`hiddenUntilFound`,3,!1),c=w(t,aa),l=Ui.create({forceMount:$(()=>o()),id:$(()=>a()),ref:$(()=>r(),e=>r(e)),hiddenUntilFound:$(()=>s())}),u=b(()=>Wr(c,l.props));var d=g(),m=i(d),_=e=>{var n=g(),r=i(n);{let e=b(()=>({props:p(u),...l.snippetProps}));B(r,()=>t.child,()=>p(e))}V(e,n)},v=e=>{var n=oa();M(n,()=>({...p(u)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(m,e=>{t.child?e(_):e(v,-1)}),V(e,d),L()}var ca=new Set([`$$slots`,`$$events`,`$$legacy`,`children`]);function la(e,t){let n=w(t,ca);var r=g();C(i(r),()=>Yi,(e,r)=>{r(e,P({class:`w-full`},()=>n,{children:(e,n)=>{var r=g();B(i(r),()=>t.children),V(e,r)},$$slots:{default:!0}}))}),V(e,r)}var ua=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]);function da(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,ua);var o=g(),s=i(o);{let e=b(()=>Z(`border-b border-[var(--border)]`,r()));C(s,()=>Qi,(r,o)=>{o(r,P({get class(){return p(e)}},()=>a,{get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=g();B(i(r),()=>t.children),V(e,r)},$$slots:{default:!0}}))})}V(e,o),L()}var fa=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]),pa=r(` `,1);function ma(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,fa);var o=g();C(i(o),()=>ta,(e,o)=>{o(e,P({class:`flex`},()=>a,{children:(e,a)=>{var o=g(),s=i(o);{let e=b(()=>Z(`flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline text-[var(--foreground)] [&[data-state=open]>svg]:rotate-180`,r()));C(s,()=>ia,(r,a)=>{a(r,{get class(){return p(e)},get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=pa(),a=i(r);B(a,()=>t.children),Pe(c(a,2),{class:`h-4 w-4 shrink-0 transition-transform duration-200`}),V(e,r)},$$slots:{default:!0}})})}V(e,o)},$$slots:{default:!0}}))}),V(e,o),L()}var ha=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]),ga=r(`
`);function _a(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,ha);var o=g(),s=i(o);{let e=b(()=>Z(`overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down`,r()));C(s,()=>sa,(r,i)=>{i(r,P({get class(){return p(e)}},()=>a,{get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=ga();B(y(r),()=>t.children),D(r),V(e,r)},$$slots:{default:!0}}))})}V(e,o),L()}var va=r(` `,1),ya=r(`

Frequently asked questions

Everything you need to know about using cora.

`);function ba(e){let r=[{question:`What does "BYOK" mean?`,answer:`Bring Your Own Key — you use your own LLM API key (OpenAI, Anthropic, Groq, Ollama, or Z.AI). cora never charges for AI usage. Your API costs depend on your provider.`,value:`byok`},{question:`Does cora send my code to third parties?`,answer:`No. Your code is sent only to the LLM provider you configure. cora itself has no backend, no telemetry, no analytics. Everything runs locally in your terminal.`,value:`privacy`},{question:`Which LLM providers are supported?`,answer:`OpenAI (GPT-4o, etc.), Anthropic (Claude), Groq (Llama), Ollama (local models), and Z.AI (GLM). You can also add custom providers with any OpenAI-compatible API.`,value:`providers`},{question:`How is cora different from GitHub Copilot Code Review?`,answer:`copa is a CLI tool — it runs in your terminal, not in GitHub. You choose your own LLM provider and model. It works with any git workflow, any hosting platform, and any CI/CD pipeline.`,value:`comparison`},{question:`Can I use cora in CI/CD?`,answer:`Yes. cora works in GitHub Actions, GitLab CI, and any CI that supports CLI tools. Use the --staged or --base flags for automated reviews on PRs.`,value:`ci`},{question:`What languages does cora support?`,answer:`cora reviews any text-based code. Since it uses LLMs for analysis, it understands virtually all programming languages. The quality of review depends on the model you choose.`,value:`languages`},{question:`Is cora free?`,answer:`cora is open source and free to use. You only pay for your own LLM API usage through your provider. With Ollama, you can run it completely free with local models.`,value:`pricing`},{question:`How do I configure review rules?`,answer:`Create a .cora.yaml file in your project root. You can configure focus areas, ignore patterns, severity thresholds, and hook settings. See the Configuration docs for details.`,value:`config`}];var a=ya(),o=c(y(a),4);la(y(o),{type:`single`,collapsible:!0,children:(e,a)=>{var o=g();E(i(o),1,()=>r,le,(e,r)=>{da(e,{get value(){return p(r).value},children:(e,a)=>{var o=va(),s=i(o);ma(s,{class:`text-left text-[var(--foreground)] hover:no-underline`,children:(e,i)=>{z();var a=re();t(()=>n(a,p(r).question)),V(e,a)},$$slots:{default:!0}}),_a(c(s,2),{class:`text-[var(--muted-foreground)]`,children:(e,i)=>{z();var a=re();t(()=>n(a,p(r).answer)),V(e,a)},$$slots:{default:!0}}),V(e,o)},$$slots:{default:!0}})}),V(e,o)},$$slots:{default:!0}}),D(o),D(a),V(e,a)}var xa=r(`

`);function Sa(e,r){j(r,!0);let a=A(r,`descriptionClass`,3,`text-[var(--muted-foreground)]`),o=A(r,`delayMs`,3,0);var s=xa();let l;var u=y(s),d=y(u,!0);D(u);var f=c(u,2),p=y(f),m=y(p,!0);D(p);var _=c(p,2),v=y(_,!0);D(_);var b=c(_,2),x=e=>{var t=g();B(i(t),()=>r.terminalCode),V(e,t)};h(b,e=>{r.terminalCode&&e(x)}),D(f),D(s),t((e,t)=>{O(s,1,e),l=te(s,``,l,{"transition-delay":o()?`${o()}ms`:void 0}),n(d,r.number),n(m,r.title),O(_,1,t),n(v,r.description)},[()=>F(Z(`timeline-step scroll-reveal`,r.class)),()=>F(Z(`mt-1 mb-4 text-sm`,a()))]),V(e,s),L()}var Ca=r(`$ curl -fsSL https://cora.dev/install | sh`,1),wa=r(`$ export OPENAI_API_KEY="sk-..."`,1),Ta=r(`$ CORA_API_KEY=key cora review --staged`,1),Ea=r(`

Start in 30 seconds

No account required. No subscription. No cloud.

Ready to ship better code?

No account. No subscription. No cloud.

`);function Da(e){var t=Ea(),n=c(y(t),4),r=y(n);Sa(r,{number:1,title:`Install`,description:`Single binary, no dependencies.`,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=Ca();z(8),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}});var i=c(r,2);Sa(i,{number:2,title:`Set API key`,description:`Use your existing OpenAI or Anthropic key.`,delayMs:100,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=wa();z(6),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}});var a=c(i,2);Sa(a,{number:3,title:`Review`,description:`Review your staged changes.`,delayMs:200,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=Ta();z(8),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}}),Sa(c(a,2),{number:4,title:`Done`,description:`That's it. No account. No subscription.`,descriptionClass:`text-[var(--success)]`,delayMs:300}),D(n);var o=c(n,2),s=c(y(o),4),l=y(s);Ae(y(l),{size:18}),z(),D(l);var u=c(l,2);ot(y(u),{size:18}),z(),D(u),D(s),D(o),z(2),D(t),V(e,t)}var Oa=r(``),ka=r(`
`);function Aa(e,t){j(t,!1),ae(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),document.querySelectorAll(`.compare-table tbody tr`).forEach((t,n)=>{t.style.transitionDelay=`${n*60}ms`,e.observe(t)}),document.querySelectorAll(`.timeline-number`).forEach(t=>e.observe(t)),()=>{e.disconnect()}}),R();var n=ka();k(`1uha8ag`,e=>{var t=Oa();m(()=>{_.title=`cora — AI Code Review CLI`}),V(e,t)});var r=y(n);Rn(r,{});var i=c(r,2);Bn(i,{});var a=c(i,2);Gn(a,{});var o=c(a,2);Yn(o,{});var s=c(o,2);Qn(s,{});var l=c(s,2);pr(l,{});var u=c(l,2);ba(u,{}),Da(c(u,2),{}),D(n),V(e,n),L()}export{Aa as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/4.DOawxC2l.js b/website/.svelte-kit/output/client/_app/immutable/nodes/4.DOawxC2l.js new file mode 100644 index 0000000..ac4342f --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/4.DOawxC2l.js @@ -0,0 +1 @@ +import{it as e,rt as t,s as n}from"../chunks/Du04-Wio.js";import{t as r}from"../chunks/DyVSz01m.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";function i(i,a){e(a,!1),r(`/docs/getting-started`,{replaceState:!0}),n(),t()}export{i as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/5.CZek6GP7.js b/website/.svelte-kit/output/client/_app/immutable/nodes/5.CZek6GP7.js new file mode 100644 index 0000000..f8c2059 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/5.CZek6GP7.js @@ -0,0 +1,2 @@ +import{B as e,C as t,E as n,K as r,P as i,R as a,S as o,U as s,W as c,b as l,ct as u,h as d,it as f,n as p,rt as m,s as h,st as g,u as _,w as v,x as y,y as b}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var x='# Changelog\n\nAll notable changes to cora-cli are documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n## [0.4.0] - 2026-06-03\n\n### Added\n\n- **Deterministic rule engine** — pre-LLM regex-based rules that always report findings (no LLM dismissal). 12 built-in rules covering security (hardcoded URLs, secrets, TLS disabled, debug prints), SQL injection, TODO/FIXME, `panic!`/`unwrap` in new code, and large functions (#116)\n- **Custom rules via `.cora.yaml`** — define project-specific regex rules with severity, category, exclude patterns, and glob file matching\n- **Unified diff parser** — parse git diff into structured `FileChunk`/`DiffHunk`/`DiffLine` with language detection for 70+ extensions\n- **File bundling engine** — smart grouping by directory and language family with configurable character/file limits. Bundle types: related, config, test, large, standalone. Token budget estimation (~4 chars/token). Defers full parallel review to v0.5 (#115)\n- **Cross-file context chain** — deterministic symbol extraction (imports, function calls, type references) for 5 languages (Rust, Python, JS, Go, Java) with token-budgeted context injection into LLM prompt (#114)\n- **`BundlingConfig`** — `strategy`, `max_chars_per_group`, `max_files_per_group`, `coalesce_by_directory`, `coalesce_by_language` in `.cora.yaml`\n- **`ContextConfig`** — `enabled`, `max_context_tokens`, `follow_depth`, `max_symbols` in `.cora.yaml` review section\n- **Default SARIF upload to GitHub Code Scanning ON** — opt-out with `upload-sarif: false` (#148)\n- **SARIF tool branding** — `CodeCora` driver name (`codecoradev/cora-cli`) in SARIF output (#148)\n\n### Changed\n\n- **Review pipeline** — rules engine runs before LLM call, context chain enriches LLM prompt with cross-file dependencies\n- **LLM failure handling** — deterministic rule findings always visible even when LLM call fails\n\n## [0.3.0] - 2026-06-03\n\n### Added\n\n- **Static analysis context injection** — optional clippy output injected into review prompt to reduce false positives on verified-intentional changes (#140)\n- **`review.static_analysis.auto_clippy`** config — automatically run `cargo clippy` and filter output to changed files\n- **`review.static_analysis.clippy_output_file`** config — read pre-computed clippy output from file\n- **`cora config validate`** subcommand — validate `.cora.yaml` configuration file and report issues (#88)\n- **`CoraError` enum via thiserror** — structured error types for engine layer with 17 variants (#86)\n\n### Changed\n\n- **Engine layer migrated from `anyhow` to `thiserror`** — structured error handling in engine, `anyhow` retained in CLI layer (#86)\n- **All clippy pedantic warnings resolved** — 175 → 0 warnings across entire codebase (#84)\n- **Repo URLs updated** to `codecoradev/cora-cli` org (#137)\n- **CI actions bumped** — `upload-artifact@v7`, Node 24 strict mode (`FORCE_JAVASCRIPT_ACTIONS_TO_NODE24`) (#142)\n\n### Fixed\n\n- **CI Cora Review fails on LLM API errors** — removed `|| true` suppression, added exit code + empty SARIF check (#142)\n- **Match arm merge in `IssueType::from_str`** — clarified documentation (#141)\n\n## [0.2.0] - 2026-06-02\n\n### Added\n\n- **`--progress` flag** — NDJSON progress events to stderr for structured CI/GUI consumers (Termul prerequisite) (#108)\n- **`--max-diff-size` flag** — override `hook.max_diff_size` for large diffs from CLI (#112)\n- **Output footer watermark** — Cora version stamp in terminal, SARIF, and JSON output when issues found (#106)\n- **Security audit CI** — `cargo audit` via `rustsec/audit-check` for dependency CVE scanning (#85)\n\n### Changed\n\n- **Naive .gitignore parser → `ignore` crate** — ripgrep-grade correctness with nested .gitignore, global gitignore, and `.git/info/exclude` support (#80)\n- **Blanket `#![allow(dead_code)]` removed** — targeted cleanup, 27 warnings → 0 (#79)\n\n### Fixed\n\n- **`REQUESTS_CA_BUNDLE` env var support** — custom CA certificates for corporate proxies, additive to built-in root certs (#74)\n- **`tls_built_in_root_certs(false)` security fix** — custom CA bundle now added alongside system roots instead of replacing them (caught by Cora self-review)\n- **`require_git(false)` on WalkBuilder** — gitignore rules applied even outside git repositories (#112)\n- **CI `actions-rs/audit-check` → `rustsec/audit-check`** — replaced archived GitHub Action (#112)\n- **Cora CI diff limit** — `CORA_CONFIG` env var with temp config for 200K char limit in CI action (#112)\n\n## [0.1.8] - 2026-06-02\n\n### Fixed\n\n- **`unwrap()` → `expect()`** in ProgressStyle templates (llm.rs, scanner.rs) — clearer panic messages on template parse failure (#87)\n- **Consolidated duplicate `impl Severity` blocks** into single implementation (#83)\n- **`file_content_hash` returns `Option`** instead of empty string on read failure — prevents infinite rescan loop on unreadable files (#77)\n- **Permission errors logged in scanner** — file walk now logs permission errors at debug level instead of silently skipping (#76)\n- **Auth file permission warning** — warns if `~/.cora/auth.toml` has overly permissive file permissions (Unix only) (#72)\n- **SARIF upload size validation** — validates SARIF file size against GitHub\'s 10MB limit before upload (#82)\n- **Float division for MB display** — SARIF size error now shows accurate fractional MB (was integer division truncating to 0) (#82)\n- **Non-deterministic `DefaultHasher` → `sha2`** — scan cache now uses SHA-256 for deterministic hashing across Rust versions (#81)\n\n### Added\n\n- **`checksums-sha256.txt` in release artifacts** — release workflow generates SHA-256 checksums for all platform binaries (#109)\n\n### Changed\n\n- **Official CodeCora branding assets** — logo, favicon, and OG image updated from ajianaz/cora SaaS repo (#110)\n- **Standalone `cora-review.yml` workflow** — CI action extracted from inline `ci.yml` job to dedicated workflow with concurrency control (#107)\n- **Action v2 hardened** — all third-party actions pinned to commit SHA, checksum verification for binary downloads, env var indirection for inputs, `grep` pipefail fix, empty file guard, Node 24 strict mode compatibility (#107)\n\n## [0.1.7] - 2026-06-01\n\n### Added\n\n- **Diff-hash caching** — review results cached by SHA-256 of diff + model + temperature in `~/.cache/cora/reviews/`. Cache TTL configurable via `llm.cache_ttl` (#100)\n- **`--no-cache` flag** — bypass cache for fresh reviews (#100)\n- **Configurable LLM parameters** — `llm.temperature` (default: 0), `llm.max_tokens` (default: 4096), `llm.timeout` (default: 120s), `llm.cache_ttl` (default: 1440 min) in `.cora.yaml` (#98 #101)\n- **Git ref validation** — rejects refs containing shell metacharacters or path traversal sequences (#73)\n\n### Fixed\n\n- **Temperature default now 0** — eliminates non-deterministic LLM output. Same diff produces identical issues on every run (#98, #97)\n- **HTTP timeout actually works** — per-request timeout via reqwest RequestBuilder (not client-level). Configurable timeout respected (#99)\n- **Connection pooling** — shared reqwest::Client via LazyLock, reused across all requests (#99)\n- **Cache key includes model + temperature** — config changes invalidate cache automatically (#100)\n- **Silent config corruption** — malformed `.cora.yaml` now shows clear error with file path and hint (#78)\n- **Composite action KeyError on API failure** — version resolution retries 3x with 5s delay, falls back to v0.1.6 with warning. Fixed in both `cora-review` and `cora-review-simple` actions (#102)\n\n## [0.1.6] - 2026-06-01\n\n### Added\n\n- **Custom system prompts via config** — `review.system_prompt`, `review.system_prompt_file`, `scan.system_prompt`, `scan.system_prompt_file` fields in `.cora.yaml` (#94)\n- **`response_format` config** — opt-in `json_object` response format for providers that support it, via `review.response_format: json_object` (#92)\n- **File path injection into prompts** — valid diff file paths are injected into the review user prompt to reduce LLM hallucination (#93)\n- **Post-parse file path filtering** — issues referencing non-existent files are filtered out after LLM response parsing (#93)\n- **Enhanced default system prompts** — both review and scan prompts now include explicit anti-hallucination constraints, severity definitions, and format instructions (#95)\n\n### Fixed\n\n- **Path traversal in `system_prompt_file`** — arbitrary file read vulnerability. Now validates file path is within canonicalized project root (#92)\n- **Symlink bypass in path traversal guard** — project root is now canonicalized to match resolved file paths\n\n## [0.1.5] - 2026-06-01\n\n### Fixed\n\n- **Critical: JSON repair corrupts valid unicode escapes** — `is_valid_json_escape()` missing `\'u\'`, causing `\\uXXXX` to be double-escaped. Now properly validates and handles incomplete `\\u` sequences (#89)\n- **Critical: TOML injection in `save_api_key()`** — API key written via `format!` string interpolation. Now uses `toml::Table` serialization (#69)\n- **Retry prompt improvement** — retry on parse failure now includes stricter JSON format instructions (#90)\n- **Temp file race condition** — SARIF upload now uses PID-suffixed temp path instead of fixed filename (#70)\n- **Confusing unused `_cli_api_key` parameter** — removed from `load_config()` signature (#75)\n\n### Security\n\n- `save_api_key()` now uses `toml::Table::insert()` instead of string interpolation (prevents TOML injection)\n- Temp SARIF file path includes process ID (prevents TOCTOU race)\n\n## [0.1.4] - 2026-06-01\n\n### Added\n\n- LLM JSON repair engine (`repair_invalid_escapes`) — auto-fixes invalid escape sequences in LLM output (e.g. `\\s`, `\\d`) before JSON parse\n- Retry mechanism in `review_diff` — if first LLM parse fails, automatically retries once\n- Branding footer on "No issues found" PR comment — consistent with issues-found variant\n\n### Fixed\n\n- **Silent false-negative** — cora JSON parse failure previously posted "No issues found" without actual review (LLM invalid escapes)\n- Hardcoded Infisical `identity-id` in `release.yml` and `deploy-website.yml` — migrated to `secrets.INFISICAL_IDENTITY_ID`\n- Release workflow changelog extraction — `v` prefix mismatch (tag `v0.1.3` vs CHANGELOG `[0.1.3]`) now properly stripped\n- `printf` double-escape in release workflow — `\\\\n` corrected to `\\n`\n- Stale `v0.1.2` binary download filenames in README\n- Clippy `unnecessary_map_or` lint — `.map_or(false, |s| s.success())` replaced with `.is_ok_and(|s| s.success())`\n\n### Changed\n\n- All 3 workflows use `secrets.INFISICAL_IDENTITY_ID` (consistent with `ci.yml` pattern)\n- Release workflow validates semver format before sed injection\n- Branch cleanup — removed 14 stale branches\n\n## [0.1.3] - 2026-06-01\n\n### Added\n\n- `cora config set --global` — write config to `~/.cora/config.yaml` instead of project `.cora.yaml`\n- `cora config set base_url` — set base URL via CLI (previously only in YAML)\n- Global config support (`~/.cora/config.yaml`) with priority chain: CLI flags → env vars → project → global → defaults\n- Auto-migration from old `~/.cora/config.toml` to new YAML + `auth.toml` split\n\n### Changed\n\n- `cora config set` now writes YAML instead of TOML (compatible with config loader)\n- API key storage moved from `~/.cora/config.toml` to `~/.cora/auth.toml` (0600 permissions)\n- YAML serialization uses `skip_serializing_if` — no more `null` values in output\n\n### Fixed\n\n- **Severity comparison inverted** — `Critical` issues no longer silently pass `should_block` check (Ord ordering bug)\n- Hook `mode: block` no longer exits with code 2 when "No issues found" (severity filter mismatch)\n- Consistent severity logic across review, scan, and block mode paths\n\n## [0.1.2] - 2025-05-29\n\n### Added\n\n- `cora init` — create `.cora.yaml` config file with provider/model selection\n- `cora hook install|uninstall` — pre-commit hook management\n- `cora config show|set` — configuration management\n- CI composite action (`cora-review-simple`) for easy GitHub Actions integration\n- Shell completions for bash, zsh, fish, and powershell\n- `cora scan --incremental` with SHA256 content hash cache for fast incremental scanning\n- `cora review --upload` for direct SARIF upload to GitHub Code Scanning\n- `cora review --stream` for real-time review output\n- `cora review --unpushed` for reviewing unpushed commits\n- `cora review --base ` for branch comparison\n- `cora review --diff-file ` for reviewing external diff files\n- `cora providers` command to list available LLM providers\n- `cora auth login` for interactive API key storage\n\n### Fixed\n\n- SARIF schema compliance for GitHub Code Scanning upload\n- Clippy `format_in_format_args` warnings\n- Replaced deprecated `serde_yaml` with `serde_yaml_ng`\n- Normalized release binary naming (`cora-{arch}-{target}-v{version}.tar.gz`)\n\n### Changed\n\n- Replaced deprecated dependencies\n- Removed unused dependencies\n- Bumped minimum Rust version to 1.85\n\n## [0.1.1] - 2025-05-27\n\n### Changed\n\n- Replaced ASCII art banner with eye icon in README\n- Updated README branding to cora-cli\n\n### Fixed\n\n- CI `cargo publish` with `--allow-dirty` for Cargo.lock mismatch on tag checkout\n\n## [0.1.0] - 2025-05-25\n\n### Added\n\n- **AI Code Review** — review staged changes, commit ranges, branch diffs, and full project scans\n- **BYOK** — bring your own API key (OpenAI, Anthropic, Groq, Ollama, Google)\n- **5 LLM Providers** — with auto-detection from installed API keys\n- **Pre-commit Hooks** — `cora hook install` for automatic review on every commit\n- **SARIF Output** — `--format sarif` for GitHub Code Scanning integration\n- **4 Output Formats** — pretty (colored), compact, JSON, SARIF\n- **Project Config** — `.cora.yaml` per-project configuration with provider, focus, rules, ignore, and hook settings\n- **Environment Variables** — `CORA_API_KEY`, `CORA_MODEL`, `CORA_PROVIDER`, `CORA_BASE_URL`, `CORA_CONFIG`, `CORA_FORMAT`\n- **Severity Levels** — `info`, `minor`, `major`, `critical` with configurable thresholds\n- **Focus Areas** — `security`, `performance`, `bugs`, `best_practice`, `maintainability`\n- **Ignore Rules** — file patterns and rule-level exclusions\n- **Cross-platform** — Linux (x86_64, ARM64), macOS (Apple Silicon), Windows (x86_64)\n- **MIT License** — fully open source\n\n[Unreleased]: https://github.com/codecoradev/cora-cli/compare/v0.4.0...develop\n[0.4.0]: https://github.com/codecoradev/cora-cli/compare/v0.3.0...v0.4.0\n[0.3.0]: https://github.com/codecoradev/cora-cli/compare/v0.2.0...v0.3.0\n[0.2.0]: https://github.com/codecoradev/cora-cli/compare/v0.1.8...v0.2.0\n[0.1.8]: https://github.com/codecoradev/cora-cli/compare/v0.1.7...v0.1.8\n[0.1.7]: https://github.com/codecoradev/cora-cli/compare/v0.1.6...v0.1.7\n[0.1.6]: https://github.com/codecoradev/cora-cli/compare/v0.1.5...v0.1.6\n[0.1.5]: https://github.com/codecoradev/cora-cli/compare/v0.1.4...v0.1.5\n[0.1.4]: https://github.com/codecoradev/cora-cli/compare/v0.1.3...v0.1.4\n[0.1.3]: https://github.com/codecoradev/cora-cli/compare/v0.1.2...v0.1.3\n[0.1.2]: https://github.com/codecoradev/cora-cli/compare/v0.1.1...v0.1.2\n[0.1.1]: https://github.com/codecoradev/cora-cli/compare/v0.1.0...v0.1.1\n[0.1.0]: https://github.com/codecoradev/cora-cli/releases/tag/v0.1.0',S=n(``),C=n(`Unreleased`),w=n(` `),T=n(`
  • `),E=n(`

      `),D=n(`

      `),O=n(`

      Changelog

      For the full changelog, see the repository.

      `);function k(n,k){f(k,!1);let A=`https://github.com/codecoradev/cora-cli`;function j(e){let t=[],n=e.split(/^## \[/m);for(let e of n){let n=e.match(/^\[([^\]]+)\]\s*(?:-\s*)?(\d{4}-\d{2}-\d{2})/);if(!n)continue;let r=n[1],i=n[2];if(r===`Unreleased`&&!e.match(/^###\s+\w+/m))continue;let a=[],o=e.split(/^###\s+/m);for(let e of o){let t=e.match(/^(\w[\w\s]*?)(?:\s*)\n([\s\S]*)$/);if(!t)continue;let n=t[1].trim(),r=t[2].split(` +`).map(e=>e.replace(/^-\s*/,``).trim()).filter(Boolean);r.length>0&&a.push({type:n,items:r})}let s;s=r===`Unreleased`?`${A}/compare/v0.1.3...develop`:`${A}/releases/tag/v${r}`,t.push({version:r,date:i,url:s,categories:a})}return t}let M=j(x);p(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),h();var N=O();d(`4kl4db`,e=>{var t=S();a(()=>{s.title=`Changelog — cora docs`}),v(e,t)});var P=r(c(N),2);_(r(c(P)),`href`,`https://github.com/codecoradev/cora-cli/blob/develop/CHANGELOG.md`),g(),u(P),l(r(P,2),1,()=>M,y,(n,a)=>{var s=D(),d=c(s),f=c(d),p=e=>{v(e,C())},m=n=>{var r=w(),o=c(r);u(r),e(()=>{_(r,`href`,i(a).url),t(o,`v${i(a).version??``}`)}),v(n,r)};o(f,e=>{i(a).version===`Unreleased`?e(p):e(m,-1)});var h=r(f,2),g=c(h,!0);u(h),u(d),l(r(d,2),1,()=>i(a).categories,y,(n,a)=>{var o=E(),s=c(o),d=c(s,!0);u(s);var f=r(s,2);l(f,5,()=>i(a).items,y,(e,t)=>{var n=T();b(n,()=>i(t),!0),u(n),v(e,n)}),u(f),u(o),e(()=>t(d,i(a).type)),v(n,o)}),u(s),e(()=>t(g,i(a).date)),v(n,s)}),u(N),v(n,N),m()}export{k as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/6.ChPTFH0w.js b/website/.svelte-kit/output/client/_app/immutable/nodes/6.ChPTFH0w.js new file mode 100644 index 0000000..5c69b6a --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/6.ChPTFH0w.js @@ -0,0 +1 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(``),u=e(`

      CLI Reference

      Complete command reference for the cora CLI.

      Global Flags

      FlagDescription
      --config <path>Override config file path (default: .cora.yaml)
      --format <fmt>Output format: pretty, json, compact, sarif
      --no-colorDisable colored output
      --provider <name>Override provider
      --model <name>Override model
      --base-url <url>Override API base URL
      --api-key <key>Override API key
      --verboseEnable debug logging

      Commands

      CommandDescription
      cora initCreate .cora.yaml config file
      cora reviewReview code changes (default: staged files)
      cora review --stagedReview staged git changes explicitly
      cora review --unstagedReview unstaged working changes
      cora review --unpushedReview unpushed commits
      cora review --base <branch>Compare current branch against target
      cora review --commit <ref>Review specific commit or range
      cora review --diff-file <path>Review from a diff file
      cora review --uploadReview and upload SARIF to GitHub Code Scanning
      cora scan <path>Scan files for issues
      cora scan . [--incremental]Scan only changed files
      cora config showShow resolved configuration
      cora config set <key> <value>Set a config value
      cora hook installInstall pre-commit hook
      cora hook uninstallRemove pre-commit hook
      cora auth loginSave API key to ~/.cora/config.toml
      cora auth statusCheck current auth status
      cora auth removeRemove stored API key
      cora providersList detected AI providers
      cora upload-sarif <file>Upload SARIF to GitHub Code Scanning
      cora completion <shell>Generate shell completions (bash/zsh/fish)

      Quick Examples

      # Review staged changes (what's about to be committed)
      $ cora review --staged
      # Compare your feature branch against main
      $ cora review --base main
      # Full project scan with incremental caching
      $ cora scan --incremental
      # Install pre-commit hook
      $ cora hook install
      `);function d(e,d){i(d,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),s();var f=u();r(`45m4o3`,e=>{var r=l();t(()=>{n.title=`CLI Reference — cora docs`}),c(e,r)}),c(e,f),o()}export{d as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/7.BG-S3wet.js b/website/.svelte-kit/output/client/_app/immutable/nodes/7.BG-S3wet.js new file mode 100644 index 0000000..d028d83 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/7.BG-S3wet.js @@ -0,0 +1,52 @@ +import{B as e,C as t,E as n,K as r,R as i,U as a,W as o,b as s,ct as c,f as l,h as u,it as d,n as f,rt as p,s as m,st as h,w as g,x as _}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var v=n(``),y=n(`
      `),b=n(`

      Configuration

      cora uses a layered config system. Later sources override earlier ones.

      Config Resolution Order

      Settings are resolved in this order (highest priority first):

      .cora.yaml Example

      Create this file in your project root. Run cora init to generate it.

      .cora.yaml
      # cora project config
      +provider:
      +  provider: openai
      +  model: gpt-4o
      +  base_url: https://api.openai.com/v1
      +
      +llm:
      +  temperature: 0
      +  max_tokens: 4096
      +  timeout: 120
      +  cache_ttl: 1440
      +
      +review:
      +  system_prompt: "You are a senior code reviewer."
      +  # system_prompt_file: ./review-prompt.md
      +  response_format: json_object
      +
      +focus: security, performance, bugs
      +
      +hook:
      +  mode: warn
      +  min_severity: major
      +  max_diff_size: 51200
      +
      +ignore:
      +  files:
      +    - "vendor/**"
      +    - "*.min.js"

      Environment Variables

      VariableDescription
      CORA_API_KEYAPI key for the active provider
      CORA_PROVIDERActive provider (openai, anthropic, groq, ollama, zai)
      CORA_MODELModel name override
      CORA_BASE_URLCustom API base URL
      CORA_CONFIGPath to config file
      CORA_FORMATOutput format (pretty, json, compact, sarif)
      CORA_NO_COLORDisable colored output
      CORA_NO_CACHESkip diff-hash review cache (same as --no-cache)
      GITHUB_TOKENGitHub token for SARIF upload
      GITHUB_REPOSITORYGitHub repo for SARIF upload
      GITHUB_REFGitHub ref for SARIF upload

      Provider-Specific Env Vars

      Each provider has its own API key variable. cora checks these for auto-detection.

      env vars
      # OpenAI
      +OPENAI_API_KEY=sk-...
      +OPENAI_BASE_URL=https://api.openai.com/v1
      +
      +# Anthropic
      +ANTHROPIC_API_KEY=sk-ant-...
      +
      +# Groq
      +GROQ_API_KEY=gsk_...
      +
      +# Ollama (local, no key needed)
      +OLLAMA_HOST=http://localhost:11434
      +# Optional: OLLAMA_API_KEY if your Ollama instance requires auth
      +OLLAMA_API_KEY=...
      +
      +# Z.AI
      +ZAI_API_KEY=...

      Diff-Hash Caching

      cora caches review results by diff hash in ~/.cache/cora/reviews/. If you re-review the same diff, the cached result is returned instantly.

      Config
      llm.cache_ttl — TTL in minutes (default: 1440 / 24h)
      CLI / Env
      --no-cache or CORA_NO_CACHE=1 to bypass

      Custom System Prompts

      Override the default system prompt for review or scan commands to match your project's coding standards and review criteria.

      .cora.yaml
      review:
      +  system_prompt: "Focus on Rust idioms and error handling."
      +  # Or load from a file:
      +  system_prompt_file: ./prompts/review.md
      +
      +scan:
      +  system_prompt: "Check for OWASP Top 10 vulnerabilities."
      +  system_prompt_file: ./prompts/scan.md

      If both system_prompt and system_prompt_file are set, the file takes precedence.

      Response Format (JSON Mode)

      Opt into structured JSON output from the LLM by setting review.response_format to json_object. This instructs the LLM to return valid JSON, enabling machine-readable parsing and pipeline integration.

      .cora.yaml
      review:
      +  response_format: json_object

      Requires provider support for structured output. Works with OpenAI, Anthropic, and compatible APIs.

      Anti-Hallucination

      cora uses two mechanisms to prevent the LLM from fabricating findings:

      • File path injection — Actual file paths are embedded in the prompt, anchoring the LLM to real files in the diff.
      • Post-parse filtering — After parsing, any reported file paths or line numbers that don't exist in the actual diff are discarded.
      `);function x(n,x){d(x,!1),f(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),m();var S=b();u(`1q9ccmj`,e=>{var t=v();i(()=>{a.title=`Configuration — cora docs`}),g(e,t)});var C=r(o(S),4),w=r(o(C),4);s(w,4,()=>[{num:`1`,label:`CLI flags`,desc:`--provider, --model, --base-url, etc.`,accent:!0},{num:`2`,label:`Environment variables`,desc:`CORA_API_KEY, CORA_PROVIDER, CORA_MODEL, etc.`,accent:!1},{num:`3`,label:`.cora.yaml`,desc:`Project root config file`,accent:!1},{num:`4`,label:`~/.cora/config.yaml`,desc:`Global config (optional)`,accent:!1},{num:`5`,label:`Built-in defaults`,desc:`Sensible defaults for all settings`,accent:!1}],_,(n,i)=>{var a=y();let s;var u=o(a);let d;var f=o(u,!0);c(u);var p=r(u,2),m=o(p),h=o(m,!0);c(m);var _=r(m,2),v=o(_,!0);c(_),c(p),c(a),e(()=>{s=l(a,1,`docs-card`,null,s,{accent:i.accent}),d=l(u,1,`docs-card-number`,null,d,{primary:i.accent,muted:!i.accent}),t(f,i.num),t(h,i.label),t(v,i.desc)}),g(n,a)}),c(w),c(C),h(14),c(S),g(n,S),p()}export{x as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/8.FgjeHYDF.js b/website/.svelte-kit/output/client/_app/immutable/nodes/8.FgjeHYDF.js new file mode 100644 index 0000000..26444ea --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/8.FgjeHYDF.js @@ -0,0 +1,18 @@ +import{E as e,K as t,R as n,U as r,W as i,ct as a,h as o,it as s,n as c,rt as l,s as u,st as d,w as f,y as p}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var m=e(``),h=e(`

      Examples

      Practical examples to get you started with cora.

      01 Quick Review

      Review your staged changes before committing.

      # Review staged changes (default)
      $ cora review

      # Or review with explicit flags
      $ cora review --staged

      02 Branch Comparison

      Compare your current branch against main.

      $ cora review --base main

      03 Full Project Scan

      Scan your entire project for issues.

      $ cora scan

      04 Incremental Scan

      Only scan files that changed since the last scan.

      $ cora scan --incremental

      05 Streaming Output

      Stream results as they come in from the LLM.

      $ cora review --staged --stream

      06 GitHub Actions CI

      Add cora to your CI pipeline.

      .github/workflows/cora-review.yml
      name: Code Review
      +
      +on:
      +  pull_request:
      +    branches: [main]
      +
      +jobs:
      +  review:
      +    runs-on: ubuntu-latest
      +    steps:
      +      - uses: actions/checkout@v4
      +      - name: Install cora
      +        run: cargo install cora-cli
      +      - name: Run AI code review
      +        env:
      +          
      +          CORA_PROVIDER: openai
      +        run: cora review --base main --format sarif

      07 Pre-commit Hook

      Install once, then every commit gets reviewed automatically.

      # Install the hook
      $ cora hook install

      # Now just commit normally — cora reviews automatically
      $ git commit -m "fix: handle edge case in parser"
      cora pre-commit hook running...
      No issues found — commit allowed

      08 SARIF Upload

      Generate SARIF output and upload to GitHub Code Scanning.

      # Generate SARIF report and upload
      $ cora review --base main --format sarif > results.sarif && \\\\
        cora upload-sarif results.sarif

      Uploaded 3 findings to GitHub Code Scanning
      `);function g(e,g){s(g,!1),c(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),u();var _=h();o(`14ul9gg`,e=>{var t=m();n(()=>{r.title=`Examples — cora docs`}),f(e,t)});var v=t(i(_),14),y=t(i(v),4),b=t(i(y),2),x=i(b);p(t(i(x),40),()=>'CORA_API_KEY: ${{ secrets.CORA_API_KEY }}'),d(8),a(x),a(b),a(y),a(v),d(4),a(_),f(e,_),l()}export{g as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/immutable/nodes/9.9IQ7DCMm.js b/website/.svelte-kit/output/client/_app/immutable/nodes/9.9IQ7DCMm.js new file mode 100644 index 0000000..dbfea76 --- /dev/null +++ b/website/.svelte-kit/output/client/_app/immutable/nodes/9.9IQ7DCMm.js @@ -0,0 +1,3 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(`

      Getting Started

      Quick Start

      Get up and running with cora in three simple steps.

      1
      Install cora — Single binary, no runtime dependencies: curl -fsSL https://raw.githubusercontent.com/codecoradev/cora-cli/main/install.sh | sh
      2
      Authenticate — Run cora auth login to pick your provider and enter your API key. + Cora stores it securely in ~/.cora/auth.toml (never committed to git).
      3
      Review — Analyze your staged changes: cora review

      Authentication — cora auth login

      The interactive login guides you through provider selection:

      $ cora auth login
      🔑 Cora Auth Setup
      Choose your LLM provider:
      [1] openai — https://api.openai.com/v1
      [2] anthropic — https://api.anthropic.com/v1
      [3] groq — https://api.groq.com/openai/v1
      [4] ollama — http://localhost:11434/v1
      [5] zai — https://api.z.ai/api/coding/paas/v4
      [6] custom — any OpenAI-compatible endpoint
      Select provider [1-6]: 1
      → Provider: openai
      → Model: gpt-4o-mini
      → Base URL: https://api.openai.com/v1
      🔑 Enter your API key: ****
      API key saved to ~/.cora/auth.toml
      Known providers Just enter your API key — model and base URL are pre-configured
      Custom provider Enter your own base URL, model name, and API key for any OpenAI-compatible API
      Provider info stored Provider name, model, and base URL are saved alongside your API key for easy reference

      Check your auth status anytime:

      $ cora auth status
      API key is configured.
      Source: ~/.cora/auth.toml
      Provider: openai
      Model: gpt-4o-mini
      Base URL: https://api.openai.com/v1

      You can also use environment variables instead of cora auth login: CORA_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.

      Understanding the Output

      cora outputs a structured, color-coded summary of findings for each file reviewed.

      $ cora review --staged
      Analyzing 3 files...
      src/auth/login.ts — 2 issues found
      Line 42: Potential SQL injection
      Line 87: Hardcoded secret
      src/utils/parser.ts — clean
      src/api/routes.ts — 1 issue found
      Line 23: Missing error handling
      3 issues found in 3 files

      Each line in the output contains:

      file path The relative path to the file being reviewed
      line number Specific line where the issue was found
      severity Suggestion (⚠), Warning (⚠), or Error (✗)
      description Brief explanation of the issue

      Project Configuration — cora init

      Create a .cora.yaml config file in your project root to customize review settings. + The CI action automatically reads this file when it exists.

      $ cora init
      Created .cora.yaml with example configuration.

      Key configuration options:

      focus — Review focus areas: security, performance, bugs, best_practice
      ignore — File patterns and rules to skip
      hook — Pre-commit hook settings: mode, severity threshold, max diff size
      llm — LLM parameters: temperature, max_tokens, timeout
      `);function u(e,u){i(u,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),s();var d=l();r(`di86c5`,e=>{t(()=>{n.title=`Getting Started — cora docs`})}),c(e,d),o()}export{u as component}; \ No newline at end of file diff --git a/website/.svelte-kit/output/client/_app/version.json b/website/.svelte-kit/output/client/_app/version.json new file mode 100644 index 0000000..0c3d23b --- /dev/null +++ b/website/.svelte-kit/output/client/_app/version.json @@ -0,0 +1 @@ +{"version":"1780713979666"} \ No newline at end of file diff --git a/website/.svelte-kit/output/client/favicon.png b/website/.svelte-kit/output/client/favicon.png new file mode 100644 index 0000000..db6d4be Binary files /dev/null and b/website/.svelte-kit/output/client/favicon.png differ diff --git a/website/.svelte-kit/output/client/og.png b/website/.svelte-kit/output/client/og.png new file mode 100644 index 0000000..3253c16 Binary files /dev/null and b/website/.svelte-kit/output/client/og.png differ diff --git a/website/.svelte-kit/output/client/robots.txt b/website/.svelte-kit/output/client/robots.txt new file mode 100644 index 0000000..c2a49f4 --- /dev/null +++ b/website/.svelte-kit/output/client/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/website/.svelte-kit/output/prerendered/dependencies/_app/env.js b/website/.svelte-kit/output/prerendered/dependencies/_app/env.js new file mode 100644 index 0000000..f5427da --- /dev/null +++ b/website/.svelte-kit/output/prerendered/dependencies/_app/env.js @@ -0,0 +1 @@ +export const env={} \ No newline at end of file diff --git a/website/.svelte-kit/output/prerendered/pages/docs/changelog.html b/website/.svelte-kit/output/prerendered/pages/docs/changelog.html new file mode 100644 index 0000000..c9a91fa --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/changelog.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Changelog — cora docs + + + +
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/cli-reference.html b/website/.svelte-kit/output/prerendered/pages/docs/cli-reference.html new file mode 100644 index 0000000..1c76655 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/cli-reference.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + CLI Reference — cora docs + + + +

      CLI Reference

      Complete command reference for the cora CLI.

      Global Flags

      FlagDescription
      --config <path>Override config file path (default: .cora.yaml)
      --format <fmt>Output format: pretty, json, compact, sarif
      --no-colorDisable colored output
      --provider <name>Override provider
      --model <name>Override model
      --base-url <url>Override API base URL
      --api-key <key>Override API key
      --verboseEnable debug logging

      Commands

      CommandDescription
      cora initCreate .cora.yaml config file
      cora reviewReview code changes (default: staged files)
      cora review --stagedReview staged git changes explicitly
      cora review --unstagedReview unstaged working changes
      cora review --unpushedReview unpushed commits
      cora review --base <branch>Compare current branch against target
      cora review --commit <ref>Review specific commit or range
      cora review --diff-file <path>Review from a diff file
      cora review --uploadReview and upload SARIF to GitHub Code Scanning
      cora scan <path>Scan files for issues
      cora scan . [--incremental]Scan only changed files
      cora config showShow resolved configuration
      cora config set <key> <value>Set a config value
      cora hook installInstall pre-commit hook
      cora hook uninstallRemove pre-commit hook
      cora auth loginSave API key to ~/.cora/config.toml
      cora auth statusCheck current auth status
      cora auth removeRemove stored API key
      cora providersList detected AI providers
      cora upload-sarif <file>Upload SARIF to GitHub Code Scanning
      cora completion <shell>Generate shell completions (bash/zsh/fish)

      Quick Examples

      # Review staged changes (what's about to be committed)
      $ cora review --staged
      # Compare your feature branch against main
      $ cora review --base main
      # Full project scan with incremental caching
      $ cora scan --incremental
      # Install pre-commit hook
      $ cora hook install
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/configuration.html b/website/.svelte-kit/output/prerendered/pages/docs/configuration.html new file mode 100644 index 0000000..aa2a8e4 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/configuration.html @@ -0,0 +1,134 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Configuration — cora docs + + + +

      Configuration

      cora uses a layered config system. Later sources override earlier ones.

      Config Resolution Order

      Settings are resolved in this order (highest priority first):

      1
      CLI flags
      --provider, --model, --base-url, etc.
      2
      Environment variables
      CORA_API_KEY, CORA_PROVIDER, CORA_MODEL, etc.
      3
      .cora.yaml
      Project root config file
      4
      ~/.cora/config.yaml
      Global config (optional)
      5
      Built-in defaults
      Sensible defaults for all settings

      .cora.yaml Example

      Create this file in your project root. Run cora init to generate it.

      .cora.yaml
      # cora project config
      +provider:
      +  provider: openai
      +  model: gpt-4o
      +  base_url: https://api.openai.com/v1
      +
      +llm:
      +  temperature: 0
      +  max_tokens: 4096
      +  timeout: 120
      +  cache_ttl: 1440
      +
      +review:
      +  system_prompt: "You are a senior code reviewer."
      +  # system_prompt_file: ./review-prompt.md
      +  response_format: json_object
      +
      +focus: security, performance, bugs
      +
      +hook:
      +  mode: warn
      +  min_severity: major
      +  max_diff_size: 51200
      +
      +ignore:
      +  files:
      +    - "vendor/**"
      +    - "*.min.js"

      Environment Variables

      VariableDescription
      CORA_API_KEYAPI key for the active provider
      CORA_PROVIDERActive provider (openai, anthropic, groq, ollama, zai)
      CORA_MODELModel name override
      CORA_BASE_URLCustom API base URL
      CORA_CONFIGPath to config file
      CORA_FORMATOutput format (pretty, json, compact, sarif)
      CORA_NO_COLORDisable colored output
      CORA_NO_CACHESkip diff-hash review cache (same as --no-cache)
      GITHUB_TOKENGitHub token for SARIF upload
      GITHUB_REPOSITORYGitHub repo for SARIF upload
      GITHUB_REFGitHub ref for SARIF upload

      Provider-Specific Env Vars

      Each provider has its own API key variable. cora checks these for auto-detection.

      env vars
      # OpenAI
      +OPENAI_API_KEY=sk-...
      +OPENAI_BASE_URL=https://api.openai.com/v1
      +
      +# Anthropic
      +ANTHROPIC_API_KEY=sk-ant-...
      +
      +# Groq
      +GROQ_API_KEY=gsk_...
      +
      +# Ollama (local, no key needed)
      +OLLAMA_HOST=http://localhost:11434
      +# Optional: OLLAMA_API_KEY if your Ollama instance requires auth
      +OLLAMA_API_KEY=...
      +
      +# Z.AI
      +ZAI_API_KEY=...

      Diff-Hash Caching

      cora caches review results by diff hash in ~/.cache/cora/reviews/. If you re-review the same diff, the cached result is returned instantly.

      Config
      llm.cache_ttl — TTL in minutes (default: 1440 / 24h)
      CLI / Env
      --no-cache or CORA_NO_CACHE=1 to bypass

      Custom System Prompts

      Override the default system prompt for review or scan commands to match your project's coding standards and review criteria.

      .cora.yaml
      review:
      +  system_prompt: "Focus on Rust idioms and error handling."
      +  # Or load from a file:
      +  system_prompt_file: ./prompts/review.md
      +
      +scan:
      +  system_prompt: "Check for OWASP Top 10 vulnerabilities."
      +  system_prompt_file: ./prompts/scan.md

      If both system_prompt and system_prompt_file are set, the file takes precedence.

      Response Format (JSON Mode)

      Opt into structured JSON output from the LLM by setting review.response_format to json_object. This instructs the LLM to return valid JSON, enabling machine-readable parsing and pipeline integration.

      .cora.yaml
      review:
      +  response_format: json_object

      Requires provider support for structured output. Works with OpenAI, Anthropic, and compatible APIs.

      Anti-Hallucination

      cora uses two mechanisms to prevent the LLM from fabricating findings:

      • File path injection — Actual file paths are embedded in the prompt, anchoring the LLM to real files in the diff.
      • Post-parse filtering — After parsing, any reported file paths or line numbers that don't exist in the actual diff are discarded.
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/examples.html b/website/.svelte-kit/output/prerendered/pages/docs/examples.html new file mode 100644 index 0000000..1607716 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/examples.html @@ -0,0 +1,100 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Examples — cora docs + + + +

      Examples

      Practical examples to get you started with cora.

      01 Quick Review

      Review your staged changes before committing.

      # Review staged changes (default)
      $ cora review

      # Or review with explicit flags
      $ cora review --staged

      02 Branch Comparison

      Compare your current branch against main.

      $ cora review --base main

      03 Full Project Scan

      Scan your entire project for issues.

      $ cora scan

      04 Incremental Scan

      Only scan files that changed since the last scan.

      $ cora scan --incremental

      05 Streaming Output

      Stream results as they come in from the LLM.

      $ cora review --staged --stream

      06 GitHub Actions CI

      Add cora to your CI pipeline.

      .github/workflows/cora-review.yml
      name: Code Review
      +
      +on:
      +  pull_request:
      +    branches: [main]
      +
      +jobs:
      +  review:
      +    runs-on: ubuntu-latest
      +    steps:
      +      - uses: actions/checkout@v4
      +      - name: Install cora
      +        run: cargo install cora-cli
      +      - name: Run AI code review
      +        env:
      +          CORA_API_KEY: ${{ secrets.CORA_API_KEY }}
      +          CORA_PROVIDER: openai
      +        run: cora review --base main --format sarif

      07 Pre-commit Hook

      Install once, then every commit gets reviewed automatically.

      # Install the hook
      $ cora hook install

      # Now just commit normally — cora reviews automatically
      $ git commit -m "fix: handle edge case in parser"
      cora pre-commit hook running...
      No issues found — commit allowed

      08 SARIF Upload

      Generate SARIF output and upload to GitHub Code Scanning.

      # Generate SARIF report and upload
      $ cora review --base main --format sarif > results.sarif && \\
        cora upload-sarif results.sarif

      Uploaded 3 findings to GitHub Code Scanning
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/getting-started.html b/website/.svelte-kit/output/prerendered/pages/docs/getting-started.html new file mode 100644 index 0000000..0f67fd0 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/getting-started.html @@ -0,0 +1,85 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Getting Started — cora docs + + + +

      Getting Started

      Quick Start

      Get up and running with cora in three simple steps.

      1
      Install cora — Single binary, no runtime dependencies: curl -fsSL https://raw.githubusercontent.com/codecoradev/cora-cli/main/install.sh | sh
      2
      Authenticate — Run cora auth login to pick your provider and enter your API key. + Cora stores it securely in ~/.cora/auth.toml (never committed to git).
      3
      Review — Analyze your staged changes: cora review

      Authentication — cora auth login

      The interactive login guides you through provider selection:

      $ cora auth login
      🔑 Cora Auth Setup
      Choose your LLM provider:
      [1] openai — https://api.openai.com/v1
      [2] anthropic — https://api.anthropic.com/v1
      [3] groq — https://api.groq.com/openai/v1
      [4] ollama — http://localhost:11434/v1
      [5] zai — https://api.z.ai/api/coding/paas/v4
      [6] custom — any OpenAI-compatible endpoint
      Select provider [1-6]: 1
      → Provider: openai
      → Model: gpt-4o-mini
      → Base URL: https://api.openai.com/v1
      🔑 Enter your API key: ****
      API key saved to ~/.cora/auth.toml
      Known providers Just enter your API key — model and base URL are pre-configured
      Custom provider Enter your own base URL, model name, and API key for any OpenAI-compatible API
      Provider info stored Provider name, model, and base URL are saved alongside your API key for easy reference

      Check your auth status anytime:

      $ cora auth status
      API key is configured.
      Source: ~/.cora/auth.toml
      Provider: openai
      Model: gpt-4o-mini
      Base URL: https://api.openai.com/v1

      You can also use environment variables instead of cora auth login: CORA_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.

      Understanding the Output

      cora outputs a structured, color-coded summary of findings for each file reviewed.

      $ cora review --staged
      Analyzing 3 files...
      src/auth/login.ts — 2 issues found
      Line 42: Potential SQL injection
      Line 87: Hardcoded secret
      src/utils/parser.ts — clean
      src/api/routes.ts — 1 issue found
      Line 23: Missing error handling
      3 issues found in 3 files

      Each line in the output contains:

      file path The relative path to the file being reviewed
      line number Specific line where the issue was found
      severity Suggestion (⚠), Warning (⚠), or Error (✗)
      description Brief explanation of the issue

      Project Configuration — cora init

      Create a .cora.yaml config file in your project root to customize review settings. + The CI action automatically reads this file when it exists.

      $ cora init
      Created .cora.yaml with example configuration.

      Key configuration options:

      focus — Review focus areas: security, performance, bugs, best_practice
      ignore — File patterns and rules to skip
      hook — Pre-commit hook settings: mode, severity threshold, max diff size
      llm — LLM parameters: temperature, max_tokens, timeout
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/installation.html b/website/.svelte-kit/output/prerendered/pages/docs/installation.html new file mode 100644 index 0000000..ce76d82 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/installation.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Installation — cora docs + + + +

      Installation

      Prerequisites

      cora is a Rust binary. You have two installation paths:

      Via Cargo (recommended) — Requires Rust 1.85 or later with Cargo installed
      Binary download — No Rust required; just download and place in your PATH

      cora works on Linux (x86_64 and arm64), macOS (arm64), and Windows.

      Install via Cargo

      The recommended way to install cora is through Cargo:

      $ cargo install cora-cli

      This compiles cora from source and installs it to Cargo's binary directory (typically ~/.cargo/bin/).

      Download Binary

      Pre-built binaries are available from the GitHub Releases page.

      Supported platforms:

      Linux x86_64 (glibc)
      Linux arm64 (aarch64)
      macOS arm64 (Apple Silicon)
      Windows x86_64
      # Download and extract
      $ curl -sL https://github.com/codecoradev/cora-cli/releases/latest/download/cora-linux-x86_64.tar.gz | tar xz
      $ mv cora ~/.local/bin/cora

      Build from Source

      If you prefer to build from the latest source:

      $ git clone https://github.com/codecoradev/cora-cli.git
      $ cd cora-cli
      $ cargo build --release
      # Binary at target/release/cora

      Shell Completions

      cora provides shell completions for bash, zsh, and fish:

      # Bash
      $ cora completion bash > ~/.cora/completion.bash
      $ echo 'source ~/.cora/completion.bash' >> ~/.bashrc
      # Zsh
      $ cora completion zsh > ~/.cora/completion.zsh
      $ echo 'source ~/.cora/completion.zsh' >> ~/.zshrc
      # Fish
      $ cora completion fish > ~/.config/fish/completions/cora.fish

      Verify Installation

      Confirm cora is installed correctly:

      $ cora --version
      cora 0.x.x
      $ cora auth status
      Provider: openai
      API key: configured

      Updating

      To update cora to the latest version:

      Via Cargo: cargo install cora-cli --force
      Via Binary: Download the latest release from GitHub and replace the existing binary
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/providers.html b/website/.svelte-kit/output/prerendered/pages/docs/providers.html new file mode 100644 index 0000000..ff6f452 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/providers.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Providers — cora docs + + + +

      Providers

      cora supports multiple AI providers. Use your own API key — no subscriptions to us.

      Supported Providers

      ProviderDefault ModelEnv VarCustom Base URL
      OpenAIgpt-4o-miniOPENAI_API_KEYOPENAI_BASE_URL
      Anthropicclaude-sonnet-4-20250514ANTHROPIC_API_KEYANTHROPIC_BASE_URL
      Groqllama-3.1-8b-instantGROQ_API_KEYGROQ_BASE_URL
      Ollamallama3.1— (local)OLLAMA_HOST (default: http://localhost:11434)
      Z.AIglm-5.1ZAI_API_KEYZAI_BASE_URL

      Auto-Detection

      cora automatically detects which provider to use by checking environment variables in this order:

      1
      OPENAI_API_KEY → uses OpenAI
      2
      ANTHROPIC_API_KEY → uses Anthropic
      3
      GROQ_API_KEY → uses Groq
      4
      ZAI_API_KEY → uses Z.AI
      5
      OLLAMA_HOST → uses Ollama (localhost)

      Override auto-detection with CORA_PROVIDER env var or --provider flag.

      Usage Examples

      # Use OpenAI (auto-detected from OPENAI_API_KEY)
      $ OPENAI_API_KEY=sk-... cora review --staged
      # Use Anthropic with explicit provider
      $ CORA_PROVIDER=anthropic CORA_API_KEY=sk-ant-... cora review --staged
      # Use Ollama locally (no API key needed)
      $ CORA_PROVIDER=ollama cora review --staged
      # Use a custom model
      $ CORA_MODEL=gpt-4o-mini cora review --staged
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/roadmap.html b/website/.svelte-kit/output/prerendered/pages/docs/roadmap.html new file mode 100644 index 0000000..9f5d4c7 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/roadmap.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Roadmap — cora Docs + + + +

      Roadmap

      Demand-gated — we build what people actually need. Track progress on GitHub Issues.

      v0.1.5 Initial Release

      v0.1.6 Custom Prompts & Path Injection

      v0.1.7 Deterministic & Reliable

      v0.2.0 Multi-Provider & SARIF

      v0.3 Progress & CI Hardening

      v0.4 Deterministic Engine Pipeline

      v0.5 Install & Distribution

      Future What's Next

      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/docs/usage.html b/website/.svelte-kit/output/prerendered/pages/docs/usage.html new file mode 100644 index 0000000..824b0b3 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/docs/usage.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Usage — cora docs + + + +

      Usage

      Review Modes

      cora supports multiple review modes, each suited to a different workflow:

      ModeFlagScopeBest For
      Default(no flag)Tries staged first, then unpushedQuick feedback
      Staged--stagedFiles in git staging areaPre-commit review
      Unstaged--unstagedUnstaged working changesReview work in progress
      Unpushed--unpushedCommits not yet pushedReview before push
      Base Branch--base <branch>Diff against base branchPR review workflow
      Commit--commit <ref>Specific commit or rangeReview specific changes
      Diff File--diff-file <path>External diff fileReview patch files
      # Review staged changes (default)
      $ cora review
      # Review against a branch
      $ cora review --base main
      # Review a specific commit
      $ cora review --commit HEAD
      # Review from a diff file
      $ cora review --diff-file pr.diff
      # Full project scan (use cora scan)
      $ cora scan .

      Output Formats

      cora can output results in three formats:

      --format pretty — Human-readable terminal output (default)
      --format json — Machine-readable JSON for CI/CD pipelines
      --format sarif — SARIF format for GitHub Code Scanning
      # JSON output example
      $ cora review --staged --format json
      {
      "files": [
      {
      "path": "src/auth/login.ts",
      "issues": [
      {
      "line": 42,
      "severity": "warning",
      "message": "Potential SQL injection"
      }
      ]
      }
      ],
      "summary": {
      "total_files": 3,
      "total_issues": 3
      }
      }

      Configuration File

      The .cora.yaml file provides persistent configuration. Place it in your project root. API keys are stored at ~/.cora/config.toml.

      # .cora.yaml — example
      review:
      severity: warning
      focus: security,performance
      ignore:
      - "vendor/**"
      - "*.min.js"
      providers:
      openai:
      model: gpt-4o

      Environment Variables

      Environment variables override configuration file settings:

      VariableDescriptionRequired
      CORA_API_KEYAPI key for the configured providerYes (unless using cora auth)
      CORA_PROVIDEROverride the LLM providerNo
      CORA_MODELOverride the model nameNo
      CORA_BASE_URLOverride the API base URLNo
      CORA_CONFIGPath to alternative config fileNo

      Working with Monorepos

      cora works well in monorepo setups. Use include patterns to limit review scope to specific packages:

      # Review only the backend package
      $ cora review --staged --include "packages/backend/**"
      # Exclude test and generated files
      $ cora review --staged --exclude "**/*.test.ts" --exclude "**/generated/**"

      Alternatively, set include/exclude patterns in .cora.yaml for persistent configuration.

      Exit Codes

      cora uses standard exit codes for scripting and CI integration:

      CodeMeaningCI Behavior
      0No issues foundPass
      1Issues foundFail (warning/error)
      2Review blockedFail (auth/config error)
      3Authentication errorFail (missing API key)

      Tips

      Use cora review with no flags for the fastest pre-commit feedback
      Combine --format json with --base main in CI pipelines
      Use cora scan . --incremental for large codebases — only changed files are analyzed
      Use --quiet for minimal output and --severity to filter by severity level
      Use cora auth login to store API keys securely instead of environment variables
      + + +
      + + diff --git a/website/.svelte-kit/output/prerendered/pages/index.html b/website/.svelte-kit/output/prerendered/pages/index.html new file mode 100644 index 0000000..25c1b78 --- /dev/null +++ b/website/.svelte-kit/output/prerendered/pages/index.html @@ -0,0 +1,84 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + cora — AI Code Review CLI + + + + +
      Open source · BYOK · Zero config

      AI code review in your terminal

      cora catches bugs, security issues, and code smells before they land in your PR. + Bring your own API key. Your code never leaves your machine.

      install
      cargo install cora-cli
      cora auth login
      cora review --staged
      Local-first 5 LLM providers CI/CD ready

      Trusted by developers who ship fast

      5
      AI Providers
      < 3s
      Review Time
      Zero
      Config Required

      See it in action

      Run cora against staged changes. Results in seconds, not minutes.

      cora \u2014 review

      How it works

      Three steps from code to confidence.

      01

      Write code

      Push your changes as normal. cora only sees your diff.

      02

      Review with AI

      cora analyzes your diff with the LLM of your choice.

      03

      Ship with confidence

      Merge clean, production-ready code. Every time.

      Built for developers who value control

      Everything you need, nothing you don't.

      AI Code Review

      Diff, branch, or full scan

      Three review modes: staged diff, branch comparison, or full project scan. LLM-powered analysis catches bugs, security issues, and style violations.

      Bring Your Own Key

      No subscriptions, no lock-in

      Uses YOUR OpenAI, Anthropic, Groq, Ollama, or Z.AI API key. No data stored on our servers. You control the model, you control the cost.

      Pre-commit Hooks

      Review before you push

      Install once. Every commit gets reviewed automatically. Block bad code from entering your branch before it ships.

      Incremental Scan

      Only scan what changed

      SHA256 content hash cache. First scan indexes your codebase. Subsequent scans only review new or modified files.

      SARIF Output

      GitHub Code Scanning

      Upload review findings directly to GitHub's Security tab. Track issues across PRs. Works with any CI/CD pipeline.

      Fully Private

      Your code stays yours

      Runs entirely on your machine. No cloud, no telemetry, no data leaving your network. Perfect for Gitea and air-gapped environments.

      Deterministic Reviews

      Same diff, same issues

      Temperature defaults to 0. Identical diffs always produce identical findings — perfect for CI reproducibility.

      Smart Caching

      Never review the same diff twice

      Reviews are cached by diff hash in ~/.cache/cora/reviews/. Re-reviewing an unchanged diff returns cached results instantly. Use --no-cache to bypass.

      Custom Prompts & Anti-Hallucination

      Control the review, trust the output

      Override system prompts for review and scan. File path injection and post-parse filtering ensure the LLM only reports issues that exist in your actual diff.

      Why developers choose cora

      Compared to popular code review tools.

      BYOK
      cora
      CodeRabbit
      Copilot
      SonarQube
      Self-hosted
      cora
      CodeRabbit
      Copilot
      SonarQube
      Gitea / Forgejo
      cora
      CodeRabbit
      Copilot
      SonarQube
      CLI
      cora
      CodeRabbit
      Copilot
      SonarQube
      Pre-commit hooks
      cora
      CodeRabbit
      Copilot
      SonarQube
      SARIF output
      cora
      CodeRabbit
      Copilot
      SonarQube
      Cost
      cora Free + API
      CodeRabbit $12–39/mo
      Copilot $10–39/mo
      SonarQube Free / $150+
      License
      cora MIT
      CodeRabbit Apache 2.0
      Copilot Proprietary
      SonarQube LGPL

      Frequently asked questions

      Everything you need to know about using cora.

      Start in 30 seconds

      No account required. No subscription. No cloud.

      1

      Install

      Single binary, no dependencies.

      Terminal
      $ curl -fsSL https://cora.dev/install | sh
      2

      Set API key

      Use your existing OpenAI or Anthropic key.

      Terminal
      $ export OPENAI_API_KEY="sk-..."
      3

      Review

      Review your staged changes.

      Terminal
      $ CORA_API_KEY=key cora review --staged
      4

      Done

      That's it. No account. No subscription.

      Ready to ship better code?

      No account. No subscription. No cloud.

      + + +
      + + diff --git a/website/.svelte-kit/output/server/.vite/manifest.json b/website/.svelte-kit/output/server/.vite/manifest.json new file mode 100644 index 0000000..955622f --- /dev/null +++ b/website/.svelte-kit/output/server/.vite/manifest.json @@ -0,0 +1,277 @@ +{ + ".svelte-kit/generated/server/internal.js": { + "file": "internal.js", + "name": "internal", + "src": ".svelte-kit/generated/server/internal.js", + "isEntry": true, + "imports": [ + "_environment.js", + "_internal.js" + ] + }, + "_Icon.js": { + "file": "chunks/Icon.js", + "name": "Icon", + "imports": [ + "_index-server.js", + "_dev.js", + "_legacy-client.js" + ] + }, + "_client.js": { + "file": "chunks/client.js", + "name": "client", + "imports": [ + "_index-server.js", + "_environment.js", + "_internal.js", + "_exports.js", + "_shared.js", + "_dev.js" + ] + }, + "_dev.js": { + "file": "chunks/dev.js", + "name": "dev" + }, + "_environment.js": { + "file": "chunks/environment.js", + "name": "environment" + }, + "_exports.js": { + "file": "chunks/exports.js", + "name": "exports", + "imports": [ + "_dev.js" + ] + }, + "_index-server.js": { + "file": "chunks/index-server.js", + "name": "index-server", + "imports": [ + "_dev.js" + ] + }, + "_internal.js": { + "file": "chunks/internal.js", + "name": "internal", + "imports": [ + "_index-server.js", + "_environment.js", + "_dev.js", + "_legacy-client.js" + ] + }, + "_legacy-client.js": { + "file": "chunks/legacy-client.js", + "name": "legacy-client", + "imports": [ + "_dev.js" + ] + }, + "_shared.js": { + "file": "chunks/shared.js", + "name": "shared", + "imports": [ + "_index-server.js" + ] + }, + "_stores.js": { + "file": "chunks/stores.js", + "name": "stores", + "imports": [ + "_index-server.js", + "_client.js", + "_dev.js" + ] + }, + "_utils.js": { + "file": "chunks/utils.js", + "name": "utils", + "imports": [ + "_shared.js" + ] + }, + "node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js": { + "file": "remote-entry.js", + "name": "remote-entry", + "src": "node_modules/@sveltejs/kit/src/runtime/app/server/remote/index.js", + "isEntry": true, + "imports": [ + "_environment.js", + "_utils.js", + "_shared.js" + ] + }, + "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte": { + "file": "entries/fallbacks/error.svelte.js", + "name": "entries/fallbacks/error.svelte", + "src": "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_client.js", + "_dev.js" + ] + }, + "node_modules/@sveltejs/kit/src/runtime/server/index.js": { + "file": "index.js", + "name": "index", + "src": "node_modules/@sveltejs/kit/src/runtime/server/index.js", + "isEntry": true, + "imports": [ + "_environment.js", + "_internal.js", + "_utils.js", + "_exports.js", + "_shared.js", + "_dev.js" + ] + }, + "src/routes/+layout.svelte": { + "file": "entries/pages/_layout.svelte.js", + "name": "entries/pages/_layout.svelte", + "src": "src/routes/+layout.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_Icon.js", + "_stores.js", + "_dev.js", + "_legacy-client.js" + ], + "css": [ + "_app/immutable/assets/_layout.LVaMHZJv.css" + ] + }, + "src/routes/+layout.ts": { + "file": "entries/pages/_layout.ts.js", + "name": "entries/pages/_layout.ts", + "src": "src/routes/+layout.ts", + "isEntry": true + }, + "src/routes/+page.svelte": { + "file": "entries/pages/_page.svelte.js", + "name": "entries/pages/_page.svelte", + "src": "src/routes/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_Icon.js", + "_dev.js", + "_legacy-client.js" + ], + "css": [ + "_app/immutable/assets/_page.B-froF42.css" + ] + }, + "src/routes/docs/+layout.svelte": { + "file": "entries/pages/docs/_layout.svelte.js", + "name": "entries/pages/docs/_layout.svelte", + "src": "src/routes/docs/+layout.svelte", + "isEntry": true, + "imports": [ + "_stores.js", + "_dev.js" + ] + }, + "src/routes/docs/+page.svelte": { + "file": "entries/pages/docs/_page.svelte.js", + "name": "entries/pages/docs/_page.svelte", + "src": "src/routes/docs/+page.svelte", + "isEntry": true, + "imports": [ + "_client.js", + "_dev.js" + ] + }, + "src/routes/docs/changelog/+page.svelte": { + "file": "entries/pages/docs/changelog/_page.svelte.js", + "name": "entries/pages/docs/changelog/_page.svelte", + "src": "src/routes/docs/changelog/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/cli-reference/+page.svelte": { + "file": "entries/pages/docs/cli-reference/_page.svelte.js", + "name": "entries/pages/docs/cli-reference/_page.svelte", + "src": "src/routes/docs/cli-reference/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/configuration/+page.svelte": { + "file": "entries/pages/docs/configuration/_page.svelte.js", + "name": "entries/pages/docs/configuration/_page.svelte", + "src": "src/routes/docs/configuration/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/examples/+page.svelte": { + "file": "entries/pages/docs/examples/_page.svelte.js", + "name": "entries/pages/docs/examples/_page.svelte", + "src": "src/routes/docs/examples/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/getting-started/+page.svelte": { + "file": "entries/pages/docs/getting-started/_page.svelte.js", + "name": "entries/pages/docs/getting-started/_page.svelte", + "src": "src/routes/docs/getting-started/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/installation/+page.svelte": { + "file": "entries/pages/docs/installation/_page.svelte.js", + "name": "entries/pages/docs/installation/_page.svelte", + "src": "src/routes/docs/installation/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/providers/+page.svelte": { + "file": "entries/pages/docs/providers/_page.svelte.js", + "name": "entries/pages/docs/providers/_page.svelte", + "src": "src/routes/docs/providers/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + }, + "src/routes/docs/roadmap/+page.svelte": { + "file": "entries/pages/docs/roadmap/_page.svelte.js", + "name": "entries/pages/docs/roadmap/_page.svelte", + "src": "src/routes/docs/roadmap/+page.svelte", + "isEntry": true, + "imports": [ + "_dev.js" + ] + }, + "src/routes/docs/usage/+page.svelte": { + "file": "entries/pages/docs/usage/_page.svelte.js", + "name": "entries/pages/docs/usage/_page.svelte", + "src": "src/routes/docs/usage/+page.svelte", + "isEntry": true, + "imports": [ + "_index-server.js", + "_dev.js" + ] + } +} \ No newline at end of file diff --git a/website/.svelte-kit/output/server/_app/immutable/assets/_layout.LVaMHZJv.css b/website/.svelte-kit/output/server/_app/immutable/assets/_layout.LVaMHZJv.css new file mode 100644 index 0000000..06b8e22 --- /dev/null +++ b/website/.svelte-kit/output/server/_app/immutable/assets/_layout.LVaMHZJv.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-4xl:2rem;--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-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-destructive:var(--destructive);--color-border:var(--border);--color-ring:var(--ring)}}@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]){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}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-\[10\%\]{top:10%}.right-\[15\%\]{right:15%}.bottom-\[10\%\]{bottom:10%}.left-\[20\%\]{left:20%}.z-10{z-index:10}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-20{margin-top:calc(var(--spacing) * 20)}.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)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-\[1\.45em\]{min-height:1.45em}.min-h-\[calc\(100vh-3\.5rem\)\]{min-height:calc(100vh - 3.5rem)}.min-h-screen{min-height:100vh}.w-1\/3{width:33.3333%}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-\[400px\]{width:400px}.w-\[500px\]{width:500px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[32rem\]{max-width:32rem}.max-w-\[40rem\]{max-width:40rem}.max-w-\[56rem\]{max-width:56rem}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-outside{list-style-position:outside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-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-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-\[min\(var\(--radius-md\)\,8px\)\]{border-radius:min(var(--radius-md), 8px)}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.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-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[var\(--accent\)\]\/25{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-\[var\(--accent\)\]\/25{border-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.border-\[var\(--border\)\]{border-color:var(--border)}.border-border{border-color:var(--color-border)}.border-transparent{border-color:#0000}.bg-\[var\(--accent\)\],.bg-\[var\(--accent\)\]\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-\[var\(--accent\)\]\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-\[var\(--background\)\]{background-color:var(--background)}.bg-background{background-color:var(--color-background)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-card{background-color:var(--color-card)}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive) 10%, transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/20{background-color:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.bg-clip-padding{background-clip:padding-box}.p-0{padding:calc(var(--spacing) * 0)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[13px\]{font-size:13px}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-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:calc(var(--tracking-tight) * -1);letter-spacing:calc(var(--tracking-tight) * -1)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--accent-foreground\)\]{color:var(--accent-foreground)}.text-\[var\(--foreground\)\]{color:var(--foreground)}.text-\[var\(--muted-foreground\)\]{color:var(--muted-foreground)}.text-\[var\(--success\)\]{color:var(--success)}.text-blue-400{color:var(--color-blue-400)}.text-card-foreground{color:var(--color-card-foreground)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-\[0\.02\]{opacity:.02}.opacity-\[0\.03\]{opacity:.03}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--color-foreground) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{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,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[transition-delay\:100ms\]{transition-delay:.1s}.\[transition-delay\:200ms\]{transition-delay:.2s}.delay-100{transition-delay:.1s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-400{transition-delay:.4s}.delay-500{transition-delay:.5s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{user-select:none}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.group-data-\[size\=sm\]\/card\:px-4:is(:where(.group\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}@media (hover:hover){.hover\:border-\[var\(--accent\)\]:hover{border-color:var(--accent)}.hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-\[var\(--foreground\)\]:hover{color:var(--foreground)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-muted-foreground:hover{color:var(--color-muted-foreground)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-md{border-radius:var(--radius-md)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--color-muted)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--color-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[size\=sm\]\:gap-4[data-size=sm]{gap:calc(var(--spacing) * 4)}.data-\[size\=sm\]\:py-4[data-size=sm]{padding-block:calc(var(--spacing) * 4)}@media (width>=40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (width>=48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}}@media (width>=64rem){.lg\:block{display:block}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:bg-destructive\/20{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.dark\:opacity-\[0\.04\]{opacity:.04}.dark\:opacity-\[0\.06\]{opacity:.06}@media (hover:hover){.dark\:hover\:bg-destructive\/30:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:hover{background-color:color-mix(in oklab, var(--color-destructive) 30%, transparent)}}.dark\:hover\:bg-muted\/50:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:color-mix(in oklab, var(--color-destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-b\]\:pb-4:is(:where(.group\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 4)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-t\]\:pt-4:is(:where(.group\/card)[data-size=sm] *).border-t{padding-top:calc(var(--spacing) * 4)}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--color-muted)}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--color-muted-foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}}:root{--background:oklch(99% .002 270);--foreground:oklch(13% .02 270);--card:oklch(100% 0 0);--card-foreground:oklch(13% .02 270);--muted:oklch(96% .005 270);--muted-foreground:oklch(50% .02 270);--accent:oklch(55% .22 270);--accent-bright:oklch(60% .24 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(70% .12 270);--success:oklch(55% .19 145);--warning:oklch(65% .15 85);--destructive:oklch(50% .22 25);--border:oklch(91% .005 270);--border-subtle:oklch(94% .003 270);--ring:oklch(55% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.06);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.1);--font-sans:"Inter", system-ui, -apple-system, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--space-0:0;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-10:2.5rem;--space-12:3rem;--space-16:4rem;--space-20:5rem;--space-24:6rem;--space-32:8rem}.dark{--background:oklch(13% .01 270);--foreground:oklch(92% .01 270);--card:oklch(17% .01 270);--card-foreground:oklch(92% .01 270);--muted:oklch(22% .01 270);--muted-foreground:oklch(65% .01 270);--accent:oklch(65% .22 270);--accent-bright:oklch(72% .2 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(45% .12 270);--success:oklch(72% .19 145);--warning:oklch(78% .15 85);--destructive:oklch(55% .22 25);--border:oklch(27% .01 270);--border-subtle:oklch(22% .01 270);--ring:oklch(65% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.3);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.4)}html{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}body{min-height:100vh;line-height:1.5}::selection{color:var(--accent-foreground);background:oklch(55% .22 270/.3)}code,.font-mono{font-family:var(--font-mono)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--muted)}::-webkit-scrollbar-thumb{background:var(--muted-foreground);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:oklch(75% .01 270)}@media (prefers-reduced-motion:no-preference){@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes blink{0%,50%{opacity:1}51%,to{opacity:0}}@keyframes accordion-down{0%{height:0}to{height:var(--bits-accordion-content-height)}}@keyframes accordion-up{0%{height:var(--bits-accordion-content-height)}to{height:0}}@keyframes glow-pulse{0%,to{opacity:.4;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}.animate-fade-in{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-delay-1{opacity:0;animation:.6s ease-out .1s forwards fade-in-up}.animate-fade-in-delay-2{opacity:0;animation:.6s ease-out .2s forwards fade-in-up}.animate-fade-in-delay-3{opacity:0;animation:.6s ease-out .3s forwards fade-in-up}.animate-fade-in-delay-4{opacity:0;animation:.6s ease-out .4s forwards fade-in-up}.cursor-blink{animation:1s step-end infinite blink}.animate-accordion-down{animation:.2s ease-out accordion-down}.animate-accordion-up{animation:.2s ease-out accordion-up}.animate-glow-pulse{animation:4s ease-in-out infinite glow-pulse}.animate-float{animation:6s ease-in-out infinite float}.animate-fade-in-up{opacity:0;animation:.6s ease-out forwards fade-in-up;transform:translateY(20px)}.delay-100{animation-delay:.1s}.delay-200{animation-delay:.2s}.delay-300{animation-delay:.3s}.delay-400{animation-delay:.4s}.delay-500{animation-delay:.5s}.scroll-reveal{opacity:0;transition:opacity .6s ease-out,transform .6s ease-out;transform:translateY(20px)}.scroll-reveal.revealed{opacity:1;transform:translateY(0)}@keyframes fade-in-line{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes number-pulse{0%,to{box-shadow:0 0 oklch(55% .22 270/.4)}50%{box-shadow:0 0 0 8px oklch(55% .22 270/0)}}.timeline-number.revealed{animation:2s ease-in-out forwards number-pulse}.compare-table tbody tr{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-table tbody tr.revealed{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}html{scroll-behavior:auto}.animate-fade-in,.animate-fade-in-up,.animate-fade-in-delay-1,.animate-fade-in-delay-2,.animate-fade-in-delay-3,.animate-fade-in-delay-4,.scroll-reveal{opacity:1!important;transform:none!important}}.hero-gradient{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,oklch(60% .24 270),oklch(55% .22 270),oklch(50% .18 240));background-clip:text}.dark .hero-gradient{background:linear-gradient(135deg,oklch(72% .2 270),oklch(65% .22 270),oklch(60% .18 240));background-clip:text}.glow-purple{box-shadow:0 0 60px -12px oklch(55% .22 270/.2)}.dark .glow-purple{box-shadow:0 0 60px -12px oklch(65% .22 270/.2)}.glow-text{text-shadow:0 0 40px oklch(55% .22 270/.2)}.dark .glow-text{text-shadow:0 0 40px oklch(65% .22 270/.25)}.grid-bg{background-image:linear-gradient(oklch(55% .22 270/.04) 1px,#0000 1px),linear-gradient(90deg,oklch(55% .22 270/.04) 1px,#0000 1px);background-size:64px 64px}.dark .grid-bg{background-image:linear-gradient(oklch(65% .22 270/.03) 1px,#0000 1px),linear-gradient(90deg,oklch(65% .22 270/.03) 1px,#0000 1px)}.hero-glow{filter:blur(80px);pointer-events:none;border-radius:50%;position:absolute}.section{width:100%;max-width:1152px;padding-left:var(--space-6);padding-right:var(--space-6);margin-left:auto;margin-right:auto}@media (width>=768px){.section{padding-left:var(--space-8);padding-right:var(--space-8)}}@media (width>=1280px){.section{padding-left:var(--space-10);padding-right:var(--space-10)}}.section-hero{padding-top:var(--space-24);padding-bottom:var(--space-16)}.section-compact{padding-top:var(--space-16);padding-bottom:var(--space-16)}.section-tall{padding-top:var(--space-24);padding-bottom:var(--space-24)}.glass-card{-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--space-4);background:oklch(100% 0 0/.7);transition:border-color .2s ease-out,box-shadow .2s ease-out}.glass-card:hover{box-shadow:var(--shadow-card-hover);border-color:oklch(55% .22 270/.4)}.dark .glass-card{background:oklch(17% .01 270/.6);border-color:oklch(27% .01 270/.5)}.dark .glass-card:hover{border-color:oklch(65% .22 270/.3);box-shadow:0 0 24px oklch(65% .22 270/.08)}.feature-icon{width:var(--space-10);height:var(--space-10);border-radius:var(--space-3);color:var(--accent);background:oklch(55% .22 270/.08);flex-shrink:0;justify-content:center;align-items:center;display:flex}.dark .feature-icon{background:oklch(65% .22 270/.1)}.connect-line{padding:var(--space-1) 0;flex-direction:column;align-items:center;display:flex}.connect-line:before{content:"";width:1px;height:var(--space-4);background:oklch(55% .22 270/.2);display:block}.dark .connect-line:before{background:oklch(65% .22 270/.3)}.btn-primary{justify-content:center;align-items:center;gap:var(--space-2);background:var(--accent);color:var(--accent-foreground);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:600;font-family:var(--font-sans);cursor:pointer;border:none;min-height:44px;text-decoration:none;transition:transform .15s ease-out,box-shadow .2s ease-out;display:inline-flex}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 0 24px oklch(55% .22 270/.3)}.btn-primary:active{transform:translateY(0)}.dark .btn-primary:hover{box-shadow:0 0 24px oklch(65% .22 270/.35)}.btn-ghost{justify-content:center;align-items:center;gap:var(--space-2);color:var(--muted-foreground);border:1px solid var(--border);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:500;font-family:var(--font-sans);cursor:pointer;background:0 0;min-height:44px;text-decoration:none;transition:border-color .15s ease-out,color .15s ease-out;display:inline-flex}.btn-ghost:hover{border-color:var(--accent);color:var(--accent)}.accent-badge{align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-3);color:var(--accent);letter-spacing:.02em;background:oklch(55% .22 270/.08);border-radius:9999px;font-size:12px;font-weight:600;display:inline-flex}.badge-dot{background:var(--accent);border-radius:9999px;width:6px;height:6px}.terminal-block{background:linear-gradient(135deg, var(--card), var(--muted));border:1px solid var(--border);position:relative}.terminal-block:before{content:"";background:linear-gradient(90deg, transparent, var(--accent), transparent);opacity:.4;height:1px;position:absolute;top:0;left:0;right:0}.terminal{border:1px solid var(--border);border-radius:var(--space-3);font-family:var(--font-mono);background:oklch(10% 0 0);overflow:hidden}.terminal-header{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);background:oklch(10% 0 0);display:flex}.terminal-body{padding:var(--space-4) var(--space-5);color:var(--foreground);font-size:.8125rem;line-height:1.625;overflow-x:auto}.terminal-title{color:var(--muted-foreground);margin-left:var(--space-2);font-size:12px;font-weight:500;font-family:var(--font-sans)}.terminal-dot{width:var(--space-2);height:var(--space-2);border-radius:9999px}.terminal-dot-red{background:var(--destructive)}.terminal-dot-yellow{background:var(--warning)}.terminal-dot-green{background:var(--success)}.syntax-cmd{color:var(--accent-bright);font-weight:600}.syntax-flag{color:oklch(75% .15 240)}.syntax-highlight{color:var(--accent)}.syntax-string{color:oklch(78% .16 155)}.typing-cursor{background:var(--accent);vertical-align:text-bottom;width:8px;height:1.2em;animation:1s step-end infinite blink;display:inline-block}.copy-btn{top:var(--space-3);right:var(--space-3);border-radius:var(--space-1);border:1px solid var(--border);background:var(--card);width:32px;height:32px;color:var(--muted-foreground);cursor:pointer;opacity:0;justify-content:center;align-items:center;transition:opacity .15s,color .15s;display:flex;position:absolute}.terminal:hover .copy-btn,.terminal-block:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--foreground)}.timeline-step{text-align:center;align-items:center;gap:var(--space-3);flex-direction:column;display:flex}.timeline-number{width:var(--space-10);height:var(--space-10);color:var(--accent);background:oklch(55% .22 270/.08);border-radius:9999px;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex}.dark .timeline-number{background:oklch(65% .22 270/.1)}.cora-col{background:oklch(55% .22 270/.04)}.cora-col th,.cora-col td{color:var(--accent)}.dark .cora-col{background:oklch(65% .22 270/.06)}.site-header{z-index:50;border-bottom:1px solid var(--border);-webkit-backdrop-filter:blur(12px);background:oklch(99% .002 270/.8);position:sticky;top:0}.dark .site-header{background:oklch(13% .01 270/.8)}.site-header-link{color:var(--muted-foreground);font-size:14px;text-decoration:none;transition:color .15s}.site-header-link:hover,.site-header-link.active{color:var(--foreground)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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-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} diff --git a/website/.svelte-kit/output/server/_app/immutable/assets/_page.B-froF42.css b/website/.svelte-kit/output/server/_app/immutable/assets/_page.B-froF42.css new file mode 100644 index 0000000..4b0d265 --- /dev/null +++ b/website/.svelte-kit/output/server/_app/immutable/assets/_page.B-froF42.css @@ -0,0 +1 @@ +.compare-glass-card.svelte-14kdxof{border:1px solid var(--border);backdrop-filter:blur(8px);background:oklch(99% .002 270/.6);border-radius:16px;overflow:hidden;box-shadow:0 4px 24px -4px oklch(40% .02 270/.08)}.dark .compare-glass-card.svelte-14kdxof{background:oklch(16% .015 270/.6);box-shadow:0 4px 24px -4px oklch(10% .02 270/.2)}.compare-table.svelte-14kdxof{border-collapse:collapse}.compare-table.svelte-14kdxof th:where(.svelte-14kdxof),.compare-table.svelte-14kdxof td:where(.svelte-14kdxof){border-bottom:1px solid var(--border);white-space:nowrap;padding:14px 16px;font-size:14px}.compare-table.svelte-14kdxof thead:where(.svelte-14kdxof) th:where(.svelte-14kdxof){text-transform:uppercase;letter-spacing:.05em;color:var(--muted-foreground);border-bottom:2px solid var(--border);padding:16px;font-size:13px;font-weight:600}.compare-table.svelte-14kdxof tbody:where(.svelte-14kdxof) tr:where(.svelte-14kdxof):last-child td:where(.svelte-14kdxof){border-bottom:none}.cora-highlight-col.svelte-14kdxof{background:oklch(55% .22 270/.05)}.dark .cora-highlight-col.svelte-14kdxof{background:oklch(65% .22 270/.08)}.cora-badge.svelte-14kdxof{color:oklch(55% .22 270);background:oklch(55% .22 270/.12);border-radius:6px;align-items:center;padding:2px 10px;font-size:13px;font-weight:700;display:inline-flex}.dark .cora-badge.svelte-14kdxof{color:oklch(75% .2 270);background:oklch(65% .22 270/.18)}.check-badge.svelte-14kdxof{color:oklch(50% .18 150);background:oklch(60% .18 150/.12);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:700;display:inline-flex}.dark .check-badge.svelte-14kdxof{color:oklch(70% .15 150);background:oklch(60% .18 150/.18)}.check-muted.svelte-14kdxof{width:26px;height:26px;color:var(--muted-foreground);border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:inline-flex}.cross-badge.svelte-14kdxof{color:oklch(55% .15 25);background:oklch(55% .15 25/.08);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:600;display:inline-flex}.dark .cross-badge.svelte-14kdxof{color:oklch(60% .15 25);background:oklch(60% .15 25/.12)}.dash-muted.svelte-14kdxof{color:var(--muted-foreground);opacity:.5}.compare-row.svelte-14kdxof{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-row.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.compare-card.svelte-14kdxof{border:1px solid var(--border);opacity:0;background:oklch(99% .002 270/.6);border-radius:12px;transition:opacity .4s ease-out,transform .4s ease-out;overflow:hidden;transform:translateY(8px)}.compare-card.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.dark .compare-card.svelte-14kdxof{background:oklch(16% .015 270/.6)}.compare-card-header.svelte-14kdxof{border-bottom:1px solid var(--border);background:oklch(96% .003 270);padding:10px 14px}.dark .compare-card-header.svelte-14kdxof{background:oklch(14% .012 270)}.compare-card-body.svelte-14kdxof{grid-template-columns:1fr 1fr 1fr 1fr;gap:0;display:grid}.compare-card-cora.svelte-14kdxof{border-right:1px solid var(--border);background:oklch(55% .22 270/.05);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.dark .compare-card-cora.svelte-14kdxof{background:oklch(65% .22 270/.08)}.compare-card-comp.svelte-14kdxof{border-right:1px solid var(--border);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.compare-card-comp.svelte-14kdxof:last-child{border-right:none} diff --git a/website/.svelte-kit/output/server/chunks/Icon.js b/website/.svelte-kit/output/server/chunks/Icon.js new file mode 100644 index 0000000..1d6705d --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/Icon.js @@ -0,0 +1,110 @@ +import "./index-server.js"; +import { _t as getContext, c as ensure_array_like, et as clsx, i as attributes, o as derived, s as element } from "./dev.js"; +import "./legacy-client.js"; +globalThis.Date; +globalThis.Set; +globalThis.Map; +globalThis.URL; +globalThis.URLSearchParams; +var MediaQuery = class { + current; + /** + * @param {string} query + * @param {boolean} [matches] + */ + constructor(query, matches = false) { + this.current = matches; + } +}; +/** +* @param {any} _ +*/ +function createSubscriber(_) { + return () => {}; +} +//#endregion +//#region node_modules/@lucide/svelte/dist/defaultAttributes.js +/** +* @file +* @license @lucide/svelte v1.17.0 - ISC +* +* This source code is licensed under the ISC license. +* See the LICENSE file in the root directory of this source tree. +*/ +var defaultAttributes = { + xmlns: "http://www.w3.org/2000/svg", + width: 24, + height: 24, + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": 2, + "stroke-linecap": "round", + "stroke-linejoin": "round" +}; +//#endregion +//#region node_modules/@lucide/svelte/dist/utils/hasA11yProp.js +/** +* @file +* @license @lucide/svelte v1.17.0 - ISC +* +* This source code is licensed under the ISC license. +* See the LICENSE file in the root directory of this source tree. +*/ +/** +* Check if a component has an accessibility prop +* +* @param {object} props +* @returns {boolean} Whether the component has an accessibility prop +*/ +var hasA11yProp = (props) => { + for (const prop in props) if (prop.startsWith("aria-") || prop === "role" || prop === "title") return true; + return false; +}; +//#endregion +//#region node_modules/@lucide/svelte/dist/context.js +/** +* @file +* @license @lucide/svelte v1.17.0 - ISC +* +* This source code is licensed under the ISC license. +* See the LICENSE file in the root directory of this source tree. +*/ +var LucideContext = Symbol("lucide-context"); +var getLucideContext = () => getContext(LucideContext); +//#endregion +//#region node_modules/@lucide/svelte/dist/Icon.svelte +function Icon($$renderer, $$props) { + $$renderer.component(($$renderer) => { + const globalProps = getLucideContext() ?? {}; + const { name, color = globalProps.color ?? "currentColor", size = globalProps.size ?? 24, strokeWidth = globalProps.strokeWidth ?? 2, absoluteStrokeWidth = globalProps.absoluteStrokeWidth ?? false, iconNode = [], children, $$slots, $$events, ...props } = $$props; + const calculatedStrokeWidth = derived(() => absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth); + $$renderer.push(``); + const each_array = ensure_array_like(iconNode); + for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { + let [tag, attrs] = each_array[$$index]; + element($$renderer, tag, () => { + $$renderer.push(`${attributes({ ...attrs }, void 0, void 0, void 0, 3)}`); + }); + } + $$renderer.push(``); + children?.($$renderer); + $$renderer.push(``); + }); +} +//#endregion +export { MediaQuery as n, createSubscriber as r, Icon as t }; diff --git a/website/.svelte-kit/output/server/chunks/client.js b/website/.svelte-kit/output/server/chunks/client.js new file mode 100644 index 0000000..0527a59 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/client.js @@ -0,0 +1,1472 @@ +import { n as settled, r as tick$1, t as index_server_exports } from "./index-server.js"; +import { f as get_message, h as base64_decode, n as TRAILING_SLASH_PARAM, p as get_status, r as create_remote_key, t as INVALIDATED_PARAM, y as noop } from "./shared.js"; +import { u as base } from "./environment.js"; +import { S as compact, f as make_trackable, g as add_data_suffix, h as noop_span, l as decode_params, p as normalize_path, s as hash, u as decode_pathname } from "./exports.js"; +import { R as writable, ft as noop$1 } from "./dev.js"; +import "./internal.js"; +import { HttpError, Redirect, SvelteKitError } from "@sveltejs/kit/internal"; +import "@sveltejs/kit/internal/server"; +import * as devalue from "devalue"; +var cache = /* @__PURE__ */ new Map(); +/** +* Should be called on the initial run of load functions that hydrate the page. +* Saves any requests with cache-control max-age to the cache. +* @param {URL | string} resource +* @param {RequestInit} [opts] +*/ +function initial_fetch(resource, opts) { + const selector = build_selector(resource, opts); + const script = document.querySelector(selector); + if (script?.textContent) { + script.remove(); + let { body, ...init } = JSON.parse(script.textContent); + const ttl = script.getAttribute("data-ttl"); + if (ttl) cache.set(selector, { + body, + init, + ttl: 1e3 * Number(ttl) + }); + if (script.getAttribute("data-b64") !== null) body = base64_decode(body); + return Promise.resolve(new Response(body, init)); + } + return window.fetch(resource, opts); +} +/** +* Tries to get the response from the cache, if max-age allows it, else does a fetch. +* @param {URL | string} resource +* @param {string} resolved +* @param {RequestInit} [opts] +*/ +function subsequent_fetch(resource, resolved, opts) { + if (cache.size > 0) { + const selector = build_selector(resource, opts); + const cached = cache.get(selector); + if (cached) { + if (performance.now() < cached.ttl && [ + "default", + "force-cache", + "only-if-cached", + void 0 + ].includes(opts?.cache)) return new Response(cached.body, cached.init); + cache.delete(selector); + } + } + return window.fetch(resolved, opts); +} +/** +* Build the cache key for a given request +* @param {URL | RequestInfo} resource +* @param {RequestInit} [opts] +*/ +function build_selector(resource, opts) { + let selector = `script[data-sveltekit-fetched][data-url=${JSON.stringify(resource instanceof Request ? resource.url : resource)}]`; + if (opts?.headers || opts?.body) { + /** @type {import('types').StrictBody[]} */ + const values = []; + if (opts.headers) values.push([...new Headers(opts.headers)].join(",")); + if (opts.body && (typeof opts.body === "string" || ArrayBuffer.isView(opts.body))) values.push(opts.body); + selector += `[data-hash="${hash(...values)}"]`; + } + return selector; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/client/session-storage.js +/** +* Read a value from `sessionStorage` +* @param {string} key +* @param {(value: string) => any} parse +*/ +/* @__NO_SIDE_EFFECTS__ */ +function get(key, parse = JSON.parse) { + try { + return parse(sessionStorage[key]); + } catch {} +} +var STATES_KEY = "sveltekit:states"; +var HISTORY_INDEX = "sveltekit:history"; +var NAVIGATION_INDEX = "sveltekit:navigation"; +var PRELOAD_PRIORITIES = { + tap: 1, + hover: 2, + viewport: 3, + eager: 4, + off: -1, + false: -1 +}; +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/client/utils.js +var origin = ""; +/** @param {string | URL} url */ +function resolve_url(url) { + if (url instanceof URL) return url; + let baseURI = document.baseURI; + if (!baseURI) { + const baseTags = document.getElementsByTagName("base"); + baseURI = baseTags.length ? baseTags[0].href : document.URL; + } + return new URL(url, baseURI); +} +function scroll_state() { + return { + x: pageXOffset, + y: pageYOffset + }; +} +({ ...PRELOAD_PRIORITIES }), PRELOAD_PRIORITIES.hover; +/** @param {any} value */ +function notifiable_store(value) { + const store = writable(value); + let ready = true; + function notify() { + ready = true; + store.update((val) => val); + } + /** @param {any} new_value */ + function set(new_value) { + ready = false; + store.set(new_value); + } + /** @param {(value: any) => void} run */ + function subscribe(run) { + /** @type {any} */ + let old_value; + return store.subscribe((new_value) => { + if (old_value === void 0 || ready && new_value !== old_value) run(old_value = new_value); + }); + } + return { + notify, + set, + subscribe + }; +} +var updated_listener = { v: noop }; +function create_updated_store() { + const { set, subscribe } = writable(false); + return { + subscribe, + check: async () => false + }; +} +/** +* Is external if +* - origin different +* - path doesn't start with base +* - uses hash router and pathname is more than base +* @param {URL} url +* @param {string} base +* @param {boolean} hash_routing +*/ +function is_external_url(url, base, hash_routing) { + if (url.origin !== origin || !url.pathname.startsWith(base)) return true; + if (hash_routing) return url.pathname !== location.pathname; + return false; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/client/state.svelte.js +var page; +var navigating; +var updated; +var is_legacy = noop$1.toString().includes("$$") || /function \w+\(\) \{\}/.test(noop$1.toString()); +var placeholder_url = "a:"; +if (is_legacy) { + page = { + data: {}, + form: null, + error: null, + params: {}, + route: { id: null }, + state: {}, + status: -1, + url: new URL(placeholder_url) + }; + navigating = { current: null }; + updated = { current: false }; +} else { + page = new class Page { + data = {}; + form = null; + error = null; + params = {}; + route = { id: null }; + state = {}; + status = -1; + url = new URL(placeholder_url); + }(); + navigating = new class Navigating { + current = null; + }(); + updated = new class Updated { + current = false; + }(); + updated_listener.v = () => updated.current = true; +} +/** +* @param {import('@sveltejs/kit').Page} new_page +*/ +function update(new_page) { + Object.assign(page, new_page); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/client/ndjson.js +/** +* Yields parsed JSON objects from a ReadableStream of newline-delimited JSON. +* Each yielded value is the raw `JSON.parse`'d object — callers handle deserialization. +* @param {ReadableStreamDefaultReader} reader +*/ +async function* read_ndjson(reader) { + let done = false; + let buffer = ""; + const decoder = new TextDecoder(); + while (true) { + let split = buffer.indexOf("\n"); + while (split !== -1) { + const line = buffer.slice(0, split).trim(); + buffer = buffer.slice(split + 1); + if (line) yield JSON.parse(line); + split = buffer.indexOf("\n"); + } + if (done) { + const line = buffer.trim(); + if (line) yield JSON.parse(line); + return; + } + const chunk = await reader.read(); + done = chunk.done; + if (chunk.value) buffer += decoder.decode(chunk.value, { stream: true }); + if (done) buffer += decoder.decode(); + } +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/client/client.js +/** @import { CacheEntry } from './remote-functions/cache.svelte.js' */ +/** @import { Query } from './remote-functions/query/instance.svelte.js' */ +/** @import { LiveQuery } from './remote-functions/query-live/instance.svelte.js' */ +var { onMount, tick } = index_server_exports; +/** +* Set via transformError, reset and read at the end of navigate. +* Necessary because a navigation might succeed loading but during rendering +* an error occurs, at which point the navigation result needs to be overridden with the error result. +* TODO this is all very hacky, rethink for SvelteKit 3 where we can assume Svelte 5 and do an overhaul of client.js +* @type {{ error: App.Error, status: number } | null} +*/ +var rendering_error = null; +/** +* history index -> { x, y } +* @type {Record} +*/ +var scroll_positions = /* @__PURE__ */ get("sveltekit:scroll") ?? {}; +/** +* navigation index -> any +* @type {Record} +*/ +var snapshots = /* @__PURE__ */ get("sveltekit:snapshot") ?? {}; +var stores = { + url: /* @__PURE__ */ notifiable_store({}), + page: /* @__PURE__ */ notifiable_store({}), + navigating: /* @__PURE__ */ writable(null), + updated: /* @__PURE__ */ create_updated_store() +}; +/** @param {number} index */ +function update_scroll_positions(index) { + scroll_positions[index] = scroll_state(); +} +/** +* @param {number} current_history_index +* @param {number} current_navigation_index +*/ +function clear_onward_history(current_history_index, current_navigation_index) { + let i = current_history_index + 1; + while (scroll_positions[i]) { + delete scroll_positions[i]; + i += 1; + } + i = current_navigation_index + 1; + while (snapshots[i]) { + delete snapshots[i]; + i += 1; + } +} +/** +* Loads `href` the old-fashioned way, with a full page reload. +* Returns a `Promise` that never resolves (to prevent any +* subsequent work, e.g. history manipulation, from happening) +* @param {URL} url +* @param {boolean} [replace] If `true`, will replace the current `history` entry rather than creating a new one with `pushState` +*/ +function native_navigation(url, replace = false) { + if (replace) location.replace(url.href); + else location.href = url.href; + return new Promise(noop); +} +/** +* Checks whether a service worker is registered, and if it is, +* tries to update it. +*/ +async function update_service_worker() { + if ("serviceWorker" in navigator) { + const registration = await navigator.serviceWorker.getRegistration(base || "/"); + if (registration) await registration.update(); + } +} +/** @type {import('types').CSRRoute[]} All routes of the app. Only available when kit.router.resolution=client */ +var routes; +/** @type {import('types').CSRPageNodeLoader} */ +var default_layout_loader; +/** @type {import('types').CSRPageNodeLoader} */ +var default_error_loader; +/** @type {HTMLElement} */ +var target; +/** @type {import('./types.js').SvelteKitApp} */ +var app; +/** @type {Array<((url: URL) => boolean)>} */ +var invalidated = []; +/** +* An array of the `+layout.svelte` and `+page.svelte` component instances +* that currently live on the page — used for capturing and restoring snapshots. +* It's updated/manipulated through `bind:this` in `Root.svelte`. +* @type {import('svelte').SvelteComponent[]} +*/ +var components = []; +/** @type {{id: string, token: {}, promise: Promise, fork: Promise | null} | null} */ +var load_cache = null; +function discard_load_cache() { + load_cache?.fork?.then((f) => f?.discard()); + load_cache = null; +} +/** +* @type {Map>} +* Cache for client-side rerouting, since it could contain async calls which we want to +* avoid running multiple times which would slow down navigations (e.g. else preloading +* wouldn't help because on navigation it would be called again). Since `reroute` should be +* a pure function (i.e. always return the same) value it's safe to cache across navigations. +* The server reroute calls don't need to be cached because they are called using `import(...)` +* which is cached per the JS spec. +*/ +var reroute_cache = /* @__PURE__ */ new Map(); +/** +* Note on before_navigate_callbacks, on_navigate_callbacks and after_navigate_callbacks: +* do not re-assign as some closures keep references to these Sets +*/ +/** @type {Set<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */ +var before_navigate_callbacks = /* @__PURE__ */ new Set(); +/** @type {Set<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */ +var on_navigate_callbacks = /* @__PURE__ */ new Set(); +/** @type {Set<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */ +var after_navigate_callbacks = /* @__PURE__ */ new Set(); +/** @type {import('./types.js').NavigationState & { nav: import('@sveltejs/kit').NavigationEvent }} */ +var current = { + branch: [], + error: null, + url: null, + nav: null +}; +/** this being true means we SSR'd */ +var hydrated = false; +var started = false; +var autoscroll = true; +var is_navigating = false; +var force_invalidation = false; +/** @type {import('svelte').SvelteComponent} */ +var root; +/** @type {number} keeping track of the history index in order to prevent popstate navigation events if needed */ +var current_history_index; +/** @type {number} */ +var current_navigation_index; +/** @type {{}} */ +var token; +/** +* A set of tokens which are associated to current preloads. +* If a preload becomes a real navigation, it's removed from the set. +* If a preload token is in the set and the preload errors, the error +* handling logic (for example reloading) is skipped. +*/ +var preload_tokens = /* @__PURE__ */ new Set(); +/** +* @type {Map>>>} +* A map of query id -> payload -> query internals for all active queries. +*/ +var query_map = /* @__PURE__ */ new Map(); +/** +* @type {Map>>>} +* A map of id -> payload -> live query internals for all active queries. +*/ +var live_query_map = /* @__PURE__ */ new Map(); +function reset_invalidation() { + invalidated.length = 0; + force_invalidation = false; +} +/** @param {number} index */ +function capture_snapshot(index) { + if (components.some((c) => c?.snapshot)) snapshots[index] = components.map((c) => c?.snapshot?.capture()); +} +/** @param {number} index */ +function restore_snapshot(index) { + snapshots[index]?.forEach((value, i) => { + components[i]?.snapshot?.restore(value); + }); +} +/** +* @param {string | URL} url +* @param {{ replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; invalidate?: Array boolean)>; state?: Record }} options +* @param {number} redirect_count +* @param {{}} [nav_token] +*/ +async function _goto(url, options, redirect_count, nav_token) { + /** @type {Set} */ + let query_keys; + /** @type {Set} */ + let live_query_keys; + if (options.invalidateAll) discard_load_cache(); + await navigate({ + type: "goto", + url: resolve_url(url), + keepfocus: options.keepFocus, + noscroll: options.noScroll, + replace_state: options.replaceState, + state: options.state, + redirect_count, + nav_token, + accept: () => { + if (options.invalidateAll) { + force_invalidation = true; + query_keys = /* @__PURE__ */ new Set(); + for (const [id, entries] of query_map) for (const payload of entries.keys()) query_keys.add(create_remote_key(id, payload)); + live_query_keys = /* @__PURE__ */ new Set(); + for (const [id, entries] of live_query_map) for (const payload of entries.keys()) live_query_keys.add(create_remote_key(id, payload)); + } + if (options.invalidate) options.invalidate.forEach(push_invalidated); + } + }); + if (options.invalidateAll) tick$1().then(tick$1).then(() => { + for (const [id, entries] of query_map) for (const [payload, { resource }] of entries) if (query_keys?.has(create_remote_key(id, payload))) resource.refresh(); + for (const [id, entries] of live_query_map) for (const [payload, { resource }] of entries) if (live_query_keys?.has(create_remote_key(id, payload))) resource.reconnect(); + }); +} +/** +* @param {import('./types.js').NavigationFinished} result +* @param {HTMLElement} target +* @param {boolean} hydrate +*/ +async function initialize(result, target, hydrate) { + /** @type {import('@sveltejs/kit').NavigationEvent} */ + const nav = { + params: current.params, + route: { id: current.route?.id ?? null }, + url: new URL(location.href) + }; + current = { + ...result.state, + nav + }; + update(result.props.page); + root = new app.root({ + target, + props: { + ...result.props, + stores, + components + }, + hydrate, + sync: false, + transformError: void 0 + }); + await Promise.resolve(); + restore_snapshot(current_navigation_index); + if (hydrate) { + /** @type {import('@sveltejs/kit').AfterNavigate} */ + const navigation = { + from: null, + to: { + ...nav, + scroll: scroll_positions[current_history_index] ?? scroll_state() + }, + willUnload: false, + type: "enter", + complete: Promise.resolve() + }; + after_navigate_callbacks.forEach((fn) => fn(navigation)); + } + started = true; +} +/** +* +* @param {{ +* url: URL; +* params: Record; +* branch: Array; +* errors?: Array; +* status: number; +* error: App.Error | null; +* route: import('types').CSRRoute | null; +* form?: Record | null; +* }} opts +*/ +async function get_navigation_result_from_branch({ url, params, branch, errors, status, error, route, form }) { + /** @type {import('types').TrailingSlash} */ + let slash = "never"; + if (base && (url.pathname === base || url.pathname === base + "/")) slash = "always"; + else for (const node of branch) if (node?.slash !== void 0) slash = node.slash; + url.pathname = normalize_path(url.pathname, slash); + url.search = url.search; + /** @type {import('./types.js').NavigationFinished} */ + const result = { + type: "loaded", + state: { + url, + params, + branch, + error, + route + }, + props: { + constructors: compact(branch).map((branch_node) => branch_node.node.component), + page: clone_page(page) + } + }; + if (form !== void 0) result.props.form = form; + let data = {}; + let data_changed = !page; + let p = 0; + for (let i = 0; i < Math.max(branch.length, current.branch.length); i += 1) { + const node = branch[i]; + const prev = current.branch[i]; + if (node?.data !== prev?.data) data_changed = true; + if (!node) continue; + data = { + ...data, + ...node.data + }; + if (data_changed) result.props[`data_${p}`] = data; + p += 1; + } + if (!current.url || url.href !== current.url.href || current.error !== error || form !== void 0 && form !== page.form || data_changed) result.props.page = { + error, + params, + route: { id: route?.id ?? null }, + state: {}, + status, + url: new URL(url), + form: form ?? null, + data: data_changed ? data : page.data + }; + return result; +} +/** +* Call the universal load function of the given node, if it exists. +* +* @param {{ +* loader: import('types').CSRPageNodeLoader; +* parent: () => Promise>; +* url: URL; +* params: Record; +* route: { id: string | null }; +* server_data_node: import('./types.js').DataNode | null; +* }} options +* @returns {Promise} +*/ +async function load_node({ loader, parent, url, params, route, server_data_node }) { + /** @type {Record | null} */ + let data = null; + let is_tracking = true; + /** @type {import('types').Uses} */ + const uses = { + dependencies: /* @__PURE__ */ new Set(), + params: /* @__PURE__ */ new Set(), + parent: false, + route: false, + url: false, + search_params: /* @__PURE__ */ new Set() + }; + const node = await loader(); + if (node.universal?.load) { + /** @param {string[]} deps */ + function depends(...deps) { + for (const dep of deps) { + const { href } = new URL(dep, url); + uses.dependencies.add(href); + } + } + /** @type {import('@sveltejs/kit').LoadEvent} */ + const load_input = { + tracing: { + enabled: false, + root: noop_span, + current: noop_span + }, + route: new Proxy(route, { get: (target, key) => { + if (is_tracking) uses.route = true; + return target[key]; + } }), + params: new Proxy(params, { get: (target, key) => { + if (is_tracking) uses.params.add(key); + return target[key]; + } }), + data: server_data_node?.data ?? null, + url: make_trackable(url, () => { + if (is_tracking) uses.url = true; + }, (param) => { + if (is_tracking) uses.search_params.add(param); + }, app.hash), + async fetch(resource, init) { + if (resource instanceof Request) init = { + body: resource.method === "GET" || resource.method === "HEAD" ? void 0 : await resource.blob(), + cache: resource.cache, + credentials: resource.credentials, + headers: [...resource.headers].length > 0 ? resource?.headers : void 0, + integrity: resource.integrity, + keepalive: resource.keepalive, + method: resource.method, + mode: resource.mode, + redirect: resource.redirect, + referrer: resource.referrer, + referrerPolicy: resource.referrerPolicy, + signal: resource.signal, + ...init + }; + const { resolved, promise } = resolve_fetch_url(resource, init, url); + if (is_tracking) depends(resolved.href); + return promise; + }, + setHeaders: noop, + depends, + parent() { + if (is_tracking) uses.parent = true; + return parent(); + }, + untrack(fn) { + is_tracking = false; + try { + return fn(); + } finally { + is_tracking = true; + } + } + }; + data = await node.universal.load.call(null, load_input) ?? null; + } + return { + node, + loader, + server: server_data_node, + universal: node.universal?.load ? { + type: "data", + data, + uses + } : null, + data: data ?? server_data_node?.data ?? null, + slash: node.universal?.trailingSlash ?? server_data_node?.slash + }; +} +/** +* @param {Request | string | URL} input +* @param {RequestInit | undefined} init +* @param {URL} url +*/ +function resolve_fetch_url(input, init, url) { + let requested = input instanceof Request ? input.url : input; + const resolved = new URL(requested, url); + if (resolved.origin === url.origin) requested = resolved.href.slice(url.origin.length); + return { + resolved, + promise: started ? subsequent_fetch(requested, resolved.href, init) : initial_fetch(requested, init) + }; +} +/** +* @param {boolean} parent_changed +* @param {boolean} route_changed +* @param {boolean} url_changed +* @param {Set} search_params_changed +* @param {import('types').Uses | undefined} uses +* @param {Record} params +*/ +function has_changed(parent_changed, route_changed, url_changed, search_params_changed, uses, params) { + if (force_invalidation) return true; + if (!uses) return false; + if (uses.parent && parent_changed) return true; + if (uses.route && route_changed) return true; + if (uses.url && url_changed) return true; + for (const tracked_params of uses.search_params) if (search_params_changed.has(tracked_params)) return true; + for (const param of uses.params) if (params[param] !== current.params[param]) return true; + for (const href of uses.dependencies) if (invalidated.some((fn) => fn(new URL(href)))) return true; + return false; +} +/** +* @param {import('types').ServerDataNode | import('types').ServerDataSkippedNode | null} node +* @param {import('./types.js').DataNode | null} [previous] +* @returns {import('./types.js').DataNode | null} +*/ +function create_data_node(node, previous) { + if (node?.type === "data") return node; + if (node?.type === "skip") return previous ?? null; + return null; +} +/** +* @param {URL | null} old_url +* @param {URL} new_url +*/ +function diff_search_params(old_url, new_url) { + if (!old_url) return new Set(new_url.searchParams.keys()); + const changed = new Set([...old_url.searchParams.keys(), ...new_url.searchParams.keys()]); + for (const key of changed) { + const old_values = old_url.searchParams.getAll(key); + const new_values = new_url.searchParams.getAll(key); + if (old_values.every((value) => new_values.includes(value)) && new_values.every((value) => old_values.includes(value))) changed.delete(key); + } + return changed; +} +/** +* @param {Omit & { error: App.Error }} opts +* @returns {import('./types.js').NavigationFinished} +*/ +function preload_error({ error, url, route, params }) { + return { + type: "loaded", + state: { + error, + url, + route, + params, + branch: [] + }, + props: { + page: clone_page(page), + constructors: [] + } + }; +} +/** +* @param {import('./types.js').NavigationIntent & { preload?: {} }} intent +* @returns {Promise} +*/ +async function load_route({ id, invalidating, url, params, route, preload }) { + if (load_cache?.id === id) { + preload_tokens.delete(load_cache.token); + return load_cache.promise; + } + const { errors, layouts, leaf } = route; + const loaders = [...layouts, leaf]; + errors.forEach((loader) => loader?.().catch(noop)); + loaders.forEach((loader) => loader?.[1]().catch(noop)); + /** @type {import('types').ServerNodesResponse | import('types').ServerRedirectNode | null} */ + let server_data = null; + const url_changed = current.url ? id !== get_page_key(current.url) : false; + const route_changed = current.route ? route.id !== current.route.id : false; + const search_params_changed = diff_search_params(current.url, url); + let parent_invalid = false; + { + const invalid_server_nodes = loaders.map((loader, i) => { + const previous = current.branch[i]; + const invalid = !!loader?.[0] && (previous?.loader !== loader[1] || has_changed(parent_invalid, route_changed, url_changed, search_params_changed, previous.server?.uses, params)); + if (invalid) parent_invalid = true; + return invalid; + }); + if (invalid_server_nodes.some(Boolean)) { + try { + server_data = await load_data(url, invalid_server_nodes); + } catch (error) { + const handled_error = await handle_error(error, { + url, + params, + route: { id } + }); + if (preload_tokens.has(preload)) return preload_error({ + error: handled_error, + url, + params, + route + }); + return load_root_error_page({ + status: get_status(error), + error: handled_error, + url, + route + }); + } + if (server_data.type === "redirect") return server_data; + } + } + const server_data_nodes = server_data?.nodes; + let parent_changed = false; + const branch_promises = loaders.map(async (loader, i) => { + if (!loader) return; + /** @type {import('./types.js').BranchNode | undefined} */ + const previous = current.branch[i]; + const server_data_node = server_data_nodes?.[i]; + if ((!server_data_node || server_data_node.type === "skip") && loader[1] === previous?.loader && !has_changed(parent_changed, route_changed, url_changed, search_params_changed, previous.universal?.uses, params)) return previous; + parent_changed = true; + if (server_data_node?.type === "error") throw server_data_node; + return load_node({ + loader: loader[1], + url, + params, + route, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) Object.assign(data, (await branch_promises[j])?.data); + return data; + }, + server_data_node: create_data_node(server_data_node === void 0 && loader[0] ? { type: "skip" } : server_data_node ?? null, loader[0] ? previous?.server : void 0) + }); + }); + for (const p of branch_promises) p.catch(noop); + /** @type {Array} */ + const branch = []; + for (let i = 0; i < loaders.length; i += 1) if (loaders[i]) try { + branch.push(await branch_promises[i]); + } catch (err) { + if (err instanceof Redirect) return { + type: "redirect", + location: err.location + }; + if (preload_tokens.has(preload)) return preload_error({ + error: await handle_error(err, { + params, + url, + route: { id: route.id } + }), + url, + params, + route + }); + let status = get_status(err); + /** @type {App.Error} */ + let error; + if (server_data_nodes?.includes(err)) { + status = err.status ?? status; + error = err.error; + } else if (err instanceof HttpError) error = err.body; + else { + if (await stores.updated.check()) { + await update_service_worker(); + return await native_navigation(url); + } + error = await handle_error(err, { + params, + url, + route: { id: route.id } + }); + } + const error_load = await load_nearest_error_page(i, branch, errors); + if (error_load) return get_navigation_result_from_branch({ + url, + params, + branch: branch.slice(0, error_load.idx).concat(error_load.node), + errors, + status, + error, + route + }); + else return await server_fallback(url, { id: route.id }, error, status); + } + else branch.push(void 0); + return get_navigation_result_from_branch({ + url, + params, + branch, + errors, + status: 200, + error: null, + route, + form: invalidating ? void 0 : null + }); +} +/** +* @param {number} i Start index to backtrack from +* @param {Array} branch Branch to backtrack +* @param {Array} errors All error pages for this branch +* @returns {Promise<{idx: number; node: import('./types.js').BranchNode} | undefined>} +*/ +async function load_nearest_error_page(i, branch, errors) { + while (i--) if (errors[i]) { + let j = i; + while (!branch[j]) j -= 1; + try { + return { + idx: j + 1, + node: { + node: await errors[i](), + loader: errors[i], + data: {}, + server: null, + universal: null + } + }; + } catch { + continue; + } + } +} +/** +* @param {{ +* status: number; +* error: App.Error; +* url: URL; +* route: { id: string | null } +* }} opts +* @returns {Promise} +*/ +async function load_root_error_page({ status, error, url, route }) { + /** @type {Record} */ + const params = {}; + /** @type {import('types').ServerDataNode | null} */ + let server_data_node = null; + if (app.server_loads[0] === 0) try { + const server_data = await load_data(url, [true]); + if (server_data.type !== "data" || server_data.nodes[0] && server_data.nodes[0].type !== "data") throw 0; + server_data_node = server_data.nodes[0] ?? null; + } catch { + if (url.origin !== origin || url.pathname !== location.pathname || hydrated) await native_navigation(url); + } + try { + return get_navigation_result_from_branch({ + url, + params, + branch: [await load_node({ + loader: default_layout_loader, + url, + params, + route, + parent: () => Promise.resolve({}), + server_data_node: create_data_node(server_data_node) + }), { + node: await default_error_loader(), + loader: default_error_loader, + universal: null, + server: null, + data: null + }], + status, + error, + errors: [], + route: null + }); + } catch (error) { + if (error instanceof Redirect) return _goto(new URL(error.location, location.href), {}, 0); + throw error; + } +} +/** +* Resolve the relative rerouted URL for a client-side navigation +* @param {URL} url +* @returns {Promise} +*/ +async function get_rerouted_url(url) { + const href = url.href; + if (reroute_cache.has(href)) return reroute_cache.get(href); + let rerouted; + try { + const promise = (async () => { + let rerouted = await app.hooks.reroute({ + url: new URL(url), + fetch: async (input, init) => { + return resolve_fetch_url(input, init, url).promise; + } + }) ?? url; + if (typeof rerouted === "string") { + const tmp = new URL(url); + if (app.hash) tmp.hash = rerouted; + else tmp.pathname = rerouted; + rerouted = tmp; + } + return rerouted; + })(); + reroute_cache.set(href, promise); + rerouted = await promise; + } catch (e) { + reroute_cache.delete(href); + return; + } + return rerouted; +} +/** +* Resolve the full info (which route, params, etc.) for a client-side navigation from the URL, +* taking the reroute hook into account. If this isn't a client-side-navigation (or the URL is undefined), +* returns undefined. +* @param {URL | undefined} url +* @param {boolean} invalidating +* @returns {Promise} +*/ +async function get_navigation_intent(url, invalidating) { + if (!url) return; + if (is_external_url(url, base, app.hash)) return; + { + const rerouted = await get_rerouted_url(url); + if (!rerouted) return; + const path = get_url_path(rerouted); + for (const route of routes) { + const params = route.exec(path); + if (params) return { + id: get_page_key(url), + invalidating, + route, + params: decode_params(params), + url + }; + } + } +} +/** @param {URL} url */ +function get_url_path(url) { + return decode_pathname(app.hash ? url.hash.replace(/^#/, "").replace(/[?#].+/, "") : url.pathname.slice(base.length)) || "/"; +} +/** @param {URL} url */ +function get_page_key(url) { + return (app.hash ? url.hash.replace(/^#/, "") : url.pathname) + url.search; +} +/** +* @param {{ +* url: URL; +* type: import('@sveltejs/kit').Navigation["type"]; +* intent?: import('./types.js').NavigationIntent; +* delta?: number; +* event?: PopStateEvent | MouseEvent; +* scroll?: { x: number, y: number }; +* }} opts +*/ +function _before_navigate({ url, type, intent, delta, event, scroll }) { + let should_block = false; + const nav = create_navigation(current, intent, url, type, scroll ?? null); + if (delta !== void 0) nav.navigation.delta = delta; + if (event !== void 0) nav.navigation.event = event; + const cancellable = { + ...nav.navigation, + cancel: () => { + should_block = true; + nav.reject(/* @__PURE__ */ new Error("navigation cancelled")); + } + }; + if (!is_navigating) before_navigate_callbacks.forEach((fn) => fn(cancellable)); + return should_block ? null : nav; +} +/** +* @param {{ +* type: import('@sveltejs/kit').NavigationType; +* url: URL; +* popped?: { +* state: Record; +* scroll: { x: number, y: number }; +* delta: number; +* }; +* keepfocus?: boolean; +* noscroll?: boolean; +* replace_state?: boolean; +* state?: Record; +* redirect_count?: number; +* nav_token?: {}; +* accept?: () => void; +* block?: () => void; +* event?: Event +* }} opts +*/ +async function navigate({ type, url, popped, keepfocus, noscroll, replace_state, state = {}, redirect_count = 0, nav_token = {}, accept = noop, block = noop, event }) { + const prev_token = token; + token = nav_token; + const intent = await get_navigation_intent(url, false); + const nav = type === "enter" ? create_navigation(current, intent, url, type) : _before_navigate({ + url, + type, + delta: popped?.delta, + intent, + scroll: popped?.scroll, + event + }); + if (!nav) { + block(); + if (token === nav_token) token = prev_token; + return; + } + const previous_history_index = current_history_index; + const previous_navigation_index = current_navigation_index; + accept(); + is_navigating = true; + if (started && nav.navigation.type !== "enter") stores.navigating.set(navigating.current = nav.navigation); + let navigation_result = intent && await load_route(intent); + if (!navigation_result) if (is_external_url(url, base, app.hash)) return await native_navigation(url, replace_state); + else navigation_result = await server_fallback(url, { id: null }, await handle_error(new SvelteKitError(404, "Not Found", `Not found: ${url.pathname}`), { + url, + params: {}, + route: { id: null } + }), 404, replace_state); + url = intent?.url || url; + if (token !== nav_token) { + nav.reject(/* @__PURE__ */ new Error("navigation aborted")); + return false; + } + if (navigation_result.type === "redirect") { + if (redirect_count < 20) { + await navigate({ + type, + url: new URL(navigation_result.location, url), + popped, + keepfocus, + noscroll, + replace_state, + state, + redirect_count: redirect_count + 1, + nav_token + }); + nav.fulfil(void 0); + return; + } + navigation_result = await load_root_error_page({ + status: 500, + error: await handle_error(/* @__PURE__ */ new Error("Redirect loop"), { + url, + params: {}, + route: { id: null } + }), + url, + route: { id: null } + }); + } else if (navigation_result.props.page.status >= 400) { + if (await stores.updated.check()) { + await update_service_worker(); + await native_navigation(url, replace_state); + } + } + reset_invalidation(); + update_scroll_positions(previous_history_index); + capture_snapshot(previous_navigation_index); + if (navigation_result.props.page.url.pathname !== url.pathname) url.pathname = navigation_result.props.page.url.pathname; + state = popped ? popped.state : state; + if (!popped) { + const change = replace_state ? 0 : 1; + const entry = { + [HISTORY_INDEX]: current_history_index += change, + [NAVIGATION_INDEX]: current_navigation_index += change, + [STATES_KEY]: state + }; + (replace_state ? history.replaceState : history.pushState).call(history, entry, "", url); + if (!replace_state) clear_onward_history(current_history_index, current_navigation_index); + } + const load_cache_fork = intent && load_cache?.id === intent.id ? load_cache.fork : null; + if (load_cache?.fork && !load_cache_fork) discard_load_cache(); + load_cache = null; + navigation_result.props.page.state = state; + /** + * @type {Promise | undefined} + */ + let commit_promise; + if (started) { + const after_navigate = (await Promise.all(Array.from(on_navigate_callbacks, (fn) => fn(nav.navigation)))).filter( + /** @returns {value is () => void} */ + (value) => typeof value === "function" + ); + if (after_navigate.length > 0) { + function cleanup() { + after_navigate.forEach((fn) => { + after_navigate_callbacks.delete(fn); + }); + } + after_navigate.push(cleanup); + after_navigate.forEach((fn) => { + after_navigate_callbacks.add(fn); + }); + } + const target = nav.navigation.to; + current = { + ...navigation_result.state, + nav: { + params: target.params, + route: target.route, + url: target.url + } + }; + if (navigation_result.props.page) navigation_result.props.page.url = url; + const fork = load_cache_fork && await load_cache_fork; + if (fork) commit_promise = fork.commit(); + else { + rendering_error = null; + root.$set(navigation_result.props); + if (rendering_error) Object.assign(navigation_result.props.page, rendering_error); + update(navigation_result.props.page); + commit_promise = settled?.(); + } + } else await initialize(navigation_result, target, false); + const { activeElement } = document; + await commit_promise; + await tick$1(); + await tick$1(); + if (token !== nav_token) { + nav.reject(/* @__PURE__ */ new Error("navigation aborted")); + return false; + } + if (navigation_result.props.page && rendering_error) Object.assign(navigation_result.props.page, rendering_error); + /** @type {Element | null | ''} */ + let deep_linked = null; + if (autoscroll) { + const scroll = popped ? popped.scroll : noscroll ? scroll_state() : null; + if (scroll) scrollTo(scroll.x, scroll.y); + else if (deep_linked = url.hash && document.getElementById(get_id(url))) deep_linked.scrollIntoView(); + else scrollTo(0, 0); + } + const changed_focus = document.activeElement !== activeElement && document.activeElement !== document.body; + if (!keepfocus && !changed_focus) reset_focus(url, !deep_linked); + autoscroll = true; + is_navigating = false; + if (type === "popstate") restore_snapshot(current_navigation_index); + nav.fulfil(void 0); + if (nav.navigation.to) nav.navigation.to.scroll = scroll_state(); + after_navigate_callbacks.forEach((fn) => fn(nav.navigation)); + stores.navigating.set(navigating.current = null); +} +/** +* Does a full page reload if it wouldn't result in an endless loop in the SPA case +* @param {URL} url +* @param {{ id: string | null }} route +* @param {App.Error} error +* @param {number} status +* @param {boolean} [replace_state] +* @returns {Promise} +*/ +async function server_fallback(url, route, error, status, replace_state) { + if (url.origin === origin && url.pathname === location.pathname && !hydrated) return await load_root_error_page({ + status, + error, + url, + route + }); + return await native_navigation(url, replace_state); +} +/** +* @param {unknown} error +* @param {import('@sveltejs/kit').NavigationEvent} event +* @returns {import('types').MaybePromise} +*/ +function handle_error(error, event) { + if (error instanceof HttpError) return error.body; + const status = get_status(error); + const message = get_message(error); + return app.hooks.handleError({ + error, + event, + status, + message + }) ?? { message }; +} +/** +* Allows you to navigate programmatically to a given route, with options such as keeping the current element focused. +* Returns a Promise that resolves when SvelteKit navigates (or fails to navigate, in which case the promise rejects) to the specified `url`. +* +* For external URLs, use `window.location = url` instead of calling `goto(url)`. +* +* @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. +* @param {Object} [opts] Options related to the navigation +* @param {boolean} [opts.replaceState] If `true`, will replace the current `history` entry rather than creating a new one with `pushState` +* @param {boolean} [opts.noScroll] If `true`, the browser will maintain its scroll position rather than scrolling to the top of the page after navigation +* @param {boolean} [opts.keepFocus] If `true`, the currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body +* @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://svelte.dev/docs/kit/load#rerunning-load-functions for more info on invalidation. +* @param {Array boolean)>} [opts.invalidate] Causes any load functions to re-run if they depend on one of the urls +* @param {App.PageState} [opts.state] An optional object that will be available as `page.state` +* @returns {Promise} +*/ +function goto(url, opts = {}) { + throw new Error("Cannot call goto(...) on the server"); +} +/** +* @param {string | URL | ((url: URL) => boolean)} resource The invalidated URL +*/ +function push_invalidated(resource) { + if (typeof resource === "function") invalidated.push(resource); + else { + const { href } = new URL(resource, location.href); + invalidated.push((url) => url.href === href); + } +} +/** +* @param {URL} url +* @param {boolean[]} invalid +* @returns {Promise} +*/ +async function load_data(url, invalid) { + const data_url = new URL(url); + data_url.pathname = add_data_suffix(url.pathname); + if (url.pathname.endsWith("/")) data_url.searchParams.append(TRAILING_SLASH_PARAM, "1"); + data_url.searchParams.append(INVALIDATED_PARAM, invalid.map((i) => i ? "1" : "0").join("")); + const res = await (0, window.fetch)(data_url.href, {}); + if (!res.ok) { + /** @type {string | undefined} */ + let message; + if (res.headers.get("content-type")?.includes("application/json")) message = await res.json(); + else if (res.status === 404) message = "Not Found"; + else if (res.status === 500) message = "Internal Error"; + throw new HttpError(res.status, message); + } + return new Promise(async (resolve) => { + /** + * Map of deferred promises that will be resolved by a subsequent chunk of data + * @type {Map} + */ + const deferreds = /* @__PURE__ */ new Map(); + const reader = res.body.getReader(); + /** + * @param {any} data + */ + function deserialize(data) { + return devalue.unflatten(data, { + ...app.decoders, + Promise: (id) => { + return new Promise((fulfil, reject) => { + deferreds.set(id, { + fulfil, + reject + }); + }); + } + }); + } + for await (const node of read_ndjson(reader)) { + if (node.type === "redirect") return resolve(node); + if (node.type === "data") { + node.nodes?.forEach((node) => { + if (node?.type === "data") { + node.uses = deserialize_uses(node.uses); + node.data = deserialize(node.data); + } + }); + resolve(node); + } else if (node.type === "chunk") { + const { id, data, error } = node; + const deferred = deferreds.get(id); + deferreds.delete(id); + if (error) deferred.reject(deserialize(error)); + else deferred.fulfil(deserialize(data)); + } + } + }); +} +/** +* @param {any} uses +* @return {import('types').Uses} +*/ +function deserialize_uses(uses) { + return { + dependencies: new Set(uses?.dependencies ?? []), + params: new Set(uses?.params ?? []), + parent: !!uses?.parent, + route: !!uses?.route, + url: !!uses?.url, + search_params: new Set(uses?.search_params ?? []) + }; +} +/** +* @param {URL} url +* @param {boolean} [scroll] +*/ +function reset_focus(url, scroll = true) { + const autofocus = document.querySelector("[autofocus]"); + if (autofocus) autofocus.focus(); + else { + const id = get_id(url); + if (id && document.getElementById(id)) { + const { x, y } = scroll_state(); + setTimeout(() => { + const history_state = history.state; + location.replace(new URL(`#${id}`, location.href)); + history.replaceState(history_state, "", url); + if (scroll) scrollTo(x, y); + }); + } else { + const root = document.body; + const tabindex = root.getAttribute("tabindex"); + root.tabIndex = -1; + root.focus({ + preventScroll: true, + focusVisible: false + }); + if (tabindex !== null) root.setAttribute("tabindex", tabindex); + else root.removeAttribute("tabindex"); + } + const selection = getSelection(); + if (selection && selection.type !== "None") { + /** @type {Range[]} */ + const ranges = []; + for (let i = 0; i < selection.rangeCount; i += 1) ranges.push(selection.getRangeAt(i)); + setTimeout(() => { + if (selection.rangeCount !== ranges.length) return; + for (let i = 0; i < selection.rangeCount; i += 1) { + const a = ranges[i]; + const b = selection.getRangeAt(i); + if (a.commonAncestorContainer !== b.commonAncestorContainer || a.startContainer !== b.startContainer || a.endContainer !== b.endContainer || a.startOffset !== b.startOffset || a.endOffset !== b.endOffset) return; + } + selection.removeAllRanges(); + }); + } + } +} +/** +* @template {import('@sveltejs/kit').NavigationType} T +* @param {import('./types.js').NavigationState} current +* @param {import('./types.js').NavigationIntent | undefined} intent +* @param {URL | null} url +* @param {T} type +* @param {{ x: number, y: number } | null} [target_scroll] The scroll position for the target (for popstate navigations) +*/ +function create_navigation(current, intent, url, type, target_scroll = null) { + /** @type {(value: any) => void} */ + let fulfil; + /** @type {(error: any) => void} */ + let reject; + const complete = new Promise((f, r) => { + fulfil = f; + reject = r; + }); + complete.catch(noop); + return { + navigation: { + from: { + params: current.params, + route: { id: current.route?.id ?? null }, + url: current.url, + scroll: scroll_state() + }, + to: url && { + params: intent?.params ?? null, + route: { id: intent?.route?.id ?? null }, + url, + scroll: target_scroll + }, + willUnload: !intent, + type, + complete + }, + fulfil, + reject + }; +} +/** +* TODO: remove this in 3.0 when the page store is also removed +* +* We need to assign a new page object so that subscribers are correctly notified. +* However, spreading `{ ...page }` returns an empty object so we manually +* assign to each property instead. +* +* @param {import('@sveltejs/kit').Page} page +*/ +function clone_page(page) { + return { + data: page.data, + error: page.error, + form: page.form, + params: page.params, + route: page.route, + state: page.state, + status: page.status, + url: page.url + }; +} +/** +* @param {URL} url +* @returns {string} +*/ +function get_id(url) { + let id; + if (app.hash) { + const [, , second] = url.hash.split("#", 3); + id = second ?? ""; + } else id = url.hash.slice(1); + return decodeURIComponent(id); +} +//#endregion +export { updated as a, page as i, stores as n, navigating as r, goto as t }; diff --git a/website/.svelte-kit/output/server/chunks/dev.js b/website/.svelte-kit/output/server/chunks/dev.js new file mode 100644 index 0000000..f6684f1 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/dev.js @@ -0,0 +1,4301 @@ +import * as devalue from "devalue"; +import { clsx } from "clsx"; +//#region node_modules/svelte/src/internal/shared/errors.js +/** +* Cannot use `%name%(...)` unless the `experimental.async` compiler option is `true` +* @param {string} name +* @returns {never} +*/ +function experimental_async_required(name) { + throw new Error(`https://svelte.dev/e/experimental_async_required`); +} +/** +* `%name%(...)` can only be used during component initialisation +* @param {string} name +* @returns {never} +*/ +function lifecycle_outside_component(name) { + throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); +} +/** +* Context was not set in a parent component +* @returns {never} +*/ +function missing_context() { + throw new Error(`https://svelte.dev/e/missing_context`); +} +//#endregion +//#region node_modules/svelte/src/internal/server/errors.js +/** +* The node API `AsyncLocalStorage` is not available, but is required to use async server rendering. +* @returns {never} +*/ +function async_local_storage_unavailable() { + const error = /* @__PURE__ */ new Error(`async_local_storage_unavailable\nThe node API \`AsyncLocalStorage\` is not available, but is required to use async server rendering.\nhttps://svelte.dev/e/async_local_storage_unavailable`); + error.name = "Svelte error"; + throw error; +} +/** +* Encountered asynchronous work while rendering synchronously. +* @returns {never} +*/ +function await_invalid() { + const error = /* @__PURE__ */ new Error(`await_invalid\nEncountered asynchronous work while rendering synchronously.\nhttps://svelte.dev/e/await_invalid`); + error.name = "Svelte error"; + throw error; +} +/** +* `` is not a valid element name — the element will not be rendered +* @param {string} tag +* @returns {never} +*/ +function dynamic_element_invalid_tag(tag) { + const error = /* @__PURE__ */ new Error(`dynamic_element_invalid_tag\n\`\` is not a valid element name — the element will not be rendered\nhttps://svelte.dev/e/dynamic_element_invalid_tag`); + error.name = "Svelte error"; + throw error; +} +/** +* The `html` property of server render results has been deprecated. Use `body` instead. +* @returns {never} +*/ +function html_deprecated() { + const error = /* @__PURE__ */ new Error(`html_deprecated\nThe \`html\` property of server render results has been deprecated. Use \`body\` instead.\nhttps://svelte.dev/e/html_deprecated`); + error.name = "Svelte error"; + throw error; +} +/** +* Attempted to set `hydratable` with key `%key%` twice with different values. +* +* %stack% +* @param {string} key +* @param {string} stack +* @returns {never} +*/ +function hydratable_clobbering(key, stack) { + const error = /* @__PURE__ */ new Error(`hydratable_clobbering\nAttempted to set \`hydratable\` with key \`${key}\` twice with different values. + +${stack}\nhttps://svelte.dev/e/hydratable_clobbering`); + error.name = "Svelte error"; + throw error; +} +/** +* Failed to serialize `hydratable` data for key `%key%`. +* +* `hydratable` can serialize anything [`uneval` from `devalue`](https://npmjs.com/package/uneval) can, plus Promises. +* +* Cause: +* %stack% +* @param {string} key +* @param {string} stack +* @returns {never} +*/ +function hydratable_serialization_failed(key, stack) { + const error = /* @__PURE__ */ new Error(`hydratable_serialization_failed\nFailed to serialize \`hydratable\` data for key \`${key}\`. + +\`hydratable\` can serialize anything [\`uneval\` from \`devalue\`](https://npmjs.com/package/uneval) can, plus Promises. + +Cause: +${stack}\nhttps://svelte.dev/e/hydratable_serialization_failed`); + error.name = "Svelte error"; + throw error; +} +/** +* `csp.nonce` was set while `csp.hash` was `true`. These options cannot be used simultaneously. +* @returns {never} +*/ +function invalid_csp() { + const error = /* @__PURE__ */ new Error(`invalid_csp\n\`csp.nonce\` was set while \`csp.hash\` was \`true\`. These options cannot be used simultaneously.\nhttps://svelte.dev/e/invalid_csp`); + error.name = "Svelte error"; + throw error; +} +/** +* The `idPrefix` option cannot include `--`. +* @returns {never} +*/ +function invalid_id_prefix() { + const error = /* @__PURE__ */ new Error(`invalid_id_prefix\nThe \`idPrefix\` option cannot include \`--\`.\nhttps://svelte.dev/e/invalid_id_prefix`); + error.name = "Svelte error"; + throw error; +} +/** +* `%name%(...)` is not available on the server +* @param {string} name +* @returns {never} +*/ +function lifecycle_function_unavailable(name) { + const error = /* @__PURE__ */ new Error(`lifecycle_function_unavailable\n\`${name}(...)\` is not available on the server\nhttps://svelte.dev/e/lifecycle_function_unavailable`); + error.name = "Svelte error"; + throw error; +} +/** +* Could not resolve `render` context. +* @returns {never} +*/ +function server_context_required() { + const error = /* @__PURE__ */ new Error(`server_context_required\nCould not resolve \`render\` context.\nhttps://svelte.dev/e/server_context_required`); + error.name = "Svelte error"; + throw error; +} +//#endregion +//#region node_modules/svelte/src/internal/server/context.js +/** @import { SSRContext } from '#server' */ +/** @type {SSRContext | null} */ +var ssr_context = null; +/** @param {SSRContext | null} v */ +function set_ssr_context(v) { + ssr_context = v; +} +/** +* @template T +* @returns {[() => T, (context: T) => T]} +* @since 5.40.0 +*/ +function createContext() { + const key = {}; + return [() => { + if (!hasContext(key)) missing_context(); + return getContext(key); + }, (context) => setContext(key, context)]; +} +/** +* @template T +* @param {any} key +* @returns {T} +*/ +function getContext(key) { + return get_or_init_context_map("getContext").get(key); +} +/** +* @template T +* @param {any} key +* @param {T} context +* @returns {T} +*/ +function setContext(key, context) { + get_or_init_context_map("setContext").set(key, context); + return context; +} +/** +* @param {any} key +* @returns {boolean} +*/ +function hasContext(key) { + return get_or_init_context_map("hasContext").has(key); +} +/** @returns {Map} */ +function getAllContexts() { + return get_or_init_context_map("getAllContexts"); +} +/** +* @param {string} name +* @returns {Map} +*/ +function get_or_init_context_map(name) { + if (ssr_context === null) lifecycle_outside_component(name); + return ssr_context.c ??= new Map(get_parent_context(ssr_context) || void 0); +} +/** +* @param {Function} [fn] +*/ +function push$1(fn) { + ssr_context = { + p: ssr_context, + c: null, + r: null + }; +} +function pop$1() { + ssr_context = ssr_context.p; +} +/** +* @param {SSRContext} ssr_context +* @returns {Map | null} +*/ +function get_parent_context(ssr_context) { + let parent = ssr_context.p; + while (parent !== null) { + const context_map = parent.c; + if (context_map !== null) return context_map; + parent = parent.p; + } + return null; +} +//#endregion +//#region node_modules/svelte/src/internal/shared/utils.js +var is_array = Array.isArray; +var index_of = Array.prototype.indexOf; +var includes = Array.prototype.includes; +var array_from = Array.from; +var object_keys = Object.keys; +var define_property = Object.defineProperty; +var get_descriptor = Object.getOwnPropertyDescriptor; +var object_prototype = Object.prototype; +var array_prototype = Array.prototype; +var get_prototype_of = Object.getPrototypeOf; +var is_extensible = Object.isExtensible; +var has_own_property = Object.prototype.hasOwnProperty; +var noop = () => {}; +/** @param {Function} fn */ +function run(fn) { + return fn(); +} +/** @param {Array<() => void>} arr */ +function run_all(arr) { + for (var i = 0; i < arr.length; i++) arr[i](); +} +/** +* TODO replace with Promise.withResolvers once supported widely enough +* @template [T=void] +*/ +function deferred() { + /** @type {(value: T) => void} */ + var resolve; + /** @type {(reason: any) => void} */ + var reject; + return { + promise: new Promise((res, rej) => { + resolve = res; + reject = rej; + }), + resolve, + reject + }; +} +var CLEAN = 1024; +var DIRTY = 2048; +var MAYBE_DIRTY = 4096; +var INERT = 8192; +var DESTROYED = 16384; +/** Set once a reaction has run for the first time */ +var REACTION_RAN = 32768; +/** Effect is in the process of getting destroyed. Can be observed in child teardown functions */ +var DESTROYING = 1 << 25; +/** +* 'Transparent' effects do not create a transition boundary. +* This is on a block effect 99% of the time but may also be on a branch effect if its parent block effect was pruned +*/ +var EFFECT_TRANSPARENT = 65536; +var EFFECT_PRESERVED = 1 << 19; +var USER_EFFECT = 1 << 20; +/** +* Tells that we marked this derived and its reactions as visited during the "mark as (maybe) dirty"-phase. +* Will be lifted during execution of the derived and during checking its dirty state (both are necessary +* because a derived might be checked but not executed). This is a pure performance optimization flag and +* should not be used for any other purpose! +*/ +var WAS_MARKED = 65536; +var REACTION_IS_UPDATING = 1 << 21; +var ERROR_VALUE = 1 << 23; +var STATE_SYMBOL = Symbol("$state"); +var LEGACY_PROPS = Symbol("legacy props"); +var ATTRIBUTES_CACHE = Symbol("attributes"); +var CLASS_CACHE = Symbol("class"); +var STYLE_CACHE = Symbol("style"); +var TEXT_CACHE = Symbol("text"); +/** allow users to ignore aborted signal errors if `reason.name === 'StaleReactionError` */ +var STALE_REACTION = new class StaleReactionError extends Error { + name = "StaleReactionError"; + message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; +}(); +globalThis.document?.contentType; +//#endregion +//#region node_modules/svelte/src/internal/server/abort-signal.js +/** @type {AbortController | null} */ +var controller = null; +function abort() { + controller?.abort(STALE_REACTION); + controller = null; +} +function getAbortSignal() { + return (controller ??= new AbortController()).signal; +} +//#endregion +//#region node_modules/svelte/src/internal/flags/index.js +/** True if experimental.async=true */ +var async_mode_flag = false; +/** True if we're not certain that we only have Svelte 5 code in the compilation */ +var legacy_mode_flag = false; +//#endregion +//#region node_modules/svelte/src/internal/server/render-context.js +/** @import { AsyncLocalStorage } from 'node:async_hooks' */ +/** @import { RenderContext } from '#server' */ +/** @type {Promise | null} */ +var current_render = null; +/** @type {RenderContext | null} */ +var context = null; +/** @returns {RenderContext} */ +function get_render_context() { + const store = context ?? als?.getStore(); + if (!store) server_context_required(); + return store; +} +/** +* @template T +* @param {() => Promise} fn +* @returns {Promise} +*/ +async function with_render_context(fn) { + context = { hydratable: { + lookup: /* @__PURE__ */ new Map(), + comparisons: [], + unresolved_promises: /* @__PURE__ */ new Map() + } }; + if (in_webcontainer()) { + const { promise, resolve } = deferred(); + const previous_render = current_render; + current_render = promise; + await previous_render; + return fn().finally(resolve); + } + try { + if (als === null) async_local_storage_unavailable(); + return als.run(context, fn); + } finally { + context = null; + } +} +/** @type {AsyncLocalStorage | null} */ +var als = null; +/** @type {Promise | null} */ +var als_import = null; +/** +* +* @returns {Promise} +*/ +function init_render_context() { + als_import ??= import("node:async_hooks").then((hooks) => { + als = new hooks.AsyncLocalStorage(); + }).then(noop, noop); + return als_import; +} +function in_webcontainer() { + return !!globalThis.process?.versions?.webcontainer; +} +//#endregion +//#region node_modules/svelte/src/constants.js +var HYDRATION_ERROR = {}; +var UNINITIALIZED = Symbol("uninitialized"); +var ATTACHMENT_KEY = "@attach"; +/** +* @returns {string[]} +*/ +function get_stack() { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = Infinity; + const stack = (/* @__PURE__ */ new Error()).stack; + Error.stackTraceLimit = limit; + if (!stack) return []; + const lines = stack.split("\n"); + const new_lines = []; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const posixified = line.replaceAll("\\", "/"); + if (line.trim() === "Error") continue; + if (line.includes("validate_each_keys")) return []; + if (posixified.includes("svelte/src/internal") || posixified.includes("node_modules/.vite")) continue; + new_lines.push(line); + } + return new_lines; +} +/** +* A `hydratable` value with key `%key%` was created, but at least part of it was not used during the render. +* +* The `hydratable` was initialized in: +* %stack% +* @param {string} key +* @param {string} stack +*/ +function unresolved_hydratable(key, stack) { + console.warn(`https://svelte.dev/e/unresolved_hydratable`); +} +//#endregion +//#region node_modules/svelte/src/internal/server/hydration.js +var BLOCK_OPEN = ``; +var BLOCK_CLOSE = ``; +var EMPTY_COMMENT = ``; +//#endregion +//#region node_modules/svelte/src/escaping.js +var ATTR_REGEX = /[&"<]/g; +var CONTENT_REGEX = /[&<]/g; +/** +* @template V +* @param {V} value +* @param {boolean} [is_attr] +*/ +function escape_html(value, is_attr) { + const str = String(value ?? ""); + const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX; + pattern.lastIndex = 0; + let escaped = ""; + let last = 0; + while (pattern.test(str)) { + const i = pattern.lastIndex - 1; + const ch = str[i]; + escaped += str.substring(last, i) + (ch === "&" ? "&" : ch === "\"" ? """ : "<"); + last = i + 1; + } + return escaped + str.substring(last); +} +//#endregion +//#region node_modules/svelte/src/internal/shared/attributes.js +/** +* `
      ` should be rendered as `
      ` and _not_ +* `
      `, which is equivalent to `
      `. There +* may be other odd cases that need to be added to this list in future +* @type {Record>} +*/ +var replacements = { translate: new Map([[true, "yes"], [false, "no"]]) }; +/** +* @template V +* @param {string} name +* @param {V} value +* @param {boolean} [is_boolean] +* @returns {string} +*/ +function attr(name, value, is_boolean = false) { + if (name === "hidden" && value !== "until-found") is_boolean = true; + if (value == null || !value && is_boolean) return ""; + const normalized = has_own_property.call(replacements, name) && replacements[name].get(value) || value; + return ` ${name}${is_boolean ? `=""` : `="${escape_html(normalized, true)}"`}`; +} +/** +* Small wrapper around clsx to preserve Svelte's (weird) handling of falsy values. +* TODO Svelte 6 revisit this, and likely turn all falsy values into the empty string (what clsx also does) +* @param {any} value +*/ +function clsx$1(value) { + if (typeof value === "object") return clsx(value); + else return value ?? ""; +} +var whitespace = [..." \n\r\f\xA0\v"]; +/** +* @param {any} value +* @param {string | null} [hash] +* @param {Record} [directives] +* @returns {string | null} +*/ +function to_class(value, hash, directives) { + var classname = value == null ? "" : "" + value; + if (hash) classname = classname ? classname + " " + hash : hash; + if (directives) { + for (var key of Object.keys(directives)) if (directives[key]) classname = classname ? classname + " " + key : key; + else if (classname.length) { + var len = key.length; + var a = 0; + while ((a = classname.indexOf(key, a)) >= 0) { + var b = a + len; + if ((a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b]))) classname = (a === 0 ? "" : classname.substring(0, a)) + classname.substring(b + 1); + else a = b; + } + } + } + return classname === "" ? null : classname; +} +/** +* +* @param {Record} styles +* @param {boolean} important +*/ +function append_styles(styles, important = false) { + var separator = important ? " !important;" : ";"; + var css = ""; + for (var key of Object.keys(styles)) { + var value = styles[key]; + if (value != null && value !== "") css += " " + key + ": " + value + separator; + } + return css; +} +/** +* @param {string} name +* @returns {string} +*/ +function to_css_name(name) { + if (name[0] !== "-" || name[1] !== "-") return name.toLowerCase(); + return name; +} +/** +* @param {any} value +* @param {Record | [Record, Record]} [styles] +* @returns {string | null} +*/ +function to_style(value, styles) { + if (styles) { + var new_style = ""; + /** @type {Record | undefined} */ + var normal_styles; + /** @type {Record | undefined} */ + var important_styles; + if (Array.isArray(styles)) { + normal_styles = styles[0]; + important_styles = styles[1]; + } else normal_styles = styles; + if (value) { + value = String(value).replaceAll(/\s*\/\*.*?\*\/\s*/g, "").trim(); + /** @type {boolean | '"' | "'"} */ + var in_str = false; + var in_apo = 0; + var in_comment = false; + var reserved_names = []; + if (normal_styles) reserved_names.push(...Object.keys(normal_styles).map(to_css_name)); + if (important_styles) reserved_names.push(...Object.keys(important_styles).map(to_css_name)); + var start_index = 0; + var name_index = -1; + const len = value.length; + for (var i = 0; i < len; i++) { + var c = value[i]; + if (in_comment) { + if (c === "/" && value[i - 1] === "*") in_comment = false; + } else if (in_str) { + if (in_str === c) in_str = false; + } else if (c === "/" && value[i + 1] === "*") in_comment = true; + else if (c === "\"" || c === "'") in_str = c; + else if (c === "(") in_apo++; + else if (c === ")") in_apo--; + if (!in_comment && in_str === false && in_apo === 0) { + if (c === ":" && name_index === -1) name_index = i; + else if (c === ";" || i === len - 1) { + if (name_index !== -1) { + var name = to_css_name(value.substring(start_index, name_index).trim()); + if (!reserved_names.includes(name)) { + if (c !== ";") i++; + var property = value.substring(start_index, i).trim(); + new_style += " " + property + ";"; + } + } + start_index = i + 1; + name_index = -1; + } + } + } + } + if (normal_styles) new_style += append_styles(normal_styles); + if (important_styles) new_style += append_styles(important_styles, true); + new_style = new_style.trim(); + return new_style === "" ? null : new_style; + } + return value == null ? null : String(value); +} +/** +* Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state +* @returns {never} +*/ +function effect_update_depth_exceeded() { + throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); +} +/** +* Failed to hydrate the application +* @returns {never} +*/ +function hydration_failed() { + throw new Error(`https://svelte.dev/e/hydration_failed`); +} +/** +* The `%rune%` rune is only available inside `.svelte` and `.svelte.js/ts` files +* @param {string} rune +* @returns {never} +*/ +function rune_outside_svelte(rune) { + throw new Error(`https://svelte.dev/e/rune_outside_svelte`); +} +/** +* Property descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`. +* @returns {never} +*/ +function state_descriptors_fixed() { + throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); +} +/** +* Cannot set prototype of `$state` object +* @returns {never} +*/ +function state_prototype_fixed() { + throw new Error(`https://svelte.dev/e/state_prototype_fixed`); +} +/** +* Updating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state` +* @returns {never} +*/ +function state_unsafe_mutation() { + throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); +} +/** +* A `` `reset` function cannot be called while an error is still being handled +* @returns {never} +*/ +function svelte_boundary_reset_onerror() { + throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); +} +/** +* Reading a derived belonging to a now-destroyed effect may result in stale values +*/ +function derived_inert() { + console.warn(`https://svelte.dev/e/derived_inert`); +} +/** +* Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near %location% +* @param {string | undefined | null} [location] +*/ +function hydration_mismatch(location) { + console.warn(`https://svelte.dev/e/hydration_mismatch`); +} +/** +* Tried to unmount a component that was not mounted +*/ +function lifecycle_double_unmount() { + console.warn(`https://svelte.dev/e/lifecycle_double_unmount`); +} +/** +* Tried to unmount a state proxy, rather than a component +*/ +function state_proxy_unmount() { + console.warn(`https://svelte.dev/e/state_proxy_unmount`); +} +/** +* A `` `reset` function only resets the boundary the first time it is called +*/ +function svelte_boundary_reset_noop() { + console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); +} +//#endregion +//#region node_modules/svelte/src/internal/client/dom/hydration.js +/** @import { TemplateNode } from '#client' */ +/** +* Use this variable to guard everything related to hydration code so it can be treeshaken out +* if the user doesn't use the `hydrate` method and these code paths are therefore not needed. +*/ +var hydrating = false; +/** @param {boolean} value */ +function set_hydrating(value) { + hydrating = value; +} +/** +* The node that is currently being hydrated. This starts out as the first node inside the opening +* comment, and updates each time a component calls `$.child(...)` or `$.sibling(...)`. +* When entering a block (e.g. `{#if ...}`), `hydrate_node` is the block opening comment; by the +* time we leave the block it is the closing comment, which serves as the block's anchor. +* @type {TemplateNode} +*/ +var hydrate_node; +/** @param {TemplateNode | null} node */ +function set_hydrate_node(node) { + if (node === null) { + hydration_mismatch(); + throw HYDRATION_ERROR; + } + return hydrate_node = node; +} +function hydrate_next() { + return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); +} +function next(count = 1) { + if (hydrating) { + var i = count; + var node = hydrate_node; + while (i--) node = /* @__PURE__ */ get_next_sibling(node); + hydrate_node = node; + } +} +/** +* Skips or removes (depending on {@link remove}) all nodes starting at `hydrate_node` up until the next hydration end comment +* @param {boolean} remove +*/ +function skip_nodes(remove = true) { + var depth = 0; + var node = hydrate_node; + while (true) { + if (node.nodeType === 8) { + var data = node.data; + if (data === "]") { + if (depth === 0) return node; + depth -= 1; + } else if (data === "[" || data === "[!" || data[0] === "[" && !isNaN(Number(data.slice(1)))) depth += 1; + } + var next = /* @__PURE__ */ get_next_sibling(node); + if (remove) node.remove(); + node = next; + } +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/equality.js +/** @import { Equals } from '#client' */ +/** @type {Equals} */ +function equals(value) { + return value === this.v; +} +/** +* @param {unknown} a +* @param {unknown} b +* @returns {boolean} +*/ +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; +} +/** @type {Equals} */ +function safe_equals(value) { + return !safe_not_equal(value, this.v); +} +//#endregion +//#region node_modules/svelte/src/internal/client/context.js +/** @import { ComponentContext, DevStackEntry, Effect } from '#client' */ +/** @type {ComponentContext | null} */ +var component_context = null; +/** @param {ComponentContext | null} context */ +function set_component_context(context) { + component_context = context; +} +/** +* @param {Record} props +* @param {any} runes +* @param {Function} [fn] +* @returns {void} +*/ +function push(props, runes = false, fn) { + component_context = { + p: component_context, + i: false, + c: null, + e: null, + s: props, + x: null, + r: active_effect, + l: legacy_mode_flag && !runes ? { + s: null, + u: null, + $: [] + } : null + }; +} +/** +* @template {Record} T +* @param {T} [component] +* @returns {T} +*/ +function pop(component) { + var context = component_context; + var effects = context.e; + if (effects !== null) { + context.e = null; + for (var fn of effects) create_user_effect(fn); + } + if (component !== void 0) context.x = component; + context.i = true; + component_context = context.p; + return component ?? {}; +} +/** @returns {boolean} */ +function is_runes() { + return !legacy_mode_flag || component_context !== null && component_context.l === null; +} +//#endregion +//#region node_modules/svelte/src/internal/client/dom/task.js +/** @type {Array<() => void>} */ +var micro_tasks = []; +function run_micro_tasks() { + var tasks = micro_tasks; + micro_tasks = []; + run_all(tasks); +} +/** +* @param {() => void} fn +*/ +function queue_micro_task(fn) { + if (micro_tasks.length === 0 && !is_flushing_sync) { + var tasks = micro_tasks; + queueMicrotask(() => { + if (tasks === micro_tasks) run_micro_tasks(); + }); + } + micro_tasks.push(fn); +} +/** +* Synchronously run any queued tasks. +*/ +function flush_tasks() { + while (micro_tasks.length > 0) run_micro_tasks(); +} +/** +* @param {unknown} error +*/ +function handle_error(error) { + var effect = active_effect; + if (effect === null) { + /** @type {Derived} */ active_reaction.f |= ERROR_VALUE; + return error; + } + if ((effect.f & 32768) === 0 && (effect.f & 4) === 0) throw error; + invoke_error_boundary(error, effect); +} +/** +* @param {unknown} error +* @param {Effect | null} effect +*/ +function invoke_error_boundary(error, effect) { + while (effect !== null) { + if ((effect.f & 128) !== 0) { + if ((effect.f & 32768) === 0) throw error; + try { + /** @type {Boundary} */ effect.b.error(error); + return; + } catch (e) { + error = e; + } + } + effect = effect.parent; + } + throw error; +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/status.js +/** @import { Derived, Signal } from '#client' */ +var STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN); +/** +* @param {Signal} signal +* @param {number} status +*/ +function set_signal_status(signal, status) { + signal.f = signal.f & STATUS_MASK | status; +} +/** +* Set a derived's status to CLEAN or MAYBE_DIRTY based on its connection state. +* @param {Derived} derived +*/ +function update_derived_status(derived) { + if ((derived.f & 512) !== 0 || derived.deps === null) set_signal_status(derived, CLEAN); + else set_signal_status(derived, MAYBE_DIRTY); +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/utils.js +/** @import { Derived, Effect, Value } from '#client' */ +/** +* @param {Value[] | null} deps +*/ +function clear_marked(deps) { + if (deps === null) return; + for (const dep of deps) { + if ((dep.f & 2) === 0 || (dep.f & 65536) === 0) continue; + dep.f ^= WAS_MARKED; + clear_marked( + /** @type {Derived} */ + dep.deps + ); + } +} +/** +* @param {Effect} effect +* @param {Set} dirty_effects +* @param {Set} maybe_dirty_effects +*/ +function defer_effect(effect, dirty_effects, maybe_dirty_effects) { + if ((effect.f & 2048) !== 0) dirty_effects.add(effect); + else if ((effect.f & 4096) !== 0) maybe_dirty_effects.add(effect); + clear_marked(effect.deps); + set_signal_status(effect, CLEAN); +} +//#endregion +//#region node_modules/svelte/src/store/shared/index.js +/** @import { Readable, StartStopNotifier, Subscriber, Unsubscriber, Updater, Writable } from '../public.js' */ +/** @import { Stores, StoresValues, SubscribeInvalidateTuple } from '../private.js' */ +/** +* @type {Array | any>} +*/ +var subscriber_queue = []; +/** +* Creates a `Readable` store that allows reading by subscription. +* +* @template T +* @param {T} [value] initial value +* @param {StartStopNotifier} [start] +* @returns {Readable} +*/ +function readable(value, start) { + return { subscribe: writable(value, start).subscribe }; +} +/** +* Create a `Writable` store that allows both updating and reading by subscription. +* +* @template T +* @param {T} [value] initial value +* @param {StartStopNotifier} [start] +* @returns {Writable} +*/ +function writable(value, start = noop) { + /** @type {Unsubscriber | null} */ + let stop = null; + /** @type {Set>} */ + const subscribers = /* @__PURE__ */ new Set(); + /** + * @param {T} new_value + * @returns {void} + */ + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push(subscriber, value); + } + if (run_queue) { + for (let i = 0; i < subscriber_queue.length; i += 2) subscriber_queue[i][0](subscriber_queue[i + 1]); + subscriber_queue.length = 0; + } + } + } + } + /** + * @param {Updater} fn + * @returns {void} + */ + function update(fn) { + set(fn(value)); + } + /** + * @param {Subscriber} run + * @param {() => void} [invalidate] + * @returns {Unsubscriber} + */ + function subscribe(run, invalidate = noop) { + /** @type {SubscribeInvalidateTuple} */ + const subscriber = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) stop = start(set, update) || noop; + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + } + return { + set, + update, + subscribe + }; +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/store.js +/** +* We set this to `true` when updating a store so that we correctly +* schedule effects if the update takes place inside a `$:` effect +*/ +var legacy_is_updating_store = false; +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/batch.js +/** @import { Fork } from 'svelte' */ +/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */ +/** @type {Batch | null} */ +var first_batch = null; +/** @type {Batch | null} */ +var last_batch = null; +/** @type {Batch | null} */ +var current_batch = null; +/** +* This is needed to avoid overwriting inputs +* @type {Batch | null} +*/ +var previous_batch = null; +/** +* When time travelling (i.e. working in one batch, while other batches +* still have ongoing work), we ignore the real values of affected +* signals in favour of their values within the batch +* @type {Map | null} +*/ +var batch_values = null; +/** @type {Effect | null} */ +var last_scheduled_effect = null; +var is_flushing_sync = false; +var is_processing = false; +/** +* During traversal, this is an array. Newly created effects are (if not immediately +* executed) pushed to this array, rather than going through the scheduling +* rigamarole that would cause another turn of the flush loop. +* @type {Effect[] | null} +*/ +var collected_effects = null; +/** +* An array of effects that are marked during traversal as a result of a `set` +* (not `internal_set`) call. These will be added to the next batch and +* trigger another `batch.process()` +* @type {Effect[] | null} +* @deprecated when we get rid of legacy mode and stores, we can get rid of this +*/ +var legacy_updates = null; +var flush_count = 0; +var uid = 1; +var Batch = class Batch { + id = uid++; + /** True as soon as `#process` was called */ + #started = false; + linked = true; + /** @type {Batch | null} */ + #prev = null; + /** @type {Batch | null} */ + #next = null; + /** @type {Map>>} */ + async_deriveds = /* @__PURE__ */ new Map(); + /** + * The current values of any signals that are updated in this batch. + * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) + * They keys of this map are identical to `this.#previous` + * @type {Map} + */ + current = /* @__PURE__ */ new Map(); + /** + * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. + * They keys of this map are identical to `this.#current` + * @type {Map} + */ + previous = /* @__PURE__ */ new Map(); + /** + * When the batch is committed (and the DOM is updated), we need to remove old branches + * and append new ones by calling the functions added inside (if/each/key/etc) blocks + * @type {Set<(batch: Batch) => void>} + */ + #commit_callbacks = /* @__PURE__ */ new Set(); + /** + * If a fork is discarded, we need to destroy any effects that are no longer needed + * @type {Set<(batch: Batch) => void>} + */ + #discard_callbacks = /* @__PURE__ */ new Set(); + /** + * The number of async effects that are currently in flight + */ + #pending = 0; + /** + * Async effects that are currently in flight, _not_ inside a pending boundary + * @type {Map} + */ + #blocking_pending = /* @__PURE__ */ new Map(); + /** + * A deferred that resolves when the batch is committed, used with `settled()` + * TODO replace with Promise.withResolvers once supported widely enough + * @type {{ promise: Promise, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} + */ + #deferred = null; + /** + * The root effects that need to be flushed + * @type {Effect[]} + */ + #roots = []; + /** + * Effects created while this batch was active. + * @type {Effect[]} + */ + #new_effects = []; + /** + * Deferred effects (which run after async work has completed) that are DIRTY + * @type {Set} + */ + #dirty_effects = /* @__PURE__ */ new Set(); + /** + * Deferred effects that are MAYBE_DIRTY + * @type {Set} + */ + #maybe_dirty_effects = /* @__PURE__ */ new Set(); + /** + * A map of branches that still exist, but will be destroyed when this batch + * is committed — we skip over these during `process`. + * The value contains child effects that were dirty/maybe_dirty before being reset, + * so they can be rescheduled if the branch survives. + * @type {Map} + */ + #skipped_branches = /* @__PURE__ */ new Map(); + /** + * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing + * @type {Set} + */ + #unskipped_branches = /* @__PURE__ */ new Set(); + is_fork = false; + #decrement_queued = false; + constructor() { + if (last_batch === null) first_batch = last_batch = this; + else { + last_batch.#next = this; + this.#prev = last_batch; + } + last_batch = this; + } + #is_deferred() { + if (this.is_fork) return true; + for (const effect of this.#blocking_pending.keys()) { + var e = effect; + var skipped = false; + while (e.parent !== null) { + if (this.#skipped_branches.has(e)) { + skipped = true; + break; + } + e = e.parent; + } + if (!skipped) return true; + } + return false; + } + /** + * Add an effect to the #skipped_branches map and reset its children + * @param {Effect} effect + */ + skip_effect(effect) { + if (!this.#skipped_branches.has(effect)) this.#skipped_branches.set(effect, { + d: [], + m: [] + }); + this.#unskipped_branches.delete(effect); + } + /** + * Remove an effect from the #skipped_branches map and reschedule + * any tracked dirty/maybe_dirty child effects + * @param {Effect} effect + * @param {(e: Effect) => void} callback + */ + unskip_effect(effect, callback = (e) => this.schedule(e)) { + var tracked = this.#skipped_branches.get(effect); + if (tracked) { + this.#skipped_branches.delete(effect); + for (var e of tracked.d) { + set_signal_status(e, DIRTY); + callback(e); + } + for (e of tracked.m) { + set_signal_status(e, MAYBE_DIRTY); + callback(e); + } + } + this.#unskipped_branches.add(effect); + } + #process() { + this.#started = true; + if (flush_count++ > 1e3) { + this.#unlink(); + infinite_loop_guard(); + } + for (const e of this.#dirty_effects) { + this.#maybe_dirty_effects.delete(e); + set_signal_status(e, DIRTY); + this.schedule(e); + } + for (const e of this.#maybe_dirty_effects) { + set_signal_status(e, MAYBE_DIRTY); + this.schedule(e); + } + const roots = this.#roots; + this.#roots = []; + this.apply(); + /** @type {Effect[]} */ + var effects = collected_effects = []; + /** @type {Effect[]} */ + var render_effects = []; + /** + * @type {Effect[]} + * @deprecated when we get rid of legacy mode and stores, we can get rid of this + */ + var updates = legacy_updates = []; + for (const root of roots) try { + this.#traverse(root, effects, render_effects); + } catch (e) { + reset_all(root); + if (!this.#is_deferred()) this.discard(); + throw e; + } + current_batch = null; + if (updates.length > 0) { + var batch = Batch.ensure(); + for (const e of updates) batch.schedule(e); + } + collected_effects = null; + legacy_updates = null; + if (this.#is_deferred()) { + this.#defer_effects(render_effects); + this.#defer_effects(effects); + for (const [e, t] of this.#skipped_branches) reset_branch(e, t); + if (updates.length > 0) + /** @type {Batch} */ current_batch.#process(); + return; + } + const earlier_batch = this.#find_earlier_batch(); + if (earlier_batch) { + this.#defer_effects(render_effects); + this.#defer_effects(effects); + earlier_batch.#merge(this); + return; + } + this.#dirty_effects.clear(); + this.#maybe_dirty_effects.clear(); + for (const fn of this.#commit_callbacks) fn(this); + this.#commit_callbacks.clear(); + previous_batch = this; + flush_queued_effects(render_effects); + flush_queued_effects(effects); + previous_batch = null; + this.#deferred?.resolve(); + var next_batch = current_batch; + if (this.#pending === 0 && (this.#roots.length === 0 || next_batch !== null)) { + this.#unlink(); + if (async_mode_flag) { + this.#commit(); + current_batch = next_batch; + } + } + if (this.#roots.length > 0) if (next_batch !== null) { + const batch = next_batch; + batch.#roots.push(...this.#roots.filter((r) => !batch.#roots.includes(r))); + } else next_batch = this; + if (next_batch !== null) next_batch.#process(); + } + /** + * Traverse the effect tree, executing effects or stashing + * them for later execution as appropriate + * @param {Effect} root + * @param {Effect[]} effects + * @param {Effect[]} render_effects + */ + #traverse(root, effects, render_effects) { + root.f ^= CLEAN; + var effect = root.first; + while (effect !== null) { + var flags = effect.f; + var is_branch = (flags & 96) !== 0; + if (!(is_branch && (flags & 1024) !== 0 || (flags & 8192) !== 0 || this.#skipped_branches.has(effect)) && effect.fn !== null) { + if (is_branch) effect.f ^= CLEAN; + else if ((flags & 4) !== 0) effects.push(effect); + else if (async_mode_flag && (flags & 16777224) !== 0) render_effects.push(effect); + else if (is_dirty(effect)) { + if ((flags & 16) !== 0) this.#maybe_dirty_effects.add(effect); + update_effect(effect); + } + var child = effect.first; + if (child !== null) { + effect = child; + continue; + } + } + while (effect !== null) { + var next = effect.next; + if (next !== null) { + effect = next; + break; + } + effect = effect.parent; + } + } + } + #find_earlier_batch() { + var batch = this.#prev; + while (batch !== null) { + if (!batch.is_fork) { + for (const [value, [, is_derived]] of this.current) if (batch.current.has(value) && !is_derived) return batch; + } + batch = batch.#prev; + } + return null; + } + /** + * @param {Batch} batch + */ + #merge(batch) { + for (const [source, value] of batch.current) { + if (!this.previous.has(source) && batch.previous.has(source)) this.previous.set(source, batch.previous.get(source)); + this.current.set(source, value); + } + for (const [effect, deferred] of batch.async_deriveds) { + const d = this.async_deriveds.get(effect); + if (d) deferred.promise.then(d.resolve).catch(d.reject); + } + this.transfer_effects(batch.#dirty_effects, batch.#maybe_dirty_effects); + /** + * mark all effects that depend on `batch.current`, except the + * async effects that we just resolved (TODO unless they depend + * on values in this batch that are NOT in the later batch?). + * Through this we also will populate the correct #skipped_branches, + * oncommit callbacks etc, so we don't need to merge them separately. + * @param {Value} value + */ + const mark = (value) => { + var reactions = value.reactions; + if (reactions === null) return; + for (const reaction of reactions) { + var flags = reaction.f; + if ((flags & 2) !== 0) mark(reaction); + else { + var effect = reaction; + if (flags & 4194320 && !this.async_deriveds.has(effect)) { + this.#maybe_dirty_effects.delete(effect); + set_signal_status(effect, DIRTY); + this.schedule(effect); + } + } + } + }; + for (const source of this.current.keys()) mark(source); + this.oncommit(() => batch.discard()); + batch.#unlink(); + current_batch = this; + this.#process(); + } + /** + * @param {Effect[]} effects + */ + #defer_effects(effects) { + for (var i = 0; i < effects.length; i += 1) defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); + } + /** + * Associate a change to a given source with the current + * batch, noting its previous and current values + * @param {Value} source + * @param {any} value + * @param {boolean} [is_derived] + */ + capture(source, value, is_derived = false) { + if (source.v !== UNINITIALIZED && !this.previous.has(source)) this.previous.set(source, source.v); + if ((source.f & 8388608) === 0) { + this.current.set(source, [value, is_derived]); + batch_values?.set(source, value); + } + if (!this.is_fork) source.v = value; + } + activate() { + current_batch = this; + } + deactivate() { + current_batch = null; + batch_values = null; + } + flush() { + try { + is_processing = true; + current_batch = this; + this.#process(); + } finally { + flush_count = 0; + last_scheduled_effect = null; + collected_effects = null; + legacy_updates = null; + is_processing = false; + current_batch = null; + batch_values = null; + old_values.clear(); + } + } + discard() { + for (const fn of this.#discard_callbacks) fn(this); + this.#discard_callbacks.clear(); + this.#unlink(); + this.#deferred?.resolve(); + } + /** + * @param {Effect} effect + */ + register_created_effect(effect) { + this.#new_effects.push(effect); + } + #commit() { + for (let batch = first_batch; batch !== null; batch = batch.#next) { + var is_earlier = batch.id < this.id; + /** @type {Source[]} */ + var sources = []; + for (const [source, [value, is_derived]] of this.current) { + if (batch.current.has(source)) { + var batch_value = batch.current.get(source)[0]; + if (is_earlier && value !== batch_value) batch.current.set(source, [value, is_derived]); + else continue; + } + sources.push(source); + } + if (is_earlier) for (const [effect, deferred] of this.async_deriveds) { + const d = batch.async_deriveds.get(effect); + if (d) deferred.promise.then(d.resolve).catch(d.reject); + } + if (!batch.#started) continue; + var others = [...batch.current.keys()].filter((s) => !batch.current.get(s)[1] && !this.current.has(s)); + if (others.length === 0) { + if (is_earlier) batch.discard(); + } else if (sources.length > 0) { + if (is_earlier) for (const unskipped of this.#unskipped_branches) batch.unskip_effect(unskipped, (e) => { + if ((e.f & 4194320) !== 0) batch.schedule(e); + else batch.#defer_effects([e]); + }); + batch.activate(); + /** @type {Set} */ + var marked = /* @__PURE__ */ new Set(); + /** @type {Map} */ + var checked = /* @__PURE__ */ new Map(); + for (var source of sources) mark_effects(source, others, marked, checked); + checked = /* @__PURE__ */ new Map(); + var current_unequal = [...batch.current].filter(([c, v1]) => { + const v2 = this.current.get(c); + if (!v2) return true; + return v2[0] !== v1[0] || v2[1] !== v1[1]; + }).map(([c]) => c); + if (current_unequal.length > 0) { + for (const effect of this.#new_effects) if ((effect.f & 155648) === 0 && depends_on(effect, current_unequal, checked)) if ((effect.f & 4194320) !== 0) { + set_signal_status(effect, DIRTY); + batch.schedule(effect); + } else batch.#dirty_effects.add(effect); + } + if (batch.#roots.length > 0 && !batch.#decrement_queued) { + batch.apply(); + for (var root of batch.#roots) batch.#traverse(root, [], []); + batch.#roots = []; + } + batch.deactivate(); + } + } + } + /** + * @param {boolean} blocking + * @param {Effect} effect + */ + increment(blocking, effect) { + this.#pending += 1; + if (blocking) { + let blocking_pending_count = this.#blocking_pending.get(effect) ?? 0; + this.#blocking_pending.set(effect, blocking_pending_count + 1); + } + } + /** + * @param {boolean} blocking + * @param {Effect} effect + */ + decrement(blocking, effect) { + this.#pending -= 1; + if (blocking) { + let blocking_pending_count = this.#blocking_pending.get(effect) ?? 0; + if (blocking_pending_count === 1) this.#blocking_pending.delete(effect); + else this.#blocking_pending.set(effect, blocking_pending_count - 1); + } + if (this.#decrement_queued) return; + this.#decrement_queued = true; + queue_micro_task(() => { + this.#decrement_queued = false; + if (this.linked) this.flush(); + }); + } + /** + * @param {Set} dirty_effects + * @param {Set} maybe_dirty_effects + */ + transfer_effects(dirty_effects, maybe_dirty_effects) { + for (const e of dirty_effects) this.#dirty_effects.add(e); + for (const e of maybe_dirty_effects) this.#maybe_dirty_effects.add(e); + dirty_effects.clear(); + maybe_dirty_effects.clear(); + } + /** @param {(batch: Batch) => void} fn */ + oncommit(fn) { + this.#commit_callbacks.add(fn); + } + /** @param {(batch: Batch) => void} fn */ + ondiscard(fn) { + this.#discard_callbacks.add(fn); + } + settled() { + return (this.#deferred ??= deferred()).promise; + } + static ensure() { + if (current_batch === null) { + const batch = current_batch = new Batch(); + if (!is_processing && !is_flushing_sync) queue_micro_task(() => { + if (!batch.#started) batch.flush(); + }); + } + return current_batch; + } + apply() { + if (!async_mode_flag || !this.is_fork && this.#prev === null && this.#next === null) { + batch_values = null; + return; + } + batch_values = /* @__PURE__ */ new Map(); + for (const [source, [value]] of this.current) batch_values.set(source, value); + for (let batch = first_batch; batch !== null; batch = batch.#next) { + if (batch === this || batch.is_fork) continue; + var intersects = false; + if (batch.id < this.id) for (const [source, [, is_derived]] of batch.current) { + if (is_derived) continue; + if (this.current.has(source)) { + intersects = true; + break; + } + } + if (!intersects) { + for (const [source, previous] of batch.previous) if (!batch_values.has(source)) batch_values.set(source, previous); + } + } + } + /** + * + * @param {Effect} effect + */ + schedule(effect) { + last_scheduled_effect = effect; + if (effect.b?.is_pending && (effect.f & 16777228) !== 0 && (effect.f & 32768) === 0) { + effect.b.defer_effect(effect); + return; + } + var e = effect; + while (e.parent !== null) { + e = e.parent; + var flags = e.f; + if (collected_effects !== null && e === active_effect) { + if (async_mode_flag) return; + if ((active_reaction === null || (active_reaction.f & 2) === 0) && !legacy_is_updating_store) return; + } + if ((flags & 96) !== 0) { + if ((flags & 1024) === 0) return; + e.f ^= CLEAN; + } + } + this.#roots.push(e); + } + #unlink() { + if (!this.linked) return; + var prev = this.#prev; + var next = this.#next; + if (prev === null) first_batch = next; + else prev.#next = next; + if (next === null) last_batch = prev; + else next.#prev = prev; + this.linked = false; + } +}; +/** +* Synchronously flush any pending updates. +* Returns void if no callback is provided, otherwise returns the result of calling the callback. +* @template [T=void] +* @param {(() => T) | undefined} [fn] +* @returns {T} +*/ +function flushSync(fn) { + var was_flushing_sync = is_flushing_sync; + is_flushing_sync = true; + try { + var result; + if (fn) { + if (current_batch !== null && !current_batch.is_fork) current_batch.flush(); + result = fn(); + } + while (true) { + flush_tasks(); + if (current_batch === null) return result; + current_batch.flush(); + } + } finally { + is_flushing_sync = was_flushing_sync; + } +} +function infinite_loop_guard() { + try { + effect_update_depth_exceeded(); + } catch (error) { + invoke_error_boundary(error, last_scheduled_effect); + } +} +/** @type {Set | null} */ +var eager_block_effects = null; +/** +* @param {Array} effects +* @returns {void} +*/ +function flush_queued_effects(effects) { + var length = effects.length; + if (length === 0) return; + var i = 0; + while (i < length) { + var effect = effects[i++]; + if ((effect.f & 24576) === 0 && is_dirty(effect)) { + eager_block_effects = /* @__PURE__ */ new Set(); + update_effect(effect); + if (effect.deps === null && effect.first === null && effect.nodes === null && effect.teardown === null && effect.ac === null) unlink_effect(effect); + if (eager_block_effects?.size > 0) { + old_values.clear(); + for (const e of eager_block_effects) { + if ((e.f & 24576) !== 0) continue; + /** @type {Effect[]} */ + const ordered_effects = [e]; + let ancestor = e.parent; + while (ancestor !== null) { + if (eager_block_effects.has(ancestor)) { + eager_block_effects.delete(ancestor); + ordered_effects.push(ancestor); + } + ancestor = ancestor.parent; + } + for (let j = ordered_effects.length - 1; j >= 0; j--) { + const e = ordered_effects[j]; + if ((e.f & 24576) !== 0) continue; + update_effect(e); + } + } + eager_block_effects.clear(); + } + } + } + eager_block_effects = null; +} +/** +* This is similar to `mark_reactions`, but it only marks async/block effects +* depending on `value` and at least one of the other `sources`, so that +* these effects can re-run after another batch has been committed +* @param {Value} value +* @param {Source[]} sources +* @param {Set} marked +* @param {Map} checked +*/ +function mark_effects(value, sources, marked, checked) { + if (marked.has(value)) return; + marked.add(value); + if (value.reactions !== null) for (const reaction of value.reactions) { + const flags = reaction.f; + if ((flags & 2) !== 0) mark_effects(reaction, sources, marked, checked); + else if ((flags & 4194320) !== 0 && (flags & 2048) === 0 && depends_on(reaction, sources, checked)) { + set_signal_status(reaction, DIRTY); + schedule_effect(reaction); + } + } +} +/** +* @param {Reaction} reaction +* @param {Source[]} sources +* @param {Map} checked +*/ +function depends_on(reaction, sources, checked) { + const depends = checked.get(reaction); + if (depends !== void 0) return depends; + if (reaction.deps !== null) for (const dep of reaction.deps) { + if (includes.call(sources, dep)) return true; + if ((dep.f & 2) !== 0 && depends_on(dep, sources, checked)) { + checked.set(dep, true); + return true; + } + } + checked.set(reaction, false); + return false; +} +/** +* @param {Effect} effect +* @returns {void} +*/ +function schedule_effect(effect) { + /** @type {Batch} */ current_batch.schedule(effect); +} +/** +* Mark all the effects inside a skipped branch CLEAN, so that +* they can be correctly rescheduled later. Tracks dirty and maybe_dirty +* effects so they can be rescheduled if the branch survives. +* @param {Effect} effect +* @param {{ d: Effect[], m: Effect[] }} tracked +*/ +function reset_branch(effect, tracked) { + if ((effect.f & 32) !== 0 && (effect.f & 1024) !== 0) return; + if ((effect.f & 2048) !== 0) tracked.d.push(effect); + else if ((effect.f & 4096) !== 0) tracked.m.push(effect); + set_signal_status(effect, CLEAN); + var e = effect.first; + while (e !== null) { + reset_branch(e, tracked); + e = e.next; + } +} +/** +* Mark an entire effect tree clean following an error +* @param {Effect} effect +*/ +function reset_all(effect) { + set_signal_status(effect, CLEAN); + var e = effect.first; + while (e !== null) { + reset_all(e); + e = e.next; + } +} +//#endregion +//#region node_modules/svelte/src/reactivity/create-subscriber.js +/** +* Returns a `subscribe` function that integrates external event-based systems with Svelte's reactivity. +* It's particularly useful for integrating with web APIs like `MediaQuery`, `IntersectionObserver`, or `WebSocket`. +* +* If `subscribe` is called inside an effect (including indirectly, for example inside a getter), +* the `start` callback will be called with an `update` function. Whenever `update` is called, the effect re-runs. +* +* If `start` returns a cleanup function, it will be called when the effect is destroyed. +* +* If `subscribe` is called in multiple effects, `start` will only be called once as long as the effects +* are active, and the returned teardown function will only be called when all effects are destroyed. +* +* It's best understood with an example. Here's an implementation of [`MediaQuery`](https://svelte.dev/docs/svelte/svelte-reactivity#MediaQuery): +* +* ```js +* import { createSubscriber } from 'svelte/reactivity'; +* import { on } from 'svelte/events'; +* +* export class MediaQuery { +* #query; +* #subscribe; +* +* constructor(query) { +* this.#query = window.matchMedia(`(${query})`); +* +* this.#subscribe = createSubscriber((update) => { +* // when the `change` event occurs, re-run any effects that read `this.current` +* const off = on(this.#query, 'change', update); +* +* // stop listening when all the effects are destroyed +* return () => off(); +* }); +* } +* +* get current() { +* // This makes the getter reactive, if read in an effect +* this.#subscribe(); +* +* // Return the current state of the query, whether or not we're in an effect +* return this.#query.matches; +* } +* } +* ``` +* @param {(update: () => void) => (() => void) | void} start +* @since 5.7.0 +*/ +function createSubscriber(start) { + let subscribers = 0; + let version = source(0); + /** @type {(() => void) | void} */ + let stop; + return () => { + if (effect_tracking()) { + get(version); + render_effect(() => { + if (subscribers === 0) stop = untrack(() => start(() => increment(version))); + subscribers += 1; + return () => { + queue_micro_task(() => { + subscribers -= 1; + if (subscribers === 0) { + stop?.(); + stop = void 0; + increment(version); + } + }); + }; + }); + } + }; +} +//#endregion +//#region node_modules/svelte/src/internal/client/dom/blocks/boundary.js +/** @import { Effect, Source, TemplateNode, } from '#client' */ +/** +* @typedef {{ +* onerror?: ((error: unknown, reset: () => void) => void) | null; +* failed?: ((anchor: Node, error: () => unknown, reset: () => () => void) => void) | null; +* pending?: ((anchor: Node) => void) | null; +* }} BoundaryProps +*/ +var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; +/** +* @param {TemplateNode} node +* @param {BoundaryProps} props +* @param {((anchor: Node) => void)} children +* @param {((error: unknown) => unknown) | undefined} [transform_error] +* @returns {void} +*/ +function boundary(node, props, children, transform_error) { + new Boundary(node, props, children, transform_error); +} +var Boundary = class { + /** @type {Boundary | null} */ + parent; + is_pending = false; + /** + * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. + * Inherited from parent boundary, or defaults to identity. + * @type {(error: unknown) => unknown} + */ + transform_error; + /** @type {TemplateNode} */ + #anchor; + /** @type {TemplateNode | null} */ + #hydrate_open = hydrating ? hydrate_node : null; + /** @type {BoundaryProps} */ + #props; + /** @type {((anchor: Node) => void)} */ + #children; + /** @type {Effect} */ + #effect; + /** @type {Effect | null} */ + #main_effect = null; + /** @type {Effect | null} */ + #pending_effect = null; + /** @type {Effect | null} */ + #failed_effect = null; + /** @type {DocumentFragment | null} */ + #offscreen_fragment = null; + #local_pending_count = 0; + #pending_count = 0; + #pending_count_update_queued = false; + /** @type {Set} */ + #dirty_effects = /* @__PURE__ */ new Set(); + /** @type {Set} */ + #maybe_dirty_effects = /* @__PURE__ */ new Set(); + /** + * A source containing the number of pending async deriveds/expressions. + * Only created if `$effect.pending()` is used inside the boundary, + * otherwise updating the source results in needless `Batch.ensure()` + * calls followed by no-op flushes + * @type {Source | null} + */ + #effect_pending = null; + #effect_pending_subscriber = createSubscriber(() => { + this.#effect_pending = source(this.#local_pending_count); + return () => { + this.#effect_pending = null; + }; + }); + /** + * @param {TemplateNode} node + * @param {BoundaryProps} props + * @param {((anchor: Node) => void)} children + * @param {((error: unknown) => unknown) | undefined} [transform_error] + */ + constructor(node, props, children, transform_error) { + this.#anchor = node; + this.#props = props; + this.#children = (anchor) => { + var effect = active_effect; + effect.b = this; + effect.f |= 128; + children(anchor); + }; + this.parent = active_effect.b; + this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); + this.#effect = block(() => { + if (hydrating) { + const comment = this.#hydrate_open; + hydrate_next(); + const server_rendered_pending = comment.data === "[!"; + if (comment.data.startsWith("[?")) { + const serialized_error = JSON.parse(comment.data.slice(2)); + this.#hydrate_failed_content(serialized_error); + } else if (server_rendered_pending) this.#hydrate_pending_content(); + else this.#hydrate_resolved_content(); + } else this.#render(); + }, flags); + if (hydrating) this.#anchor = hydrate_node; + } + #hydrate_resolved_content() { + try { + this.#main_effect = branch(() => this.#children(this.#anchor)); + } catch (error) { + this.error(error); + } + } + /** + * @param {unknown} error The deserialized error from the server's hydration comment + */ + #hydrate_failed_content(error) { + const failed = this.#props.failed; + if (!failed) return; + this.#failed_effect = branch(() => { + failed(this.#anchor, () => error, () => () => {}); + }); + } + #hydrate_pending_content() { + const pending = this.#props.pending; + if (!pending) return; + this.is_pending = true; + this.#pending_effect = branch(() => pending(this.#anchor)); + queue_micro_task(() => { + var fragment = this.#offscreen_fragment = document.createDocumentFragment(); + var anchor = create_text(); + fragment.append(anchor); + this.#main_effect = this.#run(() => { + return branch(() => this.#children(anchor)); + }); + if (this.#pending_count === 0) { + this.#anchor.before(fragment); + this.#offscreen_fragment = null; + pause_effect(this.#pending_effect, () => { + this.#pending_effect = null; + }); + this.#resolve(current_batch); + } + }); + } + #render() { + try { + this.is_pending = this.has_pending_snippet(); + this.#pending_count = 0; + this.#local_pending_count = 0; + this.#main_effect = branch(() => { + this.#children(this.#anchor); + }); + if (this.#pending_count > 0) { + var fragment = this.#offscreen_fragment = document.createDocumentFragment(); + move_effect(this.#main_effect, fragment); + const pending = this.#props.pending; + this.#pending_effect = branch(() => pending(this.#anchor)); + } else this.#resolve(current_batch); + } catch (error) { + this.error(error); + } + } + /** + * @param {Batch} batch + */ + #resolve(batch) { + this.is_pending = false; + batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); + } + /** + * Defer an effect inside a pending boundary until the boundary resolves + * @param {Effect} effect + */ + defer_effect(effect) { + defer_effect(effect, this.#dirty_effects, this.#maybe_dirty_effects); + } + /** + * Returns `false` if the effect exists inside a boundary whose pending snippet is shown + * @returns {boolean} + */ + is_rendered() { + return !this.is_pending && (!this.parent || this.parent.is_rendered()); + } + has_pending_snippet() { + return !!this.#props.pending; + } + /** + * @template T + * @param {() => T} fn + */ + #run(fn) { + var previous_effect = active_effect; + var previous_reaction = active_reaction; + var previous_ctx = component_context; + set_active_effect(this.#effect); + set_active_reaction(this.#effect); + set_component_context(this.#effect.ctx); + try { + Batch.ensure(); + return fn(); + } catch (e) { + handle_error(e); + return null; + } finally { + set_active_effect(previous_effect); + set_active_reaction(previous_reaction); + set_component_context(previous_ctx); + } + } + /** + * Updates the pending count associated with the currently visible pending snippet, + * if any, such that we can replace the snippet with content once work is done + * @param {1 | -1} d + * @param {Batch} batch + */ + #update_pending_count(d, batch) { + if (!this.has_pending_snippet()) { + if (this.parent) this.parent.#update_pending_count(d, batch); + return; + } + this.#pending_count += d; + if (this.#pending_count === 0) { + this.#resolve(batch); + if (this.#pending_effect) pause_effect(this.#pending_effect, () => { + this.#pending_effect = null; + }); + if (this.#offscreen_fragment) { + this.#anchor.before(this.#offscreen_fragment); + this.#offscreen_fragment = null; + } + } + } + /** + * Update the source that powers `$effect.pending()` inside this boundary, + * and controls when the current `pending` snippet (if any) is removed. + * Do not call from inside the class + * @param {1 | -1} d + * @param {Batch} batch + */ + update_pending_count(d, batch) { + this.#update_pending_count(d, batch); + this.#local_pending_count += d; + if (!this.#effect_pending || this.#pending_count_update_queued) return; + this.#pending_count_update_queued = true; + queue_micro_task(() => { + this.#pending_count_update_queued = false; + if (this.#effect_pending) internal_set(this.#effect_pending, this.#local_pending_count); + }); + } + get_effect_pending() { + this.#effect_pending_subscriber(); + return get(this.#effect_pending); + } + /** @param {unknown} error */ + error(error) { + if (!this.#props.onerror && !this.#props.failed) throw error; + if (current_batch?.is_fork) { + if (this.#main_effect) current_batch.skip_effect(this.#main_effect); + if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); + if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); + current_batch.oncommit(() => { + this.#handle_error(error); + }); + } else this.#handle_error(error); + } + /** + * @param {unknown} error + */ + #handle_error(error) { + if (this.#main_effect) { + destroy_effect(this.#main_effect); + this.#main_effect = null; + } + if (this.#pending_effect) { + destroy_effect(this.#pending_effect); + this.#pending_effect = null; + } + if (this.#failed_effect) { + destroy_effect(this.#failed_effect); + this.#failed_effect = null; + } + if (hydrating) { + set_hydrate_node(this.#hydrate_open); + next(); + set_hydrate_node(skip_nodes()); + } + var onerror = this.#props.onerror; + let failed = this.#props.failed; + var did_reset = false; + var calling_on_error = false; + const reset = () => { + if (did_reset) { + svelte_boundary_reset_noop(); + return; + } + did_reset = true; + if (calling_on_error) svelte_boundary_reset_onerror(); + if (this.#failed_effect !== null) pause_effect(this.#failed_effect, () => { + this.#failed_effect = null; + }); + this.#run(() => { + this.#render(); + }); + }; + /** @param {unknown} transformed_error */ + const handle_error_result = (transformed_error) => { + try { + calling_on_error = true; + onerror?.(transformed_error, reset); + calling_on_error = false; + } catch (error) { + invoke_error_boundary(error, this.#effect && this.#effect.parent); + } + if (failed) this.#failed_effect = this.#run(() => { + try { + return branch(() => { + var effect = active_effect; + effect.b = this; + effect.f |= 128; + failed(this.#anchor, () => transformed_error, () => reset); + }); + } catch (error) { + invoke_error_boundary(error, this.#effect.parent); + return null; + } + }); + }; + queue_micro_task(() => { + /** @type {unknown} */ + var result; + try { + result = this.transform_error(error); + } catch (e) { + invoke_error_boundary(e, this.#effect && this.#effect.parent); + return; + } + if (result !== null && typeof result === "object" && typeof result.then === "function") + /** @type {any} */ result.then( + handle_error_result, + /** @param {unknown} e */ + (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) + ); + else handle_error_result(result); + }); + } +}; +/** +* @param {Derived} derived +* @returns {void} +*/ +function destroy_derived_effects(derived) { + var effects = derived.effects; + if (effects !== null) { + derived.effects = null; + for (var i = 0; i < effects.length; i += 1) destroy_effect(effects[i]); + } +} +/** +* @template T +* @param {Derived} derived +* @returns {T} +*/ +function execute_derived(derived) { + var value; + var prev_active_effect = active_effect; + var parent = derived.parent; + if (!is_destroying_effect && parent !== null && derived.v !== UNINITIALIZED && (parent.f & 24576) !== 0) { + derived_inert(); + return derived.v; + } + set_active_effect(parent); + try { + derived.f &= ~WAS_MARKED; + destroy_derived_effects(derived); + value = update_reaction(derived); + } finally { + set_active_effect(prev_active_effect); + } + return value; +} +/** +* @param {Derived} derived +* @returns {void} +*/ +function update_derived(derived) { + var value = execute_derived(derived); + if (!derived.equals(value)) { + derived.wv = increment_write_version(); + if (!current_batch?.is_fork || derived.deps === null) { + if (current_batch !== null) { + current_batch.capture(derived, value, true); + previous_batch?.capture(derived, value, true); + } else derived.v = value; + if (derived.deps === null) { + set_signal_status(derived, CLEAN); + return; + } + } + } + if (is_destroying_effect) return; + if (batch_values !== null) { + if (effect_tracking() || current_batch?.is_fork) batch_values.set(derived, value); + } else update_derived_status(derived); +} +/** +* @param {Derived} derived +*/ +function freeze_derived_effects(derived) { + if (derived.effects === null) return; + for (const e of derived.effects) if (e.teardown || e.ac) { + e.teardown?.(); + e.ac?.abort(STALE_REACTION); + if (e.fn !== null) e.teardown = noop; + e.ac = null; + remove_reactions(e, 0); + destroy_effect_children(e); + } +} +/** +* @param {Derived} derived +*/ +function unfreeze_derived_effects(derived) { + if (derived.effects === null) return; + for (const e of derived.effects) if (e.teardown && e.fn !== null) update_effect(e); +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/sources.js +/** @import { Derived, Effect, Source, Value } from '#client' */ +/** @type {Set} */ +var eager_effects = /* @__PURE__ */ new Set(); +/** @type {Map} */ +var old_values = /* @__PURE__ */ new Map(); +var eager_effects_deferred = false; +/** +* @template V +* @param {V} v +* @param {Error | null} [stack] +* @returns {Source} +*/ +function source(v, stack) { + return { + f: 0, + v, + reactions: null, + equals, + rv: 0, + wv: 0 + }; +} +/** +* @template V +* @param {V} v +* @param {Error | null} [stack] +*/ +/* @__NO_SIDE_EFFECTS__ */ +function state(v, stack) { + const s = source(v, stack); + push_reaction_value(s); + return s; +} +/** +* @template V +* @param {V} initial_value +* @param {boolean} [immutable] +* @returns {Source} +*/ +/* @__NO_SIDE_EFFECTS__ */ +function mutable_source(initial_value, immutable = false, trackable = true) { + const s = source(initial_value); + if (!immutable) s.equals = safe_equals; + if (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) (component_context.l.s ??= []).push(s); + return s; +} +/** +* @template V +* @param {Source} source +* @param {V} value +* @param {boolean} [should_proxy] +* @returns {V} +*/ +function set(source, value, should_proxy = false) { + if (active_reaction !== null && (!untracking || (active_reaction.f & 131072) !== 0) && is_runes() && (active_reaction.f & 4325394) !== 0 && (current_sources === null || !current_sources.has(source))) state_unsafe_mutation(); + return internal_set(source, should_proxy ? proxy(value) : value, legacy_updates); +} +/** +* @template V +* @param {Source} source +* @param {V} value +* @param {Effect[] | null} [updated_during_traversal] +* @returns {V} +*/ +function internal_set(source, value, updated_during_traversal = null) { + if (!source.equals(value)) { + old_values.set(source, is_destroying_effect ? value : source.v); + var batch = Batch.ensure(); + batch.capture(source, value); + if ((source.f & 2) !== 0) { + const derived = source; + if ((source.f & 2048) !== 0) execute_derived(derived); + if (batch_values === null) update_derived_status(derived); + } + source.wv = increment_write_version(); + mark_reactions(source, DIRTY, updated_during_traversal); + if (is_runes() && active_effect !== null && (active_effect.f & 1024) !== 0 && (active_effect.f & 96) === 0) if (untracked_writes === null) set_untracked_writes([source]); + else untracked_writes.push(source); + if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) flush_eager_effects(); + } + return value; +} +function flush_eager_effects() { + eager_effects_deferred = false; + for (const effect of eager_effects) { + if ((effect.f & 1024) !== 0) set_signal_status(effect, MAYBE_DIRTY); + let dirty; + try { + dirty = is_dirty(effect); + } catch { + dirty = true; + } + if (dirty) update_effect(effect); + } + eager_effects.clear(); +} +/** +* Silently (without using `get`) increment a source +* @param {Source} source +*/ +function increment(source) { + set(source, source.v + 1); +} +/** +* @param {Value} signal +* @param {number} status should be DIRTY or MAYBE_DIRTY +* @param {Effect[] | null} updated_during_traversal +* @returns {void} +*/ +function mark_reactions(signal, status, updated_during_traversal) { + var reactions = signal.reactions; + if (reactions === null) return; + var runes = is_runes(); + var length = reactions.length; + for (var i = 0; i < length; i++) { + var reaction = reactions[i]; + var flags = reaction.f; + if (!runes && reaction === active_effect) continue; + var not_dirty = (flags & DIRTY) === 0; + if (not_dirty) set_signal_status(reaction, status); + if ((flags & 131072) !== 0) eager_effects.add(reaction); + else if ((flags & 2) !== 0) { + var derived = reaction; + batch_values?.delete(derived); + if ((flags & 65536) === 0) { + if (flags & 512 && (active_effect === null || (active_effect.f & 2097152) === 0)) reaction.f |= WAS_MARKED; + mark_reactions(derived, MAYBE_DIRTY, updated_during_traversal); + } + } else if (not_dirty) { + var effect = reaction; + if ((flags & 16) !== 0 && eager_block_effects !== null) eager_block_effects.add(effect); + if (updated_during_traversal !== null) updated_during_traversal.push(effect); + else schedule_effect(effect); + } + } +} +/** +* @template T +* @param {T} value +* @returns {T} +*/ +function proxy(value) { + if (typeof value !== "object" || value === null || STATE_SYMBOL in value) return value; + const prototype = get_prototype_of(value); + if (prototype !== object_prototype && prototype !== array_prototype) return value; + /** @type {Map>} */ + var sources = /* @__PURE__ */ new Map(); + var is_proxied_array = is_array(value); + var version = /* @__PURE__ */ state(0); + var stack = null; + var parent_version = update_version; + /** + * Executes the proxy in the context of the reaction it was originally created in, if any + * @template T + * @param {() => T} fn + */ + var with_parent = (fn) => { + if (update_version === parent_version) return fn(); + var reaction = active_reaction; + var version = update_version; + set_active_reaction(null); + set_update_version(parent_version); + var result = fn(); + set_active_reaction(reaction); + set_update_version(version); + return result; + }; + if (is_proxied_array) sources.set("length", /* @__PURE__ */ state( + /** @type {any[]} */ + value.length, + stack + )); + return new Proxy(value, { + defineProperty(_, prop, descriptor) { + if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) state_descriptors_fixed(); + var s = sources.get(prop); + if (s === void 0) with_parent(() => { + var s = /* @__PURE__ */ state(descriptor.value, stack); + sources.set(prop, s); + return s; + }); + else set(s, descriptor.value, true); + return true; + }, + deleteProperty(target, prop) { + var s = sources.get(prop); + if (s === void 0) { + if (prop in target) { + const s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED, stack)); + sources.set(prop, s); + increment(version); + } + } else { + set(s, UNINITIALIZED); + increment(version); + } + return true; + }, + get(target, prop, receiver) { + if (prop === STATE_SYMBOL) return value; + var s = sources.get(prop); + var exists = prop in target; + if (s === void 0 && (!exists || get_descriptor(target, prop)?.writable)) { + s = with_parent(() => { + return /* @__PURE__ */ state(proxy(exists ? target[prop] : UNINITIALIZED), stack); + }); + sources.set(prop, s); + } + if (s !== void 0) { + var v = get(s); + return v === UNINITIALIZED ? void 0 : v; + } + return Reflect.get(target, prop, receiver); + }, + getOwnPropertyDescriptor(target, prop) { + var descriptor = Reflect.getOwnPropertyDescriptor(target, prop); + if (descriptor && "value" in descriptor) { + var s = sources.get(prop); + if (s) descriptor.value = get(s); + } else if (descriptor === void 0) { + var source = sources.get(prop); + var value = source?.v; + if (source !== void 0 && value !== UNINITIALIZED) return { + enumerable: true, + configurable: true, + value, + writable: true + }; + } + return descriptor; + }, + has(target, prop) { + if (prop === STATE_SYMBOL) return true; + var s = sources.get(prop); + var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop); + if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop)?.writable)) { + if (s === void 0) { + s = with_parent(() => { + return /* @__PURE__ */ state(has ? proxy(target[prop]) : UNINITIALIZED, stack); + }); + sources.set(prop, s); + } + if (get(s) === UNINITIALIZED) return false; + } + return has; + }, + set(target, prop, value, receiver) { + var s = sources.get(prop); + var has = prop in target; + if (is_proxied_array && prop === "length") for (var i = value; i < s.v; i += 1) { + var other_s = sources.get(i + ""); + if (other_s !== void 0) set(other_s, UNINITIALIZED); + else if (i in target) { + other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED, stack)); + sources.set(i + "", other_s); + } + } + if (s === void 0) { + if (!has || get_descriptor(target, prop)?.writable) { + s = with_parent(() => /* @__PURE__ */ state(void 0, stack)); + set(s, proxy(value)); + sources.set(prop, s); + } + } else { + has = s.v !== UNINITIALIZED; + var p = with_parent(() => proxy(value)); + set(s, p); + } + var descriptor = Reflect.getOwnPropertyDescriptor(target, prop); + if (descriptor?.set) descriptor.set.call(receiver, value); + if (!has) { + if (is_proxied_array && typeof prop === "string") { + var ls = sources.get("length"); + var n = Number(prop); + if (Number.isInteger(n) && n >= ls.v) set(ls, n + 1); + } + increment(version); + } + return true; + }, + ownKeys(target) { + get(version); + var own_keys = Reflect.ownKeys(target).filter((key) => { + var source = sources.get(key); + return source === void 0 || source.v !== UNINITIALIZED; + }); + for (var [key, source] of sources) if (source.v !== UNINITIALIZED && !(key in target)) own_keys.push(key); + return own_keys; + }, + setPrototypeOf() { + state_prototype_fixed(); + } + }); +} +new Set([ + "copyWithin", + "fill", + "pop", + "push", + "reverse", + "shift", + "sort", + "splice", + "unshift" +]); +//#endregion +//#region node_modules/svelte/src/internal/client/dom/operations.js +/** @type {Window} */ +var $window; +/** @type {() => Node | null} */ +var first_child_getter; +/** @type {() => Node | null} */ +var next_sibling_getter; +/** +* Initialize these lazily to avoid issues when using the runtime in a server context +* where these globals are not available while avoiding a separate server entry point +*/ +function init_operations() { + if ($window !== void 0) return; + $window = window; + /Firefox/.test(navigator.userAgent); + var element_prototype = Element.prototype; + var node_prototype = Node.prototype; + var text_prototype = Text.prototype; + first_child_getter = get_descriptor(node_prototype, "firstChild").get; + next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; + if (is_extensible(element_prototype)) { + /** @type {any} */ element_prototype[CLASS_CACHE] = void 0; + /** @type {any} */ element_prototype[ATTRIBUTES_CACHE] = null; + /** @type {any} */ element_prototype[STYLE_CACHE] = void 0; + element_prototype.__e = void 0; + } + if (is_extensible(text_prototype)) + /** @type {any} */ text_prototype[TEXT_CACHE] = void 0; +} +/** +* @param {string} value +* @returns {Text} +*/ +function create_text(value = "") { + return document.createTextNode(value); +} +/** +* @template {Node} N +* @param {N} node +*/ +/* @__NO_SIDE_EFFECTS__ */ +function get_first_child(node) { + return first_child_getter.call(node); +} +/** +* @template {Node} N +* @param {N} node +*/ +/* @__NO_SIDE_EFFECTS__ */ +function get_next_sibling(node) { + return next_sibling_getter.call(node); +} +/** +* @template {Node} N +* @param {N} node +* @returns {void} +*/ +function clear_text_content(node) { + node.textContent = ""; +} +/** +* Branching here is intentional and load-bearing for perf. `createElement(tag)` +* hits a fast path in Blink that `createElementNS(NAMESPACE_HTML, tag)` doesn't, +* and passing an explicit `undefined` as the trailing options arg measurably +* slows both APIs. Funnelling every case through a single `createElementNS(ns, +* tag, options)` call would be smaller but slower on the HTML path. +* +* @template {keyof HTMLElementTagNameMap | string} T +* @param {T} tag +* @param {string} [namespace] +* @param {string} [is] +* @returns {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} +*/ +function create_element(tag, namespace, is) { + if (namespace == null || namespace === "http://www.w3.org/1999/xhtml") return is ? document.createElement(tag, { is }) : document.createElement(tag); + return is ? document.createElementNS(namespace, tag, { is }) : document.createElementNS(namespace, tag); +} +//#endregion +//#region node_modules/svelte/src/internal/client/dom/elements/bindings/shared.js +/** +* @template T +* @param {() => T} fn +*/ +function without_reactive_context(fn) { + var previous_reaction = active_reaction; + var previous_effect = active_effect; + set_active_reaction(null); + set_active_effect(null); + try { + return fn(); + } finally { + set_active_reaction(previous_reaction); + set_active_effect(previous_effect); + } +} +//#endregion +//#region node_modules/svelte/src/internal/client/reactivity/effects.js +/** @import { Blocker, ComponentContext, ComponentContextLegacy, Derived, Effect, TemplateNode, TransitionManager } from '#client' */ +/** +* @param {Effect} effect +* @param {Effect} parent_effect +*/ +function push_effect(effect, parent_effect) { + var parent_last = parent_effect.last; + if (parent_last === null) parent_effect.last = parent_effect.first = effect; + else { + parent_last.next = effect; + effect.prev = parent_last; + parent_effect.last = effect; + } +} +/** +* @param {number} type +* @param {null | (() => void | (() => void))} fn +* @returns {Effect} +*/ +function create_effect(type, fn) { + var parent = active_effect; + if (parent !== null && (parent.f & 8192) !== 0) type |= INERT; + /** @type {Effect} */ + var effect = { + ctx: component_context, + deps: null, + nodes: null, + f: type | DIRTY | 512, + first: null, + fn, + last: null, + next: null, + parent, + b: parent && parent.b, + prev: null, + teardown: null, + wv: 0, + ac: null + }; + current_batch?.register_created_effect(effect); + /** @type {Effect | null} */ + var e = effect; + if ((type & 4) !== 0) if (collected_effects !== null) collected_effects.push(effect); + else Batch.ensure().schedule(effect); + else if (fn !== null) { + try { + update_effect(effect); + } catch (e) { + destroy_effect(effect); + throw e; + } + if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && (e.f & 524288) === 0) { + e = e.first; + if ((type & 16) !== 0 && (type & 65536) !== 0 && e !== null) e.f |= EFFECT_TRANSPARENT; + } + } + if (e !== null) { + e.parent = parent; + if (parent !== null) push_effect(e, parent); + if (active_reaction !== null && (active_reaction.f & 2) !== 0 && (type & 64) === 0) { + var derived = active_reaction; + (derived.effects ??= []).push(e); + } + } + return effect; +} +/** +* Internal representation of `$effect.tracking()` +* @returns {boolean} +*/ +function effect_tracking() { + return active_reaction !== null && !untracking; +} +/** +* @param {() => void | (() => void)} fn +*/ +function create_user_effect(fn) { + return create_effect(4 | USER_EFFECT, fn); +} +/** +* Internal representation of `$effect.root(...)` +* @param {() => void | (() => void)} fn +* @returns {() => void} +*/ +function effect_root(fn) { + Batch.ensure(); + const effect = create_effect(64 | EFFECT_PRESERVED, fn); + return () => { + destroy_effect(effect); + }; +} +/** +* An effect root whose children can transition out +* @param {() => void} fn +* @returns {(options?: { outro?: boolean }) => Promise} +*/ +function component_root(fn) { + Batch.ensure(); + const effect = create_effect(64 | EFFECT_PRESERVED, fn); + return (options = {}) => { + return new Promise((fulfil) => { + if (options.outro) pause_effect(effect, () => { + destroy_effect(effect); + fulfil(void 0); + }); + else { + destroy_effect(effect); + fulfil(void 0); + } + }); + }; +} +/** +* @param {() => void | (() => void)} fn +* @returns {Effect} +*/ +function render_effect(fn, flags = 0) { + return create_effect(8 | flags, fn); +} +/** +* @param {(() => void)} fn +* @param {number} flags +*/ +function block(fn, flags = 0) { + return create_effect(16 | flags, fn); +} +/** +* @param {(() => void)} fn +*/ +function branch(fn) { + return create_effect(32 | EFFECT_PRESERVED, fn); +} +/** +* @param {Effect} effect +*/ +function execute_effect_teardown(effect) { + var teardown = effect.teardown; + if (teardown !== null) { + const previously_destroying_effect = is_destroying_effect; + const previous_reaction = active_reaction; + set_is_destroying_effect(true); + set_active_reaction(null); + try { + teardown.call(null); + } finally { + set_is_destroying_effect(previously_destroying_effect); + set_active_reaction(previous_reaction); + } + } +} +/** +* @param {Effect} signal +* @param {boolean} remove_dom +* @returns {void} +*/ +function destroy_effect_children(signal, remove_dom = false) { + var effect = signal.first; + signal.first = signal.last = null; + while (effect !== null) { + const controller = effect.ac; + if (controller !== null) without_reactive_context(() => { + controller.abort(STALE_REACTION); + }); + var next = effect.next; + if ((effect.f & 64) !== 0) effect.parent = null; + else destroy_effect(effect, remove_dom); + effect = next; + } +} +/** +* @param {Effect} signal +* @returns {void} +*/ +function destroy_block_effect_children(signal) { + var effect = signal.first; + while (effect !== null) { + var next = effect.next; + if ((effect.f & 32) === 0) destroy_effect(effect); + effect = next; + } +} +/** +* @param {Effect} effect +* @param {boolean} [remove_dom] +* @returns {void} +*/ +function destroy_effect(effect, remove_dom = true) { + var removed = false; + if ((remove_dom || (effect.f & 262144) !== 0) && effect.nodes !== null && effect.nodes.end !== null) { + remove_effect_dom(effect.nodes.start, effect.nodes.end); + removed = true; + } + set_signal_status(effect, DESTROYING); + destroy_effect_children(effect, remove_dom && !removed); + remove_reactions(effect, 0); + var transitions = effect.nodes && effect.nodes.t; + if (transitions !== null) for (const transition of transitions) transition.stop(); + execute_effect_teardown(effect); + effect.f ^= DESTROYING; + effect.f |= DESTROYED; + var parent = effect.parent; + if (parent !== null && parent.first !== null) unlink_effect(effect); + effect.next = effect.prev = effect.teardown = effect.ctx = effect.deps = effect.fn = effect.nodes = effect.ac = effect.b = null; +} +/** +* +* @param {TemplateNode | null} node +* @param {TemplateNode} end +*/ +function remove_effect_dom(node, end) { + while (node !== null) { + /** @type {TemplateNode | null} */ + var next = node === end ? null : /* @__PURE__ */ get_next_sibling(node); + node.remove(); + node = next; + } +} +/** +* Detach an effect from the effect tree, freeing up memory and +* reducing the amount of work that happens on subsequent traversals +* @param {Effect} effect +*/ +function unlink_effect(effect) { + var parent = effect.parent; + var prev = effect.prev; + var next = effect.next; + if (prev !== null) prev.next = next; + if (next !== null) next.prev = prev; + if (parent !== null) { + if (parent.first === effect) parent.first = next; + if (parent.last === effect) parent.last = prev; + } +} +/** +* When a block effect is removed, we don't immediately destroy it or yank it +* out of the DOM, because it might have transitions. Instead, we 'pause' it. +* It stays around (in memory, and in the DOM) until outro transitions have +* completed, and if the state change is reversed then we _resume_ it. +* A paused effect does not update, and the DOM subtree becomes inert. +* @param {Effect} effect +* @param {() => void} [callback] +* @param {boolean} [destroy] +*/ +function pause_effect(effect, callback, destroy = true) { + /** @type {TransitionManager[]} */ + var transitions = []; + pause_children(effect, transitions, true); + var fn = () => { + if (destroy) destroy_effect(effect); + if (callback) callback(); + }; + var remaining = transitions.length; + if (remaining > 0) { + var check = () => --remaining || fn(); + for (var transition of transitions) transition.out(check); + } else fn(); +} +/** +* @param {Effect} effect +* @param {TransitionManager[]} transitions +* @param {boolean} local +*/ +function pause_children(effect, transitions, local) { + if ((effect.f & 8192) !== 0) return; + effect.f ^= INERT; + var t = effect.nodes && effect.nodes.t; + if (t !== null) { + for (const transition of t) if (transition.is_global || local) transitions.push(transition); + } + var child = effect.first; + while (child !== null) { + var sibling = child.next; + if ((child.f & 64) === 0) { + var transparent = (child.f & 65536) !== 0 || (child.f & 32) !== 0 && (effect.f & 16) !== 0; + pause_children(child, transitions, transparent ? local : false); + } + child = sibling; + } +} +/** +* @param {Effect} effect +* @param {DocumentFragment} fragment +*/ +function move_effect(effect, fragment) { + if (!effect.nodes) return; + /** @type {TemplateNode | null} */ + var node = effect.nodes.start; + var end = effect.nodes.end; + while (node !== null) { + /** @type {TemplateNode | null} */ + var next = node === end ? null : /* @__PURE__ */ get_next_sibling(node); + fragment.append(node); + node = next; + } +} +//#endregion +//#region node_modules/svelte/src/internal/client/legacy.js +/** +* @type {Set | null} +* @deprecated +*/ +var captured_signals = null; +//#endregion +//#region node_modules/svelte/src/internal/client/runtime.js +/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */ +var is_updating_effect = false; +var is_destroying_effect = false; +/** @param {boolean} value */ +function set_is_destroying_effect(value) { + is_destroying_effect = value; +} +/** @type {null | Reaction} */ +var active_reaction = null; +var untracking = false; +/** @param {null | Reaction} reaction */ +function set_active_reaction(reaction) { + active_reaction = reaction; +} +/** @type {null | Effect} */ +var active_effect = null; +/** @param {null | Effect} effect */ +function set_active_effect(effect) { + active_effect = effect; +} +/** +* When sources are created within a reaction, reading and writing +* them within that reaction should not cause a re-run +* @type {null | Set} +*/ +var current_sources = null; +/** @param {Value} value */ +function push_reaction_value(value) { + if (active_reaction !== null && (!async_mode_flag || (active_reaction.f & 2) !== 0)) (current_sources ??= /* @__PURE__ */ new Set()).add(value); +} +/** +* The dependencies of the reaction that is currently being executed. In many cases, +* the dependencies are unchanged between runs, and so this will be `null` unless +* and until a new dependency is accessed — we track this via `skipped_deps` +* @type {null | Value[]} +*/ +var new_deps = null; +var skipped_deps = 0; +/** +* Tracks writes that the effect it's executed in doesn't listen to yet, +* so that the dependency can be added to the effect later on if it then reads it +* @type {null | Source[]} +*/ +var untracked_writes = null; +/** @param {null | Source[]} value */ +function set_untracked_writes(value) { + untracked_writes = value; +} +/** +* @type {number} Used by sources and deriveds for handling updates. +* Version starts from 1 so that unowned deriveds differentiate between a created effect and a run one for tracing +**/ +var write_version = 1; +/** @type {number} Used to version each read of a source of derived to avoid duplicating depedencies inside a reaction */ +var read_version = 0; +var update_version = read_version; +/** @param {number} value */ +function set_update_version(value) { + update_version = value; +} +function increment_write_version() { + return ++write_version; +} +/** +* Determines whether a derived or effect is dirty. +* If it is MAYBE_DIRTY, will set the status to CLEAN +* @param {Reaction} reaction +* @returns {boolean} +*/ +function is_dirty(reaction) { + var flags = reaction.f; + if ((flags & 2048) !== 0) return true; + if (flags & 2) reaction.f &= ~WAS_MARKED; + if ((flags & 4096) !== 0) { + var dependencies = reaction.deps; + var length = dependencies.length; + for (var i = 0; i < length; i++) { + var dependency = dependencies[i]; + if (is_dirty(dependency)) update_derived(dependency); + if (dependency.wv > reaction.wv) return true; + } + if ((flags & 512) !== 0 && batch_values === null) set_signal_status(reaction, CLEAN); + } + return false; +} +/** +* @param {Value} signal +* @param {Effect} effect +* @param {boolean} [root] +*/ +function schedule_possible_effect_self_invalidation(signal, effect, root = true) { + var reactions = signal.reactions; + if (reactions === null) return; + if (!async_mode_flag && current_sources !== null && current_sources.has(signal)) return; + for (var i = 0; i < reactions.length; i++) { + var reaction = reactions[i]; + if ((reaction.f & 2) !== 0) schedule_possible_effect_self_invalidation(reaction, effect, false); + else if (effect === reaction) { + if (root) set_signal_status(reaction, DIRTY); + else if ((reaction.f & 1024) !== 0) set_signal_status(reaction, MAYBE_DIRTY); + schedule_effect(reaction); + } + } +} +/** @param {Reaction} reaction */ +function update_reaction(reaction) { + var previous_deps = new_deps; + var previous_skipped_deps = skipped_deps; + var previous_untracked_writes = untracked_writes; + var previous_reaction = active_reaction; + var previous_sources = current_sources; + var previous_component_context = component_context; + var previous_untracking = untracking; + var previous_update_version = update_version; + var flags = reaction.f; + new_deps = null; + skipped_deps = 0; + untracked_writes = null; + active_reaction = (flags & 96) === 0 ? reaction : null; + current_sources = null; + set_component_context(reaction.ctx); + untracking = false; + update_version = ++read_version; + if (reaction.ac !== null) { + without_reactive_context(() => { + /** @type {AbortController} */ reaction.ac.abort(STALE_REACTION); + }); + reaction.ac = null; + } + try { + reaction.f |= REACTION_IS_UPDATING; + var fn = reaction.fn; + var result = fn(); + reaction.f |= REACTION_RAN; + var deps = reaction.deps; + var is_fork = current_batch?.is_fork; + if (new_deps !== null) { + var i; + if (!is_fork) remove_reactions(reaction, skipped_deps); + if (deps !== null && skipped_deps > 0) { + deps.length = skipped_deps + new_deps.length; + for (i = 0; i < new_deps.length; i++) deps[skipped_deps + i] = new_deps[i]; + } else reaction.deps = deps = new_deps; + if (effect_tracking() && (reaction.f & 512) !== 0) for (i = skipped_deps; i < deps.length; i++) (deps[i].reactions ??= []).push(reaction); + } else if (!is_fork && deps !== null && skipped_deps < deps.length) { + remove_reactions(reaction, skipped_deps); + deps.length = skipped_deps; + } + if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & 6146) === 0) for (i = 0; i < untracked_writes.length; i++) schedule_possible_effect_self_invalidation(untracked_writes[i], reaction); + if (previous_reaction !== null && previous_reaction !== reaction) { + read_version++; + if (previous_reaction.deps !== null) for (let i = 0; i < previous_skipped_deps; i += 1) previous_reaction.deps[i].rv = read_version; + if (previous_deps !== null) for (const dep of previous_deps) dep.rv = read_version; + if (untracked_writes !== null) if (previous_untracked_writes === null) previous_untracked_writes = untracked_writes; + else previous_untracked_writes.push(...untracked_writes); + } + if ((reaction.f & 8388608) !== 0) reaction.f ^= ERROR_VALUE; + return result; + } catch (error) { + return handle_error(error); + } finally { + reaction.f ^= REACTION_IS_UPDATING; + new_deps = previous_deps; + skipped_deps = previous_skipped_deps; + untracked_writes = previous_untracked_writes; + active_reaction = previous_reaction; + current_sources = previous_sources; + set_component_context(previous_component_context); + untracking = previous_untracking; + update_version = previous_update_version; + } +} +/** +* @template V +* @param {Reaction} signal +* @param {Value} dependency +* @returns {void} +*/ +function remove_reaction(signal, dependency) { + let reactions = dependency.reactions; + if (reactions !== null) { + var index = index_of.call(reactions, signal); + if (index !== -1) { + var new_length = reactions.length - 1; + if (new_length === 0) reactions = dependency.reactions = null; + else { + reactions[index] = reactions[new_length]; + reactions.pop(); + } + } + } + if (reactions === null && (dependency.f & 2) !== 0 && (new_deps === null || !includes.call(new_deps, dependency))) { + var derived = dependency; + if ((derived.f & 512) !== 0) { + derived.f ^= 512; + derived.f &= ~WAS_MARKED; + } + if (derived.v !== UNINITIALIZED) update_derived_status(derived); + freeze_derived_effects(derived); + remove_reactions(derived, 0); + } +} +/** +* @param {Reaction} signal +* @param {number} start_index +* @returns {void} +*/ +function remove_reactions(signal, start_index) { + var dependencies = signal.deps; + if (dependencies === null) return; + for (var i = start_index; i < dependencies.length; i++) remove_reaction(signal, dependencies[i]); +} +/** +* @param {Effect} effect +* @returns {void} +*/ +function update_effect(effect) { + var flags = effect.f; + if ((flags & 16384) !== 0) return; + set_signal_status(effect, CLEAN); + var previous_effect = active_effect; + var was_updating_effect = is_updating_effect; + active_effect = effect; + is_updating_effect = true; + try { + if ((flags & 16777232) !== 0) destroy_block_effect_children(effect); + else destroy_effect_children(effect); + execute_effect_teardown(effect); + var teardown = update_reaction(effect); + effect.teardown = typeof teardown === "function" ? teardown : null; + effect.wv = write_version; + } finally { + is_updating_effect = was_updating_effect; + active_effect = previous_effect; + } +} +/** +* @template V +* @param {Value} signal +* @returns {V} +*/ +function get(signal) { + var is_derived = (signal.f & 2) !== 0; + captured_signals?.add(signal); + if (active_reaction !== null && !untracking) { + if (!(active_effect !== null && (active_effect.f & 16384) !== 0) && (current_sources === null || !current_sources.has(signal))) { + var deps = active_reaction.deps; + if ((active_reaction.f & 2097152) !== 0) { + if (signal.rv < read_version) { + signal.rv = read_version; + if (new_deps === null && deps !== null && deps[skipped_deps] === signal) skipped_deps++; + else if (new_deps === null) new_deps = [signal]; + else new_deps.push(signal); + } + } else { + active_reaction.deps ??= []; + if (!includes.call(active_reaction.deps, signal)) active_reaction.deps.push(signal); + var reactions = signal.reactions; + if (reactions === null) signal.reactions = [active_reaction]; + else if (!includes.call(reactions, active_reaction)) reactions.push(active_reaction); + } + } + } + if (is_destroying_effect && old_values.has(signal)) return old_values.get(signal); + if (is_derived) { + var derived = signal; + if (is_destroying_effect) { + var value = derived.v; + if ((derived.f & 1024) === 0 && derived.reactions !== null || depends_on_old_values(derived)) value = execute_derived(derived); + old_values.set(derived, value); + return value; + } + var should_connect = (derived.f & 512) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & 512) !== 0); + var is_new = (derived.f & REACTION_RAN) === 0; + if (is_dirty(derived)) { + if (should_connect) derived.f |= 512; + update_derived(derived); + } + if (should_connect && !is_new) { + unfreeze_derived_effects(derived); + reconnect(derived); + } + } + if (batch_values?.has(signal)) return batch_values.get(signal); + if ((signal.f & 8388608) !== 0) throw signal.v; + return signal.v; +} +/** +* (Re)connect a disconnected derived, so that it is notified +* of changes in `mark_reactions` +* @param {Derived} derived +*/ +function reconnect(derived) { + derived.f |= 512; + if (derived.deps === null) return; + for (const dep of derived.deps) { + (dep.reactions ??= []).push(derived); + if ((dep.f & 2) !== 0 && (dep.f & 512) === 0) { + unfreeze_derived_effects(dep); + reconnect(dep); + } + } +} +/** @param {Derived} derived */ +function depends_on_old_values(derived) { + if (derived.v === UNINITIALIZED) return true; + if (derived.deps === null) return false; + for (const dep of derived.deps) { + if (old_values.has(dep)) return true; + if ((dep.f & 2) !== 0 && depends_on_old_values(dep)) return true; + } + return false; +} +/** +* When used inside a [`$derived`](https://svelte.dev/docs/svelte/$derived) or [`$effect`](https://svelte.dev/docs/svelte/$effect), +* any state read inside `fn` will not be treated as a dependency. +* +* ```ts +* $effect(() => { +* // this will run when `data` changes, but not when `time` changes +* save(data, { +* timestamp: untrack(() => time) +* }); +* }); +* ``` +* @template T +* @param {() => T} fn +* @returns {T} +*/ +function untrack(fn) { + var previous_untracking = untracking; + try { + untracking = true; + return fn(); + } finally { + untracking = previous_untracking; + } +} +//#endregion +//#region node_modules/svelte/src/store/utils.js +/** @import { Readable } from './public' */ +/** +* @template T +* @param {Readable | null | undefined} store +* @param {(value: T) => void} run +* @param {(value: T) => void} [invalidate] +* @returns {() => void} +*/ +function subscribe_to_store(store, run, invalidate) { + if (store == null) { + run(void 0); + if (invalidate) invalidate(void 0); + return noop; + } + const unsub = untrack(() => store.subscribe(run, invalidate)); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; +} +var VOID_ELEMENT_NAMES = [ + "area", + "base", + "br", + "col", + "command", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "meta", + "param", + "source", + "track", + "wbr" +]; +/** +* Returns `true` if `name` is of a void element +* @param {string} name +*/ +function is_void(name) { + return VOID_ELEMENT_NAMES.includes(name) || name.toLowerCase() === "!doctype"; +} +/** +* Attributes that are boolean, i.e. they are present or not present. +*/ +var DOM_BOOLEAN_ATTRIBUTES = [ + "allowfullscreen", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "disabled", + "formnovalidate", + "indeterminate", + "inert", + "ismap", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "seamless", + "selected", + "webkitdirectory", + "defer", + "disablepictureinpicture", + "disableremoteplayback" +]; +/** +* Returns `true` if `name` is a boolean attribute +* @param {string} name +*/ +function is_boolean_attribute(name) { + return DOM_BOOLEAN_ATTRIBUTES.includes(name); +} +[...DOM_BOOLEAN_ATTRIBUTES]; +/** +* Subset of delegated events which should be passive by default. +* These two are already passive via browser defaults on window, document and body. +* But since +* - we're delegating them +* - they happen often +* - they apply to mobile which is generally less performant +* we're marking them as passive by default for other elements, too. +*/ +var PASSIVE_EVENTS = ["touchstart", "touchmove"]; +/** +* Returns `true` if `name` is a passive event +* @param {string} name +*/ +function is_passive_event(name) { + return PASSIVE_EVENTS.includes(name); +} +/** List of elements that require raw contents and should not have SSR comments put in them */ +var RAW_TEXT_ELEMENTS = [ + "textarea", + "script", + "style", + "title" +]; +/** @param {string} name */ +function is_raw_text_element(name) { + return RAW_TEXT_ELEMENTS.includes(name); +} +var REGEX_VALID_TAG_NAME = /^[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9.\-_\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}]*)?$/u; +//#endregion +//#region node_modules/svelte/src/internal/server/blocks/html.js +/** +* @param {string} value +*/ +function html(value) { + return "" + String(value ?? "") + ""; +} +//#endregion +//#region node_modules/svelte/src/internal/server/index.js +var INVALID_ATTR_NAME_CHAR_REGEX = /[\s'">/=\u{FDD0}-\u{FDEF}\u{FFFE}\u{FFFF}\u{1FFFE}\u{1FFFF}\u{2FFFE}\u{2FFFF}\u{3FFFE}\u{3FFFF}\u{4FFFE}\u{4FFFF}\u{5FFFE}\u{5FFFF}\u{6FFFE}\u{6FFFF}\u{7FFFE}\u{7FFFF}\u{8FFFE}\u{8FFFF}\u{9FFFE}\u{9FFFF}\u{AFFFE}\u{AFFFF}\u{BFFFE}\u{BFFFF}\u{CFFFE}\u{CFFFF}\u{DFFFE}\u{DFFFF}\u{EFFFE}\u{EFFFF}\u{FFFFE}\u{FFFFF}\u{10FFFE}\u{10FFFF}]/u; +/** +* @param {Renderer} renderer +* @param {string} tag +* @param {() => void} attributes_fn +* @param {() => void} children_fn +* @returns {void} +*/ +function element(renderer, tag, attributes_fn = noop, children_fn = noop) { + renderer.push(""); + if (tag) { + if (!REGEX_VALID_TAG_NAME.test(tag)) dynamic_element_invalid_tag(tag); + renderer.push(`<${tag}`); + attributes_fn(); + renderer.push(`>`); + if (!is_void(tag)) { + children_fn(); + if (!is_raw_text_element(tag)) renderer.push(EMPTY_COMMENT); + renderer.push(``); + } + } + renderer.push(""); +} +/** +* Only available on the server and when compiling with the `server` option. +* Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app. +* @template {Record} Props +* @param {Component | ComponentType>} component +* @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp; transformError?: (error: unknown) => unknown }} [options] +* @returns {RenderOutput} +*/ +function render(component, options = {}) { + if (options.csp?.hash && options.csp.nonce) invalid_csp(); + return Renderer.render(component, options); +} +/** +* @param {string} hash +* @param {Renderer} renderer +* @param {(renderer: Renderer) => Promise | void} fn +* @returns {void} +*/ +function head(hash, renderer, fn) { + renderer.head((renderer) => { + renderer.push(``); + renderer.child(fn); + renderer.push(EMPTY_COMMENT); + }); +} +/** +* @param {Record} attrs +* @param {string} [css_hash] +* @param {Record} [classes] +* @param {Record} [styles] +* @param {number} [flags] +* @returns {string} +*/ +function attributes(attrs, css_hash, classes, styles, flags = 0) { + if (styles) attrs.style = to_style(attrs.style, styles); + if (attrs.class) attrs.class = clsx$1(attrs.class); + if (css_hash || classes) attrs.class = to_class(attrs.class, css_hash, classes); + let attr_str = ""; + let name; + const is_html = (flags & 1) === 0; + const lowercase = (flags & 2) === 0; + const is_input = (flags & 4) !== 0; + for (name of Object.keys(attrs)) { + if (typeof attrs[name] === "function") continue; + if (name[0] === "$" && name[1] === "$") continue; + if (name === "" || INVALID_ATTR_NAME_CHAR_REGEX.test(name)) continue; + var value = attrs[name]; + var lower = name.toLowerCase(); + if (lowercase) name = lower; + if (lower.length > 2 && lower.startsWith("on")) continue; + if (is_input) { + if (name === "defaultvalue" || name === "defaultchecked") { + name = name === "defaultvalue" ? "value" : "checked"; + if (attrs[name]) continue; + } + } + attr_str += attr(name, value, is_html && is_boolean_attribute(name)); + } + return attr_str; +} +/** +* @param {Record[]} props +* @returns {Record} +*/ +function spread_props(props) { + /** @type {Record} */ + const merged_props = {}; + let key; + for (let i = 0; i < props.length; i++) { + const obj = props[i]; + if (obj == null) continue; + for (key of Object.keys(obj)) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc) Object.defineProperty(merged_props, key, desc); + else merged_props[key] = obj[key]; + } + } + return merged_props; +} +/** +* @param {unknown} value +* @returns {string} +*/ +function stringify(value) { + return typeof value === "string" ? value : value == null ? "" : value + ""; +} +/** +* @param {any} value +* @param {string | undefined} [hash] +* @param {Record} [directives] +*/ +function attr_class(value, hash, directives) { + var result = to_class(value, hash, directives); + return result ? ` class="${escape_html(result, true)}"` : ""; +} +/** +* @param {any} value +* @param {Record|[Record,Record]} [directives] +*/ +function attr_style(value, directives) { + var result = to_style(value, directives); + return result ? ` style="${escape_html(result, true)}"` : ""; +} +/** +* @template V +* @param {Record} store_values +* @param {string} store_name +* @param {Store | null | undefined} store +* @returns {V} +*/ +function store_get(store_values, store_name, store) { + if (store_name in store_values && store_values[store_name][0] === store) return store_values[store_name][2]; + store_values[store_name]?.[1](); + store_values[store_name] = [ + store, + null, + void 0 + ]; + const unsub = subscribe_to_store( + store, + /** @param {any} v */ + (v) => store_values[store_name][2] = v + ); + store_values[store_name][1] = unsub; + return store_values[store_name][2]; +} +/** @param {Record} store_values */ +function unsubscribe_stores(store_values) { + for (const store_name of Object.keys(store_values)) store_values[store_name][1](); +} +/** +* Legacy mode: If the prop has a fallback and is bound in the +* parent component, propagate the fallback value upwards. +* @param {Record} props_parent +* @param {Record} props_now +*/ +function bind_props(props_parent, props_now) { + for (const key of Object.keys(props_now)) { + const initial_value = props_parent[key]; + const value = props_now[key]; + if (initial_value === void 0 && value !== void 0 && Object.getOwnPropertyDescriptor(props_parent, key)?.set) props_parent[key] = value; + } +} +/** @param {any} array_like_or_iterator */ +function ensure_array_like(array_like_or_iterator) { + if (array_like_or_iterator) return array_like_or_iterator.length !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator); + return []; +} +/** +* @template V +* @param {() => V} get_value +*/ +function once(get_value) { + let value = UNINITIALIZED; + return () => { + if (value === UNINITIALIZED) value = get_value(); + return value; + }; +} +/** +* Create an unique ID +* @param {Renderer} renderer +* @returns {string} +*/ +function props_id(renderer) { + const uid = renderer.global.uid(); + renderer.push(""); + return uid; +} +/** +* @template T +* @param {()=>T} fn +* @returns {(new_value?: T) => (T | void)} +*/ +function derived(fn) { + const get_value = ssr_context === null ? fn : once(fn); + /** @type {T | undefined} */ + let updated_value; + return function(new_value) { + if (arguments.length === 0) return updated_value ?? get_value(); + updated_value = new_value; + return updated_value; + }; +} +//#endregion +//#region node_modules/svelte/src/internal/server/crypto.js +var text_encoder; +var crypto; +/** @param {string} module_name */ +var obfuscated_import = (module_name) => import( + /* @vite-ignore */ + module_name +); +/** @param {string} data */ +async function sha256(data) { + text_encoder ??= new TextEncoder(); + crypto ??= globalThis.crypto?.subtle?.digest ? globalThis.crypto : (await obfuscated_import("node:crypto")).webcrypto; + return base64_encode(await crypto.subtle.digest("SHA-256", text_encoder.encode(data))); +} +/** +* @param {Uint8Array} bytes +* @returns {string} +*/ +function base64_encode(bytes) { + if (globalThis.Buffer) return globalThis.Buffer.from(bytes).toString("base64"); + let binary = ""; + for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]); + return btoa(binary); +} +//#endregion +//#region node_modules/svelte/src/internal/server/renderer.js +/** @import { Component } from 'svelte' */ +/** @import { Csp, HydratableContext, RenderOutput, SSRContext, SyncRenderOutput, Sha256Source } from './types.js' */ +/** @import { MaybePromise } from '#shared' */ +/** @typedef {'head' | 'body'} RendererType */ +/** @typedef {{ [key in RendererType]: string }} AccumulatedContent */ +/** +* @typedef {string | Renderer} RendererItem +*/ +/** +* Renderers are basically a tree of `string | Renderer`s, where each `Renderer` in the tree represents +* work that may or may not have completed. A renderer can be {@link collect}ed to aggregate the +* content from itself and all of its children, but this will throw if any of the children are +* performing asynchronous work. To asynchronously collect a renderer, just `await` it. +* +* The `string` values within a renderer are always associated with the {@link type} of that renderer. To switch types, +* call {@link child} with a different `type` argument. +*/ +var Renderer = class Renderer { + /** + * The contents of the renderer. + * @type {RendererItem[]} + */ + #out = []; + /** + * Any `onDestroy` callbacks registered during execution of this renderer. + * @type {(() => void)[] | undefined} + */ + #on_destroy = void 0; + /** + * Whether this renderer is a component body. + * @type {boolean} + */ + #is_component_body = false; + /** + * If set, this renderer is an error boundary. When async collection + * of the children fails, the failed snippet is rendered instead. + * @type {{ + * failed: (renderer: Renderer, error: unknown, reset: () => void) => void; + * transformError: (error: unknown) => unknown; + * context: SSRContext | null; + * } | null} + */ + #boundary = null; + /** + * The type of string content that this renderer is accumulating. + * @type {RendererType} + */ + type; + /** @type {Renderer | undefined} */ + #parent; + /** + * Asynchronous work associated with this renderer + * @type {Promise | undefined} + */ + promise = void 0; + /** + * State which is associated with the content tree as a whole. + * It will be re-exposed, uncopied, on all children. + * @type {SSRState} + * @readonly + */ + global; + /** + * State that is local to the branch it is declared in. + * It will be shallow-copied to all children. + * + * @type {{ select_value: string | undefined }} + */ + local; + /** + * @param {SSRState} global + * @param {Renderer | undefined} [parent] + */ + constructor(global, parent) { + this.#parent = parent; + this.global = global; + this.local = parent ? { ...parent.local } : { select_value: void 0 }; + this.type = parent ? parent.type : "body"; + } + /** + * @param {(renderer: Renderer) => void} fn + */ + head(fn) { + const head = new Renderer(this.global, this); + head.type = "head"; + this.#out.push(head); + head.child(fn); + } + /** + * @param {Array>} blockers + * @param {(renderer: Renderer) => void} fn + */ + async_block(blockers, fn) { + this.#out.push(BLOCK_OPEN); + this.async(blockers, fn); + this.#out.push(BLOCK_CLOSE); + } + /** + * @param {Array>} blockers + * @param {(renderer: Renderer) => void} fn + */ + async(blockers, fn) { + let callback = fn; + if (blockers.length > 0) { + const context = ssr_context; + callback = (renderer) => { + return Promise.all(blockers).then(() => { + const previous_context = ssr_context; + try { + set_ssr_context(context); + return fn(renderer); + } finally { + set_ssr_context(previous_context); + } + }); + }; + } + this.child(callback); + } + /** + * @param {Array<() => void>} thunks + */ + run(thunks) { + const context = ssr_context; + let promise = Promise.resolve(thunks[0]()); + const promises = [promise]; + for (const fn of thunks.slice(1)) { + promise = promise.then(() => { + const previous_context = ssr_context; + set_ssr_context(context); + try { + return fn(); + } finally { + set_ssr_context(previous_context); + } + }); + promises.push(promise); + } + promise.catch(noop); + this.promise = promise; + return promises; + } + /** + * @param {(renderer: Renderer) => MaybePromise} fn + */ + child_block(fn) { + this.#out.push(BLOCK_OPEN); + this.child(fn); + this.#out.push(BLOCK_CLOSE); + } + /** + * Create a child renderer. The child renderer inherits the state from the parent, + * but has its own content. + * @param {(renderer: Renderer) => MaybePromise} fn + */ + child(fn) { + const child = new Renderer(this.global, this); + this.#out.push(child); + const parent = ssr_context; + set_ssr_context({ + ...ssr_context, + p: parent, + c: null, + r: child + }); + const result = fn(child); + set_ssr_context(parent); + if (result instanceof Promise) { + result.catch(noop); + result.finally(() => set_ssr_context(null)).catch(noop); + if (child.global.mode === "sync") await_invalid(); + child.promise = result; + } + return child; + } + /** + * Render children inside an error boundary. If the children throw and the API-level + * `transformError` transform handles the error (doesn't re-throw), the `failed` snippet is + * rendered instead. Otherwise the error propagates. + * + * @param {{ failed?: (renderer: Renderer, error: unknown, reset: () => void) => void }} props + * @param {(renderer: Renderer) => MaybePromise} children_fn + */ + boundary(props, children_fn) { + const child = new Renderer(this.global, this); + this.#out.push(child); + const parent_context = ssr_context; + if (props.failed) child.#boundary = { + failed: props.failed, + transformError: this.global.transformError, + context: parent_context + }; + set_ssr_context({ + ...ssr_context, + p: parent_context, + c: null, + r: child + }); + try { + const result = children_fn(child); + set_ssr_context(parent_context); + if (result instanceof Promise) { + if (child.global.mode === "sync") await_invalid(); + result.catch(noop); + child.promise = result; + } + } catch (error) { + set_ssr_context(parent_context); + const failed_snippet = props.failed; + if (!failed_snippet) throw error; + const result = this.global.transformError(error); + child.#out.length = 0; + child.#boundary = null; + if (result instanceof Promise) { + if (this.global.mode === "sync") await_invalid(); + child.promise = result.then((transformed) => { + set_ssr_context(parent_context); + child.#out.push(Renderer.#serialize_failed_boundary(transformed)); + failed_snippet(child, transformed, noop); + child.#out.push(BLOCK_CLOSE); + }); + child.promise.catch(noop); + } else { + child.#out.push(Renderer.#serialize_failed_boundary(result)); + failed_snippet(child, result, noop); + child.#out.push(BLOCK_CLOSE); + } + } + } + /** + * Create a component renderer. The component renderer inherits the state from the parent, + * but has its own content. It is treated as an ordering boundary for ondestroy callbacks. + * @param {(renderer: Renderer) => MaybePromise} fn + * @param {Function} [component_fn] + * @returns {void} + */ + component(fn, component_fn) { + push$1(component_fn); + const child = this.child(fn); + child.#is_component_body = true; + pop$1(); + } + /** + * @param {Record} attrs + * @param {(renderer: Renderer) => void} fn + * @param {string | undefined} [css_hash] + * @param {Record | undefined} [classes] + * @param {Record | undefined} [styles] + * @param {number | undefined} [flags] + * @param {boolean | undefined} [is_rich] + * @returns {void} + */ + select(attrs, fn, css_hash, classes, styles, flags, is_rich) { + const { value, ...select_attrs } = attrs; + this.push(``); + this.child((renderer) => { + renderer.local.select_value = value; + fn(renderer); + }); + this.push(`${is_rich ? "" : ""}`); + } + /** + * @param {Record} attrs + * @param {string | number | boolean | ((renderer: Renderer) => void)} body + * @param {string | undefined} [css_hash] + * @param {Record | undefined} [classes] + * @param {Record | undefined} [styles] + * @param {number | undefined} [flags] + * @param {boolean | undefined} [is_rich] + */ + option(attrs, body, css_hash, classes, styles, flags, is_rich) { + this.#out.push(` { + if (has_own_property.call(attrs, "value")) value = attrs.value; + if (value === this.local.select_value) renderer.#out.push(" selected=\"\""); + renderer.#out.push(`>${body}${is_rich ? "" : ""}`); + if (head) renderer.head((child) => child.push(head)); + }; + if (typeof body === "function") this.child((renderer) => { + const r = new Renderer(this.global, this); + body(r); + if (this.global.mode === "async") return r.#collect_content_async().then((content) => { + close(renderer, content.body.replaceAll("", ""), content); + }); + else { + const content = r.#collect_content(); + close(renderer, content.body.replaceAll("", ""), content); + } + }); + else close(this, body, { body: escape_html(body) }); + } + /** + * @param {(renderer: Renderer) => void} fn + */ + title(fn) { + const path = this.get_path(); + /** @param {string} head */ + const close = (head) => { + this.global.set_title(head, path); + }; + this.child((renderer) => { + const r = new Renderer(renderer.global, renderer); + fn(r); + if (renderer.global.mode === "async") return r.#collect_content_async().then((content) => { + close(content.head); + }); + else close(r.#collect_content().head); + }); + } + /** + * @param {string | (() => Promise)} content + */ + push(content) { + if (typeof content === "function") this.child(async (renderer) => renderer.push(await content())); + else this.#out.push(content); + } + /** + * @param {() => void} fn + */ + on_destroy(fn) { + (this.#on_destroy ??= []).push(fn); + } + /** + * @returns {number[]} + */ + get_path() { + return this.#parent ? [...this.#parent.get_path(), this.#parent.#out.indexOf(this)] : []; + } + /** + * @deprecated this is needed for legacy component bindings + */ + copy() { + const copy = new Renderer(this.global, this.#parent); + copy.#out = this.#out.map((item) => item instanceof Renderer ? item.copy() : item); + copy.promise = this.promise; + return copy; + } + /** + * @param {Renderer} other + * @deprecated this is needed for legacy component bindings + */ + subsume(other) { + if (this.global.mode !== other.global.mode) throw new Error("invariant: A renderer cannot switch modes. If you're seeing this, there's a compiler bug. File an issue!"); + this.local = other.local; + this.#out = other.#out.map((item, i) => { + const current = this.#out[i]; + if (current instanceof Renderer && item instanceof Renderer) { + current.subsume(item); + return current; + } + return item; + }); + this.promise = other.promise; + this.type = other.type; + } + get length() { + return this.#out.length; + } + /** + * Creates the hydration comment that marks the start of a failed boundary. + * The error is JSON-serialized and embedded inside an HTML comment for the client + * to parse during hydration. The JSON is escaped to prevent `-->` or ``; + } + /** + * Only available on the server and when compiling with the `server` option. + * Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app. + * @template {Record} Props + * @param {Component} component + * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp }} [options] + * @returns {RenderOutput} + */ + static render(component, options = {}) { + /** @type {AccumulatedContent | undefined} */ + let sync; + /** @type {Promise | undefined} */ + let async; + const result = {}; + Object.defineProperties(result, { + html: { get: () => { + return (sync ??= Renderer.#render(component, options)).body; + } }, + head: { get: () => { + return (sync ??= Renderer.#render(component, options)).head; + } }, + body: { get: () => { + return (sync ??= Renderer.#render(component, options)).body; + } }, + hashes: { value: { script: "" } }, + then: { value: (onfulfilled, onrejected) => { + if (!async_mode_flag) { + const result = sync ??= Renderer.#render(component, options); + const user_result = onfulfilled({ + head: result.head, + body: result.body, + html: result.body, + hashes: { script: [] } + }); + return Promise.resolve(user_result); + } + async ??= init_render_context().then(() => with_render_context(() => Renderer.#render_async(component, options))); + return async.then((result) => { + Object.defineProperty(result, "html", { get: () => { + html_deprecated(); + } }); + return onfulfilled(result); + }, onrejected); + } } + }); + return result; + } + /** + * Collect all of the `onDestroy` callbacks registered during rendering. In an async context, this is only safe to call + * after awaiting `collect_async`. + * + * Child renderers are "porous" and don't affect execution order, but component body renderers + * create ordering boundaries. Within a renderer, callbacks run in order until hitting a component boundary. + * @returns {Iterable<() => void>} + */ + *#collect_on_destroy() { + for (const component of this.#traverse_components()) yield* component.#collect_ondestroy(); + } + /** + * Performs a depth-first search of renderers, yielding the deepest components first, then additional components as we backtrack up the tree. + * @returns {Iterable} + */ + *#traverse_components() { + for (const child of this.#out) if (typeof child !== "string") yield* child.#traverse_components(); + if (this.#is_component_body) yield this; + } + /** + * @returns {Iterable<() => void>} + */ + *#collect_ondestroy() { + if (this.#on_destroy) for (const fn of this.#on_destroy) yield fn; + for (const child of this.#out) if (child instanceof Renderer && !child.#is_component_body) yield* child.#collect_ondestroy(); + } + /** + * Render a component. Throws if any of the children are performing asynchronous work. + * + * @template {Record} Props + * @param {Component} component + * @param {{ props?: Omit; context?: Map; idPrefix?: string }} options + * @returns {AccumulatedContent} + */ + static #render(component, options) { + var previous_context = ssr_context; + try { + const renderer = Renderer.#open_render("sync", component, options); + const content = renderer.#collect_content(); + return Renderer.#close_render(content, renderer); + } finally { + abort(); + set_ssr_context(previous_context); + } + } + /** + * Render a component. + * + * @template {Record} Props + * @param {Component} component + * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp }} options + * @returns {Promise} + */ + static async #render_async(component, options) { + const previous_context = ssr_context; + try { + const renderer = Renderer.#open_render("async", component, options); + const content = await renderer.#collect_content_async(); + const hydratables = await renderer.#collect_hydratables(); + if (hydratables !== null) content.head = hydratables + content.head; + return Renderer.#close_render(content, renderer); + } finally { + set_ssr_context(previous_context); + abort(); + } + } + /** + * Collect all of the code from the `out` array and return it as a string, or a promise resolving to a string. + * @param {AccumulatedContent} content + * @returns {AccumulatedContent} + */ + #collect_content(content = { + head: "", + body: "" + }) { + for (const item of this.#out) if (typeof item === "string") content[this.type] += item; + else if (item instanceof Renderer) item.#collect_content(content); + return content; + } + /** + * Collect all of the code from the `out` array and return it as a string. + * @param {AccumulatedContent} content + * @returns {Promise} + */ + async #collect_content_async(content = { + head: "", + body: "" + }) { + await this.promise; + for (const item of this.#out) if (typeof item === "string") content[this.type] += item; + else if (item instanceof Renderer) if (item.#boundary) { + /** @type {AccumulatedContent} */ + const boundary_content = { + head: "", + body: "" + }; + try { + await item.#collect_content_async(boundary_content); + content.head += boundary_content.head; + content.body += boundary_content.body; + } catch (error) { + const { context, failed, transformError } = item.#boundary; + set_ssr_context(context); + let promise = transformError(error); + set_ssr_context(null); + let transformed = await promise; + set_ssr_context(context); + const failed_renderer = new Renderer(item.global, item); + failed_renderer.type = item.type; + failed_renderer.#out.push(Renderer.#serialize_failed_boundary(transformed)); + failed(failed_renderer, transformed, noop); + failed_renderer.#out.push(BLOCK_CLOSE); + await failed_renderer.#collect_content_async(content); + } + } else await item.#collect_content_async(content); + return content; + } + async #collect_hydratables() { + const ctx = get_render_context().hydratable; + for (const [_, key] of ctx.unresolved_promises) unresolved_hydratable(key, ctx.lookup.get(key)?.stack ?? ""); + for (const comparison of ctx.comparisons) await comparison; + return await this.#hydratable_block(ctx); + } + /** + * @template {Record} Props + * @param {'sync' | 'async'} mode + * @param {import('svelte').Component} component + * @param {{ props?: Omit; context?: Map; idPrefix?: string; csp?: Csp; transformError?: (error: unknown) => unknown }} options + * @returns {Renderer} + */ + static #open_render(mode, component, options) { + if (options.idPrefix?.includes("--")) invalid_id_prefix(); + var previous_context = ssr_context; + try { + const renderer = new Renderer(new SSRState(mode, options.idPrefix ? options.idPrefix + "-" : "", options.csp, options.transformError)); + set_ssr_context({ + p: null, + c: options.context ?? null, + r: renderer + }); + renderer.push(BLOCK_OPEN); + component(renderer, options.props ?? {}); + renderer.push(BLOCK_CLOSE); + return renderer; + } finally { + set_ssr_context(previous_context); + } + } + /** + * @param {AccumulatedContent} content + * @param {Renderer} renderer + * @returns {AccumulatedContent & { hashes: { script: Sha256Source[] } }} + */ + static #close_render(content, renderer) { + for (const cleanup of renderer.#collect_on_destroy()) cleanup(); + let head = content.head + renderer.global.get_title(); + let body = content.body; + for (const { hash, code } of renderer.global.css) head += ``; + return { + head, + body, + hashes: { script: renderer.global.csp.script_hashes } + }; + } + /** + * @param {HydratableContext} ctx + */ + async #hydratable_block(ctx) { + if (ctx.lookup.size === 0) return null; + let entries = []; + let has_promises = false; + for (const [k, v] of ctx.lookup) { + if (v.promises) { + has_promises = true; + for (const p of v.promises) await p; + } + entries.push(`[${devalue.uneval(k)},${v.serialized}]`); + } + let prelude = `const h = (window.__svelte ??= {}).h ??= new Map();`; + if (has_promises) prelude = `const r = (v) => Promise.resolve(v); + ${prelude}`; + const body = ` + { + ${prelude} + + for (const [k, v] of [ + ${entries.join(",\n ")} + ]) { + h.set(k, v); + } + } + `; + let csp_attr = ""; + if (this.global.csp.nonce) csp_attr = ` nonce="${this.global.csp.nonce}"`; + else if (this.global.csp.hash) { + const hash = await sha256(body); + this.global.csp.script_hashes.push(`sha256-${hash}`); + } + return `\n\t\t${body}<\/script>`; + } +}; +var SSRState = class { + /** @readonly @type {Csp & { script_hashes: Sha256Source[] }} */ + csp; + /** @readonly @type {'sync' | 'async'} */ + mode; + /** @readonly @type {() => string} */ + uid; + /** @readonly @type {Set<{ hash: string; code: string }>} */ + css = /* @__PURE__ */ new Set(); + /** + * `transformError` passed to `render`. Called when an error boundary catches an error. + * Throws by default if unset in `render`. + * @type {(error: unknown) => unknown} + */ + transformError; + /** @type {{ path: number[], value: string }} */ + #title = { + path: [], + value: "" + }; + /** + * @param {'sync' | 'async'} mode + * @param {string} id_prefix + * @param {Csp} csp + * @param {((error: unknown) => unknown) | undefined} [transformError] + */ + constructor(mode, id_prefix = "", csp = { hash: false }, transformError) { + this.mode = mode; + this.csp = { + ...csp, + script_hashes: [] + }; + this.transformError = transformError ?? ((error) => { + throw error; + }); + let uid = 1; + this.uid = () => `${id_prefix}s${uid++}`; + } + get_title() { + return this.#title.value; + } + /** + * Performs a depth-first (lexicographic) comparison using the path. Rejects sets + * from earlier than or equal to the current value. + * @param {string} value + * @param {number[]} path + */ + set_title(value, path) { + const current = this.#title.path; + let i = 0; + let l = Math.min(path.length, current.length); + while (i < l && path[i] === current[i]) i += 1; + if (path[i] === void 0) return; + if (current[i] === void 0 || path[i] > current[i]) { + this.#title.path = path; + this.#title.value = value; + } + } +}; +//#endregion +//#region node_modules/svelte/src/internal/server/dev.js +function get_user_code_location() { + return get_stack().filter((line) => line.trim().startsWith("at ")).map((line) => line.replace(/\((.*):\d+:\d+\)$/, (_, file) => `(${file})`)).join("\n"); +} +//#endregion +export { attr as $, get_first_child as A, component_context as B, component_root as C, lifecycle_function_unavailable as Ct, clear_text_content as D, without_reactive_context as E, boundary as F, hydrating as G, push as H, flushSync as I, hydration_mismatch as J, set_hydrate_node as K, readable as L, init_operations as M, mutable_source as N, create_element as O, set as P, rune_outside_svelte as Q, writable as R, set_active_reaction as S, hydratable_serialization_failed as St, render_effect as T, hydrate_next as U, pop as V, hydrate_node as W, state_proxy_unmount as X, lifecycle_double_unmount as Y, hydration_failed as Z, is_passive_event as _, getContext as _t, bind_props as a, async_mode_flag as at, get as b, ssr_context as bt, ensure_array_like as c, REACTION_RAN as ct, render as d, define_property as dt, clsx$1 as et, spread_props as f, noop as ft, html as g, getAllContexts as gt, unsubscribe_stores as h, createContext as ht, attributes as i, get_render_context as it, get_next_sibling as j, create_text as k, head as l, STATE_SYMBOL as lt, stringify as m, run as mt, attr_class as n, ATTACHMENT_KEY as nt, derived as o, getAbortSignal as ot, store_get as p, object_keys as pt, set_hydrating as q, attr_style as r, HYDRATION_ERROR as rt, element as s, LEGACY_PROPS as st, get_user_code_location as t, escape_html as tt, props_id as u, array_from as ut, active_effect as v, hasContext as vt, effect_root as w, experimental_async_required as wt, set_active_effect as x, hydratable_clobbering as xt, active_reaction as y, setContext as yt, queue_micro_task as z }; diff --git a/website/.svelte-kit/output/server/chunks/environment.js b/website/.svelte-kit/output/server/chunks/environment.js new file mode 100644 index 0000000..2467f71 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/environment.js @@ -0,0 +1,45 @@ +//#region node_modules/@sveltejs/kit/src/runtime/app/paths/internal/server.js +var base = ""; +var assets = base; +var app_dir = "_app"; +var initial = { + base, + assets +}; +initial.base; +/** +* @param {{ base: string, assets: string }} paths +*/ +function override(paths) { + base = paths.base; + assets = paths.assets; +} +function reset() { + base = initial.base; + assets = initial.assets; +} +/** @param {string} path */ +function set_assets(path) { + assets = initial.assets = path; +} +/** +* `$env/dynamic/public` +* @type {Record} +*/ +var public_env = {}; +/** @type {(environment: Record) => void} */ +function set_private_env(environment) {} +/** @type {(environment: Record) => void} */ +function set_public_env(environment) { + public_env = environment; +} +//#endregion +//#region \0virtual:__sveltekit/environment +var version = "1780713979666"; +var prerendering = false; +function set_building() {} +function set_prerendering() { + prerendering = true; +} +//#endregion +export { public_env as a, app_dir as c, override as d, reset as f, version as i, assets as l, set_building as n, set_private_env as o, set_assets as p, set_prerendering as r, set_public_env as s, prerendering as t, base as u }; diff --git a/website/.svelte-kit/output/server/chunks/exports.js b/website/.svelte-kit/output/server/chunks/exports.js new file mode 100644 index 0000000..89f5cab --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/exports.js @@ -0,0 +1,370 @@ +import "./dev.js"; +//#region node_modules/@sveltejs/kit/src/utils/array.js +/** +* Removes nullish values from an array. +* +* @template T +* @param {Array} arr +*/ +function compact(arr) { + return arr.filter( + /** @returns {val is NonNullable} */ + (val) => val != null + ); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/pathname.js +var DATA_SUFFIX = "/__data.json"; +var HTML_DATA_SUFFIX = ".html__data.json"; +/** @param {string} pathname */ +function has_data_suffix(pathname) { + return pathname.endsWith(DATA_SUFFIX) || pathname.endsWith(HTML_DATA_SUFFIX); +} +/** @param {string} pathname */ +function add_data_suffix(pathname) { + if (pathname.endsWith(".html")) return pathname.replace(/\.html$/, HTML_DATA_SUFFIX); + return pathname.replace(/\/$/, "") + DATA_SUFFIX; +} +/** @param {string} pathname */ +function strip_data_suffix(pathname) { + if (pathname.endsWith(HTML_DATA_SUFFIX)) return pathname.slice(0, -16) + ".html"; + return pathname.slice(0, -12); +} +var ROUTE_SUFFIX = "/__route.js"; +/** +* @param {string} pathname +* @returns {boolean} +*/ +function has_resolution_suffix(pathname) { + return pathname.endsWith(ROUTE_SUFFIX); +} +/** +* Convert a regular URL to a route to send to SvelteKit's server-side route resolution endpoint +* @param {string} pathname +* @returns {string} +*/ +function add_resolution_suffix(pathname) { + return pathname.replace(/\/$/, "") + ROUTE_SUFFIX; +} +/** +* @param {string} pathname +* @returns {string} +*/ +function strip_resolution_suffix(pathname) { + return pathname.slice(0, -11); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/telemetry/noop.js +/** +* @type {Span} +*/ +var noop_span = { + spanContext() { + return noop_span_context; + }, + setAttribute() { + return this; + }, + setAttributes() { + return this; + }, + addEvent() { + return this; + }, + setStatus() { + return this; + }, + updateName() { + return this; + }, + end() { + return this; + }, + isRecording() { + return false; + }, + recordException() { + return this; + }, + addLink() { + return this; + }, + addLinks() { + return this; + } +}; +/** +* @type {SpanContext} +*/ +var noop_span_context = { + traceId: "", + spanId: "", + traceFlags: 0 +}; +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/url.js +/** +* Matches a URI scheme. See https://www.rfc-editor.org/rfc/rfc3986#section-3.1 +* @type {RegExp} +*/ +var SCHEME = /^[a-z][a-z\d+\-.]+:/i; +var internal = new URL("sveltekit-internal://"); +/** +* @param {string} base +* @param {string} path +*/ +function resolve(base, path) { + if (path[0] === "/" && path[1] === "/") return path; + let url = new URL(base, internal); + url = new URL(path, url); + return url.protocol === internal.protocol ? url.pathname + url.search + url.hash : url.href; +} +/** +* @param {string} path +* @param {import('types').TrailingSlash} trailing_slash +*/ +function normalize_path(path, trailing_slash) { + if (path === "/" || trailing_slash === "ignore") return path; + if (trailing_slash === "never") return path.endsWith("/") ? path.slice(0, -1) : path; + else if (trailing_slash === "always" && !path.endsWith("/")) return path + "/"; + return path; +} +/** +* Decode pathname excluding %25 to prevent further double decoding of params +* @param {string} pathname +*/ +function decode_pathname(pathname) { + return pathname.split("%25").map(decodeURI).join("%25"); +} +/** @param {Record} params */ +function decode_params(params) { + for (const key in params) params[key] = decodeURIComponent(params[key]); + return params; +} +/** +* @param {URL} url +* @param {() => void} callback +* @param {(search_param: string) => void} search_params_callback +* @param {boolean} [allow_hash] +*/ +function make_trackable(url, callback, search_params_callback, allow_hash = false) { + const tracked = new URL(url); + Object.defineProperty(tracked, "searchParams", { + value: new Proxy(tracked.searchParams, { get(obj, key) { + if (key === "get" || key === "getAll" || key === "has") return (param, ...rest) => { + search_params_callback(param); + return obj[key](param, ...rest); + }; + callback(); + const value = Reflect.get(obj, key); + return typeof value === "function" ? value.bind(obj) : value; + } }), + enumerable: true, + configurable: true + }); + /** + * URL properties that could change during the lifetime of the page, + * which excludes things like `origin` + */ + const tracked_url_properties = [ + "href", + "pathname", + "search", + "toString", + "toJSON" + ]; + if (allow_hash) tracked_url_properties.push("hash"); + for (const property of tracked_url_properties) Object.defineProperty(tracked, property, { + get() { + callback(); + return url[property]; + }, + enumerable: true, + configurable: true + }); + tracked[Symbol.for("nodejs.util.inspect.custom")] = (_depth, opts, inspect) => { + return inspect(url, opts); + }; + tracked.searchParams[Symbol.for("nodejs.util.inspect.custom")] = (_depth, opts, inspect) => { + return inspect(url.searchParams, opts); + }; + if (!allow_hash) disable_hash(tracked); + return tracked; +} +/** +* Disallow access to `url.hash` on the server and in `load` +* @param {URL} url +*/ +function disable_hash(url) { + allow_nodejs_console_log(url); + Object.defineProperty(url, "hash", { get() { + throw new Error("Cannot access event.url.hash. Consider using `page.url.hash` inside a component instead"); + } }); +} +/** +* Disallow access to `url.search` and `url.searchParams` during prerendering +* @param {URL} url +*/ +function disable_search(url) { + allow_nodejs_console_log(url); + for (const property of ["search", "searchParams"]) Object.defineProperty(url, property, { get() { + throw new Error(`Cannot access url.${property} on a page with prerendering enabled`); + } }); +} +/** +* Allow URL to be console logged, bypassing disabled properties. +* @param {URL} url +*/ +function allow_nodejs_console_log(url) { + url[Symbol.for("nodejs.util.inspect.custom")] = (_depth, opts, inspect) => { + return inspect(new URL(url), opts); + }; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/hash.js +/** +* Hash using djb2 +* @param {import('types').StrictBody[]} values +*/ +function hash(...values) { + let hash = 5381; + for (const value of values) if (typeof value === "string") { + let i = value.length; + while (i) hash = hash * 33 ^ value.charCodeAt(--i); + } else if (ArrayBuffer.isView(value)) { + const buffer = new Uint8Array(value.buffer, value.byteOffset, value.byteLength); + let i = buffer.length; + while (i) hash = hash * 33 ^ buffer[--i]; + } else throw new TypeError("value must be a string or TypedArray"); + return (hash >>> 0).toString(36); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/routing.js +/** +* @param {RegExpMatchArray} match +* @param {import('types').RouteParam[]} params +* @param {Record} matchers +*/ +function exec(match, params, matchers) { + /** @type {Record} */ + const result = {}; + const values = match.slice(1); + const values_needing_match = values.filter((value) => value !== void 0); + let buffered = 0; + for (let i = 0; i < params.length; i += 1) { + const param = params[i]; + let value = values[i - buffered]; + if (param.chained && param.rest && buffered) { + value = values.slice(i - buffered, i + 1).filter((s) => s).join("/"); + buffered = 0; + } + if (value === void 0) if (param.rest) value = ""; + else continue; + if (!param.matcher || matchers[param.matcher](value)) { + result[param.name] = value; + const next_param = params[i + 1]; + const next_value = values[i + 1]; + if (next_param && !next_param.rest && next_param.optional && next_value && param.chained) buffered = 0; + if (!next_param && !next_value && Object.keys(result).length === values_needing_match.length) buffered = 0; + continue; + } + if (param.optional && param.chained) { + buffered++; + continue; + } + return; + } + if (buffered) return; + return result; +} +/** +* Find the first route that matches the given path +* @template {{pattern: RegExp, params: import('types').RouteParam[]}} Route +* @param {string} path - The decoded pathname to match +* @param {Route[]} routes +* @param {Record} matchers +* @returns {{ route: Route, params: Record } | null} +*/ +function find_route(path, routes, matchers) { + for (const route of routes) { + const match = route.pattern.exec(path); + if (!match) continue; + const matched = exec(match, route.params, matchers); + if (matched) return { + route, + params: decode_params(matched) + }; + } + return null; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/exports.js +/** +* @param {Set} expected +*/ +function validator(expected) { + /** + * @param {any} module + * @param {string} [file] + */ + function validate(module, file) { + if (!module) return; + for (const key in module) { + if (key[0] === "_" || expected.has(key)) continue; + const values = [...expected.values()]; + const hint = hint_for_supported_files(key, file?.slice(file.lastIndexOf("."))) ?? `valid exports are ${values.join(", ")}, or anything with a '_' prefix`; + throw new Error(`Invalid export '${key}'${file ? ` in ${file}` : ""} (${hint})`); + } + } + return validate; +} +/** +* @param {string} key +* @param {string} ext +* @returns {string | void} +*/ +function hint_for_supported_files(key, ext = ".js") { + const supported_files = []; + if (valid_layout_exports.has(key)) supported_files.push(`+layout${ext}`); + if (valid_page_exports.has(key)) supported_files.push(`+page${ext}`); + if (valid_layout_server_exports.has(key)) supported_files.push(`+layout.server${ext}`); + if (valid_page_server_exports.has(key)) supported_files.push(`+page.server${ext}`); + if (valid_server_exports.has(key)) supported_files.push(`+server${ext}`); + if (supported_files.length > 0) return `'${key}' is a valid export in ${supported_files.slice(0, -1).join(", ")}${supported_files.length > 1 ? " or " : ""}${supported_files.at(-1)}`; +} +var valid_layout_exports = new Set([ + "load", + "prerender", + "csr", + "ssr", + "trailingSlash", + "config" +]); +var valid_page_exports = new Set([...valid_layout_exports, "entries"]); +var valid_layout_server_exports = new Set([...valid_layout_exports]); +var valid_page_server_exports = new Set([ + ...valid_layout_server_exports, + "actions", + "entries" +]); +var valid_server_exports = new Set([ + "GET", + "POST", + "PATCH", + "PUT", + "DELETE", + "OPTIONS", + "HEAD", + "fallback", + "prerender", + "trailingSlash", + "config", + "entries" +]); +var validate_layout_exports = validator(valid_layout_exports); +var validate_page_exports = validator(valid_page_exports); +var validate_layout_server_exports = validator(valid_layout_server_exports); +var validate_page_server_exports = validator(valid_page_server_exports); +var validate_server_exports = validator(valid_server_exports); +//#endregion +export { compact as S, add_resolution_suffix as _, validate_server_exports as a, strip_data_suffix as b, SCHEME as c, disable_search as d, make_trackable as f, add_data_suffix as g, noop_span as h, validate_page_server_exports as i, decode_params as l, resolve as m, validate_layout_server_exports as n, find_route as o, normalize_path as p, validate_page_exports as r, hash as s, validate_layout_exports as t, decode_pathname as u, has_data_suffix as v, strip_resolution_suffix as x, has_resolution_suffix as y }; diff --git a/website/.svelte-kit/output/server/chunks/index-server.js b/website/.svelte-kit/output/server/chunks/index-server.js new file mode 100644 index 0000000..3095122 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/index-server.js @@ -0,0 +1,145 @@ +import { Ct as lifecycle_function_unavailable, St as hydratable_serialization_failed, _t as getContext, at as async_mode_flag, bt as ssr_context, ft as noop, gt as getAllContexts, ht as createContext, it as get_render_context, mt as run, ot as getAbortSignal, vt as hasContext, wt as experimental_async_required, yt as setContext } from "./dev.js"; +import * as devalue from "devalue"; +//#region \0rolldown/runtime.js +var __defProp = Object.defineProperty; +var __exportAll = (all, no_symbols) => { + let target = {}; + for (var name in all) __defProp(target, name, { + get: all[name], + enumerable: true + }); + if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" }); + return target; +}; +//#endregion +//#region node_modules/svelte/src/internal/server/hydratable.js +/** @import { HydratableLookupEntry } from '#server' */ +/** +* @template T +* @param {string} key +* @param {() => T} fn +* @returns {T} +*/ +function hydratable(key, fn) { + if (!async_mode_flag) experimental_async_required("hydratable"); + const { hydratable } = get_render_context(); + let entry = hydratable.lookup.get(key); + if (entry !== void 0) return entry.value; + const value = fn(); + entry = encode(key, value, hydratable.unresolved_promises); + hydratable.lookup.set(key, entry); + return value; +} +/** +* @param {string} key +* @param {any} value +* @param {Map, string>} [unresolved] +*/ +function encode(key, value, unresolved) { + /** @type {HydratableLookupEntry} */ + const entry = { + value, + serialized: "" + }; + let uid = 1; + entry.serialized = devalue.uneval(entry.value, (value, uneval) => { + if (is_promise(value)) { + const placeholder = `"${uid++}"`; + const p = value.then((v) => { + entry.serialized = entry.serialized.replace(placeholder, () => `r(${uneval(v)})`); + }).catch((devalue_error) => hydratable_serialization_failed(key, serialization_stack(entry.stack, devalue_error?.stack))); + unresolved?.set(p, key); + p.catch(() => {}).finally(() => unresolved?.delete(p)); + (entry.promises ??= []).push(p); + return placeholder; + } + }); + return entry; +} +/** +* @param {any} value +* @returns {value is Promise} +*/ +function is_promise(value) { + return Object.prototype.toString.call(value) === "[object Promise]"; +} +/** +* @param {string | undefined} root_stack +* @param {string | undefined} uneval_stack +*/ +function serialization_stack(root_stack, uneval_stack) { + let out = ""; + if (root_stack) out += root_stack + "\n"; + if (uneval_stack) out += "Caused by:\n" + uneval_stack + "\n"; + return out || ""; +} +//#endregion +//#region node_modules/svelte/src/internal/server/blocks/snippet.js +/** @import { Snippet } from 'svelte' */ +/** @import { Renderer } from '../renderer' */ +/** @import { Getters } from '#shared' */ +/** +* Create a snippet programmatically +* @template {unknown[]} Params +* @param {(...params: Getters) => { +* render: () => string +* setup?: (element: Element) => void | (() => void) +* }} fn +* @returns {Snippet} +*/ +function createRawSnippet(fn) { + return (renderer, ...args) => { + var getters = args.map((value) => () => value); + renderer.push(fn(...getters).render().trim()); + }; +} +//#endregion +//#region node_modules/svelte/src/index-server.js +/** @import { SSRContext } from '#server' */ +/** @import { Renderer } from './internal/server/renderer.js' */ +var index_server_exports = /* @__PURE__ */ __exportAll({ + afterUpdate: () => noop, + beforeUpdate: () => noop, + createContext: () => createContext, + createEventDispatcher: () => createEventDispatcher, + createRawSnippet: () => createRawSnippet, + flushSync: () => noop, + fork: () => fork, + getAbortSignal: () => getAbortSignal, + getAllContexts: () => getAllContexts, + getContext: () => getContext, + hasContext: () => hasContext, + hydratable: () => hydratable, + hydrate: () => hydrate, + mount: () => mount, + onDestroy: () => onDestroy, + onMount: () => noop, + setContext: () => setContext, + settled: () => settled, + tick: () => tick, + unmount: () => unmount, + untrack: () => run +}); +/** @param {() => void} fn */ +function onDestroy(fn) { + /** @type {Renderer} */ ssr_context.r.on_destroy(fn); +} +function createEventDispatcher() { + return noop; +} +function mount() { + lifecycle_function_unavailable("mount"); +} +function hydrate() { + lifecycle_function_unavailable("hydrate"); +} +function unmount() { + lifecycle_function_unavailable("unmount"); +} +function fork() { + lifecycle_function_unavailable("fork"); +} +async function tick() {} +async function settled() {} +//#endregion +export { hydratable as i, settled as n, tick as r, index_server_exports as t }; diff --git a/website/.svelte-kit/output/server/chunks/internal.js b/website/.svelte-kit/output/server/chunks/internal.js new file mode 100644 index 0000000..93b07ab --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/internal.js @@ -0,0 +1,226 @@ +import "./index-server.js"; +import "./environment.js"; +import { at as async_mode_flag, d as render, o as derived, yt as setContext } from "./dev.js"; +import { t as asClassComponent$1 } from "./legacy-client.js"; +//#region \0virtual:__sveltekit/server +var read_implementation = null; +function set_read_implementation(fn) { + read_implementation = fn; +} +function set_manifest(_) {} +//#endregion +//#region node_modules/svelte/src/legacy/legacy-server.js +/** @import { SvelteComponent } from '../index.js' */ +/** @import { Csp } from '#server' */ +/** @typedef {{ head: string, html: string, css: { code: string, map: null }; hashes?: { script: `sha256-${string}`[] } }} LegacyRenderResult */ +/** +* Takes a Svelte 5 component and returns a Svelte 4 compatible component constructor. +* +* @deprecated Use this only as a temporary solution to migrate your imperative component code to Svelte 5. +* +* @template {Record} Props +* @template {Record} Exports +* @template {Record} Events +* @template {Record} Slots +* +* @param {SvelteComponent} component +* @returns {typeof SvelteComponent & Exports} +*/ +function asClassComponent(component) { + const component_constructor = asClassComponent$1(component); + /** @type {(props?: {}, opts?: { $$slots?: {}; context?: Map; csp?: Csp; transformError?: (error: unknown) => unknown }) => LegacyRenderResult & PromiseLike } */ + const _render = (props, { context, csp, transformError } = {}) => { + const result = render(component, { + props, + context, + csp, + transformError + }); + const munged = Object.defineProperties({}, { + css: { value: { + code: "", + map: null + } }, + head: { get: () => result.head }, + html: { get: () => result.body }, + then: { + /** + * this is not type-safe, but honestly it's the best I can do right now, and it's a straightforward function. + * + * @template TResult1 + * @template [TResult2=never] + * @param { (value: LegacyRenderResult) => TResult1 } onfulfilled + * @param { (reason: unknown) => TResult2 } onrejected + */ +value: (onfulfilled, onrejected) => { + if (!async_mode_flag) { + const user_result = onfulfilled({ + css: munged.css, + head: munged.head, + html: munged.html + }); + return Promise.resolve(user_result); + } + return result.then((result) => { + return onfulfilled({ + css: munged.css, + head: result.head, + html: result.body, + hashes: result.hashes + }); + }, onrejected); + } } + }); + return munged; + }; + component_constructor.render = _render; + return component_constructor; +} +//#endregion +//#region .svelte-kit/generated/root.svelte +function Root($$renderer, $$props) { + $$renderer.component(($$renderer) => { + let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null, data_2 = null } = $$props; + setContext("__svelte__", stores); + stores.page.set(page); + const Pyramid_2 = derived(() => constructors[2]); + if (constructors[1]) { + $$renderer.push(""); + const Pyramid_0 = constructors[0]; + if (Pyramid_0) { + $$renderer.push(""); + Pyramid_0($$renderer, { + data: data_0, + form, + params: page.params, + children: ($$renderer) => { + if (constructors[2]) { + $$renderer.push(""); + const Pyramid_1 = constructors[1]; + if (Pyramid_1) { + $$renderer.push(""); + Pyramid_1($$renderer, { + data: data_1, + form, + params: page.params, + children: ($$renderer) => { + if (Pyramid_2()) { + $$renderer.push(""); + Pyramid_2()($$renderer, { + data: data_2, + form, + params: page.params + }); + $$renderer.push(""); + } else { + $$renderer.push(""); + $$renderer.push(""); + } + }, + $$slots: { default: true } + }); + $$renderer.push(""); + } else { + $$renderer.push(""); + $$renderer.push(""); + } + } else { + $$renderer.push(""); + const Pyramid_1 = constructors[1]; + if (Pyramid_1) { + $$renderer.push(""); + Pyramid_1($$renderer, { + data: data_1, + form, + params: page.params + }); + $$renderer.push(""); + } else { + $$renderer.push(""); + $$renderer.push(""); + } + } + $$renderer.push(``); + }, + $$slots: { default: true } + }); + $$renderer.push(""); + } else { + $$renderer.push(""); + $$renderer.push(""); + } + } else { + $$renderer.push(""); + const Pyramid_0 = constructors[0]; + if (Pyramid_0) { + $$renderer.push(""); + Pyramid_0($$renderer, { + data: data_0, + form, + params: page.params + }); + $$renderer.push(""); + } else { + $$renderer.push(""); + $$renderer.push(""); + } + } + $$renderer.push(` `); + $$renderer.push(""); + $$renderer.push(``); + }); +} +//#endregion +//#region .svelte-kit/generated/server/internal.js +var options = { + app_template_contains_nonce: false, + async: false, + csp: { + "mode": "auto", + "directives": { + "upgrade-insecure-requests": false, + "block-all-mixed-content": false + }, + "reportOnly": { + "upgrade-insecure-requests": false, + "block-all-mixed-content": false + } + }, + csrf_check_origin: true, + csrf_trusted_origins: [], + embedded: false, + env_public_prefix: "PUBLIC_", + env_private_prefix: "", + hash_routing: false, + hooks: null, + preload_strategy: "modulepreload", + root: asClassComponent(Root), + service_worker: false, + service_worker_options: void 0, + server_error_boundaries: false, + templates: { + app: ({ head, body, assets, nonce, env }) => "\n\n \n \n \n \n \n \n\n cora — AI Code Review CLI\n \n\n \n \n \n \n \n \n\n " + head + "\n \n \n
      " + body + "
      \n \n\n", + error: ({ status, message }) => "\n\n \n \n " + message + "\n\n \n \n \n
      \n " + status + "\n
      \n

      " + message + "

      \n
      \n
      \n \n\n" + }, + version_hash: "op75zz" +}; +async function get_hooks() { + let handle; + let handleFetch; + let handleError; + let handleValidationError; + let init; + let reroute; + let transport; + return { + handle, + handleFetch, + handleError, + handleValidationError, + init, + reroute, + transport + }; +} +//#endregion +export { set_read_implementation as a, set_manifest as i, options as n, read_implementation as r, get_hooks as t }; diff --git a/website/.svelte-kit/output/server/chunks/legacy-client.js b/website/.svelte-kit/output/server/chunks/legacy-client.js new file mode 100644 index 0000000..3951f2d --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/legacy-client.js @@ -0,0 +1,475 @@ +import { A as get_first_child, B as component_context, C as component_root, D as clear_text_content, E as without_reactive_context, F as boundary, G as hydrating, H as push, I as flushSync, J as hydration_mismatch, K as set_hydrate_node, M as init_operations, N as mutable_source, P as set, S as set_active_reaction, U as hydrate_next, V as pop, W as hydrate_node, Z as hydration_failed, _ as is_passive_event, at as async_mode_flag, b as get, dt as define_property, j as get_next_sibling, k as create_text, q as set_hydrating, rt as HYDRATION_ERROR, st as LEGACY_PROPS, ut as array_from, v as active_effect, x as set_active_effect, y as active_reaction, z as queue_micro_task } from "./dev.js"; +//#region node_modules/svelte/src/internal/client/dom/elements/events.js +/** +* Used on elements, as a map of event type -> event handler, +* and on events themselves to track which element handled an event +*/ +var event_symbol = Symbol("events"); +/** @type {Set} */ +var all_registered_events = /* @__PURE__ */ new Set(); +/** @type {Set<(events: Array) => void>} */ +var root_event_handles = /* @__PURE__ */ new Set(); +/** +* @param {string} event_name +* @param {EventTarget} dom +* @param {EventListener} [handler] +* @param {AddEventListenerOptions} [options] +*/ +function create_event(event_name, dom, handler, options = {}) { + /** + * @this {EventTarget} + */ + function target_handler(event) { + if (!options.capture) handle_event_propagation.call(dom, event); + if (!event.cancelBubble) return without_reactive_context(() => { + return handler?.call(this, event); + }); + } + if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") queue_micro_task(() => { + dom.addEventListener(event_name, target_handler, options); + }); + else dom.addEventListener(event_name, target_handler, options); + return target_handler; +} +/** +* Attaches an event handler to an element and returns a function that removes the handler. Using this +* rather than `addEventListener` will preserve the correct order relative to handlers added declaratively +* (with attributes like `onclick`), which use event delegation for performance reasons +* +* @param {EventTarget} element +* @param {string} type +* @param {EventListener} handler +* @param {AddEventListenerOptions} [options] +*/ +function on(element, type, handler, options = {}) { + var target_handler = create_event(type, element, handler, options); + return () => { + element.removeEventListener(type, target_handler, options); + }; +} +var last_propagated_event = null; +/** +* @this {EventTarget} +* @param {Event} event +* @returns {void} +*/ +function handle_event_propagation(event) { + var handler_element = this; + var owner_document = handler_element.ownerDocument; + var event_name = event.type; + var path = event.composedPath?.() || []; + var current_target = path[0] || event.target; + last_propagated_event = event; + var path_idx = 0; + var handled_at = last_propagated_event === event && event[event_symbol]; + if (handled_at) { + var at_idx = path.indexOf(handled_at); + if (at_idx !== -1 && (handler_element === document || handler_element === window)) { + event[event_symbol] = handler_element; + return; + } + var handler_idx = path.indexOf(handler_element); + if (handler_idx === -1) return; + if (at_idx <= handler_idx) path_idx = at_idx; + } + current_target = path[path_idx] || event.target; + if (current_target === handler_element) return; + define_property(event, "currentTarget", { + configurable: true, + get() { + return current_target || owner_document; + } + }); + var previous_reaction = active_reaction; + var previous_effect = active_effect; + set_active_reaction(null); + set_active_effect(null); + try { + /** + * @type {unknown} + */ + var throw_error; + /** + * @type {unknown[]} + */ + var other_errors = []; + while (current_target !== null) { + if (current_target === handler_element) break; + try { + var delegated = current_target[event_symbol]?.[event_name]; + if (delegated != null && (!current_target.disabled || event.target === current_target)) delegated.call(current_target, event); + } catch (error) { + if (throw_error) other_errors.push(error); + else throw_error = error; + } + if (event.cancelBubble) break; + path_idx++; + current_target = path_idx < path.length ? path[path_idx] : null; + } + if (throw_error) { + for (let error of other_errors) queueMicrotask(() => { + throw error; + }); + throw throw_error; + } + } finally { + event[event_symbol] = handler_element; + delete event.currentTarget; + set_active_reaction(previous_reaction); + set_active_effect(previous_effect); + } +} +globalThis?.window?.trustedTypes; +//#endregion +//#region node_modules/svelte/src/internal/client/dom/template.js +/** @import { Effect, EffectNodes, TemplateNode } from '#client' */ +/** @import { TemplateStructure } from './types' */ +/** +* @param {TemplateNode} start +* @param {TemplateNode | null} end +*/ +function assign_nodes(start, end) { + var effect = active_effect; + if (effect.nodes === null) effect.nodes = { + start, + end, + a: null, + t: null + }; +} +/** +* Assign the created (or in hydration mode, traversed) dom elements to the current block +* and insert the elements into the dom (in client mode). +* @param {Text | Comment | Element} anchor +* @param {DocumentFragment | Element} dom +*/ +function append(anchor, dom) { + if (hydrating) { + var effect = active_effect; + if ((effect.f & 32768) === 0 || effect.nodes.end === null) effect.nodes.end = hydrate_node; + hydrate_next(); + return; + } + if (anchor === null) return; + anchor.before(dom); +} +/** +* Mounts a component to the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component. +* Transitions will play during the initial render unless the `intro` option is set to `false`. +* +* @template {Record} Props +* @template {Record} Exports +* @param {ComponentType> | Component} component +* @param {MountOptions} options +* @returns {Exports} +*/ +function mount(component, options) { + return _mount(component, options); +} +/** +* Hydrates a component on the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component +* +* @template {Record} Props +* @template {Record} Exports +* @param {ComponentType> | Component} component +* @param {{} extends Props ? { +* target: Document | Element | ShadowRoot; +* props?: Props; +* events?: Record any>; +* context?: Map; +* intro?: boolean; +* recover?: boolean; +* transformError?: (error: unknown) => unknown; +* } : { +* target: Document | Element | ShadowRoot; +* props: Props; +* events?: Record any>; +* context?: Map; +* intro?: boolean; +* recover?: boolean; +* transformError?: (error: unknown) => unknown; +* }} options +* @returns {Exports} +*/ +function hydrate(component, options) { + init_operations(); + options.intro = options.intro ?? false; + const target = options.target; + const was_hydrating = hydrating; + const previous_hydrate_node = hydrate_node; + try { + var anchor = /* @__PURE__ */ get_first_child(target); + while (anchor && (anchor.nodeType !== 8 || anchor.data !== "[")) anchor = /* @__PURE__ */ get_next_sibling(anchor); + if (!anchor) throw HYDRATION_ERROR; + set_hydrating(true); + set_hydrate_node(anchor); + const instance = _mount(component, { + ...options, + anchor + }); + set_hydrating(false); + return instance; + } catch (error) { + if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) throw error; + if (error !== HYDRATION_ERROR) console.warn("Failed to hydrate: ", error); + if (options.recover === false) hydration_failed(); + init_operations(); + clear_text_content(target); + set_hydrating(false); + return mount(component, options); + } finally { + set_hydrating(was_hydrating); + set_hydrate_node(previous_hydrate_node); + } +} +/** @type {Map>} */ +var listeners = /* @__PURE__ */ new Map(); +/** +* @template {Record} Exports +* @param {ComponentType> | Component} Component +* @param {MountOptions} options +* @returns {Exports} +*/ +function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { + init_operations(); + /** @type {Exports} */ + var component = void 0; + var unmount = component_root(() => { + var anchor_node = anchor ?? target.appendChild(create_text()); + boundary(anchor_node, { pending: () => {} }, (anchor_node) => { + push({}); + var ctx = component_context; + if (context) ctx.c = context; + if (events) + /** @type {any} */ props.$$events = events; + if (hydrating) assign_nodes(anchor_node, null); + component = Component(anchor_node, props) || {}; + if (hydrating) { + /** @type {Effect & { nodes: EffectNodes }} */ active_effect.nodes.end = hydrate_node; + if (hydrate_node === null || hydrate_node.nodeType !== 8 || hydrate_node.data !== "]") { + hydration_mismatch(); + throw HYDRATION_ERROR; + } + } + pop(); + }, transformError); + /** @type {Set} */ + var registered_events = /* @__PURE__ */ new Set(); + /** @param {Array} events */ + var event_handle = (events) => { + for (var i = 0; i < events.length; i++) { + var event_name = events[i]; + if (registered_events.has(event_name)) continue; + registered_events.add(event_name); + var passive = is_passive_event(event_name); + for (const node of [target, document]) { + var counts = listeners.get(node); + if (counts === void 0) { + counts = /* @__PURE__ */ new Map(); + listeners.set(node, counts); + } + var count = counts.get(event_name); + if (count === void 0) { + node.addEventListener(event_name, handle_event_propagation, { passive }); + counts.set(event_name, 1); + } else counts.set(event_name, count + 1); + } + } + }; + event_handle(array_from(all_registered_events)); + root_event_handles.add(event_handle); + return () => { + for (var event_name of registered_events) for (const node of [target, document]) { + var counts = listeners.get(node); + var count = counts.get(event_name); + if (--count == 0) { + node.removeEventListener(event_name, handle_event_propagation); + counts.delete(event_name); + if (counts.size === 0) listeners.delete(node); + } else counts.set(event_name, count); + } + root_event_handles.delete(event_handle); + if (anchor_node !== anchor) anchor_node.parentNode?.removeChild(anchor_node); + }; + }); + mounted_components.set(component, unmount); + return component; +} +/** +* References of the components that were mounted or hydrated. +* Uses a `WeakMap` to avoid memory leaks. +*/ +var mounted_components = /* @__PURE__ */ new WeakMap(); +/** +* Unmounts a component that was previously mounted using `mount` or `hydrate`. +* +* Since 5.13.0, if `options.outro` is `true`, [transitions](https://svelte.dev/docs/svelte/transition) will play before the component is removed from the DOM. +* +* Returns a `Promise` that resolves after transitions have completed if `options.outro` is true, or immediately otherwise (prior to 5.13.0, returns `void`). +* +* ```js +* import { mount, unmount } from 'svelte'; +* import App from './App.svelte'; +* +* const app = mount(App, { target: document.body }); +* +* // later... +* unmount(app, { outro: true }); +* ``` +* @param {Record} component +* @param {{ outro?: boolean }} [options] +* @returns {Promise} +*/ +function unmount(component, options) { + const fn = mounted_components.get(component); + if (fn) { + mounted_components.delete(component); + return fn(options); + } + return Promise.resolve(); +} +//#endregion +//#region node_modules/svelte/src/legacy/legacy-client.js +/** @import { ComponentConstructorOptions, ComponentType, SvelteComponent, Component } from 'svelte' */ +/** +* Takes the same options as a Svelte 4 component and the component function and returns a Svelte 4 compatible component. +* +* @deprecated Use this only as a temporary solution to migrate your imperative component code to Svelte 5. +* +* @template {Record} Props +* @template {Record} Exports +* @template {Record} Events +* @template {Record} Slots +* +* @param {ComponentConstructorOptions & { +* component: ComponentType> | Component; +* }} options +* @returns {SvelteComponent & Exports} +*/ +function createClassComponent(options) { + return new Svelte4Component(options); +} +/** +* Takes the component function and returns a Svelte 4 compatible component constructor. +* +* @deprecated Use this only as a temporary solution to migrate your imperative component code to Svelte 5. +* +* @template {Record} Props +* @template {Record} Exports +* @template {Record} Events +* @template {Record} Slots +* +* @param {SvelteComponent | Component} component +* @returns {ComponentType & Exports>} +*/ +function asClassComponent(component) { + return class extends Svelte4Component { + /** @param {any} options */ + constructor(options) { + super({ + component, + ...options + }); + } + }; +} +/** +* Support using the component as both a class and function during the transition period +* @typedef {{new (o: ComponentConstructorOptions): SvelteComponent;(...args: Parameters>>): ReturnType, Record>>;}} LegacyComponentType +*/ +var Svelte4Component = class { + /** @type {any} */ + #events; + /** @type {Record} */ + #instance; + /** + * @param {ComponentConstructorOptions & { + * component: any; + * }} options + */ + constructor(options) { + var sources = /* @__PURE__ */ new Map(); + /** + * @param {string | symbol} key + * @param {unknown} value + */ + var add_source = (key, value) => { + var s = /* @__PURE__ */ mutable_source(value, false, false); + sources.set(key, s); + return s; + }; + const props = new Proxy({ + ...options.props || {}, + $$events: {} + }, { + get(target, prop) { + return get(sources.get(prop) ?? add_source(prop, Reflect.get(target, prop))); + }, + has(target, prop) { + if (prop === LEGACY_PROPS) return true; + get(sources.get(prop) ?? add_source(prop, Reflect.get(target, prop))); + return Reflect.has(target, prop); + }, + set(target, prop, value) { + set(sources.get(prop) ?? add_source(prop, value), value); + return Reflect.set(target, prop, value); + } + }); + this.#instance = (options.hydrate ? hydrate : mount)(options.component, { + target: options.target, + anchor: options.anchor, + props, + context: options.context, + intro: options.intro ?? false, + recover: options.recover, + transformError: options.transformError + }); + if (!async_mode_flag && (!options?.props?.$$host || options.sync === false)) flushSync(); + this.#events = props.$$events; + for (const key of Object.keys(this.#instance)) { + if (key === "$set" || key === "$destroy" || key === "$on") continue; + define_property(this, key, { + get() { + return this.#instance[key]; + }, + /** @param {any} value */ + set(value) { + this.#instance[key] = value; + }, + enumerable: true + }); + } + this.#instance.$set = (next) => { + Object.assign(props, next); + }; + this.#instance.$destroy = () => { + unmount(this.#instance); + }; + } + /** @param {Record} props */ + $set(props) { + this.#instance.$set(props); + } + /** + * @param {string} event + * @param {(...args: any[]) => any} callback + * @returns {any} + */ + $on(event, callback) { + this.#events[event] = this.#events[event] || []; + /** @param {any[]} args */ + const cb = (...args) => callback.call(this, ...args); + this.#events[event].push(cb); + return () => { + this.#events[event] = this.#events[event].filter( + /** @param {any} fn */ + (fn) => fn !== cb + ); + }; + } + $destroy() { + this.#instance.$destroy(); + } +}; +//#endregion +export { on as i, createClassComponent as n, append as r, asClassComponent as t }; diff --git a/website/.svelte-kit/output/server/chunks/shared.js b/website/.svelte-kit/output/server/chunks/shared.js new file mode 100644 index 0000000..ae64005 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/shared.js @@ -0,0 +1,295 @@ +import { i as hydratable } from "./index-server.js"; +import { HttpError, SvelteKitError } from "@sveltejs/kit/internal"; +import * as devalue from "devalue"; +//#region node_modules/@sveltejs/kit/src/utils/functions.js +function noop() {} +/** +* @template T +* @param {() => T} fn +*/ +function once(fn) { + let done = false; + /** @type T */ + let result; + return () => { + if (done) return result; + done = true; + return result = fn(); + }; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/utils.js +var text_encoder = new TextEncoder(); +/** +* Like node's path.relative, but without using node +* @param {string} from +* @param {string} to +*/ +function get_relative_path(from, to) { + const from_parts = from.split(/[/\\]/); + const to_parts = to.split(/[/\\]/); + from_parts.pop(); + while (from_parts[0] === to_parts[0]) { + from_parts.shift(); + to_parts.shift(); + } + let i = from_parts.length; + while (i--) from_parts[i] = ".."; + return from_parts.concat(to_parts).join("/"); +} +/** +* @param {Uint8Array} bytes +* @returns {string} +*/ +function base64_encode(bytes) { + if (globalThis.Buffer) return globalThis.Buffer.from(bytes).toString("base64"); + let binary = ""; + for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]); + return btoa(binary); +} +/** +* @param {string} encoded +* @returns {Uint8Array} +*/ +function base64_decode(encoded) { + if (globalThis.Buffer) { + const buffer = globalThis.Buffer.from(encoded, "base64"); + return new Uint8Array(buffer); + } + const binary = atob(encoded); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); + return bytes; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/error.js +/** +* @param {unknown} err +* @return {Error} +*/ +function coalesce_to_error(err) { + return err instanceof Error || err && err.name && err.message ? err : new Error(JSON.stringify(err)); +} +/** +* This is an identity function that exists to make TypeScript less +* paranoid about people throwing things that aren't errors, which +* frankly is not something we should care about +* @param {unknown} error +*/ +function normalize_error(error) { + return error; +} +/** +* @param {unknown} error +*/ +function get_status(error) { + return error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500; +} +/** +* @param {unknown} error +*/ +function get_message(error) { + return error instanceof SvelteKitError ? error.text : "Internal Error"; +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/shared.js +/** @import { Transport } from '@sveltejs/kit' */ +/** +* @param {string} route_id +* @param {string} dep +*/ +function validate_depends(route_id, dep) { + const match = /^(moz-icon|view-source|jar):/.exec(dep); + if (match) console.warn(`${route_id}: Calling \`depends('${dep}')\` will throw an error in Firefox because \`${match[1]}\` is a special URI scheme`); +} +var INVALIDATED_PARAM = "x-sveltekit-invalidated"; +var TRAILING_SLASH_PARAM = "x-sveltekit-trailing-slash"; +/** +* @param {any} data +* @param {string} [location_description] +*/ +function validate_load_response(data, location_description) { + if (data != null && Object.getPrototypeOf(data) !== Object.prototype) throw new Error(`a load function ${location_description} returned ${typeof data !== "object" ? `a ${typeof data}` : data instanceof Response ? "a Response object" : Array.isArray(data) ? "an array" : "a non-plain object"}, but must return a plain object at the top level (i.e. \`return {...}\`)`); +} +/** +* Try to `devalue.stringify` the data object using the provided transport encoders. +* @param {any} data +* @param {Transport} transport +*/ +function stringify(data, transport) { + const encoders = Object.fromEntries(Object.entries(transport).map(([k, v]) => [k, v.encode])); + return devalue.stringify(data, encoders); +} +var object_proto_names = /* @__PURE__ */ Object.getOwnPropertyNames(Object.prototype).sort().join("\0"); +/** +* @param {unknown} thing +* @returns {thing is Record} +*/ +function is_plain_object(thing) { + if (typeof thing !== "object" || thing === null) return false; + const proto = Object.getPrototypeOf(thing); + return proto === Object.prototype || proto === null || Object.getPrototypeOf(proto) === null || Object.getOwnPropertyNames(proto).sort().join("\0") === object_proto_names; +} +/** +* @param {Record} value +* @param {Map} clones +*/ +function to_sorted(value, clones) { + const clone = Object.getPrototypeOf(value) === null ? Object.create(null) : {}; + clones.set(value, clone); + Object.defineProperty(clone, remote_arg_marker, { value: true }); + for (const key of Object.keys(value).sort()) { + const property = value[key]; + Object.defineProperty(clone, key, { + value: clones.get(property) ?? property, + enumerable: true, + configurable: true, + writable: true + }); + } + return clone; +} +var remote_object = "__skrao"; +var remote_map = "__skram"; +var remote_set = "__skras"; +var remote_regex_guard = "__skrag"; +var remote_arg_marker = Symbol(remote_object); +/** +* @param {Transport} transport +* @param {boolean} sort +* @param {Map} remote_arg_clones +*/ +function create_remote_arg_reducers(transport, sort, remote_arg_clones) { + /** @type {Record unknown>} */ + const remote_fns_reducers = { [remote_regex_guard]: (value) => { + if (value instanceof RegExp) throw new Error("Regular expressions are not valid remote function arguments"); + } }; + if (sort) { + /** @type {(value: unknown) => Array<[unknown, unknown]> | undefined} */ + remote_fns_reducers[remote_map] = (value) => { + if (!(value instanceof Map)) return; + /** @type {Array<[string, string]>} */ + const entries = []; + for (const [key, val] of value) entries.push([stringify(key), stringify(val)]); + return entries.sort(([a1, a2], [b1, b2]) => { + if (a1 < b1) return -1; + if (a1 > b1) return 1; + if (a2 < b2) return -1; + if (a2 > b2) return 1; + return 0; + }); + }; + /** @type {(value: unknown) => unknown[] | undefined} */ + remote_fns_reducers[remote_set] = (value) => { + if (!(value instanceof Set)) return; + /** @type {string[]} */ + const items = []; + for (const item of value) items.push(stringify(item)); + items.sort(); + return items; + }; + /** @type {(value: unknown) => Record | undefined} */ + remote_fns_reducers[remote_object] = (value) => { + if (!is_plain_object(value)) return; + if (Object.hasOwn(value, remote_arg_marker)) return; + if (remote_arg_clones.has(value)) return remote_arg_clones.get(value); + return to_sorted(value, remote_arg_clones); + }; + } + const all_reducers = { + ...Object.fromEntries(Object.entries(transport).map(([k, v]) => [k, v.encode])), + ...remote_fns_reducers + }; + /** @type {(value: unknown) => string} */ + const stringify = (value) => devalue.stringify(value, all_reducers); + return all_reducers; +} +/** @param {Transport} transport */ +function create_remote_arg_revivers(transport) { + const remote_fns_revivers = { + /** @type {(value: unknown) => unknown} */ + [remote_object]: (value) => value, + /** @type {(value: unknown) => Map} */ + [remote_map]: (value) => { + if (!Array.isArray(value)) throw new Error("Invalid data for Map reviver"); + const map = /* @__PURE__ */ new Map(); + for (const item of value) { + if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== "string" || typeof item[1] !== "string") throw new Error("Invalid data for Map reviver"); + const [key, val] = item; + map.set(parse(key), parse(val)); + } + return map; + }, + /** @type {(value: unknown) => Set} */ + [remote_set]: (value) => { + if (!Array.isArray(value)) throw new Error("Invalid data for Set reviver"); + const set = /* @__PURE__ */ new Set(); + for (const item of value) { + if (typeof item !== "string") throw new Error("Invalid data for Set reviver"); + set.add(parse(item)); + } + return set; + } + }; + const all_revivers = { + ...Object.fromEntries(Object.entries(transport).map(([k, v]) => [k, v.decode])), + ...remote_fns_revivers + }; + /** @type {(data: string) => unknown} */ + const parse = (data) => devalue.parse(data, all_revivers); + return all_revivers; +} +/** +* Stringifies the argument (if any) for a remote function in such a way that +* it is both a valid URL and a valid file name (necessary for prerendering). +* @param {any} value +* @param {Transport} transport +* @param {boolean} [sort] +*/ +function stringify_remote_arg(value, transport, sort = true) { + if (value === void 0) return ""; + const json_string = devalue.stringify(value, create_remote_arg_reducers(transport, sort, /* @__PURE__ */ new Map())); + return base64_encode(text_encoder.encode(json_string)).replaceAll("=", "").replaceAll("+", "-").replaceAll("/", "_"); +} +/** +* Parses the argument (if any) for a remote function +* @param {string} string +* @param {Transport} transport +*/ +function parse_remote_arg(string, transport) { + if (!string) return void 0; + const json_string = new TextDecoder().decode(base64_decode(string.replaceAll("-", "+").replaceAll("_", "/"))); + return devalue.parse(json_string, create_remote_arg_revivers(transport)); +} +/** +* @param {string} id +* @param {string} payload +*/ +function create_remote_key(id, payload) { + return id + "/" + payload; +} +/** +* @param {string} key +* @returns {{ id: string; payload: string }} +*/ +function split_remote_key(key) { + const i = key.lastIndexOf("/"); + if (i === -1) throw new Error(`Invalid remote key: ${key}`); + return { + id: key.slice(0, i), + payload: key.slice(i + 1) + }; +} +/** +* @template T +* @param {string} key +* @param {() => T} fn +* @returns {T} +* @deprecated TODO remove in SvelteKit 3.0 +*/ +function unfriendly_hydratable(key, fn) { + if (!hydratable) throw new Error("Remote functions require Svelte 5.44.0 or later"); + return hydratable(key, fn); +} +//#endregion +export { get_relative_path as _, split_remote_key as a, once as b, unfriendly_hydratable as c, coalesce_to_error as d, get_message as f, base64_encode as g, base64_decode as h, parse_remote_arg as i, validate_depends as l, normalize_error as m, TRAILING_SLASH_PARAM as n, stringify as o, get_status as p, create_remote_key as r, stringify_remote_arg as s, INVALIDATED_PARAM as t, validate_load_response as u, text_encoder as v, noop as y }; diff --git a/website/.svelte-kit/output/server/chunks/stores.js b/website/.svelte-kit/output/server/chunks/stores.js new file mode 100644 index 0000000..8643187 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/stores.js @@ -0,0 +1,34 @@ +import "./index-server.js"; +import { _t as getContext } from "./dev.js"; +import "./client.js"; +//#region node_modules/@sveltejs/kit/src/runtime/app/stores.js +/** +* A function that returns all of the contextual stores. On the server, this must be called during component initialization. +* Only use this if you need to defer store subscription until after the component has mounted, for some reason. +* +* @deprecated Use `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) +*/ +var getStores = () => { + const stores$1 = getContext("__svelte__"); + return { + /** @type {typeof page} */ + page: { subscribe: stores$1.page.subscribe }, + /** @type {typeof navigating} */ + navigating: { subscribe: stores$1.navigating.subscribe }, + /** @type {typeof updated} */ + updated: stores$1.updated + }; +}; +/** +* A readable store whose value contains page data. +* +* On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. +* +* @deprecated Use `page` from `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) +* @type {import('svelte/store').Readable} +*/ +var page = { subscribe(fn) { + return getStores().page.subscribe(fn); +} }; +//#endregion +export { page as t }; diff --git a/website/.svelte-kit/output/server/chunks/utils.js b/website/.svelte-kit/output/server/chunks/utils.js new file mode 100644 index 0000000..51fa7c7 --- /dev/null +++ b/website/.svelte-kit/output/server/chunks/utils.js @@ -0,0 +1,863 @@ +import { d as coalesce_to_error, f as get_message, p as get_status } from "./shared.js"; +import { json, text } from "@sveltejs/kit"; +import { HttpError, SvelteKitError } from "@sveltejs/kit/internal"; +import { with_request_store } from "@sveltejs/kit/internal/server"; +import * as devalue from "devalue"; +//#region node_modules/@sveltejs/kit/src/constants.js +/** +* A fake asset path used in `vite dev` and `vite preview`, so that we can +* serve local assets while verifying that requests are correctly prefixed +*/ +var SVELTE_KIT_ASSETS = "/_svelte_kit_assets"; +var ENDPOINT_METHODS = [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE", + "OPTIONS", + "HEAD" +]; +var MUTATIVE_METHODS = [ + "POST", + "PUT", + "PATCH", + "DELETE" +]; +var PAGE_METHODS = [ + "GET", + "POST", + "HEAD" +]; +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/form-utils.js +/** @import { RemoteForm } from '@sveltejs/kit' */ +/** @import { BinaryFormMeta, InternalRemoteFormIssue } from 'types' */ +/** @import { StandardSchemaV1 } from '@standard-schema/spec' */ +var decoder = new TextDecoder(); +/** +* Sets a value in a nested object using a path string, mutating the original object +* @param {Record} object +* @param {string} path_string +* @param {any} value +*/ +function set_nested_value(object, path_string, value) { + if (path_string.startsWith("n:")) { + path_string = path_string.slice(2); + value = value === "" ? void 0 : parseFloat(value); + } else if (path_string.startsWith("b:")) { + path_string = path_string.slice(2); + value = value === "on"; + } + deep_set(object, split_path(path_string), value); +} +/** +* Convert `FormData` into a POJO +* @param {FormData} data +*/ +function convert_formdata(data) { + /** @type {Record} */ + const result = {}; + for (let key of data.keys()) { + const is_array = key.endsWith("[]"); + /** @type {any[]} */ + let values = data.getAll(key); + if (is_array) key = key.slice(0, -2); + if (values.length > 1 && !is_array) throw new Error(`Form cannot contain duplicated keys — "${key}" has ${values.length} values`); + values = values.filter((entry) => typeof entry === "string" || entry.name !== "" || entry.size > 0); + if (key.startsWith("n:")) { + key = key.slice(2); + values = values.map((v) => v === "" ? void 0 : parseFloat(v)); + } else if (key.startsWith("b:")) { + key = key.slice(2); + values = values.map((v) => v === "on"); + } + set_nested_value(result, key, is_array ? values : values[0]); + } + return result; +} +var BINARY_FORM_CONTENT_TYPE = "application/x-sveltekit-formdata"; +var BINARY_FORM_VERSION = 0; +var HEADER_BYTES = 7; +/** +* @param {Request} request +* @returns {Promise<{ data: Record; meta: BinaryFormMeta; form_data: FormData | null }>} +*/ +async function deserialize_binary_form(request) { + if (request.headers.get("content-type") !== "application/x-sveltekit-formdata") { + const form_data = await request.formData(); + return { + data: convert_formdata(form_data), + meta: {}, + form_data + }; + } + if (!request.body) throw deserialize_error("no body"); + const reader = request.body.getReader(); + /** @type {Array | undefined>>} */ + const chunks = []; + /** + * @param {number} index + * @returns {Promise | undefined>} + */ + function get_chunk(index) { + if (index in chunks) return chunks[index]; + let i = chunks.length; + while (i <= index) { + chunks[i] = reader.read().then((chunk) => chunk.value); + i++; + } + return chunks[index]; + } + /** + * @param {number} offset + * @param {number} length + * @returns {Promise} + */ + async function get_buffer(offset, length) { + /** @type {Uint8Array} */ + let start_chunk; + let chunk_start = 0; + /** @type {number} */ + let chunk_index; + for (chunk_index = 0;; chunk_index++) { + const chunk = await get_chunk(chunk_index); + if (!chunk) return null; + const chunk_end = chunk_start + chunk.byteLength; + if (offset >= chunk_start && offset < chunk_end) { + start_chunk = chunk; + break; + } + chunk_start = chunk_end; + } + if (offset + length <= chunk_start + start_chunk.byteLength) return start_chunk.subarray(offset - chunk_start, offset + length - chunk_start); + const chunks = [start_chunk.subarray(offset - chunk_start)]; + let cursor = start_chunk.byteLength - offset + chunk_start; + while (cursor < length) { + chunk_index++; + let chunk = await get_chunk(chunk_index); + if (!chunk) return null; + if (chunk.byteLength > length - cursor) chunk = chunk.subarray(0, length - cursor); + chunks.push(chunk); + cursor += chunk.byteLength; + } + const buffer = new Uint8Array(length); + cursor = 0; + for (const chunk of chunks) { + buffer.set(chunk, cursor); + cursor += chunk.byteLength; + } + return buffer; + } + const header = await get_buffer(0, HEADER_BYTES); + if (!header) throw deserialize_error("too short"); + if (header[0] !== BINARY_FORM_VERSION) throw deserialize_error(`got version ${header[0]}, expected version ${BINARY_FORM_VERSION}`); + const header_view = new DataView(header.buffer, header.byteOffset, header.byteLength); + const data_length = header_view.getUint32(1, true); + const file_offsets_length = header_view.getUint16(5, true); + const data_buffer = await get_buffer(HEADER_BYTES, data_length); + if (!data_buffer) throw deserialize_error("data too short"); + /** @type {Array} */ + let file_offsets; + /** @type {number} */ + let files_start_offset; + if (file_offsets_length > 0) { + const file_offsets_buffer = await get_buffer(HEADER_BYTES + data_length, file_offsets_length); + if (!file_offsets_buffer) throw deserialize_error("file offset table too short"); + const parsed_offsets = JSON.parse(decoder.decode(file_offsets_buffer)); + if (!Array.isArray(parsed_offsets) || parsed_offsets.some((n) => typeof n !== "number" || !Number.isInteger(n) || n < 0)) throw deserialize_error("invalid file offset table"); + file_offsets = parsed_offsets; + files_start_offset = HEADER_BYTES + data_length + file_offsets_length; + } + /** @type {Array<{ offset: number, size: number }>} */ + const file_spans = []; + const [data, meta] = devalue.parse(decoder.decode(data_buffer), { File: ([name, type, size, last_modified, index]) => { + if (typeof name !== "string" || typeof type !== "string" || typeof size !== "number" || typeof last_modified !== "number" || typeof index !== "number") throw deserialize_error("invalid file metadata"); + let offset = file_offsets[index]; + if (offset === void 0) throw deserialize_error("duplicate file offset table index"); + file_offsets[index] = void 0; + offset += files_start_offset; + file_spans.push({ + offset, + size + }); + return new Proxy(new LazyFile(name, type, size, last_modified, get_chunk, offset), { getPrototypeOf() { + return File.prototype; + } }); + } }); + file_spans.sort((a, b) => a.offset - b.offset || a.size - b.size); + for (let i = 1; i < file_spans.length; i++) { + const previous = file_spans[i - 1]; + const current = file_spans[i]; + const previous_end = previous.offset + previous.size; + if (previous_end < current.offset) throw deserialize_error("gaps in file data"); + if (previous_end > current.offset) throw deserialize_error("overlapping file data"); + } + (async () => { + let has_more = true; + while (has_more) has_more = !!await get_chunk(chunks.length); + })(); + return { + data, + meta, + form_data: null + }; +} +/** +* @param {string} message +*/ +function deserialize_error(message) { + return new SvelteKitError(400, "Bad Request", `Could not deserialize binary form: ${message}`); +} +/** @implements {File} */ +var LazyFile = class LazyFile { + /** @type {(index: number) => Promise | undefined>} */ + #get_chunk; + /** @type {number} */ + #offset; + /** + * @param {string} name + * @param {string} type + * @param {number} size + * @param {number} last_modified + * @param {(index: number) => Promise | undefined>} get_chunk + * @param {number} offset + */ + constructor(name, type, size, last_modified, get_chunk, offset) { + this.name = name; + this.type = type; + this.size = size; + this.lastModified = last_modified; + this.webkitRelativePath = ""; + this.#get_chunk = get_chunk; + this.#offset = offset; + this.arrayBuffer = this.arrayBuffer.bind(this); + this.bytes = this.bytes.bind(this); + this.slice = this.slice.bind(this); + this.stream = this.stream.bind(this); + this.text = this.text.bind(this); + } + /** @type {ArrayBuffer | undefined} */ + #buffer; + async arrayBuffer() { + this.#buffer ??= await new Response(this.stream()).arrayBuffer(); + return this.#buffer; + } + async bytes() { + return new Uint8Array(await this.arrayBuffer()); + } + /** + * @param {number=} start + * @param {number=} end + * @param {string=} contentType + */ + slice(start = 0, end = this.size, contentType = this.type) { + if (start < 0) start = Math.max(this.size + start, 0); + else start = Math.min(start, this.size); + if (end < 0) end = Math.max(this.size + end, 0); + else end = Math.min(end, this.size); + const size = Math.max(end - start, 0); + return new LazyFile(this.name, contentType, size, this.lastModified, this.#get_chunk, this.#offset + start); + } + stream() { + let cursor = 0; + let chunk_index = 0; + return new ReadableStream({ + start: async (controller) => { + let chunk_start = 0; + /** @type {Uint8Array} */ + let start_chunk; + for (chunk_index = 0;; chunk_index++) { + const chunk = await this.#get_chunk(chunk_index); + if (!chunk) return null; + const chunk_end = chunk_start + chunk.byteLength; + if (this.#offset >= chunk_start && this.#offset < chunk_end) { + start_chunk = chunk; + break; + } + chunk_start = chunk_end; + } + if (this.#offset + this.size <= chunk_start + start_chunk.byteLength) { + controller.enqueue(start_chunk.subarray(this.#offset - chunk_start, this.#offset + this.size - chunk_start)); + controller.close(); + } else { + controller.enqueue(start_chunk.subarray(this.#offset - chunk_start)); + cursor = start_chunk.byteLength - this.#offset + chunk_start; + } + }, + pull: async (controller) => { + chunk_index++; + let chunk = await this.#get_chunk(chunk_index); + if (!chunk) { + controller.error("incomplete file data"); + controller.close(); + return; + } + if (chunk.byteLength > this.size - cursor) chunk = chunk.subarray(0, this.size - cursor); + controller.enqueue(chunk); + cursor += chunk.byteLength; + if (cursor >= this.size) controller.close(); + } + }); + } + async text() { + return decoder.decode(await this.arrayBuffer()); + } +}; +var path_regex = /^[a-zA-Z_$]\w*(\.[a-zA-Z_$]\w*|\[\d+\])*$/; +/** +* @param {string} path +*/ +function split_path(path) { + if (!path_regex.test(path)) throw new Error(`Invalid path ${path}`); + return path.split(/\.|\[|\]/).filter(Boolean); +} +/** +* Check if a property key is dangerous and could lead to prototype pollution +* @param {string} key +*/ +function check_prototype_pollution(key) { + if (key === "__proto__" || key === "constructor" || key === "prototype") throw new Error(`Invalid key "${key}"`); +} +/** +* Sets a value in a nested object using an array of keys, mutating the original object. +* @param {Record} object +* @param {string[]} keys +* @param {any} value +*/ +function deep_set(object, keys, value) { + let current = object; + for (let i = 0; i < keys.length - 1; i += 1) { + const key = keys[i]; + check_prototype_pollution(key); + const is_array = /^\d+$/.test(keys[i + 1]); + const inner = Object.hasOwn(current, key) ? current[key] : void 0; + const exists = inner != null; + if (exists && is_array !== Array.isArray(inner)) throw new Error(`Invalid array key ${keys[i + 1]}`); + if (!exists) current[key] = is_array ? [] : {}; + current = current[key]; + } + const final_key = keys[keys.length - 1]; + check_prototype_pollution(final_key); + current[final_key] = value; +} +/** +* @param {StandardSchemaV1.Issue} issue +* @param {boolean} server Whether this issue came from server validation +*/ +function normalize_issue(issue, server = false) { + /** @type {InternalRemoteFormIssue} */ + const normalized = { + name: "", + path: [], + message: issue.message, + server + }; + if (issue.path !== void 0) { + let name = ""; + for (const segment of issue.path) { + const key = typeof segment === "object" ? segment.key : segment; + normalized.path.push(key); + if (typeof key === "number") name += `[${key}]`; + else if (typeof key === "string") name += name === "" ? key : "." + key; + } + normalized.name = name; + } + return normalized; +} +/** +* @param {InternalRemoteFormIssue[]} issues +*/ +function flatten_issues(issues) { + /** @type {Record} */ + const result = {}; + for (const issue of issues) { + (result.$ ??= []).push(issue); + let name = ""; + if (issue.path !== void 0) for (const key of issue.path) { + if (typeof key === "number") name += `[${key}]`; + else if (typeof key === "string") name += name === "" ? key : "." + key; + (result[name] ??= []).push(issue); + } + } + return result; +} +/** +* Gets a nested value from an object using a path array +* @param {Record} object +* @param {(string | number)[]} path +* @returns {any} +*/ +function deep_get(object, path) { + let current = object; + for (const key of path) { + if (current == null || typeof current !== "object") return current; + current = current[key]; + } + return current; +} +/** +* +* @param {string} field_type +* @param {boolean} is_array +* @param {unknown} input_value +*/ +function get_type_prefix(field_type, is_array, input_value) { + if (field_type === "number" || field_type === "range") return "n:"; + if (field_type === "checkbox" && !is_array) return "b:"; + if (field_type === "hidden" || field_type === "submit") { + const input_type = typeof input_value; + if (input_type === "number") return "n:"; + if (input_type === "boolean") return "b:"; + } + return ""; +} +/** +* Creates a proxy-based field accessor for form data +* @param {any} target - Function or empty POJO +* @param {() => Record} get_input - Function to get current input data +* @param {(path: (string | number)[], value: any) => void} set_input - Function to set input data +* @param {(path?: (string | number)[], all?: boolean) => Record} get_issues - Function to get current issues +* @param {(string | number)[]} path - Current access path +* @returns {any} Proxy object with name(), value(), and issues() methods +*/ +function create_field_proxy(target, get_input, set_input, get_issues, path = []) { + const get_value = () => { + return deep_get(get_input(), path); + }; + return new Proxy(target, { get(target, prop) { + if (typeof prop === "symbol") return target[prop]; + if (/^\d+$/.test(prop)) return create_field_proxy({}, get_input, set_input, get_issues, [...path, parseInt(prop, 10)]); + const key = build_path_string(path); + if (prop === "set") { + const set_func = function(newValue) { + set_input(path, newValue); + return newValue; + }; + return create_field_proxy(set_func, get_input, set_input, get_issues, [...path, prop]); + } + if (prop === "value") return create_field_proxy(get_value, get_input, set_input, get_issues, [...path, prop]); + if (prop === "issues" || prop === "allIssues") { + const issues_func = () => { + const all_issues = get_issues(path, prop === "allIssues")[key === "" ? "$" : key]; + if (prop === "allIssues") return all_issues?.map((issue) => ({ + path: issue.path, + message: issue.message + })); + return all_issues?.filter((issue) => issue.name === key)?.map((issue) => ({ + path: issue.path, + message: issue.message + })); + }; + return create_field_proxy(issues_func, get_input, set_input, get_issues, [...path, prop]); + } + if (prop === "as") { + /** + * @param {string} type + * @param {unknown} [input_value] + */ + const as_func = (type, input_value) => { + const is_array = type === "file multiple" || type === "select multiple" || type === "checkbox" && typeof input_value === "string"; + /** @type {Record} */ + const base_props = { + name: get_type_prefix(type, is_array, input_value) + key + (is_array ? "[]" : ""), + get "aria-invalid"() { + return key in get_issues() ? "true" : void 0; + } + }; + if (type !== "text" && type !== "select" && type !== "select multiple") base_props.type = type === "file multiple" ? "file" : type; + if (type === "submit" || type === "hidden") return Object.defineProperties(base_props, { value: { + value: typeof input_value === "boolean" ? input_value ? "on" : "off" : input_value, + enumerable: true + } }); + if (type === "select" || type === "select multiple") return Object.defineProperties(base_props, { + multiple: { + value: is_array, + enumerable: true + }, + value: { + enumerable: true, + get() { + return get_value() ?? input_value; + } + } + }); + if (type === "checkbox" || type === "radio") { + if (type === "checkbox" && !is_array) return Object.defineProperties(base_props, { + defaultChecked: { + enumerable: true, + get() { + return input_value; + } + }, + checked: { + enumerable: true, + get() { + return get_value() ?? input_value; + } + } + }); + return Object.defineProperties(base_props, { + value: { + value: input_value ?? "on", + enumerable: true + }, + checked: { + enumerable: true, + get() { + const value = get_value(); + if (type === "radio") return value === input_value; + return (value ?? []).includes(input_value); + } + } + }); + } + if (type === "file" || type === "file multiple") return Object.defineProperties(base_props, { + multiple: { + value: is_array, + enumerable: true + }, + files: { + enumerable: true, + get() { + const value = get_value(); + if (value instanceof File) { + if (typeof DataTransfer !== "undefined") { + const fileList = new DataTransfer(); + fileList.items.add(value); + return fileList.files; + } + return { + 0: value, + length: 1 + }; + } + if (Array.isArray(value) && value.every((f) => f instanceof File)) { + if (typeof DataTransfer !== "undefined") { + const fileList = new DataTransfer(); + value.forEach((file) => fileList.items.add(file)); + return fileList.files; + } + /** @type {any} */ + const fileListLike = { length: value.length }; + value.forEach((file, index) => { + fileListLike[index] = file; + }); + return fileListLike; + } + return null; + } + } + }); + return Object.defineProperties(base_props, { + defaultValue: { + enumerable: true, + get() { + return input_value; + } + }, + value: { + enumerable: true, + get() { + const value = get_value() ?? input_value; + return value != null ? String(value) : ""; + } + } + }); + }; + return create_field_proxy(as_func, get_input, set_input, get_issues, [...path, "as"]); + } + return create_field_proxy({}, get_input, set_input, get_issues, [...path, prop]); + } }); +} +/** +* Builds a path string from an array of path segments +* @param {(string | number)[]} path +* @returns {string} +*/ +function build_path_string(path) { + let result = ""; + for (const segment of path) if (typeof segment === "number") result += `[${segment}]`; + else result += result === "" ? segment : "." + segment; + return result; +} +/** +* @param {RemoteForm} instance +* @deprecated remove in 3.0 +*/ +function throw_on_old_property_access(instance) { + Object.defineProperty(instance, "field", { value: (name) => { + const new_name = name.endsWith("[]") ? name.slice(0, -2) : name; + throw new Error(`\`form.field\` has been removed: Instead of \`\` do \`\``); + } }); + for (const property of ["input", "issues"]) Object.defineProperty(instance, property, { get() { + const new_name = property === "issues" ? "issues" : "value"; + return new Proxy({}, { get(_, prop) { + const prop_string = typeof prop === "string" ? prop : String(prop); + const old = prop_string.includes("[") || prop_string.includes(".") ? `['${prop_string}']` : `.${prop_string}`; + const replacement = `.${prop_string}.${new_name}()`; + throw new Error(`\`form.${property}\` has been removed: Instead of \`form.${property}${old}\` write \`form.fields${replacement}\``); + } }); + } }); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/http.js +/** +* Given an Accept header and a list of possible content types, pick +* the most suitable one to respond with +* @param {string} accept +* @param {string[]} types +*/ +function negotiate(accept, types) { + /** @type {Array<{ type: string, subtype: string, q: number, i: number }>} */ + const parts = []; + accept.split(",").forEach((str, i) => { + const match = /([^/ \t]+)\/([^; \t]+)[ \t]*(?:;[ \t]*q=([0-9.]+))?/.exec(str); + if (match) { + const [, type, subtype, q = "1"] = match; + parts.push({ + type, + subtype, + q: +q, + i + }); + } + }); + parts.sort((a, b) => { + if (a.q !== b.q) return b.q - a.q; + if (a.subtype === "*" !== (b.subtype === "*")) return a.subtype === "*" ? 1 : -1; + if (a.type === "*" !== (b.type === "*")) return a.type === "*" ? 1 : -1; + return a.i - b.i; + }); + let accepted; + let min_priority = Infinity; + for (const mimetype of types) { + const [type, subtype] = mimetype.split("/"); + const priority = parts.findIndex((part) => (part.type === type || part.type === "*") && (part.subtype === subtype || part.subtype === "*")); + if (priority !== -1 && priority < min_priority) { + accepted = mimetype; + min_priority = priority; + } + } + return accepted; +} +/** +* Returns `true` if the request contains a `content-type` header with the given type +* @param {Request} request +* @param {...string} types +*/ +function is_content_type(request, ...types) { + const type = request.headers.get("content-type")?.split(";", 1)[0].trim() ?? ""; + return types.includes(type.toLowerCase()); +} +/** +* @param {Request} request +*/ +function is_form_content_type(request) { + return is_content_type(request, "application/x-www-form-urlencoded", "multipart/form-data", "text/plain", BINARY_FORM_CONTENT_TYPE); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/misc.js +var s = JSON.stringify; +//#endregion +//#region node_modules/@sveltejs/kit/src/utils/escape.js +/** +* When inside a double-quoted attribute value, only `&` and `"` hold special meaning. +* @see https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(double-quoted)-state +* @type {Record} +*/ +var escape_html_attr_dict = { + "&": "&", + "\"": """ +}; +/** +* @type {Record} +*/ +var escape_html_dict = { + "&": "&", + "<": "<" +}; +var escape_html_attr_regex = new RegExp(`[${Object.keys(escape_html_attr_dict).join("")}]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\udc00-\\udfff]`, "g"); +var escape_html_regex = new RegExp(`[${Object.keys(escape_html_dict).join("")}]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\udc00-\\udfff]`, "g"); +/** +* Escapes unpaired surrogates (which are allowed in js strings but invalid in HTML) and +* escapes characters that are special. +* +* @param {string} str +* @param {boolean} [is_attr] +* @returns {string} escaped string +* @example const html = `...`; +*/ +function escape_html(str, is_attr) { + const dict = is_attr ? escape_html_attr_dict : escape_html_dict; + return str.replace(is_attr ? escape_html_attr_regex : escape_html_regex, (match) => { + if (match.length === 2) return match; + return dict[match] ?? `&#${match.charCodeAt(0)};`; + }); +} +//#endregion +//#region node_modules/@sveltejs/kit/src/runtime/server/utils.js +/** @import { ServerHooks } from 'types' */ +/** +* @param {Partial>} mod +* @param {import('types').HttpMethod} method +*/ +function method_not_allowed(mod, method) { + return text(`${method} method not allowed`, { + status: 405, + headers: { allow: allowed_methods(mod).join(", ") } + }); +} +/** @param {Partial>} mod */ +function allowed_methods(mod) { + const allowed = ENDPOINT_METHODS.filter((method) => method in mod); + if ("GET" in mod && !("HEAD" in mod)) allowed.push("HEAD"); + return allowed; +} +/** +* @param {import('types').SSROptions} options +*/ +function get_global_name(options) { + return `__sveltekit_${options.version_hash}`; +} +/** +* Return as a response that renders the error.html +* +* @param {import('types').SSROptions} options +* @param {number} status +* @param {string} message +*/ +function static_error_page(options, status, message) { + return text(options.templates.error({ + status, + message: escape_html(message) + }), { + headers: { "content-type": "text/html; charset=utf-8" }, + status + }); +} +/** +* @param {import('@sveltejs/kit').RequestEvent} event +* @param {import('types').RequestState} state +* @param {import('types').SSROptions} options +* @param {unknown} error +*/ +async function handle_fatal_error(event, state, options, error) { + error = error instanceof HttpError ? error : coalesce_to_error(error); + const status = get_status(error); + const body = await handle_error_and_jsonify(event, state, options, error); + const type = negotiate(event.request.headers.get("accept") || "text/html", ["application/json", "text/html"]); + if (event.isDataRequest || type === "application/json") return json(body, { status }); + return static_error_page(options, status, body.message); +} +/** +* @param {import('@sveltejs/kit').RequestEvent} event +* @param {import('types').RequestState} state +* @param {import('types').SSROptions} options +* @param {any} error +* @returns {Promise} +*/ +async function handle_error_and_jsonify(event, state, options, error) { + if (error instanceof HttpError) return { + message: "Unknown Error", + ...error.body + }; + const status = get_status(error); + const message = get_message(error); + return await with_request_store({ + event, + state + }, () => options.hooks.handleError({ + error, + event, + status, + message + })) ?? { message }; +} +/** +* @param {number} status +* @param {string} location +*/ +function redirect_response(status, location) { + return new Response(void 0, { + status, + headers: { location } + }); +} +/** +* @param {import('@sveltejs/kit').RequestEvent} event +* @param {Error & { path: string }} error +*/ +function clarify_devalue_error(event, error) { + if (error.path) return `Data returned from \`load\` while rendering ${event.route.id} is not serializable: ${error.message} (${error.path}). If you need to serialize/deserialize custom types, use transport hooks: https://svelte.dev/docs/kit/hooks#Universal-hooks-transport.`; + if (error.path === "") return `Data returned from \`load\` while rendering ${event.route.id} is not a plain object`; + return error.message; +} +/** +* @param {import('types').ServerDataNode} node +*/ +function serialize_uses(node) { + const uses = {}; + if (node.uses && node.uses.dependencies.size > 0) uses.dependencies = Array.from(node.uses.dependencies); + if (node.uses && node.uses.search_params.size > 0) uses.search_params = Array.from(node.uses.search_params); + if (node.uses && node.uses.params.size > 0) uses.params = Array.from(node.uses.params); + if (node.uses?.parent) uses.parent = 1; + if (node.uses?.route) uses.route = 1; + if (node.uses?.url) uses.url = 1; + return uses; +} +/** +* Returns `true` if the given path was prerendered +* @param {import('@sveltejs/kit').SSRManifest} manifest +* @param {string} pathname Should include the base and be decoded +*/ +function has_prerendered_path(manifest, pathname) { + return manifest._.prerendered_routes.has(pathname) || pathname.at(-1) === "/" && manifest._.prerendered_routes.has(pathname.slice(0, -1)); +} +/** +* Formats the error into a nice message with sanitized stack trace +* @param {number} status +* @param {Error} error +* @param {import('@sveltejs/kit').RequestEvent} event +*/ +function format_server_error(status, error, event) { + const formatted_text = `\n\x1b[1;31m[${status}] ${event.request.method} ${event.url.pathname}\x1b[0m`; + if (status === 404) return formatted_text; + return `${formatted_text}\n${error.stack}`; +} +/** +* Returns the filename without the extension. e.g., `+page.server`, `+page`, etc. +* @param {string | undefined} node_id +* @returns {string} +*/ +function get_node_type(node_id) { + const filename = (node_id?.split("/"))?.at(-1); + if (!filename) return "unknown"; + return filename.split(".").slice(0, -1).join("."); +} +/** +* Counts HTML comments that are not SSI directives (which start with ` +* +
      + + diff --git a/website/build/_app/env.js b/website/build/_app/env.js new file mode 100644 index 0000000..f5427da --- /dev/null +++ b/website/build/_app/env.js @@ -0,0 +1 @@ +export const env={} \ No newline at end of file diff --git a/website/build/_app/immutable/assets/0.D7nPmqCL.css b/website/build/_app/immutable/assets/0.D7nPmqCL.css new file mode 100644 index 0000000..c686f67 --- /dev/null +++ b/website/build/_app/immutable/assets/0.D7nPmqCL.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-4xl:2rem;--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-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-destructive:var(--destructive);--color-border:var(--border);--color-ring:var(--ring)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-\[10\%\]{top:10%}.right-\[15\%\]{right:15%}.bottom-\[10\%\]{bottom:10%}.left-\[20\%\]{left:20%}.z-10{z-index:10}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-20{margin-top:calc(var(--spacing) * 20)}.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)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-\[1\.45em\]{min-height:1.45em}.min-h-\[calc\(100vh-3\.5rem\)\]{min-height:calc(100vh - 3.5rem)}.min-h-screen{min-height:100vh}.w-1\/3{width:33.3333%}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-\[400px\]{width:400px}.w-\[500px\]{width:500px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[32rem\]{max-width:32rem}.max-w-\[40rem\]{max-width:40rem}.max-w-\[56rem\]{max-width:56rem}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-outside{list-style-position:outside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-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-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-\[min\(var\(--radius-md\)\,8px\)\]{border-radius:min(var(--radius-md), 8px)}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.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-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[var\(--accent\)\]\/25{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-\[var\(--accent\)\]\/25{border-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.border-\[var\(--border\)\]{border-color:var(--border)}.border-border{border-color:var(--color-border)}.border-transparent{border-color:#0000}.bg-\[var\(--accent\)\],.bg-\[var\(--accent\)\]\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-\[var\(--accent\)\]\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-\[var\(--background\)\]{background-color:var(--background)}.bg-background{background-color:var(--color-background)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-card{background-color:var(--color-card)}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive) 10%, transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/20{background-color:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.bg-clip-padding{background-clip:padding-box}.p-0{padding:calc(var(--spacing) * 0)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[13px\]{font-size:13px}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-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:calc(var(--tracking-tight) * -1);letter-spacing:calc(var(--tracking-tight) * -1)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--accent-foreground\)\]{color:var(--accent-foreground)}.text-\[var\(--foreground\)\]{color:var(--foreground)}.text-\[var\(--muted-foreground\)\]{color:var(--muted-foreground)}.text-\[var\(--success\)\]{color:var(--success)}.text-blue-400{color:var(--color-blue-400)}.text-card-foreground{color:var(--color-card-foreground)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-\[0\.02\]{opacity:.02}.opacity-\[0\.03\]{opacity:.03}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--color-foreground) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-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-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[transition-delay\:100ms\]{transition-delay:.1s}.\[transition-delay\:200ms\]{transition-delay:.2s}.delay-100{transition-delay:.1s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-400{transition-delay:.4s}.delay-500{transition-delay:.5s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.group-data-\[size\=sm\]\/card\:px-4:is(:where(.group\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}@media (hover:hover){.hover\:border-\[var\(--accent\)\]:hover{border-color:var(--accent)}.hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-\[var\(--foreground\)\]:hover{color:var(--foreground)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-muted-foreground:hover{color:var(--color-muted-foreground)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-md{border-radius:var(--radius-md)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--color-muted)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--color-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[size\=sm\]\:gap-4[data-size=sm]{gap:calc(var(--spacing) * 4)}.data-\[size\=sm\]\:py-4[data-size=sm]{padding-block:calc(var(--spacing) * 4)}@media (width>=40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (width>=48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}}@media (width>=64rem){.lg\:block{display:block}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:bg-destructive\/20{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.dark\:opacity-\[0\.04\]{opacity:.04}.dark\:opacity-\[0\.06\]{opacity:.06}@media (hover:hover){.dark\:hover\:bg-destructive\/30:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:hover{background-color:color-mix(in oklab, var(--color-destructive) 30%, transparent)}}.dark\:hover\:bg-muted\/50:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50[aria-invalid=true]{border-color:color-mix(in oklab, var(--color-destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-b\]\:pb-4:is(:where(.group\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 4)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.group-data-\[size\=sm\]\/card\:\[\.border-t\]\:pt-4:is(:where(.group\/card)[data-size=sm] *).border-t{padding-top:calc(var(--spacing) * 4)}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--color-muted)}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--color-muted-foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}}:root{--background:oklch(99% .002 270);--foreground:oklch(13% .02 270);--card:oklch(100% 0 0);--card-foreground:oklch(13% .02 270);--muted:oklch(96% .005 270);--muted-foreground:oklch(50% .02 270);--accent:oklch(55% .22 270);--accent-bright:oklch(60% .24 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(70% .12 270);--success:oklch(55% .19 145);--warning:oklch(65% .15 85);--destructive:oklch(50% .22 25);--border:oklch(91% .005 270);--border-subtle:oklch(94% .003 270);--ring:oklch(55% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.06);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.1);--font-sans:"Inter", system-ui, -apple-system, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--space-0:0;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--space-8:2rem;--space-10:2.5rem;--space-12:3rem;--space-16:4rem;--space-20:5rem;--space-24:6rem;--space-32:8rem}.dark{--background:oklch(13% .01 270);--foreground:oklch(92% .01 270);--card:oklch(17% .01 270);--card-foreground:oklch(92% .01 270);--muted:oklch(22% .01 270);--muted-foreground:oklch(65% .01 270);--accent:oklch(65% .22 270);--accent-bright:oklch(72% .2 270);--accent-foreground:oklch(98% 0 0);--accent-dim:oklch(45% .12 270);--success:oklch(72% .19 145);--warning:oklch(78% .15 85);--destructive:oklch(55% .22 25);--border:oklch(27% .01 270);--border-subtle:oklch(22% .01 270);--ring:oklch(65% .22 270);--shadow-card:0 1px 3px oklch(0% 0 0/.3);--shadow-card-hover:0 4px 12px oklch(0% 0 0/.4)}html{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}body{min-height:100vh;line-height:1.5}::selection{color:var(--accent-foreground);background:oklch(55% .22 270/.3)}code,.font-mono{font-family:var(--font-mono)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--muted)}::-webkit-scrollbar-thumb{background:var(--muted-foreground);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:oklch(75% .01 270)}@media (prefers-reduced-motion:no-preference){@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes blink{0%,50%{opacity:1}51%,to{opacity:0}}@keyframes accordion-down{0%{height:0}to{height:var(--bits-accordion-content-height)}}@keyframes accordion-up{0%{height:var(--bits-accordion-content-height)}to{height:0}}@keyframes glow-pulse{0%,to{opacity:.4;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}.animate-fade-in{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-delay-1{opacity:0;animation:.6s ease-out .1s forwards fade-in-up}.animate-fade-in-delay-2{opacity:0;animation:.6s ease-out .2s forwards fade-in-up}.animate-fade-in-delay-3{opacity:0;animation:.6s ease-out .3s forwards fade-in-up}.animate-fade-in-delay-4{opacity:0;animation:.6s ease-out .4s forwards fade-in-up}.cursor-blink{animation:1s step-end infinite blink}.animate-accordion-down{animation:.2s ease-out accordion-down}.animate-accordion-up{animation:.2s ease-out accordion-up}.animate-glow-pulse{animation:4s ease-in-out infinite glow-pulse}.animate-float{animation:6s ease-in-out infinite float}.animate-fade-in-up{opacity:0;animation:.6s ease-out forwards fade-in-up;transform:translateY(20px)}.delay-100{animation-delay:.1s}.delay-200{animation-delay:.2s}.delay-300{animation-delay:.3s}.delay-400{animation-delay:.4s}.delay-500{animation-delay:.5s}.scroll-reveal{opacity:0;transition:opacity .6s ease-out,transform .6s ease-out;transform:translateY(20px)}.scroll-reveal.revealed{opacity:1;transform:translateY(0)}@keyframes fade-in-line{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes number-pulse{0%,to{box-shadow:0 0 oklch(55% .22 270/.4)}50%{box-shadow:0 0 0 8px oklch(55% .22 270/0)}}.timeline-number.revealed{animation:2s ease-in-out forwards number-pulse}.compare-table tbody tr{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-table tbody tr.revealed{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}html{scroll-behavior:auto}.animate-fade-in,.animate-fade-in-up,.animate-fade-in-delay-1,.animate-fade-in-delay-2,.animate-fade-in-delay-3,.animate-fade-in-delay-4,.scroll-reveal{opacity:1!important;transform:none!important}}.hero-gradient{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,oklch(60% .24 270),oklch(55% .22 270),oklch(50% .18 240));-webkit-background-clip:text;background-clip:text}.dark .hero-gradient{background:linear-gradient(135deg,oklch(72% .2 270),oklch(65% .22 270),oklch(60% .18 240));-webkit-background-clip:text;background-clip:text}.glow-purple{box-shadow:0 0 60px -12px oklch(55% .22 270/.2)}.dark .glow-purple{box-shadow:0 0 60px -12px oklch(65% .22 270/.2)}.glow-text{text-shadow:0 0 40px oklch(55% .22 270/.2)}.dark .glow-text{text-shadow:0 0 40px oklch(65% .22 270/.25)}.grid-bg{background-image:linear-gradient(oklch(55% .22 270/.04) 1px,#0000 1px),linear-gradient(90deg,oklch(55% .22 270/.04) 1px,#0000 1px);background-size:64px 64px}.dark .grid-bg{background-image:linear-gradient(oklch(65% .22 270/.03) 1px,#0000 1px),linear-gradient(90deg,oklch(65% .22 270/.03) 1px,#0000 1px)}.hero-glow{filter:blur(80px);pointer-events:none;border-radius:50%;position:absolute}.section{width:100%;max-width:1152px;padding-left:var(--space-6);padding-right:var(--space-6);margin-left:auto;margin-right:auto}@media (width>=768px){.section{padding-left:var(--space-8);padding-right:var(--space-8)}}@media (width>=1280px){.section{padding-left:var(--space-10);padding-right:var(--space-10)}}.section-hero{padding-top:var(--space-24);padding-bottom:var(--space-16)}.section-compact{padding-top:var(--space-16);padding-bottom:var(--space-16)}.section-tall{padding-top:var(--space-24);padding-bottom:var(--space-24)}.glass-card{-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:var(--space-4);background:oklch(100% 0 0/.7);transition:border-color .2s ease-out,box-shadow .2s ease-out}.glass-card:hover{box-shadow:var(--shadow-card-hover);border-color:oklch(55% .22 270/.4)}.dark .glass-card{background:oklch(17% .01 270/.6);border-color:oklch(27% .01 270/.5)}.dark .glass-card:hover{border-color:oklch(65% .22 270/.3);box-shadow:0 0 24px oklch(65% .22 270/.08)}.feature-icon{width:var(--space-10);height:var(--space-10);border-radius:var(--space-3);color:var(--accent);background:oklch(55% .22 270/.08);flex-shrink:0;justify-content:center;align-items:center;display:flex}.dark .feature-icon{background:oklch(65% .22 270/.1)}.connect-line{padding:var(--space-1) 0;flex-direction:column;align-items:center;display:flex}.connect-line:before{content:"";width:1px;height:var(--space-4);background:oklch(55% .22 270/.2);display:block}.dark .connect-line:before{background:oklch(65% .22 270/.3)}.btn-primary{justify-content:center;align-items:center;gap:var(--space-2);background:var(--accent);color:var(--accent-foreground);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:600;font-family:var(--font-sans);cursor:pointer;border:none;min-height:44px;text-decoration:none;transition:transform .15s ease-out,box-shadow .2s ease-out;display:inline-flex}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 0 24px oklch(55% .22 270/.3)}.btn-primary:active{transform:translateY(0)}.dark .btn-primary:hover{box-shadow:0 0 24px oklch(65% .22 270/.35)}.btn-ghost{justify-content:center;align-items:center;gap:var(--space-2);color:var(--muted-foreground);border:1px solid var(--border);border-radius:var(--space-2);padding:var(--space-2) var(--space-5);font-size:14px;font-weight:500;font-family:var(--font-sans);cursor:pointer;background:0 0;min-height:44px;text-decoration:none;transition:border-color .15s ease-out,color .15s ease-out;display:inline-flex}.btn-ghost:hover{border-color:var(--accent);color:var(--accent)}.accent-badge{align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-3);color:var(--accent);letter-spacing:.02em;background:oklch(55% .22 270/.08);border-radius:9999px;font-size:12px;font-weight:600;display:inline-flex}.badge-dot{background:var(--accent);border-radius:9999px;width:6px;height:6px}.terminal-block{background:linear-gradient(135deg, var(--card), var(--muted));border:1px solid var(--border);position:relative}.terminal-block:before{content:"";background:linear-gradient(90deg, transparent, var(--accent), transparent);opacity:.4;height:1px;position:absolute;top:0;left:0;right:0}.terminal{border:1px solid var(--border);border-radius:var(--space-3);font-family:var(--font-mono);background:oklch(10% 0 0);overflow:hidden}.terminal-header{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);background:oklch(10% 0 0);display:flex}.terminal-body{padding:var(--space-4) var(--space-5);color:var(--foreground);font-size:.8125rem;line-height:1.625;overflow-x:auto}.terminal-title{color:var(--muted-foreground);margin-left:var(--space-2);font-size:12px;font-weight:500;font-family:var(--font-sans)}.terminal-dot{width:var(--space-2);height:var(--space-2);border-radius:9999px}.terminal-dot-red{background:var(--destructive)}.terminal-dot-yellow{background:var(--warning)}.terminal-dot-green{background:var(--success)}.syntax-cmd{color:var(--accent-bright);font-weight:600}.syntax-flag{color:oklch(75% .15 240)}.syntax-highlight{color:var(--accent)}.syntax-string{color:oklch(78% .16 155)}.typing-cursor{background:var(--accent);vertical-align:text-bottom;width:8px;height:1.2em;animation:1s step-end infinite blink;display:inline-block}.copy-btn{top:var(--space-3);right:var(--space-3);border-radius:var(--space-1);border:1px solid var(--border);background:var(--card);width:32px;height:32px;color:var(--muted-foreground);cursor:pointer;opacity:0;justify-content:center;align-items:center;transition:opacity .15s,color .15s;display:flex;position:absolute}.terminal:hover .copy-btn,.terminal-block:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--foreground)}.timeline-step{text-align:center;align-items:center;gap:var(--space-3);flex-direction:column;display:flex}.timeline-number{width:var(--space-10);height:var(--space-10);color:var(--accent);background:oklch(55% .22 270/.08);border-radius:9999px;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex}.dark .timeline-number{background:oklch(65% .22 270/.1)}.cora-col{background:oklch(55% .22 270/.04)}.cora-col th,.cora-col td{color:var(--accent)}.dark .cora-col{background:oklch(65% .22 270/.06)}.site-header{z-index:50;border-bottom:1px solid var(--border);-webkit-backdrop-filter:blur(12px);background:oklch(99% .002 270/.8);position:sticky;top:0}.dark .site-header{background:oklch(13% .01 270/.8)}.site-header-link{color:var(--muted-foreground);font-size:14px;text-decoration:none;transition:color .15s}.site-header-link:hover,.site-header-link.active{color:var(--foreground)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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-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} diff --git a/website/build/_app/immutable/assets/3.DTuVOu2m.css b/website/build/_app/immutable/assets/3.DTuVOu2m.css new file mode 100644 index 0000000..57f47e6 --- /dev/null +++ b/website/build/_app/immutable/assets/3.DTuVOu2m.css @@ -0,0 +1 @@ +.compare-glass-card.svelte-14kdxof{border:1px solid var(--border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:oklch(99% .002 270/.6);border-radius:16px;overflow:hidden;box-shadow:0 4px 24px -4px oklch(40% .02 270/.08)}.dark .compare-glass-card.svelte-14kdxof{background:oklch(16% .015 270/.6);box-shadow:0 4px 24px -4px oklch(10% .02 270/.2)}.compare-table.svelte-14kdxof{border-collapse:collapse}.compare-table.svelte-14kdxof th:where(.svelte-14kdxof),.compare-table.svelte-14kdxof td:where(.svelte-14kdxof){border-bottom:1px solid var(--border);white-space:nowrap;padding:14px 16px;font-size:14px}.compare-table.svelte-14kdxof thead:where(.svelte-14kdxof) th:where(.svelte-14kdxof){text-transform:uppercase;letter-spacing:.05em;color:var(--muted-foreground);border-bottom:2px solid var(--border);padding:16px;font-size:13px;font-weight:600}.compare-table.svelte-14kdxof tbody:where(.svelte-14kdxof) tr:where(.svelte-14kdxof):last-child td:where(.svelte-14kdxof){border-bottom:none}.cora-highlight-col.svelte-14kdxof{background:oklch(55% .22 270/.05)}.dark .cora-highlight-col.svelte-14kdxof{background:oklch(65% .22 270/.08)}.cora-badge.svelte-14kdxof{color:oklch(55% .22 270);background:oklch(55% .22 270/.12);border-radius:6px;align-items:center;padding:2px 10px;font-size:13px;font-weight:700;display:inline-flex}.dark .cora-badge.svelte-14kdxof{color:oklch(75% .2 270);background:oklch(65% .22 270/.18)}.check-badge.svelte-14kdxof{color:oklch(50% .18 150);background:oklch(60% .18 150/.12);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:700;display:inline-flex}.dark .check-badge.svelte-14kdxof{color:oklch(70% .15 150);background:oklch(60% .18 150/.18)}.check-muted.svelte-14kdxof{width:26px;height:26px;color:var(--muted-foreground);border-radius:8px;justify-content:center;align-items:center;font-size:14px;display:inline-flex}.cross-badge.svelte-14kdxof{color:oklch(55% .15 25);background:oklch(55% .15 25/.08);border-radius:8px;justify-content:center;align-items:center;width:26px;height:26px;font-size:14px;font-weight:600;display:inline-flex}.dark .cross-badge.svelte-14kdxof{color:oklch(60% .15 25);background:oklch(60% .15 25/.12)}.dash-muted.svelte-14kdxof{color:var(--muted-foreground);opacity:.5}.compare-row.svelte-14kdxof{opacity:0;transition:opacity .4s ease-out,transform .4s ease-out;transform:translateY(8px)}.compare-row.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.compare-card.svelte-14kdxof{border:1px solid var(--border);opacity:0;background:oklch(99% .002 270/.6);border-radius:12px;transition:opacity .4s ease-out,transform .4s ease-out;overflow:hidden;transform:translateY(8px)}.compare-card.revealed.svelte-14kdxof{opacity:1;transform:translateY(0)}.dark .compare-card.svelte-14kdxof{background:oklch(16% .015 270/.6)}.compare-card-header.svelte-14kdxof{border-bottom:1px solid var(--border);background:oklch(96% .003 270);padding:10px 14px}.dark .compare-card-header.svelte-14kdxof{background:oklch(14% .012 270)}.compare-card-body.svelte-14kdxof{grid-template-columns:1fr 1fr 1fr 1fr;gap:0;display:grid}.compare-card-cora.svelte-14kdxof{border-right:1px solid var(--border);background:oklch(55% .22 270/.05);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.dark .compare-card-cora.svelte-14kdxof{background:oklch(65% .22 270/.08)}.compare-card-comp.svelte-14kdxof{border-right:1px solid var(--border);flex-direction:column;align-items:center;gap:4px;padding:10px 8px;display:flex}.compare-card-comp.svelte-14kdxof:last-child{border-right:none} diff --git a/website/build/_app/immutable/chunks/BuBrZOIh.js b/website/build/_app/immutable/chunks/BuBrZOIh.js new file mode 100644 index 0000000..f25a39f --- /dev/null +++ b/website/build/_app/immutable/chunks/BuBrZOIh.js @@ -0,0 +1 @@ +import{D as e,G as t,K as n,M as r,P as i,T as a,W as o,X as s,Z as c,a as l,b as u,ct as d,g as f,i as p,it as m,l as h,lt as g,rt as _,tt as v,ut as y,v as b,w as x,x as S}from"./Du04-Wio.js";import"./xihTtKlq.js";var C=class{#e;#t;constructor(e,t){this.#e=e,this.#t=c(t)}get current(){return this.#t(),this.#e()}},w=/\(.+\)/,T=new Set([`all`,`print`,`screen`,`and`,`or`,`not`,`only`]),E=class extends C{constructor(e,t){let n=w.test(e)||e.split(/[\s,]+/).some(e=>T.has(e.trim()))?e:`(${e})`,i=window.matchMedia(n);super(()=>i.matches,e=>r(i,`change`,e))}},D={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},O=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},k=Symbol(`lucide-context`),A=()=>v(k),j=new Set([`$$slots`,`$$events`,`$$legacy`,`name`,`color`,`size`,`strokeWidth`,`absoluteStrokeWidth`,`iconNode`,`children`]),M=e(``);function N(e,r){m(r,!0);let c=A()??{},v=p(r,`color`,19,()=>c.color??`currentColor`),C=p(r,`size`,19,()=>c.size??24),w=p(r,`strokeWidth`,19,()=>c.strokeWidth??2),T=p(r,`absoluteStrokeWidth`,19,()=>c.absoluteStrokeWidth??!1),E=p(r,`iconNode`,19,()=>[]),k=l(r,j),N=s(()=>T()?Number(w())*24/Number(C()):w());var P=M();h(P,e=>({...D,...e,...k,width:C(),height:C(),stroke:v(),"stroke-width":i(N),class:[`lucide-icon lucide`,c.class,r.name&&`lucide-${r.name}`,r.class]}),[()=>!r.children&&!O(k)&&{"aria-hidden":`true`}]);var F=o(P);u(F,17,E,S,(e,n)=>{var r=s(()=>y(i(n),2));let o=()=>i(r)[0],c=()=>i(r)[1];var l=a();f(t(l),o,!0,(e,t)=>{h(e,()=>({...c()}))}),x(e,l)}),b(n(F),()=>r.children??g),d(P),x(e,P),_()}export{E as n,N as t}; \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/DozEvg9T.js b/website/build/_app/immutable/chunks/DozEvg9T.js new file mode 100644 index 0000000..441a849 --- /dev/null +++ b/website/build/_app/immutable/chunks/DozEvg9T.js @@ -0,0 +1 @@ +import"./Du04-Wio.js";import{r as e}from"./DyVSz01m.js";var t=()=>{let t=e;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},n={subscribe(e){return t().page.subscribe(e)}};export{n as t}; \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/Du04-Wio.js b/website/build/_app/immutable/chunks/Du04-Wio.js new file mode 100644 index 0000000..13623c5 --- /dev/null +++ b/website/build/_app/immutable/chunks/Du04-Wio.js @@ -0,0 +1,3 @@ +var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var y=1<<24,b=1024,x=2048,S=4096,ee=8192,te=16384,ne=32768,re=1<<25,ie=65536,ae=1<<18,oe=1<<19,se=1<<20,ce=1<<25,le=65536,ue=1<<21,de=1<<22,fe=1<<23,C=Symbol(`$state`),pe=Symbol(`legacy props`),me=Symbol(``),he=Symbol(`attributes`),ge=Symbol(`class`),_e=Symbol(`style`),ve=Symbol(`text`),ye=Symbol(`form reset`),be=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},xe=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function Se(e){throw Error(`https://svelte.dev/e/experimental_async_required`)}function Ce(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function we(){throw Error(`https://svelte.dev/e/missing_context`)}function Te(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ee(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function De(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Oe(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function ke(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Ae(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function je(){throw Error(`https://svelte.dev/e/fork_discarded`)}function Me(){throw Error(`https://svelte.dev/e/fork_timing`)}function Ne(){throw Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`)}function Pe(){throw Error(`https://svelte.dev/e/hydration_failed`)}function Fe(e){throw Error(`https://svelte.dev/e/lifecycle_legacy_only`)}function Ie(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Le(){throw Error(`https://svelte.dev/e/set_context_after_init`)}function Re(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function ze(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Be(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ve(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var He={},w=Symbol(`uninitialized`),Ue=`http://www.w3.org/1999/xhtml`,We=`http://www.w3.org/2000/svg`,Ge=`http://www.w3.org/1998/Math/MathML`,Ke=`@attach`;function qe(){console.warn(`https://svelte.dev/e/derived_inert`)}function Je(e){console.warn(`https://svelte.dev/e/hydratable_missing_but_expected`)}function Ye(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Xe(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function Ze(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var T=!1;function E(e){T=e}var D;function O(e){if(e===null)throw Ye(),He;return D=e}function k(){return O(z(D))}function Qe(e){if(T){if(z(D)!==null)throw Ye(),He;D=e}}function $e(e=1){if(T){for(var t=e,n=D;t--;)n=z(n);D=n}}function et(e=!0){for(var t=0,n=D;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else (r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=z(n);e&&n.remove(),n=i}}function tt(e){if(!e||e.nodeType!==8)throw Ye(),He;return e.data}function nt(e){return e===this.v}function rt(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function it(e){return!rt(e,this.v)}var A=!1,at=!1;function ot(){at=!0}var j=null;function st(e){j=e}function ct(){let e={};return[()=>(dt(e)||we(),lt(e)),t=>ut(e,t)]}function lt(e){return gt(`getContext`).get(e)}function ut(e,t){let n=gt(`setContext`);if(A){var r=K.f;!U&&r&32&&!j.i||Le()}return n.set(e,t),t}function dt(e){return gt(`hasContext`).has(e)}function ft(){return gt(`getAllContexts`)}function pt(e,t=!1,n){j={p:j,i:!1,c:null,e:null,s:e,x:null,r:K,l:at&&!t?{s:null,u:null,$:[]}:null}}function mt(e){var t=j,n=t.e;if(n!==null){t.e=null;for(var r of n)or(r)}return e!==void 0&&(t.x=e),t.i=!0,j=t.p,e??{}}function ht(){return!at||j!==null&&j.l===null}function gt(e){return j===null&&Ce(e),j.c??=new Map(_t(j)||void 0)}function _t(e){let t=e.p;for(;t!==null;){let e=t.c;if(e!==null)return e;t=t.p}return null}var vt=[];function yt(){var e=vt;vt=[],g(e)}function bt(e){if(vt.length===0&&!Ht){var t=vt;queueMicrotask(()=>{t===vt&&yt()})}vt.push(e)}function xt(){for(;vt.length>0;)yt()}function St(e){var t=K;if(t===null)return U.f|=fe,e;if(!(t.f&32768)&&!(t.f&4))throw e;Ct(e,t)}function Ct(e,t){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}var wt=~(x|S|b);function M(e,t){e.f=e.f&wt|t}function Tt(e){e.f&512||e.deps===null?M(e,b):M(e,S)}function Et(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=le,Et(t.deps))}function Dt(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),Et(e.deps),M(e,b)}function Ot(e,t,n){if(e==null)return t(void 0),n&&n(void 0),m;let r=qr(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}var kt=[];function At(e,t=m){let n=null,r=new Set;function i(t){if(rt(e,t)&&(e=t,n)){let t=!kt.length;for(let t of r)t[1](),kt.push(t,e);if(t){for(let e=0;e{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:i,update:a,subscribe:o}}function jt(e){let t;return Ot(e,e=>t=e)(),t}var Mt=!1,Nt=!1,Pt=Symbol(`unmounted`);function Ft(e,t,n){let r=n[t]??={store:null,source:An(void 0),unsubscribe:m};if(r.store!==e&&!(Pt in n))if(r.unsubscribe(),r.store=e??null,e==null)r.source.v=void 0,r.unsubscribe=m;else{var i=!0;r.unsubscribe=Ot(e,e=>{i?r.source.v=e:I(r.source,e)}),i=!1}return e&&Pt in n?jt(e):Q(r.source)}function It(){let e={};function t(){ir(()=>{for(var t in e)e[t].unsubscribe();o(e,Pt,{enumerable:!1,value:!0})})}return[e,t]}function Lt(e){var t=Nt;try{return Nt=!1,[e(),Nt]}finally{Nt=t}}var Rt=null,zt=null,N=null,Bt=null,P=null,Vt=null,Ht=!1,Ut=!1,Wt=null,Gt=null,Kt=0,qt=1,Jt=class e{id=qt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){zt===null?Rt=zt=this:(zt.#n=this,this.#t=zt),zt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)M(r,x),t(r);for(r of n.m)M(r,S),t(r)}this.#p.add(e)}#g(){this.#e=!0,Kt++>1e3&&(this.#S(),Xt());for(let e of this.#u)this.#d.delete(e),M(e,x),this.schedule(e);for(let e of this.#d)M(e,S),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Wt=[],r=[],i=Gt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw rn(e),this.#h()||this.discard(),t}if(N=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Wt=null,Gt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)nn(e,t);i.length>0&&N.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),Bt=this,Zt(r),Zt(n),Bt=null,this.#s?.resolve();var s=N;if(this.#a===0&&(this.#c.length===0||s!==null)&&(this.#S(),A&&(this.#x(),N=s)),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=b;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=b:i&4?t.push(r):A&&i&16777224?n.push(r):Lr(r)&&(i&16&&this.#d.add(r),Hr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),M(i,x),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),N=this,this.#g()}#b(e){for(var t=0;t!l.current.get(e)[1]&&!this.current.has(e));if(r.length===0)e&&l.discard();else if(t.length>0){if(e)for(let e of this.#p)l.unskip_effect(e,e=>{e.f&4194320?l.schedule(e):l.#b([e])});l.activate();var i=new Set,a=new Map;for(var o of t)Qt(o,r,i,a);a=new Map;var s=[...l.current].filter(([e,t])=>{let n=this.current.get(e);return n?n[0]!==t[0]||n[1]!==t[1]:!0}).map(([e])=>e);if(s.length>0)for(let e of this.#l)!(e.f&155648)&&en(e,s,a)&&(e.f&4194320?(M(e,x),l.schedule(e)):l.#u.add(e));if(l.#c.length>0&&!l.#m){l.apply();for(var c of l.#c)l.#_(c,[],[]);l.#c=[]}l.deactivate()}}}}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,bt(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=_()).promise}static ensure(){if(N===null){let t=N=new e;!Ut&&!Ht&&bt(()=>{t.#e||t.flush()})}return N}apply(){if(!A||!this.is_fork&&this.#t===null&&this.#n===null){P=null;return}P=new Map;for(let[e,[t]]of this.current)P.set(e,t);for(let t=Rt;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id0)){Tn.clear();for(let e of F){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)F.has(n)&&(F.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||Hr(n)}}F.clear()}}F=null}}function Qt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Qt(i,t,n,r):e&4194320&&!(e&2048)&&en(i,t,r)&&(M(i,x),tn(i))}}function $t(e,t){if(e.reactions!==null)for(let n of e.reactions){let e=n.f;e&2?$t(n,t):e&131072&&(M(n,x),t.add(n))}}function en(e,t,n){let r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(let r of e.deps){if(i.call(t,r))return!0;if(r.f&2&&en(r,t,n))return n.set(r,!0),!0}return n.set(e,!1),!1}function tn(e){N.schedule(e)}function nn(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),M(e,b);for(var n=e.first;n!==null;)nn(n,t),n=n.next}}function rn(e){M(e,b);for(var t=e.first;t!==null;)rn(t),t=t.next}function an(e){A||Se(`fork`),N!==null&&Me();var t=Jt.ensure();t.is_fork=!0,P=new Map;var n=!1,r=t.settled();return Yt(e),{commit:async()=>{if(n){await r;return}t.linked||je(),n=!0,t.is_fork=!1;for(var[e,[i]]of t.current)e.v=i,e.wv=Ir();Yt(()=>{var e=new Set;for(var n of t.current.keys())$t(n,e);En(e),Mn()}),t.flush(),await r},discard:()=>{for(var e of t.current.keys())e.wv=Ir();!n&&t.linked&&t.discard()}}}function on(e){let t=0,n=On(0),r;return()=>{rr()&&(Q(n),fr(()=>(t===0&&(r=qr(()=>e(()=>Nn(n)))),t+=1,()=>{bt(()=>{--t,t===0&&(r?.(),r=void 0,Nn(n))})})))}}var sn=ie|oe;function cn(e,t,n,r){new ln(e,t,n,r)}var ln=class{parent;is_pending=!1;transform_error;#e;#t=T?D:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=on(()=>(this.#m=On(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=K;t.b=this,t.f|=128,n(e)},this.parent=K.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=mr(()=>{if(T){let e=this.#t;k();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},sn),T&&(this.#e=D)}#g(){try{this.#a=V(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=V(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=V(()=>e(this.#e)),bt(()=>{var e=this.#c=document.createDocumentFragment(),t=L();e.append(t),this.#a=this.#x(()=>V(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,xr(this.#o,()=>{this.#o=null}),this.#b(N))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=V(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Tr(this.#a,e);let t=this.#n.pending;this.#o=V(()=>t(this.#e))}else this.#b(N)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){Dt(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=K,n=U,r=j;q(this.#i),G(this.#i),st(this.#i.ctx);try{return Jt.ensure(),e()}catch(e){return St(e),null}finally{q(t),G(n),st(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&xr(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,bt(()=>{this.#d=!1,this.#m&&jn(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),Q(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;N?.is_fork?(this.#a&&N.skip_effect(this.#a),this.#o&&N.skip_effect(this.#o),this.#s&&N.skip_effect(this.#s),N.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(H(this.#a),null),this.#o&&=(H(this.#o),null),this.#s&&=(H(this.#s),null),T&&(O(this.#t),$e(),O(et()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Ze();return}r=!0,i&&Ve(),this.#s!==null&&xr(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){Ct(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return V(()=>{var t=K;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return Ct(e,this.#i.parent),null}}))};bt(()=>{var t;try{t=this.transform_error(e)}catch(e){Ct(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>Ct(e,this.#i&&this.#i.parent)):o(t)})}};function un(e,t,n,r){let i=ht()?mn:vn;var a=e.filter(e=>!e.settled);if(n.length===0&&a.length===0){r(t.map(i));return}var o=K,s=dn(),c=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function l(e){if(!(o.f&16384)){s();try{r(e)}catch(e){Ct(e,o)}fn()}}var u=pn();if(n.length===0){c.then(()=>l(t.map(i))).finally(u);return}function d(){Promise.all(n.map(e=>gn(e))).then(e=>l([...t.map(i),...e])).catch(e=>Ct(e,o)).finally(u)}c?c.then(()=>{s(),d(),fn()}):d()}function dn(){var e=K,t=U,n=j,r=N;return function(i=!0){q(e),G(t),st(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function fn(e=!0){q(null),G(null),st(null),e&&N?.deactivate()}function pn(){var e=K,t=e.b,n=N,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function mn(e){var t=2|x;return K!==null&&(K.f|=oe),{ctx:j,deps:null,effects:null,equals:nt,f:t,fn:e,reactions:null,rv:0,v:w,wv:0,parent:K,ac:null}}var hn=Symbol(`obsolete`);function gn(e,t,n){let r=K;r===null&&Te();var i=void 0,a=On(w),o=!U,s=new Set;return dr(()=>{var t=K,n=_();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==be&&n.reject(e)}).finally(fn)}catch(e){n.reject(e),fn()}var c=N;if(o){if(t.f&32768)var l=pn();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(hn);else for(let e of s.values())e.reject(hn);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==hn&&(c.activate(),t?(a.f|=fe,jn(a,t)):(a.f&8388608&&(a.f^=fe),jn(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),ir(()=>{for(let e of s)e.reject(hn)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function _n(e){let t=mn(e);return A||Ar(t),t}function vn(e){let t=mn(e);return t.equals=it,t}function yn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Dn&&Mn()}return t}function Mn(){Dn=!1;for(let e of wn){e.f&1024&&M(e,S);let t;try{t=Lr(e)}catch{t=!0}t&&Hr(e)}wn.clear()}function Nn(e){I(e,e.v+1)}function Pn(e,t,n){var r=e.reactions;if(r!==null)for(var i=ht(),a=r.length,o=0;o{if(Pr===c)return e();var t=U,n=Pr;G(null),Fr(c);var r=e();return G(t),Fr(n),r};return i&&r.set(`length`,kn(e.length,o)),new Proxy(e,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&Re();var i=r.get(t);return i===void 0?f(()=>{var e=kn(n.value,o);return r.set(t,e),e}):I(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>kn(w,o));r.set(t,e),Nn(a)}}else I(n,w),Nn(a);return!0},get(t,n,i){if(n===C)return e;var a=r.get(n),c=n in t;if(a===void 0&&(!c||s(t,n)?.writable)&&(a=f(()=>kn(Fn(c?t[n]:w),o)),r.set(n,a)),a!==void 0){var l=Q(a);return l===w?void 0:l}return Reflect.get(t,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=Q(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==w)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===C)return!0;var n=r.get(t),i=n!==void 0&&n.v!==w||Reflect.has(e,t);return(n!==void 0||K!==null&&(!i||s(e,t)?.writable))&&(n===void 0&&(n=f(()=>kn(i?Fn(e[t]):w,o)),r.set(t,n)),Q(n)===w)?!1:i},set(e,t,n,c){var l=r.get(t),u=t in e;if(i&&t===`length`)for(var d=n;dkn(w,o)),r.set(d+``,p)):I(p,w)}if(l===void 0)(!u||s(e,t)?.writable)&&(l=f(()=>kn(void 0,o)),I(l,Fn(n)),r.set(t,l));else{u=l.v!==w;var m=f(()=>Fn(n));I(l,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(c,n),!u){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&I(g,_+1)}Nn(a)}return!0},ownKeys(e){Q(a);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==w});for(var[n,i]of r)i.v!==w&&!(n in e)&&t.push(n);return t},setPrototypeOf(){ze()}})}function In(e){try{if(typeof e==`object`&&e&&C in e)return e[C]}catch{}return e}function Ln(e,t){return Object.is(In(e),In(t))}new Set([`copyWithin`,`fill`,`pop`,`push`,`reverse`,`shift`,`sort`,`splice`,`unshift`]);var Rn,zn,Bn,Vn,Hn;function Un(){if(Rn===void 0){Rn=window,zn=document,Bn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Vn=s(t,`firstChild`).get,Hn=s(t,`nextSibling`).get,f(e)&&(e[ge]=void 0,e[he]=null,e[_e]=void 0,e.__e=void 0),f(n)&&(n[ve]=void 0)}}function L(e=``){return document.createTextNode(e)}function R(e){return Vn.call(e)}function z(e){return Hn.call(e)}function Wn(e,t){if(!T)return R(e);var n=R(D);if(n===null)n=D.appendChild(L());else if(t&&n.nodeType!==3){var r=L();return n?.before(r),O(r),r}return t&&Xn(n),O(n),n}function Gn(e,t=!1){if(!T){var n=R(e);return n instanceof Comment&&n.data===``?z(n):n}if(t){if(D?.nodeType!==3){var r=L();return D?.before(r),O(r),r}Xn(D)}return D}function Kn(e,t=1,n=!1){let r=T?D:e;for(var i;t--;)i=r,r=z(r);if(!T)return r;if(n){if(r?.nodeType!==3){var a=L();return r===null?i?.after(a):r.before(a),O(a),a}Xn(r)}return O(r),r}function qn(e){e.textContent=``}function Jn(){return!A||F!==null?!1:(K.f&ne)!==0}function Yn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function Xn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Zn(e,t){if(t){let t=document.body;e.autofocus=!0,bt(()=>{document.activeElement===t&&e.focus()})}}var Qn=!1;function $n(){Qn||(Qn=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ye]?.()})},{capture:!0}))}function er(e){var t=U,n=K;G(null),q(null);try{return e()}finally{G(t),q(n)}}function tr(e){K===null&&(U===null&&ke(e),Oe()),Or&&De(e)}function nr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function B(e,t){var n=K;n!==null&&n.f&8192&&(e|=ee);var r={ctx:j,deps:null,nodes:null,f:e|x|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};N?.register_created_effect(r);var i=r;if(e&4)Wt===null?Jt.ensure().schedule(r):Wt.push(r);else if(t!==null){try{Hr(r)}catch(e){throw H(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=ie))}if(i!==null&&(i.parent=n,n!==null&&nr(i,n),U!==null&&U.f&2&&!(e&64))){var a=U;(a.effects??=[]).push(i)}return r}function rr(){return U!==null&&!W}function ir(e){let t=B(8,null);return M(t,b),t.teardown=e,t}function ar(e){tr(`$effect`);var t=K.f;if(!U&&t&32&&j!==null&&!j.i){var n=j;(n.e??=[]).push(e)}else return or(e)}function or(e){return B(4|se,e)}function sr(e){return tr(`$effect.pre`),B(8|se,e)}function cr(e){Jt.ensure();let t=B(64|oe,e);return()=>{H(t)}}function lr(e){Jt.ensure();let t=B(64|oe,e);return(e={})=>new Promise(n=>{e.outro?xr(t,()=>{H(t),n(void 0)}):(H(t),n(void 0))})}function ur(e){return B(4,e)}function dr(e){return B(de|oe,e)}function fr(e,t=0){return B(8|t,e)}function pr(e,t=[],n=[],r=[]){un(r,t,n,t=>{B(8,()=>e(...t.map(Q)))})}function mr(e,t=0){return B(16|t,e)}function hr(e,t=0){return B(y|t,e)}function V(e){return B(32|oe,e)}function gr(e){var t=e.teardown;if(t!==null){let e=Or,n=U;kr(!0),G(null);try{t.call(null)}finally{kr(e),G(n)}}}function _r(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&er(()=>{e.abort(be)});var r=n.next;n.f&64?n.parent=null:H(n,t),n=r}}function vr(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||H(t),t=n}}function H(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(yr(e.nodes.start,e.nodes.end),n=!0),M(e,re),_r(e,t&&!n),Vr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();gr(e),e.f^=re,e.f|=te;var i=e.parent;i!==null&&i.first!==null&&br(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function yr(e,t){for(;e!==null;){var n=e===t?null:z(e);e.remove(),e=n}}function br(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function xr(e,t,n=!0){var r=[];Sr(e,r,!0);var i=()=>{n&&H(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Sr(e,t,n){if(!(e.f&8192)){e.f^=ee;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Sr(i,t,o?n:!1)}i=a}}}function Cr(e){wr(e,!0)}function wr(e,t){if(e.f&8192){e.f^=ee,e.f&1024||(M(e,x),Jt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;wr(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Tr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:z(n);t.append(n),n=i}}var Er=null,Dr=!1,Or=!1;function kr(e){Or=e}var U=null,W=!1;function G(e){U=e}var K=null;function q(e){K=e}var J=null;function Ar(e){U!==null&&(!A||U.f&2)&&(J??=new Set).add(e)}var Y=null,X=0,Z=null;function jr(e){Z=e}var Mr=1,Nr=0,Pr=Nr;function Fr(e){Pr=e}function Ir(){return++Mr}function Lr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~le),t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&P===null&&M(e,b)}return!1}function Rr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!A&&J!==null&&J.has(e)))for(var i=0;i{e.ac.abort(be)}),e.ac=null);try{e.f|=ue;var u=e.fn,d=u();e.f|=ne;var f=e.deps,p=N?.is_fork;if(Y!==null){var m;if(p||Vr(e,X),f!==null&&X>0)for(f.length=X+Y.length,m=0;m{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),Yt()}function Wr(){return Jt.ensure().settled()}function Q(e){var t=(e.f&2)!=0;if(Er?.add(e),U!==null&&!W&&!(K!==null&&K.f&16384)&&(J===null||!J.has(e))){var n=U.deps;if(U.f&2097152)e.rvn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?bt(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function di(e,t,n,r={}){var i=ui(t,e,n,r);return()=>{e.removeEventListener(t,i,r)}}function fi(e,t,n){(t[si]??={})[e]=n}function pi(e){for(var t=0;t{throw e});throw p}}finally{e[si]=t,delete e.currentTarget,G(d),q(f)}}}var gi=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function _i(e){return gi?.createHTML(e)??e}function vi(e){var t=Yn(`template`);return t.innerHTML=_i(e.replaceAll(``,``)),t.content}function $(e,t){var n=K;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function yi(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(``);return()=>{if(T)return $(D,null),D;i===void 0&&(i=vi(a?e:``+e),n||(i=R(i)));var t=r||Bn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=R(t),s=t.lastChild;$(o,s)}else $(t,t);return t}}function bi(e,t,n=`svg`){var r=!e.startsWith(``),i=(t&1)!=0,a=`<${n}>${r?e:``+e}`,o;return()=>{if(T)return $(D,null),D;if(!o){var e=R(vi(a));if(i)for(o=document.createDocumentFragment();R(e);)o.appendChild(R(e));else o=R(e)}var t=o.cloneNode(!0);if(i){var n=R(t),r=t.lastChild;$(n,r)}else $(t,t);return t}}function xi(e,t){return bi(e,t,`svg`)}function Si(e=``){if(!T){var t=L(e+``);return $(t,t),t}var n=D;return n.nodeType===3?Xn(n):(n.before(n=L()),O(n)),$(n,n),n}function Ci(){if(T)return $(D,null),D;var e=document.createDocumentFragment(),t=document.createComment(``),n=L();return e.append(t,n),$(t,n),e}function wi(e,t){if(T){var n=K;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=D),k();return}e!==null&&e.before(t)}function Ti(){if(T&&D&&D.nodeType===8&&D.textContent?.startsWith(`$`)){let e=D.textContent.substring(1);return k(),e}return(window.__svelte??={}).uid??=1,`c${window.__svelte.uid++}`}function Ei(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ve]??=e.nodeValue)&&(e[ve]=n,e.nodeValue=`${n}`)}function Di(e,t){return Ai(e,t)}function Oi(e,t){Un(),t.intro=t.intro??!1;let n=t.target,r=T,i=D;try{for(var a=R(n);a&&(a.nodeType!==8||a.data!==`[`);)a=z(a);if(!a)throw He;E(!0),O(a);let r=Ai(e,{...t,anchor:a});return E(!1),r}catch(r){if(r instanceof Error&&r.message.split(` +`).some(e=>e.startsWith(`https://svelte.dev/e/`)))throw r;return r!==He&&console.warn(`Failed to hydrate: `,r),t.recover===!1&&Pe(),Un(),qn(n),E(!1),Di(e,t)}finally{E(r),O(i)}}var ki=new Map;function Ai(e,{target:t,anchor:n,props:r={},events:i,context:o,intro:s=!0,transformError:c}){Un();var l=void 0,u=lr(()=>{var s=n??t.appendChild(L());cn(s,{pending:()=>{}},t=>{pt({});var n=j;if(o&&(n.c=o),i&&(r.$$events=i),T&&$(t,null),l=e(t,r)||{},T&&(K.nodes.end=D,D===null||D.nodeType!==8||D.data!==`]`))throw Ye(),He;mt()},c);var u=new Set,d=e=>{for(var n=0;n{for(var e of u)for(let n of[t,document]){var r=ki.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,hi),r.delete(e),r.size===0&&ki.delete(n)):r.set(e,i)}li.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return ji.set(l,u),l}var ji=new WeakMap;function Mi(e,t){let n=ji.get(e);return n?(ji.delete(e),n(t)):Promise.resolve()}var Ni=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)Cr(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(Cr(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(H(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Tr(r,t),t.append(L()),this.#n.set(e,{effect:r,fragment:t})}else H(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),xr(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(H(n.effect),this.#n.delete(e))};ensure(e,t){var n=N,r=Jn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=L();i.append(a),this.#n.set(e,{effect:V(()=>t(a)),fragment:i})}else this.#t.set(e,V(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else T&&(this.anchor=D),this.#a(n)}};function Pi(e,t,n=!1){var r;T&&(r=D,k());var i=new Ni(e),a=n?ie:0;function o(e,t){if(T){var n=tt(r);if(e!==parseInt(n.substring(1))){var a=et();O(a),i.anchor=a,E(!1),i.ensure(e,t),E(!0);return}}i.ensure(e,t)}mr(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Fi(e,t){return t}function Ii(e,t,n){for(var r=[],i=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Li(e,a(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else --s},!1)}if(s===0){var l=r.length===0&&n!==null;if(l){var u=n,d=u.parentNode;qn(d),d.append(u),e.items.clear()}Li(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Li(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=r();return n(e)?e:e==null?[]:a(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Vi(v,p,c,t,i),d!==null&&(p.length===0?d.f&33554432?(d.f^=ce,Ui(d,null,c)):Cr(d):xr(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:mr(()=>{p=Q(f);var e=p.length;let n=!1;T&&tt(c)===`[!`!=(e===0)&&(c=et(),O(c),E(!1),n=!0);for(var a=new Set,u=N,v=Jn(),y=0;ys(c)):(d=V(()=>s(Ri??=L())),d.f|=ce)),e>a.size&&Ee(``,``,``),T&&e>0&&O(et()),!h)if(m.set(u,a),v){for(let[e,t]of l)a.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);n&&E(!0),Q(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,T&&(c=D)}function Bi(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Vi(e,t,n,r,i){var o=(r&8)!=0,s=t.length,c=e.items,l=Bi(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var re=r&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Hi(e,t,n,r,i,a,o,s){var c=o&1?o&16?On(n):An(n,!1,!1):null,l=o&2?On(i):null;return{v:c,i:l,e:V(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Ui(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=z(r);if(a.before(r),r===i)return;r=o}}function Wi(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Gi(e,t,n=!1,r=!1,i=!1,a=!1){var o=e,s=``;if(n){var c=e;T&&(o=O(R(c)))}pr(()=>{var e=K;if(s===(s=t()??``)){T&&k();return}if(n&&!T){e.nodes=null,c.innerHTML=s,s!==``&&$(R(c),c.lastChild);return}if(e.nodes!==null&&(yr(e.nodes.start,e.nodes.end),e.nodes=null),s!==``){if(T){for(var a=D.data,l=k(),u=l;l!==null&&(l.nodeType!==8||l.data!==``);)u=l,l=z(l);if(l===null)throw Ye(),He;$(D,u),o=O(l);return}var d=Yn(r?`svg`:i?`math`:`template`,r?We:i?Ge:void 0);d.innerHTML=s;var f=r||i?d:d.content;if($(R(f),f.lastChild),r||i)for(;R(f);)o.before(R(f));else o.before(f)}})}function Ki(e,t,...n){var r=new Ni(e);mr(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},ie)}function qi(e){return(t,...n)=>{var r=e(...n),i;T?(i=D,k()):(i=R(vi(r.render().trim())),t.before(i));let a=r.setup?.(i);$(i,i),typeof a==`function`&&ir(a)}}function Ji(e,t,n){var r;T&&(r=D,k());var i=new Ni(e);mr(()=>{var e=t()??null;if(T&&tt(r)===`[`!=(e!==null)){var a=et();O(a),i.anchor=a,E(!1),i.ensure(e,e&&(t=>n(t,e))),E(!0);return}i.ensure(e,e&&(t=>n(t,e)))},ie)}function Yi(e,t,n,r,i,a){let o=T;T&&k();var s=null;T&&D.nodeType===1&&(s=D,k());var c=T?D:e,l=new Ni(c,!1);mr(()=>{let e=t()||null;var a=i?i():n||e===`svg`?We:void 0;if(e===null){l.ensure(null,null);return}return l.ensure(e,t=>{if(e){if(s=T?s:Yn(e,a),$(s,s),r){var n=null;T&&oi(e)&&s.append(n=document.createComment(``));var i=T?R(s):s.appendChild(L());T&&(i===null?E(!1):O(i)),r(s,i),n?.remove()}K.nodes.end=s,t.before(s)}T&&O(t)}),()=>{}},ie),ir(()=>{}),o&&(E(!0),O(c))}function Xi(e,t){let n=null,r=T;var i;if(T){n=D;for(var a=R(document.head);a!==null&&(a.nodeType!==8||a.data!==e);)a=z(a);if(a===null)E(!1);else{var o=z(a);a.remove(),O(o)}}T||(i=document.head.appendChild(L()));try{mr(()=>{var e=V(()=>t(i));e.f|=ae})}finally{r&&(E(!0),O(n))}}function Zi(e,t){var n=void 0,r;hr(()=>{n!==(n=t())&&(r&&=(H(r),null),n&&(r=V(()=>{ur(()=>n(e))})))})}function Qi(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||ta.includes(r[o-1]))&&(s===r.length||ta.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function ra(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function ia(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function aa(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(ia)),i&&c.push(...Object.keys(i).map(ia));var l=0,u=-1;let t=e.length;for(var d=0;d{la(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),ir(()=>{t.disconnect()})}function da(e){return`__value`in e?e.__value:e.value}var fa=Symbol(`class`),pa=Symbol(`style`),ma=Symbol(`is custom element`),ha=Symbol(`is html`),ga=xe?`link`:`LINK`,_a=xe?`input`:`INPUT`,va=xe?`option`:`OPTION`,ya=xe?`select`:`SELECT`;function ba(e){if(T){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Sa(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Sa(e,`checked`,null),e.checked=r}}};e[ye]=n,bt(n),$n()}}function xa(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function Sa(e,t,n,r){var i=Ta(e);T&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===ga)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[me]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Da(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function Ca(e,t,n,r,i=!1,a=!1){if(T&&i&&e.nodeName===_a){var o=e;(o.type===`checkbox`?`defaultChecked`:`defaultValue`)in n||ba(o)}var s=Ta(e),c=s[ma],l=!s[ha];let u=T&&c;u&&E(!1);var d=t||{},f=e.nodeName===va;for(var p in t)p in n||(n[p]=null);n.class?n.class=ea(n.class):(r||n[fa])&&(n.class=null),n[pa]&&(n.style??=null);var m=Da(e);for(let i in n){let o=n[i];if(f&&i===`value`&&o==null){e.value=e.__value=``,d[i]=o;continue}if(i===`class`){oa(e,e.namespaceURI===`http://www.w3.org/1999/xhtml`,o,r,t?.[fa],n[fa]),d[i]=o,d[fa]=n[fa];continue}if(i===`style`){ca(e,o,t?.[pa],n[pa]),d[i]=o,d[pa]=n[pa];continue}var h=d[i];if(!(o===h&&!(o===void 0&&e.hasAttribute(i)))){d[i]=o;var g=i[0]+i[1];if(g!==`$$`)if(g===`on`){let t={},n=`$$`+i,r=i.slice(2);var _=$r(r);if(Zr(r)&&(r=r.slice(0,-7),t.capture=!0),!_&&h){if(o!=null)continue;e.removeEventListener(r,d[n],t),d[n]=null}if(_)fi(r,e,o),pi([r]);else if(o!=null){function a(e){d[i].call(this,e)}d[n]=ui(r,e,a,t)}}else if(i===`style`)Sa(e,i,o);else if(i===`autofocus`)Zn(e,!!o);else if(!c&&(i===`__value`||i===`value`&&o!=null))e.value=e.__value=o;else if(i===`selected`&&f)xa(e,o);else{var v=i;l||(v=ni(v));var y=v===`defaultValue`||v===`defaultChecked`;if(o==null&&!c&&!y)if(s[i]=null,v===`value`||v===`checked`){let n=e,r=t===void 0;if(v===`value`){let e=n.defaultValue;n.removeAttribute(v),n.defaultValue=e,n.value=n.__value=r?e:null}else{let e=n.defaultChecked;n.removeAttribute(v),n.defaultChecked=e,n.checked=r?e:!1}}else e.removeAttribute(i);else y||m.includes(v)&&(c||typeof o!=`string`)?(e[v]=o,v in s&&(s[v]=w)):typeof o!=`function`&&Sa(e,v,o,a)}}}return u&&E(!0),d}function wa(e,t,n=[],r=[],i=[],a,o=!1,s=!1){un(i,n,r,n=>{var r=void 0,i={},c=e.nodeName===ya,l=!1;if(hr(()=>{var u=t(...n.map(Q)),d=Ca(e,r,u,a,o,s);l&&c&&`value`in u&&la(e,u.value);for(let e of Object.getOwnPropertySymbols(i))u[e]||H(i[e]);for(let t of Object.getOwnPropertySymbols(u)){var f=u[t];t.description===`@attach`&&(!r||f!==r[t])&&(i[t]&&H(i[t]),i[t]=V(()=>Zi(e,()=>f))),d[t]=f}r=d}),c){var u=e;ur(()=>{la(u,r.value,!0),ua(u)})}l=!0})}function Ta(e){return e[he]??={[ma]:e.nodeName.includes(`-`),[ha]:e.namespaceURI===Ue}}var Ea=new Map;function Da(e){var t=e.getAttribute(`is`)||e.nodeName,n=Ea.get(t);if(n)return n;Ea.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=c(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.push(o);i=d(i)}return n}function Oa(e,t){return e===t||e?.[C]===t}function ka(e={},t,n,r){var i=j.r,a=K;return ur(()=>{var o,s;return fr(()=>{o=s,s=r?.()||[],qr(()=>{Oa(n(...s),e)||(t(e,...s),o&&Oa(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Oa(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Aa(e=!1){let t=j,n=t.l.u;if(!n)return;let r=()=>Jr(t.s);if(e){let e=0,n={},i=mn(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>Q(i)}n.b.length&&sr(()=>{ja(t,r),g(n.b)}),ar(()=>{let e=qr(()=>n.m.map(h));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&ar(()=>{ja(t,r),g(n.a)})}function ja(e,t){if(e.l.s)for(let t of e.l.s)Q(t);t()}var Ma={get(e,t){if(!e.exclude.has(t))return e.props[t]},set(e,t){return!1},getOwnPropertyDescriptor(e,t){if(!e.exclude.has(t)&&t in e.props)return{enumerable:!0,configurable:!0,value:e.props[t]}},has(e,t){return e.exclude.has(t)?!1:t in e.props},ownKeys(e){return Reflect.ownKeys(e.props).filter(t=>!e.exclude.has(t))}};function Na(e,t,n){return new Proxy({props:e,exclude:t},Ma)}var Pa={get(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(p(r)&&(r=r()),typeof r==`object`&&r&&t in r)return r[t]}},set(e,t,n){let r=e.props.length;for(;r--;){let i=e.props[r];p(i)&&(i=i());let a=s(i,t);if(a&&a.set)return a.set(n),!0}return!1},getOwnPropertyDescriptor(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(p(r)&&(r=r()),typeof r==`object`&&r&&t in r){let e=s(r,t);return e&&!e.configurable&&(e.configurable=!0),e}}},has(e,t){if(t===C||t===pe)return!1;for(let n of e.props)if(p(n)&&(n=n()),n!=null&&t in n)return!0;return!1},ownKeys(e){let t=[];for(let n of e.props)if(p(n)&&(n=n()),n){for(let e in n)t.includes(e)||t.push(e);for(let e of Object.getOwnPropertySymbols(n))t.includes(e)||t.push(e)}return t}};function Fa(...e){return new Proxy({props:e},Pa)}function Ia(e,t,n,r){var i=!at||(n&2)!=0,a=(n&8)!=0,o=(n&16)!=0,c=r,l=!0,u=void 0,d=()=>o&&i?(u??=mn(r),Q(u)):(l&&(l=!1,c=o?qr(r):r),c);let f;if(a){var p=C in e||pe in e;f=s(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=Lt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Ie(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?mn:vn)(()=>(v=!1,g()));a&&Q(y);var b=K;return(function(e,t){if(arguments.length>0){let n=t?Q(y):i&&a?Fn(e):e;return I(y,n),v=!0,c!==void 0&&(c=n),e}return Or&&v||b.f&16384?y.v:Q(y)})}function La(e){return class extends Ra{constructor(t){super({component:e,...t})}}}var Ra=class{#e;#t;constructor(e){var t=new Map,n=(e,n)=>{var r=An(n,!1,!1);return t.set(e,r),r};let r=new Proxy({...e.props||{},$$events:{}},{get(e,r){return Q(t.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===pe?!0:(Q(t.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,i){return I(t.get(r)??n(r,i),i),Reflect.set(e,r,i)}});this.#t=(e.hydrate?Oi:Di)(e.component,{target:e.target,anchor:e.anchor,props:r,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError}),!A&&(!e?.props?.$$host||e.sync===!1)&&Yt(),this.#e=r.$$events;for(let e of Object.keys(this.#t))e===`$set`||e===`$destroy`||e===`$on`||o(this,e,{get(){return this.#t[e]},set(t){this.#t[e]=t},enumerable:!0});this.#t.$set=e=>{Object.assign(r,e)},this.#t.$destroy=()=>{Mi(this.#t)}}$set(e){this.#t.$set(e)}$on(e,t){this.#e[e]=this.#e[e]||[];let n=(...e)=>t.call(this,...e);return this.#e[e].push(n),()=>{this.#e[e]=this.#e[e].filter(e=>e!==n)}}$destroy(){this.#t.$destroy()}};function za(e,t){if(A||Se(`hydratable`),T){let t=window.__svelte?.h;if(t?.has(e))return t.get(e);Je(e)}return t()}var Ba=t({afterUpdate:()=>qa,beforeUpdate:()=>Ka,createContext:()=>ct,createEventDispatcher:()=>Ga,createRawSnippet:()=>qi,flushSync:()=>Yt,fork:()=>an,getAbortSignal:()=>Va,getAllContexts:()=>ft,getContext:()=>lt,hasContext:()=>dt,hydratable:()=>za,hydrate:()=>Oi,mount:()=>Di,onDestroy:()=>Ua,onMount:()=>Ha,setContext:()=>ut,settled:()=>Wr,tick:()=>Ur,unmount:()=>Mi,untrack:()=>qr});function Va(){return U===null&&Ne(),(U.ac??=new AbortController).signal}function Ha(e){j===null&&Ce(`onMount`),at&&j.l!==null?Ja(j).m.push(e):ar(()=>{let t=qr(e);if(typeof t==`function`)return t})}function Ua(e){j===null&&Ce(`onDestroy`),Ha(()=>()=>qr(e))}function Wa(e,t,{bubbles:n=!1,cancelable:r=!1}={}){return new CustomEvent(e,{detail:t,bubbles:n,cancelable:r})}function Ga(){let e=j;return e===null&&Ce(`createEventDispatcher`),(t,r,i)=>{let a=e.s.$$events?.[t];if(a){let o=n(a)?a.slice():[a],s=Wa(t,r,i);for(let t of o)t.call(e.x,s);return!s.defaultPrevented}return!0}}function Ka(e){j===null&&Ce(`beforeUpdate`),j.l===null&&Fe(`beforeUpdate`),Ja(j).b.push(e)}function qa(e){j===null&&Ce(`afterUpdate`),j.l===null&&Fe(`afterUpdate`),Ja(j).a.push(e)}function Ja(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}export{Ft as $,pi as A,pr as B,Ei as C,xi as D,yi as E,Wr as F,Gn as G,sr as H,Ur as I,I as J,Kn as K,qr as L,di as M,Xr as N,Ti as O,Q as P,It as Q,ur as R,Pi as S,Ci as T,zn as U,ar as V,Wn as W,_n as X,kn as Y,on as Z,Ji as _,Na as a,ut as at,zi as b,ka as c,Qe as ct,ca as d,t as dt,At as et,oa as f,Yi as g,Xi as h,Ia as i,pt as it,fi as j,Si as k,wa as l,m as lt,$i as m,Ha as n,dt as nt,Fa as o,ot,ea as p,Fn as q,La as r,mt as rt,Aa as s,$e as st,Ba as t,lt as tt,Sa as u,v as ut,Ki as v,wi as w,Fi as x,Gi as y,cr as z}; \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/DyVSz01m.js b/website/build/_app/immutable/chunks/DyVSz01m.js new file mode 100644 index 0000000..299dfab --- /dev/null +++ b/website/build/_app/immutable/chunks/DyVSz01m.js @@ -0,0 +1 @@ +import{F as e,I as t,J as n,P as r,Y as i,et as a,n as o,t as s}from"./Du04-Wio.js";var c=class{constructor(e,t){this.status=e,typeof t==`string`?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(){}function g(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function _(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&y.delete(x(e)),v(e,t));var y=new Map;function ee(e,t){let n=x(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent),i=r.getAttribute(`data-ttl`);return i&&y.set(n,{body:e,init:t,ttl:1e3*Number(i)}),r.getAttribute(`data-b64`)!==null&&(e=_(e)),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function b(e,t,n){if(y.size>0){let t=x(e,n),r=y.get(t);if(r){if(performance.now(){let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return se(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return se(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=te.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return se(e)}).join(``)}).join(``)}/?$`),params:t}}function ie(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function ae(e){return e.slice(1).split(`/`).filter(ie)}function oe(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;ee).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function se(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function ce({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=re(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return oe(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function le(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ue(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_op75zz?.base??``,de=globalThis.__sveltekit_op75zz?.assets??S??``,fe=`1780713979666`,pe=`sveltekit:snapshot`,me=`sveltekit:scroll`,he=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},ge=location.origin;function _e(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function E(){return{x:pageXOffset,y:pageYOffset}}function D(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var ve={...T,"":T.hover};function ye(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function be(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=ye(e)}}function xe(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||k(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===ge&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function O(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=D(s,`preload-code`)),i===null&&(i=D(s,`preload-data`)),t===null&&(t=D(s,`keepfocus`)),n===null&&(n=D(s,`noscroll`)),a===null&&(a=D(s,`reload`)),o===null&&(o=D(s,`replacestate`)),s=ye(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:ve[r??`off`],preload_data:ve[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Se(e){let t=a(e),n=!0;function r(){n=!0,t.update(e=>e)}function i(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:i,subscribe:o}}var Ce={v:h};function we(){let{set:e,subscribe:t}=a(!1);async function n(){clearTimeout(void 0);try{let t=await fetch(`${de}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let n=(await t.json()).version!==fe;return n&&(e(!0),Ce.v(),clearTimeout(void 0)),n}catch{return!1}}return{subscribe:t,check:n}}function k(e,t,n){return e.origin!==ge||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Te(e){}var Ee=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);new Set([...Ee,`entries`]);var De=new Set([...Ee]);new Set([...De,`actions`,`entries`]),new Set([`GET`,`POST`,`PATCH`,`PUT`,`DELETE`,`OPTIONS`,`HEAD`,`fallback`,`prerender`,`trailingSlash`,`config`,`entries`]);function Oe(e){return e.filter(e=>e!=null)}function A(e,t){return e+`/`+t}function ke(e){return e instanceof c||e instanceof u?e.status:500}function Ae(e){return e instanceof u?e.text:`Internal Error`}var j,M,N,je=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),Me=`a:`;je?(j={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Me)},M={current:null},N={current:!1}):(j=new class{#e=i({});get data(){return r(this.#e)}set data(e){n(this.#e,e)}#t=i(null);get form(){return r(this.#t)}set form(e){n(this.#t,e)}#n=i(null);get error(){return r(this.#n)}set error(e){n(this.#n,e)}#r=i({});get params(){return r(this.#r)}set params(e){n(this.#r,e)}#i=i({id:null});get route(){return r(this.#i)}set route(e){n(this.#i,e)}#a=i({});get state(){return r(this.#a)}set state(e){n(this.#a,e)}#o=i(-1);get status(){return r(this.#o)}set status(e){n(this.#o,e)}#s=i(new URL(Me));get url(){return r(this.#s)}set url(e){n(this.#s,e)}},M=new class{#e=i(null);get current(){return r(this.#e)}set current(e){n(this.#e,e)}},N=new class{#e=i(!1);get current(){return r(this.#e)}set current(e){n(this.#e,e)}},Ce.v=()=>N.current=!0);function Ne(e){Object.assign(j,e)}var{onMount:Pe,tick:Fe}=s,Ie=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),P=null,F=le(`sveltekit:scroll`)??{},I=le(`sveltekit:snapshot`)??{},L={url:Se({}),page:Se({}),navigating:a(null),updated:we()};function Le(e){F[e]=E()}function Re(e,t){let n=e+1;for(;F[n];)delete F[n],n+=1;for(n=t+1;I[n];)delete I[n],n+=1}function R(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(h)}async function ze(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var Be,Ve,z,B,He,V,Ue=[],H=[],U=null;function We(){U?.fork?.then(e=>e?.discard()),U=null}var Ge=new Map,Ke=new Set,qe=new Set,W=new Set,G={branch:[],error:null,url:null,nav:null},Je=!1,Ye=!1,Xe=!0,K=!1,q=!1,Ze=!1,Qe=!1,$e,J,Y,X,et=new Set,tt=new Map,nt=new Map;async function rt(e,t,n){globalThis.__sveltekit_op75zz&&(globalThis.__sveltekit_op75zz.query,globalThis.__sveltekit_op75zz.prerender),document.URL!==location.href&&(location.href=location.href),V=e,await e.hooks.init?.(),Be=ce(e),B=document.documentElement,He=t,Ve=e.nodes[0],z=e.nodes[1],Ve(),z(),J=history.state?.[C],Y=history.state?.[w],J||(J=Y=Date.now(),history.replaceState({...history.state,[C]:J,[w]:Y},``));let r=F[J];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await jt(He,n)):(await Q({type:`enter`,url:_e(V.hash?Lt(new URL(location.href)):location.href),replace_state:!0}),i()),At()}function it(){Ue.length=0,Qe=!1}function at(e){H.some(e=>e?.snapshot)&&(I[e]=H.map(e=>e?.snapshot?.capture()))}function ot(e){I[e]?.forEach((e,t)=>{H[t]?.snapshot?.restore(e)})}function st(){Le(J),ue(me,F),at(Y),ue(pe,I)}async function ct(e,n,r,i){let a,o;n.invalidateAll&&We(),await Q({type:`goto`,url:_e(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:r,nav_token:i,accept:()=>{if(n.invalidateAll){Qe=!0,a=new Set;for(let[e,t]of tt)for(let n of t.keys())a.add(A(e,n));o=new Set;for(let[e,t]of nt)for(let n of t.keys())o.add(A(e,n))}n.invalidate&&n.invalidate.forEach(kt)}}),n.invalidateAll&&t().then(t).then(()=>{for(let[e,t]of tt)for(let[n,{resource:r}]of t)a?.has(A(e,n))&&r.refresh();for(let[e,t]of nt)for(let[n,{resource:r}]of t)o?.has(A(e,n))&&r.reconnect()})}async function lt(e){if(e.id!==U?.id){We();let t={};et.add(t),U={id:e.id,token:t,promise:yt({...e,preload:t}).then(e=>(et.delete(t),e.type===`loaded`&&e.state.error&&We(),e)),fork:null}}return U.promise}async function ut(e){let t=(await Ct(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function dt(e,t,n){let r={params:G.params,route:{id:G.route?.id??null},url:new URL(location.href)};if(G={...e.state,nav:r},Ne(e.props.page),$e=new V.root({target:t,props:{...e.props,stores:L,components:H},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ot(Y),n){let e={from:null,to:{...r,scroll:F[J]??E()},willUnload:!1,type:`enter`,complete:Promise.resolve()};W.forEach(t=>t(e))}Ye=!0}async function ft({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Oe(n).map(e=>e.node.component),page:It(j)}};s!==void 0&&(l.props.form=s);let u={},f=!j,p=0;for(let e=0;et(new URL(e))))return!0;return!1}function gt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function _t(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function vt({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:It(j),constructors:[]}}}async function yt({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(U?.id===e)return et.delete(U.token),U.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(h)),d.forEach(e=>e?.[1]().catch(h));let f=G.url?e!==Z(G.url):!1,p=G.route?i.id!==G.route.id:!1,m=_t(G.url,n),g=!1,_=d.map(async(e,t)=>{if(!e)return;let a=G.branch[t];return e[1]===a?.loader&&!ht(g,p,f,m,a.universal?.uses,r)?a:(g=!0,pt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;nPromise.resolve({}),server_data_node:gt(null)}),{node:await z(),loader:z,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(e){if(e instanceof l)return ct(new URL(e.location,location.href),{},0);throw e}}async function St(e){let t=e.href;if(Ge.has(t))return Ge.get(t);let n;try{let r=(async()=>{let t=await V.hooks.reroute({url:new URL(e),fetch:async(t,n)=>mt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);V.hash?n.hash=t:n.pathname=t,t=n}return t})();Ge.set(t,r),n=await r}catch{Ge.delete(t);return}return n}async function Ct(e,t){if(e&&!k(e,S,V.hash)){let n=await St(e);if(!n)return;let r=wt(n);for(let n of Be){let i=n.exec(r);if(i)return{id:Z(e),invalidating:t,route:n,params:p(i),url:e}}}}function wt(e){return f(V.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function Z(e){return(V.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function Tt({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Ft(G,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return K||Ke.forEach(e=>e(c)),o?null:s}async function Q({type:n,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=h,block:p=h,event:m}){let g=X;X=d;let _=await Ct(r,!1),v=n===`enter`?Ft(G,_,r,n):Tt({url:r,type:n,delta:i?.delta,intent:_,scroll:i?.scroll,event:m});if(!v){p(),X===d&&(X=g);return}let y=J,ee=Y;f(),K=!0,Ye&&v.navigation.type!==`enter`&&L.navigating.set(M.current=v.navigation);let b=_&&await yt(_);if(!b){if(k(r,S,V.hash))return await R(r,s);b=await Et(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=_?.url||r,X!==d)return v.reject(Error(`navigation aborted`)),!1;if(b.type===`redirect`){if(l<20){await Q({type:n,url:new URL(b.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),v.fulfil(void 0);return}b=await xt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}})}else b.props.page.status>=400&&await L.updated.check()&&(await ze(),await R(r,s));if(it(),Le(y),at(ee),b.props.page.url.pathname!==r.pathname&&(r.pathname=b.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:J+=e,[w]:Y+=e,[he]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||Re(J,Y)}let x=_&&U?.id===_.id?U.fork:null;U?.fork&&!x&&We(),U=null,b.props.page.state=c;let te;if(Ye){let t=(await Promise.all(Array.from(qe,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(t.length>0){function e(){t.forEach(e=>{W.delete(e)})}t.push(e),t.forEach(e=>{W.add(e)})}let n=v.navigation.to;G={...b.state,nav:{params:n.params,route:n.route,url:n.url}},b.props.page&&(b.props.page.url=r);let i=x&&await x;i?te=i.commit():(P=null,$e.$set(b.props),P&&Object.assign(b.props.page,P),Ne(b.props.page),te=e?.()),Ze=!0}else await dt(b,He,!1);let{activeElement:ne}=document;if(await te,await t(),await t(),X!==d)return v.reject(Error(`navigation aborted`)),!1;b.props.page&&P&&Object.assign(b.props.page,P);let re=null;if(Xe){let e=i?i.scroll:o?E():null;e?scrollTo(e.x,e.y):(re=r.hash&&document.getElementById(Rt(r)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!a&&!ie&&Pt(r,!re),Xe=!0,K=!1,n===`popstate`&&ot(Y),v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=E()),W.forEach(e=>e(v.navigation)),L.navigating.set(M.current=null)}async function Et(e,t,n,r,i){return e.origin===ge&&e.pathname===location.pathname&&!Je?await xt({status:r,error:n,url:e,route:t}):await R(e,i)}function Dt(){let e,t={element:void 0,href:void 0},n;B.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{a(n,T.hover)},20)});function r(e){e.defaultPrevented||a(e.composedPath()[0],T.tap)}B.addEventListener(`mousedown`,r),B.addEventListener(`touchstart`,r,{passive:!0});let i=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(ut(new URL(t.target.href)),i.unobserve(t.target))},{threshold:0});async function a(e,r){let i=be(e,B),a=i===t.element&&i?.href===t.href&&r>=n;if(!i||a)return;let{url:o,external:s,download:c}=xe(i,S,V.hash);if(s||c)return;let l=O(i),u=o&&Z(G.url)===Z(o);if(!(l.reload||u))if(r<=l.preload_data){t={element:i,href:i.href},n=T.tap;let e=await Ct(o,!1);if(!e)return;lt(e)}else r<=l.preload_code&&(t={element:i,href:i.href},n=r,ut(o))}function o(){i.disconnect();for(let e of B.querySelectorAll(`a`)){let{url:t,external:n,download:r}=xe(e,S,V.hash);if(n||r)continue;let a=O(e);a.reload||(a.preload_code===T.viewport&&i.observe(e),a.preload_code===T.eager&&ut(t))}}W.add(o),o()}function $(e,t){if(e instanceof c)return e.body;let n=ke(e),r=Ae(e);return V.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Ot(e,t={}){return e=new URL(_e(e)),e.origin===ge?ct(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function kt(e){if(typeof e==`function`)Ue.push(e);else{let{href:t}=new URL(e,location.href);Ue.push(e=>e.href===t)}}function At(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(st(),!K){let e=Ft(G,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Ke.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&st()}),!navigator.connection?.saveData&&!/2g/.test(navigator.connection?.effectiveType)&&Dt(),B.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=be(t.composedPath()[0],B);if(!n)return;let{url:r,external:i,target:a,download:o}=xe(n,S,V.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=O(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol===`https:`||r.protocol===`http:`)||o)return;let[c,l]=(V.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){Tt({url:r,type:`link`,event:t})?K=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=G.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(q=!0,Le(J),e(r),!s.replace_state)return;q=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Q({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),B.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(k(r,S,!1))return;let i=e.target,a=O(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Q({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!Nt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(X={},n===J)return;let r=F[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=G.url?m(location)===m(G.url):!1;if(o===Y&&(Ze||s)){i!==j.state&&(j.state=i),e(a),F[J]=E(),r&&scrollTo(r.x,r.y),J=n;return}let c=n-J;await Q({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{J=n,Y=o},block:()=>{history.go(-c)},nav_token:X,event:t})}else q||(e(new URL(location.href)),V.hash&&location.reload())}),addEventListener(`hashchange`,()=>{q&&(q=!1,history.replaceState({...history.state,[C]:++J,[w]:Y},``,location.href))});for(let e of document.querySelectorAll(`link`))Ie.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&L.navigating.set(M.current=null)});function e(e){G.url=j.url=e,L.page.set(It(j)),L.page.notify()}}async function jt(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){Je=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await Ct(u,!1)||{}),d=Be.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Mt(r.uses)),pt({loader:V.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r{let a=history.state;Nt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),Nt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t{if(r.rangeCount===e.length){for(let t=0;t{a=e,o=t});return s.catch(h),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:E()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function It(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Lt(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Rt(e){let t;if(V.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{j as a,M as i,rt as n,N as o,L as r,Te as s,Ot as t}; \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/kNaey6uv.js b/website/build/_app/immutable/chunks/kNaey6uv.js new file mode 100644 index 0000000..2994da7 --- /dev/null +++ b/website/build/_app/immutable/chunks/kNaey6uv.js @@ -0,0 +1 @@ +var e=`modulepreload`,t=function(e,t){return new URL(e,t).href},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};export{r as t}; \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/qiBCaaew.js b/website/build/_app/immutable/chunks/qiBCaaew.js new file mode 100644 index 0000000..91bca22 --- /dev/null +++ b/website/build/_app/immutable/chunks/qiBCaaew.js @@ -0,0 +1 @@ +import{ot as e}from"./Du04-Wio.js";e(); \ No newline at end of file diff --git a/website/build/_app/immutable/chunks/xihTtKlq.js b/website/build/_app/immutable/chunks/xihTtKlq.js new file mode 100644 index 0000000..afdd2d0 --- /dev/null +++ b/website/build/_app/immutable/chunks/xihTtKlq.js @@ -0,0 +1 @@ +typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`); \ No newline at end of file diff --git a/website/build/_app/immutable/entry/app.DyiyvRxF.js b/website/build/_app/immutable/entry/app.DyiyvRxF.js new file mode 100644 index 0000000..05e0afd --- /dev/null +++ b/website/build/_app/immutable/entry/app.DyiyvRxF.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BZeUAe05.js","../chunks/Du04-Wio.js","../chunks/BuBrZOIh.js","../chunks/xihTtKlq.js","../chunks/DozEvg9T.js","../chunks/DyVSz01m.js","../assets/0.D7nPmqCL.css","../nodes/1.BSJLBHmD.js","../nodes/2.DnuVmUIJ.js","../nodes/3.D0TU24-D.js","../chunks/qiBCaaew.js","../assets/3.DTuVOu2m.css","../nodes/4.DOawxC2l.js","../nodes/5.CZek6GP7.js","../nodes/6.ChPTFH0w.js","../nodes/7.BG-S3wet.js","../nodes/8.FgjeHYDF.js","../nodes/9.9IQ7DCMm.js","../nodes/10.CyIl61W5.js","../nodes/11.CBJLxlCn.js","../nodes/12.D8T_BCyX.js","../nodes/13.CfK385I2.js"])))=>i.map(i=>d[i]); +import{B as e,C as t,E as n,G as r,H as i,I as a,J as o,K as s,P as c,S as l,T as u,V as d,W as f,X as p,Y as m,_ as h,c as g,ct as _,i as v,it as y,k as b,n as x,r as S,rt as C,w}from"../chunks/Du04-Wio.js";import{t as T}from"../chunks/kNaey6uv.js";import"../chunks/xihTtKlq.js";var E={},D=n(`
      `),O=n(` `,1);function k(n,S){y(S,!0);let T=v(S,`components`,23,()=>[]),E=v(S,`data_0`,3,null),k=v(S,`data_1`,3,null),A=v(S,`data_2`,3,null);i(()=>S.stores.page.set(S.page)),d(()=>{S.stores,S.page,S.constructors,T(),S.form,E(),k(),A(),S.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=S.stores.page.subscribe(()=>{c(j)&&(o(M,!0),a().then(()=>{o(N,document.title||`untitled page`,!0)}))});return o(j,!0),e});let P=p(()=>S.constructors[2]);var F=O(),I=r(F),L=e=>{let t=p(()=>S.constructors[0]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return E()},get form(){return S.form},get params(){return S.page.params},children:(e,t)=>{var n=u(),i=r(n),a=e=>{let t=p(()=>S.constructors[1]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return k()},get form(){return S.form},get params(){return S.page.params},children:(e,t)=>{var n=u();h(r(n),()=>c(P),(e,t)=>{g(t(e,{get data(){return A()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),w(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)},o=e=>{let t=p(()=>S.constructors[1]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return k()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)};l(i,e=>{S.constructors[2]?e(a):e(o,-1)}),w(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)},R=e=>{let t=p(()=>S.constructors[0]);var n=u();h(r(n),()=>c(t),(e,t)=>{g(t(e,{get data(){return E()},get form(){return S.form},get params(){return S.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)};l(I,e=>{S.constructors[1]?e(L):e(R,-1)});var z=s(I,2),B=n=>{var r=D(),i=f(r),a=n=>{var r=b();e(()=>t(r,c(N))),w(n,r)};l(i,e=>{c(M)&&e(a)}),_(r),w(n,r)};l(z,e=>{c(j)&&e(B)}),w(n,F),C()}var A=S(k),j=[()=>T(()=>import(`../nodes/0.BZeUAe05.js`),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url),()=>T(()=>import(`../nodes/1.BSJLBHmD.js`),__vite__mapDeps([7,1,5,3]),import.meta.url),()=>T(()=>import(`../nodes/2.DnuVmUIJ.js`),__vite__mapDeps([8,1,4,5,3]),import.meta.url),()=>T(()=>import(`../nodes/3.D0TU24-D.js`),__vite__mapDeps([9,1,2,3,10,11]),import.meta.url),()=>T(()=>import(`../nodes/4.DOawxC2l.js`),__vite__mapDeps([12,1,5,3,10]),import.meta.url),()=>T(()=>import(`../nodes/5.CZek6GP7.js`),__vite__mapDeps([13,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/6.ChPTFH0w.js`),__vite__mapDeps([14,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/7.BG-S3wet.js`),__vite__mapDeps([15,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/8.FgjeHYDF.js`),__vite__mapDeps([16,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/9.9IQ7DCMm.js`),__vite__mapDeps([17,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/10.CyIl61W5.js`),__vite__mapDeps([18,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/11.CBJLxlCn.js`),__vite__mapDeps([19,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/12.D8T_BCyX.js`),__vite__mapDeps([20,1,3,10]),import.meta.url),()=>T(()=>import(`../nodes/13.CfK385I2.js`),__vite__mapDeps([21,1,3,10]),import.meta.url)],M=[],N={"/":[3],"/docs":[4,[2]],"/docs/changelog":[5,[2]],"/docs/cli-reference":[6,[2]],"/docs/configuration":[7,[2]],"/docs/examples":[8,[2]],"/docs/getting-started":[9,[2]],"/docs/installation":[10,[2]],"/docs/providers":[11,[2]],"/docs/roadmap":[12,[2]],"/docs/usage":[13,[2]]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t);export{R as decode,F as decoders,N as dictionary,I as encoders,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file diff --git a/website/build/_app/immutable/entry/start.CmvPVbW8.js b/website/build/_app/immutable/entry/start.CmvPVbW8.js new file mode 100644 index 0000000..f05e81b --- /dev/null +++ b/website/build/_app/immutable/entry/start.CmvPVbW8.js @@ -0,0 +1 @@ +import{n as e,s as t}from"../chunks/DyVSz01m.js";export{t as load_css,e as start}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/0.BZeUAe05.js b/website/build/_app/immutable/nodes/0.BZeUAe05.js new file mode 100644 index 0000000..55d933b --- /dev/null +++ b/website/build/_app/immutable/nodes/0.BZeUAe05.js @@ -0,0 +1,9 @@ +import{$ as e,A as t,B as n,E as r,G as i,H as a,J as o,K as s,L as c,M as l,P as u,Q as d,S as f,T as p,V as m,W as h,X as g,Y as _,Z as v,a as y,ct as b,dt as x,f as ee,h as S,i as C,it as w,j as T,n as E,o as D,q as O,rt as k,st as te,u as A,v as ne,w as j,y as M,z as N}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as re}from"../chunks/DozEvg9T.js";import{n as P,t as F}from"../chunks/BuBrZOIh.js";var I=x({prerender:()=>!0,ssr:()=>!0}),L=typeof window<`u`?window:void 0;typeof window<`u`&&window.document,typeof window<`u`&&window.navigator,typeof window<`u`&&window.location;function ie(e){let t=e.activeElement;for(;t?.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}new class{#e;#t;constructor(e={}){let{window:t=L,document:n=t?.document}=e;t!==void 0&&(this.#e=n,this.#t=v(e=>{let n=l(t,`focusin`,e),r=l(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?ie(this.#e):null}};function ae(e,t){switch(e){case`post`:m(t);break;case`pre`:a(t);break}}function R(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;ae(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=c(()=>n(t,o));return o=t,r})}function z(e,t,n){let r=N(()=>{let i=!1;R(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});m(()=>r)}function B(e,t,n){R(e,`post`,t,n)}function V(e,t,n){R(e,`pre`,t,n)}B.pre=V;function oe(e,t){z(e,`post`,t)}function se(e,t){z(e,`pre`,t)}oe.pre=se;function ce(e,t){switch(e){case`local`:return t.localStorage;case`session`:return t.sessionStorage}}var le=class{#e;#t;#n;#r;#i;#a=_(0);constructor(e,t,n={}){let{storage:r=`local`,serializer:i={serialize:JSON.stringify,deserialize:JSON.parse},syncTabs:a=!0,window:o=L}=n;if(this.#e=t,this.#t=e,this.#n=i,o===void 0)return;let s=ce(r,o);this.#r=s;let c=s.getItem(e);c===null?this.#c(t):this.#e=this.#s(c),a&&r===`local`&&(this.#i=v(()=>l(o,`storage`,this.#o)))}get current(){this.#i?.(),u(this.#a);let e=this.#s(this.#r?.getItem(this.#t))??this.#e,t=new WeakMap,n=r=>{if(r===null||r?.constructor.name===`Date`||typeof r!=`object`)return r;let i=t.get(r);return i||(i=new Proxy(r,{get:(e,t)=>(u(this.#a),n(Reflect.get(e,t))),set:(t,n,r)=>(o(this.#a,u(this.#a)+1),Reflect.set(t,n,r),this.#c(e),!0)}),t.set(r,i)),i};return n(e)}set current(e){this.#c(e),o(this.#a,u(this.#a)+1)}#o=e=>{e.key!==this.#t||e.newValue===null||(this.#e=this.#s(e.newValue),o(this.#a,u(this.#a)+1))};#s(e){try{return this.#n.deserialize(e)}catch(t){console.error(`Error when parsing "${e}" from persisted store "${this.#t}"`,t);return}}#c(e){try{e!=null&&this.#r?.setItem(this.#t,this.#n.serialize(e))}catch(e){console.error(`Error when writing value from persisted store "${this.#t}" to ${this.#r}`,e)}}};function ue(e,t){let n,r=null;return(...i)=>new Promise(a=>{r&&r(void 0),r=a,clearTimeout(n),n=setTimeout(async()=>{let t=await e(...i);r&&=(r(t),null)},t)})}function de(e,t){let n=0,r=null;return(...i)=>{let a=Date.now();return n&&a-n{u(m).forEach(e=>e()),o(m,[],!0)},g=e=>{o(m,[...u(m),e],!0)},v=async(e,n,r=!1)=>{try{o(f,!0),o(p,void 0),h();let i=new AbortController;g(()=>i.abort());let a=await t(e,n,{data:u(d),refetching:r,onCleanup:g,signal:i.signal});return o(d,a,!0),a}catch(e){e instanceof DOMException&&e.name===`AbortError`||o(p,e,!0);return}finally{o(f,!1)}},y=c?ue(v,c):l?de(v,l):v,b=Array.isArray(e)?e:[e],x;return r((t,n)=>{a&&x||x&&JSON.stringify(t)===JSON.stringify(x)||(x=t,y(Array.isArray(e)?t:t[0],Array.isArray(e)?n:n?.[0]))},{lazy:i}),{get current(){return u(d)},get loading(){return u(f)},get error(){return u(p)},mutate:e=>{o(d,e,!0)},refetch:t=>{let n=b.map(e=>e());return y(Array.isArray(e)?n:n[0],Array.isArray(e)?n:n[0],t??!0)}}}function pe(e,t,n){return fe(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];B(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}function me(e,t,n){return fe(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];B.pre(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}pe.pre=me;function he(e){return e.filter(e=>e.length>0)}var ge={getItem:e=>null,setItem:(e,t)=>{}},H=typeof document<`u`;function _e(e){return typeof e==`function`}function ve(e){return typeof e==`object`&&!!e}var U=Symbol(`box`),W=Symbol(`is-writable`);function ye(e){return ve(e)&&U in e}function be(e){return G.isBox(e)&&W in e}function G(e){let t=_(O(e));return{[U]:!0,[W]:!0,get current(){return u(t)},set current(e){o(t,e,!0)}}}function xe(e,t){let n=g(e);return t?{[U]:!0,[W]:!0,get current(){return u(n)},set current(e){t(e)}}:{[U]:!0,get current(){return e()}}}function Se(e){return G.isBox(e)?e:_e(e)?G.with(e):G(e)}function Ce(e){return Object.entries(e).reduce((e,[t,n])=>G.isBox(n)?(G.isWritableBox(n)?Object.defineProperty(e,t,{get(){return n.current},set(e){n.current=e}}):Object.defineProperty(e,t,{get(){return n.current}}),e):Object.assign(e,{[t]:n}),{})}function we(e){return G.isWritableBox(e)?{[U]:!0,get current(){return e.current}}:e}G.from=Se,G.with=xe,G.flatten=Ce,G.readonly=we,G.isBox=ye,G.isWritableBox=be;function Te(e,t){let n=RegExp(e,`g`);return e=>{if(typeof e!=`string`)throw TypeError(`expected an argument of type string, but got ${typeof e}`);return e.match(n)?e.replace(n,t):e}}var Ee=Te(/[A-Z]/,e=>`-${e.toLowerCase()}`);function De(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`expected an argument of type object, but got ${typeof e}`);return Object.keys(e).map(t=>`${Ee(t)}: ${e[t]};`).join(` +`)}function Oe(e={}){return De(e).replace(` +`,` `)}Oe({position:`absolute`,width:`1px`,height:`1px`,padding:`0`,margin:`-1px`,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,borderWidth:`0`,transform:`translateX(-100%)`});var ke=typeof window<`u`?window:void 0;typeof window<`u`&&window.document,typeof window<`u`&&window.navigator,typeof window<`u`&&window.location;function Ae(e){let t=e.activeElement;for(;t?.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}new class{#e;#t;constructor(e={}){let{window:t=ke,document:n=t?.document}=e;t!==void 0&&(this.#e=n,this.#t=v(e=>{let n=l(t,`focusin`,e),r=l(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?Ae(this.#e):null}};function je(e,t){switch(e){case`post`:m(t);break;case`pre`:a(t);break}}function K(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;je(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=c(()=>n(t,o));return o=t,r})}function Me(e,t,n){let r=N(()=>{let i=!1;K(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});m(()=>r)}function Ne(e,t,n){K(e,`post`,t,n)}function Pe(e,t,n){K(e,`pre`,t,n)}Ne.pre=Pe;function Fe(e,t){Me(e,`post`,t)}function Ie(e,t){Me(e,`pre`,t)}Fe.pre=Ie;var q=G(`mode-watcher-mode`),J=G(`mode-watcher-theme`),Le=[`dark`,`light`,`system`];function Re(e){return typeof e==`string`?Le.includes(e):!1}var ze=class{#e=`system`;#t=H?localStorage:ge;#n=this.#t.getItem(q.current);#r=Re(this.#n)?this.#n:this.#e;#i=_(O(this.#a()));#a(e=this.#r){return new le(q.current,e,{serializer:{serialize:e=>e,deserialize:e=>Re(e)?e:this.#e}})}constructor(){N(()=>B.pre(()=>q.current,(e,t)=>{let n=u(this.#i).current;o(this.#i,this.#a(n),!0),t&&localStorage.removeItem(t)}))}get current(){return u(this.#i).current}set current(e){u(this.#i).current=e}},Be=class{#e=void 0;#t=!0;#n=_(O(this.#e));#r=typeof window<`u`&&typeof window.matchMedia==`function`?new P(`prefers-color-scheme: light`):{current:!1};query(){H&&o(this.#n,this.#r.current?`light`:`dark`,!0)}tracking(e){this.#t=e}constructor(){N(()=>{a(()=>{this.#t&&this.query()})}),this.query=this.query.bind(this),this.tracking=this.tracking.bind(this)}get current(){return u(this.#n)}},Ve=new ze,He=new Be,Y=new class{#e=H?localStorage:ge;#t=this.#e.getItem(J.current);#n=this.#t===null||this.#t===void 0?``:this.#t;#r=_(O(this.#i()));#i(e=this.#n){return new le(J.current,e,{serializer:{serialize:e=>typeof e==`string`?e:``,deserialize:e=>e}})}constructor(){N(()=>B.pre(()=>J.current,(e,t)=>{let n=u(this.#r).current;o(this.#r,this.#i(n),!0),t&&localStorage.removeItem(t)}))}get current(){return u(this.#r).current}set current(e){u(this.#r).current=e}},Ue,We,Ge=!1,X=null;function Ke(){return X||(X=document.createElement(`style`),X.appendChild(document.createTextNode(`* { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; + }`)),X)}function qe(e,t=!1){if(typeof document>`u`)return;if(!Ge){Ge=!0,e();return}if(typeof window<`u`&&window.__vitest_worker__){e();return}clearTimeout(Ue),clearTimeout(We);let n=Ke(),r=()=>document.head.appendChild(n),i=()=>{n.parentNode&&document.head.removeChild(n)};function a(){e(),window.requestAnimationFrame(i)}if(window.requestAnimationFrame!==void 0){r(),t?a():window.requestAnimationFrame(()=>{a()});return}r(),Ue=window.setTimeout(()=>{e(),We=window.setTimeout(i,16)},16)}var Z=G(void 0),Q=G(!0),$=G(!1),Je=G([]),Ye=G([]);function Xe(){let e=g(()=>{if(!H)return;let e=Ve.current===`system`?He.current:Ve.current,t=he(Je.current),n=he(Ye.current);function r(){let r=document.documentElement,i=document.querySelector(`meta[name="theme-color"]`);e===`light`?(t.length&&r.classList.remove(...t),n.length&&r.classList.add(...n),r.style.colorScheme=`light`,i&&Z.current&&i.setAttribute(`content`,Z.current.light)):(n.length&&r.classList.remove(...n),t.length&&r.classList.add(...t),r.style.colorScheme=`dark`,i&&Z.current&&i.setAttribute(`content`,Z.current.dark))}return Q.current?qe(r,$.current):r(),e});return{get current(){return u(e)}}}function Ze(){let e=g(()=>{if(Y.current,!H)return;function e(){document.documentElement.setAttribute(`data-theme`,Y.current)}return Q.current?qe(e,c(()=>$.current)):e(),Y.current});return{get current(){return u(e)}}}var Qe=Xe(),$e=Ze();function et(e){Ve.current=e}function tt(e){Y.current=e}function nt(e){return e}function rt({defaultMode:e=`system`,themeColors:t,darkClassNames:n=[`dark`],lightClassNames:r=[],defaultTheme:i=``,modeStorageKey:a=`mode-watcher-mode`,themeStorageKey:o=`mode-watcher-theme`}){let s=document.documentElement,c=localStorage.getItem(a)??e,l=localStorage.getItem(o)??i,u=c===`light`||c===`system`&&window.matchMedia(`(prefers-color-scheme: light)`).matches;if(u?(n.length&&s.classList.remove(...n.filter(Boolean)),r.length&&s.classList.add(...r.filter(Boolean))):(r.length&&s.classList.remove(...r.filter(Boolean)),n.length&&s.classList.add(...n.filter(Boolean))),s.style.colorScheme=u?`light`:`dark`,t){let e=document.querySelector(`meta[name="theme-color"]`);e&&e.setAttribute(`content`,c===`light`?t.light:t.dark)}l&&(s.setAttribute(`data-theme`,l),localStorage.setItem(o,l)),localStorage.setItem(a,c)}var it=r(``);function at(e,t){w(t,!0);var r=p(),a=i(r),o=e=>{var r=it();n(()=>A(r,`content`,t.themeColors.dark)),j(e,r)};f(a,e=>{t.themeColors&&e(o)}),j(e,r),k()}var ot=r(``),st=r(` `,1);function ct(e,t){w(t,!0);let r=C(t,`trueNonce`,3,``);S(`1funsus`,e=>{var a=st(),o=i(a),c=e=>{var r=ot();n(()=>A(r,`content`,t.themeColors.dark)),j(e,r)};f(o,e=>{t.themeColors&&e(c)}),M(s(o,2),()=>`(`+rt.toString()+`)(`+JSON.stringify(t.initConfig)+`);<\/script>`),j(e,a)}),k()}function lt(e,t){w(t,!0);let n=C(t,`track`,3,!0),r=C(t,`defaultMode`,3,`system`),o=C(t,`disableTransitions`,3,!0),s=C(t,`darkClassNames`,19,()=>[`dark`]),c=C(t,`lightClassNames`,19,()=>[]),l=C(t,`defaultTheme`,3,``),d=C(t,`nonce`,3,``),m=C(t,`themeStorageKey`,3,`mode-watcher-theme`),h=C(t,`modeStorageKey`,3,`mode-watcher-mode`),_=C(t,`disableHeadScriptInjection`,3,!1),v=C(t,`synchronousModeChanges`,3,!1);q.current=h(),J.current=m(),Je.current=s(),Ye.current=c(),Q.current=o(),Z.current=t.themeColors,$.current=v(),a(()=>{$.current=v()}),a(()=>{Q.current=o()}),a(()=>{Z.current=t.themeColors}),a(()=>{Je.current=s()}),a(()=>{Ye.current=c()}),a(()=>{q.current=h()}),a(()=>{J.current=m()}),a(()=>{Qe.current,q.current,J.current,$e.current}),E(()=>{He.tracking(n()),He.query();let e=localStorage.getItem(q.current);et(Re(e)?e:r()),tt(localStorage.getItem(J.current)||l())});let y=nt({defaultMode:r(),themeColors:t.themeColors,darkClassNames:s(),lightClassNames:c(),defaultTheme:l(),modeStorageKey:h(),themeStorageKey:m()}),b=g(()=>typeof window>`u`?d():``);var x=p(),ee=i(x),S=e=>{at(e,{get themeColors(){return Z.current}})},T=e=>{ct(e,{get trueNonce(){return u(b)},get initConfig(){return y},get themeColors(){return Z.current}})};f(ee,e=>{_()?e(S):e(T,-1)}),j(e,x),k()}var ut=new Set([`$$slots`,`$$events`,`$$legacy`]);function dt(e,t){let n=y(t,ut),r=[[`path`,{d:`M4 5h16`}],[`path`,{d:`M4 12h16`}],[`path`,{d:`M4 19h16`}]];F(e,D({name:`menu`},()=>n,{get iconNode(){return r}}))}var ft=new Set([`$$slots`,`$$events`,`$$legacy`]);function pt(e,t){let n=y(t,ft),r=[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`}]];F(e,D({name:`moon`},()=>n,{get iconNode(){return r}}))}var mt=new Set([`$$slots`,`$$events`,`$$legacy`]);function ht(e,t){let n=y(t,mt),r=[[`circle`,{cx:`12`,cy:`12`,r:`4`}],[`path`,{d:`M12 2v2`}],[`path`,{d:`M12 20v2`}],[`path`,{d:`m4.93 4.93 1.41 1.41`}],[`path`,{d:`m17.66 17.66 1.41 1.41`}],[`path`,{d:`M2 12h2`}],[`path`,{d:`M20 12h2`}],[`path`,{d:`m6.34 17.66-1.41 1.41`}],[`path`,{d:`m19.07 4.93-1.41 1.41`}]];F(e,D({name:`sun`},()=>n,{get iconNode(){return r}}))}var gt=new Set([`$$slots`,`$$events`,`$$legacy`]);function _t(e,t){let n=y(t,gt),r=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]];F(e,D({name:`x`},()=>n,{get iconNode(){return r}}))}var vt=r(``),yt=r(` `,1);function bt(t,r){w(r,!0);let a=()=>e(re,`$page`,c),[c,l]=d(),p=g(()=>a().url.pathname.startsWith(`/docs`)),m=_(!1);var v=yt(),y=i(v);lt(y,{});var x=s(y,2),S=h(x),C=h(S),E=s(h(C),2),D=h(E);let O;te(4),b(E);var A=s(E,2),M=h(A),N=h(M);ht(N,{class:`w-4 h-4 hidden dark:block`}),pt(s(N,2),{class:`w-4 h-4 block dark:hidden`}),b(M),te(2),b(A);var P=s(A,2),F=h(P),I=h(F);ht(I,{class:`w-4 h-4 hidden dark:block`}),pt(s(I,2),{class:`w-4 h-4 block dark:hidden`}),b(F);var L=s(F,2),ie=h(L),ae=e=>{_t(e,{class:`w-5 h-5`})},R=e=>{dt(e,{class:`w-5 h-5`})};f(ie,e=>{u(m)?e(ae):e(R,-1)}),b(L),b(P),b(C);var z=s(C,2),B=e=>{var t=vt(),n=h(t),r=s(n,2),i=s(r,4),a=h(i);b(i),b(t),T(`click`,n,()=>o(m,!1)),T(`click`,r,()=>o(m,!1)),T(`click`,a,()=>o(m,!1)),j(e,t)};f(z,e=>{u(m)&&e(B)}),b(S);var V=s(S,2);ne(h(V),()=>r.children),b(V),b(x),n(()=>O=ee(D,1,`site-header-link`,null,O,{active:u(p)})),T(`click`,M,()=>{let e=document.documentElement.classList.contains(`dark`);document.documentElement.classList.toggle(`dark`,!e),localStorage.setItem(`mode`,e?`light`:`dark`)}),T(`click`,F,()=>{let e=document.documentElement.classList.contains(`dark`);document.documentElement.classList.toggle(`dark`,!e),localStorage.setItem(`mode`,e?`light`:`dark`)}),T(`click`,L,()=>o(m,!u(m))),j(t,v),k(),l()}t([`click`]);export{bt as component,I as universal}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/1.BSJLBHmD.js b/website/build/_app/immutable/nodes/1.BSJLBHmD.js new file mode 100644 index 0000000..d4066dd --- /dev/null +++ b/website/build/_app/immutable/nodes/1.BSJLBHmD.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,G as r,K as i,W as a,ct as o,it as s,rt as c,w as l}from"../chunks/Du04-Wio.js";import{a as u,i as d,r as f}from"../chunks/DyVSz01m.js";import"../chunks/xihTtKlq.js";var p={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};Object.defineProperty({get from(){return d.current?d.current.from:null},get to(){return d.current?d.current.to:null},get type(){return d.current?d.current.type:null},get willUnload(){return d.current?d.current.willUnload:null},get delta(){return d.current?d.current.delta:null},get complete(){return d.current?d.current.complete:null}},"current",{get(){throw Error(`Replace navigating.current. with navigating.`)}}),f.updated.check;var m=p,h=n(`

      `,1);function g(n,u){s(u,!0);var d=h(),f=r(d),p=a(f,!0);o(f);var g=i(f,2),_=a(g,!0);o(g),e(()=>{t(p,m.status),t(_,m.error?.message)}),l(n,d),c()}export{g as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/10.CyIl61W5.js b/website/build/_app/immutable/nodes/10.CyIl61W5.js new file mode 100644 index 0000000..216d2b7 --- /dev/null +++ b/website/build/_app/immutable/nodes/10.CyIl61W5.js @@ -0,0 +1 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(`

      Installation

      Prerequisites

      cora is a Rust binary. You have two installation paths:

      Via Cargo (recommended) — Requires Rust 1.85 or later with Cargo installed
      Binary download — No Rust required; just download and place in your PATH

      cora works on Linux (x86_64 and arm64), macOS (arm64), and Windows.

      Install via Cargo

      The recommended way to install cora is through Cargo:

      $ cargo install cora-cli

      This compiles cora from source and installs it to Cargo's binary directory (typically ~/.cargo/bin/).

      Download Binary

      Pre-built binaries are available from the GitHub Releases page.

      Supported platforms:

      Linux x86_64 (glibc)
      Linux arm64 (aarch64)
      macOS arm64 (Apple Silicon)
      Windows x86_64
      # Download and extract
      $ curl -sL https://github.com/codecoradev/cora-cli/releases/latest/download/cora-linux-x86_64.tar.gz | tar xz
      $ mv cora ~/.local/bin/cora

      Build from Source

      If you prefer to build from the latest source:

      $ git clone https://github.com/codecoradev/cora-cli.git
      $ cd cora-cli
      $ cargo build --release
      # Binary at target/release/cora

      Shell Completions

      cora provides shell completions for bash, zsh, and fish:

      # Bash
      $ cora completion bash > ~/.cora/completion.bash
      $ echo 'source ~/.cora/completion.bash' >> ~/.bashrc
      # Zsh
      $ cora completion zsh > ~/.cora/completion.zsh
      $ echo 'source ~/.cora/completion.zsh' >> ~/.zshrc
      # Fish
      $ cora completion fish > ~/.config/fish/completions/cora.fish

      Verify Installation

      Confirm cora is installed correctly:

      $ cora --version
      cora 0.x.x
      $ cora auth status
      Provider: openai
      API key: configured

      Updating

      To update cora to the latest version:

      Via Cargo: cargo install cora-cli --force
      Via Binary: Download the latest release from GitHub and replace the existing binary
      `);function u(e,u){i(u,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),s();var d=l();r(`t7c0hb`,e=>{t(()=>{n.title=`Installation — cora docs`})}),c(e,d),o()}export{u as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/11.CBJLxlCn.js b/website/build/_app/immutable/nodes/11.CBJLxlCn.js new file mode 100644 index 0000000..811c9a5 --- /dev/null +++ b/website/build/_app/immutable/nodes/11.CBJLxlCn.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,K as r,R as i,U as a,W as o,b as s,ct as c,h as l,it as u,n as d,rt as f,s as p,st as m,w as h,x as g}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var _=n(``),v=n(`
      `),y=n(`

      Providers

      cora supports multiple AI providers. Use your own API key — no subscriptions to us.

      Supported Providers

      ProviderDefault ModelEnv VarCustom Base URL
      OpenAIgpt-4o-miniOPENAI_API_KEYOPENAI_BASE_URL
      Anthropicclaude-sonnet-4-20250514ANTHROPIC_API_KEYANTHROPIC_BASE_URL
      Groqllama-3.1-8b-instantGROQ_API_KEYGROQ_BASE_URL
      Ollamallama3.1— (local)OLLAMA_HOST (default: http://localhost:11434)
      Z.AIglm-5.1ZAI_API_KEYZAI_BASE_URL

      Auto-Detection

      cora automatically detects which provider to use by checking environment variables in this order:

      Override auto-detection with CORA_PROVIDER env var or --provider flag.

      Usage Examples

      # Use OpenAI (auto-detected from OPENAI_API_KEY)
      $ OPENAI_API_KEY=sk-... cora review --staged
      # Use Anthropic with explicit provider
      $ CORA_PROVIDER=anthropic CORA_API_KEY=sk-ant-... cora review --staged
      # Use Ollama locally (no API key needed)
      $ CORA_PROVIDER=ollama cora review --staged
      # Use a custom model
      $ CORA_MODEL=gpt-4o-mini cora review --staged
      `);function b(n,b){u(b,!1),d(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),p();var x=y();l(`1s16pkr`,e=>{var t=_();i(()=>{a.title=`Providers — cora docs`}),h(e,t)});var S=r(o(x),6),C=r(o(S),4);s(C,4,()=>[`OPENAI_API_KEY → uses OpenAI`,`ANTHROPIC_API_KEY → uses Anthropic`,`GROQ_API_KEY → uses Groq`,`ZAI_API_KEY → uses Z.AI`,`OLLAMA_HOST → uses Ollama (localhost)`],g,(n,i,a)=>{var s=v(),l=o(s);l.textContent=a+1;var u=r(l,2),d=o(u,!0);c(u),c(s),e(()=>t(d,i)),h(n,s)}),c(C),m(2),c(S),m(2),c(x),h(n,x),f()}export{b as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/12.D8T_BCyX.js b/website/build/_app/immutable/nodes/12.D8T_BCyX.js new file mode 100644 index 0000000..a935c69 --- /dev/null +++ b/website/build/_app/immutable/nodes/12.D8T_BCyX.js @@ -0,0 +1 @@ +import{B as e,C as t,E as n,G as r,K as i,R as a,S as o,U as s,W as c,b as l,ct as u,h as d,st as f,u as p,w as m,x as h}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var g=n(`
      ✓ Done
      `),_=n(`✓ Done`),v=n(`◎ Planned`),y=n(`
      `),b=n(`
      → Planned
      `),x=n(`

      Roadmap

      Demand-gated — we build what people actually need. Track progress on GitHub Issues.

      v0.1.5 Initial Release

      v0.1.6 Custom Prompts & Path Injection

      v0.1.7 Deterministic & Reliable

      v0.2.0 Multi-Provider & SARIF

      v0.3 Progress & CI Hardening

      v0.4 Deterministic Engine Pipeline

      v0.5 Install & Distribution

      Future What's Next

      `,1);function S(n){var S=x();d(`5gq709`,e=>{a(()=>{s.title=`Roadmap — cora Docs`})});var C=i(r(S),4),w=c(C),T=i(c(w),2);l(T,4,()=>[{title:`Basic diff review with OpenAI`,issue:90},{title:`JSON response repair & unicode handling`,issue:89},{title:`CLI interface with review command`,issue:90}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(T),u(w);var E=i(w,2),D=i(c(E),2);l(D,4,()=>[{title:`Enhanced default system prompts`,issue:95},{title:`Custom system prompt via .cora.yaml config`,issue:94},{title:`Inject valid file paths into system prompt`,issue:93},{title:`JSON object response format (opt-in)`,issue:92}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(D),u(E);var O=i(E,2),k=i(c(O),2);l(k,4,()=>[{title:`Deterministic reviews — temperature=0`,issue:98},{title:`Non-deterministic output bug fix`,issue:97},{title:`HTTP timeout + connection pooling`,issue:99},{title:`Diff-hash caching for repeat reviews`,issue:100},{title:`Configurable max_tokens`,issue:101}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(k),u(O);var A=i(O,2),j=i(c(A),2);l(j,4,()=>[{title:`BYOK — Anthropic, Groq, Ollama support`,issue:106},{title:`SARIF output format`,issue:106},{title:`Branch review mode`,issue:106},{title:`Output footer watermark`,issue:106}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(j),u(A);var M=i(A,2),N=i(c(M),2);l(N,4,()=>[{title:`Static analysis context injection (reduce false positives)`,issue:140},{title:`--progress flag for machine-readable output`,issue:108},{title:`Composite action crash fix (KeyError)`,issue:102},{title:`Config validate command`,issue:88}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(N),u(M);var P=i(M,2),F=i(c(P),2);l(F,4,()=>[{title:`Deterministic rule engine — 12 built-in rules`,issue:116},{title:`File bundling — parallel per-bundle review`,issue:115},{title:`AST-based cross-file dependency extraction`,issue:114},{title:`Hunk header regex panic fix + 5MB diff support`,issue:159}],h,(n,r)=>{var a=g(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(F),u(P);var I=i(P,2),L=i(c(I),2);l(L,4,()=>[{title:`Easy install — Homebrew tap & install script`,issue:151,status:`done`},{title:`CI gate mode — block PRs on review findings`,issue:149,status:`done`},{title:`Website redesign — landing page + docs`,issue:163,status:`done`},{title:`Interactive auth login with tiered provider selection`,issue:172,status:`done`},{title:`README overhaul — market-facing copy`,issue:162,status:`planned`}],h,(n,r)=>{var a=y(),s=c(a),l=c(s),d=c(l);u(l);var f=i(l,2),h=c(f,!0);u(f),u(s);var g=i(s,2),b=e=>{m(e,_())},x=e=>{m(e,v())};o(g,e=>{r.status===`done`?e(b):e(x,-1)}),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(d,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(L),u(I);var R=i(I,2),z=i(c(R),2);l(z,4,()=>[{title:`Lightweight agent follow-up — 1 capped tool-call`,issue:117},{title:"`cora gain` — local productivity stats + viral sharing",issue:161},{title:`GitHub App backend MVP in Rust (Axum)`,issue:132},{title:`Publish cora-review as GitHub Marketplace action`,issue:47}],h,(n,r)=>{var a=b(),o=c(a),s=c(o),l=c(s);u(s);var d=i(s,2),h=c(d,!0);u(d),u(o),f(2),u(a),e(()=>{p(a,`href`,`https://github.com/codecoradev/cora-cli/issues/${r.issue??``}`),t(l,`#${r.issue??``}`),t(h,r.title)}),m(n,a)}),u(z),u(R),u(C),m(n,S)}export{S as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/13.CfK385I2.js b/website/build/_app/immutable/nodes/13.CfK385I2.js new file mode 100644 index 0000000..0046c4d --- /dev/null +++ b/website/build/_app/immutable/nodes/13.CfK385I2.js @@ -0,0 +1 @@ +import{E as e,K as t,R as n,U as r,W as i,ct as a,h as o,it as s,n as c,rt as l,s as u,st as d,w as f}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var p=e(`

      Usage

      Review Modes

      cora supports multiple review modes, each suited to a different workflow:

      ModeFlagScopeBest For
      Default(no flag)Tries staged first, then unpushedQuick feedback
      Staged--stagedFiles in git staging areaPre-commit review
      Unstaged--unstagedUnstaged working changesReview work in progress
      Unpushed--unpushedCommits not yet pushedReview before push
      Base Branch--base <branch>Diff against base branchPR review workflow
      Commit--commit <ref>Specific commit or rangeReview specific changes
      Diff File--diff-file <path>External diff fileReview patch files
      # Review staged changes (default)
      $ cora review
      # Review against a branch
      $ cora review --base main
      # Review a specific commit
      $ cora review --commit HEAD
      # Review from a diff file
      $ cora review --diff-file pr.diff
      # Full project scan (use cora scan)
      $ cora scan .

      Output Formats

      cora can output results in three formats:

      --format pretty — Human-readable terminal output (default)
      --format json — Machine-readable JSON for CI/CD pipelines
      --format sarif — SARIF format for GitHub Code Scanning
      # JSON output example
      $ cora review --staged --format json
      "files": [
      "path": "src/auth/login.ts",
      "issues": [
      "line": 42,
      "severity": "warning",
      "message": "Potential SQL injection"
      ]
      ],
      "summary"
      "total_files": 3,
      "total_issues": 3

      Configuration File

      The .cora.yaml file provides persistent configuration. Place it in your project root. API keys are stored at ~/.cora/config.toml.

      # .cora.yaml — example
      review:
      severity: warning
      focus: security,performance
      ignore:
      - "vendor/**"
      - "*.min.js"
      providers:
      openai:
      model: gpt-4o

      Environment Variables

      Environment variables override configuration file settings:

      VariableDescriptionRequired
      CORA_API_KEYAPI key for the configured providerYes (unless using cora auth)
      CORA_PROVIDEROverride the LLM providerNo
      CORA_MODELOverride the model nameNo
      CORA_BASE_URLOverride the API base URLNo
      CORA_CONFIGPath to alternative config fileNo

      Working with Monorepos

      cora works well in monorepo setups. Use include patterns to limit review scope to specific packages:

      # Review only the backend package
      $ cora review --staged --include "packages/backend/**"
      # Exclude test and generated files
      $ cora review --staged --exclude "**/*.test.ts" --exclude "**/generated/**"

      Alternatively, set include/exclude patterns in .cora.yaml for persistent configuration.

      Exit Codes

      cora uses standard exit codes for scripting and CI integration:

      CodeMeaningCI Behavior
      0No issues foundPass
      1Issues foundFail (warning/error)
      2Review blockedFail (auth/config error)
      3Authentication errorFail (missing API key)

      Tips

      Use cora review with no flags for the fastest pre-commit feedback
      Combine --format json with --base main in CI pipelines
      Use cora scan . --incremental for large codebases — only changed files are analyzed
      Use --quiet for minimal output and --severity to filter by severity level
      Use cora auth login to store API keys securely instead of environment variables
      `);function m(e,m){s(m,!1),c(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),u();var h=p();o(`1hpl1g`,e=>{n(()=>{r.title=`Usage — cora docs`})});var g=t(i(h),4),_=t(i(g),6),v=t(i(_),2),y=t(i(v),6);y.textContent=`{`;var b=t(y,4);b.textContent=`{`;var x=t(b,6);x.textContent=`{`;var S=t(x,8);S.textContent=`}`;var C=t(S,4);C.textContent=`}`;var w=t(C,4),T=t(i(w));T.nodeValue=`: {`,a(w);var E=t(w,6);E.textContent=`}`;var D=t(E,2);D.textContent=`}`,a(v),a(_),a(g),d(10),a(h),f(e,h),l()}export{m as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/2.DnuVmUIJ.js b/website/build/_app/immutable/nodes/2.DnuVmUIJ.js new file mode 100644 index 0000000..bf551f5 --- /dev/null +++ b/website/build/_app/immutable/nodes/2.DnuVmUIJ.js @@ -0,0 +1 @@ +import{$ as e,B as t,C as n,E as r,K as i,P as a,Q as o,R as s,U as c,W as l,b as u,ct as d,f,h as p,it as m,rt as h,u as g,v as _,w as v,x as y}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as b}from"../chunks/DozEvg9T.js";var x=r(` `),S=r(``);function C(r,C){m(C,!0);let w=()=>e(b,`$page`,T),[T,E]=o(),D=[{href:`/docs/getting-started`,label:`Getting Started`},{href:`/docs/installation`,label:`Installation`},{href:`/docs/usage`,label:`Usage`},{href:`/docs/configuration`,label:`Configuration`},{href:`/docs/providers`,label:`Providers`},{href:`/docs/examples`,label:`Examples`},{href:`/docs/roadmap`,label:`Roadmap`},{href:`/docs/cli-reference`,label:`CLI Reference`},{href:`/docs/changelog`,label:`Changelog`}];var O=S();p(`1bpnej`,e=>{s(()=>{c.title=`Docs — cora`})});var k=l(O),A=l(k),j=i(l(A),4);u(j,21,()=>D,y,(e,r)=>{var i=x();let o;var s=l(i,!0);d(i),t(()=>{g(i,`href`,a(r).href),o=f(i,1,`docs-sidebar-link`,null,o,{active:w().url.pathname===a(r).href}),n(s,a(r).label)}),v(e,i)}),d(j),d(A),d(k);var M=i(k,2);u(i(l(M),2),17,()=>D,y,(e,r)=>{var i=x();let o;var s=l(i,!0);d(i),t(()=>{g(i,`href`,a(r).href),o=f(i,1,``,null,o,{active:w().url.pathname===a(r).href}),n(s,a(r).label)}),v(e,i)}),d(M);var N=i(M,2),P=l(N);_(l(P),()=>C.children),d(P),d(N),d(O),v(r,O),h(),E()}export{C as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/3.D0TU24-D.js b/website/build/_app/immutable/nodes/3.D0TU24-D.js new file mode 100644 index 0000000..2226628 --- /dev/null +++ b/website/build/_app/immutable/nodes/3.D0TU24-D.js @@ -0,0 +1,6 @@ +import{A as e,B as t,C as n,E as r,G as i,H as a,I as o,J as s,K as c,L as l,M as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,X as b,Y as x,Z as S,_ as C,a as w,at as T,b as E,c as ee,ct as D,d as te,f as O,h as k,i as A,it as j,j as ne,k as re,l as M,lt as N,m as ie,n as ae,nt as oe,o as P,p as F,q as I,rt as L,s as R,st as z,tt as se,u as ce,v as B,w as V,x as le,y as ue,z as de}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import{t as H}from"../chunks/BuBrZOIh.js";import"../chunks/qiBCaaew.js";var fe=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,pe=/\n/g,me=/^\s*/,he=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,ge=/^:\s*/,_e=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,ve=/^[;\s]*/,ye=/^\s+|\s+$/g,be=` +`,xe=`/`,Se=`*`,Ce=``,we=`comment`,Te=`declaration`;function Ee(e,t){if(typeof e!=`string`)throw TypeError(`First argument must be a string`);if(!e)return[];t||={};var n=1,r=1;function i(e){var t=e.match(pe);t&&(n+=t.length);var i=e.lastIndexOf(be);r=~i?e.length-i:r+e.length}function a(){var e={line:n,column:r};return function(t){return t.position=new o(e),l(),t}}function o(e){this.start=e,this.end={line:n,column:r},this.source=t.source}o.prototype.content=e;function s(i){var a=Error(t.source+`:`+n+`:`+r+`: `+i);if(a.reason=i,a.filename=t.source,a.line=n,a.column=r,a.source=e,!t.silent)throw a}function c(t){var n=t.exec(e);if(n){var r=n[0];return i(r),e=e.slice(r.length),n}}function l(){c(me)}function u(e){var t;for(e||=[];t=d();)t!==!1&&e.push(t);return e}function d(){var t=a();if(!(xe!=e.charAt(0)||Se!=e.charAt(1))){for(var n=2;Ce!=e.charAt(n)&&(Se!=e.charAt(n)||xe!=e.charAt(n+1));)++n;if(n+=2,Ce===e.charAt(n-1))return s(`End of comment missing`);var o=e.slice(2,n-2);return r+=2,i(o),e=e.slice(n),r+=2,t({type:we,comment:o})}}function f(){var e=a(),t=c(he);if(t){if(d(),!c(ge))return s(`property missing ':'`);var n=c(_e),r=e({type:Te,property:De(t[0].replace(fe,Ce)),value:n?De(n[0].replace(fe,Ce)):Ce});return c(ve),r}}function p(){var e=[];u(e);for(var t;t=f();)t!==!1&&(e.push(t),u(e));return e}return l(),p()}function De(e){return e?e.replace(ye,Ce):Ce}function Oe(e,t){let n=null;if(!e||typeof e!=`string`)return n;let r=Ee(e),i=typeof t==`function`;return r.forEach(e=>{if(e.type!==`declaration`)return;let{property:r,value:a}=e;i?t(r,a,e):a&&(n||={},n[r]=a)}),n}var ke=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ae(e,t){let n=w(t,ke),r=[[`path`,{d:`M5 12h14`}],[`path`,{d:`m12 5 7 7-7 7`}]];H(e,P({name:`arrow-right`},()=>n,{get iconNode(){return r}}))}var je=new Set([`$$slots`,`$$events`,`$$legacy`]);function Me(e,t){let n=w(t,je),r=[[`path`,{d:`M20 6 9 17l-5-5`}]];H(e,P({name:`check`},()=>n,{get iconNode(){return r}}))}var Ne=new Set([`$$slots`,`$$events`,`$$legacy`]);function Pe(e,t){let n=w(t,Ne),r=[[`path`,{d:`m6 9 6 6 6-6`}]];H(e,P({name:`chevron-down`},()=>n,{get iconNode(){return r}}))}var Fe=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ie(e,t){let n=w(t,Fe),r=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`}],[`path`,{d:`m9 11 3 3L22 4`}]];H(e,P({name:`circle-check-big`},()=>n,{get iconNode(){return r}}))}var Le=new Set([`$$slots`,`$$events`,`$$legacy`]);function Re(e,t){let n=w(t,Le),r=[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`}]];H(e,P({name:`copy`},()=>n,{get iconNode(){return r}}))}var ze=new Set([`$$slots`,`$$events`,`$$legacy`]);function Be(e,t){let n=w(t,ze),r=[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}]];H(e,P({name:`eye`},()=>n,{get iconNode(){return r}}))}var Ve=new Set([`$$slots`,`$$events`,`$$legacy`]);function He(e,t){let n=w(t,Ve),r=[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`}],[`path`,{d:`m9 15 2 2 4-4`}]];H(e,P({name:`file-check`},()=>n,{get iconNode(){return r}}))}var Ue=new Set([`$$slots`,`$$events`,`$$legacy`]);function We(e,t){let n=w(t,Ue),r=[[`path`,{d:`M15 6a9 9 0 0 0-9 9V3`}],[`circle`,{cx:`18`,cy:`6`,r:`3`}],[`circle`,{cx:`6`,cy:`18`,r:`3`}]];H(e,P({name:`git-branch`},()=>n,{get iconNode(){return r}}))}var Ge=new Set([`$$slots`,`$$events`,`$$legacy`]);function Ke(e,t){let n=w(t,Ge),r=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]];H(e,P({name:`key-round`},()=>n,{get iconNode(){return r}}))}var qe=new Set([`$$slots`,`$$events`,`$$legacy`]);function Je(e,t){let n=w(t,qe),r=[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`}]];H(e,P({name:`layers`},()=>n,{get iconNode(){return r}}))}var Ye=new Set([`$$slots`,`$$events`,`$$legacy`]);function Xe(e,t){let n=w(t,Ye),r=[[`path`,{d:`M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5`}],[`path`,{d:`M9 18h6`}],[`path`,{d:`M10 22h4`}]];H(e,P({name:`lightbulb`},()=>n,{get iconNode(){return r}}))}var Ze=new Set([`$$slots`,`$$events`,`$$legacy`]);function Qe(e,t){let n=w(t,Ze),r=[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`}]];H(e,P({name:`lock`},()=>n,{get iconNode(){return r}}))}var $e=new Set([`$$slots`,`$$events`,`$$legacy`]);function et(e,t){let n=w(t,$e),r=[[`path`,{d:`M3 7V5a2 2 0 0 1 2-2h2`}],[`path`,{d:`M17 3h2a2 2 0 0 1 2 2v2`}],[`path`,{d:`M21 17v2a2 2 0 0 1-2 2h-2`}],[`path`,{d:`M7 21H5a2 2 0 0 1-2-2v-2`}],[`circle`,{cx:`12`,cy:`12`,r:`3`}],[`path`,{d:`m16 16-1.9-1.9`}]];H(e,P({name:`scan-search`},()=>n,{get iconNode(){return r}}))}var tt=new Set([`$$slots`,`$$events`,`$$legacy`]);function nt(e,t){let n=w(t,tt),r=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}],[`path`,{d:`m9 12 2 2 4-4`}]];H(e,P({name:`shield-check`},()=>n,{get iconNode(){return r}}))}var rt=new Set([`$$slots`,`$$events`,`$$legacy`]);function it(e,t){let n=w(t,rt),r=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`}]];H(e,P({name:`shield`},()=>n,{get iconNode(){return r}}))}var at=new Set([`$$slots`,`$$events`,`$$legacy`]);function ot(e,t){let n=w(t,at),r=[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`}]];H(e,P({name:`star`},()=>n,{get iconNode(){return r}}))}var st=new Set([`$$slots`,`$$events`,`$$legacy`]);function ct(e,t){let n=w(t,st),r=[[`path`,{d:`M12 3v12`}],[`path`,{d:`m17 8-5-5-5 5`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}]];H(e,P({name:`upload`},()=>n,{get iconNode(){return r}}))}var lt=new Set([`$$slots`,`$$events`,`$$legacy`]);function ut(e,t){let n=w(t,lt),r=[[`path`,{d:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`}]];H(e,P({name:`zap`},()=>n,{get iconNode(){return r}}))}var dt=(e,t)=>{let n=Array(e.length+t.length);for(let t=0;t({classGroupId:e,validator:t}),pt=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),mt=`-`,ht=[],gt=`arbitrary..`,_t=e=>{let t=bt(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return yt(e);let n=e.split(mt);return vt(n,+(n[0]===``&&n.length>1),t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?dt(i,t):t:i||ht}return n[e]||ht}}},vt=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=vt(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(mt):e.slice(t).join(mt),s=a.length;for(let e=0;ee.slice(1,-1).indexOf(`:`)===-1?void 0:(()=>{let t=e.slice(1,-1),n=t.indexOf(`:`),r=t.slice(0,n);return r?gt+r:void 0})(),bt=e=>{let{theme:t,classGroups:n}=e;return xt(n,t)},xt=(e,t)=>{let n=pt();for(let r in e){let i=e[r];St(i,n,r,t)}return n},St=(e,t,n,r)=>{let i=e.length;for(let a=0;a{if(typeof e==`string`){wt(e,t,n);return}if(typeof e==`function`){Tt(e,t,n,r);return}Et(e,t,n,r)},wt=(e,t,n)=>{let r=e===``?t:Dt(t,e);r.classGroupId=n},Tt=(e,t,n,r)=>{if(Ot(e)){St(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(ft(n,e))},Et=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e{let n=e,r=t.split(mt),i=r.length;for(let e=0;e`isThemeGetter`in e&&e.isThemeGetter===!0,kt=e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let t=0,n=Object.create(null),r=Object.create(null),i=(i,a)=>{n[i]=a,t++,t>e&&(t=0,r=n,n=Object.create(null))};return{get(e){let t=n[e];if(t!==void 0)return t;if((t=r[e])!==void 0)return i(e,t),t},set(e,t){e in n?n[e]=t:i(e,t)}}},At=`!`,jt=`:`,Mt=[],Nt=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),Pt=e=>{let{prefix:t,experimentalParseClassName:n}=e,r=e=>{let t=[],n=0,r=0,i=0,a,o=e.length;for(let s=0;si?a-i:void 0;return Nt(t,l,c,u)};if(t){let e=t+jt,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):Nt(Mt,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},Ft=e=>{let t=new Map;return e.orderSensitiveModifiers.forEach((e,n)=>{t.set(e,1e6+n)}),e=>{let n=[],r=[];for(let i=0;i0&&(r.sort(),n.push(...r),r=[]),n.push(a)):r.push(a)}return r.length>0&&(r.sort(),n.push(...r)),n}},It=e=>({cache:kt(e.cacheSize),parseClassName:Pt(e),sortModifiers:Ft(e),postfixLookupClassGroupIds:Lt(e),..._t(e)}),Lt=e=>{let t=Object.create(null),n=e.postfixLookupClassGroups;if(n)for(let e=0;e{let{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i,sortModifiers:a,postfixLookupClassGroupIds:o}=t,s=[],c=e.trim().split(Rt),l=``;for(let e=c.length-1;e>=0;--e){let t=c[e],{isExternal:u,modifiers:d,hasImportantModifier:f,baseClassName:p,maybePostfixModifierPosition:m}=n(t);if(u){l=t+(l.length>0?` `+l:l);continue}let h=!!m,g;if(h){g=r(p.substring(0,m));let e=g&&o[g]?r(p):void 0;e&&e!==g&&(g=e,h=!1)}else g=r(p);if(!g){if(!h){l=t+(l.length>0?` `+l:l);continue}if(g=r(p),!g){l=t+(l.length>0?` `+l:l);continue}h=!1}let _=d.length===0?``:d.length===1?d[0]:a(d).join(`:`),v=f?_+At:_,y=v+g;if(s.indexOf(y)>-1)continue;s.push(y);let b=i(g,h);for(let e=0;e0?` `+l:l)}return l},Bt=(...e)=>{let t=0,n,r,i=``;for(;t{if(typeof e==`string`)return e;let t,n=``;for(let r=0;r{let n,r,i,a,o=o=>(n=It(t.reduce((e,t)=>t(e),e())),r=n.cache.get,i=n.cache.set,a=s,s(o)),s=e=>{let t=r(e);if(t)return t;let a=zt(e,n);return i(e,a),a};return a=o,(...e)=>a(Bt(...e))},Ut=[],U=e=>{let t=t=>t[e]||Ut;return t.isThemeGetter=!0,t},Wt=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Gt=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Kt=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,qt=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Jt=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Yt=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Xt=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Zt=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,W=e=>Kt.test(e),G=e=>!!e&&!Number.isNaN(Number(e)),K=e=>!!e&&Number.isInteger(Number(e)),Qt=e=>e.endsWith(`%`)&&G(e.slice(0,-1)),q=e=>qt.test(e),$t=()=>!0,en=e=>Jt.test(e)&&!Yt.test(e),tn=()=>!1,nn=e=>Xt.test(e),rn=e=>Zt.test(e),an=e=>!J(e)&&!Y(e),on=e=>e.startsWith(`@container`)&&(e[10]===`/`&&e[11]!==void 0||e[11]===`s`&&e[16]!==void 0&&e.startsWith(`-size/`,10)||e[11]===`n`&&e[18]!==void 0&&e.startsWith(`-normal/`,10)),sn=e=>X(e,Tn,tn),J=e=>Wt.test(e),cn=e=>X(e,En,en),ln=e=>X(e,Dn,G),un=e=>X(e,kn,$t),dn=e=>X(e,On,tn),fn=e=>X(e,Cn,tn),pn=e=>X(e,wn,rn),mn=e=>X(e,An,nn),Y=e=>Gt.test(e),hn=e=>Sn(e,En),gn=e=>Sn(e,On),_n=e=>Sn(e,Cn),vn=e=>Sn(e,Tn),yn=e=>Sn(e,wn),bn=e=>Sn(e,An,!0),xn=e=>Sn(e,kn,!0),X=(e,t,n)=>{let r=Wt.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},Sn=(e,t,n=!1)=>{let r=Gt.exec(e);return r?r[1]?t(r[1]):n:!1},Cn=e=>e===`position`||e===`percentage`,wn=e=>e===`image`||e===`url`,Tn=e=>e===`length`||e===`size`||e===`bg-size`,En=e=>e===`length`,Dn=e=>e===`number`,On=e=>e===`family-name`,kn=e=>e===`number`||e===`weight`,An=e=>e===`shadow`,jn=Ht(()=>{let e=U(`color`),t=U(`font`),n=U(`text`),r=U(`font-weight`),i=U(`tracking`),a=U(`leading`),o=U(`breakpoint`),s=U(`container`),c=U(`spacing`),l=U(`radius`),u=U(`shadow`),d=U(`inset-shadow`),f=U(`text-shadow`),p=U(`drop-shadow`),m=U(`blur`),h=U(`perspective`),g=U(`aspect`),_=U(`ease`),v=U(`animate`),y=()=>[`auto`,`avoid`,`all`,`avoid-page`,`page`,`left`,`right`,`column`],b=()=>[`center`,`top`,`bottom`,`left`,`right`,`top-left`,`left-top`,`top-right`,`right-top`,`bottom-right`,`right-bottom`,`bottom-left`,`left-bottom`],x=()=>[...b(),Y,J],S=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],C=()=>[`auto`,`contain`,`none`],w=()=>[Y,J,c],T=()=>[W,`full`,`auto`,...w()],E=()=>[K,`none`,`subgrid`,Y,J],ee=()=>[`auto`,{span:[`full`,K,Y,J]},K,Y,J],D=()=>[K,`auto`,Y,J],te=()=>[`auto`,`min`,`max`,`fr`,Y,J],O=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],k=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],A=()=>[`auto`,...w()],j=()=>[W,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...w()],ne=()=>[W,`screen`,`full`,`dvw`,`lvw`,`svw`,`min`,`max`,`fit`,...w()],re=()=>[W,`screen`,`full`,`lh`,`dvh`,`lvh`,`svh`,`min`,`max`,`fit`,...w()],M=()=>[e,Y,J],N=()=>[...b(),_n,fn,{position:[Y,J]}],ie=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],ae=()=>[`auto`,`cover`,`contain`,vn,sn,{size:[Y,J]}],oe=()=>[Qt,hn,cn],P=()=>[``,`none`,`full`,l,Y,J],F=()=>[``,G,hn,cn],I=()=>[`solid`,`dashed`,`dotted`,`double`],L=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],R=()=>[G,Qt,_n,fn],z=()=>[``,`none`,m,Y,J],se=()=>[`none`,G,Y,J],ce=()=>[`none`,G,Y,J],B=()=>[G,Y,J],V=()=>[W,`full`,...w()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[q],breakpoint:[q],color:[$t],container:[q],"drop-shadow":[q],ease:[`in`,`out`,`in-out`],font:[an],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[q],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[q],shadow:[q],spacing:[`px`,G],text:[q],"text-shadow":[q],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,W,J,Y,g]}],container:[`container`],"container-type":[{"@container":[``,`normal`,`size`,Y,J]}],"container-named":[on],columns:[{columns:[G,J,Y,s]}],"break-after":[{"break-after":y()}],"break-before":[{"break-before":y()}],"break-inside":[{"break-inside":[`auto`,`avoid`,`avoid-page`,`avoid-column`]}],"box-decoration":[{"box-decoration":[`slice`,`clone`]}],box:[{box:[`border`,`content`]}],display:[`block`,`inline-block`,`inline`,`flex`,`inline-flex`,`table`,`inline-table`,`table-caption`,`table-cell`,`table-column`,`table-column-group`,`table-footer-group`,`table-header-group`,`table-row-group`,`table-row`,`flow-root`,`grid`,`inline-grid`,`contents`,`list-item`,`hidden`],sr:[`sr-only`,`not-sr-only`],float:[{float:[`right`,`left`,`none`,`start`,`end`]}],clear:[{clear:[`left`,`right`,`both`,`none`,`start`,`end`]}],isolation:[`isolate`,`isolation-auto`],"object-fit":[{object:[`contain`,`cover`,`fill`,`none`,`scale-down`]}],"object-position":[{object:x()}],overflow:[{overflow:S()}],"overflow-x":[{"overflow-x":S()}],"overflow-y":[{"overflow-y":S()}],overscroll:[{overscroll:C()}],"overscroll-x":[{"overscroll-x":C()}],"overscroll-y":[{"overscroll-y":C()}],position:[`static`,`fixed`,`absolute`,`relative`,`sticky`],inset:[{inset:T()}],"inset-x":[{"inset-x":T()}],"inset-y":[{"inset-y":T()}],start:[{"inset-s":T(),start:T()}],end:[{"inset-e":T(),end:T()}],"inset-bs":[{"inset-bs":T()}],"inset-be":[{"inset-be":T()}],top:[{top:T()}],right:[{right:T()}],bottom:[{bottom:T()}],left:[{left:T()}],visibility:[`visible`,`invisible`,`collapse`],z:[{z:[K,`auto`,Y,J]}],basis:[{basis:[W,`full`,`auto`,s,...w()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[G,W,`auto`,`initial`,`none`,J]}],grow:[{grow:[``,G,Y,J]}],shrink:[{shrink:[``,G,Y,J]}],order:[{order:[K,`first`,`last`,`none`,Y,J]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:ee()}],"col-start":[{"col-start":D()}],"col-end":[{"col-end":D()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:ee()}],"row-start":[{"row-start":D()}],"row-end":[{"row-end":D()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":te()}],"auto-rows":[{"auto-rows":te()}],gap:[{gap:w()}],"gap-x":[{"gap-x":w()}],"gap-y":[{"gap-y":w()}],"justify-content":[{justify:[...O(),`normal`]}],"justify-items":[{"justify-items":[...k(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...k()]}],"align-content":[{content:[`normal`,...O()]}],"align-items":[{items:[...k(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...k(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":O()}],"place-items":[{"place-items":[...k(),`baseline`]}],"place-self":[{"place-self":[`auto`,...k()]}],p:[{p:w()}],px:[{px:w()}],py:[{py:w()}],ps:[{ps:w()}],pe:[{pe:w()}],pbs:[{pbs:w()}],pbe:[{pbe:w()}],pt:[{pt:w()}],pr:[{pr:w()}],pb:[{pb:w()}],pl:[{pl:w()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mbs:[{mbs:A()}],mbe:[{mbe:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":w()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":w()}],"space-y-reverse":[`space-y-reverse`],size:[{size:j()}],"inline-size":[{inline:[`auto`,...ne()]}],"min-inline-size":[{"min-inline":[`auto`,...ne()]}],"max-inline-size":[{"max-inline":[`none`,...ne()]}],"block-size":[{block:[`auto`,...re()]}],"min-block-size":[{"min-block":[`auto`,...re()]}],"max-block-size":[{"max-block":[`none`,...re()]}],w:[{w:[s,`screen`,...j()]}],"min-w":[{"min-w":[s,`screen`,`none`,...j()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...j()]}],h:[{h:[`screen`,`lh`,...j()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...j()]}],"max-h":[{"max-h":[`screen`,`lh`,...j()]}],"font-size":[{text:[`base`,n,hn,cn]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,xn,un]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,Qt,J]}],"font-family":[{font:[gn,dn,t]}],"font-features":[{"font-features":[J]}],"fvn-normal":[`normal-nums`],"fvn-ordinal":[`ordinal`],"fvn-slashed-zero":[`slashed-zero`],"fvn-figure":[`lining-nums`,`oldstyle-nums`],"fvn-spacing":[`proportional-nums`,`tabular-nums`],"fvn-fraction":[`diagonal-fractions`,`stacked-fractions`],tracking:[{tracking:[i,Y,J]}],"line-clamp":[{"line-clamp":[G,`none`,Y,ln]}],leading:[{leading:[a,...w()]}],"list-image":[{"list-image":[`none`,Y,J]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,Y,J]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:M()}],"text-color":[{text:M()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...I(),`wavy`]}],"text-decoration-thickness":[{decoration:[G,`from-font`,`auto`,Y,cn]}],"text-decoration-color":[{decoration:M()}],"underline-offset":[{"underline-offset":[G,`auto`,Y,J]}],"text-transform":[`uppercase`,`lowercase`,`capitalize`,`normal-case`],"text-overflow":[`truncate`,`text-ellipsis`,`text-clip`],"text-wrap":[{text:[`wrap`,`nowrap`,`balance`,`pretty`]}],indent:[{indent:w()}],"tab-size":[{tab:[K,Y,J]}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,Y,J]}],whitespace:[{whitespace:[`normal`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]}],break:[{break:[`normal`,`words`,`all`,`keep`]}],wrap:[{wrap:[`break-word`,`anywhere`,`normal`]}],hyphens:[{hyphens:[`none`,`manual`,`auto`]}],content:[{content:[`none`,Y,J]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:N()}],"bg-repeat":[{bg:ie()}],"bg-size":[{bg:ae()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},K,Y,J],radial:[``,Y,J],conic:[K,Y,J]},yn,pn]}],"bg-color":[{bg:M()}],"gradient-from-pos":[{from:oe()}],"gradient-via-pos":[{via:oe()}],"gradient-to-pos":[{to:oe()}],"gradient-from":[{from:M()}],"gradient-via":[{via:M()}],"gradient-to":[{to:M()}],rounded:[{rounded:P()}],"rounded-s":[{"rounded-s":P()}],"rounded-e":[{"rounded-e":P()}],"rounded-t":[{"rounded-t":P()}],"rounded-r":[{"rounded-r":P()}],"rounded-b":[{"rounded-b":P()}],"rounded-l":[{"rounded-l":P()}],"rounded-ss":[{"rounded-ss":P()}],"rounded-se":[{"rounded-se":P()}],"rounded-ee":[{"rounded-ee":P()}],"rounded-es":[{"rounded-es":P()}],"rounded-tl":[{"rounded-tl":P()}],"rounded-tr":[{"rounded-tr":P()}],"rounded-br":[{"rounded-br":P()}],"rounded-bl":[{"rounded-bl":P()}],"border-w":[{border:F()}],"border-w-x":[{"border-x":F()}],"border-w-y":[{"border-y":F()}],"border-w-s":[{"border-s":F()}],"border-w-e":[{"border-e":F()}],"border-w-bs":[{"border-bs":F()}],"border-w-be":[{"border-be":F()}],"border-w-t":[{"border-t":F()}],"border-w-r":[{"border-r":F()}],"border-w-b":[{"border-b":F()}],"border-w-l":[{"border-l":F()}],"divide-x":[{"divide-x":F()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":F()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...I(),`hidden`,`none`]}],"divide-style":[{divide:[...I(),`hidden`,`none`]}],"border-color":[{border:M()}],"border-color-x":[{"border-x":M()}],"border-color-y":[{"border-y":M()}],"border-color-s":[{"border-s":M()}],"border-color-e":[{"border-e":M()}],"border-color-bs":[{"border-bs":M()}],"border-color-be":[{"border-be":M()}],"border-color-t":[{"border-t":M()}],"border-color-r":[{"border-r":M()}],"border-color-b":[{"border-b":M()}],"border-color-l":[{"border-l":M()}],"divide-color":[{divide:M()}],"outline-style":[{outline:[...I(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[G,Y,J]}],"outline-w":[{outline:[``,G,hn,cn]}],"outline-color":[{outline:M()}],shadow:[{shadow:[``,`none`,u,bn,mn]}],"shadow-color":[{shadow:M()}],"inset-shadow":[{"inset-shadow":[`none`,d,bn,mn]}],"inset-shadow-color":[{"inset-shadow":M()}],"ring-w":[{ring:F()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:M()}],"ring-offset-w":[{"ring-offset":[G,cn]}],"ring-offset-color":[{"ring-offset":M()}],"inset-ring-w":[{"inset-ring":F()}],"inset-ring-color":[{"inset-ring":M()}],"text-shadow":[{"text-shadow":[`none`,f,bn,mn]}],"text-shadow-color":[{"text-shadow":M()}],opacity:[{opacity:[G,Y,J]}],"mix-blend":[{"mix-blend":[...L(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":L()}],"mask-clip":[{"mask-clip":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]},`mask-no-clip`],"mask-composite":[{mask:[`add`,`subtract`,`intersect`,`exclude`]}],"mask-image-linear-pos":[{"mask-linear":[G]}],"mask-image-linear-from-pos":[{"mask-linear-from":R()}],"mask-image-linear-to-pos":[{"mask-linear-to":R()}],"mask-image-linear-from-color":[{"mask-linear-from":M()}],"mask-image-linear-to-color":[{"mask-linear-to":M()}],"mask-image-t-from-pos":[{"mask-t-from":R()}],"mask-image-t-to-pos":[{"mask-t-to":R()}],"mask-image-t-from-color":[{"mask-t-from":M()}],"mask-image-t-to-color":[{"mask-t-to":M()}],"mask-image-r-from-pos":[{"mask-r-from":R()}],"mask-image-r-to-pos":[{"mask-r-to":R()}],"mask-image-r-from-color":[{"mask-r-from":M()}],"mask-image-r-to-color":[{"mask-r-to":M()}],"mask-image-b-from-pos":[{"mask-b-from":R()}],"mask-image-b-to-pos":[{"mask-b-to":R()}],"mask-image-b-from-color":[{"mask-b-from":M()}],"mask-image-b-to-color":[{"mask-b-to":M()}],"mask-image-l-from-pos":[{"mask-l-from":R()}],"mask-image-l-to-pos":[{"mask-l-to":R()}],"mask-image-l-from-color":[{"mask-l-from":M()}],"mask-image-l-to-color":[{"mask-l-to":M()}],"mask-image-x-from-pos":[{"mask-x-from":R()}],"mask-image-x-to-pos":[{"mask-x-to":R()}],"mask-image-x-from-color":[{"mask-x-from":M()}],"mask-image-x-to-color":[{"mask-x-to":M()}],"mask-image-y-from-pos":[{"mask-y-from":R()}],"mask-image-y-to-pos":[{"mask-y-to":R()}],"mask-image-y-from-color":[{"mask-y-from":M()}],"mask-image-y-to-color":[{"mask-y-to":M()}],"mask-image-radial":[{"mask-radial":[Y,J]}],"mask-image-radial-from-pos":[{"mask-radial-from":R()}],"mask-image-radial-to-pos":[{"mask-radial-to":R()}],"mask-image-radial-from-color":[{"mask-radial-from":M()}],"mask-image-radial-to-color":[{"mask-radial-to":M()}],"mask-image-radial-shape":[{"mask-radial":[`circle`,`ellipse`]}],"mask-image-radial-size":[{"mask-radial":[{closest:[`side`,`corner`],farthest:[`side`,`corner`]}]}],"mask-image-radial-pos":[{"mask-radial-at":b()}],"mask-image-conic-pos":[{"mask-conic":[G]}],"mask-image-conic-from-pos":[{"mask-conic-from":R()}],"mask-image-conic-to-pos":[{"mask-conic-to":R()}],"mask-image-conic-from-color":[{"mask-conic-from":M()}],"mask-image-conic-to-color":[{"mask-conic-to":M()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:N()}],"mask-repeat":[{mask:ie()}],"mask-size":[{mask:ae()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,Y,J]}],filter:[{filter:[``,`none`,Y,J]}],blur:[{blur:z()}],brightness:[{brightness:[G,Y,J]}],contrast:[{contrast:[G,Y,J]}],"drop-shadow":[{"drop-shadow":[``,`none`,p,bn,mn]}],"drop-shadow-color":[{"drop-shadow":M()}],grayscale:[{grayscale:[``,G,Y,J]}],"hue-rotate":[{"hue-rotate":[G,Y,J]}],invert:[{invert:[``,G,Y,J]}],saturate:[{saturate:[G,Y,J]}],sepia:[{sepia:[``,G,Y,J]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,Y,J]}],"backdrop-blur":[{"backdrop-blur":z()}],"backdrop-brightness":[{"backdrop-brightness":[G,Y,J]}],"backdrop-contrast":[{"backdrop-contrast":[G,Y,J]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,G,Y,J]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[G,Y,J]}],"backdrop-invert":[{"backdrop-invert":[``,G,Y,J]}],"backdrop-opacity":[{"backdrop-opacity":[G,Y,J]}],"backdrop-saturate":[{"backdrop-saturate":[G,Y,J]}],"backdrop-sepia":[{"backdrop-sepia":[``,G,Y,J]}],"border-collapse":[{border:[`collapse`,`separate`]}],"border-spacing":[{"border-spacing":w()}],"border-spacing-x":[{"border-spacing-x":w()}],"border-spacing-y":[{"border-spacing-y":w()}],"table-layout":[{table:[`auto`,`fixed`]}],caption:[{caption:[`top`,`bottom`]}],transition:[{transition:[``,`all`,`colors`,`opacity`,`shadow`,`transform`,`none`,Y,J]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[G,`initial`,Y,J]}],ease:[{ease:[`linear`,`initial`,_,Y,J]}],delay:[{delay:[G,Y,J]}],animate:[{animate:[`none`,v,Y,J]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[h,Y,J]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:se()}],"rotate-x":[{"rotate-x":se()}],"rotate-y":[{"rotate-y":se()}],"rotate-z":[{"rotate-z":se()}],scale:[{scale:ce()}],"scale-x":[{"scale-x":ce()}],"scale-y":[{"scale-y":ce()}],"scale-z":[{"scale-z":ce()}],"scale-3d":[`scale-3d`],skew:[{skew:B()}],"skew-x":[{"skew-x":B()}],"skew-y":[{"skew-y":B()}],transform:[{transform:[Y,J,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:V()}],"translate-x":[{"translate-x":V()}],"translate-y":[{"translate-y":V()}],"translate-z":[{"translate-z":V()}],"translate-none":[`translate-none`],zoom:[{zoom:[K,Y,J]}],accent:[{accent:M()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:M()}],"color-scheme":[{scheme:[`normal`,`dark`,`light`,`light-dark`,`only-dark`,`only-light`]}],cursor:[{cursor:[`auto`,`default`,`pointer`,`wait`,`text`,`move`,`help`,`not-allowed`,`none`,`context-menu`,`progress`,`cell`,`crosshair`,`vertical-text`,`alias`,`copy`,`no-drop`,`grab`,`grabbing`,`all-scroll`,`col-resize`,`row-resize`,`n-resize`,`e-resize`,`s-resize`,`w-resize`,`ne-resize`,`nw-resize`,`se-resize`,`sw-resize`,`ew-resize`,`ns-resize`,`nesw-resize`,`nwse-resize`,`zoom-in`,`zoom-out`,Y,J]}],"field-sizing":[{"field-sizing":[`fixed`,`content`]}],"pointer-events":[{"pointer-events":[`auto`,`none`]}],resize:[{resize:[`none`,``,`y`,`x`]}],"scroll-behavior":[{scroll:[`auto`,`smooth`]}],"scrollbar-thumb-color":[{"scrollbar-thumb":M()}],"scrollbar-track-color":[{"scrollbar-track":M()}],"scrollbar-gutter":[{"scrollbar-gutter":[`auto`,`stable`,`both`]}],"scrollbar-w":[{scrollbar:[`auto`,`thin`,`none`]}],"scroll-m":[{"scroll-m":w()}],"scroll-mx":[{"scroll-mx":w()}],"scroll-my":[{"scroll-my":w()}],"scroll-ms":[{"scroll-ms":w()}],"scroll-me":[{"scroll-me":w()}],"scroll-mbs":[{"scroll-mbs":w()}],"scroll-mbe":[{"scroll-mbe":w()}],"scroll-mt":[{"scroll-mt":w()}],"scroll-mr":[{"scroll-mr":w()}],"scroll-mb":[{"scroll-mb":w()}],"scroll-ml":[{"scroll-ml":w()}],"scroll-p":[{"scroll-p":w()}],"scroll-px":[{"scroll-px":w()}],"scroll-py":[{"scroll-py":w()}],"scroll-ps":[{"scroll-ps":w()}],"scroll-pe":[{"scroll-pe":w()}],"scroll-pbs":[{"scroll-pbs":w()}],"scroll-pbe":[{"scroll-pbe":w()}],"scroll-pt":[{"scroll-pt":w()}],"scroll-pr":[{"scroll-pr":w()}],"scroll-pb":[{"scroll-pb":w()}],"scroll-pl":[{"scroll-pl":w()}],"snap-align":[{snap:[`start`,`end`,`center`,`align-none`]}],"snap-stop":[{snap:[`normal`,`always`]}],"snap-type":[{snap:[`none`,`x`,`y`,`both`]}],"snap-strictness":[{snap:[`mandatory`,`proximity`]}],touch:[{touch:[`auto`,`none`,`manipulation`]}],"touch-x":[{"touch-pan":[`x`,`left`,`right`]}],"touch-y":[{"touch-pan":[`y`,`up`,`down`]}],"touch-pz":[`touch-pinch-zoom`],select:[{select:[`none`,`text`,`all`,`auto`]}],"will-change":[{"will-change":[`auto`,`scroll`,`contents`,`transform`,Y,J]}],fill:[{fill:[`none`,...M()]}],"stroke-w":[{stroke:[G,hn,cn,ln]}],stroke:[{stroke:[`none`,...M()]}],"forced-color-adjust":[{"forced-color-adjust":[`auto`,`none`]}]},conflictingClassGroups:{"container-named":[`container-type`],overflow:[`overflow-x`,`overflow-y`],overscroll:[`overscroll-x`,`overscroll-y`],inset:[`inset-x`,`inset-y`,`inset-bs`,`inset-be`,`start`,`end`,`top`,`right`,`bottom`,`left`],"inset-x":[`right`,`left`],"inset-y":[`top`,`bottom`],flex:[`basis`,`grow`,`shrink`],gap:[`gap-x`,`gap-y`],p:[`px`,`py`,`ps`,`pe`,`pbs`,`pbe`,`pt`,`pr`,`pb`,`pl`],px:[`pr`,`pl`],py:[`pt`,`pb`],m:[`mx`,`my`,`ms`,`me`,`mbs`,`mbe`,`mt`,`mr`,`mb`,`ml`],mx:[`mr`,`ml`],my:[`mt`,`mb`],size:[`w`,`h`],"font-size":[`leading`],"fvn-normal":[`fvn-ordinal`,`fvn-slashed-zero`,`fvn-figure`,`fvn-spacing`,`fvn-fraction`],"fvn-ordinal":[`fvn-normal`],"fvn-slashed-zero":[`fvn-normal`],"fvn-figure":[`fvn-normal`],"fvn-spacing":[`fvn-normal`],"fvn-fraction":[`fvn-normal`],"line-clamp":[`display`,`overflow`],rounded:[`rounded-s`,`rounded-e`,`rounded-t`,`rounded-r`,`rounded-b`,`rounded-l`,`rounded-ss`,`rounded-se`,`rounded-ee`,`rounded-es`,`rounded-tl`,`rounded-tr`,`rounded-br`,`rounded-bl`],"rounded-s":[`rounded-ss`,`rounded-es`],"rounded-e":[`rounded-se`,`rounded-ee`],"rounded-t":[`rounded-tl`,`rounded-tr`],"rounded-r":[`rounded-tr`,`rounded-br`],"rounded-b":[`rounded-br`,`rounded-bl`],"rounded-l":[`rounded-tl`,`rounded-bl`],"border-spacing":[`border-spacing-x`,`border-spacing-y`],"border-w":[`border-w-x`,`border-w-y`,`border-w-s`,`border-w-e`,`border-w-bs`,`border-w-be`,`border-w-t`,`border-w-r`,`border-w-b`,`border-w-l`],"border-w-x":[`border-w-r`,`border-w-l`],"border-w-y":[`border-w-t`,`border-w-b`],"border-color":[`border-color-x`,`border-color-y`,`border-color-s`,`border-color-e`,`border-color-bs`,`border-color-be`,`border-color-t`,`border-color-r`,`border-color-b`,`border-color-l`],"border-color-x":[`border-color-r`,`border-color-l`],"border-color-y":[`border-color-t`,`border-color-b`],translate:[`translate-x`,`translate-y`,`translate-none`],"translate-none":[`translate`,`translate-x`,`translate-y`,`translate-z`],"scroll-m":[`scroll-mx`,`scroll-my`,`scroll-ms`,`scroll-me`,`scroll-mbs`,`scroll-mbe`,`scroll-mt`,`scroll-mr`,`scroll-mb`,`scroll-ml`],"scroll-mx":[`scroll-mr`,`scroll-ml`],"scroll-my":[`scroll-mt`,`scroll-mb`],"scroll-p":[`scroll-px`,`scroll-py`,`scroll-ps`,`scroll-pe`,`scroll-pbs`,`scroll-pbe`,`scroll-pt`,`scroll-pr`,`scroll-pb`,`scroll-pl`],"scroll-px":[`scroll-pr`,`scroll-pl`],"scroll-py":[`scroll-pt`,`scroll-pb`],touch:[`touch-x`,`touch-y`,`touch-pz`],"touch-x":[`touch`],"touch-y":[`touch`],"touch-pz":[`touch`]},conflictingClassGroupModifiers:{"font-size":[`leading`]},postfixLookupClassGroups:[`container-type`],orderSensitiveModifiers:[`*`,`**`,`after`,`backdrop`,`before`,`details-content`,`file`,`first-letter`,`first-line`,`marker`,`placeholder`,`selection`]}});function Z(...e){return jn(ie(e))}var Mn=new Set([`$$slots`,`$$events`,`$$legacy`,`title`,`showCopy`,`copyText`,`children`,`class`]),Nn=r(``),Pn=r(`
      `);function Fn(e,r){j(r,!0);let i=A(r,`title`,3,`Terminal`),a=A(r,`showCopy`,3,!1),o=w(r,Mn),l=x(!1);async function u(){if(!p(l))try{let e=r.copyText??``;e&&(await navigator.clipboard.writeText(e),s(l,!0),setTimeout(()=>{s(l,!1)},2e3))}catch{}}var d=Pn();M(d,e=>({class:e,...o}),[()=>Z(`terminal relative`,r.class)]);var f=y(d),m=c(y(f),6),g=y(m,!0);D(m),D(f);var _=c(f,2),v=y(_);B(v,()=>r.children);var b=c(v,2),S=e=>{var n=Nn();let r;var i=y(n),a=e=>{Me(e,{size:14})},o=e=>{Re(e,{size:14})};h(i,e=>{p(l)?e(a):e(o,-1)}),D(n),t(()=>r=O(n,1,`copy-btn`,null,r,{copied:p(l)})),ne(`click`,n,function(...e){(p(l)?void 0:u)?.apply(this,e)}),V(e,n)};h(b,e=>{a()&&e(S)}),D(_),D(d),t(()=>n(g,i())),V(e,d),L()}e([`click`]);var In=r(`
      cargo install cora-cli
      cora auth login
      cora review --staged
      `,1),Ln=r(`
      Open source · BYOK · Zero config

      AI code review in your terminal

      cora catches bugs, security issues, and code smells before they land in your PR. + Bring your own API key. Your code never leaves your machine.

      Local-first 5 LLM providers CI/CD ready
      `);function Rn(e){var t=Ln(),n=c(y(t),6),r=c(y(n),6),i=y(r);Ae(c(y(i)),{class:`w-4 h-4 transition-transform group-hover:translate-x-1`}),D(i),z(2),D(r);var a=c(r,2);Fn(y(a),{title:`install`,children:(e,t)=>{var n=In();z(4),V(e,n)},$$slots:{default:!0}}),D(a);var o=c(a,2),s=y(o);it(y(s),{class:`w-3.5 h-3.5`}),z(),D(s);var l=c(s,2);ut(y(l),{class:`w-3.5 h-3.5`}),z(),D(l);var u=c(l,2);Be(y(u),{class:`w-3.5 h-3.5`}),z(),D(u),D(o),D(n),D(t),V(e,t)}var zn=r(`

      Trusted by developers who ship fast

      5
      AI Providers
      < 3s
      Review Time
      Zero
      Config Required
      `);function Bn(e){V(e,zn())}var Vn=r(`
      `),Hn=r(``),Un=r(` `,1),Wn=r(`

      See it in action

      Run cora against staged changes. Results in seconds, not minutes.

      `);function Gn(e,r){j(r,!0);let a=x(I([])),o=x(!1),l=x(!1),u=null,d=[{text:`$ cora review --staged`,color:`var(--muted-foreground)`},{text:``,color:``},{text:`Analyzing 3 files...`,color:`var(--muted-foreground)`},{text:`✓ src/auth/login.ts — 2 issues found`,color:`var(--success)`},{text:` ⚠ Line 42: Potential SQL injection`,color:`var(--warning)`},{text:` ⚠ Line 87: Hardcoded secret`,color:`var(--warning)`},{text:`✓ src/utils/parser.ts — clean`,color:`var(--muted-foreground)`},{text:`✓ src/api/routes.ts — 1 issue found`,color:`var(--success)`},{text:` ✗ Line 23: Missing error handling`,color:`var(--destructive)`},{text:``,color:``},{text:`3 issues found in 3 files`,color:`var(--foreground)`}],f=x(void 0);v(()=>{if(!p(f))return;let e=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting&&!p(l)){s(l,!0);let e=0;u=setInterval(()=>{e{e.disconnect(),u&&clearInterval(u)}});var m=Wn(),g=c(y(m),4);Fn(y(g),{title:`cora \\u2014 review`,children:(e,r)=>{var s=Un(),l=i(s);E(l,17,()=>p(a),le,(e,r,i)=>{var a=Vn(),o=y(a,!0);D(a),t(()=>{te(a,`color: ${(d[i]?.color||`var(--foreground)`)??``};`),n(o,p(r))}),V(e,a)});var u=c(l,2),f=e=>{V(e,Hn())};h(u,e=>{p(o)&&e(f)}),V(e,s)},$$slots:{default:!0}}),D(g),D(m),ee(m,e=>s(f,e),()=>p(f)),V(e,m),L()}var Kn=r(`

      `);function qn(e,r){j(r,!0);let i=A(r,`delayMs`,3,0);var a=Kn();let o;var s=y(a),l=y(s,!0);D(s);var u=c(s,2);ce(y(u),`size`,24),D(u);var d=c(u,2),f=y(d,!0);D(d);var p=c(d,2),m=y(p,!0);D(p),D(a),t(e=>{O(a,1,e),o=te(a,``,o,{"transition-delay":i()?`${i()}ms`:void 0}),n(l,r.number),n(f,r.title),n(m,r.description)},[()=>F(Z(`glass-card flex-1 text-center scroll-reveal`,r.class))]),V(e,a),L()}var Jn=r(`

      How it works

      Three steps from code to confidence.

      `);function Yn(e){var t=Jn(),n=c(y(t),4),r=y(n);qn(r,{number:`01`,get icon(){return Ae},title:`Write code`,description:`Push your changes as normal. cora only sees your diff.`});var i=c(r,4);qn(i,{number:`02`,get icon(){return Xe},title:`Review with AI`,description:`cora analyzes your diff with the LLM of your choice.`,delayMs:100}),qn(c(i,4),{number:`03`,get icon(){return Ie},title:`Ship with confidence`,description:`Merge clean, production-ready code. Every time.`,delayMs:200}),D(n),D(t),V(e,t)}var Xn=r(`

      `);function Q(e,r){j(r,!0);let i=A(r,`delayMs`,3,0);var a=Xn();let o;var s=y(a);ce(y(s),`size`,24),D(s);var l=c(s,2),u=y(l,!0);D(l);var d=c(l,2),f=y(d,!0);D(d);var p=c(d,2);ue(p,()=>r.description,!0),D(p),D(a),t(e=>{O(a,1,e),o=te(a,``,o,{"transition-delay":i()?`${i()}ms`:void 0}),n(u,r.title),n(f,r.accent)},[()=>F(Z(`glass-card scroll-reveal`,r.class))]),V(e,a),L()}var Zn=r(`

      Built for developers who value control

      Everything you need, nothing you don't.

      `);function Qn(e){var t=Zn(),n=c(y(t),4),r=y(n);Q(r,{get icon(){return et},title:`AI Code Review`,accent:`Diff, branch, or full scan`,description:`Three review modes: staged diff, branch comparison, or full project scan. LLM-powered analysis catches bugs, security issues, and style violations.`});var i=c(r,2);Q(i,{get icon(){return Ke},title:`Bring Your Own Key`,accent:`No subscriptions, no lock-in`,description:`Uses YOUR OpenAI, Anthropic, Groq, Ollama, or Z.AI API key. No data stored on our servers. You control the model, you control the cost.`,delayMs:100});var a=c(i,2);Q(a,{get icon(){return We},title:`Pre-commit Hooks`,accent:`Review before you push`,description:`Install once. Every commit gets reviewed automatically. Block bad code from entering your branch before it ships.`,delayMs:200});var o=c(a,2);Q(o,{get icon(){return Je},title:`Incremental Scan`,accent:`Only scan what changed`,description:`SHA256 content hash cache. First scan indexes your codebase. Subsequent scans only review new or modified files.`,delayMs:300});var s=c(o,2);Q(s,{get icon(){return nt},title:`SARIF Output`,accent:`GitHub Code Scanning`,description:`Upload review findings directly to GitHub's Security tab. Track issues across PRs. Works with any CI/CD pipeline.`,delayMs:400});var l=c(s,2);Q(l,{get icon(){return Qe},title:`Fully Private`,accent:`Your code stays yours`,description:`Runs entirely on your machine. No cloud, no telemetry, no data leaving your network. Perfect for Gitea and air-gapped environments.`,delayMs:500});var u=c(l,2);Q(u,{get icon(){return Xe},title:`Deterministic Reviews`,accent:`Same diff, same issues`,description:`Temperature defaults to 0. Identical diffs always produce identical findings — perfect for CI reproducibility.`,delayMs:600});var d=c(u,2);Q(d,{get icon(){return ct},title:`Smart Caching`,accent:`Never review the same diff twice`,description:`Reviews are cached by diff hash in ~/.cache/cora/reviews/. Re-reviewing an unchanged diff returns cached results instantly. Use --no-cache to bypass.`,delayMs:700}),Q(c(d,2),{get icon(){return He},title:`Custom Prompts & Anti-Hallucination`,accent:`Control the review, trust the output`,description:`Override system prompts for review and scan. File path injection and post-parse filtering ensure the LLM only reports issues that exist in your actual diff.`,delayMs:800}),D(n),D(t),V(e,t)}var $n=r(``),er=r(` `),tr=r(``),nr=r(``),rr=r(``),ir=r(` `),ar=r(` `),or=r(` `),sr=r(``),cr=r(``),lr=r(``),ur=r(`
      `),dr=r(`
      cora
      `),fr=r(`

      Why developers choose cora

      Compared to popular code review tools.

      `);function pr(e,r){j(r,!0);let i=x(!1),a;ae(()=>{let e=new IntersectionObserver(([t])=>{t.isIntersecting&&(s(i,!0),e.disconnect())},{threshold:.15});return a&&e.observe(a),()=>e.disconnect()});let o=[{name:`BYOK`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:null},{name:`Self-hosted`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!0},{name:`Gitea / Forgejo`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!0},{name:`CLI`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!1},{name:`Pre-commit hooks`,cora:!0,coderabbit:!1,copilot:!1,sonarqube:!1},{name:`SARIF output`,cora:!0,coderabbit:!0,copilot:!0,sonarqube:!0},{name:`Cost`,cora:`Free + API`,coderabbit:`$12–39/mo`,copilot:`$10–39/mo`,sonarqube:`Free / $150+`},{name:`License`,cora:`MIT`,coderabbit:`Apache 2.0`,copilot:`Proprietary`,sonarqube:`LGPL`}],l=[{key:`coderabbit`,label:`CodeRabbit`},{key:`copilot`,label:`Copilot`},{key:`sonarqube`,label:`SonarQube`}];function u(e){return e===!0?`check`:e===!1?`cross`:e===null?`dash`:`text`}var d=fr(),f=c(y(d),4),m=y(f),g=y(m),_=c(y(g));E(_,21,()=>o,le,(e,r,a)=>{var o=ar();let s;te(o,`transition-delay: ${a*60}ms`);var d=y(o),f=y(d,!0);D(d);var m=c(d),g=y(m),_=e=>{V(e,$n())},v=b(()=>u(p(r).cora)===`check`),x=e=>{var i=er(),a=y(i,!0);D(i),t(()=>n(a,p(r).cora)),V(e,i)};h(g,e=>{p(v)?e(_):e(x,-1)}),D(m);var S=c(m),C=y(S),w=e=>{V(e,tr())},T=b(()=>u(p(r)[l[0].key])===`check`),E=e=>{V(e,nr())},ee=b(()=>u(p(r)[l[0].key])===`cross`),k=e=>{V(e,rr())},A=b(()=>u(p(r)[l[0].key])===`dash`),j=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[0].key])),V(e,i)};h(C,e=>{p(T)?e(w):p(ee)?e(E,1):p(A)?e(k,2):e(j,-1)}),D(S);var ne=c(S),re=y(ne),M=e=>{V(e,tr())},N=b(()=>u(p(r)[l[1].key])===`check`),ie=e=>{V(e,nr())},ae=b(()=>u(p(r)[l[1].key])===`cross`),oe=e=>{V(e,rr())},P=b(()=>u(p(r)[l[1].key])===`dash`),F=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[1].key])),V(e,i)};h(re,e=>{p(N)?e(M):p(ae)?e(ie,1):p(P)?e(oe,2):e(F,-1)}),D(ne);var I=c(ne),L=y(I),R=e=>{V(e,tr())},z=b(()=>u(p(r)[l[2].key])===`check`),se=e=>{V(e,nr())},ce=b(()=>u(p(r)[l[2].key])===`cross`),B=e=>{V(e,rr())},le=b(()=>u(p(r)[l[2].key])===`dash`),ue=e=>{var i=ir(),a=y(i,!0);D(i),t(()=>n(a,p(r)[l[2].key])),V(e,i)};h(L,e=>{p(z)?e(R):p(ce)?e(se,1):p(le)?e(B,2):e(ue,-1)}),D(I),D(o),t(()=>{s=O(o,1,`compare-row svelte-14kdxof`,null,s,{revealed:p(i)}),n(f,p(r).name)}),V(e,o)}),D(_),D(g),D(m),D(f);var v=c(f,2);E(v,21,()=>o,le,(e,r,a)=>{var o=dr();let s;te(o,`transition-delay: ${a*60}ms`);var d=y(o),f=y(d),m=y(f,!0);D(f),D(d);var g=c(d,2),_=y(g),v=c(y(_),2),x=e=>{V(e,$n())},S=b(()=>u(p(r).cora)===`check`),C=e=>{var i=or(),a=y(i,!0);D(i),t(()=>n(a,p(r).cora)),V(e,i)};h(v,e=>{p(S)?e(x):e(C,-1)}),D(_),E(c(_,2),17,()=>l,le,(e,i)=>{var a=ur(),o=y(a),s=y(o,!0);D(o);var l=c(o,2),d=e=>{V(e,sr())},f=b(()=>u(p(r)[p(i).key])===`check`),m=e=>{V(e,cr())},g=b(()=>u(p(r)[p(i).key])===`cross`),_=e=>{V(e,lr())},v=b(()=>u(p(r)[p(i).key])===`dash`),x=e=>{var a=ir(),o=y(a,!0);D(a),t(()=>n(o,p(r)[p(i).key])),V(e,a)};h(l,e=>{p(f)?e(d):p(g)?e(m,1):p(v)?e(_,2):e(x,-1)}),D(a),t(()=>n(s,p(i).label)),V(e,a)}),D(g),D(o),t(()=>{s=O(o,1,`compare-card svelte-14kdxof`,null,s,{revealed:p(i)}),n(m,p(r).name)}),V(e,o)}),D(v),D(d),ee(d,e=>a=e,()=>a),V(e,d),L()}function mr(e){return typeof e==`function`}function hr(e){return typeof e==`object`&&!!e}var gr=[`string`,`number`,`bigint`,`boolean`];function _r(e){return e==null||gr.includes(typeof e)?!0:Array.isArray(e)?e.every(e=>_r(e)):typeof e==`object`?Object.getPrototypeOf(e)===Object.prototype:!1}var vr=Symbol(`box`),yr=Symbol(`is-writable`);function $(e,t){let n=b(e);return t?{[vr]:!0,[yr]:!0,get current(){return p(n)},set current(e){t(e)}}:{[vr]:!0,get current(){return e()}}}function br(e){return hr(e)&&vr in e}function xr(e){return br(e)&&yr in e}function Sr(e){return br(e)?e:mr(e)?$(e):Tr(e)}function Cr(e){return Object.entries(e).reduce((e,[t,n])=>br(n)?(xr(n)?Object.defineProperty(e,t,{get(){return n.current},set(e){n.current=e}}):Object.defineProperty(e,t,{get(){return n.current}}),e):Object.assign(e,{[t]:n}),{})}function wr(e){return xr(e)?{[vr]:!0,get current(){return e.current}}:e}function Tr(e){let t=x(I(e));return{[vr]:!0,[yr]:!0,get current(){return p(t)},set current(e){s(t,e,!0)}}}function Er(e){let t=x(I(e));return{[vr]:!0,[yr]:!0,get current(){return p(t)},set current(e){s(t,e,!0)}}}Er.from=Sr,Er.with=$,Er.flatten=Cr,Er.readonly=wr,Er.isBox=br,Er.isWritableBox=xr;function Dr(...e){return function(t){for(let n of e)if(n){if(t.defaultPrevented)return;typeof n==`function`?n.call(this,t):n.current?.call(this,t)}}}var Or=/\d/,kr=[`-`,`_`,`/`,`.`];function Ar(e=``){if(!Or.test(e))return e!==e.toLowerCase()}function jr(e){let t=[],n=``,r,i;for(let a of e){let e=kr.includes(a);if(e===!0){t.push(n),n=``,r=void 0;continue}let o=Ar(a);if(i===!1){if(r===!1&&o===!0){t.push(n),n=a,r=o;continue}if(r===!0&&o===!1&&n.length>1){let e=n.at(-1);t.push(n.slice(0,Math.max(0,n.length-1))),n=e+a,r=o;continue}}n+=a,r=o,i=e}return t.push(n),t}function Mr(e){return e?jr(e).map(e=>Pr(e)).join(``):``}function Nr(e){return Fr(Mr(e||``))}function Pr(e){return e?e[0].toUpperCase()+e.slice(1):``}function Fr(e){return e?e[0].toLowerCase()+e.slice(1):``}function Ir(e){if(!e)return{};let t={};function n(e,n){if(e.startsWith(`-moz-`)||e.startsWith(`-webkit-`)||e.startsWith(`-ms-`)||e.startsWith(`-o-`)){t[Mr(e)]=n;return}if(e.startsWith(`--`)){t[e]=n;return}t[Nr(e)]=n}return Oe(e,n),t}function Lr(...e){return(...t)=>{for(let n of e)typeof n==`function`&&n(...t)}}function Rr(e,t){let n=RegExp(e,`g`);return e=>{if(typeof e!=`string`)throw TypeError(`expected an argument of type string, but got ${typeof e}`);return e.match(n)?e.replace(n,t):e}}var zr=Rr(/[A-Z]/,e=>`-${e.toLowerCase()}`);function Br(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`expected an argument of type object, but got ${typeof e}`);return Object.keys(e).map(t=>`${zr(t)}: ${e[t]};`).join(` +`)}function Vr(e={}){return Br(e).replace(` +`,` `)}var Hr=new Set(`onabort.onanimationcancel.onanimationend.onanimationiteration.onanimationstart.onauxclick.onbeforeinput.onbeforetoggle.onblur.oncancel.oncanplay.oncanplaythrough.onchange.onclick.onclose.oncompositionend.oncompositionstart.oncompositionupdate.oncontextlost.oncontextmenu.oncontextrestored.oncopy.oncuechange.oncut.ondblclick.ondrag.ondragend.ondragenter.ondragleave.ondragover.ondragstart.ondrop.ondurationchange.onemptied.onended.onerror.onfocus.onfocusin.onfocusout.onformdata.ongotpointercapture.oninput.oninvalid.onkeydown.onkeypress.onkeyup.onload.onloadeddata.onloadedmetadata.onloadstart.onlostpointercapture.onmousedown.onmouseenter.onmouseleave.onmousemove.onmouseout.onmouseover.onmouseup.onpaste.onpause.onplay.onplaying.onpointercancel.onpointerdown.onpointerenter.onpointerleave.onpointermove.onpointerout.onpointerover.onpointerup.onprogress.onratechange.onreset.onresize.onscroll.onscrollend.onsecuritypolicyviolation.onseeked.onseeking.onselect.onselectionchange.onselectstart.onslotchange.onstalled.onsubmit.onsuspend.ontimeupdate.ontoggle.ontouchcancel.ontouchend.ontouchmove.ontouchstart.ontransitioncancel.ontransitionend.ontransitionrun.ontransitionstart.onvolumechange.onwaiting.onwebkitanimationend.onwebkitanimationiteration.onwebkitanimationstart.onwebkittransitionend.onwheel`.split(`.`));function Ur(e){return Hr.has(e)}function Wr(...e){let t={...e[0]};for(let n=1;n{let n=u(t,`focusin`,e),r=u(t,`focusout`,e);return()=>{n(),r()}}))}get current(){return this.#t?.(),this.#e?Kr(this.#e):null}};var qr=class{#e;#t;constructor(e){this.#e=e,this.#t=Symbol(e)}get key(){return this.#t}exists(){return oe(this.#t)}get(){let e=se(this.#t);if(e===void 0)throw Error(`Context "${this.#e}" not found`);return e}getOr(e){let t=se(this.#t);return t===void 0?e:t}set(e){return T(this.#t,e)}};function Jr(e,t){switch(e){case`post`:v(t);break;case`pre`:a(t);break}}function Yr(e,t,n,r={}){let{lazy:i=!1}=r,a=!i,o=Array.isArray(e)?[]:void 0;Jr(t,()=>{let t=Array.isArray(e)?e.map(e=>e()):e();if(!a){a=!0,o=t;return}let r=l(()=>n(t,o));return o=t,r})}function Xr(e,t,n){let r=de(()=>{let i=!1;Yr(e,t,(e,t)=>{if(i){r();return}let a=n(e,t);return i=!0,a},{lazy:!0})});v(()=>r)}function Zr(e,t,n){Yr(e,`post`,t,n)}function Qr(e,t,n){Yr(e,`pre`,t,n)}Zr.pre=Qr;function $r(e,t){Xr(e,`post`,t)}function ei(e,t){Xr(e,`pre`,t)}$r.pre=ei;function ti(e,t){let n,r=null;return(...i)=>new Promise(a=>{r&&r(void 0),r=a,clearTimeout(n),n=setTimeout(async()=>{let t=await e(...i);r&&=(r(t),null)},t)})}function ni(e,t){let n=0,r=null;return(...i)=>{let a=Date.now();return n&&a-n{p(m).forEach(e=>e()),s(m,[],!0)},g=e=>{s(m,[...p(m),e],!0)},_=async(e,n,r=!1)=>{try{s(d,!0),s(f,void 0),h();let i=new AbortController;g(()=>i.abort());let a=await t(e,n,{data:p(u),refetching:r,onCleanup:g,signal:i.signal});return s(u,a,!0),a}catch(e){e instanceof DOMException&&e.name===`AbortError`||s(f,e,!0);return}finally{s(d,!1)}},v=c?ti(_,c):l?ni(_,l):_,y=Array.isArray(e)?e:[e],b;return r((t,n)=>{a&&b||(b=t,v(Array.isArray(e)?t:t[0],Array.isArray(e)?n:n?.[0]))},{lazy:i}),{get current(){return p(u)},get loading(){return p(d)},get error(){return p(f)},mutate:e=>{s(u,e,!0)},refetch:t=>{let n=y.map(e=>e());return v(Array.isArray(e)?n:n[0],Array.isArray(e)?n:n[0],t??!0)}}}function ii(e,t,n){return ri(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];Zr(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}function ai(e,t,n){return ri(e,t,n,(t,n)=>{let r=Array.isArray(e)?e:[e];Zr.pre(()=>r.map(e=>e()),(e,n)=>{t(e,n??[])},n)})}ii.pre=ai;function oi(e){v(()=>()=>{e()})}function si(e){o().then(e)}function ci(e,t){return{[d()]:n=>br(e)?(e.current=n,l(()=>t?.(n)),()=>{`isConnected`in n&&n.isConnected||(e.current=null,t?.(null))}):(e(n),l(()=>t?.(n)),()=>{`isConnected`in n&&n.isConnected||(e(null),t?.(null))})}}function li(e){return e?`true`:`false`}function ui(e){return e?``:void 0}function di(e){return e?`open`:`closed`}function fi(e){return e===`starting`?{"data-starting-style":``}:e===`ending`?{"data-ending-style":``}:{}}var pi=class{#e;#t;attrs;constructor(e){this.#e=e.getVariant?e.getVariant():null,this.#t=this.#e?`data-${this.#e}-`:`data-${e.component}-`,this.getAttr=this.getAttr.bind(this),this.selector=this.selector.bind(this),this.attrs=Object.fromEntries(e.parts.map(e=>[e,this.getAttr(e)]))}getAttr(e,t){return t?`data-${t}-${e}`:`${this.#t}${e}`}selector(e,t){return`[${this.getAttr(e,t)}]`}};function mi(e){let t=new pi(e);return{...t.attrs,selector:t.selector,getAttr:t.getAttr}}var hi=`ArrowDown`,gi=`ArrowLeft`,_i=`ArrowRight`,vi=`ArrowUp`,yi=`Home`,bi=`PageDown`,xi=`PageUp`;function Si(e){return window.getComputedStyle(e).getPropertyValue(`direction`)}var Ci=[hi,xi,yi],wi=[vi,bi,`End`];[...Ci,...wi];function Ti(e=`ltr`,t=`horizontal`){return{horizontal:e===`rtl`?gi:_i,vertical:hi}[t]}function Ei(e=`ltr`,t=`horizontal`){return{horizontal:e===`rtl`?_i:gi,vertical:vi}[t]}function Di(e=`ltr`,t=`horizontal`){return[`ltr`,`rtl`].includes(e)||(e=`ltr`),[`horizontal`,`vertical`].includes(t)||(t=`horizontal`),{nextKey:Ti(e,t),prevKey:Ei(e,t)}}var Oi=typeof document<`u`;ki();function ki(){return Oi&&window?.navigator?.userAgent&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||window?.navigator?.maxTouchPoints>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function Ai(e){return e instanceof HTMLElement}var ji=class{#e;#t=Er(null);constructor(e){this.#e=e}getCandidateNodes(){return this.#e.rootNode.current?this.#e.candidateSelector?Array.from(this.#e.rootNode.current.querySelectorAll(this.#e.candidateSelector)):this.#e.candidateAttr?Array.from(this.#e.rootNode.current.querySelectorAll(`[${this.#e.candidateAttr}]:not([data-disabled])`)):[]:[]}focusFirstCandidate(){let e=this.getCandidateNodes();e.length&&e[0]?.focus()}handleKeydown(e,t,n=!1){let r=this.#e.rootNode.current;if(!r||!e)return;let i=this.getCandidateNodes();if(!i.length)return;let a=i.indexOf(e),{nextKey:o,prevKey:s}=Di(Si(r),this.#e.orientation.current),c=this.#e.loop.current,l={[o]:a+1,[s]:a-1,[yi]:0,End:i.length-1};if(n){let e=o===`ArrowDown`?_i:hi,t=s===`ArrowUp`?gi:vi;l[e]=a+1,l[t]=a-1}let u=l[t.key];if(u===void 0)return;t.preventDefault(),u<0&&c?u=i.length-1:u===i.length&&c&&(u=0);let d=i[u];if(d)return d.focus(),this.#t.current=d.id,this.#e.onCandidateFocus?.(d),d}getTabIndex(e){let t=this.getCandidateNodes(),n=this.#t.current!==null;return e&&!n&&t[0]===e?(this.#t.current=e.id,0):e?.id===this.#t.current?0:-1}setCurrentTabStopId(e){this.#t.current=e}focusCurrentTabStop(){let e=this.#t.current;if(!e)return;let t=this.#e.rootNode.current?.querySelector(`#${e}`);!t||!Ai(t)||t.focus()}},Mi=class{#e;#t=null;#n=null;#r=0;constructor(e){this.#e=e,oi(()=>this.#i())}#i(){this.#t!==null&&(window.cancelAnimationFrame(this.#t),this.#t=null),this.#n?.disconnect(),this.#n=null,this.#r++}run(e){this.#i();let t=this.#e.ref.current;if(!t)return;if(typeof t.getAnimations!=`function`){this.#a(e);return}let n=this.#r,r=()=>{n===this.#r&&this.#a(e)},i=()=>{if(n!==this.#r)return;let e=t.getAnimations();if(e.length===0){r();return}Promise.all(e.map(e=>e.finished)).then(()=>{r()}).catch(()=>{if(n===this.#r){if(t.getAnimations().some(e=>e.pending||e.playState!==`finished`)){i();return}r()}})},a=()=>{this.#t=window.requestAnimationFrame(()=>{this.#t=null,i()})};if(!this.#e.afterTick.current){a();return}this.#t=window.requestAnimationFrame(()=>{this.#t=null;let e=`data-starting-style`;if(!t.hasAttribute(e)){a();return}this.#n=new MutationObserver(()=>{n===this.#r&&(t.hasAttribute(e)||(this.#n?.disconnect(),this.#n=null,a()))}),this.#n.observe(t,{attributes:!0,attributeFilter:[e]})})}#a(e){let t=()=>{e()};this.#e.afterTick?si(t):t()}},Ni=class{#e;#t;#n;#r=x(!1);#i=x(void 0);#a=!1;#o=null;constructor(e){this.#e=e,s(this.#r,e.open.current,!0),this.#t=e.enabled??!0,this.#n=new Mi({ref:this.#e.ref,afterTick:this.#e.open}),oi(()=>this.#s()),Zr(()=>this.#e.open.current,e=>{if(!this.#a){this.#a=!0;return}if(this.#s(),!e&&this.#e.shouldSkipExitAnimation?.()){s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.();return}if(e&&s(this.#r,!0),s(this.#i,e?`starting`:`ending`,!0),e&&(this.#o=window.requestAnimationFrame(()=>{this.#o=null,this.#e.open.current&&s(this.#i,void 0)})),!this.#t){e||s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.();return}this.#n.run(()=>{e===this.#e.open.current&&(this.#e.open.current||s(this.#r,!1),s(this.#i,void 0),this.#e.onComplete?.())})})}get shouldRender(){return p(this.#r)}get transitionStatus(){return p(this.#i)}#s(){this.#o!==null&&(window.cancelAnimationFrame(this.#o),this.#o=null)}},Pi=mi({component:`accordion`,parts:[`root`,`trigger`,`content`,`item`,`header`]}),Fi=new qr(`Accordion.Root`),Ii=new qr(`Accordion.Item`),Li=class{opts;rovingFocusGroup;attachment;constructor(e){this.opts=e,this.rovingFocusGroup=new ji({rootNode:this.opts.ref,candidateAttr:Pi.trigger,loop:this.opts.loop,orientation:this.opts.orientation}),this.attachment=ci(this.opts.ref)}#e=b(()=>({id:this.opts.id.current,"data-orientation":this.opts.orientation.current,"data-disabled":ui(this.opts.disabled.current),[Pi.root]:``,...this.attachment}));get props(){return p(this.#e)}set props(e){s(this.#e,e)}},Ri=class extends Li{opts;isMulti=!1;constructor(e){super(e),this.opts=e,this.includesItem=this.includesItem.bind(this),this.toggleItem=this.toggleItem.bind(this)}includesItem(e){return this.opts.value.current===e}toggleItem(e){this.opts.value.current=this.includesItem(e)?``:e}},zi=class extends Li{#e;isMulti=!0;constructor(e){super(e),this.#e=e.value,this.includesItem=this.includesItem.bind(this),this.toggleItem=this.toggleItem.bind(this)}includesItem(e){return this.#e.current.includes(e)}toggleItem(e){this.#e.current=this.includesItem(e)?this.#e.current.filter(t=>t!==e):[...this.#e.current,e]}},Bi=class{static create(e){let{type:t,...n}=e,r=t===`single`?new Ri(n):new zi(n);return Fi.set(r)}},Vi=class e{static create(t){return Ii.set(new e({...t,rootState:Fi.get()}))}opts;root;#e=b(()=>this.root.includesItem(this.opts.value.current));get isActive(){return p(this.#e)}set isActive(e){s(this.#e,e)}#t=b(()=>this.opts.disabled.current||this.root.opts.disabled.current);get isDisabled(){return p(this.#t)}set isDisabled(e){s(this.#t,e)}attachment;#n=x(null);get contentNode(){return p(this.#n)}set contentNode(e){s(this.#n,e,!0)}contentPresence;constructor(e){this.opts=e,this.root=e.rootState,this.updateValue=this.updateValue.bind(this),this.attachment=ci(this.opts.ref),this.contentPresence=new Ni({ref:$(()=>this.contentNode),open:$(()=>this.isActive)})}updateValue(){this.root.toggleItem(this.opts.value.current)}#r=b(()=>({id:this.opts.id.current,"data-state":di(this.isActive),"data-disabled":ui(this.isDisabled),"data-orientation":this.root.opts.orientation.current,[Pi.item]:``,...this.attachment}));get props(){return p(this.#r)}set props(e){s(this.#r,e)}},Hi=class e{opts;itemState;#e;#t=b(()=>this.opts.disabled.current||this.itemState.opts.disabled.current||this.#e.opts.disabled.current);attachment;constructor(e,t){this.opts=e,this.itemState=t,this.#e=t.root,this.onclick=this.onclick.bind(this),this.onkeydown=this.onkeydown.bind(this),this.attachment=ci(this.opts.ref)}static create(t){return new e(t,Ii.get())}onclick(e){if(p(this.#t)||e.button!==0){e.preventDefault();return}this.itemState.updateValue()}onkeydown(e){if(!p(this.#t)){if(e.key===` `||e.key===`Enter`){e.preventDefault(),this.itemState.updateValue();return}this.#e.rovingFocusGroup.handleKeydown(this.opts.ref.current,e)}}#n=b(()=>({id:this.opts.id.current,disabled:p(this.#t),"aria-expanded":li(this.itemState.isActive),"aria-disabled":li(p(this.#t)),"data-disabled":ui(p(this.#t)),"data-state":di(this.itemState.isActive),"data-orientation":this.#e.opts.orientation.current,[Pi.trigger]:``,tabindex:this.opts.tabindex.current,onclick:this.onclick,onkeydown:this.onkeydown,...this.attachment}));get props(){return p(this.#n)}set props(e){s(this.#n,e)}},Ui=class e{opts;item;attachment;#e=void 0;#t=!1;#n=x(I({width:0,height:0}));#r=b(()=>this.opts.hiddenUntilFound.current?this.item.isActive:this.opts.forceMount.current||this.item.isActive);get open(){return p(this.#r)}set open(e){s(this.#r,e)}constructor(e,t){this.opts=e,this.item=t,this.#t=this.item.isActive,this.attachment=ci(this.opts.ref,e=>this.item.contentNode=e),v(()=>{let e=requestAnimationFrame(()=>{this.#t=!1});return()=>cancelAnimationFrame(e)}),Zr.pre([()=>this.opts.ref.current,()=>this.opts.hiddenUntilFound.current],([e,t])=>!e||!t?void 0:u(e,`beforematch`,()=>{this.item.isActive||requestAnimationFrame(()=>{this.item.updateValue()})})),Zr([()=>this.open,()=>this.opts.ref.current],this.#i)}static create(t){return new e(t,Ii.get())}#i=([e,t])=>{t&&si(()=>{let e=this.opts.ref.current;if(!e)return;this.#e??={transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();s(this.#n,{width:t.width,height:t.height},!0),!this.#t&&this.#e&&(e.style.transitionDuration=this.#e.transitionDuration,e.style.animationName=this.#e.animationName)})};get shouldRender(){return this.item.contentPresence.shouldRender}#a=b(()=>({open:this.item.isActive}));get snippetProps(){return p(this.#a)}set snippetProps(e){s(this.#a,e)}#o=b(()=>({id:this.opts.id.current,"data-state":di(this.item.isActive),...fi(this.item.contentPresence.transitionStatus),"data-disabled":ui(this.item.isDisabled),"data-orientation":this.item.root.opts.orientation.current,[Pi.content]:``,style:{"--bits-accordion-content-height":`${p(this.#n).height}px`,"--bits-accordion-content-width":`${p(this.#n).width}px`},hidden:this.opts.hiddenUntilFound.current&&!this.item.isActive?`until-found`:void 0,...this.opts.hiddenUntilFound.current&&!this.shouldRender?{}:{hidden:this.opts.hiddenUntilFound.current?!this.shouldRender:this.opts.forceMount.current?void 0:!this.shouldRender},...this.attachment}));get props(){return p(this.#o)}set props(e){s(this.#o,e)}},Wi=class e{opts;item;attachment;constructor(e,t){this.opts=e,this.item=t,this.attachment=ci(this.opts.ref)}static create(t){return new e(t,Ii.get())}#e=b(()=>({id:this.opts.id.current,role:`heading`,"aria-level":this.opts.level.current,"data-heading-level":this.opts.level.current,"data-state":di(this.item.isActive),"data-orientation":this.item.root.opts.orientation.current,[Pi.header]:``,...this.attachment}));get props(){return p(this.#e)}set props(e){s(this.#e,e)}};function Gi(){}function Ki(e,t){return t===void 0?`bits-${e}`:`bits-${e}-${t}`}var qi=new Set([`$$slots`,`$$events`,`$$legacy`,`disabled`,`children`,`child`,`type`,`value`,`ref`,`id`,`onValueChange`,`loop`,`orientation`]),Ji=r(`
      `);function Yi(e,t){let n=f();j(t,!0);let r=A(t,`disabled`,3,!1),a=A(t,`value`,15),o=A(t,`ref`,15,null),s=A(t,`id`,19,()=>Ki(n)),c=A(t,`onValueChange`,3,Gi),l=A(t,`loop`,3,!0),u=A(t,`orientation`,3,`vertical`),d=w(t,qi);function m(){a()===void 0&&a(t.type===`single`?``:[])}m(),Zr.pre(()=>a(),()=>{m()});let _=Bi.create({type:t.type,value:$(()=>a(),e=>{a(e),c()(e)}),id:$(()=>s()),disabled:$(()=>r()),loop:$(()=>l()),orientation:$(()=>u()),ref:$(()=>o(),e=>o(e))}),v=b(()=>Wr(d,_.props));var x=g(),S=i(x),C=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(v)})),V(e,n)},T=e=>{var n=Ji();M(n,()=>({...p(v)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(S,e=>{t.child?e(C):e(T,-1)}),V(e,x),L()}var Xi=new Set([`$$slots`,`$$events`,`$$legacy`,`id`,`disabled`,`value`,`children`,`child`,`ref`]),Zi=r(`
      `);function Qi(e,t){let n=f();j(t,!0);let r=Ki(n),a=A(t,`id`,3,r),o=A(t,`disabled`,3,!1),s=A(t,`value`,3,r),c=A(t,`ref`,15,null),l=w(t,Xi),u=Vi.create({value:$(()=>s()),disabled:$(()=>o()),id:$(()=>a()),ref:$(()=>c(),e=>c(e))}),d=b(()=>Wr(l,u.props));var m=g(),_=i(m),v=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(d)})),V(e,n)},x=e=>{var n=Zi();M(n,()=>({...p(d)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(_,e=>{t.child?e(v):e(x,-1)}),V(e,m),L()}var $i=new Set([`$$slots`,`$$events`,`$$legacy`,`id`,`level`,`children`,`child`,`ref`]),ea=r(`
      `);function ta(e,t){let n=f();j(t,!0);let r=A(t,`id`,19,()=>Ki(n)),a=A(t,`level`,3,2),o=A(t,`ref`,15,null),s=w(t,$i),c=Wi.create({id:$(()=>r()),level:$(()=>a()),ref:$(()=>o(),e=>o(e))}),l=b(()=>Wr(s,c.props));var u=g(),d=i(u),m=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(l)})),V(e,n)},_=e=>{var n=ea();M(n,()=>({...p(l)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(d,e=>{t.child?e(m):e(_,-1)}),V(e,u),L()}var na=new Set([`$$slots`,`$$events`,`$$legacy`,`disabled`,`ref`,`id`,`tabindex`,`children`,`child`]),ra=r(``);function ia(e,t){let n=f();j(t,!0);let r=A(t,`disabled`,3,!1),a=A(t,`ref`,15,null),o=A(t,`id`,19,()=>Ki(n)),s=A(t,`tabindex`,3,0),c=w(t,na),l=Hi.create({disabled:$(()=>r()),id:$(()=>o()),tabindex:$(()=>s()??0),ref:$(()=>a(),e=>a(e))}),u=b(()=>Wr(c,l.props));var d=g(),m=i(d),_=e=>{var n=g();B(i(n),()=>t.child,()=>({props:p(u)})),V(e,n)},v=e=>{var n=ra();M(n,()=>({type:`button`,...p(u)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(m,e=>{t.child?e(_):e(v,-1)}),V(e,d),L()}var aa=new Set([`$$slots`,`$$events`,`$$legacy`,`child`,`ref`,`id`,`forceMount`,`children`,`hiddenUntilFound`]),oa=r(`
      `);function sa(e,t){let n=f();j(t,!0);let r=A(t,`ref`,15,null),a=A(t,`id`,19,()=>Ki(n)),o=A(t,`forceMount`,3,!1),s=A(t,`hiddenUntilFound`,3,!1),c=w(t,aa),l=Ui.create({forceMount:$(()=>o()),id:$(()=>a()),ref:$(()=>r(),e=>r(e)),hiddenUntilFound:$(()=>s())}),u=b(()=>Wr(c,l.props));var d=g(),m=i(d),_=e=>{var n=g(),r=i(n);{let e=b(()=>({props:p(u),...l.snippetProps}));B(r,()=>t.child,()=>p(e))}V(e,n)},v=e=>{var n=oa();M(n,()=>({...p(u)})),B(y(n),()=>t.children??N),D(n),V(e,n)};h(m,e=>{t.child?e(_):e(v,-1)}),V(e,d),L()}var ca=new Set([`$$slots`,`$$events`,`$$legacy`,`children`]);function la(e,t){let n=w(t,ca);var r=g();C(i(r),()=>Yi,(e,r)=>{r(e,P({class:`w-full`},()=>n,{children:(e,n)=>{var r=g();B(i(r),()=>t.children),V(e,r)},$$slots:{default:!0}}))}),V(e,r)}var ua=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]);function da(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,ua);var o=g(),s=i(o);{let e=b(()=>Z(`border-b border-[var(--border)]`,r()));C(s,()=>Qi,(r,o)=>{o(r,P({get class(){return p(e)}},()=>a,{get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=g();B(i(r),()=>t.children),V(e,r)},$$slots:{default:!0}}))})}V(e,o),L()}var fa=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]),pa=r(` `,1);function ma(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,fa);var o=g();C(i(o),()=>ta,(e,o)=>{o(e,P({class:`flex`},()=>a,{children:(e,a)=>{var o=g(),s=i(o);{let e=b(()=>Z(`flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline text-[var(--foreground)] [&[data-state=open]>svg]:rotate-180`,r()));C(s,()=>ia,(r,a)=>{a(r,{get class(){return p(e)},get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=pa(),a=i(r);B(a,()=>t.children),Pe(c(a,2),{class:`h-4 w-4 shrink-0 transition-transform duration-200`}),V(e,r)},$$slots:{default:!0}})})}V(e,o)},$$slots:{default:!0}}))}),V(e,o),L()}var ha=new Set([`$$slots`,`$$events`,`$$legacy`,`ref`,`class`,`children`]),ga=r(`
      `);function _a(e,t){j(t,!0);let n=A(t,`ref`,15,null),r=A(t,`class`,3,``),a=w(t,ha);var o=g(),s=i(o);{let e=b(()=>Z(`overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down`,r()));C(s,()=>sa,(r,i)=>{i(r,P({get class(){return p(e)}},()=>a,{get ref(){return n()},set ref(e){n(e)},children:(e,n)=>{var r=ga();B(y(r),()=>t.children),D(r),V(e,r)},$$slots:{default:!0}}))})}V(e,o),L()}var va=r(` `,1),ya=r(`

      Frequently asked questions

      Everything you need to know about using cora.

      `);function ba(e){let r=[{question:`What does "BYOK" mean?`,answer:`Bring Your Own Key — you use your own LLM API key (OpenAI, Anthropic, Groq, Ollama, or Z.AI). cora never charges for AI usage. Your API costs depend on your provider.`,value:`byok`},{question:`Does cora send my code to third parties?`,answer:`No. Your code is sent only to the LLM provider you configure. cora itself has no backend, no telemetry, no analytics. Everything runs locally in your terminal.`,value:`privacy`},{question:`Which LLM providers are supported?`,answer:`OpenAI (GPT-4o, etc.), Anthropic (Claude), Groq (Llama), Ollama (local models), and Z.AI (GLM). You can also add custom providers with any OpenAI-compatible API.`,value:`providers`},{question:`How is cora different from GitHub Copilot Code Review?`,answer:`copa is a CLI tool — it runs in your terminal, not in GitHub. You choose your own LLM provider and model. It works with any git workflow, any hosting platform, and any CI/CD pipeline.`,value:`comparison`},{question:`Can I use cora in CI/CD?`,answer:`Yes. cora works in GitHub Actions, GitLab CI, and any CI that supports CLI tools. Use the --staged or --base flags for automated reviews on PRs.`,value:`ci`},{question:`What languages does cora support?`,answer:`cora reviews any text-based code. Since it uses LLMs for analysis, it understands virtually all programming languages. The quality of review depends on the model you choose.`,value:`languages`},{question:`Is cora free?`,answer:`cora is open source and free to use. You only pay for your own LLM API usage through your provider. With Ollama, you can run it completely free with local models.`,value:`pricing`},{question:`How do I configure review rules?`,answer:`Create a .cora.yaml file in your project root. You can configure focus areas, ignore patterns, severity thresholds, and hook settings. See the Configuration docs for details.`,value:`config`}];var a=ya(),o=c(y(a),4);la(y(o),{type:`single`,collapsible:!0,children:(e,a)=>{var o=g();E(i(o),1,()=>r,le,(e,r)=>{da(e,{get value(){return p(r).value},children:(e,a)=>{var o=va(),s=i(o);ma(s,{class:`text-left text-[var(--foreground)] hover:no-underline`,children:(e,i)=>{z();var a=re();t(()=>n(a,p(r).question)),V(e,a)},$$slots:{default:!0}}),_a(c(s,2),{class:`text-[var(--muted-foreground)]`,children:(e,i)=>{z();var a=re();t(()=>n(a,p(r).answer)),V(e,a)},$$slots:{default:!0}}),V(e,o)},$$slots:{default:!0}})}),V(e,o)},$$slots:{default:!0}}),D(o),D(a),V(e,a)}var xa=r(`

      `);function Sa(e,r){j(r,!0);let a=A(r,`descriptionClass`,3,`text-[var(--muted-foreground)]`),o=A(r,`delayMs`,3,0);var s=xa();let l;var u=y(s),d=y(u,!0);D(u);var f=c(u,2),p=y(f),m=y(p,!0);D(p);var _=c(p,2),v=y(_,!0);D(_);var b=c(_,2),x=e=>{var t=g();B(i(t),()=>r.terminalCode),V(e,t)};h(b,e=>{r.terminalCode&&e(x)}),D(f),D(s),t((e,t)=>{O(s,1,e),l=te(s,``,l,{"transition-delay":o()?`${o()}ms`:void 0}),n(d,r.number),n(m,r.title),O(_,1,t),n(v,r.description)},[()=>F(Z(`timeline-step scroll-reveal`,r.class)),()=>F(Z(`mt-1 mb-4 text-sm`,a()))]),V(e,s),L()}var Ca=r(`$ curl -fsSL https://cora.dev/install | sh`,1),wa=r(`$ export OPENAI_API_KEY="sk-..."`,1),Ta=r(`$ CORA_API_KEY=key cora review --staged`,1),Ea=r(`

      Start in 30 seconds

      No account required. No subscription. No cloud.

      Ready to ship better code?

      No account. No subscription. No cloud.

      `);function Da(e){var t=Ea(),n=c(y(t),4),r=y(n);Sa(r,{number:1,title:`Install`,description:`Single binary, no dependencies.`,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=Ca();z(8),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}});var i=c(r,2);Sa(i,{number:2,title:`Set API key`,description:`Use your existing OpenAI or Anthropic key.`,delayMs:100,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=wa();z(6),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}});var a=c(i,2);Sa(a,{number:3,title:`Review`,description:`Review your staged changes.`,delayMs:200,terminalCode:e=>{Fn(e,{children:(e,t)=>{var n=Ta();z(8),V(e,n)},$$slots:{default:!0}})},$$slots:{terminalCode:!0}}),Sa(c(a,2),{number:4,title:`Done`,description:`That's it. No account. No subscription.`,descriptionClass:`text-[var(--success)]`,delayMs:300}),D(n);var o=c(n,2),s=c(y(o),4),l=y(s);Ae(y(l),{size:18}),z(),D(l);var u=c(l,2);ot(y(u),{size:18}),z(),D(u),D(s),D(o),z(2),D(t),V(e,t)}var Oa=r(``),ka=r(`
      `);function Aa(e,t){j(t,!1),ae(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),document.querySelectorAll(`.compare-table tbody tr`).forEach((t,n)=>{t.style.transitionDelay=`${n*60}ms`,e.observe(t)}),document.querySelectorAll(`.timeline-number`).forEach(t=>e.observe(t)),()=>{e.disconnect()}}),R();var n=ka();k(`1uha8ag`,e=>{var t=Oa();m(()=>{_.title=`cora — AI Code Review CLI`}),V(e,t)});var r=y(n);Rn(r,{});var i=c(r,2);Bn(i,{});var a=c(i,2);Gn(a,{});var o=c(a,2);Yn(o,{});var s=c(o,2);Qn(s,{});var l=c(s,2);pr(l,{});var u=c(l,2);ba(u,{}),Da(c(u,2),{}),D(n),V(e,n),L()}export{Aa as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/4.DOawxC2l.js b/website/build/_app/immutable/nodes/4.DOawxC2l.js new file mode 100644 index 0000000..ac4342f --- /dev/null +++ b/website/build/_app/immutable/nodes/4.DOawxC2l.js @@ -0,0 +1 @@ +import{it as e,rt as t,s as n}from"../chunks/Du04-Wio.js";import{t as r}from"../chunks/DyVSz01m.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";function i(i,a){e(a,!1),r(`/docs/getting-started`,{replaceState:!0}),n(),t()}export{i as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/5.CZek6GP7.js b/website/build/_app/immutable/nodes/5.CZek6GP7.js new file mode 100644 index 0000000..f8c2059 --- /dev/null +++ b/website/build/_app/immutable/nodes/5.CZek6GP7.js @@ -0,0 +1,2 @@ +import{B as e,C as t,E as n,K as r,P as i,R as a,S as o,U as s,W as c,b as l,ct as u,h as d,it as f,n as p,rt as m,s as h,st as g,u as _,w as v,x as y,y as b}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var x='# Changelog\n\nAll notable changes to cora-cli are documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n## [0.4.0] - 2026-06-03\n\n### Added\n\n- **Deterministic rule engine** — pre-LLM regex-based rules that always report findings (no LLM dismissal). 12 built-in rules covering security (hardcoded URLs, secrets, TLS disabled, debug prints), SQL injection, TODO/FIXME, `panic!`/`unwrap` in new code, and large functions (#116)\n- **Custom rules via `.cora.yaml`** — define project-specific regex rules with severity, category, exclude patterns, and glob file matching\n- **Unified diff parser** — parse git diff into structured `FileChunk`/`DiffHunk`/`DiffLine` with language detection for 70+ extensions\n- **File bundling engine** — smart grouping by directory and language family with configurable character/file limits. Bundle types: related, config, test, large, standalone. Token budget estimation (~4 chars/token). Defers full parallel review to v0.5 (#115)\n- **Cross-file context chain** — deterministic symbol extraction (imports, function calls, type references) for 5 languages (Rust, Python, JS, Go, Java) with token-budgeted context injection into LLM prompt (#114)\n- **`BundlingConfig`** — `strategy`, `max_chars_per_group`, `max_files_per_group`, `coalesce_by_directory`, `coalesce_by_language` in `.cora.yaml`\n- **`ContextConfig`** — `enabled`, `max_context_tokens`, `follow_depth`, `max_symbols` in `.cora.yaml` review section\n- **Default SARIF upload to GitHub Code Scanning ON** — opt-out with `upload-sarif: false` (#148)\n- **SARIF tool branding** — `CodeCora` driver name (`codecoradev/cora-cli`) in SARIF output (#148)\n\n### Changed\n\n- **Review pipeline** — rules engine runs before LLM call, context chain enriches LLM prompt with cross-file dependencies\n- **LLM failure handling** — deterministic rule findings always visible even when LLM call fails\n\n## [0.3.0] - 2026-06-03\n\n### Added\n\n- **Static analysis context injection** — optional clippy output injected into review prompt to reduce false positives on verified-intentional changes (#140)\n- **`review.static_analysis.auto_clippy`** config — automatically run `cargo clippy` and filter output to changed files\n- **`review.static_analysis.clippy_output_file`** config — read pre-computed clippy output from file\n- **`cora config validate`** subcommand — validate `.cora.yaml` configuration file and report issues (#88)\n- **`CoraError` enum via thiserror** — structured error types for engine layer with 17 variants (#86)\n\n### Changed\n\n- **Engine layer migrated from `anyhow` to `thiserror`** — structured error handling in engine, `anyhow` retained in CLI layer (#86)\n- **All clippy pedantic warnings resolved** — 175 → 0 warnings across entire codebase (#84)\n- **Repo URLs updated** to `codecoradev/cora-cli` org (#137)\n- **CI actions bumped** — `upload-artifact@v7`, Node 24 strict mode (`FORCE_JAVASCRIPT_ACTIONS_TO_NODE24`) (#142)\n\n### Fixed\n\n- **CI Cora Review fails on LLM API errors** — removed `|| true` suppression, added exit code + empty SARIF check (#142)\n- **Match arm merge in `IssueType::from_str`** — clarified documentation (#141)\n\n## [0.2.0] - 2026-06-02\n\n### Added\n\n- **`--progress` flag** — NDJSON progress events to stderr for structured CI/GUI consumers (Termul prerequisite) (#108)\n- **`--max-diff-size` flag** — override `hook.max_diff_size` for large diffs from CLI (#112)\n- **Output footer watermark** — Cora version stamp in terminal, SARIF, and JSON output when issues found (#106)\n- **Security audit CI** — `cargo audit` via `rustsec/audit-check` for dependency CVE scanning (#85)\n\n### Changed\n\n- **Naive .gitignore parser → `ignore` crate** — ripgrep-grade correctness with nested .gitignore, global gitignore, and `.git/info/exclude` support (#80)\n- **Blanket `#![allow(dead_code)]` removed** — targeted cleanup, 27 warnings → 0 (#79)\n\n### Fixed\n\n- **`REQUESTS_CA_BUNDLE` env var support** — custom CA certificates for corporate proxies, additive to built-in root certs (#74)\n- **`tls_built_in_root_certs(false)` security fix** — custom CA bundle now added alongside system roots instead of replacing them (caught by Cora self-review)\n- **`require_git(false)` on WalkBuilder** — gitignore rules applied even outside git repositories (#112)\n- **CI `actions-rs/audit-check` → `rustsec/audit-check`** — replaced archived GitHub Action (#112)\n- **Cora CI diff limit** — `CORA_CONFIG` env var with temp config for 200K char limit in CI action (#112)\n\n## [0.1.8] - 2026-06-02\n\n### Fixed\n\n- **`unwrap()` → `expect()`** in ProgressStyle templates (llm.rs, scanner.rs) — clearer panic messages on template parse failure (#87)\n- **Consolidated duplicate `impl Severity` blocks** into single implementation (#83)\n- **`file_content_hash` returns `Option`** instead of empty string on read failure — prevents infinite rescan loop on unreadable files (#77)\n- **Permission errors logged in scanner** — file walk now logs permission errors at debug level instead of silently skipping (#76)\n- **Auth file permission warning** — warns if `~/.cora/auth.toml` has overly permissive file permissions (Unix only) (#72)\n- **SARIF upload size validation** — validates SARIF file size against GitHub\'s 10MB limit before upload (#82)\n- **Float division for MB display** — SARIF size error now shows accurate fractional MB (was integer division truncating to 0) (#82)\n- **Non-deterministic `DefaultHasher` → `sha2`** — scan cache now uses SHA-256 for deterministic hashing across Rust versions (#81)\n\n### Added\n\n- **`checksums-sha256.txt` in release artifacts** — release workflow generates SHA-256 checksums for all platform binaries (#109)\n\n### Changed\n\n- **Official CodeCora branding assets** — logo, favicon, and OG image updated from ajianaz/cora SaaS repo (#110)\n- **Standalone `cora-review.yml` workflow** — CI action extracted from inline `ci.yml` job to dedicated workflow with concurrency control (#107)\n- **Action v2 hardened** — all third-party actions pinned to commit SHA, checksum verification for binary downloads, env var indirection for inputs, `grep` pipefail fix, empty file guard, Node 24 strict mode compatibility (#107)\n\n## [0.1.7] - 2026-06-01\n\n### Added\n\n- **Diff-hash caching** — review results cached by SHA-256 of diff + model + temperature in `~/.cache/cora/reviews/`. Cache TTL configurable via `llm.cache_ttl` (#100)\n- **`--no-cache` flag** — bypass cache for fresh reviews (#100)\n- **Configurable LLM parameters** — `llm.temperature` (default: 0), `llm.max_tokens` (default: 4096), `llm.timeout` (default: 120s), `llm.cache_ttl` (default: 1440 min) in `.cora.yaml` (#98 #101)\n- **Git ref validation** — rejects refs containing shell metacharacters or path traversal sequences (#73)\n\n### Fixed\n\n- **Temperature default now 0** — eliminates non-deterministic LLM output. Same diff produces identical issues on every run (#98, #97)\n- **HTTP timeout actually works** — per-request timeout via reqwest RequestBuilder (not client-level). Configurable timeout respected (#99)\n- **Connection pooling** — shared reqwest::Client via LazyLock, reused across all requests (#99)\n- **Cache key includes model + temperature** — config changes invalidate cache automatically (#100)\n- **Silent config corruption** — malformed `.cora.yaml` now shows clear error with file path and hint (#78)\n- **Composite action KeyError on API failure** — version resolution retries 3x with 5s delay, falls back to v0.1.6 with warning. Fixed in both `cora-review` and `cora-review-simple` actions (#102)\n\n## [0.1.6] - 2026-06-01\n\n### Added\n\n- **Custom system prompts via config** — `review.system_prompt`, `review.system_prompt_file`, `scan.system_prompt`, `scan.system_prompt_file` fields in `.cora.yaml` (#94)\n- **`response_format` config** — opt-in `json_object` response format for providers that support it, via `review.response_format: json_object` (#92)\n- **File path injection into prompts** — valid diff file paths are injected into the review user prompt to reduce LLM hallucination (#93)\n- **Post-parse file path filtering** — issues referencing non-existent files are filtered out after LLM response parsing (#93)\n- **Enhanced default system prompts** — both review and scan prompts now include explicit anti-hallucination constraints, severity definitions, and format instructions (#95)\n\n### Fixed\n\n- **Path traversal in `system_prompt_file`** — arbitrary file read vulnerability. Now validates file path is within canonicalized project root (#92)\n- **Symlink bypass in path traversal guard** — project root is now canonicalized to match resolved file paths\n\n## [0.1.5] - 2026-06-01\n\n### Fixed\n\n- **Critical: JSON repair corrupts valid unicode escapes** — `is_valid_json_escape()` missing `\'u\'`, causing `\\uXXXX` to be double-escaped. Now properly validates and handles incomplete `\\u` sequences (#89)\n- **Critical: TOML injection in `save_api_key()`** — API key written via `format!` string interpolation. Now uses `toml::Table` serialization (#69)\n- **Retry prompt improvement** — retry on parse failure now includes stricter JSON format instructions (#90)\n- **Temp file race condition** — SARIF upload now uses PID-suffixed temp path instead of fixed filename (#70)\n- **Confusing unused `_cli_api_key` parameter** — removed from `load_config()` signature (#75)\n\n### Security\n\n- `save_api_key()` now uses `toml::Table::insert()` instead of string interpolation (prevents TOML injection)\n- Temp SARIF file path includes process ID (prevents TOCTOU race)\n\n## [0.1.4] - 2026-06-01\n\n### Added\n\n- LLM JSON repair engine (`repair_invalid_escapes`) — auto-fixes invalid escape sequences in LLM output (e.g. `\\s`, `\\d`) before JSON parse\n- Retry mechanism in `review_diff` — if first LLM parse fails, automatically retries once\n- Branding footer on "No issues found" PR comment — consistent with issues-found variant\n\n### Fixed\n\n- **Silent false-negative** — cora JSON parse failure previously posted "No issues found" without actual review (LLM invalid escapes)\n- Hardcoded Infisical `identity-id` in `release.yml` and `deploy-website.yml` — migrated to `secrets.INFISICAL_IDENTITY_ID`\n- Release workflow changelog extraction — `v` prefix mismatch (tag `v0.1.3` vs CHANGELOG `[0.1.3]`) now properly stripped\n- `printf` double-escape in release workflow — `\\\\n` corrected to `\\n`\n- Stale `v0.1.2` binary download filenames in README\n- Clippy `unnecessary_map_or` lint — `.map_or(false, |s| s.success())` replaced with `.is_ok_and(|s| s.success())`\n\n### Changed\n\n- All 3 workflows use `secrets.INFISICAL_IDENTITY_ID` (consistent with `ci.yml` pattern)\n- Release workflow validates semver format before sed injection\n- Branch cleanup — removed 14 stale branches\n\n## [0.1.3] - 2026-06-01\n\n### Added\n\n- `cora config set --global` — write config to `~/.cora/config.yaml` instead of project `.cora.yaml`\n- `cora config set base_url` — set base URL via CLI (previously only in YAML)\n- Global config support (`~/.cora/config.yaml`) with priority chain: CLI flags → env vars → project → global → defaults\n- Auto-migration from old `~/.cora/config.toml` to new YAML + `auth.toml` split\n\n### Changed\n\n- `cora config set` now writes YAML instead of TOML (compatible with config loader)\n- API key storage moved from `~/.cora/config.toml` to `~/.cora/auth.toml` (0600 permissions)\n- YAML serialization uses `skip_serializing_if` — no more `null` values in output\n\n### Fixed\n\n- **Severity comparison inverted** — `Critical` issues no longer silently pass `should_block` check (Ord ordering bug)\n- Hook `mode: block` no longer exits with code 2 when "No issues found" (severity filter mismatch)\n- Consistent severity logic across review, scan, and block mode paths\n\n## [0.1.2] - 2025-05-29\n\n### Added\n\n- `cora init` — create `.cora.yaml` config file with provider/model selection\n- `cora hook install|uninstall` — pre-commit hook management\n- `cora config show|set` — configuration management\n- CI composite action (`cora-review-simple`) for easy GitHub Actions integration\n- Shell completions for bash, zsh, fish, and powershell\n- `cora scan --incremental` with SHA256 content hash cache for fast incremental scanning\n- `cora review --upload` for direct SARIF upload to GitHub Code Scanning\n- `cora review --stream` for real-time review output\n- `cora review --unpushed` for reviewing unpushed commits\n- `cora review --base ` for branch comparison\n- `cora review --diff-file ` for reviewing external diff files\n- `cora providers` command to list available LLM providers\n- `cora auth login` for interactive API key storage\n\n### Fixed\n\n- SARIF schema compliance for GitHub Code Scanning upload\n- Clippy `format_in_format_args` warnings\n- Replaced deprecated `serde_yaml` with `serde_yaml_ng`\n- Normalized release binary naming (`cora-{arch}-{target}-v{version}.tar.gz`)\n\n### Changed\n\n- Replaced deprecated dependencies\n- Removed unused dependencies\n- Bumped minimum Rust version to 1.85\n\n## [0.1.1] - 2025-05-27\n\n### Changed\n\n- Replaced ASCII art banner with eye icon in README\n- Updated README branding to cora-cli\n\n### Fixed\n\n- CI `cargo publish` with `--allow-dirty` for Cargo.lock mismatch on tag checkout\n\n## [0.1.0] - 2025-05-25\n\n### Added\n\n- **AI Code Review** — review staged changes, commit ranges, branch diffs, and full project scans\n- **BYOK** — bring your own API key (OpenAI, Anthropic, Groq, Ollama, Google)\n- **5 LLM Providers** — with auto-detection from installed API keys\n- **Pre-commit Hooks** — `cora hook install` for automatic review on every commit\n- **SARIF Output** — `--format sarif` for GitHub Code Scanning integration\n- **4 Output Formats** — pretty (colored), compact, JSON, SARIF\n- **Project Config** — `.cora.yaml` per-project configuration with provider, focus, rules, ignore, and hook settings\n- **Environment Variables** — `CORA_API_KEY`, `CORA_MODEL`, `CORA_PROVIDER`, `CORA_BASE_URL`, `CORA_CONFIG`, `CORA_FORMAT`\n- **Severity Levels** — `info`, `minor`, `major`, `critical` with configurable thresholds\n- **Focus Areas** — `security`, `performance`, `bugs`, `best_practice`, `maintainability`\n- **Ignore Rules** — file patterns and rule-level exclusions\n- **Cross-platform** — Linux (x86_64, ARM64), macOS (Apple Silicon), Windows (x86_64)\n- **MIT License** — fully open source\n\n[Unreleased]: https://github.com/codecoradev/cora-cli/compare/v0.4.0...develop\n[0.4.0]: https://github.com/codecoradev/cora-cli/compare/v0.3.0...v0.4.0\n[0.3.0]: https://github.com/codecoradev/cora-cli/compare/v0.2.0...v0.3.0\n[0.2.0]: https://github.com/codecoradev/cora-cli/compare/v0.1.8...v0.2.0\n[0.1.8]: https://github.com/codecoradev/cora-cli/compare/v0.1.7...v0.1.8\n[0.1.7]: https://github.com/codecoradev/cora-cli/compare/v0.1.6...v0.1.7\n[0.1.6]: https://github.com/codecoradev/cora-cli/compare/v0.1.5...v0.1.6\n[0.1.5]: https://github.com/codecoradev/cora-cli/compare/v0.1.4...v0.1.5\n[0.1.4]: https://github.com/codecoradev/cora-cli/compare/v0.1.3...v0.1.4\n[0.1.3]: https://github.com/codecoradev/cora-cli/compare/v0.1.2...v0.1.3\n[0.1.2]: https://github.com/codecoradev/cora-cli/compare/v0.1.1...v0.1.2\n[0.1.1]: https://github.com/codecoradev/cora-cli/compare/v0.1.0...v0.1.1\n[0.1.0]: https://github.com/codecoradev/cora-cli/releases/tag/v0.1.0',S=n(``),C=n(`Unreleased`),w=n(` `),T=n(`
    • `),E=n(`

        `),D=n(`

        `),O=n(`

        Changelog

        For the full changelog, see the repository.

        `);function k(n,k){f(k,!1);let A=`https://github.com/codecoradev/cora-cli`;function j(e){let t=[],n=e.split(/^## \[/m);for(let e of n){let n=e.match(/^\[([^\]]+)\]\s*(?:-\s*)?(\d{4}-\d{2}-\d{2})/);if(!n)continue;let r=n[1],i=n[2];if(r===`Unreleased`&&!e.match(/^###\s+\w+/m))continue;let a=[],o=e.split(/^###\s+/m);for(let e of o){let t=e.match(/^(\w[\w\s]*?)(?:\s*)\n([\s\S]*)$/);if(!t)continue;let n=t[1].trim(),r=t[2].split(` +`).map(e=>e.replace(/^-\s*/,``).trim()).filter(Boolean);r.length>0&&a.push({type:n,items:r})}let s;s=r===`Unreleased`?`${A}/compare/v0.1.3...develop`:`${A}/releases/tag/v${r}`,t.push({version:r,date:i,url:s,categories:a})}return t}let M=j(x);p(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),h();var N=O();d(`4kl4db`,e=>{var t=S();a(()=>{s.title=`Changelog — cora docs`}),v(e,t)});var P=r(c(N),2);_(r(c(P)),`href`,`https://github.com/codecoradev/cora-cli/blob/develop/CHANGELOG.md`),g(),u(P),l(r(P,2),1,()=>M,y,(n,a)=>{var s=D(),d=c(s),f=c(d),p=e=>{v(e,C())},m=n=>{var r=w(),o=c(r);u(r),e(()=>{_(r,`href`,i(a).url),t(o,`v${i(a).version??``}`)}),v(n,r)};o(f,e=>{i(a).version===`Unreleased`?e(p):e(m,-1)});var h=r(f,2),g=c(h,!0);u(h),u(d),l(r(d,2),1,()=>i(a).categories,y,(n,a)=>{var o=E(),s=c(o),d=c(s,!0);u(s);var f=r(s,2);l(f,5,()=>i(a).items,y,(e,t)=>{var n=T();b(n,()=>i(t),!0),u(n),v(e,n)}),u(f),u(o),e(()=>t(d,i(a).type)),v(n,o)}),u(s),e(()=>t(g,i(a).date)),v(n,s)}),u(N),v(n,N),m()}export{k as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/6.ChPTFH0w.js b/website/build/_app/immutable/nodes/6.ChPTFH0w.js new file mode 100644 index 0000000..5c69b6a --- /dev/null +++ b/website/build/_app/immutable/nodes/6.ChPTFH0w.js @@ -0,0 +1 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(``),u=e(`

        CLI Reference

        Complete command reference for the cora CLI.

        Global Flags

        FlagDescription
        --config <path>Override config file path (default: .cora.yaml)
        --format <fmt>Output format: pretty, json, compact, sarif
        --no-colorDisable colored output
        --provider <name>Override provider
        --model <name>Override model
        --base-url <url>Override API base URL
        --api-key <key>Override API key
        --verboseEnable debug logging

        Commands

        CommandDescription
        cora initCreate .cora.yaml config file
        cora reviewReview code changes (default: staged files)
        cora review --stagedReview staged git changes explicitly
        cora review --unstagedReview unstaged working changes
        cora review --unpushedReview unpushed commits
        cora review --base <branch>Compare current branch against target
        cora review --commit <ref>Review specific commit or range
        cora review --diff-file <path>Review from a diff file
        cora review --uploadReview and upload SARIF to GitHub Code Scanning
        cora scan <path>Scan files for issues
        cora scan . [--incremental]Scan only changed files
        cora config showShow resolved configuration
        cora config set <key> <value>Set a config value
        cora hook installInstall pre-commit hook
        cora hook uninstallRemove pre-commit hook
        cora auth loginSave API key to ~/.cora/config.toml
        cora auth statusCheck current auth status
        cora auth removeRemove stored API key
        cora providersList detected AI providers
        cora upload-sarif <file>Upload SARIF to GitHub Code Scanning
        cora completion <shell>Generate shell completions (bash/zsh/fish)

        Quick Examples

        # Review staged changes (what's about to be committed)
        $ cora review --staged
        # Compare your feature branch against main
        $ cora review --base main
        # Full project scan with incremental caching
        $ cora scan --incremental
        # Install pre-commit hook
        $ cora hook install
        `);function d(e,d){i(d,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),s();var f=u();r(`45m4o3`,e=>{var r=l();t(()=>{n.title=`CLI Reference — cora docs`}),c(e,r)}),c(e,f),o()}export{d as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/7.BG-S3wet.js b/website/build/_app/immutable/nodes/7.BG-S3wet.js new file mode 100644 index 0000000..d028d83 --- /dev/null +++ b/website/build/_app/immutable/nodes/7.BG-S3wet.js @@ -0,0 +1,52 @@ +import{B as e,C as t,E as n,K as r,R as i,U as a,W as o,b as s,ct as c,f as l,h as u,it as d,n as f,rt as p,s as m,st as h,w as g,x as _}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var v=n(``),y=n(`
        `),b=n(`

        Configuration

        cora uses a layered config system. Later sources override earlier ones.

        Config Resolution Order

        Settings are resolved in this order (highest priority first):

        .cora.yaml Example

        Create this file in your project root. Run cora init to generate it.

        .cora.yaml
        # cora project config
        +provider:
        +  provider: openai
        +  model: gpt-4o
        +  base_url: https://api.openai.com/v1
        +
        +llm:
        +  temperature: 0
        +  max_tokens: 4096
        +  timeout: 120
        +  cache_ttl: 1440
        +
        +review:
        +  system_prompt: "You are a senior code reviewer."
        +  # system_prompt_file: ./review-prompt.md
        +  response_format: json_object
        +
        +focus: security, performance, bugs
        +
        +hook:
        +  mode: warn
        +  min_severity: major
        +  max_diff_size: 51200
        +
        +ignore:
        +  files:
        +    - "vendor/**"
        +    - "*.min.js"

        Environment Variables

        VariableDescription
        CORA_API_KEYAPI key for the active provider
        CORA_PROVIDERActive provider (openai, anthropic, groq, ollama, zai)
        CORA_MODELModel name override
        CORA_BASE_URLCustom API base URL
        CORA_CONFIGPath to config file
        CORA_FORMATOutput format (pretty, json, compact, sarif)
        CORA_NO_COLORDisable colored output
        CORA_NO_CACHESkip diff-hash review cache (same as --no-cache)
        GITHUB_TOKENGitHub token for SARIF upload
        GITHUB_REPOSITORYGitHub repo for SARIF upload
        GITHUB_REFGitHub ref for SARIF upload

        Provider-Specific Env Vars

        Each provider has its own API key variable. cora checks these for auto-detection.

        env vars
        # OpenAI
        +OPENAI_API_KEY=sk-...
        +OPENAI_BASE_URL=https://api.openai.com/v1
        +
        +# Anthropic
        +ANTHROPIC_API_KEY=sk-ant-...
        +
        +# Groq
        +GROQ_API_KEY=gsk_...
        +
        +# Ollama (local, no key needed)
        +OLLAMA_HOST=http://localhost:11434
        +# Optional: OLLAMA_API_KEY if your Ollama instance requires auth
        +OLLAMA_API_KEY=...
        +
        +# Z.AI
        +ZAI_API_KEY=...

        Diff-Hash Caching

        cora caches review results by diff hash in ~/.cache/cora/reviews/. If you re-review the same diff, the cached result is returned instantly.

        Config
        llm.cache_ttl — TTL in minutes (default: 1440 / 24h)
        CLI / Env
        --no-cache or CORA_NO_CACHE=1 to bypass

        Custom System Prompts

        Override the default system prompt for review or scan commands to match your project's coding standards and review criteria.

        .cora.yaml
        review:
        +  system_prompt: "Focus on Rust idioms and error handling."
        +  # Or load from a file:
        +  system_prompt_file: ./prompts/review.md
        +
        +scan:
        +  system_prompt: "Check for OWASP Top 10 vulnerabilities."
        +  system_prompt_file: ./prompts/scan.md

        If both system_prompt and system_prompt_file are set, the file takes precedence.

        Response Format (JSON Mode)

        Opt into structured JSON output from the LLM by setting review.response_format to json_object. This instructs the LLM to return valid JSON, enabling machine-readable parsing and pipeline integration.

        .cora.yaml
        review:
        +  response_format: json_object

        Requires provider support for structured output. Works with OpenAI, Anthropic, and compatible APIs.

        Anti-Hallucination

        cora uses two mechanisms to prevent the LLM from fabricating findings:

        • File path injection — Actual file paths are embedded in the prompt, anchoring the LLM to real files in the diff.
        • Post-parse filtering — After parsing, any reported file paths or line numbers that don't exist in the actual diff are discarded.
        `);function x(n,x){d(x,!1),f(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),m();var S=b();u(`1q9ccmj`,e=>{var t=v();i(()=>{a.title=`Configuration — cora docs`}),g(e,t)});var C=r(o(S),4),w=r(o(C),4);s(w,4,()=>[{num:`1`,label:`CLI flags`,desc:`--provider, --model, --base-url, etc.`,accent:!0},{num:`2`,label:`Environment variables`,desc:`CORA_API_KEY, CORA_PROVIDER, CORA_MODEL, etc.`,accent:!1},{num:`3`,label:`.cora.yaml`,desc:`Project root config file`,accent:!1},{num:`4`,label:`~/.cora/config.yaml`,desc:`Global config (optional)`,accent:!1},{num:`5`,label:`Built-in defaults`,desc:`Sensible defaults for all settings`,accent:!1}],_,(n,i)=>{var a=y();let s;var u=o(a);let d;var f=o(u,!0);c(u);var p=r(u,2),m=o(p),h=o(m,!0);c(m);var _=r(m,2),v=o(_,!0);c(_),c(p),c(a),e(()=>{s=l(a,1,`docs-card`,null,s,{accent:i.accent}),d=l(u,1,`docs-card-number`,null,d,{primary:i.accent,muted:!i.accent}),t(f,i.num),t(h,i.label),t(v,i.desc)}),g(n,a)}),c(w),c(C),h(14),c(S),g(n,S),p()}export{x as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/8.FgjeHYDF.js b/website/build/_app/immutable/nodes/8.FgjeHYDF.js new file mode 100644 index 0000000..26444ea --- /dev/null +++ b/website/build/_app/immutable/nodes/8.FgjeHYDF.js @@ -0,0 +1,18 @@ +import{E as e,K as t,R as n,U as r,W as i,ct as a,h as o,it as s,n as c,rt as l,s as u,st as d,w as f,y as p}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var m=e(``),h=e(`

        Examples

        Practical examples to get you started with cora.

        01 Quick Review

        Review your staged changes before committing.

        # Review staged changes (default)
        $ cora review

        # Or review with explicit flags
        $ cora review --staged

        02 Branch Comparison

        Compare your current branch against main.

        $ cora review --base main

        03 Full Project Scan

        Scan your entire project for issues.

        $ cora scan

        04 Incremental Scan

        Only scan files that changed since the last scan.

        $ cora scan --incremental

        05 Streaming Output

        Stream results as they come in from the LLM.

        $ cora review --staged --stream

        06 GitHub Actions CI

        Add cora to your CI pipeline.

        .github/workflows/cora-review.yml
        name: Code Review
        +
        +on:
        +  pull_request:
        +    branches: [main]
        +
        +jobs:
        +  review:
        +    runs-on: ubuntu-latest
        +    steps:
        +      - uses: actions/checkout@v4
        +      - name: Install cora
        +        run: cargo install cora-cli
        +      - name: Run AI code review
        +        env:
        +          
        +          CORA_PROVIDER: openai
        +        run: cora review --base main --format sarif

        07 Pre-commit Hook

        Install once, then every commit gets reviewed automatically.

        # Install the hook
        $ cora hook install

        # Now just commit normally — cora reviews automatically
        $ git commit -m "fix: handle edge case in parser"
        cora pre-commit hook running...
        No issues found — commit allowed

        08 SARIF Upload

        Generate SARIF output and upload to GitHub Code Scanning.

        # Generate SARIF report and upload
        $ cora review --base main --format sarif > results.sarif && \\\\
          cora upload-sarif results.sarif

        Uploaded 3 findings to GitHub Code Scanning
        `);function g(e,g){s(g,!1),c(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});return document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t)),()=>e.disconnect()}),u();var _=h();o(`14ul9gg`,e=>{var t=m();n(()=>{r.title=`Examples — cora docs`}),f(e,t)});var v=t(i(_),14),y=t(i(v),4),b=t(i(y),2),x=i(b);p(t(i(x),40),()=>'CORA_API_KEY: ${{ secrets.CORA_API_KEY }}'),d(8),a(x),a(b),a(y),a(v),d(4),a(_),f(e,_),l()}export{g as component}; \ No newline at end of file diff --git a/website/build/_app/immutable/nodes/9.9IQ7DCMm.js b/website/build/_app/immutable/nodes/9.9IQ7DCMm.js new file mode 100644 index 0000000..dbfea76 --- /dev/null +++ b/website/build/_app/immutable/nodes/9.9IQ7DCMm.js @@ -0,0 +1,3 @@ +import{E as e,R as t,U as n,h as r,it as i,n as a,rt as o,s,w as c}from"../chunks/Du04-Wio.js";import"../chunks/xihTtKlq.js";import"../chunks/qiBCaaew.js";var l=e(`

        Getting Started

        Quick Start

        Get up and running with cora in three simple steps.

        1
        Install cora — Single binary, no runtime dependencies: curl -fsSL https://raw.githubusercontent.com/codecoradev/cora-cli/main/install.sh | sh
        2
        Authenticate — Run cora auth login to pick your provider and enter your API key. + Cora stores it securely in ~/.cora/auth.toml (never committed to git).
        3
        Review — Analyze your staged changes: cora review

        Authentication — cora auth login

        The interactive login guides you through provider selection:

        $ cora auth login
        🔑 Cora Auth Setup
        Choose your LLM provider:
        [1] openai — https://api.openai.com/v1
        [2] anthropic — https://api.anthropic.com/v1
        [3] groq — https://api.groq.com/openai/v1
        [4] ollama — http://localhost:11434/v1
        [5] zai — https://api.z.ai/api/coding/paas/v4
        [6] custom — any OpenAI-compatible endpoint
        Select provider [1-6]: 1
        → Provider: openai
        → Model: gpt-4o-mini
        → Base URL: https://api.openai.com/v1
        🔑 Enter your API key: ****
        API key saved to ~/.cora/auth.toml
        Known providers Just enter your API key — model and base URL are pre-configured
        Custom provider Enter your own base URL, model name, and API key for any OpenAI-compatible API
        Provider info stored Provider name, model, and base URL are saved alongside your API key for easy reference

        Check your auth status anytime:

        $ cora auth status
        API key is configured.
        Source: ~/.cora/auth.toml
        Provider: openai
        Model: gpt-4o-mini
        Base URL: https://api.openai.com/v1

        You can also use environment variables instead of cora auth login: CORA_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.

        Understanding the Output

        cora outputs a structured, color-coded summary of findings for each file reviewed.

        $ cora review --staged
        Analyzing 3 files...
        src/auth/login.ts — 2 issues found
        Line 42: Potential SQL injection
        Line 87: Hardcoded secret
        src/utils/parser.ts — clean
        src/api/routes.ts — 1 issue found
        Line 23: Missing error handling
        3 issues found in 3 files

        Each line in the output contains:

        file path The relative path to the file being reviewed
        line number Specific line where the issue was found
        severity Suggestion (⚠), Warning (⚠), or Error (✗)
        description Brief explanation of the issue

        Project Configuration — cora init

        Create a .cora.yaml config file in your project root to customize review settings. + The CI action automatically reads this file when it exists.

        $ cora init
        Created .cora.yaml with example configuration.

        Key configuration options:

        focus — Review focus areas: security, performance, bugs, best_practice
        ignore — File patterns and rules to skip
        hook — Pre-commit hook settings: mode, severity threshold, max diff size
        llm — LLM parameters: temperature, max_tokens, timeout
        `);function u(e,u){i(u,!1),a(()=>{let e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add(`revealed`),e.unobserve(t.target))})},{threshold:.1});document.querySelectorAll(`.scroll-reveal`).forEach(t=>e.observe(t))}),s();var d=l();r(`di86c5`,e=>{t(()=>{n.title=`Getting Started — cora docs`})}),c(e,d),o()}export{u as component}; \ No newline at end of file diff --git a/website/build/_app/version.json b/website/build/_app/version.json new file mode 100644 index 0000000..0c3d23b --- /dev/null +++ b/website/build/_app/version.json @@ -0,0 +1 @@ +{"version":"1780713979666"} \ No newline at end of file diff --git a/website/build/docs/changelog.html b/website/build/docs/changelog.html new file mode 100644 index 0000000..c9a91fa --- /dev/null +++ b/website/build/docs/changelog.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Changelog — cora docs + + + +
        + + +
        + + diff --git a/website/build/docs/cli-reference.html b/website/build/docs/cli-reference.html new file mode 100644 index 0000000..1c76655 --- /dev/null +++ b/website/build/docs/cli-reference.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + CLI Reference — cora docs + + + +

        CLI Reference

        Complete command reference for the cora CLI.

        Global Flags

        FlagDescription
        --config <path>Override config file path (default: .cora.yaml)
        --format <fmt>Output format: pretty, json, compact, sarif
        --no-colorDisable colored output
        --provider <name>Override provider
        --model <name>Override model
        --base-url <url>Override API base URL
        --api-key <key>Override API key
        --verboseEnable debug logging

        Commands

        CommandDescription
        cora initCreate .cora.yaml config file
        cora reviewReview code changes (default: staged files)
        cora review --stagedReview staged git changes explicitly
        cora review --unstagedReview unstaged working changes
        cora review --unpushedReview unpushed commits
        cora review --base <branch>Compare current branch against target
        cora review --commit <ref>Review specific commit or range
        cora review --diff-file <path>Review from a diff file
        cora review --uploadReview and upload SARIF to GitHub Code Scanning
        cora scan <path>Scan files for issues
        cora scan . [--incremental]Scan only changed files
        cora config showShow resolved configuration
        cora config set <key> <value>Set a config value
        cora hook installInstall pre-commit hook
        cora hook uninstallRemove pre-commit hook
        cora auth loginSave API key to ~/.cora/config.toml
        cora auth statusCheck current auth status
        cora auth removeRemove stored API key
        cora providersList detected AI providers
        cora upload-sarif <file>Upload SARIF to GitHub Code Scanning
        cora completion <shell>Generate shell completions (bash/zsh/fish)

        Quick Examples

        # Review staged changes (what's about to be committed)
        $ cora review --staged
        # Compare your feature branch against main
        $ cora review --base main
        # Full project scan with incremental caching
        $ cora scan --incremental
        # Install pre-commit hook
        $ cora hook install
        + + +
        + + diff --git a/website/build/docs/configuration.html b/website/build/docs/configuration.html new file mode 100644 index 0000000..aa2a8e4 --- /dev/null +++ b/website/build/docs/configuration.html @@ -0,0 +1,134 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Configuration — cora docs + + + +

        Configuration

        cora uses a layered config system. Later sources override earlier ones.

        Config Resolution Order

        Settings are resolved in this order (highest priority first):

        1
        CLI flags
        --provider, --model, --base-url, etc.
        2
        Environment variables
        CORA_API_KEY, CORA_PROVIDER, CORA_MODEL, etc.
        3
        .cora.yaml
        Project root config file
        4
        ~/.cora/config.yaml
        Global config (optional)
        5
        Built-in defaults
        Sensible defaults for all settings

        .cora.yaml Example

        Create this file in your project root. Run cora init to generate it.

        .cora.yaml
        # cora project config
        +provider:
        +  provider: openai
        +  model: gpt-4o
        +  base_url: https://api.openai.com/v1
        +
        +llm:
        +  temperature: 0
        +  max_tokens: 4096
        +  timeout: 120
        +  cache_ttl: 1440
        +
        +review:
        +  system_prompt: "You are a senior code reviewer."
        +  # system_prompt_file: ./review-prompt.md
        +  response_format: json_object
        +
        +focus: security, performance, bugs
        +
        +hook:
        +  mode: warn
        +  min_severity: major
        +  max_diff_size: 51200
        +
        +ignore:
        +  files:
        +    - "vendor/**"
        +    - "*.min.js"

        Environment Variables

        VariableDescription
        CORA_API_KEYAPI key for the active provider
        CORA_PROVIDERActive provider (openai, anthropic, groq, ollama, zai)
        CORA_MODELModel name override
        CORA_BASE_URLCustom API base URL
        CORA_CONFIGPath to config file
        CORA_FORMATOutput format (pretty, json, compact, sarif)
        CORA_NO_COLORDisable colored output
        CORA_NO_CACHESkip diff-hash review cache (same as --no-cache)
        GITHUB_TOKENGitHub token for SARIF upload
        GITHUB_REPOSITORYGitHub repo for SARIF upload
        GITHUB_REFGitHub ref for SARIF upload

        Provider-Specific Env Vars

        Each provider has its own API key variable. cora checks these for auto-detection.

        env vars
        # OpenAI
        +OPENAI_API_KEY=sk-...
        +OPENAI_BASE_URL=https://api.openai.com/v1
        +
        +# Anthropic
        +ANTHROPIC_API_KEY=sk-ant-...
        +
        +# Groq
        +GROQ_API_KEY=gsk_...
        +
        +# Ollama (local, no key needed)
        +OLLAMA_HOST=http://localhost:11434
        +# Optional: OLLAMA_API_KEY if your Ollama instance requires auth
        +OLLAMA_API_KEY=...
        +
        +# Z.AI
        +ZAI_API_KEY=...

        Diff-Hash Caching

        cora caches review results by diff hash in ~/.cache/cora/reviews/. If you re-review the same diff, the cached result is returned instantly.

        Config
        llm.cache_ttl — TTL in minutes (default: 1440 / 24h)
        CLI / Env
        --no-cache or CORA_NO_CACHE=1 to bypass

        Custom System Prompts

        Override the default system prompt for review or scan commands to match your project's coding standards and review criteria.

        .cora.yaml
        review:
        +  system_prompt: "Focus on Rust idioms and error handling."
        +  # Or load from a file:
        +  system_prompt_file: ./prompts/review.md
        +
        +scan:
        +  system_prompt: "Check for OWASP Top 10 vulnerabilities."
        +  system_prompt_file: ./prompts/scan.md

        If both system_prompt and system_prompt_file are set, the file takes precedence.

        Response Format (JSON Mode)

        Opt into structured JSON output from the LLM by setting review.response_format to json_object. This instructs the LLM to return valid JSON, enabling machine-readable parsing and pipeline integration.

        .cora.yaml
        review:
        +  response_format: json_object

        Requires provider support for structured output. Works with OpenAI, Anthropic, and compatible APIs.

        Anti-Hallucination

        cora uses two mechanisms to prevent the LLM from fabricating findings:

        • File path injection — Actual file paths are embedded in the prompt, anchoring the LLM to real files in the diff.
        • Post-parse filtering — After parsing, any reported file paths or line numbers that don't exist in the actual diff are discarded.
        + + +
        + + diff --git a/website/build/docs/examples.html b/website/build/docs/examples.html new file mode 100644 index 0000000..1607716 --- /dev/null +++ b/website/build/docs/examples.html @@ -0,0 +1,100 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Examples — cora docs + + + +

        Examples

        Practical examples to get you started with cora.

        01 Quick Review

        Review your staged changes before committing.

        # Review staged changes (default)
        $ cora review

        # Or review with explicit flags
        $ cora review --staged

        02 Branch Comparison

        Compare your current branch against main.

        $ cora review --base main

        03 Full Project Scan

        Scan your entire project for issues.

        $ cora scan

        04 Incremental Scan

        Only scan files that changed since the last scan.

        $ cora scan --incremental

        05 Streaming Output

        Stream results as they come in from the LLM.

        $ cora review --staged --stream

        06 GitHub Actions CI

        Add cora to your CI pipeline.

        .github/workflows/cora-review.yml
        name: Code Review
        +
        +on:
        +  pull_request:
        +    branches: [main]
        +
        +jobs:
        +  review:
        +    runs-on: ubuntu-latest
        +    steps:
        +      - uses: actions/checkout@v4
        +      - name: Install cora
        +        run: cargo install cora-cli
        +      - name: Run AI code review
        +        env:
        +          CORA_API_KEY: ${{ secrets.CORA_API_KEY }}
        +          CORA_PROVIDER: openai
        +        run: cora review --base main --format sarif

        07 Pre-commit Hook

        Install once, then every commit gets reviewed automatically.

        # Install the hook
        $ cora hook install

        # Now just commit normally — cora reviews automatically
        $ git commit -m "fix: handle edge case in parser"
        cora pre-commit hook running...
        No issues found — commit allowed

        08 SARIF Upload

        Generate SARIF output and upload to GitHub Code Scanning.

        # Generate SARIF report and upload
        $ cora review --base main --format sarif > results.sarif && \\
          cora upload-sarif results.sarif

        Uploaded 3 findings to GitHub Code Scanning
        + + +
        + + diff --git a/website/build/docs/getting-started.html b/website/build/docs/getting-started.html new file mode 100644 index 0000000..0f67fd0 --- /dev/null +++ b/website/build/docs/getting-started.html @@ -0,0 +1,85 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Getting Started — cora docs + + + +

        Getting Started

        Quick Start

        Get up and running with cora in three simple steps.

        1
        Install cora — Single binary, no runtime dependencies: curl -fsSL https://raw.githubusercontent.com/codecoradev/cora-cli/main/install.sh | sh
        2
        Authenticate — Run cora auth login to pick your provider and enter your API key. + Cora stores it securely in ~/.cora/auth.toml (never committed to git).
        3
        Review — Analyze your staged changes: cora review

        Authentication — cora auth login

        The interactive login guides you through provider selection:

        $ cora auth login
        🔑 Cora Auth Setup
        Choose your LLM provider:
        [1] openai — https://api.openai.com/v1
        [2] anthropic — https://api.anthropic.com/v1
        [3] groq — https://api.groq.com/openai/v1
        [4] ollama — http://localhost:11434/v1
        [5] zai — https://api.z.ai/api/coding/paas/v4
        [6] custom — any OpenAI-compatible endpoint
        Select provider [1-6]: 1
        → Provider: openai
        → Model: gpt-4o-mini
        → Base URL: https://api.openai.com/v1
        🔑 Enter your API key: ****
        API key saved to ~/.cora/auth.toml
        Known providers Just enter your API key — model and base URL are pre-configured
        Custom provider Enter your own base URL, model name, and API key for any OpenAI-compatible API
        Provider info stored Provider name, model, and base URL are saved alongside your API key for easy reference

        Check your auth status anytime:

        $ cora auth status
        API key is configured.
        Source: ~/.cora/auth.toml
        Provider: openai
        Model: gpt-4o-mini
        Base URL: https://api.openai.com/v1

        You can also use environment variables instead of cora auth login: CORA_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.

        Understanding the Output

        cora outputs a structured, color-coded summary of findings for each file reviewed.

        $ cora review --staged
        Analyzing 3 files...
        src/auth/login.ts — 2 issues found
        Line 42: Potential SQL injection
        Line 87: Hardcoded secret
        src/utils/parser.ts — clean
        src/api/routes.ts — 1 issue found
        Line 23: Missing error handling
        3 issues found in 3 files

        Each line in the output contains:

        file path The relative path to the file being reviewed
        line number Specific line where the issue was found
        severity Suggestion (⚠), Warning (⚠), or Error (✗)
        description Brief explanation of the issue

        Project Configuration — cora init

        Create a .cora.yaml config file in your project root to customize review settings. + The CI action automatically reads this file when it exists.

        $ cora init
        Created .cora.yaml with example configuration.

        Key configuration options:

        focus — Review focus areas: security, performance, bugs, best_practice
        ignore — File patterns and rules to skip
        hook — Pre-commit hook settings: mode, severity threshold, max diff size
        llm — LLM parameters: temperature, max_tokens, timeout
        + + +
        + + diff --git a/website/build/docs/installation.html b/website/build/docs/installation.html new file mode 100644 index 0000000..ce76d82 --- /dev/null +++ b/website/build/docs/installation.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Installation — cora docs + + + +

        Installation

        Prerequisites

        cora is a Rust binary. You have two installation paths:

        Via Cargo (recommended) — Requires Rust 1.85 or later with Cargo installed
        Binary download — No Rust required; just download and place in your PATH

        cora works on Linux (x86_64 and arm64), macOS (arm64), and Windows.

        Install via Cargo

        The recommended way to install cora is through Cargo:

        $ cargo install cora-cli

        This compiles cora from source and installs it to Cargo's binary directory (typically ~/.cargo/bin/).

        Download Binary

        Pre-built binaries are available from the GitHub Releases page.

        Supported platforms:

        Linux x86_64 (glibc)
        Linux arm64 (aarch64)
        macOS arm64 (Apple Silicon)
        Windows x86_64
        # Download and extract
        $ curl -sL https://github.com/codecoradev/cora-cli/releases/latest/download/cora-linux-x86_64.tar.gz | tar xz
        $ mv cora ~/.local/bin/cora

        Build from Source

        If you prefer to build from the latest source:

        $ git clone https://github.com/codecoradev/cora-cli.git
        $ cd cora-cli
        $ cargo build --release
        # Binary at target/release/cora

        Shell Completions

        cora provides shell completions for bash, zsh, and fish:

        # Bash
        $ cora completion bash > ~/.cora/completion.bash
        $ echo 'source ~/.cora/completion.bash' >> ~/.bashrc
        # Zsh
        $ cora completion zsh > ~/.cora/completion.zsh
        $ echo 'source ~/.cora/completion.zsh' >> ~/.zshrc
        # Fish
        $ cora completion fish > ~/.config/fish/completions/cora.fish

        Verify Installation

        Confirm cora is installed correctly:

        $ cora --version
        cora 0.x.x
        $ cora auth status
        Provider: openai
        API key: configured

        Updating

        To update cora to the latest version:

        Via Cargo: cargo install cora-cli --force
        Via Binary: Download the latest release from GitHub and replace the existing binary
        + + +
        + + diff --git a/website/build/docs/providers.html b/website/build/docs/providers.html new file mode 100644 index 0000000..ff6f452 --- /dev/null +++ b/website/build/docs/providers.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Providers — cora docs + + + +

        Providers

        cora supports multiple AI providers. Use your own API key — no subscriptions to us.

        Supported Providers

        ProviderDefault ModelEnv VarCustom Base URL
        OpenAIgpt-4o-miniOPENAI_API_KEYOPENAI_BASE_URL
        Anthropicclaude-sonnet-4-20250514ANTHROPIC_API_KEYANTHROPIC_BASE_URL
        Groqllama-3.1-8b-instantGROQ_API_KEYGROQ_BASE_URL
        Ollamallama3.1— (local)OLLAMA_HOST (default: http://localhost:11434)
        Z.AIglm-5.1ZAI_API_KEYZAI_BASE_URL

        Auto-Detection

        cora automatically detects which provider to use by checking environment variables in this order:

        1
        OPENAI_API_KEY → uses OpenAI
        2
        ANTHROPIC_API_KEY → uses Anthropic
        3
        GROQ_API_KEY → uses Groq
        4
        ZAI_API_KEY → uses Z.AI
        5
        OLLAMA_HOST → uses Ollama (localhost)

        Override auto-detection with CORA_PROVIDER env var or --provider flag.

        Usage Examples

        # Use OpenAI (auto-detected from OPENAI_API_KEY)
        $ OPENAI_API_KEY=sk-... cora review --staged
        # Use Anthropic with explicit provider
        $ CORA_PROVIDER=anthropic CORA_API_KEY=sk-ant-... cora review --staged
        # Use Ollama locally (no API key needed)
        $ CORA_PROVIDER=ollama cora review --staged
        # Use a custom model
        $ CORA_MODEL=gpt-4o-mini cora review --staged
        + + +
        + + diff --git a/website/build/docs/roadmap.html b/website/build/docs/roadmap.html new file mode 100644 index 0000000..9f5d4c7 --- /dev/null +++ b/website/build/docs/roadmap.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Roadmap — cora Docs + + + +

        Roadmap

        Demand-gated — we build what people actually need. Track progress on GitHub Issues.

        v0.1.5 Initial Release

        v0.1.6 Custom Prompts & Path Injection

        v0.1.7 Deterministic & Reliable

        v0.2.0 Multi-Provider & SARIF

        v0.3 Progress & CI Hardening

        v0.4 Deterministic Engine Pipeline

        v0.5 Install & Distribution

        Future What's Next

        + + +
        + + diff --git a/website/build/docs/usage.html b/website/build/docs/usage.html new file mode 100644 index 0000000..824b0b3 --- /dev/null +++ b/website/build/docs/usage.html @@ -0,0 +1,83 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + + Usage — cora docs + + + +

        Usage

        Review Modes

        cora supports multiple review modes, each suited to a different workflow:

        ModeFlagScopeBest For
        Default(no flag)Tries staged first, then unpushedQuick feedback
        Staged--stagedFiles in git staging areaPre-commit review
        Unstaged--unstagedUnstaged working changesReview work in progress
        Unpushed--unpushedCommits not yet pushedReview before push
        Base Branch--base <branch>Diff against base branchPR review workflow
        Commit--commit <ref>Specific commit or rangeReview specific changes
        Diff File--diff-file <path>External diff fileReview patch files
        # Review staged changes (default)
        $ cora review
        # Review against a branch
        $ cora review --base main
        # Review a specific commit
        $ cora review --commit HEAD
        # Review from a diff file
        $ cora review --diff-file pr.diff
        # Full project scan (use cora scan)
        $ cora scan .

        Output Formats

        cora can output results in three formats:

        --format pretty — Human-readable terminal output (default)
        --format json — Machine-readable JSON for CI/CD pipelines
        --format sarif — SARIF format for GitHub Code Scanning
        # JSON output example
        $ cora review --staged --format json
        {
        "files": [
        {
        "path": "src/auth/login.ts",
        "issues": [
        {
        "line": 42,
        "severity": "warning",
        "message": "Potential SQL injection"
        }
        ]
        }
        ],
        "summary": {
        "total_files": 3,
        "total_issues": 3
        }
        }

        Configuration File

        The .cora.yaml file provides persistent configuration. Place it in your project root. API keys are stored at ~/.cora/config.toml.

        # .cora.yaml — example
        review:
        severity: warning
        focus: security,performance
        ignore:
        - "vendor/**"
        - "*.min.js"
        providers:
        openai:
        model: gpt-4o

        Environment Variables

        Environment variables override configuration file settings:

        VariableDescriptionRequired
        CORA_API_KEYAPI key for the configured providerYes (unless using cora auth)
        CORA_PROVIDEROverride the LLM providerNo
        CORA_MODELOverride the model nameNo
        CORA_BASE_URLOverride the API base URLNo
        CORA_CONFIGPath to alternative config fileNo

        Working with Monorepos

        cora works well in monorepo setups. Use include patterns to limit review scope to specific packages:

        # Review only the backend package
        $ cora review --staged --include "packages/backend/**"
        # Exclude test and generated files
        $ cora review --staged --exclude "**/*.test.ts" --exclude "**/generated/**"

        Alternatively, set include/exclude patterns in .cora.yaml for persistent configuration.

        Exit Codes

        cora uses standard exit codes for scripting and CI integration:

        CodeMeaningCI Behavior
        0No issues foundPass
        1Issues foundFail (warning/error)
        2Review blockedFail (auth/config error)
        3Authentication errorFail (missing API key)

        Tips

        Use cora review with no flags for the fastest pre-commit feedback
        Combine --format json with --base main in CI pipelines
        Use cora scan . --incremental for large codebases — only changed files are analyzed
        Use --quiet for minimal output and --severity to filter by severity level
        Use cora auth login to store API keys securely instead of environment variables
        + + +
        + + diff --git a/website/build/favicon.png b/website/build/favicon.png new file mode 100644 index 0000000..db6d4be Binary files /dev/null and b/website/build/favicon.png differ diff --git a/website/build/index.html b/website/build/index.html new file mode 100644 index 0000000..25c1b78 --- /dev/null +++ b/website/build/index.html @@ -0,0 +1,84 @@ + + + + + + + + + + cora — AI Code Review CLI + + + + + + + + + + + + + + + + + + + + + cora — AI Code Review CLI + + + + +
        Open source · BYOK · Zero config

        AI code review in your terminal

        cora catches bugs, security issues, and code smells before they land in your PR. + Bring your own API key. Your code never leaves your machine.

        install
        cargo install cora-cli
        cora auth login
        cora review --staged
        Local-first 5 LLM providers CI/CD ready

        Trusted by developers who ship fast

        5
        AI Providers
        < 3s
        Review Time
        Zero
        Config Required

        See it in action

        Run cora against staged changes. Results in seconds, not minutes.

        cora \u2014 review

        How it works

        Three steps from code to confidence.

        01

        Write code

        Push your changes as normal. cora only sees your diff.

        02

        Review with AI

        cora analyzes your diff with the LLM of your choice.

        03

        Ship with confidence

        Merge clean, production-ready code. Every time.

        Built for developers who value control

        Everything you need, nothing you don't.

        AI Code Review

        Diff, branch, or full scan

        Three review modes: staged diff, branch comparison, or full project scan. LLM-powered analysis catches bugs, security issues, and style violations.

        Bring Your Own Key

        No subscriptions, no lock-in

        Uses YOUR OpenAI, Anthropic, Groq, Ollama, or Z.AI API key. No data stored on our servers. You control the model, you control the cost.

        Pre-commit Hooks

        Review before you push

        Install once. Every commit gets reviewed automatically. Block bad code from entering your branch before it ships.

        Incremental Scan

        Only scan what changed

        SHA256 content hash cache. First scan indexes your codebase. Subsequent scans only review new or modified files.

        SARIF Output

        GitHub Code Scanning

        Upload review findings directly to GitHub's Security tab. Track issues across PRs. Works with any CI/CD pipeline.

        Fully Private

        Your code stays yours

        Runs entirely on your machine. No cloud, no telemetry, no data leaving your network. Perfect for Gitea and air-gapped environments.

        Deterministic Reviews

        Same diff, same issues

        Temperature defaults to 0. Identical diffs always produce identical findings — perfect for CI reproducibility.

        Smart Caching

        Never review the same diff twice

        Reviews are cached by diff hash in ~/.cache/cora/reviews/. Re-reviewing an unchanged diff returns cached results instantly. Use --no-cache to bypass.

        Custom Prompts & Anti-Hallucination

        Control the review, trust the output

        Override system prompts for review and scan. File path injection and post-parse filtering ensure the LLM only reports issues that exist in your actual diff.

        Why developers choose cora

        Compared to popular code review tools.

        BYOK
        cora
        CodeRabbit
        Copilot
        SonarQube
        Self-hosted
        cora
        CodeRabbit
        Copilot
        SonarQube
        Gitea / Forgejo
        cora
        CodeRabbit
        Copilot
        SonarQube
        CLI
        cora
        CodeRabbit
        Copilot
        SonarQube
        Pre-commit hooks
        cora
        CodeRabbit
        Copilot
        SonarQube
        SARIF output
        cora
        CodeRabbit
        Copilot
        SonarQube
        Cost
        cora Free + API
        CodeRabbit $12–39/mo
        Copilot $10–39/mo
        SonarQube Free / $150+
        License
        cora MIT
        CodeRabbit Apache 2.0
        Copilot Proprietary
        SonarQube LGPL

        Frequently asked questions

        Everything you need to know about using cora.

        Start in 30 seconds

        No account required. No subscription. No cloud.

        1

        Install

        Single binary, no dependencies.

        Terminal
        $ curl -fsSL https://cora.dev/install | sh
        2

        Set API key

        Use your existing OpenAI or Anthropic key.

        Terminal
        $ export OPENAI_API_KEY="sk-..."
        3

        Review

        Review your staged changes.

        Terminal
        $ CORA_API_KEY=key cora review --staged
        4

        Done

        That's it. No account. No subscription.

        Ready to ship better code?

        No account. No subscription. No cloud.

        + + +
        + + diff --git a/website/build/og.png b/website/build/og.png new file mode 100644 index 0000000..3253c16 Binary files /dev/null and b/website/build/og.png differ diff --git a/website/build/robots.txt b/website/build/robots.txt new file mode 100644 index 0000000..c2a49f4 --- /dev/null +++ b/website/build/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/website/node_modules/.bin/acorn b/website/node_modules/.bin/acorn new file mode 120000 index 0000000..cf76760 --- /dev/null +++ b/website/node_modules/.bin/acorn @@ -0,0 +1 @@ +../acorn/bin/acorn \ No newline at end of file diff --git a/website/node_modules/.bin/jiti b/website/node_modules/.bin/jiti new file mode 120000 index 0000000..18f28cf --- /dev/null +++ b/website/node_modules/.bin/jiti @@ -0,0 +1 @@ +../jiti/lib/jiti-cli.mjs \ No newline at end of file diff --git a/website/node_modules/.bin/lz-string b/website/node_modules/.bin/lz-string new file mode 120000 index 0000000..14bd70d --- /dev/null +++ b/website/node_modules/.bin/lz-string @@ -0,0 +1 @@ +../lz-string/bin/bin.js \ No newline at end of file diff --git a/website/node_modules/.bin/nanoid b/website/node_modules/.bin/nanoid new file mode 120000 index 0000000..e2be547 --- /dev/null +++ b/website/node_modules/.bin/nanoid @@ -0,0 +1 @@ +../nanoid/bin/nanoid.cjs \ No newline at end of file diff --git a/website/node_modules/.bin/rolldown b/website/node_modules/.bin/rolldown new file mode 120000 index 0000000..7725012 --- /dev/null +++ b/website/node_modules/.bin/rolldown @@ -0,0 +1 @@ +../rolldown/bin/cli.mjs \ No newline at end of file diff --git a/website/node_modules/.bin/svelte-check b/website/node_modules/.bin/svelte-check new file mode 120000 index 0000000..2d8d3dc --- /dev/null +++ b/website/node_modules/.bin/svelte-check @@ -0,0 +1 @@ +../svelte-check/bin/svelte-check \ No newline at end of file diff --git a/website/node_modules/.bin/svelte-kit b/website/node_modules/.bin/svelte-kit new file mode 120000 index 0000000..faccdd4 --- /dev/null +++ b/website/node_modules/.bin/svelte-kit @@ -0,0 +1 @@ +../@sveltejs/kit/svelte-kit.js \ No newline at end of file diff --git a/website/node_modules/.bin/tsc b/website/node_modules/.bin/tsc new file mode 120000 index 0000000..0863208 --- /dev/null +++ b/website/node_modules/.bin/tsc @@ -0,0 +1 @@ +../typescript/bin/tsc \ No newline at end of file diff --git a/website/node_modules/.bin/tsserver b/website/node_modules/.bin/tsserver new file mode 120000 index 0000000..f8f8f1a --- /dev/null +++ b/website/node_modules/.bin/tsserver @@ -0,0 +1 @@ +../typescript/bin/tsserver \ No newline at end of file diff --git a/website/node_modules/.bin/vite b/website/node_modules/.bin/vite new file mode 120000 index 0000000..6d1e3be --- /dev/null +++ b/website/node_modules/.bin/vite @@ -0,0 +1 @@ +../vite/bin/vite.js \ No newline at end of file diff --git a/website/node_modules/.package-lock.json b/website/node_modules/.package-lock.json new file mode 100644 index 0000000..c86ed96 --- /dev/null +++ b/website/node_modules/.package-lock.json @@ -0,0 +1,1235 @@ +{ + "name": "cora-website", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "dev": true, + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "dev": true + }, + "node_modules/@internationalized/date": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", + "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "dev": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lucide/svelte": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-1.17.0.tgz", + "integrity": "sha512-q06YCFBN5CO8cd1ADmLCxWRVMVb7xxvHzqC0lvNoxGa+FLW6Cd1Y1AOxgbQk4Iwe68vkAMCRveNHint4WoaVKg==", + "dev": true, + "peerDependencies": { + "svelte": "^5" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.132.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", + "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", + "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", + "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.10.tgz", + "integrity": "sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA==", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz", + "integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.61.1.tgz", + "integrity": "sha512-Ny8s1SR1TyQS2hD2Rvw0XKzU2Nw1eUF52dTb6T2bdcgz7wSC+Nyb5IwjWYlR4b2dvbbR5NJDiQwHg3rnNseghg==", + "dev": true, + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.9", + "@types/cookie": "^0.6.0", + "acorn": "^8.16.0", + "cookie": "^0.6.0", + "devalue": "^5.8.1", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3 || ^6.0.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.1.2.tgz", + "integrity": "sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA==", + "dev": true, + "dependencies": { + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.2" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.46.4", + "vite": "^8.0.0-beta.7 || ^8.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", + "dev": true, + "dependencies": { + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bits-ui": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.18.1.tgz", + "integrity": "sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/dom": "^1.7.1", + "esm-env": "^1.1.2", + "runed": "^0.35.1", + "svelte-toolbelt": "^0.10.6", + "tabbable": "^6.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/huntabyte" + }, + "peerDependencies": { + "@internationalized/date": "^3.8.1", + "svelte": "^5.33.0" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==" + }, + "node_modules/enhanced-resolve": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", + "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" + }, + "node_modules/esrap": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.9.tgz", + "integrity": "sha512-4KijP+NxCWthMCUC3qHbE6n4vCjqgJS1uAYKhuT/GWfFTf1Qyive2TgOjep+gzbSzRfnNyaN/UU9YmdOt8Eg0A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mode-watcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mode-watcher/-/mode-watcher-1.1.0.tgz", + "integrity": "sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==", + "dependencies": { + "runed": "^0.25.0", + "svelte-toolbelt": "^0.7.1" + }, + "peerDependencies": { + "svelte": "^5.27.0" + } + }, + "node_modules/mode-watcher/node_modules/runed": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.25.0.tgz", + "integrity": "sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==", + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "dependencies": { + "esm-env": "^1.0.0" + }, + "peerDependencies": { + "svelte": "^5.7.0" + } + }, + "node_modules/mode-watcher/node_modules/svelte-toolbelt": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.7.1.tgz", + "integrity": "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==", + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.23.2", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/mode-watcher/node_modules/svelte-toolbelt/node_modules/runed": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.23.4.tgz", + "integrity": "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==", + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "dependencies": { + "esm-env": "^1.0.0" + }, + "peerDependencies": { + "svelte": "^5.7.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ] + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rolldown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", + "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==", + "dev": true, + "dependencies": { + "@oxc-project/types": "=0.132.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.2", + "@rolldown/binding-darwin-arm64": "1.0.2", + "@rolldown/binding-darwin-x64": "1.0.2", + "@rolldown/binding-freebsd-x64": "1.0.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", + "@rolldown/binding-linux-arm64-gnu": "1.0.2", + "@rolldown/binding-linux-arm64-musl": "1.0.2", + "@rolldown/binding-linux-ppc64-gnu": "1.0.2", + "@rolldown/binding-linux-s390x-gnu": "1.0.2", + "@rolldown/binding-linux-x64-gnu": "1.0.2", + "@rolldown/binding-linux-x64-musl": "1.0.2", + "@rolldown/binding-openharmony-arm64": "1.0.2", + "@rolldown/binding-wasm32-wasi": "1.0.2", + "@rolldown/binding-win32-arm64-msvc": "1.0.2", + "@rolldown/binding-win32-x64-msvc": "1.0.2" + } + }, + "node_modules/runed": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz", + "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "dependencies": { + "dequal": "^2.0.3", + "esm-env": "^1.0.0", + "lz-string": "^1.5.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.21.0", + "svelte": "^5.7.0" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + } + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "dev": true + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svelte": { + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.0.tgz", + "integrity": "sha512-kTXr26t1bchFp28ROrb957LtbujpBmBDibmqMGziVpUs7awBi96TGgX6SovrA8BNoEUDVRK2Fb9FkeYlGspoVg==", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.10", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.8.1", + "esm-env": "^1.2.1", + "esrap": "^2.2.9", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.8.tgz", + "integrity": "sha512-67adfgBox5eNSNIvIIwgFizKGdcRrGpiMoNO2obHcYuLz7iTa8Xgm/NGU3ntMFnNm8K1grFOIG6HhMLX/vcN8w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-toolbelt": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz", + "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.35.1", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.30.2" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "dev": true, + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", + "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==", + "dev": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.2", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" + } + } +} diff --git a/website/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts b/website/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts new file mode 100644 index 0000000..0c08d71 --- /dev/null +++ b/website/node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts @@ -0,0 +1,32 @@ +declare namespace svelteNative.JSX { + + // Every namespace eligible for use needs to implement the following two functions + function mapElementTag( + tag: string + ): any; + + function createElement( + element: Key | undefined | null, attrs: Elements[Key] + ): any; + function createElement( + element: Key | undefined | null, attrEnhancers: T, attrs: Elements[Key] & T + ): any; + + + /* svelte specific */ + interface ElementClass { + $$prop_def: any; + } + + interface ElementAttributesProperty { + $$prop_def: any; // specify the property name to use + } + + // Add empty IntrinsicAttributes to prevent fallback to the one in the JSX namespace + interface IntrinsicAttributes { + } + + interface IntrinsicElements { + [name: string]: { [name: string]: any }; + } +} \ No newline at end of file diff --git a/website/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts b/website/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts new file mode 100644 index 0000000..29d84a2 --- /dev/null +++ b/website/node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts @@ -0,0 +1,290 @@ +// Whenever a ambient declaration changes, its number should be increased +// This way, we avoid the situation where multiple ambient versions of svelte2tsx +// are loaded and their declarations conflict each other +// See https://github.com/sveltejs/language-tools/issues/1059 for an example bug that stems from it +// If you change anything in this file, think about whether or not it should be backported to svelte-shims.d.ts + +type AConstructorTypeOf = new (...args: U) => T; + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteActionReturnType = { + update?: (args: any) => void, + destroy?: () => void +} | void + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteTransitionConfig = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteTransitionReturnType = SvelteTransitionConfig | (() => SvelteTransitionConfig) + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteAnimationReturnType = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} + +/** @internal PRIVATE API, DO NOT USE */ +type SvelteWithOptionalProps = Omit & Partial>; +/** @internal PRIVATE API, DO NOT USE */ +type SvelteAllProps = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SveltePropsAnyFallback = {[K in keyof Props]: Props[K] extends never ? never : Props[K] extends undefined ? any : Props[K]} +/** @internal PRIVATE API, DO NOT USE */ +type SvelteSlotsAnyFallback = {[K in keyof Slots]: {[S in keyof Slots[K]]: Slots[K][S] extends undefined ? any : Slots[K][S]}} +/** @internal PRIVATE API, DO NOT USE */ +type SvelteRestProps = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SvelteSlots = { [index: string]: any } +/** @internal PRIVATE API, DO NOT USE */ +type SvelteStore = { subscribe: (run: (value: T) => any, invalidate?: any) => any } + +// Forces TypeScript to look into the type which results in a better representation of it +// which helps for error messages and is necessary for d.ts file transformation so that +// no ambient type references are left in the output +/** @internal PRIVATE API, DO NOT USE */ +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; + +/** @internal PRIVATE API, DO NOT USE */ +type KeysMatching = {[K in keyof Obj]-?: Obj[K] extends V ? K : never}[keyof Obj] +/** @internal PRIVATE API, DO NOT USE */ +declare type __sveltets_2_CustomEvents = {[K in KeysMatching]: T[K] extends CustomEvent ? T[K]['detail']: T[K]} + +declare function __sveltets_2_ensureRightProps(props: Props): {}; +declare function __sveltets_2_instanceOf(type: AConstructorTypeOf): T; +declare function __sveltets_2_allPropsType(): SvelteAllProps +declare function __sveltets_2_restPropsType(): SvelteRestProps +declare function __sveltets_2_slotsType(slots: Slots): Record; + +// Overload of the following two functions is necessary. +// An empty array of optionalProps makes OptionalProps type any, which means we lose the prop typing. +// optionalProps need to be first or its type cannot be infered correctly. + +declare function __sveltets_2_partial( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } +declare function __sveltets_2_partial( + optionalProps: OptionalProps[], + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, OptionalProps>>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_partial_with_any( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand & SvelteAllProps>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } +declare function __sveltets_2_partial_with_any( + optionalProps: OptionalProps[], + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, OptionalProps> & SvelteAllProps>, events: Events, slots: Expand>, exports?: Exports, bindings?: Bindings } + + +declare function __sveltets_2_with_any( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Expand, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_with_any_event( + render: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings } +): {props: Props, events: Events & {[evt: string]: CustomEvent;}, slots: Slots, exports?: Exports, bindings?: Bindings } + +declare function __sveltets_2_store_get(store: SvelteStore): T +declare function __sveltets_2_store_get | undefined | null>(store: Store): Store extends SvelteStore ? T : Store; +declare function __sveltets_2_any(dummy: any): any; +declare function __sveltets_2_invalidate(getValue: () => T): T + +declare function __sveltets_2_mapWindowEvent( + event: K +): HTMLBodyElementEventMap[K]; +declare function __sveltets_2_mapBodyEvent( + event: K +): WindowEventMap[K]; +declare function __sveltets_2_mapElementEvent( + event: K +): HTMLElementEventMap[K]; + +declare function __sveltets_2_bubbleEventDef( + events: Events, eventKey: K +): Events[K]; +declare function __sveltets_2_bubbleEventDef( + events: any, eventKey: string +): any; + +declare const __sveltets_2_customEvent: CustomEvent; +declare function __sveltets_2_toEventTypings(): {[Key in keyof Typings]: CustomEvent}; + +declare function __sveltets_2_unionType(t1: T1, t2: T2): T1 | T2; +declare function __sveltets_2_unionType(t1: T1, t2: T2, t3: T3): T1 | T2 | T3; +declare function __sveltets_2_unionType(t1: T1, t2: T2, t3: T3, t4: T4): T1 | T2 | T3 | T4; +declare function __sveltets_2_unionType(...types: any[]): any; + +declare function __sveltets_2_createSvelte2TsxComponent( + render: {props: Props, events: Events, slots: Slots } +): typeof import("svelte").SvelteComponent; + +declare function __sveltets_2_unwrapArr(arr: ArrayLike): T +declare function __sveltets_2_unwrapPromiseLike(promise: PromiseLike | T): T + +// v2 +declare function __sveltets_2_createCreateSlot>>(): (slotName: SlotName, attrs: Slots[SlotName]) => Record; +declare function __sveltets_2_createComponentAny(props: Record): import("svelte").SvelteComponent; + +declare function __sveltets_2_any(...dummy: any[]): any; +declare function __sveltets_2_empty(...dummy: any[]): {}; +declare function __sveltets_2_union(t1:T1,t2?:T2,t3?:T3,t4?:T4,t5?:T5,t6?:T6,t7?:T7,t8?:T8,t9?:T9,t10?:T10): T1 & T2 & T3 & T4 & T5 & T6 & T7 & T8 & T9 & T10; +declare function __sveltets_2_nonNullable(type: T): NonNullable; + +declare function __sveltets_2_cssProp(prop: Record): {}; + +// @ts-ignore Svelte v3/v4 don't have this +declare function __sveltets_2_ensureSnippet(val: ReturnType | undefined | null): any; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteAnimationReturnType = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} +declare var __sveltets_2_AnimationMove: { from: DOMRect, to: DOMRect } +declare function __sveltets_2_ensureAnimation(animationCall: __sveltets_2_SvelteAnimationReturnType): {}; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteActionReturnType = { + update?: (args: any) => void, + destroy?: () => void, + $$_attributes?: Record, +} | void +declare function __sveltets_2_ensureAction(actionCall: T): T extends {$$_attributes?: any} ? T['$$_attributes'] : {}; + +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteTransitionConfig = { + delay?: number, + duration?: number, + easing?: (t: number) => number, + css?: (t: number, u: number) => string, + tick?: (t: number, u: number) => void +} +/** @internal PRIVATE API, DO NOT USE */ +type __sveltets_2_SvelteTransitionReturnType = __sveltets_2_SvelteTransitionConfig | (() => __sveltets_2_SvelteTransitionConfig) +declare function __sveltets_2_ensureTransition(transitionCall: __sveltets_2_SvelteTransitionReturnType): {}; + +// Includes undefined and null for all types as all usages also allow these +declare function __sveltets_2_ensureType(type: AConstructorTypeOf, el: T | undefined | null): {}; +declare function __sveltets_2_ensureType(type1: AConstructorTypeOf, type2: AConstructorTypeOf, el: T1 | T2 | undefined | null): {}; + +// The following is necessary because there are two clashing errors that can't be solved at the same time +// when using Svelte2TsxComponent, more precisely the event typings in +// __sveltets_2_ensureComponent _SvelteComponent>(type: T): T; +// If we type it as "any", we have an error when using sth like {a: CustomEvent} +// If we type it as "{}", we have an error when using sth like {[evt: string]: CustomEvent} +// If we type it as "unknown", we get all kinds of follow up errors which we want to avoid +// Therefore introduce two more base classes just for this case. +/** + * Ambient type only used for intellisense, DO NOT USE IN YOUR PROJECT + */ +declare type ATypedSvelteComponent = { + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$prop_def: any; + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$events_def: any; + /** + * @internal This is for type checking capabilities only + * and does not exist at runtime. Don't use this property. + */ + $$slot_def: any; + + $on(event: string, handler: any): () => void; +} +/** + * Ambient type only used for intellisense, DO NOT USE IN YOUR PROJECT. + * + * If you're looking for the type of a Svelte Component, use `SvelteComponent` and `ComponentType` instead: + * + * ```ts + * import type { ComponentType, SvelteComponent } from "svelte"; + * let myComponentConstructor: ComponentType = ..; + * ``` + */ +declare type ConstructorOfATypedSvelteComponent = new (args: {target: any, props?: any}) => ATypedSvelteComponent +// Usage note: Cannot properly transform generic function components to class components due to TypeScript limitations +declare function __sveltets_2_ensureComponent< + T extends + | ConstructorOfATypedSvelteComponent + | (typeof import('svelte') extends { mount: any } + ? // @ts-ignore svelte.Component doesn't exist in Svelte 4 + import('svelte').Component + : never) + | null + | undefined +>( + type: T +): NonNullable< + T extends ConstructorOfATypedSvelteComponent + ? T + : typeof import('svelte') extends { mount: any } + ? // @ts-ignore svelte.Component doesn't exist in Svelte 4 + T extends import('svelte').Component< + infer Props extends Record, + infer Exports extends Record, + infer Bindings extends string + > + ? new ( + options: import('svelte').ComponentConstructorOptions + ) => import('svelte').SvelteComponent & + Exports & { $$bindings: Bindings } + : never + : never +>; + +declare function __sveltets_2_ensureArray | Iterable>( + // Svelte 5 allows undefined or null here, Svelte 4 doesn't + array: T | (typeof import('svelte') extends { mount: any } ? (undefined | null) : never) +): T extends ArrayLike ? U[] : T extends Iterable ? Iterable : any[]; + +type __sveltets_2_PropsWithChildren = Props & + (Slots extends { default: any } + // This is unfortunate because it means "accepts no props" turns into "accepts any prop" + // but the alternative is non-fixable type errors because of the way TypeScript index + // signatures work (they will always take precedence and make an impossible-to-satisfy children type). + ? Props extends Record + ? any + : { children?: any } + : {}); +declare function __sveltets_2_runes_constructor(render: {props: Props }): import("svelte").ComponentConstructorOptions; + +declare function __sveltets_2_get_set_binding(get: (() => T) | null | undefined, set: (t: T) => void): T; + +declare function __sveltets_$$bindings(...bindings: Bindings): Bindings[number]; + +declare function __sveltets_2_fn_component< + Props extends Record, Exports extends Record, Bindings extends string + // @ts-ignore Svelte 5 only +>(klass: {props: Props, exports?: Exports, bindings?: Bindings }): import('svelte').Component; + +interface __sveltets_2_IsomorphicComponent = any, Events extends Record = any, Slots extends Record = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions): import('svelte').SvelteComponent & { $$bindings?: Bindings } & Exports; + (internal: unknown, props: Props extends Record ? {$$events?: Events, $$slots?: Slots} : Props & {$$events?: Events, $$slots?: Slots}): Exports & { $set?: any, $on?: any }; + z_$$bindings?: Bindings; +} + +declare function __sveltets_2_isomorphic_component< + Props extends Record, Events extends Record, Slots extends Record, Exports extends Record, Bindings extends string +>(klass: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings }): __sveltets_2_IsomorphicComponent; + +declare function __sveltets_2_isomorphic_component_slots< + Props extends Record, Events extends Record, Slots extends Record, Exports extends Record, Bindings extends string +>(klass: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings }): __sveltets_2_IsomorphicComponent<__sveltets_2_PropsWithChildren, Events, Slots, Exports, Bindings>; diff --git a/website/node_modules/@emnapi/core/LICENSE b/website/node_modules/@emnapi/core/LICENSE new file mode 100644 index 0000000..05a5944 --- /dev/null +++ b/website/node_modules/@emnapi/core/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Toyobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/node_modules/@emnapi/core/README.md b/website/node_modules/@emnapi/core/README.md new file mode 100644 index 0000000..c98dddc --- /dev/null +++ b/website/node_modules/@emnapi/core/README.md @@ -0,0 +1 @@ +See [https://github.com/toyobayashi/emnapi](https://github.com/toyobayashi/emnapi) diff --git a/website/node_modules/@emnapi/core/index.js b/website/node_modules/@emnapi/core/index.js new file mode 100644 index 0000000..11764ed --- /dev/null +++ b/website/node_modules/@emnapi/core/index.js @@ -0,0 +1,5 @@ +if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') { + module.exports = require('./dist/emnapi-core.cjs.min.js') +} else { + module.exports = require('./dist/emnapi-core.cjs.js') +} diff --git a/website/node_modules/@emnapi/core/package.json b/website/node_modules/@emnapi/core/package.json new file mode 100644 index 0000000..d61c08c --- /dev/null +++ b/website/node_modules/@emnapi/core/package.json @@ -0,0 +1,49 @@ +{ + "name": "@emnapi/core", + "version": "1.10.0", + "description": "emnapi core", + "main": "index.js", + "module": "./dist/emnapi-core.esm-bundler.js", + "types": "./dist/emnapi-core.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": { + "module": "./dist/emnapi-core.d.ts", + "import": "./dist/emnapi-core.d.mts", + "default": "./dist/emnapi-core.d.ts" + }, + "module": "./dist/emnapi-core.esm-bundler.js", + "import": "./dist/emnapi-core.mjs", + "default": "./index.js" + }, + "./dist/emnapi-core.cjs.min": { + "types": "./dist/emnapi-core.d.ts", + "default": "./dist/emnapi-core.cjs.min.js" + }, + "./dist/emnapi-core.min.mjs": { + "types": "./dist/emnapi-core.d.mts", + "default": "./dist/emnapi-core.min.mjs" + } + }, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + }, + "scripts": { + "build": "node ./script/build.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/toyobayashi/emnapi.git" + }, + "author": "toyobayashi", + "license": "MIT", + "bugs": { + "url": "https://github.com/toyobayashi/emnapi/issues" + }, + "homepage": "https://github.com/toyobayashi/emnapi#readme", + "publishConfig": { + "access": "public" + } +} diff --git a/website/node_modules/@emnapi/runtime/LICENSE b/website/node_modules/@emnapi/runtime/LICENSE new file mode 100644 index 0000000..05a5944 --- /dev/null +++ b/website/node_modules/@emnapi/runtime/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Toyobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/node_modules/@emnapi/runtime/README.md b/website/node_modules/@emnapi/runtime/README.md new file mode 100644 index 0000000..c98dddc --- /dev/null +++ b/website/node_modules/@emnapi/runtime/README.md @@ -0,0 +1 @@ +See [https://github.com/toyobayashi/emnapi](https://github.com/toyobayashi/emnapi) diff --git a/website/node_modules/@emnapi/runtime/index.js b/website/node_modules/@emnapi/runtime/index.js new file mode 100644 index 0000000..efd0f2f --- /dev/null +++ b/website/node_modules/@emnapi/runtime/index.js @@ -0,0 +1,5 @@ +if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') { + module.exports = require('./dist/emnapi.cjs.min.js') +} else { + module.exports = require('./dist/emnapi.cjs.js') +} diff --git a/website/node_modules/@emnapi/runtime/package.json b/website/node_modules/@emnapi/runtime/package.json new file mode 100644 index 0000000..335bb8c --- /dev/null +++ b/website/node_modules/@emnapi/runtime/package.json @@ -0,0 +1,48 @@ +{ + "name": "@emnapi/runtime", + "version": "1.10.0", + "description": "emnapi runtime", + "main": "index.js", + "module": "./dist/emnapi.esm-bundler.js", + "types": "./dist/emnapi.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": { + "module": "./dist/emnapi.d.ts", + "import": "./dist/emnapi.d.mts", + "default": "./dist/emnapi.d.ts" + }, + "module": "./dist/emnapi.esm-bundler.js", + "import": "./dist/emnapi.mjs", + "default": "./index.js" + }, + "./dist/emnapi.cjs.min": { + "types": "./dist/emnapi.d.ts", + "default": "./dist/emnapi.cjs.min.js" + }, + "./dist/emnapi.min.mjs": { + "types": "./dist/emnapi.d.mts", + "default": "./dist/emnapi.min.mjs" + } + }, + "dependencies": { + "tslib": "^2.4.0" + }, + "scripts": { + "build": "node ./script/build.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/toyobayashi/emnapi.git" + }, + "author": "toyobayashi", + "license": "MIT", + "bugs": { + "url": "https://github.com/toyobayashi/emnapi/issues" + }, + "homepage": "https://github.com/toyobayashi/emnapi#readme", + "publishConfig": { + "access": "public" + } +} diff --git a/website/node_modules/@emnapi/wasi-threads/LICENSE b/website/node_modules/@emnapi/wasi-threads/LICENSE new file mode 100644 index 0000000..05a5944 --- /dev/null +++ b/website/node_modules/@emnapi/wasi-threads/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Toyobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/node_modules/@emnapi/wasi-threads/README.md b/website/node_modules/@emnapi/wasi-threads/README.md new file mode 100644 index 0000000..d7ab935 --- /dev/null +++ b/website/node_modules/@emnapi/wasi-threads/README.md @@ -0,0 +1,203 @@ +# @emnapi/wasi-threads + +This package makes [wasi-threads proposal](https://github.com/WebAssembly/wasi-threads) based WASI modules work in Node.js and browser. + +## Quick Start + +`index.html` + +```html + + + +``` + +If your application will block browser main thread (for example `pthread_join`), please run it in worker instead. + +```html + +``` + +`index.js` + +```js +const ENVIRONMENT_IS_NODE = + typeof process === 'object' && process !== null && + typeof process.versions === 'object' && process.versions !== null && + typeof process.versions.node === 'string'; + +(function (main) { + if (ENVIRONMENT_IS_NODE) { + main(require) + } else { + if (typeof importScripts === 'function') { + importScripts('./node_modules/@tybys/wasm-util/dist/wasm-util.js') + importScripts('./node_modules/@emnapi/wasi-threads/dist/wasi-threads.js') + } + const nodeWasi = { WASI: globalThis.wasmUtil.WASI } + const nodeWorkerThreads = { + Worker: globalThis.Worker + } + const _require = function (request) { + if (request === 'node:wasi' || request === 'wasi') return nodeWasi + if (request === 'node:worker_threads' || request === 'worker_threads') return nodeWorkerThreads + if (request === '@emnapi/wasi-threads') return globalThis.wasiThreads + throw new Error('Can not find module: ' + request) + } + main(_require) + } +})(async function (require) { + const { WASI } = require('wasi') + const { Worker } = require('worker_threads') + const { WASIThreads } = require('@emnapi/wasi-threads') + + const wasi = new WASI({ + version: 'preview1' + }) + const wasiThreads = new WASIThreads({ + wasi, + + /** + * avoid Atomics.wait() deadlock during thread creation in browser + * see https://emscripten.org/docs/tools_reference/settings_reference.html#pthread-pool-size + */ + reuseWorker: ENVIRONMENT_IS_NODE + ? false + : { + size: 4 /** greater than actual needs (2) */, + strict: true + }, + + /** + * Synchronous thread creation + * pthread_create will not return until thread worker actually starts + */ + waitThreadStart: typeof window === 'undefined' ? 1000 : false, + + onCreateWorker: () => { + return new Worker('./worker.js', { + execArgv: ['--experimental-wasi-unstable-preview1'] + }) + } + }) + const memory = new WebAssembly.Memory({ + initial: 16777216 / 65536, + maximum: 2147483648 / 65536, + shared: true + }) + let input + const file = 'path/to/your/wasi-module.wasm' + try { + input = require('fs').readFileSync(require('path').join(__dirname, file)) + } catch (err) { + const response = await fetch(file) + input = await response.arrayBuffer() + } + let { module, instance } = await WebAssembly.instantiate(input, { + env: { memory }, + wasi_snapshot_preview1: wasi.wasiImport, + ...wasiThreads.getImportObject() + }) + + wasiThreads.setup(instance, module, memory) + await wasiThreads.preloadWorkers() + + if (typeof instance.exports._start === 'function') { + return wasi.start(instance) + } else { + wasi.initialize(instance) + // instance.exports.exported_wasm_function() + } +}) +``` + +`worker.js` + +```js +(function (main) { + const ENVIRONMENT_IS_NODE = + typeof process === 'object' && process !== null && + typeof process.versions === 'object' && process.versions !== null && + typeof process.versions.node === 'string' + + if (ENVIRONMENT_IS_NODE) { + const _require = function (request) { + return require(request) + } + + const _init = function () { + const nodeWorkerThreads = require('worker_threads') + const parentPort = nodeWorkerThreads.parentPort + + parentPort.on('message', (data) => { + globalThis.onmessage({ data }) + }) + + Object.assign(globalThis, { + self: globalThis, + require, + Worker: nodeWorkerThreads.Worker, + importScripts: function (f) { + (0, eval)(require('fs').readFileSync(f, 'utf8') + '//# sourceURL=' + f) + }, + postMessage: function (msg) { + parentPort.postMessage(msg) + } + }) + } + + main(_require, _init) + } else { + importScripts('./node_modules/@tybys/wasm-util/dist/wasm-util.js') + importScripts('./node_modules/@emnapi/wasi-threads/dist/wasi-threads.js') + + const nodeWasi = { WASI: globalThis.wasmUtil.WASI } + const _require = function (request) { + if (request === '@emnapi/wasi-threads') return globalThis.wasiThreads + if (request === 'node:wasi' || request === 'wasi') return nodeWasi + throw new Error('Can not find module: ' + request) + } + const _init = function () {} + main(_require, _init) + } +})(function main (require, init) { + init() + + const { WASI } = require('wasi') + const { ThreadMessageHandler, WASIThreads } = require('@emnapi/wasi-threads') + + const handler = new ThreadMessageHandler({ + async onLoad ({ wasmModule, wasmMemory }) { + const wasi = new WASI({ + version: 'preview1' + }) + + const wasiThreads = new WASIThreads({ + wasi, + childThread: true + }) + + const originalInstance = await WebAssembly.instantiate(wasmModule, { + env: { + memory: wasmMemory, + }, + wasi_snapshot_preview1: wasi.wasiImport, + ...wasiThreads.getImportObject() + }) + + // must call `initialize` instead of `start` in child thread + const instance = wasiThreads.initialize(originalInstance, wasmModule, wasmMemory) + + return { module: wasmModule, instance } + } + }) + + globalThis.onmessage = function (e) { + handler.handle(e) + // handle other messages + } +}) +``` diff --git a/website/node_modules/@emnapi/wasi-threads/index.js b/website/node_modules/@emnapi/wasi-threads/index.js new file mode 100644 index 0000000..7e6eabd --- /dev/null +++ b/website/node_modules/@emnapi/wasi-threads/index.js @@ -0,0 +1,5 @@ +if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') { + module.exports = require('./dist/wasi-threads.cjs.min.js') +} else { + module.exports = require('./dist/wasi-threads.cjs.js') +} diff --git a/website/node_modules/@emnapi/wasi-threads/package.json b/website/node_modules/@emnapi/wasi-threads/package.json new file mode 100644 index 0000000..2f69de6 --- /dev/null +++ b/website/node_modules/@emnapi/wasi-threads/package.json @@ -0,0 +1,50 @@ +{ + "name": "@emnapi/wasi-threads", + "version": "1.2.1", + "description": "WASI threads proposal implementation in JavaScript", + "main": "index.js", + "module": "./dist/wasi-threads.esm-bundler.js", + "types": "./dist/wasi-threads.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": { + "module": "./dist/wasi-threads.d.ts", + "import": "./dist/wasi-threads.d.mts", + "default": "./dist/wasi-threads.d.ts" + }, + "module": "./dist/wasi-threads.esm-bundler.js", + "import": "./dist/wasi-threads.mjs", + "default": "./index.js" + }, + "./dist/wasi-threads.cjs.min": { + "types": "./dist/wasi-threads.d.ts", + "default": "./dist/wasi-threads.cjs.min.js" + }, + "./dist/wasi-threads.min.mjs": { + "types": "./dist/wasi-threads.d.mts", + "default": "./dist/wasi-threads.min.mjs" + } + }, + "dependencies": { + "tslib": "^2.4.0" + }, + "scripts": { + "build": "node ./script/build.js", + "build:test": "node ./test/build.js", + "test": "node ./test/index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/toyobayashi/emnapi.git" + }, + "author": "toyobayashi", + "license": "MIT", + "bugs": { + "url": "https://github.com/toyobayashi/emnapi/issues" + }, + "homepage": "https://github.com/toyobayashi/emnapi#readme", + "publishConfig": { + "access": "public" + } +} diff --git a/website/node_modules/@floating-ui/core/LICENSE b/website/node_modules/@floating-ui/core/LICENSE new file mode 100644 index 0000000..639cdc6 --- /dev/null +++ b/website/node_modules/@floating-ui/core/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/node_modules/@floating-ui/core/README.md b/website/node_modules/@floating-ui/core/README.md new file mode 100644 index 0000000..c4b69b2 --- /dev/null +++ b/website/node_modules/@floating-ui/core/README.md @@ -0,0 +1,4 @@ +# @floating-ui/core + +This is the platform-agnostic core of Floating UI, exposing the main +`computePosition` function but no platform interface logic. diff --git a/website/node_modules/@floating-ui/core/package.json b/website/node_modules/@floating-ui/core/package.json new file mode 100644 index 0000000..4c370dd --- /dev/null +++ b/website/node_modules/@floating-ui/core/package.json @@ -0,0 +1,63 @@ +{ + "name": "@floating-ui/core", + "version": "1.7.5", + "description": "Positioning library for floating elements: tooltips, popovers, dropdowns, and more", + "publishConfig": { + "access": "public" + }, + "main": "./dist/floating-ui.core.umd.js", + "module": "./dist/floating-ui.core.esm.js", + "unpkg": "./dist/floating-ui.core.umd.min.js", + "types": "./dist/floating-ui.core.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/floating-ui.core.d.mts", + "default": "./dist/floating-ui.core.mjs" + }, + "types": "./dist/floating-ui.core.d.ts", + "module": "./dist/floating-ui.core.esm.js", + "default": "./dist/floating-ui.core.umd.js" + } + }, + "sideEffects": false, + "files": [ + "dist" + ], + "author": "atomiks", + "license": "MIT", + "bugs": "https://github.com/floating-ui/floating-ui", + "repository": { + "type": "git", + "url": "https://github.com/floating-ui/floating-ui.git", + "directory": "packages/core" + }, + "homepage": "https://floating-ui.com", + "keywords": [ + "tooltip", + "popover", + "dropdown", + "menu", + "popup", + "positioning" + ], + "dependencies": { + "@floating-ui/utils": "^0.2.11" + }, + "devDependencies": { + "config": "0.0.0" + }, + "scripts": { + "test": "vitest run", + "test:watch": "vitest watch", + "lint": "eslint .", + "format": "prettier --write .", + "clean": "rimraf dist out-tsc", + "dev": "rollup -c -w", + "build": "rollup -c", + "build:api": "build-api --tsc tsconfig.lib.json", + "publint": "publint", + "typecheck": "tsc -b" + } +} \ No newline at end of file diff --git a/website/node_modules/@floating-ui/dom/LICENSE b/website/node_modules/@floating-ui/dom/LICENSE new file mode 100644 index 0000000..639cdc6 --- /dev/null +++ b/website/node_modules/@floating-ui/dom/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/node_modules/@floating-ui/dom/README.md b/website/node_modules/@floating-ui/dom/README.md new file mode 100644 index 0000000..47ef927 --- /dev/null +++ b/website/node_modules/@floating-ui/dom/README.md @@ -0,0 +1,4 @@ +# @floating-ui/dom + +This is the library to use Floating UI on the web, wrapping `@floating-ui/core` +with DOM interface logic. diff --git a/website/node_modules/@floating-ui/dom/package.json b/website/node_modules/@floating-ui/dom/package.json new file mode 100644 index 0000000..c435ba5 --- /dev/null +++ b/website/node_modules/@floating-ui/dom/package.json @@ -0,0 +1,71 @@ +{ + "name": "@floating-ui/dom", + "version": "1.7.6", + "description": "Floating UI for the web", + "publishConfig": { + "access": "public" + }, + "main": "./dist/floating-ui.dom.umd.js", + "module": "./dist/floating-ui.dom.esm.js", + "unpkg": "./dist/floating-ui.dom.umd.min.js", + "types": "./dist/floating-ui.dom.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/floating-ui.dom.d.mts", + "default": "./dist/floating-ui.dom.mjs" + }, + "types": "./dist/floating-ui.dom.d.ts", + "module": "./dist/floating-ui.dom.esm.js", + "default": "./dist/floating-ui.dom.umd.js" + } + }, + "sideEffects": false, + "files": [ + "dist" + ], + "author": "atomiks", + "license": "MIT", + "bugs": "https://github.com/floating-ui/floating-ui", + "repository": { + "type": "git", + "url": "https://github.com/floating-ui/floating-ui.git", + "directory": "packages/dom" + }, + "homepage": "https://floating-ui.com", + "keywords": [ + "tooltip", + "popover", + "dropdown", + "menu", + "popup", + "positioning" + ], + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + }, + "devDependencies": { + "@types/react": "^18.3.19", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.1", + "config": "0.0.0" + }, + "scripts": { + "lint": "eslint .", + "format": "prettier --write .", + "clean": "rimraf dist out-tsc test-results", + "dev": "vite", + "build": "rollup -c", + "build:api": "build-api --tsc tsconfig.lib.json", + "test": "vitest run", + "test:watch": "vitest watch", + "publint": "publint", + "playwright": "playwright test ./test/functional", + "typecheck": "tsc -b" + } +} \ No newline at end of file diff --git a/website/node_modules/@floating-ui/utils/LICENSE b/website/node_modules/@floating-ui/utils/LICENSE new file mode 100644 index 0000000..639cdc6 --- /dev/null +++ b/website/node_modules/@floating-ui/utils/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/node_modules/@floating-ui/utils/README.md b/website/node_modules/@floating-ui/utils/README.md new file mode 100644 index 0000000..9e9d56e --- /dev/null +++ b/website/node_modules/@floating-ui/utils/README.md @@ -0,0 +1,4 @@ +# @floating-ui/utils + +Utility functions shared across Floating UI packages. You may use these +functions in your own projects, but are subject to breaking changes. diff --git a/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.d.ts b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.d.ts new file mode 100644 index 0000000..81e6dcd --- /dev/null +++ b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.d.ts @@ -0,0 +1,47 @@ +declare function getComputedStyle_2(element: Element): CSSStyleDeclaration; +export { getComputedStyle_2 as getComputedStyle } + +export declare function getContainingBlock(element: Element): HTMLElement | null; + +export declare function getDocumentElement(node: Node | Window): HTMLElement; + +export declare function getFrameElement(win: Window): Element | null; + +export declare function getNearestOverflowAncestor(node: Node): HTMLElement; + +export declare function getNodeName(node: Node | Window): string; + +export declare function getNodeScroll(element: Element | Window): { + scrollLeft: number; + scrollTop: number; +}; + +export declare function getOverflowAncestors(node: Node, list?: OverflowAncestors, traverseIframes?: boolean): OverflowAncestors; + +export declare function getParentNode(node: Node): Node; + +export declare function getWindow(node: any): typeof window; + +export declare function isContainingBlock(elementOrCss: Element | CSSStyleDeclaration): boolean; + +export declare function isElement(value: unknown): value is Element; + +export declare function isHTMLElement(value: unknown): value is HTMLElement; + +export declare function isLastTraversableNode(node: Node): boolean; + +export declare function isNode(value: unknown): value is Node; + +export declare function isOverflowElement(element: Element): boolean; + +export declare function isShadowRoot(value: unknown): value is ShadowRoot; + +export declare function isTableElement(element: Element): boolean; + +export declare function isTopLayer(element: Element): boolean; + +export declare function isWebKit(): boolean; + +declare type OverflowAncestors = Array; + +export { } diff --git a/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.esm.js b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.esm.js new file mode 100644 index 0000000..f05dd50 --- /dev/null +++ b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.esm.js @@ -0,0 +1,165 @@ +function hasWindow() { + return typeof window !== 'undefined'; +} +function getNodeName(node) { + if (isNode(node)) { + return (node.nodeName || '').toLowerCase(); + } + // Mocked nodes in testing environments may not be instances of Node. By + // returning `#document` an infinite loop won't occur. + // https://github.com/floating-ui/floating-ui/issues/2317 + return '#document'; +} +function getWindow(node) { + var _node$ownerDocument; + return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; +} +function getDocumentElement(node) { + var _ref; + return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; +} +function isNode(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Node || value instanceof getWindow(value).Node; +} +function isElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Element || value instanceof getWindow(value).Element; +} +function isHTMLElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; +} +function isShadowRoot(value) { + if (!hasWindow() || typeof ShadowRoot === 'undefined') { + return false; + } + return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; +} +function isOverflowElement(element) { + const { + overflow, + overflowX, + overflowY, + display + } = getComputedStyle(element); + return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents'; +} +function isTableElement(element) { + return /^(table|td|th)$/.test(getNodeName(element)); +} +function isTopLayer(element) { + try { + if (element.matches(':popover-open')) { + return true; + } + } catch (_e) { + // no-op + } + try { + return element.matches(':modal'); + } catch (_e) { + return false; + } +} +const willChangeRe = /transform|translate|scale|rotate|perspective|filter/; +const containRe = /paint|layout|strict|content/; +const isNotNone = value => !!value && value !== 'none'; +let isWebKitValue; +function isContainingBlock(elementOrCss) { + const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss; + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + // https://drafts.csswg.org/css-transforms-2/#individual-transforms + return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || ''); +} +function getContainingBlock(element) { + let currentNode = getParentNode(element); + while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { + if (isContainingBlock(currentNode)) { + return currentNode; + } else if (isTopLayer(currentNode)) { + return null; + } + currentNode = getParentNode(currentNode); + } + return null; +} +function isWebKit() { + if (isWebKitValue == null) { + isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none'); + } + return isWebKitValue; +} +function isLastTraversableNode(node) { + return /^(html|body|#document)$/.test(getNodeName(node)); +} +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} +function getNodeScroll(element) { + if (isElement(element)) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + return { + scrollLeft: element.scrollX, + scrollTop: element.scrollY + }; +} +function getParentNode(node) { + if (getNodeName(node) === 'html') { + return node; + } + const result = + // Step into the shadow DOM of the parent of a slotted node. + node.assignedSlot || + // DOM Element detected. + node.parentNode || + // ShadowRoot detected. + isShadowRoot(node) && node.host || + // Fallback. + getDocumentElement(node); + return isShadowRoot(result) ? result.host : result; +} +function getNearestOverflowAncestor(node) { + const parentNode = getParentNode(node); + if (isLastTraversableNode(parentNode)) { + return node.ownerDocument ? node.ownerDocument.body : node.body; + } + if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { + return parentNode; + } + return getNearestOverflowAncestor(parentNode); +} +function getOverflowAncestors(node, list, traverseIframes) { + var _node$ownerDocument2; + if (list === void 0) { + list = []; + } + if (traverseIframes === void 0) { + traverseIframes = true; + } + const scrollableAncestor = getNearestOverflowAncestor(node); + const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); + const win = getWindow(scrollableAncestor); + if (isBody) { + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); + } else { + return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); + } +} +function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; +} + +export { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit }; diff --git a/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.umd.js b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.umd.js new file mode 100644 index 0000000..4ba7e4a --- /dev/null +++ b/website/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.umd.js @@ -0,0 +1,192 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUIUtilsDOM = {})); +})(this, (function (exports) { 'use strict'; + + function hasWindow() { + return typeof window !== 'undefined'; + } + function getNodeName(node) { + if (isNode(node)) { + return (node.nodeName || '').toLowerCase(); + } + // Mocked nodes in testing environments may not be instances of Node. By + // returning `#document` an infinite loop won't occur. + // https://github.com/floating-ui/floating-ui/issues/2317 + return '#document'; + } + function getWindow(node) { + var _node$ownerDocument; + return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; + } + function getDocumentElement(node) { + var _ref; + return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; + } + function isNode(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Node || value instanceof getWindow(value).Node; + } + function isElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Element || value instanceof getWindow(value).Element; + } + function isHTMLElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; + } + function isShadowRoot(value) { + if (!hasWindow() || typeof ShadowRoot === 'undefined') { + return false; + } + return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; + } + function isOverflowElement(element) { + const { + overflow, + overflowX, + overflowY, + display + } = getComputedStyle(element); + return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents'; + } + function isTableElement(element) { + return /^(table|td|th)$/.test(getNodeName(element)); + } + function isTopLayer(element) { + try { + if (element.matches(':popover-open')) { + return true; + } + } catch (_e) { + // no-op + } + try { + return element.matches(':modal'); + } catch (_e) { + return false; + } + } + const willChangeRe = /transform|translate|scale|rotate|perspective|filter/; + const containRe = /paint|layout|strict|content/; + const isNotNone = value => !!value && value !== 'none'; + let isWebKitValue; + function isContainingBlock(elementOrCss) { + const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss; + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + // https://drafts.csswg.org/css-transforms-2/#individual-transforms + return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || ''); + } + function getContainingBlock(element) { + let currentNode = getParentNode(element); + while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { + if (isContainingBlock(currentNode)) { + return currentNode; + } else if (isTopLayer(currentNode)) { + return null; + } + currentNode = getParentNode(currentNode); + } + return null; + } + function isWebKit() { + if (isWebKitValue == null) { + isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none'); + } + return isWebKitValue; + } + function isLastTraversableNode(node) { + return /^(html|body|#document)$/.test(getNodeName(node)); + } + function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); + } + function getNodeScroll(element) { + if (isElement(element)) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + return { + scrollLeft: element.scrollX, + scrollTop: element.scrollY + }; + } + function getParentNode(node) { + if (getNodeName(node) === 'html') { + return node; + } + const result = + // Step into the shadow DOM of the parent of a slotted node. + node.assignedSlot || + // DOM Element detected. + node.parentNode || + // ShadowRoot detected. + isShadowRoot(node) && node.host || + // Fallback. + getDocumentElement(node); + return isShadowRoot(result) ? result.host : result; + } + function getNearestOverflowAncestor(node) { + const parentNode = getParentNode(node); + if (isLastTraversableNode(parentNode)) { + return node.ownerDocument ? node.ownerDocument.body : node.body; + } + if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { + return parentNode; + } + return getNearestOverflowAncestor(parentNode); + } + function getOverflowAncestors(node, list, traverseIframes) { + var _node$ownerDocument2; + if (list === void 0) { + list = []; + } + if (traverseIframes === void 0) { + traverseIframes = true; + } + const scrollableAncestor = getNearestOverflowAncestor(node); + const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); + const win = getWindow(scrollableAncestor); + if (isBody) { + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); + } else { + return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); + } + } + function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; + } + + exports.getComputedStyle = getComputedStyle; + exports.getContainingBlock = getContainingBlock; + exports.getDocumentElement = getDocumentElement; + exports.getFrameElement = getFrameElement; + exports.getNearestOverflowAncestor = getNearestOverflowAncestor; + exports.getNodeName = getNodeName; + exports.getNodeScroll = getNodeScroll; + exports.getOverflowAncestors = getOverflowAncestors; + exports.getParentNode = getParentNode; + exports.getWindow = getWindow; + exports.isContainingBlock = isContainingBlock; + exports.isElement = isElement; + exports.isHTMLElement = isHTMLElement; + exports.isLastTraversableNode = isLastTraversableNode; + exports.isNode = isNode; + exports.isOverflowElement = isOverflowElement; + exports.isShadowRoot = isShadowRoot; + exports.isTableElement = isTableElement; + exports.isTopLayer = isTopLayer; + exports.isWebKit = isWebKit; + +})); diff --git a/website/node_modules/@floating-ui/utils/dom/package.json b/website/node_modules/@floating-ui/utils/dom/package.json new file mode 100644 index 0000000..5007e5b --- /dev/null +++ b/website/node_modules/@floating-ui/utils/dom/package.json @@ -0,0 +1,6 @@ +{ + "sideEffects": false, + "main": "floating-ui.utils.dom.umd.js", + "module": "floating-ui.utils.dom.esm.js", + "types": "floating-ui.utils.dom.d.ts" +} diff --git a/website/node_modules/@floating-ui/utils/package.json b/website/node_modules/@floating-ui/utils/package.json new file mode 100644 index 0000000..a3388fd --- /dev/null +++ b/website/node_modules/@floating-ui/utils/package.json @@ -0,0 +1,70 @@ +{ + "name": "@floating-ui/utils", + "version": "0.2.11", + "description": "Utilities for Floating UI", + "publishConfig": { + "access": "public" + }, + "main": "./dist/floating-ui.utils.umd.js", + "module": "./dist/floating-ui.utils.esm.js", + "types": "./dist/floating-ui.utils.d.ts", + "sideEffects": false, + "files": [ + "dist", + "dom" + ], + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/floating-ui.utils.d.mts", + "default": "./dist/floating-ui.utils.mjs" + }, + "types": "./dist/floating-ui.utils.d.ts", + "module": "./dist/floating-ui.utils.esm.js", + "default": "./dist/floating-ui.utils.umd.js" + }, + "./dom": { + "import": { + "types": "./dist/floating-ui.utils.dom.d.mts", + "default": "./dist/floating-ui.utils.dom.mjs" + }, + "types": "./dist/floating-ui.utils.dom.d.ts", + "module": "./dist/floating-ui.utils.dom.esm.js", + "default": "./dist/floating-ui.utils.dom.umd.js" + } + }, + "author": "atomiks", + "license": "MIT", + "bugs": "https://github.com/floating-ui/floating-ui", + "repository": { + "type": "git", + "url": "https://github.com/floating-ui/floating-ui.git", + "directory": "packages/utils" + }, + "homepage": "https://floating-ui.com", + "keywords": [ + "tooltip", + "popover", + "dropdown", + "menu", + "popup", + "positioning" + ], + "devDependencies": { + "@testing-library/jest-dom": "^6.1.6", + "config": "0.0.0" + }, + "scripts": { + "lint": "eslint .", + "format": "prettier --write .", + "clean": "rimraf dist out-tsc dom react", + "test": "vitest run --globals", + "test:watch": "vitest watch --globals", + "dev": "rollup -c -w", + "build": "rollup -c", + "build:api": "build-api --tsc tsconfig.lib.json --aec api-extractor.json --aec api-extractor.dom.json --aec api-extractor.react.json", + "publint": "publint", + "typecheck": "tsc -b" + } +} \ No newline at end of file diff --git a/website/node_modules/@internationalized/date/LICENSE b/website/node_modules/@internationalized/date/LICENSE new file mode 100644 index 0000000..e3af604 --- /dev/null +++ b/website/node_modules/@internationalized/date/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Adobe + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/website/node_modules/@internationalized/date/README.md b/website/node_modules/@internationalized/date/README.md new file mode 100644 index 0000000..bbb05ac --- /dev/null +++ b/website/node_modules/@internationalized/date/README.md @@ -0,0 +1,44 @@ +# @internationalized/date + +The `@internationalized/date` package provides objects and functions for representing and manipulating dates and times in a locale-aware manner. + +## Features + +* **Typed objects** – Includes immutable objects to represent dates, times, calendars, and more. +* **International calendars** – Support for 13 calendar systems used around the world, including Gregorian, Buddhist, Islamic, Persian, and more. +* **Manipulation** – Add and subtract durations, set and cycle fields, and more. +* **Conversion** – Convert between calendar systems, time zones, string representations, and object types. +* **Queries** – Compare dates and times for ordering or full/partial equality. Determine locale-specific metadata such as day of week, weekend/weekday, etc. +* **Time zone aware** – The [ZonedDateTime](https://react-spectrum.adobe.com/internationalized/date/ZonedDateTime.html) object supports time zone aware date and time manipulation. +* **Predictable** – The API is designed to resolve ambiguity in all operations explicitly, including time zone conversions, arithmetic involving daylight saving time, locale-specific queries, and more. +* **Small bundle size** – The entire library including all calendars and functions is 8 kB minified and compressed with Brotli. +* **Tree shakeable** – Only include the functions and calendar systems you need. For example, if you only use the Gregorian calendar and builtin `CalendarDate` methods, it's just 2.8 kB. + +## Introduction + +Dates and times are represented in many different ways by cultures around the world. This includes differences in calendar systems, time zones, daylight saving time rules, date and time formatting, weekday and weekend rules, and much more. When building applications that support users around the world, it is important to handle these aspects correctly for each locale. The `@internationalized/date` package provides a library of objects and functions to perform date and time related manipulation, queries, and conversions that work across locales and calendars. + +By default, JavaScript represents dates and times using the [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) object. However, `Date` has _many_ problems, including a very difficult to use API, lack of all internationalization support, and more. The [Temporal](https://tc39.es/proposal-temporal/docs/index.html) proposal will eventually address this in the language, and `@internationalized/date` is heavily inspired by it. We hope to back the objects in this package with it once it is implemented in browsers. + +## Package structure + +The `@internationalized/date` package includes the following object types: + +* [Calendar](https://react-spectrum.adobe.com/internationalized/date/Calendar.html) – An interface which provides calendar conversion and metadata like number of days in month, and number of months in year. Many implementations are provided to support the most commonly used calendar systems. +* [CalendarDate](https://react-spectrum.adobe.com/internationalized/date/CalendarDate.html) – An immutable object that stores a date associated with a specific calendar system, without any time components. +* [CalendarDateTime](https://react-spectrum.adobe.com/internationalized/date/CalendarDateTime.html) – An immutable object that represents a date and time without a time zone, in a specific calendar system. +* [ZonedDateTime](https://react-spectrum.adobe.com/internationalized/date/ZonedDateTime.html) – An immutable object that represents a date and time in a specific time zone and calendar system. +* [Time](https://react-spectrum.adobe.com/internationalized/date/Time.html) – An immutable object that stores a clock time without any date components. + +Each object includes methods to allow basic manipulation and conversion functionality, such as adding and subtracting durations, and formatting as an ISO 8601 string. Additional less commonly used functions can be imported from the `@internationalized/date` package, and passed a date object as a parameter. This includes functions to parse ISO 8601 strings, query properties such as day of week, convert between time zones and much more. See the documentation for each of the objects to learn more about the supported methods and functions. + +This example constructs a `CalendarDate` object, manipulates it to get the start of the next week, and converts it to a string representation. + +```tsx +import {CalendarDate, startOfWeek} from '@internationalized/date'; + +let date = new CalendarDate(2022, 2, 3); +date = date.add({weeks: 1}); +date = startOfWeek(date, 'en-US'); +date.toString(); // 2022-02-06 +``` diff --git a/website/node_modules/@internationalized/date/package.json b/website/node_modules/@internationalized/date/package.json new file mode 100644 index 0000000..bda8f3b --- /dev/null +++ b/website/node_modules/@internationalized/date/package.json @@ -0,0 +1,50 @@ +{ + "name": "@internationalized/date", + "version": "3.12.2", + "description": "Internationalized calendar, date, and time manipulation utilities", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/adobe/react-spectrum/tree/main/packages/@internationalized/date" + }, + "source": "src/index.ts", + "files": [ + "dist", + "src" + ], + "sideEffects": false, + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "./dist/types/src/index.d.ts", + "exports": { + "source": "./src/index.ts", + "types": "./dist/types/src/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "import": "dist/index.mjs", + "targets": { + "types": false, + "module": { + "engines": { + "browsers": [ + "chrome >= 79", + "firefox >= 85", + "safari >= 13" + ] + } + }, + "import": { + "isLibrary": true, + "outputFormat": "esmodule", + "includeNodeModules": false + } + }, + "gitHead": "3577a20859b9585a000010c720f6ee39c1c588cc" +} diff --git a/website/node_modules/@internationalized/date/src/CalendarDate.ts b/website/node_modules/@internationalized/date/src/CalendarDate.ts new file mode 100644 index 0000000..35ab394 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/CalendarDate.ts @@ -0,0 +1,586 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import { + add, + addTime, + addZoned, + constrain, + constrainTime, + cycleDate, + cycleTime, + cycleZoned, + set, + setTime, + setZoned, + subtract, + subtractTime, + subtractZoned +} from './manipulation'; +import { + AnyCalendarDate, + AnyTime, + Calendar, + CycleOptions, + CycleTimeOptions, + DateDuration, + DateField, + DateFields, + DateTimeDuration, + Disambiguation, + TimeDuration, + TimeField, + TimeFields +} from './types'; +import {compareDate, compareTime} from './queries'; +import {dateTimeToString, dateToString, timeToString, zonedDateTimeToString} from './string'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {toCalendarDateTime, toDate, toZoned, zonedToDate} from './conversion'; + +export type DateValue = CalendarDate | CalendarDateTime | ZonedDateTime; + +function shiftArgs(args: any[]) { + let calendar: Calendar = typeof args[0] === 'object' ? args.shift() : new GregorianCalendar(); + + let era: string; + if (typeof args[0] === 'string') { + era = args.shift(); + } else { + let eras = calendar.getEras(); + era = eras[eras.length - 1]; + } + + let year = args.shift(); + let month = args.shift(); + let day = args.shift(); + + return [calendar, era, year, month, day]; +} + +/** A CalendarDate represents a date without any time components in a specific calendar system. */ +export class CalendarDate { + // This prevents TypeScript from allowing other types with the same fields to match. + // i.e. a ZonedDateTime should not be be passable to a parameter that expects CalendarDate. + // If that behavior is desired, use the AnyCalendarDate interface instead. + // @ts-ignore + #type; + /** The calendar system associated with this date, e.g. Gregorian. */ + public readonly calendar: Calendar; + /** The calendar era for this date, e.g. "BC" or "AD". */ + public readonly era: string; + /** The year of this date within the era. */ + public readonly year: number; + /** + * The month number within the year. Note that some calendar systems such as Hebrew + * may have a variable number of months per year. Therefore, month numbers may not + * always correspond to the same month names in different years. + */ + public readonly month: number; + /** The day number within the month. */ + public readonly day: number; + + constructor(year: number, month: number, day: number); + constructor(era: string, year: number, month: number, day: number); + constructor(calendar: Calendar, year: number, month: number, day: number); + constructor(calendar: Calendar, era: string, year: number, month: number, day: number); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + + constrain(this); + } + + /** Returns a copy of this date. */ + copy(): CalendarDate { + if (this.era) { + return new CalendarDate(this.calendar, this.era, this.year, this.month, this.day); + } else { + return new CalendarDate(this.calendar, this.year, this.month, this.day); + } + } + + /** Returns a new `CalendarDate` with the given duration added to it. */ + add(duration: DateDuration): CalendarDate { + return add(this, duration); + } + + /** Returns a new `CalendarDate` with the given duration subtracted from it. */ + subtract(duration: DateDuration): CalendarDate { + return subtract(this, duration); + } + + /** + * Returns a new `CalendarDate` with the given fields set to the provided values. Other fields + * will be constrained accordingly. + */ + set(fields: DateFields): CalendarDate { + return set(this, fields); + } + + /** + * Returns a new `CalendarDate` with the given field adjusted by a specified amount. + * When the resulting value reaches the limits of the field, it wraps around. + */ + cycle(field: DateField, amount: number, options?: CycleOptions): CalendarDate { + return cycleDate(this, field, amount, options); + } + + /** + * Converts the date to a native JavaScript Date object, with the time set to midnight in the + * given time zone. + */ + toDate(timeZone: string): Date { + return toDate(this, timeZone); + } + + /** Converts the date to an ISO 8601 formatted string. */ + toString(): string { + return dateToString(this); + } + + /** + * Compares this date with another. A negative result indicates that this date is before the given + * one, and a positive date indicates that it is after. + */ + compare(b: AnyCalendarDate): number { + return compareDate(this, b); + } +} + +/** A Time represents a clock time without any date components. */ +export class Time { + // This prevents TypeScript from allowing other types with the same fields to match. + // @ts-ignore + #type; + /** The hour, numbered from 0 to 23. */ + public readonly hour: number; + /** The minute in the hour. */ + public readonly minute: number; + /** The second in the minute. */ + public readonly second: number; + /** The millisecond in the second. */ + public readonly millisecond: number; + + constructor(hour: number = 0, minute: number = 0, second: number = 0, millisecond: number = 0) { + this.hour = hour; + this.minute = minute; + this.second = second; + this.millisecond = millisecond; + constrainTime(this); + } + + /** Returns a copy of this time. */ + copy(): Time { + return new Time(this.hour, this.minute, this.second, this.millisecond); + } + + /** Returns a new `Time` with the given duration added to it. */ + add(duration: TimeDuration): Time { + return addTime(this, duration); + } + + /** Returns a new `Time` with the given duration subtracted from it. */ + subtract(duration: TimeDuration): Time { + return subtractTime(this, duration); + } + + /** + * Returns a new `Time` with the given fields set to the provided values. Other fields will be + * constrained accordingly. + */ + set(fields: TimeFields): Time { + return setTime(this, fields); + } + + /** + * Returns a new `Time` with the given field adjusted by a specified amount. + * When the resulting value reaches the limits of the field, it wraps around. + */ + cycle(field: TimeField, amount: number, options?: CycleTimeOptions): Time { + return cycleTime(this, field, amount, options); + } + + /** Converts the time to an ISO 8601 formatted string. */ + toString(): string { + return timeToString(this); + } + + /** + * Compares this time with another. A negative result indicates that this time is before the given + * one, and a positive time indicates that it is after. + */ + compare(b: AnyTime): number { + return compareTime(this, b); + } +} + +/** A CalendarDateTime represents a date and time without a time zone, in a specific calendar system. */ +export class CalendarDateTime { + // This prevents TypeScript from allowing other types with the same fields to match. + // @ts-ignore + #type; + /** The calendar system associated with this date, e.g. Gregorian. */ + public readonly calendar: Calendar; + /** The calendar era for this date, e.g. "BC" or "AD". */ + public readonly era: string; + /** The year of this date within the era. */ + public readonly year: number; + /** + * The month number within the year. Note that some calendar systems such as Hebrew + * may have a variable number of months per year. Therefore, month numbers may not + * always correspond to the same month names in different years. + */ + public readonly month: number; + /** The day number within the month. */ + public readonly day: number; + /** The hour in the day, numbered from 0 to 23. */ + public readonly hour: number; + /** The minute in the hour. */ + public readonly minute: number; + /** The second in the minute. */ + public readonly second: number; + /** The millisecond in the second. */ + public readonly millisecond: number; + + constructor( + year: number, + month: number, + day: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + era: string, + year: number, + month: number, + day: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + calendar: Calendar, + year: number, + month: number, + day: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + calendar: Calendar, + era: string, + year: number, + month: number, + day: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + this.hour = args.shift() || 0; + this.minute = args.shift() || 0; + this.second = args.shift() || 0; + this.millisecond = args.shift() || 0; + + constrain(this); + } + + /** Returns a copy of this date. */ + copy(): CalendarDateTime { + if (this.era) { + return new CalendarDateTime( + this.calendar, + this.era, + this.year, + this.month, + this.day, + this.hour, + this.minute, + this.second, + this.millisecond + ); + } else { + return new CalendarDateTime( + this.calendar, + this.year, + this.month, + this.day, + this.hour, + this.minute, + this.second, + this.millisecond + ); + } + } + + /** Returns a new `CalendarDateTime` with the given duration added to it. */ + add(duration: DateTimeDuration): CalendarDateTime { + return add(this, duration); + } + + /** Returns a new `CalendarDateTime` with the given duration subtracted from it. */ + subtract(duration: DateTimeDuration): CalendarDateTime { + return subtract(this, duration); + } + + /** + * Returns a new `CalendarDateTime` with the given fields set to the provided values. Other fields + * will be constrained accordingly. + */ + set(fields: DateFields & TimeFields): CalendarDateTime { + return set(setTime(this, fields), fields); + } + + /** + * Returns a new `CalendarDateTime` with the given field adjusted by a specified amount. + * When the resulting value reaches the limits of the field, it wraps around. + */ + cycle( + field: DateField | TimeField, + amount: number, + options?: CycleTimeOptions + ): CalendarDateTime { + switch (field) { + case 'era': + case 'year': + case 'month': + case 'day': + return cycleDate(this, field, amount, options); + default: + return cycleTime(this, field, amount, options); + } + } + + /** Converts the date to a native JavaScript Date object in the given time zone. */ + toDate(timeZone: string, disambiguation?: Disambiguation): Date { + return toDate(this, timeZone, disambiguation); + } + + /** Converts the date to an ISO 8601 formatted string. */ + toString(): string { + return dateTimeToString(this); + } + + /** + * Compares this date with another. A negative result indicates that this date is before the given + * one, and a positive date indicates that it is after. + */ + compare(b: CalendarDate | CalendarDateTime | ZonedDateTime): number { + let res = compareDate(this, b); + if (res === 0) { + return compareTime(this, toCalendarDateTime(b)); + } + + return res; + } +} + +/** A ZonedDateTime represents a date and time in a specific time zone and calendar system. */ +export class ZonedDateTime { + // This prevents TypeScript from allowing other types with the same fields to match. + // @ts-ignore + #type; + /** The calendar system associated with this date, e.g. Gregorian. */ + public readonly calendar: Calendar; + /** The calendar era for this date, e.g. "BC" or "AD". */ + public readonly era: string; + /** The year of this date within the era. */ + public readonly year: number; + /** + * The month number within the year. Note that some calendar systems such as Hebrew + * may have a variable number of months per year. Therefore, month numbers may not + * always correspond to the same month names in different years. + */ + public readonly month: number; + /** The day number within the month. */ + public readonly day: number; + /** The hour in the day, numbered from 0 to 23. */ + public readonly hour: number; + /** The minute in the hour. */ + public readonly minute: number; + /** The second in the minute. */ + public readonly second: number; + /** The millisecond in the second. */ + public readonly millisecond: number; + /** The IANA time zone identifier that this date and time is represented in. */ + public readonly timeZone: string; + /** The UTC offset for this time, in milliseconds. */ + public readonly offset: number; + + constructor( + year: number, + month: number, + day: number, + timeZone: string, + offset: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + era: string, + year: number, + month: number, + day: number, + timeZone: string, + offset: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + calendar: Calendar, + year: number, + month: number, + day: number, + timeZone: string, + offset: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor( + calendar: Calendar, + era: string, + year: number, + month: number, + day: number, + timeZone: string, + offset: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number + ); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + let timeZone = args.shift(); + let offset = args.shift(); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + this.timeZone = timeZone; + this.offset = offset; + this.hour = args.shift() || 0; + this.minute = args.shift() || 0; + this.second = args.shift() || 0; + this.millisecond = args.shift() || 0; + + constrain(this); + } + + /** Returns a copy of this date. */ + copy(): ZonedDateTime { + if (this.era) { + return new ZonedDateTime( + this.calendar, + this.era, + this.year, + this.month, + this.day, + this.timeZone, + this.offset, + this.hour, + this.minute, + this.second, + this.millisecond + ); + } else { + return new ZonedDateTime( + this.calendar, + this.year, + this.month, + this.day, + this.timeZone, + this.offset, + this.hour, + this.minute, + this.second, + this.millisecond + ); + } + } + + /** Returns a new `ZonedDateTime` with the given duration added to it. */ + add(duration: DateTimeDuration): ZonedDateTime { + return addZoned(this, duration); + } + + /** Returns a new `ZonedDateTime` with the given duration subtracted from it. */ + subtract(duration: DateTimeDuration): ZonedDateTime { + return subtractZoned(this, duration); + } + + /** + * Returns a new `ZonedDateTime` with the given fields set to the provided values. Other fields + * will be constrained accordingly. + */ + set(fields: DateFields & TimeFields, disambiguation?: Disambiguation): ZonedDateTime { + return setZoned(this, fields, disambiguation); + } + + /** + * Returns a new `ZonedDateTime` with the given field adjusted by a specified amount. + * When the resulting value reaches the limits of the field, it wraps around. + */ + cycle(field: DateField | TimeField, amount: number, options?: CycleTimeOptions): ZonedDateTime { + return cycleZoned(this, field, amount, options); + } + + /** Converts the date to a native JavaScript Date object. */ + toDate(): Date { + return zonedToDate(this); + } + + /** + * Converts the date to an ISO 8601 formatted string, including the UTC offset and time zone + * identifier. + */ + toString(): string { + return zonedDateTimeToString(this); + } + + /** Converts the date to an ISO 8601 formatted string in UTC. */ + toAbsoluteString(): string { + return this.toDate().toISOString(); + } + + /** + * Compares this date with another. A negative result indicates that this date is before the given + * one, and a positive date indicates that it is after. + */ + compare(b: CalendarDate | CalendarDateTime | ZonedDateTime): number { + // TODO: Is this a bad idea?? + return this.toDate().getTime() - toZoned(b, this.timeZone).toDate().getTime(); + } +} diff --git a/website/node_modules/@internationalized/date/src/DateFormatter.ts b/website/node_modules/@internationalized/date/src/DateFormatter.ts new file mode 100644 index 0000000..ad93301 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/DateFormatter.ts @@ -0,0 +1,218 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +let formatterCache = new Map(); + +interface DateRangeFormatPart extends Intl.DateTimeFormatPart { + source: 'startRange' | 'endRange' | 'shared'; +} + +/** A wrapper around Intl.DateTimeFormat that fixes various browser bugs, and polyfills new features. */ +export class DateFormatter implements Intl.DateTimeFormat { + private formatter: Intl.DateTimeFormat; + private options: Intl.DateTimeFormatOptions; + private resolvedHourCycle: Intl.DateTimeFormatOptions['hourCycle']; + + constructor(locale: string, options: Intl.DateTimeFormatOptions = {}) { + this.formatter = getCachedDateFormatter(locale, options); + this.options = options; + } + + /** + * Formats a date as a string according to the locale and format options passed to the + * constructor. + */ + format(value: Date): string { + return this.formatter.format(value); + } + + /** Formats a date to an array of parts such as separators, numbers, punctuation, and more. */ + formatToParts(value: Date): Intl.DateTimeFormatPart[] { + return this.formatter.formatToParts(value); + } + + /** Formats a date range as a string. */ + formatRange(start: Date, end: Date): string { + // @ts-ignore + if (typeof this.formatter.formatRange === 'function') { + // @ts-ignore + return this.formatter.formatRange(start, end); + } + + if (end < start) { + throw new RangeError('End date must be >= start date'); + } + + // Very basic fallback for old browsers. + return `${this.formatter.format(start)} – ${this.formatter.format(end)}`; + } + + /** Formats a date range as an array of parts. */ + formatRangeToParts(start: Date, end: Date): DateRangeFormatPart[] { + // @ts-ignore + if (typeof this.formatter.formatRangeToParts === 'function') { + // @ts-ignore + return this.formatter.formatRangeToParts(start, end); + } + + if (end < start) { + throw new RangeError('End date must be >= start date'); + } + + let startParts = this.formatter.formatToParts(start); + let endParts = this.formatter.formatToParts(end); + return [ + ...startParts.map(p => ({...p, source: 'startRange'}) as DateRangeFormatPart), + {type: 'literal', value: ' – ', source: 'shared'}, + ...endParts.map(p => ({...p, source: 'endRange'}) as DateRangeFormatPart) + ]; + } + + /** Returns the resolved formatting options based on the values passed to the constructor. */ + resolvedOptions(): Intl.ResolvedDateTimeFormatOptions { + let resolvedOptions = this.formatter.resolvedOptions(); + if (hasBuggyResolvedHourCycle()) { + if (!this.resolvedHourCycle) { + this.resolvedHourCycle = getResolvedHourCycle(resolvedOptions.locale, this.options); + } + resolvedOptions.hourCycle = this.resolvedHourCycle; + resolvedOptions.hour12 = this.resolvedHourCycle === 'h11' || this.resolvedHourCycle === 'h12'; + } + + // Safari uses a different name for the Ethiopic (Amete Alem) calendar. + // https://bugs.webkit.org/show_bug.cgi?id=241564 + if (resolvedOptions.calendar === 'ethiopic-amete-alem') { + resolvedOptions.calendar = 'ethioaa'; + } + + return resolvedOptions; + } +} + +// There are multiple bugs involving the hour12 and hourCycle options in various browser engines. +// - Chrome [1] (and the ECMA 402 spec [2]) resolve hour12: false in English and other locales to h24 (24:00 - 23:59) +// rather than h23 (00:00 - 23:59). Same can happen with hour12: true in French, which Chrome resolves to h11 (00:00 - 11:59) +// rather than h12 (12:00 - 11:59). +// - WebKit returns an incorrect hourCycle resolved option in the French locale due to incorrect parsing of 'h' literal +// in the resolved pattern. It also formats incorrectly when specifying the hourCycle option for the same reason. [3] +// [1] https://bugs.chromium.org/p/chromium/issues/detail?id=1045791 +// [2] https://github.com/tc39/ecma402/issues/402 +// [3] https://bugs.webkit.org/show_bug.cgi?id=229313 + +// https://github.com/unicode-org/cldr/blob/018b55eff7ceb389c7e3fc44e2f657eae3b10b38/common/supplemental/supplementalData.xml#L4774-L4802 +const hour12Preferences = { + true: { + // Only Japanese uses the h11 style for 12 hour time. All others use h12. + ja: 'h11' + }, + false: { + // All locales use h23 for 24 hour time. None use h24. + } +}; + +function getCachedDateFormatter( + locale: string, + options: Intl.DateTimeFormatOptions = {} +): Intl.DateTimeFormat { + // Work around buggy hour12 behavior in Chrome / ECMA 402 spec by using hourCycle instead. + // Only apply the workaround if the issue is detected, because the hourCycle option is buggy in Safari. + if (typeof options.hour12 === 'boolean' && hasBuggyHour12Behavior()) { + options = {...options}; + let pref = hour12Preferences[String(options.hour12)][locale.split('-')[0]]; + let defaultHourCycle = options.hour12 ? 'h12' : 'h23'; + options.hourCycle = pref ?? defaultHourCycle; + delete options.hour12; + } + + let cacheKey = + locale + + (options + ? Object.entries(options) + .sort((a, b) => (a[0] < b[0] ? -1 : 1)) + .join() + : ''); + if (formatterCache.has(cacheKey)) { + return formatterCache.get(cacheKey)!; + } + + let numberFormatter = new Intl.DateTimeFormat(locale, options); + formatterCache.set(cacheKey, numberFormatter); + return numberFormatter; +} + +let _hasBuggyHour12Behavior: boolean | null = null; +function hasBuggyHour12Behavior() { + if (_hasBuggyHour12Behavior == null) { + _hasBuggyHour12Behavior = + new Intl.DateTimeFormat('en-US', { + hour: 'numeric', + hour12: false + }).format(new Date(2020, 2, 3, 0)) === '24'; + } + + return _hasBuggyHour12Behavior; +} + +let _hasBuggyResolvedHourCycle: boolean | null = null; +function hasBuggyResolvedHourCycle() { + if (_hasBuggyResolvedHourCycle == null) { + _hasBuggyResolvedHourCycle = + new Intl.DateTimeFormat('fr', { + hour: 'numeric', + hour12: false + }).resolvedOptions().hourCycle === 'h12'; + } + + return _hasBuggyResolvedHourCycle; +} + +function getResolvedHourCycle(locale: string, options: Intl.DateTimeFormatOptions) { + if (!options.timeStyle && !options.hour) { + return undefined; + } + + // Work around buggy results in resolved hourCycle and hour12 options in WebKit. + // Format the minimum possible hour and maximum possible hour in a day and parse the results. + locale = locale.replace(/(-u-)?-nu-[a-zA-Z0-9]+/, ''); + locale += (locale.includes('-u-') ? '' : '-u') + '-nu-latn'; + let formatter = getCachedDateFormatter(locale, { + ...options, + timeZone: undefined // use local timezone + }); + + let min = parseInt( + formatter.formatToParts(new Date(2020, 2, 3, 0)).find(p => p.type === 'hour')!.value, + 10 + ); + let max = parseInt( + formatter.formatToParts(new Date(2020, 2, 3, 23)).find(p => p.type === 'hour')!.value, + 10 + ); + + if (min === 0 && max === 23) { + return 'h23'; + } + + if (min === 24 && max === 23) { + return 'h24'; + } + + if (min === 0 && max === 11) { + return 'h11'; + } + + if (min === 12 && max === 11) { + return 'h12'; + } + + throw new Error('Unexpected hour cycle result'); +} diff --git a/website/node_modules/@internationalized/date/src/calendars/BuddhistCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/BuddhistCalendar.ts new file mode 100644 index 0000000..df1a79a --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/BuddhistCalendar.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; + +const BUDDHIST_ERA_START = -543; + +/** + * The Buddhist calendar is the same as the Gregorian calendar, but counts years + * starting from the birth of Buddha in 543 BC (Gregorian). It supports only one + * era, identified as 'BE'. + */ +export class BuddhistCalendar extends GregorianCalendar { + identifier: CalendarIdentifier = 'buddhist'; + + fromJulianDay(jd: number): CalendarDate { + let gregorianDate = super.fromJulianDay(jd); + let year = getExtendedYear(gregorianDate.era, gregorianDate.year); + return new CalendarDate( + this, + year - BUDDHIST_ERA_START, + gregorianDate.month, + gregorianDate.day + ); + } + + toJulianDay(date: AnyCalendarDate): number { + return super.toJulianDay(toGregorian(date)); + } + + getEras(): string[] { + return ['BE']; + } + + getDaysInMonth(date: AnyCalendarDate): number { + return super.getDaysInMonth(toGregorian(date)); + } + + balanceDate(): void {} +} + +function toGregorian(date: AnyCalendarDate) { + let [era, year] = fromExtendedYear(date.year + BUDDHIST_ERA_START); + return new CalendarDate(era, year, date.month, date.day); +} diff --git a/website/node_modules/@internationalized/date/src/calendars/EthiopicCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/EthiopicCalendar.ts new file mode 100644 index 0000000..5169328 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/EthiopicCalendar.ts @@ -0,0 +1,205 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {Mutable} from '../utils'; + +const ETHIOPIC_EPOCH = 1723856; +const COPTIC_EPOCH = 1824665; + +// The delta between Amete Alem 1 and Amete Mihret 1 +// AA 5501 = AM 1 +const AMETE_MIHRET_DELTA = 5500; + +function ceToJulianDay(epoch: number, year: number, month: number, day: number): number { + return ( + epoch + // difference from Julian epoch to 1,1,1 + 365 * year + // number of days from years + Math.floor(year / 4) + // extra day of leap year + 30 * (month - 1) + // number of days from months (1 based) + day - + 1 // number of days for present month (1 based) + ); +} + +function julianDayToCE(epoch: number, jd: number) { + let year = Math.floor((4 * (jd - epoch)) / 1461); + let month = 1 + Math.floor((jd - ceToJulianDay(epoch, year, 1, 1)) / 30); + let day = jd + 1 - ceToJulianDay(epoch, year, month, 1); + return [year, month, day]; +} + +function getLeapDay(year: number) { + return Math.floor((year % 4) / 3); +} + +function getDaysInMonth(year: number, month: number) { + // The Ethiopian and Coptic calendars have 13 months, 12 of 30 days each and + // an intercalary month at the end of the year of 5 or 6 days, depending whether + // the year is a leap year or not. The Leap Year follows the same rules as the + // Julian Calendar so that the extra month always has six days in the year before + // a Julian Leap Year. + if (month % 13 !== 0) { + // not intercalary month + return 30; + } else { + // intercalary month 5 days + possible leap day + return getLeapDay(year) + 5; + } +} + +/** + * The Ethiopic calendar system is the official calendar used in Ethiopia. + * It includes 12 months of 30 days each, plus 5 or 6 intercalary days depending + * on whether it is a leap year. Two eras are supported: 'AA' and 'AM'. + */ +export class EthiopicCalendar implements Calendar { + identifier: CalendarIdentifier = 'ethiopic'; + + fromJulianDay(jd: number): CalendarDate { + let [year, month, day] = julianDayToCE(ETHIOPIC_EPOCH, jd); + let era = 'AM'; + if (year <= 0) { + era = 'AA'; + year += AMETE_MIHRET_DELTA; + } + + return new CalendarDate(this, era, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + let year = date.year; + if (date.era === 'AA') { + year -= AMETE_MIHRET_DELTA; + } + + return ceToJulianDay(ETHIOPIC_EPOCH, year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + return getDaysInMonth(date.year, date.month); + } + + getMonthsInYear(): number { + return 13; + } + + getDaysInYear(date: AnyCalendarDate): number { + return 365 + getLeapDay(date.year); + } + + getMaximumMonthsInYear(): number { + return 13; + } + + getMaximumDaysInMonth(): number { + return 30; + } + + getYearsInEra(date: AnyCalendarDate): number { + // 9999-12-31 gregorian is 9992-20-02 ethiopic. + // Round down to 9991 for the last full year. + // AA 9999-01-01 ethiopic is 4506-09-30 gregorian. + return date.era === 'AA' ? 9999 : 9991; + } + + getEras(): string[] { + return ['AA', 'AM']; + } +} + +/** + * The Ethiopic (Amete Alem) calendar is the same as the modern Ethiopic calendar, + * except years were measured from a different epoch. Only one era is supported: 'AA'. + */ +export class EthiopicAmeteAlemCalendar extends EthiopicCalendar { + identifier: CalendarIdentifier = 'ethioaa'; // also known as 'ethiopic-amete-alem' in ICU + + fromJulianDay(jd: number): CalendarDate { + let [year, month, day] = julianDayToCE(ETHIOPIC_EPOCH, jd); + year += AMETE_MIHRET_DELTA; + return new CalendarDate(this, 'AA', year, month, day); + } + + getEras(): string[] { + return ['AA']; + } + + getYearsInEra(): number { + // 9999-13-04 ethioaa is the maximum date, which is equivalent to 4506-09-29 gregorian. + return 9999; + } +} + +/** + * The Coptic calendar is similar to the Ethiopic calendar. + * It includes 12 months of 30 days each, plus 5 or 6 intercalary days depending + * on whether it is a leap year. Two eras are supported: 'BCE' and 'CE'. + */ +export class CopticCalendar extends EthiopicCalendar { + identifier: CalendarIdentifier = 'coptic'; + + fromJulianDay(jd: number): CalendarDate { + let [year, month, day] = julianDayToCE(COPTIC_EPOCH, jd); + let era = 'CE'; + if (year <= 0) { + era = 'BCE'; + year = 1 - year; + } + + return new CalendarDate(this, era, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + let year = date.year; + if (date.era === 'BCE') { + year = 1 - year; + } + + return ceToJulianDay(COPTIC_EPOCH, year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let year = date.year; + if (date.era === 'BCE') { + year = 1 - year; + } + + return getDaysInMonth(year, date.month); + } + + isInverseEra(date: AnyCalendarDate): boolean { + return date.era === 'BCE'; + } + + balanceDate(date: Mutable): void { + if (date.year <= 0) { + date.era = date.era === 'BCE' ? 'CE' : 'BCE'; + date.year = 1 - date.year; + } + } + + getEras(): string[] { + return ['BCE', 'CE']; + } + + getYearsInEra(date: AnyCalendarDate): number { + // 9999-12-30 gregorian is 9716-02-20 coptic. + // Round down to 9715 for the last full year. + // BCE 9999-01-01 coptic is BC 9716-06-15 gregorian. + return date.era === 'BCE' ? 9999 : 9715; + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/GregorianCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/GregorianCalendar.ts new file mode 100644 index 0000000..ff9a685 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/GregorianCalendar.ts @@ -0,0 +1,150 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod, Mutable} from '../utils'; + +const EPOCH = 1721426; // 001/01/03 Julian C.E. +export function gregorianToJulianDay( + era: string, + year: number, + month: number, + day: number +): number { + year = getExtendedYear(era, year); + + let y1 = year - 1; + let monthOffset = -2; + if (month <= 2) { + monthOffset = 0; + } else if (isLeapYear(year)) { + monthOffset = -1; + } + + return ( + EPOCH - + 1 + + 365 * y1 + + Math.floor(y1 / 4) - + Math.floor(y1 / 100) + + Math.floor(y1 / 400) + + Math.floor((367 * month - 362) / 12 + monthOffset + day) + ); +} + +export function isLeapYear(year: number): boolean { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + +export function getExtendedYear(era: string, year: number): number { + return era === 'BC' ? 1 - year : year; +} + +export function fromExtendedYear(year: number): [string, number] { + let era = 'AD'; + if (year <= 0) { + era = 'BC'; + year = 1 - year; + } + + return [era, year]; +} + +const daysInMonth = { + standard: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + leapyear: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] +}; + +/** + * The Gregorian calendar is the most commonly used calendar system in the world. It supports two + * eras: BC, and AD. Years always contain 12 months, and 365 or 366 days depending on whether it is + * a leap year. + */ +export class GregorianCalendar implements Calendar { + identifier: CalendarIdentifier = 'gregory'; + + fromJulianDay(jd: number): CalendarDate { + let jd0 = jd; + let depoch = jd0 - EPOCH; + let quadricent = Math.floor(depoch / 146097); + let dqc = mod(depoch, 146097); + let cent = Math.floor(dqc / 36524); + let dcent = mod(dqc, 36524); + let quad = Math.floor(dcent / 1461); + let dquad = mod(dcent, 1461); + let yindex = Math.floor(dquad / 365); + + let extendedYear = + quadricent * 400 + cent * 100 + quad * 4 + yindex + (cent !== 4 && yindex !== 4 ? 1 : 0); + let [era, year] = fromExtendedYear(extendedYear); + let yearDay = jd0 - gregorianToJulianDay(era, year, 1, 1); + let leapAdj = 2; + if (jd0 < gregorianToJulianDay(era, year, 3, 1)) { + leapAdj = 0; + } else if (isLeapYear(year)) { + leapAdj = 1; + } + let month = Math.floor(((yearDay + leapAdj) * 12 + 373) / 367); + let day = jd0 - gregorianToJulianDay(era, year, month, 1) + 1; + + return new CalendarDate(era, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + return gregorianToJulianDay(date.era, date.year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + return daysInMonth[isLeapYear(date.year) ? 'leapyear' : 'standard'][date.month - 1]; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getMonthsInYear(date: AnyCalendarDate): number { + return 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 366 : 365; + } + + getMaximumMonthsInYear(): number { + return 12; + } + + getMaximumDaysInMonth(): number { + return 31; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getYearsInEra(date: AnyCalendarDate): number { + return 9999; + } + + getEras(): string[] { + return ['BC', 'AD']; + } + + isInverseEra(date: AnyCalendarDate): boolean { + return date.era === 'BC'; + } + + balanceDate(date: Mutable): void { + if (date.year <= 0) { + date.era = date.era === 'BC' ? 'AD' : 'BC'; + date.year = 1 - date.year; + } + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/HebrewCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/HebrewCalendar.ts new file mode 100644 index 0000000..407b76f --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/HebrewCalendar.ts @@ -0,0 +1,214 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod, Mutable} from '../utils'; + +const HEBREW_EPOCH = 347997; + +// Hebrew date calculations are performed in terms of days, hours, and +// "parts" (or halakim), which are 1/1080 of an hour, or 3 1/3 seconds. +const HOUR_PARTS = 1080; +const DAY_PARTS = 24 * HOUR_PARTS; + +// An approximate value for the length of a lunar month. +// It is used to calculate the approximate year and month of a given +// absolute date. +const MONTH_DAYS = 29; +const MONTH_FRACT = 12 * HOUR_PARTS + 793; +const MONTH_PARTS = MONTH_DAYS * DAY_PARTS + MONTH_FRACT; + +function isLeapYear(year: number) { + return mod(year * 7 + 1, 19) < 7; +} + +// Test for delay of start of new year and to avoid +// Sunday, Wednesday, and Friday as start of the new year. +function hebrewDelay1(year: number) { + let months = Math.floor((235 * year - 234) / 19); + let parts = 12084 + 13753 * months; + let day = months * 29 + Math.floor(parts / 25920); + + if (mod(3 * (day + 1), 7) < 3) { + day += 1; + } + + return day; +} + +// Check for delay in start of new year due to length of adjacent years +function hebrewDelay2(year: number) { + let last = hebrewDelay1(year - 1); + let present = hebrewDelay1(year); + let next = hebrewDelay1(year + 1); + + if (next - present === 356) { + return 2; + } + + if (present - last === 382) { + return 1; + } + + return 0; +} + +function startOfYear(year: number) { + return hebrewDelay1(year) + hebrewDelay2(year); +} + +function getDaysInYear(year: number) { + return startOfYear(year + 1) - startOfYear(year); +} + +function getYearType(year: number) { + let yearLength = getDaysInYear(year); + + if (yearLength > 380) { + yearLength -= 30; // Subtract length of leap month. + } + + switch (yearLength) { + case 353: + return 0; // deficient + case 354: + return 1; // normal + case 355: + return 2; // complete + } +} + +function getDaysInMonth(year: number, month: number): number { + // Normalize month numbers from 1 - 13, even on non-leap years + if (month >= 6 && !isLeapYear(year)) { + month++; + } + + // First of all, dispose of fixed-length 29 day months + if (month === 4 || month === 7 || month === 9 || month === 11 || month === 13) { + return 29; + } + + let yearType = getYearType(year); + + // If it's Heshvan, days depend on length of year + if (month === 2) { + return yearType === 2 ? 30 : 29; + } + + // Similarly, Kislev varies with the length of year + if (month === 3) { + return yearType === 0 ? 29 : 30; + } + + // Adar I only exists in leap years + if (month === 6) { + return isLeapYear(year) ? 30 : 0; + } + + return 30; +} + +/** + * The Hebrew calendar is used in Israel and around the world by the Jewish faith. + * Years include either 12 or 13 months depending on whether it is a leap year. + * In leap years, an extra month is inserted at month 6. + */ +export class HebrewCalendar implements Calendar { + identifier: CalendarIdentifier = 'hebrew'; + + fromJulianDay(jd: number): CalendarDate { + let d = jd - HEBREW_EPOCH; + let m = (d * DAY_PARTS) / MONTH_PARTS; // Months (approx) + let year = Math.floor((19 * m + 234) / 235) + 1; // Years (approx) + let ys = startOfYear(year); // 1st day of year + let dayOfYear = Math.floor(d - ys); + + // Because of the postponement rules, it's possible to guess wrong. Fix it. + while (dayOfYear < 1) { + year--; + ys = startOfYear(year); + dayOfYear = Math.floor(d - ys); + } + + // Now figure out which month we're in, and the date within that month + let month = 1; + let monthStart = 0; + while (monthStart < dayOfYear) { + monthStart += getDaysInMonth(year, month); + month++; + } + + month--; + monthStart -= getDaysInMonth(year, month); + + let day = dayOfYear - monthStart; + return new CalendarDate(this, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + let jd = startOfYear(date.year); + for (let month = 1; month < date.month; month++) { + jd += getDaysInMonth(date.year, month); + } + + return jd + date.day + HEBREW_EPOCH; + } + + getDaysInMonth(date: AnyCalendarDate): number { + return getDaysInMonth(date.year, date.month); + } + + getMonthsInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 13 : 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return getDaysInYear(date.year); + } + + getMaximumMonthsInYear(): number { + return 13; + } + + getMaximumDaysInMonth(): number { + return 30; + } + + getYearsInEra(): number { + // 6239 gregorian + return 9999; + } + + getEras(): string[] { + return ['AM']; + } + + balanceYearMonth(date: Mutable, previousDate: AnyCalendarDate): void { + // Keep date in the same month when switching between leap years and non leap years + if (previousDate.year !== date.year) { + if (isLeapYear(previousDate.year) && !isLeapYear(date.year) && previousDate.month > 6) { + date.month--; + } else if ( + !isLeapYear(previousDate.year) && + isLeapYear(date.year) && + previousDate.month > 6 + ) { + date.month++; + } + } + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/IndianCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/IndianCalendar.ts new file mode 100644 index 0000000..b5e1370 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/IndianCalendar.ts @@ -0,0 +1,134 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import { + fromExtendedYear, + GregorianCalendar, + gregorianToJulianDay, + isLeapYear +} from './GregorianCalendar'; + +// Starts in 78 AD, +const INDIAN_ERA_START = 78; + +// The Indian year starts 80 days later than the Gregorian year. +const INDIAN_YEAR_START = 80; + +/** + * The Indian National Calendar is similar to the Gregorian calendar, but with + * years numbered since the Saka era in 78 AD (Gregorian). There are 12 months + * in each year, with either 30 or 31 days. Only one era identifier is supported: 'saka'. + */ +export class IndianCalendar extends GregorianCalendar { + identifier: CalendarIdentifier = 'indian'; + + fromJulianDay(jd: number): CalendarDate { + // Gregorian date for Julian day + let date = super.fromJulianDay(jd); + + // Year in Saka era + let indianYear = date.year - INDIAN_ERA_START; + + // Day number in Gregorian year (starting from 0) + let yDay = jd - gregorianToJulianDay(date.era, date.year, 1, 1); + + let leapMonth: number; + if (yDay < INDIAN_YEAR_START) { + // Day is at the end of the preceding Saka year + indianYear--; + + // Days in leapMonth this year, previous Gregorian year + leapMonth = isLeapYear(date.year - 1) ? 31 : 30; + yDay += leapMonth + 31 * 5 + 30 * 3 + 10; + } else { + // Days in leapMonth this year + leapMonth = isLeapYear(date.year) ? 31 : 30; + yDay -= INDIAN_YEAR_START; + } + + let indianMonth: number; + let indianDay: number; + if (yDay < leapMonth) { + indianMonth = 1; + indianDay = yDay + 1; + } else { + let mDay = yDay - leapMonth; + if (mDay < 31 * 5) { + indianMonth = Math.floor(mDay / 31) + 2; + indianDay = (mDay % 31) + 1; + } else { + mDay -= 31 * 5; + indianMonth = Math.floor(mDay / 30) + 7; + indianDay = (mDay % 30) + 1; + } + } + + return new CalendarDate(this, indianYear, indianMonth, indianDay); + } + + toJulianDay(date: AnyCalendarDate): number { + let extendedYear = date.year + INDIAN_ERA_START; + let [era, year] = fromExtendedYear(extendedYear); + + let leapMonth: number; + let jd: number; + if (isLeapYear(year)) { + leapMonth = 31; + jd = gregorianToJulianDay(era, year, 3, 21); + } else { + leapMonth = 30; + jd = gregorianToJulianDay(era, year, 3, 22); + } + + if (date.month === 1) { + return jd + date.day - 1; + } + + jd += leapMonth + Math.min(date.month - 2, 5) * 31; + + if (date.month >= 8) { + jd += (date.month - 7) * 30; + } + + jd += date.day - 1; + return jd; + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.month === 1 && isLeapYear(date.year + INDIAN_ERA_START)) { + return 31; + } + + if (date.month >= 2 && date.month <= 6) { + return 31; + } + + return 30; + } + + getYearsInEra(): number { + // 9999-12-31 gregorian is 9920-10-10 indian. + // Round down to 9919 for the last full year. + return 9919; + } + + getEras(): string[] { + return ['saka']; + } + + balanceDate(): void {} +} diff --git a/website/node_modules/@internationalized/date/src/calendars/IslamicCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/IslamicCalendar.ts new file mode 100644 index 0000000..d664ff6 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/IslamicCalendar.ts @@ -0,0 +1,248 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; + +const CIVIL_EPOC = 1948440; // CE 622 July 16 Friday (Julian calendar) / CE 622 July 19 (Gregorian calendar) +const ASTRONOMICAL_EPOC = 1948439; // CE 622 July 15 Thursday (Julian calendar) +const UMALQURA_YEAR_START = 1300; +const UMALQURA_YEAR_END = 1600; +const UMALQURA_START_DAYS = 460322; + +function islamicToJulianDay(epoch: number, year: number, month: number, day: number): number { + return ( + day + + Math.ceil(29.5 * (month - 1)) + + (year - 1) * 354 + + Math.floor((3 + 11 * year) / 30) + + epoch - + 1 + ); +} + +function julianDayToIslamic(calendar: Calendar, epoch: number, jd: number) { + let year = Math.floor((30 * (jd - epoch) + 10646) / 10631); + let month = Math.min( + 12, + Math.ceil((jd - (29 + islamicToJulianDay(epoch, year, 1, 1))) / 29.5) + 1 + ); + let day = jd - islamicToJulianDay(epoch, year, month, 1) + 1; + + return new CalendarDate(calendar, year, month, day); +} + +function isLeapYear(year: number): boolean { + return (14 + 11 * year) % 30 < 11; +} + +/** + * The Islamic calendar, also known as the "Hijri" calendar, is used throughout much of the Arab + * world. The civil variant uses simple arithmetic rules rather than astronomical calculations to + * approximate the traditional calendar, which is based on sighting of the crescent moon. It uses + * Friday, July 16 622 CE (Julian) as the epoch. Each year has 12 months, with either 354 or 355 + * days depending on whether it is a leap year. Learn more about the available Islamic calendars + * [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). + */ +export class IslamicCivilCalendar implements Calendar { + identifier: CalendarIdentifier = 'islamic-civil'; + + fromJulianDay(jd: number): CalendarDate { + return julianDayToIslamic(this, CIVIL_EPOC, jd); + } + + toJulianDay(date: AnyCalendarDate): number { + return islamicToJulianDay(CIVIL_EPOC, date.year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let length = 29 + (date.month % 2); + if (date.month === 12 && isLeapYear(date.year)) { + length++; + } + + return length; + } + + getMonthsInYear(): number { + return 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 355 : 354; + } + + getMaximumMonthsInYear(): number { + return 12; + } + + getMaximumDaysInMonth(): number { + return 30; + } + + getYearsInEra(): number { + // 9999 gregorian + return 9665; + } + + getEras(): string[] { + return ['AH']; + } +} + +/** + * The Islamic calendar, also known as the "Hijri" calendar, is used throughout much of the Arab + * world. The tabular variant uses simple arithmetic rules rather than astronomical calculations to + * approximate the traditional calendar, which is based on sighting of the crescent moon. It uses + * Thursday, July 15 622 CE (Julian) as the epoch. Each year has 12 months, with either 354 or 355 + * days depending on whether it is a leap year. Learn more about the available Islamic calendars + * [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). + */ +export class IslamicTabularCalendar extends IslamicCivilCalendar { + identifier: CalendarIdentifier = 'islamic-tbla'; + + fromJulianDay(jd: number): CalendarDate { + return julianDayToIslamic(this, ASTRONOMICAL_EPOC, jd); + } + + toJulianDay(date: AnyCalendarDate): number { + return islamicToJulianDay(ASTRONOMICAL_EPOC, date.year, date.month, date.day); + } +} + +// Generated by scripts/generate-umalqura.js +const UMALQURA_DATA = + 'qgpUDckO1AbqBmwDrQpVBakGkgepC9QF2gpcBS0NlQZKB1QLagutBa4ETwoXBYsGpQbVCtYCWwmdBE0KJg2VDawFtgm6AlsKKwWVCsoG6Qr0AnYJtgJWCcoKpAvSC9kF3AJtCU0FpQpSC6ULtAW2CVcFlwJLBaMGUgdlC2oFqworBZUMSg2lDcoF1gpXCasESwmlClILagt1BXYCtwhbBFUFqQW0BdoJ3QRuAjYJqgpUDbIN1QXaAlsJqwRVCkkLZAtxC7QFtQpVCiUNkg7JDtQG6QprCasEkwpJDaQNsg25CroEWworBZUKKgtVC1wFvQQ9Ah0JlQpKC1oLbQW2AjsJmwRVBqkGVAdqC2wFrQpVBSkLkgupC9QF2gpaBasKlQVJB2QHqgu1BbYCVgpNDiULUgtqC60FrgIvCZcESwalBqwG1gpdBZ0ETQoWDZUNqgW1BdoCWwmtBJUFygbkBuoK9QS2AlYJqgpUC9IL2QXqAm0JrQSVCkoLpQuyBbUJ1gSXCkcFkwZJB1ULagVrCisFiwpGDaMNygXWCtsEawJLCaUKUgtpC3UFdgG3CFsCKwVlBbQF2gntBG0BtgimClINqQ3UBdoKWwmrBFMGKQdiB6kLsgW1ClUFJQuSDckO0gbpCmsFqwRVCikNVA2qDbUJugQ7CpsETQqqCtUK2gJdCV4ELgqaDFUNsga5BroEXQotBZUKUguoC7QLuQXaAloJSgukDdEO6AZqC20FNQWVBkoNqA3UDdoGWwWdAisGFQtKC5ULqgWuCi4JjwwnBZUGqgbWCl0FnQI='; +let UMALQURA_MONTHLENGTH: Uint16Array; +let UMALQURA_YEAR_START_TABLE: Uint32Array; + +function umalquraYearStart(year: number): number { + return UMALQURA_START_DAYS + UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START]; +} + +function umalquraMonthLength(year: number, month: number): number { + let idx = year - UMALQURA_YEAR_START; + let mask = 0x01 << (11 - (month - 1)); + if ((UMALQURA_MONTHLENGTH[idx] & mask) === 0) { + return 29; + } else { + return 30; + } +} + +function umalquraMonthStart(year: number, month: number): number { + let day = umalquraYearStart(year); + for (let i = 1; i < month; i++) { + day += umalquraMonthLength(year, i); + } + return day; +} + +function umalquraYearLength(year: number): number { + return ( + UMALQURA_YEAR_START_TABLE[year + 1 - UMALQURA_YEAR_START] - + UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START] + ); +} + +/** + * The Islamic calendar, also known as the "Hijri" calendar, is used throughout much of the Arab + * world. The Umalqura variant is primarily used in Saudi Arabia. It is a lunar calendar, based on + * astronomical calculations that predict the sighting of a crescent moon. Month and year lengths + * vary between years depending on these calculations. Learn more about the available Islamic + * calendars + * [here](https://cldr.unicode.org/development/development-process/design-proposals/islamic-calendar-types). + */ +export class IslamicUmalquraCalendar extends IslamicCivilCalendar { + identifier: CalendarIdentifier = 'islamic-umalqura'; + + constructor() { + super(); + if (!UMALQURA_MONTHLENGTH) { + UMALQURA_MONTHLENGTH = new Uint16Array( + Uint8Array.from(atob(UMALQURA_DATA), c => c.charCodeAt(0)).buffer + ); + } + + if (!UMALQURA_YEAR_START_TABLE) { + UMALQURA_YEAR_START_TABLE = new Uint32Array(UMALQURA_YEAR_END - UMALQURA_YEAR_START + 1); + + let yearStart = 0; + for (let year = UMALQURA_YEAR_START; year <= UMALQURA_YEAR_END; year++) { + UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START] = yearStart; + for (let i = 1; i <= 12; i++) { + yearStart += umalquraMonthLength(year, i); + } + } + } + } + + fromJulianDay(jd: number): CalendarDate { + let days = jd - CIVIL_EPOC; + let startDays = umalquraYearStart(UMALQURA_YEAR_START); + let endDays = umalquraYearStart(UMALQURA_YEAR_END); + if (days < startDays || days > endDays) { + return super.fromJulianDay(jd); + } else { + let y = UMALQURA_YEAR_START - 1; + let m = 1; + let d = 1; + while (d > 0) { + y++; + d = days - umalquraYearStart(y) + 1; + let yearLength = umalquraYearLength(y); + if (d === yearLength) { + m = 12; + break; + } else if (d < yearLength) { + let monthLength = umalquraMonthLength(y, m); + m = 1; + while (d > monthLength) { + d -= monthLength; + m++; + monthLength = umalquraMonthLength(y, m); + } + break; + } + } + + return new CalendarDate(this, y, m, days - umalquraMonthStart(y, m) + 1); + } + } + + toJulianDay(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.toJulianDay(date); + } + + return CIVIL_EPOC + umalquraMonthStart(date.year, date.month) + (date.day - 1); + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.getDaysInMonth(date); + } + + return umalquraMonthLength(date.year, date.month); + } + + getDaysInYear(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.getDaysInYear(date); + } + + return umalquraYearLength(date.year); + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/JapaneseCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/JapaneseCalendar.ts new file mode 100644 index 0000000..d1cf7b4 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/JapaneseCalendar.ts @@ -0,0 +1,185 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from the TC39 Temporal proposal. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {GregorianCalendar} from './GregorianCalendar'; +import {Mutable} from '../utils'; + +const ERA_START_DATES = [ + [1868, 9, 8], + [1912, 7, 30], + [1926, 12, 25], + [1989, 1, 8], + [2019, 5, 1] +]; +const ERA_END_DATES = [ + [1912, 7, 29], + [1926, 12, 24], + [1989, 1, 7], + [2019, 4, 30] +]; +const ERA_ADDENDS = [1867, 1911, 1925, 1988, 2018]; +const ERA_NAMES = ['meiji', 'taisho', 'showa', 'heisei', 'reiwa']; + +function findEraFromGregorianDate(date: AnyCalendarDate) { + const idx = ERA_START_DATES.findIndex(([year, month, day]) => { + if (date.year < year) { + return true; + } + + if (date.year === year && date.month < month) { + return true; + } + + if (date.year === year && date.month === month && date.day < day) { + return true; + } + + return false; + }); + + if (idx === -1) { + return ERA_START_DATES.length - 1; + } + + if (idx === 0) { + return 0; + } + + return idx - 1; +} + +function toGregorian(date: AnyCalendarDate) { + let eraAddend = ERA_ADDENDS[ERA_NAMES.indexOf(date.era)]; + if (!eraAddend) { + throw new Error('Unknown era: ' + date.era); + } + + return new CalendarDate(date.year + eraAddend, date.month, date.day); +} + +/** + * The Japanese calendar is based on the Gregorian calendar, but with eras for the reign of each + * Japanese emperor. Whenever a new emperor ascends to the throne, a new era begins and the year + * starts again from 1. Note that eras before 1868 (Gregorian) are not currently supported by this + * implementation. + */ +export class JapaneseCalendar extends GregorianCalendar { + identifier: CalendarIdentifier = 'japanese'; + + fromJulianDay(jd: number): CalendarDate { + let date = super.fromJulianDay(jd); + let era = findEraFromGregorianDate(date); + + return new CalendarDate( + this, + ERA_NAMES[era], + date.year - ERA_ADDENDS[era], + date.month, + date.day + ); + } + + toJulianDay(date: AnyCalendarDate): number { + return super.toJulianDay(toGregorian(date)); + } + + balanceDate(date: Mutable): void { + let gregorianDate = toGregorian(date); + let era = findEraFromGregorianDate(gregorianDate); + + if (ERA_NAMES[era] !== date.era) { + date.era = ERA_NAMES[era]; + date.year = gregorianDate.year - ERA_ADDENDS[era]; + } + + // Constrain in case we went before the first supported era. + this.constrainDate(date); + } + + constrainDate(date: Mutable): void { + let idx = ERA_NAMES.indexOf(date.era); + let end = ERA_END_DATES[idx]; + if (end != null) { + let [endYear, endMonth, endDay] = end; + + // Constrain the year to the maximum possible value in the era. + // Then constrain the month and day fields within that. + let maxYear = endYear - ERA_ADDENDS[idx]; + date.year = Math.max(1, Math.min(maxYear, date.year)); + if (date.year === maxYear) { + date.month = Math.min(endMonth, date.month); + + if (date.month === endMonth) { + date.day = Math.min(endDay, date.day); + } + } + } + + if (date.year === 1 && idx >= 0) { + let [, startMonth, startDay] = ERA_START_DATES[idx]; + date.month = Math.max(startMonth, date.month); + + if (date.month === startMonth) { + date.day = Math.max(startDay, date.day); + } + } + } + + getEras(): string[] { + return ERA_NAMES; + } + + getYearsInEra(date: AnyCalendarDate): number { + // Get the number of years in the era, taking into account the date's month and day fields. + let era = ERA_NAMES.indexOf(date.era); + let cur = ERA_START_DATES[era]; + let next = ERA_START_DATES[era + 1]; + if (next == null) { + // 9999 gregorian is the maximum year allowed. + return 9999 - cur[0] + 1; + } + + let years = next[0] - cur[0]; + + if (date.month < next[1] || (date.month === next[1] && date.day < next[2])) { + years++; + } + + return years; + } + + getDaysInMonth(date: AnyCalendarDate): number { + return super.getDaysInMonth(toGregorian(date)); + } + + getMinimumMonthInYear(date: AnyCalendarDate): number { + let start = getMinimums(date); + return start ? start[1] : 1; + } + + getMinimumDayInMonth(date: AnyCalendarDate): number { + let start = getMinimums(date); + return start && date.month === start[1] ? start[2] : 1; + } +} + +function getMinimums(date: AnyCalendarDate) { + if (date.year === 1) { + let idx = ERA_NAMES.indexOf(date.era); + return ERA_START_DATES[idx]; + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/PersianCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/PersianCalendar.ts new file mode 100644 index 0000000..e89ccdc --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/PersianCalendar.ts @@ -0,0 +1,98 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod} from '../utils'; + +const PERSIAN_EPOCH = 1948320; + +// Number of days from the start of the year to the start of each month. +const MONTH_START = [ + 0, // Farvardin + 31, // Ordibehesht + 62, // Khordad + 93, // Tir + 124, // Mordad + 155, // Shahrivar + 186, // Mehr + 216, // Aban + 246, // Azar + 276, // Dey + 306, // Bahman + 336 // Esfand +]; + +/** + * The Persian calendar is the main calendar used in Iran and Afghanistan. It has 12 months + * in each year, the first 6 of which have 31 days, and the next 5 have 30 days. The 12th month + * has either 29 or 30 days depending on whether it is a leap year. The Persian year starts + * around the March equinox. + */ +export class PersianCalendar implements Calendar { + identifier: CalendarIdentifier = 'persian'; + + fromJulianDay(jd: number): CalendarDate { + let daysSinceEpoch = jd - PERSIAN_EPOCH; + let year = 1 + Math.floor((33 * daysSinceEpoch + 3) / 12053); + let farvardin1 = 365 * (year - 1) + Math.floor((8 * year + 21) / 33); + let dayOfYear = daysSinceEpoch - farvardin1; + let month = dayOfYear < 216 ? Math.floor(dayOfYear / 31) : Math.floor((dayOfYear - 6) / 30); + let day = dayOfYear - MONTH_START[month] + 1; + return new CalendarDate(this, year, month + 1, day); + } + + toJulianDay(date: AnyCalendarDate): number { + let jd = PERSIAN_EPOCH - 1 + 365 * (date.year - 1) + Math.floor((8 * date.year + 21) / 33); + jd += MONTH_START[date.month - 1]; + jd += date.day; + return jd; + } + + getMonthsInYear(): number { + return 12; + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.month <= 6) { + return 31; + } + + if (date.month <= 11) { + return 30; + } + + let isLeapYear = mod(25 * date.year + 11, 33) < 8; + return isLeapYear ? 30 : 29; + } + + getMaximumMonthsInYear(): number { + return 12; + } + + getMaximumDaysInMonth(): number { + return 31; + } + + getEras(): string[] { + return ['AP']; + } + + getYearsInEra(): number { + // 9378-10-10 persian is 9999-12-31 gregorian. + // Round down to 9377 to set the maximum full year. + return 9377; + } +} diff --git a/website/node_modules/@internationalized/date/src/calendars/TaiwanCalendar.ts b/website/node_modules/@internationalized/date/src/calendars/TaiwanCalendar.ts new file mode 100644 index 0000000..052d4c9 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/calendars/TaiwanCalendar.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, CalendarIdentifier} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; +import {Mutable} from '../utils'; + +const TAIWAN_ERA_START = 1911; + +function gregorianYear(date: AnyCalendarDate) { + return date.era === 'minguo' ? date.year + TAIWAN_ERA_START : 1 - date.year + TAIWAN_ERA_START; +} + +function gregorianToTaiwan(year: number): [string, number] { + let y = year - TAIWAN_ERA_START; + if (y > 0) { + return ['minguo', y]; + } else { + return ['before_minguo', 1 - y]; + } +} + +/** + * The Taiwanese calendar is the same as the Gregorian calendar, but years + * are numbered starting from 1912 (Gregorian). Two eras are supported: + * 'before_minguo' and 'minguo'. + */ +export class TaiwanCalendar extends GregorianCalendar { + identifier: CalendarIdentifier = 'roc'; // Republic of China + + fromJulianDay(jd: number): CalendarDate { + let date = super.fromJulianDay(jd); + let extendedYear = getExtendedYear(date.era, date.year); + let [era, year] = gregorianToTaiwan(extendedYear); + return new CalendarDate(this, era, year, date.month, date.day); + } + + toJulianDay(date: AnyCalendarDate): number { + return super.toJulianDay(toGregorian(date)); + } + + getEras(): string[] { + return ['before_minguo', 'minguo']; + } + + balanceDate(date: Mutable): void { + let [era, year] = gregorianToTaiwan(gregorianYear(date)); + date.era = era; + date.year = year; + } + + isInverseEra(date: AnyCalendarDate): boolean { + return date.era === 'before_minguo'; + } + + getDaysInMonth(date: AnyCalendarDate): number { + return super.getDaysInMonth(toGregorian(date)); + } + + getYearsInEra(date: AnyCalendarDate): number { + return date.era === 'before_minguo' ? 9999 : 9999 - TAIWAN_ERA_START; + } +} + +function toGregorian(date: AnyCalendarDate) { + let [era, year] = fromExtendedYear(gregorianYear(date)); + return new CalendarDate(era, year, date.month, date.day); +} diff --git a/website/node_modules/@internationalized/date/src/conversion.ts b/website/node_modules/@internationalized/date/src/conversion.ts new file mode 100644 index 0000000..bcc1890 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/conversion.ts @@ -0,0 +1,389 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from the TC39 Temporal proposal. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import { + AnyCalendarDate, + AnyDateTime, + AnyTime, + Calendar, + DateFields, + Disambiguation, + TimeFields +} from './types'; +import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; +import {constrain} from './manipulation'; +import {getExtendedYear, GregorianCalendar} from './calendars/GregorianCalendar'; +import {getLocalTimeZone, isEqualCalendar, isLocalTimeZoneOverridden} from './queries'; +import {Mutable} from './utils'; + +export function epochFromDate(date: AnyDateTime): number { + date = toCalendar(date, new GregorianCalendar()); + let year = getExtendedYear(date.era, date.year); + return epochFromParts( + year, + date.month, + date.day, + date.hour, + date.minute, + date.second, + date.millisecond + ); +} + +function epochFromParts( + year: number, + month: number, + day: number, + hour: number, + minute: number, + second: number, + millisecond: number +): number { + // Note: Date.UTC() interprets one and two-digit years as being in the + // 20th century, so don't use it + let date = new Date(); + date.setUTCHours(hour, minute, second, millisecond); + date.setUTCFullYear(year, month - 1, day); + return date.getTime(); +} + +export function getTimeZoneOffset(ms: number, timeZone: string): number { + // Fast path for UTC. + if (timeZone === 'UTC') { + return 0; + } + + // Fast path: for local timezone after 1970, use native Date. + // Skip this fast path if the local timezone was explicitly overridden via setLocalTimeZone, + // since native Date always uses the browser's timezone, not the overridden one. + if (ms > 0 && timeZone === getLocalTimeZone() && !isLocalTimeZoneOverridden()) { + return new Date(ms).getTimezoneOffset() * -60 * 1000; + } + + let {year, month, day, hour, minute, second} = getTimeZoneParts(ms, timeZone); + let utc = epochFromParts(year, month, day, hour, minute, second, 0); + return utc - Math.floor(ms / 1000) * 1000; +} + +const formattersByTimeZone = new Map(); + +function getTimeZoneParts(ms: number, timeZone: string) { + let formatter = formattersByTimeZone.get(timeZone); + if (!formatter) { + formatter = new Intl.DateTimeFormat('en-US', { + timeZone, + hour12: false, + era: 'short', + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }); + + formattersByTimeZone.set(timeZone, formatter); + } + + let parts = formatter.formatToParts(new Date(ms)); + let namedParts: {[name: string]: string} = {}; + for (let part of parts) { + if (part.type !== 'literal') { + namedParts[part.type] = part.value; + } + } + + return { + // Firefox returns B instead of BC... https://bugzilla.mozilla.org/show_bug.cgi?id=1752253 + year: + namedParts.era === 'BC' || namedParts.era === 'B' ? -namedParts.year + 1 : +namedParts.year, + month: +namedParts.month, + day: +namedParts.day, + hour: namedParts.hour === '24' ? 0 : +namedParts.hour, // bugs.chromium.org/p/chromium/issues/detail?id=1045791 + minute: +namedParts.minute, + second: +namedParts.second + }; +} + +const DAYMILLIS = 86400000; + +export function possibleAbsolutes(date: CalendarDateTime, timeZone: string): number[] { + let ms = epochFromDate(date); + let earlier = ms - getTimeZoneOffset(ms - DAYMILLIS, timeZone); + let later = ms - getTimeZoneOffset(ms + DAYMILLIS, timeZone); + return getValidWallTimes(date, timeZone, earlier, later); +} + +function getValidWallTimes( + date: CalendarDateTime, + timeZone: string, + earlier: number, + later: number +): number[] { + let found = earlier === later ? [earlier] : [earlier, later]; + return found.filter(absolute => isValidWallTime(date, timeZone, absolute)); +} + +function isValidWallTime(date: CalendarDateTime, timeZone: string, absolute: number) { + let parts = getTimeZoneParts(absolute, timeZone); + return ( + date.year === parts.year && + date.month === parts.month && + date.day === parts.day && + date.hour === parts.hour && + date.minute === parts.minute && + date.second === parts.second + ); +} + +export function toAbsolute( + date: CalendarDate | CalendarDateTime, + timeZone: string, + disambiguation: Disambiguation = 'compatible' +): number { + let dateTime = toCalendarDateTime(date); + + // Fast path: if the time zone is UTC, use native Date. + if (timeZone === 'UTC') { + return epochFromDate(dateTime); + } + + // Fast path: if the time zone is the local timezone and disambiguation is compatible, use native Date. + // Skip this fast path if the local timezone was explicitly overridden via setLocalTimeZone, + // since native Date always uses the browser's timezone, not the overridden one. + if ( + timeZone === getLocalTimeZone() && + disambiguation === 'compatible' && + !isLocalTimeZoneOverridden() + ) { + dateTime = toCalendar(dateTime, new GregorianCalendar()); + + // Don't use Date constructor here because two-digit years are interpreted in the 20th century. + let date = new Date(); + let year = getExtendedYear(dateTime.era, dateTime.year); + date.setFullYear(year, dateTime.month - 1, dateTime.day); + date.setHours(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond); + return date.getTime(); + } + + let ms = epochFromDate(dateTime); + let offsetBefore = getTimeZoneOffset(ms - DAYMILLIS, timeZone); + let offsetAfter = getTimeZoneOffset(ms + DAYMILLIS, timeZone); + let valid = getValidWallTimes(dateTime, timeZone, ms - offsetBefore, ms - offsetAfter); + + if (valid.length === 1) { + return valid[0]; + } + + if (valid.length > 1) { + switch (disambiguation) { + // 'compatible' means 'earlier' for "fall back" transitions + case 'compatible': + case 'earlier': + return valid[0]; + case 'later': + return valid[valid.length - 1]; + case 'reject': + throw new RangeError('Multiple possible absolute times found'); + } + } + + switch (disambiguation) { + case 'earlier': + return Math.min(ms - offsetBefore, ms - offsetAfter); + // 'compatible' means 'later' for "spring forward" transitions + case 'compatible': + case 'later': + return Math.max(ms - offsetBefore, ms - offsetAfter); + case 'reject': + throw new RangeError('No such absolute time found'); + } +} + +export function toDate( + dateTime: CalendarDate | CalendarDateTime, + timeZone: string, + disambiguation: Disambiguation = 'compatible' +): Date { + return new Date(toAbsolute(dateTime, timeZone, disambiguation)); +} + +/** + * Takes a Unix epoch (milliseconds since 1970) and converts it to the provided time zone. + */ +export function fromAbsolute(ms: number, timeZone: string): ZonedDateTime { + let offset = getTimeZoneOffset(ms, timeZone); + let date = new Date(ms + offset); + let year = date.getUTCFullYear(); + let month = date.getUTCMonth() + 1; + let day = date.getUTCDate(); + let hour = date.getUTCHours(); + let minute = date.getUTCMinutes(); + let second = date.getUTCSeconds(); + let millisecond = date.getUTCMilliseconds(); + + return new ZonedDateTime( + year < 1 ? 'BC' : 'AD', + year < 1 ? -year + 1 : year, + month, + day, + timeZone, + offset, + hour, + minute, + second, + millisecond + ); +} + +/** + * Takes a `Date` object and converts it to the provided time zone. + */ +export function fromDate(date: Date, timeZone: string): ZonedDateTime { + return fromAbsolute(date.getTime(), timeZone); +} + +/** + * Takes a `Date` object and converts it to the time zone identifier for the current user. + */ +export function fromDateToLocal(date: Date): ZonedDateTime { + return fromDate(date, getLocalTimeZone()); +} + +/** + * Converts a value with date components such as a `CalendarDateTime` or `ZonedDateTime` into a + * `CalendarDate`. + */ +export function toCalendarDate(dateTime: AnyCalendarDate): CalendarDate { + return new CalendarDate( + dateTime.calendar, + dateTime.era, + dateTime.year, + dateTime.month, + dateTime.day + ); +} + +export function toDateFields(date: AnyCalendarDate): DateFields { + return { + era: date.era, + year: date.year, + month: date.month, + day: date.day + }; +} + +export function toTimeFields(date: AnyTime): TimeFields { + return { + hour: date.hour, + minute: date.minute, + second: date.second, + millisecond: date.millisecond + }; +} + +/** + * Converts a date value to a `CalendarDateTime`. An optional `Time` value can be passed to set the + * time of the resulting value, otherwise it will default to midnight. + */ +export function toCalendarDateTime( + date: CalendarDate | CalendarDateTime | ZonedDateTime, + time?: AnyTime +): CalendarDateTime { + let hour = 0, + minute = 0, + second = 0, + millisecond = 0; + if ('timeZone' in date) { + ({hour, minute, second, millisecond} = date); + } else if ('hour' in date && !time) { + return date; + } + + if (time) { + ({hour, minute, second, millisecond} = time); + } + + return new CalendarDateTime( + date.calendar, + date.era, + date.year, + date.month, + date.day, + hour, + minute, + second, + millisecond + ); +} + +/** Extracts the time components from a value containing a date and time. */ +export function toTime(dateTime: CalendarDateTime | ZonedDateTime): Time { + return new Time(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond); +} + +/** Converts a date from one calendar system to another. */ +export function toCalendar(date: T, calendar: Calendar): T { + if (isEqualCalendar(date.calendar, calendar)) { + return date; + } + + let calendarDate = calendar.fromJulianDay(date.calendar.toJulianDay(date)); + let copy: Mutable = date.copy(); + copy.calendar = calendar; + copy.era = calendarDate.era; + copy.year = calendarDate.year; + copy.month = calendarDate.month; + copy.day = calendarDate.day; + constrain(copy); + return copy; +} + +/** + * Converts a date value to a `ZonedDateTime` in the provided time zone. The `disambiguation` option + * can be set to control how values that fall on daylight saving time changes are interpreted. + */ +export function toZoned( + date: CalendarDate | CalendarDateTime | ZonedDateTime, + timeZone: string, + disambiguation?: Disambiguation +): ZonedDateTime { + if (date instanceof ZonedDateTime) { + if (date.timeZone === timeZone) { + return date; + } + + return toTimeZone(date, timeZone); + } + + let ms = toAbsolute(date, timeZone, disambiguation); + return fromAbsolute(ms, timeZone); +} + +export function zonedToDate(date: ZonedDateTime): Date { + let ms = epochFromDate(date) - date.offset; + return new Date(ms); +} + +/** Converts a `ZonedDateTime` from one time zone to another. */ +export function toTimeZone(date: ZonedDateTime, timeZone: string): ZonedDateTime { + let ms = epochFromDate(date) - date.offset; + return toCalendar(fromAbsolute(ms, timeZone), date.calendar); +} + +/** Converts the given `ZonedDateTime` into the user's local time zone. */ +export function toLocalTimeZone(date: ZonedDateTime): ZonedDateTime { + return toTimeZone(date, getLocalTimeZone()); +} diff --git a/website/node_modules/@internationalized/date/src/createCalendar.ts b/website/node_modules/@internationalized/date/src/createCalendar.ts new file mode 100644 index 0000000..39f7338 --- /dev/null +++ b/website/node_modules/@internationalized/date/src/createCalendar.ts @@ -0,0 +1,63 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import {BuddhistCalendar} from './calendars/BuddhistCalendar'; +import {Calendar, CalendarIdentifier} from './types'; +import { + CopticCalendar, + EthiopicAmeteAlemCalendar, + EthiopicCalendar +} from './calendars/EthiopicCalendar'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {HebrewCalendar} from './calendars/HebrewCalendar'; +import {IndianCalendar} from './calendars/IndianCalendar'; +import { + IslamicCivilCalendar, + IslamicTabularCalendar, + IslamicUmalquraCalendar +} from './calendars/IslamicCalendar'; +import {JapaneseCalendar} from './calendars/JapaneseCalendar'; +import {PersianCalendar} from './calendars/PersianCalendar'; +import {TaiwanCalendar} from './calendars/TaiwanCalendar'; + +/** Creates a `Calendar` instance from a Unicode calendar identifier string. */ +export function createCalendar(name: CalendarIdentifier): Calendar { + switch (name) { + case 'buddhist': + return new BuddhistCalendar(); + case 'ethiopic': + return new EthiopicCalendar(); + case 'ethioaa': + return new EthiopicAmeteAlemCalendar(); + case 'coptic': + return new CopticCalendar(); + case 'hebrew': + return new HebrewCalendar(); + case 'indian': + return new IndianCalendar(); + case 'islamic-civil': + return new IslamicCivilCalendar(); + case 'islamic-tbla': + return new IslamicTabularCalendar(); + case 'islamic-umalqura': + return new IslamicUmalquraCalendar(); + case 'japanese': + return new JapaneseCalendar(); + case 'persian': + return new PersianCalendar(); + case 'roc': + return new TaiwanCalendar(); + case 'gregory': + default: + return new GregorianCalendar(); + } +} diff --git a/website/node_modules/@internationalized/date/src/index.ts b/website/node_modules/@internationalized/date/src/index.ts new file mode 100644 index 0000000..9d74d8b --- /dev/null +++ b/website/node_modules/@internationalized/date/src/index.ts @@ -0,0 +1,102 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +export type { + AnyCalendarDate, + AnyTime, + AnyDateTime, + Calendar, + CalendarIdentifier, + DateDuration, + TimeDuration, + DateTimeDuration, + DateFields, + TimeFields, + DateField, + TimeField, + Disambiguation, + CycleOptions, + CycleTimeOptions +} from './types'; +export type {DateValue} from './CalendarDate'; + +export {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; +export {GregorianCalendar} from './calendars/GregorianCalendar'; +export {JapaneseCalendar} from './calendars/JapaneseCalendar'; +export {BuddhistCalendar} from './calendars/BuddhistCalendar'; +export {TaiwanCalendar} from './calendars/TaiwanCalendar'; +export {PersianCalendar} from './calendars/PersianCalendar'; +export {IndianCalendar} from './calendars/IndianCalendar'; +export { + IslamicCivilCalendar, + IslamicTabularCalendar, + IslamicUmalquraCalendar +} from './calendars/IslamicCalendar'; +export {HebrewCalendar} from './calendars/HebrewCalendar'; +export { + EthiopicCalendar, + EthiopicAmeteAlemCalendar, + CopticCalendar +} from './calendars/EthiopicCalendar'; +export {createCalendar} from './createCalendar'; +export { + toCalendarDate, + toCalendarDateTime, + toTime, + toCalendar, + toZoned, + toTimeZone, + toLocalTimeZone, + fromDate, + fromDateToLocal, + fromAbsolute +} from './conversion'; +export { + isSameDay, + isSameMonth, + isSameYear, + isEqualDay, + isEqualMonth, + isEqualYear, + isToday, + getDayOfWeek, + now, + today, + getHoursInDay, + getLocalTimeZone, + setLocalTimeZone, + resetLocalTimeZone, + startOfMonth, + startOfWeek, + startOfYear, + endOfMonth, + endOfWeek, + endOfYear, + getMinimumMonthInYear, + getMinimumDayInMonth, + getWeeksInMonth, + minDate, + maxDate, + isWeekend, + isWeekday, + isEqualCalendar +} from './queries'; +export { + parseDate, + parseDateTime, + parseTime, + parseAbsolute, + parseAbsoluteToLocal, + parseZonedDateTime, + parseDuration +} from './string'; +export {DateFormatter} from './DateFormatter'; diff --git a/website/node_modules/@internationalized/date/src/manipulation.ts b/website/node_modules/@internationalized/date/src/manipulation.ts new file mode 100644 index 0000000..ccfbd4d --- /dev/null +++ b/website/node_modules/@internationalized/date/src/manipulation.ts @@ -0,0 +1,579 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import { + AnyCalendarDate, + AnyDateTime, + AnyTime, + CycleOptions, + CycleTimeOptions, + DateDuration, + DateField, + DateFields, + DateTimeDuration, + Disambiguation, + TimeDuration, + TimeField, + TimeFields +} from './types'; +import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; +import { + epochFromDate, + fromAbsolute, + toAbsolute, + toCalendar, + toCalendarDateTime +} from './conversion'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {Mutable} from './utils'; + +const ONE_HOUR = 3600000; + +export function add(date: CalendarDateTime, duration: DateTimeDuration): CalendarDateTime; +export function add(date: CalendarDate, duration: DateDuration): CalendarDate; +export function add( + date: CalendarDate | CalendarDateTime, + duration: DateTimeDuration +): CalendarDate | CalendarDateTime; +export function add( + date: CalendarDate | CalendarDateTime, + duration: DateTimeDuration +): Mutable { + let mutableDate: Mutable = date.copy(); + let days = 'hour' in mutableDate ? addTimeFields(mutableDate, duration) : 0; + + addYears(mutableDate, duration.years || 0); + if (mutableDate.calendar.balanceYearMonth) { + mutableDate.calendar.balanceYearMonth(mutableDate, date); + } + + mutableDate.month += duration.months || 0; + + balanceYearMonth(mutableDate); + constrainMonthDay(mutableDate); + + mutableDate.day += (duration.weeks || 0) * 7; + mutableDate.day += duration.days || 0; + mutableDate.day += days; + + balanceDay(mutableDate); + + if (mutableDate.calendar.balanceDate) { + mutableDate.calendar.balanceDate(mutableDate); + } + + // Constrain in case adding ended up with a date outside the valid range for the calendar system. + // The behavior here is slightly different than when constraining in the `set` function in that + // we adjust smaller fields to their minimum/maximum values rather than constraining each field + // individually. This matches the general behavior of `add` vs `set` regarding how fields are balanced. + if (mutableDate.year < 1) { + mutableDate.year = 1; + mutableDate.month = 1; + mutableDate.day = 1; + } + + let maxYear = mutableDate.calendar.getYearsInEra(mutableDate); + if (mutableDate.year > maxYear) { + let isInverseEra = mutableDate.calendar.isInverseEra?.(mutableDate); + mutableDate.year = maxYear; + mutableDate.month = isInverseEra ? 1 : mutableDate.calendar.getMonthsInYear(mutableDate); + mutableDate.day = isInverseEra ? 1 : mutableDate.calendar.getDaysInMonth(mutableDate); + } + + if (mutableDate.month < 1) { + mutableDate.month = 1; + mutableDate.day = 1; + } + + let maxMonth = mutableDate.calendar.getMonthsInYear(mutableDate); + if (mutableDate.month > maxMonth) { + mutableDate.month = maxMonth; + mutableDate.day = mutableDate.calendar.getDaysInMonth(mutableDate); + } + + mutableDate.day = Math.max( + 1, + Math.min(mutableDate.calendar.getDaysInMonth(mutableDate), mutableDate.day) + ); + return mutableDate; +} + +function addYears(date: Mutable, years: number) { + if (date.calendar.isInverseEra?.(date)) { + years = -years; + } + + date.year += years; +} + +function balanceYearMonth(date: Mutable) { + while (date.month < 1) { + addYears(date, -1); + date.month += date.calendar.getMonthsInYear(date); + } + + let monthsInYear = 0; + while (date.month > (monthsInYear = date.calendar.getMonthsInYear(date))) { + date.month -= monthsInYear; + addYears(date, 1); + } +} + +function balanceDay(date: Mutable) { + while (date.day < 1) { + date.month--; + balanceYearMonth(date); + date.day += date.calendar.getDaysInMonth(date); + } + + while (date.day > date.calendar.getDaysInMonth(date)) { + date.day -= date.calendar.getDaysInMonth(date); + date.month++; + balanceYearMonth(date); + } +} + +function constrainMonthDay(date: Mutable) { + date.month = Math.max(1, Math.min(date.calendar.getMonthsInYear(date), date.month)); + date.day = Math.max(1, Math.min(date.calendar.getDaysInMonth(date), date.day)); +} + +export function constrain(date: Mutable): void { + if (date.calendar.constrainDate) { + date.calendar.constrainDate(date); + } + + date.year = Math.max(1, Math.min(date.calendar.getYearsInEra(date), date.year)); + constrainMonthDay(date); +} + +export function invertDuration(duration: DateTimeDuration): DateTimeDuration { + let inverseDuration = {}; + for (let key in duration) { + if (typeof duration[key] === 'number') { + inverseDuration[key] = -duration[key]; + } + } + + return inverseDuration; +} + +export function subtract(date: CalendarDateTime, duration: DateTimeDuration): CalendarDateTime; +export function subtract(date: CalendarDate, duration: DateDuration): CalendarDate; +export function subtract( + date: CalendarDate | CalendarDateTime, + duration: DateTimeDuration +): CalendarDate | CalendarDateTime { + return add(date, invertDuration(duration)); +} + +export function set(date: CalendarDateTime, fields: DateFields): CalendarDateTime; +export function set(date: CalendarDate, fields: DateFields): CalendarDate; +export function set( + date: CalendarDate | CalendarDateTime, + fields: DateFields +): Mutable { + let mutableDate: Mutable = date.copy(); + + if (fields.era != null) { + mutableDate.era = fields.era; + } + + if (fields.year != null) { + mutableDate.year = fields.year; + } + + if (fields.month != null) { + mutableDate.month = fields.month; + } + + if (fields.day != null) { + mutableDate.day = fields.day; + } + + constrain(mutableDate); + return mutableDate; +} + +export function setTime(value: CalendarDateTime, fields: TimeFields): CalendarDateTime; +export function setTime(value: Time, fields: TimeFields): Time; +export function setTime( + value: Time | CalendarDateTime, + fields: TimeFields +): Mutable