diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 18810a3..1541292 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -32,6 +32,12 @@ jobs: - run: npm run check - run: npm test - run: npm run build -- "$RUNNER_TEMP/core-candidate" + - name: Install browser for Updates checks + working-directory: dashboard + run: npx playwright install --with-deps chromium + - name: Verify owner Updates workflow in the browser + working-directory: dashboard + run: npx playwright test --config playwright.updates.config.cjs - run: tar -C "$RUNNER_TEMP/platform-packages" -czf "$RUNNER_TEMP/platform-packages.tar.gz" . - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index eb99514..7f15df6 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -73,3 +73,6 @@ Keep multiline PR bodies in a file and pass `--body-file`. The manual release workflow is a separate operation; never dispatch it as part of ordinary development, merging, testing or retrying CI. See `RELEASES.md`. + +Owner update controls, synthetic browser checks and the native DSP release test +are documented in [core/updates/README.md](core/updates/README.md). diff --git a/README.md b/README.md index 071e364..e274dcb 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,10 @@ Every DSP retains its own installed code and private state. - [Directory map](AGENTS.md) - [Local development](DEVELOPMENT.md) - [PR and release workflow](RELEASES.md) +- [Independent update operations](core/updates/README.md) - [Architecture and storage](docs/architecture.md) - [Security policy](SECURITY.md) -This source is being prepared locally for repository creation. No repository, -release version, permanent preview deployment or production cutover is implied. +Core and DSP use separate public repositories and release versions. Publishing a +GitHub release makes it available; installing it is a separate owner action. See +the update operations guide for initial deployment and recovery prerequisites. diff --git a/RELEASES.md b/RELEASES.md index d9a274f..e159cf5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -15,28 +15,26 @@ Updating Core never rewrites an installed DSP's runtime, plugins or SDK copies. 6. Build and verify immutable artifacts from that main commit, collect a readable changelog, and publish the selected product's release. Publishing does not install. -The future owner Updates area has independent Core and DSP pages. Core shows its -changelog and an Update Core action. Shared dashboard/API features should first be -validated in a separate Core preview connected only to the permanent Dev DSP. +The owner Updates area has independent **Core** and **DSPs** tabs, release +history and changelogs. **Update Core** changes the shared dashboard, API and +services; it leaves installed DSP runtimes, plugins and SDK copies in place. +Validate shared changes in an isolated Core preview before installing them. +There is no automatic Core preview or automatic production deployment. -For DSP releases, Update Dev installs only the permanent testing DSP. Successful -installation and health checks enable Rollout Update. A newer release before -rollout resets the required Dev test. Rollout processes DSPs one at a time, checks -each DSP and pauses on failure. A rollout already started stays pinned to its exact -artifact even if another release is published. Retain previous code and a compatible -state snapshot for rollback; reverting code alone cannot undo a database migration. +**Update Dev** installs the latest DSP release only on the configured permanent +Dev DSP. A successful installation and live health check enable **Rollout Update**. +The owner tests Dev and chooses when to start rollout. A newer published release +before rollout requires another Dev update. An active rollout stays pinned to its +selected artifact, updates one DSP at a time and pauses on failure. A completed +rollout sets the default version for new DSPs; a Dev candidate never becomes that +default. DSPs created during a rollout join its remaining queue. -Local foundations are implemented in `core/updates/local-releases.js`, -`host/releases/runtime.js` and the package catalog's per-DSP approvals. These are -internal lifecycle ports, not public HTTP installation endpoints. Activation hooks -must drain processes, snapshot private state, start selected code, verify health -and restore on failure. Recover interrupted operations explicitly before continuing. -The persistent state directory is private and is never included in source exports. - -The GitHub feed, permanent Dev DSP deployment, separate Core preview, privileged -activation hooks and owner Updates UI are subsequent work. The development builder -still produces development candidates. Publication uses the separate guarded -workflow below; no release version or production baseline is assigned by setup. +Updates require a verified initial split deployment, a permanent Dev DSP and the +separate update worker. The first published `0.0.1` Core predates these controls; +it cannot install this feature by itself. See [update operations](core/updates/README.md) +for configuration, adoption prerequisites, lifecycle/recovery and test commands. +The updater never treats a source checkout or development build as a published +release. Publishing and installation remain separate owner decisions. Legacy `core/installations/RELEASES.md` documents old native/OCI recovery formats. It does not authorize or describe the new release workflow. @@ -68,5 +66,5 @@ installed bytes is rejected; bump that component in a reviewed PR first. The release job has GitHub publication permissions only. There are no production SSH credentials, service restarts, deployment hooks or DSP activation steps. GitHub publication and installed-version verification are separate operations. -The first real publication is still pending an owner-selected version; do not -claim that upload/attestation publication has been exercised by the unit tests. +Core and DSP `0.0.1` have been published and their GitHub assets and attestations +verified. That publication did not install them on the platform. diff --git a/bin/dispatch-updates b/bin/dispatch-updates new file mode 100755 index 0000000..d0ced09 --- /dev/null +++ b/bin/dispatch-updates @@ -0,0 +1,41 @@ +#!/usr/bin/env -S node --no-warnings +'use strict'; +process.umask(0o077); +async function main() { + const [action, ...args] = process.argv.slice(2); + const { loadWorkerPaths, configure, adopt } = require('../host/releases/setup'); + const paths = loadWorkerPaths(); + if (action === 'worker' && !args.length) { + const entry = require('../host/releases/setup').workerEntrypoint(paths, __filename); + if (entry) { + const child = require('node:child_process').spawn(process.execPath, ['--no-warnings', entry, 'worker'], { stdio: 'inherit', env: process.env }); + process.once('SIGTERM', () => child.kill('SIGTERM')); process.once('SIGINT', () => child.kill('SIGINT')); + await new Promise((resolve, reject) => { child.once('error', reject); child.once('exit', code => code === 0 ? resolve() : reject(new Error('release_worker_failed'))); }); + return { status: 'stopped' }; + } + const app = await require('../core/updates/worker').startWorker(paths); + const startedDigest = app.worker.releases.state().active.core; + const monitor = setInterval(() => { + const state = app.worker.releases.state(); + if (!state.operation && state.active.core !== startedDigest) close(); + }, 1000); + const close = () => { clearInterval(monitor); return app.close().catch(() => { process.exitCode = 1; }); }; + process.once('SIGINT', close); process.once('SIGTERM', close); + return { status: 'ready' }; + } + if (action === 'configure' && args.length === 2) return configure(paths, args[0], Number(args[1])); + if (action === 'adopt' && args.length === 1) return adopt(paths, args[0]); + if (action === 'recover' && args.length === 1) { + const { authorizeOwner } = require('../core/updates/worker'); authorizeOwner(paths, args[0]); + const { UpdateCommands } = require('../core/updates/commands'); + const { rootFor } = require('../core/updates/configuration'); + const job = new UpdateCommands(rootFor(paths)).request(args[0], { action: 'recover', product: 'core', + digest: null, idempotencyKey: `recovery:${require('node:crypto').randomUUID()}` }); + return { status: 'queued', id: job.id }; + } + throw new Error('release_command_invalid'); +} +main().then(value => process.stdout.write(JSON.stringify({ ok: true, ...value }) + '\n')).catch(error => { + process.stderr.write(JSON.stringify({ ok: false, status: /^release_[a-z_]+$/.test(error.message) ? error.message : 'release_operation_failed' }) + '\n'); + process.exitCode = 1; +}); diff --git a/core/accounts/src/directory-lifecycle.js b/core/accounts/src/directory-lifecycle.js index 322abc7..8cb5065 100644 --- a/core/accounts/src/directory-lifecycle.js +++ b/core/accounts/src/directory-lifecycle.js @@ -48,6 +48,8 @@ function createDirectoryLifecycle({ store, clock = Date.now }) { if (!['suspend', 'resume', 'restart', 'decommission', 'restore_dsp'].includes(action)) fail(); return store.transaction(() => { const control = store.installationControl(organizationId), organization = store.organization(organizationId); + if (action === 'decommission' && control?.runtimeKey === store.permanentDevId) fail('directory_dev_protected'); + if (store.releaseBlocked?.(organizationId)) fail('release_busy'); if (store.directoryDeletion?.get(organizationId)) fail('installation_operation_not_allowed'); if (!control || store.installationBackend(organizationId) !== BACKEND) fail(); const prior = db.prepare('SELECT * FROM directory_lifecycle_requests WHERE organization_id=? AND idempotency_key=?').get(organizationId, requestId); diff --git a/core/accounts/src/plugins.js b/core/accounts/src/plugins.js index a945cec..8d7178f 100644 --- a/core/accounts/src/plugins.js +++ b/core/accounts/src/plugins.js @@ -36,6 +36,7 @@ function createPluginService({ store, access, invoke, settingsPort = null, insta function context(session) { const selected = access.requireDspOwner(session); const installation = store.installationControl(selected.organization.id); + if (store.releaseBlocked?.(selected.organization.id)) fail('release_busy'); if (selected.organization.status !== 'active' || installation?.status !== 'ready' || !backends.includes(store.installationBackend(installation.organizationId)) || store.activeLifecycleJob(selected.organization.id) || store.db.prepare("SELECT 1 FROM directory_lifecycle_requests WHERE organization_id=? AND status IN ('queued','running')").get(selected.organization.id)) fail('installation_not_ready'); @@ -89,7 +90,7 @@ function createPluginService({ store, access, invoke, settingsPort = null, insta } function ready(organizationId, runtimeKey = null) { const installation = store.installationControl(organizationId); - return installation?.status === 'ready' && backends.includes(store.installationBackend(installation.organizationId)) + return !store.releaseBlocked?.(organizationId) && installation?.status === 'ready' && backends.includes(store.installationBackend(installation.organizationId)) && (!runtimeKey || installation.runtimeKey === runtimeKey) && store.organization(organizationId)?.status === 'active' && !store.activeLifecycleJob(organizationId) && !store.db.prepare('SELECT 1 FROM dsp_removals WHERE organization_id=?').get(organizationId) diff --git a/core/agents/tests/execution.test.js b/core/agents/tests/execution.test.js index 52a1669..f49d141 100644 --- a/core/agents/tests/execution.test.js +++ b/core/agents/tests/execution.test.js @@ -7,9 +7,10 @@ const path = require('node:path'); const { DatabaseSync } = require('node:sqlite'); const { DirectoryExecution } = require('../../../host/controller/execution'); const { saveStatus } = require('../../../shared/published/status'); -const { success } = require('../../../shared/contracts/src/result'); +const { success, failure } = require('../../../shared/contracts/src/result'); function fixture(t) { + require('../../../shared/plugin-sdk/catalog').configureCatalog(() => [require('../../../tests/fixtures/paycom-plugin.json')]); const root = fs.mkdtempSync(path.join(os.tmpdir(), 'core-execution-')); const paths = { local: path.join(root, 'local') }; for (const name of ['local', 'local/state', 'local/config']) fs.mkdirSync(path.join(root, name), { mode: 0o700 }); @@ -43,7 +44,7 @@ function fixture(t) { } calls.push([action, id]); return success('accepted', {}); } }; - const options = { paths, accessStore: { db }, manager, hub, configuration: { version: 1, enabled: true, idleMs: 1000, pollMs: 100, maxActive: 1 }, clock: () => now }; + const options = { publishedReader: () => ({ workforce: { employees: () => failure('not_initialized') } }), paths, accessStore: { db }, manager, hub, configuration: { version: 1, enabled: true, idleMs: 1000, pollMs: 100, maxActive: 1 }, clock: () => now }; function open() { execution = new DirectoryExecution(options); execution.wake = () => {}; } open(); t.after(async () => { await execution.close(); db.close(); fs.rmSync(root, { recursive: true, force: true }); }); @@ -66,6 +67,7 @@ test('idle workers stop, reads never wake them, and concurrent manual requests s await c.execution.runPending(); c.advance(1200); await c.execution.runPending(); assert.equal(c.active.has(id), false); assert.equal(c.execution.store.get(id).state, 'sleeping'); + assert.match(c.execution.store.get(id).operation_id, /^sleep_[a-f0-9]{32}$/); const before = c.calls.length; for (let i = 0; i < 20; i++) assert.equal((await c.execution.invoke(id, 'sync.status', { id: 'paycom-main-workforce' })).ok, true); assert.equal(c.calls.length, before); diff --git a/core/api/access-http.js b/core/api/access-http.js index e71916e..8d54c37 100644 --- a/core/api/access-http.js +++ b/core/api/access-http.js @@ -62,6 +62,7 @@ function createAccessHttp({ if (!current || request.headers['x-dispatch-csrf'] !== current.csrfToken) throw new AccessError('csrf_invalid', 403); requireJson(request); requireNoQuery(url); + if ((current.dspView || current.user.platformRole !== 'owner') && access.store?.releaseBlocked?.(current.activeOrganizationId)) throw new AccessError('release_busy', 409); } function activeOrganizationId(current) { @@ -354,11 +355,12 @@ function createAccessHttp({ } else requireNoQuery(url); access.requirePlatform(current, 'platform.installations.manage'); if (!updates) throw new AccessError('installation_operator_disabled', 503); + if (updates.ownerOnly && (current.user.platformRole !== 'owner' || current.dspView)) throw new AccessError('platform_forbidden', 403); if (request.method === 'POST') { requireMutation(request, current, url); - updates.command(current, await readJson(request)); + await updates.command(current, await readJson(request)); } - sendJson(response, 200, { ok: true, status: 'found', data: updates.view(releaseId), error: null }); + sendJson(response, 200, { ok: true, status: 'found', data: await updates.view(releaseId), error: null }); return true; } diff --git a/core/api/directory-platform.js b/core/api/directory-platform.js index e93e64f..6d3845b 100644 --- a/core/api/directory-platform.js +++ b/core/api/directory-platform.js @@ -21,7 +21,6 @@ const { DirectoryLifecycleWorker } = require('../../host/controller/lifecycle'); const { createDirectoryMonitor } = require('../../host/capacity/monitor'); const { createDirectoryDiagnostics } = require('../../host/controller/diagnostics'); const { loadDashboardSettings } = require('../../host/controller/dashboard-settings'); -const { createPlatformUpdates } = require('../accounts/src/platform-updates'); const { ManualBackups, interruptedRestore } = require('../../host/storage/manual-backups'); const { invitationDeliveryFromEnvironment } = require('./invitation-email'); const { DirectoryExecution } = require('../../host/controller/execution'); @@ -34,9 +33,10 @@ async function startDirectoryApi({ paths, installation, host, port = 4310, addre if (!['127.0.0.1', '::1', 'localhost'].includes(address) || !Number.isInteger(port) || port < 0 || port > 65535) { throw new Error('directory_dashboard_invalid'); } - let store, runtime, worker, execution, server, closing; + let store, runtime, worker, execution, server, closing, updateControl; const close = () => closing ||= (async () => { if (server?.listening) await new Promise(resolve => server.close(resolve)); + await updateControl?.close(); await worker?.close(); await execution?.close(); try { await runtime?.close(); } finally { store?.close(); } @@ -98,12 +98,18 @@ async function startDirectoryApi({ paths, installation, host, port = 4310, addre for (const result of results) if (result.status === 'rejected') onError(result.reason); } }); const client = createRuntimeAgentDispatchClient({ runtimeKey: 'unassigned', hub: runtime.hub }); - // Local development has no release feed. History stays readable without - // activating legacy downloads, rollout workers or pre-update backups. - const updates = createPlatformUpdates({ store, enabled: false }); + // Configuration opts into independent updates; activation belongs to the + // external worker and this controller's scoped DSP lifecycle. + updateControl = await require('../updates/directory').directoryUpdates({ paths, store, manager: runtime.manager, execution }); + const updates = updateControl.service; const config = dashboardConfig({}); const pluginAssets = require('../plugins/assets').createPluginAssets({ dspRoot: id => runtime.manager.checkedDsp(runtime.manager.journal.record(id)).root }); - server = serverFactory({ access, client, config, operator, paycomSetup, connections, plugins, pluginAssets, publicOrigin, secureCookies, updates, backups, + const installedCore = require('../installations/src/release-delivery-files').privateJson(require('../../host/releases/core').receiptFile(paths), process.geteuid(), true); + const coreMaintenance = () => { + const state = require('../installations/src/release-delivery-files').privateJson(path.join(paths.local, 'state/updates/releases.json'), process.geteuid(), true); + return state?.operation?.product === 'core' ? { phase: 'updating', nonce: state.operation.preparation?.nonce } : null; + }; + server = serverFactory({ coreIdentity: installedCore, coreMaintenance, access, client, config, operator, paycomSetup, connections, plugins, pluginAssets, publicOrigin, secureCookies, updates, backups, // Public installations require email setup before creating invitations. // Loopback-only development can still hand off invitation links manually. invitationDelivery, diff --git a/core/api/http.js b/core/api/http.js index 9cde086..46b6b72 100644 --- a/core/api/http.js +++ b/core/api/http.js @@ -185,7 +185,7 @@ function publicHttpFailure(error) { // These expected availability failures contain no private diagnostic data. // Keep every other server failure opaque, including untrusted lookalike errors. if (statusCode === 503 && error instanceof AccessError - && ['installation_operator_disabled', 'invitation_email_unavailable', 'turnstile_unavailable', 'password_recovery_unavailable', 'password_recovery_busy'].includes(error.code)) { + && ['release_worker_unavailable', 'installation_operator_disabled', 'invitation_email_unavailable', 'turnstile_unavailable', 'password_recovery_unavailable', 'password_recovery_busy'].includes(error.code)) { return { statusCode, code: error.code }; } if (statusCode >= 500) return { statusCode, code: 'dashboard_unavailable' }; diff --git a/core/auth-broker/server.js b/core/auth-broker/server.js index 8ead107..3a6bc01 100644 --- a/core/auth-broker/server.js +++ b/core/auth-broker/server.js @@ -16,6 +16,9 @@ const { serveBackend } = require('../plugins/transport'); async function main() { process.umask(0o077); const paths = loadPlatformPaths(), lock = acquireLock(paths, 'plugin-backend'); + const definitions = () => require('../plugins/package-catalog').packageCatalog(paths)?.definitions() || []; + require('../../shared/plugin-sdk/catalog').configureCatalog(definitions); + require('dispatch-protocol/plugin-sdk/catalog').configureCatalog(definitions); const databaseRoot = privateDirectory(path.join(paths.local, 'state/access-control')); const store = new AccessStore({ databaseRoot, database: path.join(databaseRoot, 'access-control.sqlite3') }); const journal = new DirectoryJournal(paths), authority = directoryAccessAuthority({ paths, store, journal }); diff --git a/core/plugins/backend.js b/core/plugins/backend.js index 1b1d83e..8152ef6 100644 --- a/core/plugins/backend.js +++ b/core/plugins/backend.js @@ -122,7 +122,7 @@ async function openPluginBackend({ paths, installation, store, dspRoot, permitte AND p.applied_state='enabled' AND p.revision=p.applied_revision AND i.status='ready'`).all()) { try { if (!settingsStore(dspRoot(row.runtime_key),row.plugin_id).pending()) continue; const manifest = selected(row.runtime_key,row.plugin_id).manifest.plugin; - applySettingsPolicy(dspRoot(row.runtime_key),manifest); } catch { /* Pending policy is retried after lifecycle/storage recovery. */ } + if (!require('../../host/releases/guard').updating(paths, row.runtime_key)) applySettingsPolicy(dspRoot(row.runtime_key),manifest); } catch { /* Pending policy is retried after lifecycle/storage recovery. */ } } } } finally { reaping = false; } diff --git a/core/plugins/transport.js b/core/plugins/transport.js index 70754eb..cdaa98a 100644 --- a/core/plugins/transport.js +++ b/core/plugins/transport.js @@ -38,6 +38,7 @@ async function serveBackend({ paths, backend, dspRoot, permitted, prepare = asyn if (value.schemaVersion !== 1) throw new Error('invalid_request'); const dspId = validateDspId(boundDspId || value.dspId), input = value.input; const cleanup = !boundDspId && value.operation === 'plugin.revoke'; + if (!(value.operation === 'auth.request' && input?.action === 'health' && require('../../host/releases/guard').healthAllowed(paths)) && (boundDspId || !['plugin.revoke', 'plugin.initialize', 'dsp.prepare'].includes(value.operation))) require('../../host/releases/guard').assertAvailable(paths, dspId); if (!cleanup && !permitted(dspId)) throw new Error('permission_denied'); let response; if (!boundDspId && value.operation === 'dsp.prepare') { diff --git a/core/updates/README.md b/core/updates/README.md new file mode 100644 index 0000000..0e92300 --- /dev/null +++ b/core/updates/README.md @@ -0,0 +1,147 @@ +# Independent updates + +The Platform Owner Updates page uses separate Core and DSP release histories. +Only the active platform owner outside a DSP view can issue update commands. +Requests require the normal session, CSRF protection and an idempotency key. The +worker rechecks owner authority before executing a command, including after a +release download. Commands never accept an arbitrary repository or executable. + +## Code and private storage + +| Location | Purpose | +| --- | --- | +| `core/updates/github.js`, `extract.py` | Read published releases from the two Dispatch repositories; verify tag, main commit, hosted release-workflow provenance, archive, inventory and plugin packages. | +| `core/updates/local-releases.js` | Durable release identities, selected versions, Dev health proof, rollout and interrupted-operation journal. | +| `core/updates/commands.js`, `worker.js` | Persistent owner commands, one external worker and periodic release discovery. | +| `core/updates/directory.js`, `transport.js` | Private worker-to-API socket and DSP activation under the directory controller. | +| `host/releases/core.js`, `core-state.js` | Stop Core services, snapshot Core state, swap code, verify API/database health and recover. | +| `host/releases/dsp.js`, `runtime.js` | Drain one DSP, snapshot its state, select its runtime/plugins and restore that DSP on failure. | +| `host/releases/provisioning.js` | Give new DSPs the last completely rolled-out release. | +| `host/releases/setup.js`, `bin/dispatch-updates` | Configure permanent Dev, register an existing split baseline, prepare the independent worker and queue offline recovery. | +| `dashboard/frontend/src/pages/Updates.tsx` | Owner controls, changelogs, progress and recovery UI. | +| `local/config/updates.json` | Private permanent Dev identity and API loopback port. | +| `local/state/updates/` | Verified packages, command history, worker heartbeat and release journal. | +| `local/state/dsp-releases/` | Each DSP's selected release receipt. | +| `local/backups/updates/` | Private Core and per-DSP rollback snapshots. | +| `local/tools/update-worker/` | Retained bootstrap code that survives a Core directory swap. | +| `dsps//runtime/releases/` | Independently installed DSP runtime releases. | + +The worker checks both feeds when idle, about every five minutes. **Check for +updates** refreshes the selected product. Every install/start-rollout command +refreshes its product again; a stale button cannot install an superseded release. +An active rollout continues using its pinned digest when a newer release appears. +Release downloads only stage verified files. They do not select code or start +services. Shared dependencies remain versioned copies inside each DSP release. + +## Initial deployment and configuration + +These steps belong to a separately reviewed installation procedure. They are not +performed by publication or by opening the Updates page. + +1. Publish a reviewed Core release containing these controls. Identify the exact + Core and DSP manifests/digests for the initial split deployment. Make private + offline backups and rehearse the cutover and rollback in an isolated platform. +2. Provision or select the permanent testing DSP. It must be an existing, ready + directory installation. Validate Core with synthetic data and a separate API, + dashboard, state, ports and service names before the production cutover. +3. During the installation maintenance window, install the verified Core code at + `live/`. Install and pin a verified DSP runtime for **every** retained DSP; + each must have its own `runtime/releases/` and selected receipt. + Migrate existing plugin receipts/approvals as needed without replacing DSP + credentials, settings or databases. All initial DSPs must share one approved + release. No retained DSP may depend on the old `live/runtime` fallback. +4. Using the installed code and private `DISPATCH_PLATFORM_CONFIG`, run + `bin/dispatch-updates configure DSP_ID API_PORT`. It validates Dev and writes + the private configuration. The Dev identity cannot subsequently be replaced. + Normal decommission and deletion paths protect that DSP. +5. Stage the published baselines through `GitHubReleases.refresh('core')` and + `.refresh('dsp')`, using `LocalReleases` rooted at `local/state/updates` with + the configured Dev identity. Staging has no activation hooks. The host needs + GitHub CLI with `gh attestation verify`, Python 3 and outbound access to GitHub + and its release asset hosts. CLI authentication stays private; no GitHub write + permission is needed for discovery or verification. +6. With Core services stopped, run `bin/dispatch-updates adopt CORE_DIGEST`. + This only records an **already installed** baseline. It verifies live files, + each DSP receipt, protocol compatibility and permanent Dev. It does not perform + the monolithic-to-split migration and will reject a mismatched live tree. +7. Prepare service units with the existing startup tooling. When configured, + `prepareStartup` also renders `dispatch-updates.service`. Review and install + the generated unit alongside the API/dashboard units, then enable the worker. + Its API port must match `updates.json`. Confirm installed versions, worker + health and owner access before leaving maintenance. + +A missing configuration leaves the page disabled. No guessed Dev identity, +version, baseline or production service activation is supplied automatically. +Core `0.0.1` predates the worker, so the initial installation cannot be bootstrapped +by clicking Update Core on that release. The source implementation and its +adoption command are not a completed production migration. + +## Activation and recovery + +Core and DSP updates require matching protocol versions; incompatible updates are +rejected before activation. Releases retain their own SDK/package versions. +Core changes can temporarily interrupt the shared dashboard/API even though DSP +code does not change. The browser reconnects and reloads after the Core digest +changes. A retained bootstrap worker runs outside the replaceable live tree and +hands off to the active Core release's verified worker after a successful update. + +Core snapshots include configuration, secrets and private Core state, excluding +the updater's own journal. A failed health check restores the previous Core code +and compatible state, including database schema. Bootstrap configuration remains +readable during recovery. DSP snapshots include that DSP's credentials, settings, +databases, sessions and plugin installation state. DSP rollback restores only +that DSP's files and associated plugin authority; it does not replace the entire +Core database or another DSP's data. + +Idle DSPs with a recorded scheduler sleep request can wake for installation and +live health verification. Their normal idle policy resumes afterward. A failed +update returns an originally sleeping DSP to sleep. An owner stop, suspension, +uncompleted setup or newer lifecycle request is never silently overridden; the +rollout pauses until the owner resolves it. DSPs already asleep before the sleep +receipt support was installed require one normal wake/sleep cycle before the +updater can distinguish them from deliberate stops. + +**Pause rollout** takes effect between DSPs. **Resume rollout** retries the same +pinned version. Worker restarts mark in-flight commands interrupted and pause +rollouts; an interrupted activation must recover before new installs. Use +**Recover update** when the API is available. If Core is offline, the platform +operator can queue recovery with the retained worker code: + +```sh +DISPATCH_PLATFORM_CONFIG=/absolute/private/config/platform.json \ + /absolute/retained/bin/dispatch-updates recover OWNER_USER_ID +``` + +The user ID must still identify an active platform owner. The external worker +executes recovery. Do not clear the operation journal, swap code manually or +replace a database to bypass an interrupted update. Existing release packages, +command records and snapshots are retained; automatic retention/pruning is not +implemented. Monitor private disk usage and archive only after reviewing which +receipts and rollback operations still reference those files. + +## Verification + +`npm test` covers command authorization/idempotency, release verification, latest +release ordering, lifecycle rollback, interruption recovery, scheduler sleep and +per-DSP isolation. `npm run test:integration` exercises the wider API/dashboard. +After building the dashboard, run these browser checks: + +```sh +cd dashboard +npx playwright test --config playwright.updates.config.cjs +``` + +The explicit `dashboard/examples/independent-updates-preview.js` fixture uses +synthetic owners/DSPs and simulated host actions. It is not a production updater. +The browser checks cover independent controls, newer-release reset, paused +rollout, sequential resume and mobile layout. CI runs the same browser checks. + +`tests/architecture/release-update.acceptance.js` additionally installs a real +Paycom package in a private Linux/systemd namespace lab, switches DSP releases, +wakes a sleeping DSP and checks rollback of its private state. Provide sealed +Node/tini and browser tool roots plus explicit Core/DSP release directories via +`DISPATCH_WORKER_TEST_TOOLS`, `DISPATCH_WORKER_TEST_BROWSER`, +`DISPATCH_UPDATE_TEST_CORE` and `DISPATCH_UPDATE_TEST_DSP`. It uses synthetic data +and no provider credentials. Native Core service swapping still requires a +separate deployment rehearsal with isolated service names before live cutover; +unit lifecycle tests inject service control while exercising real files/SQLite. diff --git a/core/updates/commands.js b/core/updates/commands.js new file mode 100644 index 0000000..762dc05 --- /dev/null +++ b/core/updates/commands.js @@ -0,0 +1,46 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'), crypto = require('node:crypto'); +const { atomic, privateJson } = require('../installations/src/release-delivery-files'); +const { privateDirectory, acquireLock } = require('../../host/controller/operations'); +const { AccessError, exact, idempotencyKey } = require('../accounts/src/validation'); +const ACTIONS = ['refresh', 'update_core', 'update_dev', 'rollout', 'pause', 'resume', 'recover']; +class UpdateCommands { + constructor(directory, clock = Date.now) { + this.root = privateDirectory(directory); this.clock = clock; + this.jobs = privateDirectory(path.join(directory, 'commands')); + } + list() { + return fs.readdirSync(this.jobs).filter(name => /^[a-f0-9]{64}\.json$/.test(name)) + .map(name => privateJson(path.join(this.jobs, name), process.geteuid())).sort((a, b) => (a.sequence || 0) - (b.sequence || 0) || a.createdAt - b.createdAt || a.id.localeCompare(b.id)); + } + save(job) { atomic(path.join(this.jobs, `${job.id}.json`), job); } + request(actor, input, targets = []) { + exact(input, ['action', 'product', 'digest', 'idempotencyKey']); idempotencyKey(input.idempotencyKey); + if (!ACTIONS.includes(input.action) || !['core', 'dsp'].includes(input.product) + || !([null, undefined].includes(input.digest) || typeof input.digest === 'string' && /^[a-f0-9]{64}$/.test(input.digest)) + || ['update_core', 'update_dev', 'rollout'].includes(input.action) && !input.digest + || input.action === 'update_core' && input.product !== 'core' + || ['update_dev', 'rollout', 'pause', 'resume'].includes(input.action) && input.product !== 'dsp') throw new AccessError('invalid_input', 400); + const id = crypto.createHash('sha256').update(`${actor}:${input.idempotencyKey}`).digest('hex'); + const intent = JSON.stringify({ action: input.action, product: input.product, digest: input.digest || null }); + const fd = acquireLock({ local: path.join(this.root, 'queue-lock') }); + try { + const jobs = this.list(), prior = jobs.find(job => job.id === id); + if (prior) { + if (prior.intent !== intent) throw new AccessError('idempotency_conflict', 409); + return prior; + } + if (jobs.length >= 10000) throw new AccessError('release_history_capacity', 409); + if (jobs.some(job => ['queued', 'running'].includes(job.status)) && input.action !== 'pause') throw new AccessError('release_busy', 409); + const job = { id, actor, intent, sequence: Math.max(0, ...jobs.map(job => job.sequence || 0)) + 1, ...JSON.parse(intent), targets: input.action === 'rollout' ? targets : [], + status: 'queued', failure: null, createdAt: this.clock(), completedAt: null }; + this.save(job); return job; + } finally { fs.closeSync(fd); } + } + heartbeat(status = 'ready') { atomic(path.join(this.root, 'worker.json'), { status, at: this.clock() }); } + worker() { + const value = privateJson(path.join(this.root, 'worker.json'), process.geteuid(), true); + return { available: Boolean(value && this.clock() - value.at < 45000 && value.status !== 'stopped'), status: value?.status || 'offline' }; + } +} +module.exports = { UpdateCommands }; diff --git a/core/updates/configuration.js b/core/updates/configuration.js new file mode 100644 index 0000000..73a971e --- /dev/null +++ b/core/updates/configuration.js @@ -0,0 +1,14 @@ +'use strict'; +const path = require('node:path'); +const { privateJson } = require('../installations/src/release-delivery-files'); +const { validateDspId } = require('../../shared/paths/platform-paths'); +const rootFor = paths => path.join(paths.local, 'state/updates'); +function loadConfiguration(paths) { + const value = privateJson(path.join(paths.local, 'config/updates.json'), process.geteuid(), true); + if (!value) return null; + if (Object.keys(value).sort().join(',') !== 'apiPort,devDspId,schemaVersion' || value.schemaVersion !== 1 + || !Number.isInteger(value.apiPort) || value.apiPort < 1024 || value.apiPort > 65535) throw new Error('release_configuration_invalid'); + validateDspId(value.devDspId); + return value; +} +module.exports = { loadConfiguration, rootFor }; diff --git a/core/updates/directory.js b/core/updates/directory.js new file mode 100644 index 0000000..089ece8 --- /dev/null +++ b/core/updates/directory.js @@ -0,0 +1,45 @@ +'use strict'; +const { LocalReleases } = require('./local-releases'); +const { UpdateCommands } = require('./commands'); +const { createUpdatesService } = require('./service'); +const { loadConfiguration, rootFor } = require('./configuration'); +const { dspHooks } = require('../../host/releases/dsp'); +const { serve } = require('./transport'); +const { exact } = require('../../sdk/src/protocol'); +async function directoryUpdates({ paths, store, manager, execution }) { + const configuration = loadConfiguration(paths); + if (!configuration) return { service: createUpdatesService({ enabled: false }), close: async () => {} }; + const directory = rootFor(paths), releases = new LocalReleases({ directory, devDspId: configuration.devDspId, + hooks: dspHooks({ paths, store, manager, execution }) }); + const commands = new UpdateCommands(directory); + store.permanentDevId = configuration.devDspId; + store.releaseBlocked = organizationId => { + const key = store.installationControl(organizationId)?.runtimeKey; + return key && require('../../host/releases/guard').updating(paths, key); + }; + const authorize = actorId => { + const actor = store.userById(actorId); + if (actor?.status !== 'active' || actor.platform_role !== 'owner') throw new Error('release_actor_forbidden'); + }; + const socket = await serve({ paths, execute: async (action, input) => { + if (action === 'authorize') { exact(input, ['actor']); authorize(input.actor); return true; } + if (action === 'update_dev') { exact(input, ['actor', 'digest']); authorize(input.actor); await releases.updateDev(input.digest); } + else if (action === 'rollout') { + exact(input, ['actor', 'digest', 'targets']); authorize(input.actor); + const targets = store.db.prepare("SELECT runtime_key FROM installations WHERE backend='directory_service_v1' AND status<>'decommissioned' ORDER BY runtime_key").all().map(row => row.runtime_key); + // A changed fleet requires a new owner action; never silently expand it. + if (JSON.stringify(targets) !== JSON.stringify(input.targets)) throw new Error('release_fleet_changed'); + await releases.beginRollout(input.digest, targets, input.actor); + } else if (action === 'step') { exact(input, ['actor']); authorize(input.actor); await releases.step(); } + else if (action === 'resume') { exact(input, ['actor']); authorize(input.actor); await releases.resume(); } + else if (action === 'pause') { exact(input, ['actor']); authorize(input.actor); await releases.pause(); } + else if (action === 'recover') { exact(input, ['actor']); authorize(input.actor); + if (releases.state().operation?.product === 'core') throw new Error('release_product_invalid'); + await releases.recover(); + } else throw new Error('release_command_invalid'); + return { completed: true }; + } }); + return { service: createUpdatesService({ releases, commands, store, devDspId: configuration.devDspId }), + close: () => socket.close() }; +} +module.exports = { directoryUpdates }; diff --git a/core/updates/extract.py b/core/updates/extract.py new file mode 100644 index 0000000..f0bca8a --- /dev/null +++ b/core/updates/extract.py @@ -0,0 +1,49 @@ +"""Extract only bounded regular release files. Never extract links or special files.""" +import os +from pathlib import Path, PurePosixPath +import sys +import tarfile + + +def extract(archive, destination): + target = Path(destination) + target.mkdir(mode=0o700) + seen, total = set(), 0 + with tarfile.open(archive, 'r:gz') as bundle: + for index, member in enumerate(bundle): + name = member.name + if name == '.' and member.isdir(): + continue + if name.startswith('./'): + name = name[2:] + name = name.rstrip('/') if member.isdir() else name + parts = PurePosixPath(name).parts + if (index > 100000 or not parts or name.startswith('/') or '\\' in name + or any(c in name for c in '\x00\r\n') or '..' in parts + or str(PurePosixPath(name)) != name or name in seen + or not (member.isdir() or member.isreg()) or member.size < 0): + raise ValueError('release_archive_invalid') + seen.add(name) + total += member.size + if total > 2 * 1024 ** 3: + raise ValueError('release_archive_capacity') + output = target.joinpath(*parts) + if member.isdir(): + output.mkdir(mode=0o755, parents=True, exist_ok=True) + else: + output.parent.mkdir(mode=0o755, parents=True, exist_ok=True) + with bundle.extractfile(member) as source, output.open('xb') as stream: + remaining = member.size + while remaining: + data = source.read(min(1024 * 1024, remaining)) + if not data: + raise ValueError('release_archive_truncated') + stream.write(data) + remaining -= len(data) + stream.flush() + os.fsync(stream.fileno()) + output.chmod(0o755 if member.mode & 0o111 else 0o644) + + +if __name__ == '__main__': + extract(*sys.argv[1:]) diff --git a/core/updates/github.js b/core/updates/github.js new file mode 100644 index 0000000..d0c6112 --- /dev/null +++ b/core/updates/github.js @@ -0,0 +1,108 @@ +'use strict'; + +const fs = require('node:fs'); +const path = require('node:path'); +const { execFile } = require('node:child_process'); +const { promisify } = require('node:util'); +const execute = promisify(execFile); +const { hash, verifyRelease } = require('../../shared/releases/package'); +const { privateDirectory } = require('../../host/controller/operations'); +const REPOSITORIES = Object.freeze({ core: 'dillonlille/dispatch-core', dsp: 'dillonlille/dispatch-dsp' }); +const VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/; +const compareVersions = (a, b) => { + const x = a.split('.').map(BigInt), y = b.split('.').map(BigInt); + for (let i = 0; i < 3; i++) if (x[i] !== y[i]) return x[i] > y[i] ? 1 : -1; + return 0; +}; +async function run(executable, args) { + try { return (await execute(executable, args, { timeout: 180000, maxBuffer: 20 * 1024 * 1024 })).stdout; } + catch { throw new Error('release_verification_failed'); } +} +async function download(url, file, maximum, fetchImpl = fetch) { + const response = await fetchImpl(url, { signal: AbortSignal.timeout(180000) }); + if (!response.ok || !response.body) throw new Error('release_download_failed'); + if (Number(response.headers.get('content-length')) > maximum) throw new Error('release_download_capacity'); + const fd = fs.openSync(file, 'wx', 0o600); + let size = 0; + try { + for await (const chunk of response.body) { + size += chunk.length; + if (size > maximum) throw new Error('release_download_capacity'); + let offset = 0; + while (offset < chunk.length) offset += fs.writeSync(fd, chunk, offset, chunk.length - offset); + } + fs.fsyncSync(fd); + } finally { fs.closeSync(fd); } +} +class GitHubReleases { + constructor({ directory, releases, execute = run, fetchImpl = fetch }) { + this.root = privateDirectory(directory); this.releases = releases; this.execute = execute; this.fetch = fetchImpl; + } + async catalog(product) { + const repository = REPOSITORIES[product]; + if (!repository) throw new Error('release_product_invalid'); + const pages = JSON.parse(await this.execute('gh', ['api', '--paginate', '--slurp', `repos/${repository}/releases?per_page=100`])); + if (!Array.isArray(pages) || pages.length > 20) throw new Error('release_history_capacity'); + return pages.flat().filter(item => !item.draft && !item.prerelease && typeof item.tag_name === 'string' + && VERSION.test(item.tag_name.slice(1)) && item.tag_name.startsWith('v')) + .sort((a, b) => compareVersions(a.tag_name.slice(1), b.tag_name.slice(1))); + } + async import(product, release) { + const repository = REPOSITORIES[product], version = release.tag_name.slice(1); + if (!repository || !VERSION.test(version) || !Number.isSafeInteger(release.id)) throw new Error('release_identity_invalid'); + const archive = `dispatch-${product}-${version}.tar.gz`; + const folder = fs.mkdtempSync(path.join(this.root, '.download-')); + const asset = async (name, max) => { + const matches = release.assets.filter(item => item.name === name); + const url = `https://github.com/${repository}/releases/download/v${version}/${name}`; + if (matches.length !== 1 || matches[0].browser_download_url !== url || matches[0].size > max || matches[0].size < 1) throw new Error('release_asset_invalid'); + const target = path.join(folder, name); + await download(url, target, max, this.fetch); + if (fs.statSync(target).size !== matches[0].size) throw new Error('release_asset_changed'); + return target; + }; + try { + const manifestFile = await asset('release.json', 16 * 1024 * 1024); + const manifest = JSON.parse(fs.readFileSync(manifestFile)); + if (manifest.product !== product || manifest.channel !== 'release' || manifest.version !== version + || manifest.source?.repository !== repository || manifest.source?.ref !== 'refs/heads/main' + || !/^[a-f0-9]{40}$/.test(manifest.source?.commit)) throw new Error('release_identity_invalid'); + const attest = file => this.execute('gh', ['attestation', 'verify', file, '--repo', repository, + '--signer-workflow', `${repository}/.github/workflows/release.yml`, '--source-ref', 'refs/heads/main', + '--source-digest', manifest.source.commit, '--deny-self-hosted-runners']); + await attest(manifestFile); + const tag = JSON.parse(await this.execute('gh', ['api', `repos/${repository}/git/ref/tags/v${version}`])); + if (tag.object?.type !== 'commit' || tag.object.sha !== manifest.source.commit) throw new Error('release_tag_changed'); + const packed = await asset(archive, 512 * 1024 * 1024); + await attest(packed); + const extracted = path.join(folder, 'extracted'); + await this.execute('/usr/bin/python3', [path.join(__dirname, 'extract.py'), packed, extracted]); + const digest = hash(JSON.stringify(manifest)); + const checked = verifyRelease(extracted, digest); + if (JSON.stringify(checked) !== JSON.stringify(manifest)) throw new Error('release_asset_changed'); + for (const item of manifest.plugins) { + if (!/^[a-z][a-z0-9-]{0,63}$/.test(item.pluginId)) throw new Error('release_plugins_invalid'); + const plugin = require('../../shared/plugin-sdk/package-files').verifyPackage(path.join(extracted, 'plugins', item.pluginId), item.digest).plugin; + if (plugin.id !== item.pluginId || plugin.version !== item.version) throw new Error('release_plugins_invalid'); + } + const notes = fs.readFileSync(path.join(extracted, 'release-notes.md'), 'utf8'); + if (Buffer.byteLength(notes) > 100000 || !notes.trim()) throw new Error('release_notes_invalid'); + return await this.releases.stage(extracted, digest, { notes, source: manifest.source, + publishedAt: release.published_at, url: `https://github.com/${repository}/releases/tag/v${version}` }); + } finally { fs.rmSync(folder, { recursive: true, force: true }); } + } + async refresh(product) { + const items = await this.catalog(product); + // Import ascending versions so history is readable and newest wins. Always + // reverify the newest: replacing a published version must fail closed. + for (const item of items) { + const known = Object.values(this.releases.state().releases[product]).some(row => row.version === item.tag_name.slice(1)); + if (!known || item === items.at(-1)) await this.import(product, item); + } + if (!items.length) throw new Error('release_feed_empty'); + const latest = this.releases.state().releases[product][this.releases.state().latest[product]]; + if (latest.version !== items.at(-1).tag_name.slice(1)) throw new Error('release_feed_regressed'); + return latest.digest; + } +} +module.exports = { GitHubReleases, REPOSITORIES, compareVersions, download }; diff --git a/core/updates/local-releases.js b/core/updates/local-releases.js index 4e27b56..2d99aea 100644 --- a/core/updates/local-releases.js +++ b/core/updates/local-releases.js @@ -1,10 +1,11 @@ 'use strict'; -// Local orchestration boundary for the future owner Updates API. Callers supply +// Durable independent release orchestration. Callers supply // lifecycle hooks; constructing this class never starts or modifies a service. const fs=require('node:fs'),path=require('node:path'); const {verifyRelease,secureCopy}=require('../../shared/releases/package'); const {atomic,privateJson}=require('../installations/src/release-delivery-files'); const {privateDirectory,acquireLock}=require('../../host/controller/operations'); +const {compareVersions}=require('./github'); const id=value=>typeof value==='string'&&/^[A-Za-z0-9_-]{1,128}$/.test(value); class LocalReleases { constructor({directory,devDspId,hooks,allowDevelopment=false}) { @@ -13,7 +14,7 @@ class LocalReleases { Object.assign(this,{devDspId,hooks,allowDevelopment}); } state() { - return privateJson(this.file,process.geteuid(),true)||{schemaVersion:1,devDspId:this.devDspId,releases:{core:{},dsp:{}},latest:{core:null,dsp:null},active:{core:null,dsps:{}},tested:null,rollout:null,operation:null}; + return privateJson(this.file,process.geteuid(),true)||{schemaVersion:1,devDspId:this.devDspId,releases:{core:{},dsp:{}},latest:{core:null,dsp:null},active:{core:null,dsps:{}},tested:null,defaultDsp:null,rollout:null,operation:null}; } async locked(work) { const fd=acquireLock({local:this.root}); @@ -22,8 +23,9 @@ class LocalReleases { } save(state){if(Buffer.byteLength(JSON.stringify(state))>256*1024)throw new Error('release_state_capacity');atomic(this.file,state);} - async stage(directory,digest) { + async stage(directory,digest,metadata={}) { const manifest=verifyRelease(directory,digest); + if(manifest.plugins.some(item=>!item||Object.keys(item).sort().join(',')!=='digest,pluginId,version'||!/^[a-z][a-z0-9-]{0,63}$/.test(item.pluginId)||!/^\d+\.\d+\.\d+$/.test(item.version)||!/^[a-f0-9]{64}$/.test(item.digest))||new Set(manifest.plugins.map(item=>item.pluginId)).size!==manifest.plugins.length)throw new Error('release_plugins_invalid'); if(manifest.channel==='development'&&!this.allowDevelopment)throw new Error('release_not_published'); return this.locked(state=>{ if(state.operation)throw new Error('release_recovery_required'); @@ -32,11 +34,18 @@ class LocalReleases { if(releases[digest])return {digest,staged:true}; const target=path.join(privateDirectory(path.join(this.root,'packages',manifest.product)),digest); if(fs.existsSync(target))verifyRelease(target,digest); - else secureCopy(directory,target); + else { + const temporary=target+'.stage-'+require('node:crypto').randomBytes(12).toString('hex'); + try{secureCopy(directory,temporary);verifyRelease(temporary,digest);fs.renameSync(temporary,target);require('../../host/controller/operations').syncDirectory(path.dirname(target));} + finally{fs.rmSync(temporary,{recursive:true,force:true});} + } verifyRelease(target,digest); - releases[digest]={digest,version:manifest.version,protocol:manifest.protocol,directory:target}; - state.latest[manifest.product]=digest; - if(manifest.product==='dsp')state.tested=null; + releases[digest]={digest,version:manifest.version,protocol:manifest.protocol,directory:target,source:metadata.source||null,publishedAt:metadata.publishedAt||null,url:metadata.url||null}; + const latest=state.latest[manifest.product]; + if(!latest||compareVersions(manifest.version,releases[latest].version)>0){ + state.latest[manifest.product]=digest; + if(manifest.product==='dsp')state.tested=null; + } this.save(state);return {digest,staged:true}; }); } @@ -48,11 +57,14 @@ class LocalReleases { if(!core||core.protocol!==manifest.protocol)throw new Error('release_incompatible'); } else for(const selected of Object.values(state.active.dsps))if(state.releases.dsp[selected].protocol!==manifest.protocol)throw new Error('release_incompatible'); const prior=product==='core'?state.active.core:state.active.dsps[dspId]||null; - if(prior===digest)return; const context={product,dspId,digest,previousDigest:prior,directory:release.directory,manifest}; - state.operation={product,dspId,digest,prior,phase:'draining'};this.save(state); + const work=async()=>{ + if(prior===digest&&!await this.hooks.requiresActivation?.(context)){if(await this.hooks.verify(context)!==true)throw new Error('release_health_failed');return;} + state.operation={product,dspId,digest,prior,phase:'preparing'};this.save(state); let snapshot; try { + if(this.hooks.prepare){state.operation.preparation=await this.hooks.prepare(context);context.preparation=state.operation.preparation;} + state.operation.phase='draining';this.save(state); await this.hooks.drain(context);snapshot=await this.hooks.snapshot(context); if(snapshot===undefined)throw new Error('release_snapshot_required'); // The snapshot token must be durable and JSON serializable for recovery. @@ -63,37 +75,48 @@ class LocalReleases { state.operation=null;this.save(state); }catch(error){ state.operation.phase='failed';this.save(state); - try{await this.hooks.restore({...context,snapshot});state.operation=null;this.save(state);}catch{throw new Error('release_recovery_required');} + try{state.operation.phase='restoring';this.save(state);await this.hooks.restore({...context,snapshot});state.operation=null;this.save(state);}catch{state.operation.phase='failed';this.save(state);throw new Error('release_recovery_required');} throw error; } + }; + return this.hooks.withActivation?this.hooks.withActivation(context,work):work(); } updateCore(digest){return this.locked(async state=>{if(state.operation)throw new Error('release_recovery_required');if(digest!==state.latest.core)throw new Error('release_changed');await this.activate(state,'core',digest);});} updateDev(digest){return this.locked(async state=>{ if(state.operation||state.rollout&&state.rollout.status!=='completed')throw new Error('release_busy'); if(digest!==state.latest.dsp)throw new Error('release_changed'); + state.tested=null;this.save(state); await this.activate(state,'dsp',digest,this.devDspId);state.tested=digest;this.save(state); });} - beginRollout(digest,dspIds){return this.locked(state=>{ + beginRollout(digest,dspIds,actor=null){return this.locked(async state=>{ if(state.operation||state.rollout&&state.rollout.status!=='completed')throw new Error('release_busy'); if(digest!==state.latest.dsp||digest!==state.tested)throw new Error('release_dev_required'); if(!Array.isArray(dspIds)||dspIds.some(value=>!id(value))||new Set(dspIds).size!==dspIds.length)throw new Error('release_targets_invalid'); - state.rollout={digest,targets:dspIds.filter(value=>value!==this.devDspId),next:0,status:'running',failure:null};this.save(state); + if(state.active.dsps[this.devDspId]!==digest)throw new Error('release_dev_required'); + state.tested=null;this.save(state); + await this.activate(state,'dsp',digest,this.devDspId);state.tested=digest; + state.rollout={digest,actor,targets:dspIds.filter(value=>value!==this.devDspId),next:0,status:'running',failure:null};this.save(state); });} step(){return this.locked(async state=>{ const rollout=state.rollout; if(state.operation)throw new Error('release_recovery_required'); if(!rollout||rollout.status!=='running')throw new Error('release_rollout_not_running'); - if(rollout.next===rollout.targets.length){rollout.status='completed';this.save(state);return {completed:true};} + if(rollout.next===rollout.targets.length){rollout.status='completed';state.defaultDsp=rollout.digest;this.save(state);return {completed:true};} const dspId=rollout.targets[rollout.next]; - try{await this.activate(state,'dsp',rollout.digest,dspId);rollout.next++;if(rollout.next===rollout.targets.length)rollout.status='completed';} - catch(error){rollout.status='paused';rollout.failure='activation_failed';this.save(state);throw error;} + try{await this.activate(state,'dsp',rollout.digest,dspId);rollout.next++;if(rollout.next===rollout.targets.length){rollout.status='completed';state.defaultDsp=rollout.digest;}} + catch(error){rollout.status='paused';rollout.failure=/^release_[a-z_]+$/.test(error.message)?error.message:'activation_failed';this.save(state);throw error;} this.save(state);return {dspId,digest:rollout.digest,completed:rollout.status==='completed'}; });} resume(){return this.locked(state=>{if(state.operation)throw new Error('release_recovery_required');if(state.rollout?.status!=='paused')throw new Error('release_rollout_not_paused');state.rollout.status='running';state.rollout.failure=null;this.save(state);});} + pause(){return this.locked(state=>{if(state.rollout?.status!=='running')throw new Error('release_rollout_not_running');state.rollout.status='paused';state.rollout.failure='owner_paused';this.save(state);});} recover(){return this.locked(async state=>{ const operation=state.operation;if(!operation)return; const release=state.releases[operation.product][operation.digest]; - await this.hooks.restore({...operation,previousDigest:operation.prior,directory:release.directory,manifest:verifyRelease(release.directory,operation.digest)}); + const context={...operation,previousDigest:operation.prior,directory:release.directory,manifest:verifyRelease(release.directory,operation.digest)}; + state.operation.phase='restoring';this.save(state); + const restore=()=>this.hooks.restore(context); + try{if(this.hooks.withActivation)await this.hooks.withActivation(context,restore);else await restore();} + catch(error){state.operation.phase='failed';this.save(state);throw error;} state.operation=null;if(state.rollout?.status==='running'){state.rollout.status='paused';state.rollout.failure='interrupted';}this.save(state); });} } diff --git a/core/updates/service.js b/core/updates/service.js new file mode 100644 index 0000000..4a827d3 --- /dev/null +++ b/core/updates/service.js @@ -0,0 +1,68 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'); +const { AccessError } = require('../accounts/src/validation'); +const { compareVersions } = require('./github'); +function notes(directory) { + try { + const fd = fs.openSync(path.join(directory, 'release-notes.md'), fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW); + try { if (fs.fstatSync(fd).size > 100000) return 'Release notes unavailable.'; return fs.readFileSync(fd, 'utf8'); } finally { fs.closeSync(fd); } + } catch { return 'Release notes unavailable.'; } +} +function createUpdatesService({ releases, commands, store, devDspId, enabled = true }) { + const fleet = () => store.db.prepare(`SELECT i.runtime_key id,o.name,i.status FROM installations i + JOIN organizations o ON o.id=i.organization_id WHERE i.backend='directory_service_v1' + AND i.status<>'decommissioned' ORDER BY i.runtime_key`).all(); + return { + ownerOnly: true, + command(session, input) { + if (session.user.platformRole !== 'owner' || session.dspView) throw new AccessError('platform_forbidden', 403); + if (!enabled || !commands.worker().available) throw new AccessError('release_worker_unavailable', 503); + const actor = store.userById(session.user.id); + if (actor?.platform_role !== 'owner' || actor.status !== 'active') throw new AccessError('platform_forbidden', 403); + const targets = fleet().map(item => item.id); + if (['update_dev', 'rollout', 'resume'].includes(input.action) && !targets.includes(devDspId)) throw new AccessError('release_dev_unavailable', 409); + const job = commands.request(session.user.id, input, targets); + if (!store.db.prepare('SELECT 1 FROM audit_events WHERE id=?').get(`aud_update_${job.id}`)) store.createAudit({ id: `aud_update_${job.id}`, actorUserId: session.user.id, organizationId: null, + action: `platform.update.${job.action}`, targetType: 'release_update', targetId: job.id, result: 'succeeded', timestamp: job.createdAt }); + return { id: job.id, status: job.status }; + }, + view(selectedId = null) { + const state = releases?.state(), jobs = commands?.list() || [], worker = commands?.worker() || { available: false, status: 'offline' }; + const rows = enabled ? fleet() : [], labels = new Map(rows.map(item => [item.id, item.name])); + const selected = selectedId && /^(core|dsp)_([a-f0-9]{64})$/.exec(selectedId); + if (selectedId && (!selected || !state?.releases[selected[1]][selected[2]])) throw new AccessError('release_not_found', 404); + const busy = Boolean(state?.operation || jobs.some(job => ['queued', 'running'].includes(job.status))); + const tracks = Object.fromEntries(['core', 'dsp'].map(product => { + const releasesFor = state?.releases[product] || {}, latest = state?.latest[product]; + const digest = selected?.[1] === product ? selected[2] : latest; + const item = releasesFor[digest], active = product === 'core' ? state?.active.core : state?.active.dsps[devDspId]; + const history = Object.values(releasesFor).sort((a, b) => compareVersions(b.version, a.version)).map(row => ({ + id: `${product}_${row.digest}`, digest: row.digest, version: row.version, publishedAt: row.publishedAt, + })); + const current = releasesFor[active]; + return [product, { latest, installedVersion: current?.version || null, installedDigest: active || null, + release: item ? { id: `${product}_${item.digest}`, digest: item.digest, version: item.version, + notes: item.notes || notes(item.directory), source: item.source, publishedAt: item.publishedAt, url: item.url } : null, + history, tested: product === 'dsp' && Boolean(latest && state.tested === latest), + canUpdate: enabled && worker.available && !busy && Boolean(latest) && (product === 'core' + ? active !== latest && !['running', 'paused'].includes(state.rollout?.status) + : !['running', 'paused'].includes(state.rollout?.status) && (!state.tested || state.tested !== latest || state.defaultDsp !== latest || rows.some(row => state.active.dsps[row.id] !== latest))), + }]; + })); + const rollout = state?.rollout; + return { mode: 'independent', enabled, worker, busy, tracks, + dev: { id: devDspId || null, name: labels.get(devDspId) || 'Dev DSP', available: labels.has(devDspId) }, + recoveryRequired: Boolean(state?.operation), + operation: state?.operation ? { product: state.operation.product, phase: state.operation.phase, + dspName: labels.get(state.operation.dspId) || null } : null, + rollout: rollout ? { digest: rollout.digest, version: state.releases.dsp[rollout.digest]?.version, + status: rollout.status, failure: rollout.failure, updated: rollout.next, total: rollout.targets.length, + members: rollout.targets.map((id, index) => ({ name: labels.get(id) || 'Removed DSP', + status: state.operation?.dspId === id ? 'updating' : index < rollout.next ? 'updated' : index === rollout.next && rollout.status === 'paused' ? 'paused' : 'queued' })) } : null, + jobs: jobs.slice(-10).reverse().map(job => ({ id: job.id, action: job.action, product: job.product, + status: job.status, failure: job.failure, createdAt: job.createdAt })), + }; + }, + }; +} +module.exports = { createUpdatesService }; diff --git a/core/updates/tests/commands-worker.test.js b/core/updates/tests/commands-worker.test.js new file mode 100644 index 0000000..44312d2 --- /dev/null +++ b/core/updates/tests/commands-worker.test.js @@ -0,0 +1,51 @@ +'use strict'; +const test = require('node:test'), assert = require('node:assert/strict'); +const fs = require('node:fs'), path = require('node:path'), os = require('node:os'); +const { UpdateCommands } = require('../commands'); +const { UpdateWorker } = require('../worker'); +function fixture(t) { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dispatch-commands-')); t.after(() => fs.rmSync(root, { recursive: true, force: true })); + const commands = new UpdateCommands(root), events = []; + let state = { operation: null, rollout: null }; + const releases = { state: () => state, updateCore: async digest => events.push(['core', digest]), + pause: async () => { state.rollout.status = 'paused'; }, recover: async () => { state.operation = null; events.push(['recover']); } }; + const options = { commands, releases, feed: { refresh: async product => events.push(['refresh', product]) }, + invoke: async (action, input) => { events.push([action, input]); }, authorize: async actor => { if (actor !== 'owner') throw new Error('release_actor_forbidden'); } }; + const worker = new UpdateWorker(options); + const request = (action, product = 'dsp', digest = 'a'.repeat(64), key = action) => commands.request('owner', { + action, product, digest, idempotencyKey: `synthetic:command:${key}` }, ['dev', 'a', 'b']); + return { commands, events, releases, options, worker, state, request }; +} +test('queued commands survive reconstruction and duplicate clicks cannot duplicate an update', async t => { + const f = fixture(t), first = f.request('update_core', 'core'); + assert.equal(f.request('update_core', 'core').id, first.id); + assert.equal(f.commands.list().length, 1); + assert.throws(() => f.request('update_core', 'core', 'b'.repeat(64)), /idempotency_conflict/); + await new UpdateWorker(f.options).tick(); + assert.deepEqual(f.events, [['refresh', 'core'], ['core', 'a'.repeat(64)]]); + assert.equal(f.commands.list()[0].status, 'completed'); +}); +test('rollout submission captures the fleet and rechecks the release before activation', async t => { + const f = fixture(t); f.request('rollout'); await f.worker.tick(); + assert.deepEqual(f.events[0], ['refresh', 'dsp']); + assert.deepEqual(f.events[1], ['rollout', { actor: 'owner', digest: 'a'.repeat(64), targets: ['dev', 'a', 'b'] }]); + f.state.rollout = { status: 'running', actor: 'owner', digest: 'a'.repeat(64) }; + await f.worker.tick(); assert.equal(f.events.at(-1)[0], 'step'); +}); +test('revoked owners cannot execute queued updates or advance a fleet', async t => { + const f = fixture(t), job = f.request('update_core', 'core'); job.actor = 'revoked'; f.commands.save(job); + await f.worker.tick(); assert.equal(f.commands.list()[0].failure, 'release_actor_forbidden'); assert.deepEqual(f.events, []); + f.state.rollout = { status: 'running', actor: 'revoked' }; await f.worker.tick(); assert.equal(f.state.rollout.status, 'paused'); +}); +test('worker restart pauses an active fleet and marks an interrupted command without retrying it', async t => { + const f = fixture(t), job = f.request('update_dev'); job.status = 'running'; f.commands.save(job); + f.state.rollout = { status: 'running', actor: 'owner' }; await f.worker.initialize(); + assert.equal(f.commands.list()[0].failure, 'release_interrupted'); assert.equal(f.state.rollout.status, 'paused'); assert.deepEqual(f.events, []); +}); +test('pause can be queued during a step, Core is blocked by an unfinished rollout, and recovery is explicit', async t => { + const f = fixture(t); f.state.rollout = { status: 'running', actor: 'owner' }; + f.request('update_core', 'core'); f.request('pause'); await f.worker.tick(); + assert.equal(f.commands.list().find(job => job.action === 'update_core').failure, 'release_busy'); + await f.worker.tick(); assert.equal(f.events.at(-1)[0], 'pause'); + f.state.operation = { product: 'core' }; f.request('recover', 'core'); await f.worker.tick(); assert.equal(f.state.operation, null); +}); diff --git a/core/updates/tests/github.test.js b/core/updates/tests/github.test.js new file mode 100644 index 0000000..a9ea85a --- /dev/null +++ b/core/updates/tests/github.test.js @@ -0,0 +1,81 @@ +'use strict'; +const test = require('node:test'), assert = require('node:assert/strict'); +const fs = require('node:fs'), path = require('node:path'), os = require('node:os'); +const { execFileSync } = require('node:child_process'); +const { GitHubReleases, compareVersions, download } = require('../github'); +const { LocalReleases } = require('../local-releases'); +const { inventory, hash } = require('../../../shared/releases/package'); +function fixture(t) { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dispatch-feed-')); + t.after(() => fs.rmSync(root, { recursive: true, force: true })); + const hooks = Object.fromEntries(['drain', 'snapshot', 'start', 'verify', 'restore'].map(key => [key, async () => true])); + const releases = new LocalReleases({ directory: path.join(root, 'state'), devDspId: 'dev', hooks }); + const items = [], assets = new Map(), attestations = []; + let denied = false, wrongTag = false; + const execute = async (command, args) => { + if (command === '/usr/bin/python3') return execFileSync(command, args, { encoding: 'utf8' }); + if (args[0] === 'attestation') { attestations.push(args); if (denied) throw new Error('untrusted'); return ''; } + if (args.at(-1).includes('/git/ref/')) return JSON.stringify({ object: { type: 'commit', sha: (wrongTag ? 'b' : 'a').repeat(40) } }); + return JSON.stringify([items]); + }; + const feed = new GitHubReleases({ directory: path.join(root, 'downloads'), releases, execute, + fetchImpl: async url => new Response(assets.get(url)) }); + function add(version, content = version) { + const folder = fs.mkdtempSync(path.join(root, 'source-')); + fs.mkdirSync(path.join(folder, 'code')); fs.writeFileSync(path.join(folder, 'code/value'), content); + fs.writeFileSync(path.join(folder, 'release-notes.md'), `Release ${version}\n\nNew synthetic functionality.`); + const manifest = { schemaVersion: 1, product: 'dsp', version, channel: 'release', protocol: 1, minimumProtocol: 1, + sourceDigest: 'a'.repeat(64), source: { repository: 'dillonlille/dispatch-dsp', commit: 'a'.repeat(40), ref: 'refs/heads/main' }, plugins: [], files: inventory(folder) }; + fs.writeFileSync(path.join(folder, 'release.json'), JSON.stringify(manifest)); + const archive = `dispatch-dsp-${version}.tar.gz`, output = path.join(root, `archive-${items.length}.tgz`); + execFileSync('tar', ['-czf', output, '-C', folder, '.']); + const release = { id: items.length + 1, tag_name: `v${version}`, draft: false, prerelease: false, published_at: '2026-01-01T00:00:00Z', assets: [] }; + for (const [name, buffer] of [['release.json', fs.readFileSync(path.join(folder, 'release.json'))], [archive, fs.readFileSync(output)]]) { + const url = `https://github.com/dillonlille/dispatch-dsp/releases/download/v${version}/${name}`; + assets.set(url, buffer); release.assets.push({ name, size: buffer.length, browser_download_url: url }); + } + items.push(release); return { release, digest: hash(JSON.stringify(manifest)) }; + } + return { feed, releases, add, attestations, items, root, deny: () => { denied = true; }, wrongTag: () => { wrongTag = true; } }; +} +test('verified feed stages history in version order and preserves a completed Dev test', async t => { + const f = fixture(t), newest = f.add('1.10.0'); f.add('1.2.0'); + assert.equal(await f.feed.refresh('dsp'), newest.digest); + assert.equal(f.releases.state().active.dsps.dev, undefined); + const state = f.releases.state(); state.tested = newest.digest; f.releases.save(state); + await f.feed.refresh('dsp'); assert.equal(f.releases.state().tested, newest.digest); + assert.equal(f.releases.state().releases.dsp[newest.digest].source.repository, 'dillonlille/dispatch-dsp'); + assert(f.attestations.every(args => args.includes('--deny-self-hosted-runners') && args.includes('--source-digest'))); + assert.equal(compareVersions('9007199254740993.0.0', '9007199254740992.0.0'), 1); +}); +test('changed publication bytes cannot replace an immutable staged version', async t => { + const f = fixture(t), one = f.add('1.0.0'); await f.feed.refresh('dsp'); + f.items.length = 0; f.add('1.0.0', 'replacement'); + await assert.rejects(f.feed.refresh('dsp'), /release_version_immutable/); + assert.equal(f.releases.state().latest.dsp, one.digest); +}); +test('untrusted provenance, changed tag and foreign asset URLs never stage code', async t => { + for (const defect of ['deny', 'wrongTag', 'url']) { + await t.test(defect, async t => { + const f = fixture(t), { release } = f.add('1.0.0'); + if (defect === 'url') release.assets[0].browser_download_url = 'http://127.0.0.1/private'; else f[defect](); + await assert.rejects(f.feed.refresh('dsp')); + assert.equal(f.releases.state().latest.dsp, null); + }); + } +}); +test('downloads enforce streaming capacity when Content-Length is absent', async t => { + const f = fixture(t); + await assert.rejects(download('https://example.test', path.join(f.root, 'large'), 2, + async () => new Response('overflow')), /release_download_capacity/); +}); +test('extractor rejects traversal and symbolic links before writing outside its root', t => { + const f = fixture(t); + for (const name of ['../escape', '/tmp/escape', 'link']) { + const archive = path.join(f.root, `${name === 'link' ? 'link' : 'path'}.tgz`); + execFileSync('/usr/bin/python3', ['-c', "import tarfile,sys,io\nwith tarfile.open(sys.argv[1],'w:gz') as t:\n m=tarfile.TarInfo(sys.argv[2]);m.type=tarfile.SYMTYPE if sys.argv[2]=='link' else tarfile.REGTYPE;m.linkname='/tmp';t.addfile(m,io.BytesIO())", archive, name]); + assert.throws(() => execFileSync('/usr/bin/python3', [path.join(__dirname, '../extract.py'), archive, + path.join(f.root, `extract-${Math.random()}`)], { stdio: 'pipe' })); + } + assert.equal(fs.existsSync(path.join(f.root, 'escape')), false); +}); diff --git a/core/updates/tests/http.test.js b/core/updates/tests/http.test.js new file mode 100644 index 0000000..b583348 --- /dev/null +++ b/core/updates/tests/http.test.js @@ -0,0 +1,40 @@ +'use strict'; +const test = require('node:test'), assert = require('node:assert/strict'); +const { createPreview } = require('../../../dashboard/examples/independent-updates-preview'); +async function fixture(t) { + const app = await createPreview({ automatic: false }); t.after(() => app.close()); + const headers = user => ({ Cookie: `dispatch_session=${user.token}`, 'Content-Type': 'application/json', 'X-Dispatch-CSRF': user.session.csrfToken }); + const get = user => fetch(`${app.url}/api/platform/updates`, { headers: headers(user) }); + const post = (user, body, extra = {}) => fetch(`${app.url}/api/platform/updates`, { method: 'POST', headers: { ...headers(user), ...extra }, body: JSON.stringify(body) }); + return { ...app, headers, get, post }; +} +test('only platform owner sessions can read and queue independent update commands', async t => { + const f = await fixture(t); + assert.equal((await fetch(`${f.url}/api/platform/updates`)).status, 401); + assert.equal((await f.get(f.owners[0])).status, 403); + const view = await (await f.get(f.owner)).json(); assert.equal(view.data.mode, 'independent'); + assert.equal(view.data.tracks.core.installedVersion, '0.0.1'); assert.equal(view.data.tracks.dsp.installedVersion, '0.0.1'); + const body = { action: 'update_dev', product: 'dsp', digest: view.data.tracks.dsp.latest, idempotencyKey: 'synthetic:http:update-dev' }; + assert.equal((await f.post(f.owners[0], body)).status, 403); + assert.equal((await f.post(f.owner, body, { 'X-Dispatch-CSRF': 'wrong' })).status, 403); + assert.equal(f.commands.list().length, 0); + assert.equal((await f.post(f.owner, body)).status, 200); + assert.equal((await f.post(f.owner, body)).status, 200); + assert.equal(f.commands.list().length, 1); + assert.equal(f.store.db.prepare("SELECT count(*) n FROM audit_events WHERE action='platform.update.update_dev'").get().n, 1); + await f.worker.tick(); assert.equal(f.releases.state().tested, body.digest); + assert.equal(f.releases.state().active.dsps[f.dsps[1]] === body.digest, false); +}); +test('a new release between owner review and rollout resets Dev and refuses the stale command', async t => { + const f = await fixture(t), digest = f.releases.state().latest.dsp; + await f.releases.updateDev(digest); + const body = { action: 'rollout', product: 'dsp', digest, idempotencyKey: 'synthetic:http:rollout' }; + assert.equal((await f.post(f.owner, body)).status, 200); + await f.publish('dsp', '0.0.3'); await f.worker.tick(); + assert.equal(f.commands.list()[0].failure, 'release_dev_required'); + assert.equal(f.releases.state().rollout, null); + const view = await (await f.get(f.owner)).json(); assert.equal(view.data.tracks.dsp.tested, false); + const historical = await fetch(`${f.url}/api/platform/updates?releaseId=dsp_${digest}`, { headers: f.headers(f.owner) }); + const selected = await historical.json(); assert.equal(selected.data.tracks.dsp.release.version, '0.0.2'); + assert.equal(JSON.stringify(view).includes(f.root), false); +}); diff --git a/core/updates/tests/lifecycle.test.js b/core/updates/tests/lifecycle.test.js new file mode 100644 index 0000000..d410388 --- /dev/null +++ b/core/updates/tests/lifecycle.test.js @@ -0,0 +1,226 @@ +'use strict'; +const test = require('node:test'), assert = require('node:assert/strict'); +const fs = require('node:fs'), path = require('node:path'), os = require('node:os'); +const { DatabaseSync } = require('node:sqlite'); +const { LocalReleases } = require('../local-releases'); +const { coreHooks, receiptFile } = require('../../../host/releases/core'); +const { dspHooks } = require('../../../host/releases/dsp'); +const { atomic } = require('../../installations/src/release-delivery-files'); +const { privateDirectory } = require('../../../host/controller/operations'); +const { ensureDsp } = require('../../../host/storage/storage'); +const { fileFor, prepareDspRelease, selectDspRelease } = require('../../../host/releases/runtime'); +const { hash, inventory, secureCopy } = require('../../../shared/releases/package'); +const DEV = `dsp_${'a'.repeat(32)}`, OTHER = `dsp_${'b'.repeat(32)}`; +function fixture(t) { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dispatch-update-lifecycle-')); + t.after(() => fs.rmSync(root, { recursive: true, force: true })); + const paths = { platformRoot: root }; + for (const name of ['local', 'live', 'dsps', 'dev', 'worktrees']) { paths[name] = path.join(root, name); fs.mkdirSync(paths[name], { mode: 0o700 }); } + privateDirectory(path.join(paths.local, 'config')); privateDirectory(path.join(paths.local, 'state/access-control')); + atomic(path.join(paths.local, 'config/platform.json'), { version: 1, platformRoot: root }); + const database = path.join(paths.local, 'state/access-control/access-control.sqlite3'); + const db = new DatabaseSync(database); fs.chmodSync(database, 0o600); + db.exec("CREATE TABLE users(id TEXT,platform_role TEXT,status TEXT); INSERT INTO users VALUES('owner','owner','active'); CREATE TABLE marker(value TEXT); INSERT INTO marker VALUES('before');"); + db.close(); + function artifact(product, version) { + const directory = path.join(root, `${product}-${version}`); fs.mkdirSync(directory, { mode: 0o700 }); + fs.mkdirSync(path.join(directory, 'code'), { mode: 0o755 }); + fs.writeFileSync(path.join(directory, 'code/value.js'), `module.exports='${version}';`, { mode: 0o644 }); + const manifest = { schemaVersion: 1, product, version, channel: 'development', protocol: 1, minimumProtocol: 1, sourceDigest: 'a'.repeat(64), plugins: [], files: inventory(directory) }; + fs.writeFileSync(path.join(directory, 'release.json'), JSON.stringify(manifest), { mode: 0o600 }); + return { directory, digest: hash(JSON.stringify(manifest)), manifest }; + } + return { root, paths, database, artifact }; +} +async function coreFixture(t) { + const f = fixture(t), before = f.artifact('core', '1.0.0'), next = f.artifact('core', '1.1.0'); + fs.rmdirSync(f.paths.live); secureCopy(path.join(before.directory, 'code'), f.paths.live); + let releases, fail = false; + const events = []; + const hooks = coreHooks({ paths: f.paths, configuration: { apiPort: 4999 }, releases: () => releases.state(), healthTimeoutMs: 5, + systemctl: async args => { + events.push(args); + if (args[0] === 'show') return 'ActiveState=inactive\nMainPID=0\nControlPID=0\n'; + if (args[0] === 'start' && args[1] === 'dispatch-api.service') { + const current = JSON.parse(fs.readFileSync(receiptFile(f.paths))); + if (current.digest === next.digest) { + const db = new DatabaseSync(f.database); db.exec("ALTER TABLE marker ADD COLUMN migrated INTEGER; UPDATE marker SET value='after';"); db.close(); + privateDirectory(path.join(f.paths.local, 'state/new-migration')); + fs.writeFileSync(path.join(f.paths.local, 'state/new-file.json'), '{}', { mode: 0o600 }); + } + } + return ''; + }, fetchImpl: async () => { + const current = JSON.parse(fs.readFileSync(receiptFile(f.paths))); + return new Response(JSON.stringify({ ok: true, data: { ...current, recoveryProbe: 'passed', digest: fail && current.digest === next.digest ? 'wrong' : current.digest } })); + } }); + releases = new LocalReleases({ directory: path.join(f.paths.local, 'state/updates'), devDspId: DEV, allowDevelopment: true, hooks }); + await releases.stage(before.directory, before.digest); await releases.stage(next.directory, next.digest); + const state = releases.state(); state.active.core = before.digest; releases.save(state); + return { ...f, before, next, releases, hooks, events, fail: () => { fail = true; } }; +} +test('Core activation swaps only Core code and verifies the new service identity', async t => { + const f = await coreFixture(t); fs.writeFileSync(path.join(f.paths.dsps, 'unchanged'), 'DSP state', { mode: 0o600 }); + await f.releases.updateCore(f.next.digest); + assert.match(fs.readFileSync(path.join(f.paths.live, 'value.js'), 'utf8'), /1.1.0/); + assert.equal(fs.readFileSync(path.join(f.paths.dsps, 'unchanged'), 'utf8'), 'DSP state'); + assert.equal(f.releases.state().active.core, f.next.digest); + assert.equal(f.events.filter(args => args[0] === 'stop').length, 3); +}); +test('Core failed health restores the previous code and compatible database schema', async t => { + const f = await coreFixture(t); f.fail(); + await assert.rejects(f.releases.updateCore(f.next.digest), /release_health_failed/); + assert.match(fs.readFileSync(path.join(f.paths.live, 'value.js'), 'utf8'), /1.0.0/); + const db = new DatabaseSync(f.database); + try { assert.deepEqual(db.prepare('SELECT * FROM marker').get(), Object.assign(Object.create(null), { value: 'before' })); } + finally { db.close(); } + assert.equal(fs.existsSync(path.join(f.paths.local, 'state/new-migration')), false); + assert.equal(fs.existsSync(path.join(f.paths.local, 'state/new-file.json')), false); + assert.equal(f.releases.state().active.core, f.before.digest); assert.equal(f.releases.state().operation, null); +}); +test('Core recovery repairs a crash between the two live-directory renames', async t => { + const f = await coreFixture(t); + const c = { product: 'core', digest: f.next.digest, previousDigest: f.before.digest, directory: f.next.directory, manifest: f.next.manifest }; + c.preparation = await f.hooks.prepare(c); await f.hooks.drain(c); c.snapshot = await f.hooks.snapshot(c); + fs.renameSync(f.paths.live, path.join(f.paths.local, 'backups/updates/core', c.preparation.id, 'previous')); + const state = f.releases.state(); state.operation = { ...c, prior: c.previousDigest, phase: 'starting' }; f.releases.save(state); + const recoveredPaths = require('../../../host/releases/setup').loadWorkerPaths(path.join(f.paths.local, 'config/platform.json')); + assert.equal(recoveredPaths.live, f.paths.live); + await f.releases.recover(); assert.match(fs.readFileSync(path.join(f.paths.live, 'value.js'), 'utf8'), /1.0.0/); + assert.equal(f.releases.state().operation, null); +}); +async function dspFixture(t) { + const f = fixture(t), before = f.artifact('dsp', '1.0.0'), next = f.artifact('dsp', '1.1.0'), core = f.artifact('core', '1.0.0'); + const db = new DatabaseSync(f.database); t.after(() => db.close()); + db.exec('CREATE TABLE installations(runtime_key TEXT,organization_id TEXT,backend TEXT,status TEXT,revision INTEGER); CREATE TABLE dsp_plugins(organization_id TEXT,plugin_id TEXT,version TEXT,desired_state TEXT,revision INTEGER,applied_revision INTEGER,failure_code TEXT); CREATE TABLE directory_lifecycle_requests(organization_id TEXT,status TEXT); CREATE TABLE installation_onboarding_requests(organization_id TEXT,status TEXT);'); + const records = new Map(), roots = new Map(); let failed = false; + for (const id of [DEV, OTHER]) { + const creationId = `create_${id.slice(4)}`; + roots.set(id, ensureDsp(f.paths, id, creationId).root); + records.set(id, { id, creationId, latestRequest: 'a'.repeat(64), desiredState: 'running' }); + db.prepare('INSERT INTO installations VALUES(?,?,?,?,?)').run(id, id, 'directory_service_v1', 'ready', 1); + fs.writeFileSync(path.join(roots.get(id), 'data/value'), 'private before', { mode: 0o600 }); + fs.writeFileSync(path.join(roots.get(id), 'secrets/value'), `secret ${id}`, { mode: 0o600 }); + prepareDspRelease(f.paths, id, before.directory, before.digest); selectDspRelease(f.paths, id, before.digest, null); + } + const manager = { journal: { record: id => records.get(id), saveRecord: value => records.set(value.id, value) }, checkedDsp: record => ({ root: roots.get(record.id) }), + credentials: () => {}, bridge: async () => {}, ready: async id => { + if (failed && JSON.parse(fs.readFileSync(fileFor(f.paths, id))).digest === next.digest) throw new Error('release_health_failed'); + }, host: { stop: async () => {}, prepare: async () => {}, start: async id => { + if (JSON.parse(fs.readFileSync(fileFor(f.paths, id))).digest === next.digest) fs.writeFileSync(path.join(roots.get(id), 'data/value'), 'migrated', { mode: 0o600 }); + } } }; + const sleepingRows = new Map(); + const execution = { eligible: id => sleepingRows.has(id), store: { get: id => sleepingRows.get(id), + update: (id, values) => sleepingRows.set(id, { ...sleepingRows.get(id), ...values }) }, + checkpoint: async () => ({ nextWakeAt: null }), locked: (_id, work) => work() }; + const hooks = dspHooks({ paths: f.paths, store: { db }, manager, execution }); + const releases = new LocalReleases({ directory: path.join(f.paths.local, 'state/updates'), devDspId: DEV, allowDevelopment: true, hooks }); + for (const item of [core, before, next]) await releases.stage(item.directory, item.digest); + const state = releases.state(); state.active = { core: core.digest, dsps: { [DEV]: before.digest, [OTHER]: before.digest } }; releases.save(state); + return { ...f, before, next, releases, roots, records, sleepingRows, sleep(id) { + const operation = 'sleep_' + 'e'.repeat(32), current = records.get(id); + records.set(id, { ...current, desiredState: 'stopped', latestRequest: require('node:crypto').createHash('sha256').update(operation).digest('hex') }); + sleepingRows.set(id, { mode: 'on_demand', state: 'sleeping', operation_id: operation, next_wake_at: null, check_at: null, last_activity: 1000, snapshot_ready: 1, failure_code: null }); + }, fail: () => { failed = true; } }; +} +test('Dev activation changes only Dev runtime and leaves other DSP credentials and data intact', async t => { + const f = await dspFixture(t); await f.releases.updateDev(f.next.digest); + assert.equal(f.releases.state().active.dsps[DEV], f.next.digest); + assert.equal(f.releases.state().active.dsps[OTHER], f.before.digest); + assert.equal(fs.readFileSync(path.join(f.roots.get(OTHER), 'data/value'), 'utf8'), 'private before'); + assert.equal(fs.readFileSync(path.join(f.roots.get(DEV), 'secrets/value'), 'utf8'), `secret ${DEV}`); +}); +test('failed DSP activation restores private state and runtime receipt without touching another DSP', async t => { + const f = await dspFixture(t); f.fail(); await assert.rejects(f.releases.updateDev(f.next.digest), /release_health_failed/); + assert.equal(fs.readFileSync(path.join(f.roots.get(DEV), 'data/value'), 'utf8'), 'private before'); + assert.equal(JSON.parse(fs.readFileSync(fileFor(f.paths, DEV))).digest, f.before.digest); + assert.equal(f.releases.state().tested, null); +}); +test('stopped DSPs cannot be revived by an update', async t => { + const f = await dspFixture(t); f.records.get(DEV).desiredState = 'stopped'; + await assert.rejects(f.releases.updateDev(f.next.digest), /release_dsp_not_ready/); + assert.equal(f.records.get(DEV).desiredState, 'stopped'); + assert.equal(JSON.parse(fs.readFileSync(fileFor(f.paths, DEV))).digest, f.before.digest); +}); +test('new DSP provisioning uses the completed fleet release while Dev has a newer candidate', async t => { + const f = await dspFixture(t), id = `dsp_${'c'.repeat(32)}`; + const state = f.releases.state(); state.defaultDsp = f.before.digest; f.releases.save(state); + atomic(path.join(f.paths.local, 'config/updates.json'), { schemaVersion: 1, devDspId: DEV, apiPort: 4999 }); + await f.releases.updateDev(f.next.digest); + await require('../../../host/releases/provisioning').withCreation(f.paths, 'create', assign => + require('../../../host/controller/operations').withLock(f.paths, async fd => { + ensureDsp(f.paths, id, `create_${'c'.repeat(32)}`); await assign(id, fd); + })); + assert.equal(JSON.parse(fs.readFileSync(fileFor(f.paths, id))).digest, f.before.digest); + assert.equal(f.releases.state().active.dsps[id], f.before.digest); + assert.equal(f.releases.state().active.dsps[DEV], f.next.digest); +}); + +test('Core state recovery can restart after clearing configuration without losing updater bootstrap files', t => { + const f = fixture(t), backup = privateDirectory(path.join(f.root, 'backup')); + const configuration = { schemaVersion: 1, devDspId: DEV, apiPort: 4999 }; + atomic(path.join(f.paths.local, 'config/updates.json'), configuration); + atomic(path.join(f.paths.local, 'config/extra.json'), { before: true }); + const state = require('../../../host/releases/core-state'); + const roots = state.capture(f.paths, backup); + const files = require('../../../host/storage/backup-files'), original = files.copyContents; + files.copyContents = () => { throw new Error('simulated_power_loss'); }; + try { assert.throws(() => state.restore(f.paths, backup, roots), /simulated_power_loss/); } + finally { files.copyContents = original; } + assert.equal(require('../../../host/releases/setup').loadWorkerPaths(path.join(f.paths.local, 'config/platform.json')).platformRoot, f.root); + assert.deepEqual(require('../configuration').loadConfiguration(f.paths), configuration); + state.restore(f.paths, backup, roots); + assert.deepEqual(JSON.parse(fs.readFileSync(path.join(f.paths.local, 'config/extra.json'))), { before: true }); +}); +test('updater bootstrap follows the active verified Core and rejects changed worker bytes', async t => { + const f = fixture(t), candidate = f.artifact('core', '1.2.0'); + fs.mkdirSync(path.join(candidate.directory, 'code/bin'), { mode: 0o755 }); + fs.writeFileSync(path.join(candidate.directory, 'code/bin/dispatch-updates'), '#!/usr/bin/env node\n', { mode: 0o755 }); + fs.unlinkSync(path.join(candidate.directory, 'release.json')); + candidate.manifest.channel = 'release'; candidate.manifest.files = inventory(candidate.directory); + fs.writeFileSync(path.join(candidate.directory, 'release.json'), JSON.stringify(candidate.manifest), { mode: 0o600 }); + candidate.digest = hash(JSON.stringify(candidate.manifest)); + const hooks = Object.fromEntries(['drain', 'snapshot', 'start', 'verify', 'restore'].map(name => [name, async () => {}])); + const releases = new LocalReleases({ directory: path.join(f.paths.local, 'state/updates'), devDspId: DEV, hooks }); + const { workerEntrypoint } = require('../../../host/releases/setup'); + assert.equal(workerEntrypoint(f.paths, __filename), null); + await releases.stage(candidate.directory, candidate.digest); + const state = releases.state(); state.active.core = candidate.digest; releases.save(state); + const entry = path.join(state.releases.core[candidate.digest].directory, 'code/bin/dispatch-updates'); + assert.equal(workerEntrypoint(f.paths, __filename), entry); + assert.equal(workerEntrypoint(f.paths, entry), null); + fs.writeFileSync(entry, 'changed'); + assert.throws(() => workerEntrypoint(f.paths, __filename), /release_digest_mismatch/); +}); + +test('idle DSPs wake for an update and for a later Dev health check, while owner stops remain protected', async t => { + const f = await dspFixture(t); f.sleep(DEV); + await f.releases.updateDev(f.next.digest); + assert.equal(f.records.get(DEV).desiredState, 'running'); + assert.equal(f.sleepingRows.get(DEV).state, 'starting'); + f.sleep(DEV); + await f.releases.beginRollout(f.next.digest, [DEV, OTHER], 'owner'); + assert.equal(f.records.get(DEV).desiredState, 'running'); + assert.equal(f.releases.state().rollout.status, 'running'); +}); +test('a failed update returns an idle DSP to its previous release and sleeping state', async t => { + const f = await dspFixture(t); f.sleep(DEV); const before = { ...f.sleepingRows.get(DEV) }; f.fail(); + await assert.rejects(f.releases.updateDev(f.next.digest), /release_health_failed/); + assert.equal(f.records.get(DEV).desiredState, 'stopped'); + assert.deepEqual(f.sleepingRows.get(DEV), before); + assert.equal(JSON.parse(fs.readFileSync(fileFor(f.paths, DEV))).digest, f.before.digest); +}); +test('a newer owner stop supersedes the scheduler sleep permission', async t => { + const f = await dspFixture(t); f.sleep(DEV); f.records.get(DEV).latestRequest = 'f'.repeat(64); + await assert.rejects(f.releases.updateDev(f.next.digest), /release_dsp_not_ready/); + assert.equal(f.records.get(DEV).desiredState, 'stopped'); +}); + +test('permanent Dev configuration rejects replacement with another ready DSP', async t => { + const f = await dspFixture(t), journal = new (require('../../../host/controller/journal').DirectoryJournal)(f.paths); + for (const record of f.records.values()) journal.saveRecord({ version: 1, tokenHash: null, ...record }); + const { configure } = require('../../../host/releases/setup'); + assert.equal(configure(f.paths, DEV, 4999).configured, true); + assert.throws(() => configure(f.paths, OTHER, 4999), /release_dev_identity_changed/); + assert.equal(require('../configuration').loadConfiguration(f.paths).devDspId, DEV); +}); diff --git a/core/updates/tests/local-releases.test.js b/core/updates/tests/local-releases.test.js index a31f695..58c78a7 100644 --- a/core/updates/tests/local-releases.test.js +++ b/core/updates/tests/local-releases.test.js @@ -33,6 +33,7 @@ test('staging is inert; Dev approval resets on a new release and sequential roll await f.app.stage(three.directory,three.digest);await f.app.step(); assert.equal(f.app.state().active.dsps.b,two.digest);assert.equal(f.app.state().latest.dsp,three.digest);assert.equal(f.app.state().tested,null); assert.equal(new LocalReleases(f.options).state().rollout.status,'completed'); + assert.equal(f.app.state().defaultDsp,two.digest); // A newly published candidate is not the provisioning default. }); test('failed health restores the selected DSP, pauses rollout and resumes without repeating completed targets',async t=>{ const f=fixture(t),core=f.artifact('core','1.0.0'),dsp=f.artifact('dsp','1.0.0'); @@ -66,3 +67,10 @@ test('development artifacts are refused by publication mode and interrupted acti const state=f.app.state();state.operation={product:'core',digest:core.digest,prior:null,dspId:null,snapshot:{value:7},phase:'starting'};f.app.save(state); await assert.rejects(f.app.updateCore(core.digest),/release_recovery_required/);await f.app.recover();assert.equal(f.app.state().operation,null);assert.equal(f.data.null,7); }); +test('a failed fresh Dev health check revokes rollout eligibility',async t=>{ + const f=fixture(t),core=f.artifact('core','1.0.0'),dsp=f.artifact('dsp','1.0.0'); + await f.app.stage(core.directory,core.digest);await f.app.updateCore(core.digest); + await f.app.stage(dsp.directory,dsp.digest);await f.app.updateDev(dsp.digest); + f.fail('dev');await assert.rejects(f.app.beginRollout(dsp.digest,['a']),/release_health_failed/); + assert.equal(f.app.state().tested,null);assert.equal(f.app.state().rollout,null); +}); diff --git a/core/updates/transport.js b/core/updates/transport.js new file mode 100644 index 0000000..0d9535e --- /dev/null +++ b/core/updates/transport.js @@ -0,0 +1,21 @@ +'use strict'; +const path = require('node:path'); +const { PluginSdkSocket } = require('../../host/plugins/sdk-socket'); +const { createPrivateTransport } = require('../../sdk/node'); +const { result, failure, unwrap, exact } = require('../../sdk/src/protocol'); +const { privateDirectory } = require('../../host/controller/operations'); +const fileFor = paths => path.join(paths.local, 'run/updates/api.sock'); +function client(paths) { + const transport = createPrivateTransport({ socketPath: fileFor(paths), timeoutMs: 3660000 }); + return async (action, input = {}) => unwrap(await transport.request({ action, input })); +} +async function serve({ paths, execute }) { + privateDirectory(path.dirname(fileFor(paths))); + const socket = new PluginSdkSocket({ file: fileFor(paths), maximum: 2, timeoutMs: 3660000, + transport: { async request(value) { + try { exact(value, ['action', 'input']); return result(await execute(value.action, value.input)); } + catch (error) { return failure(/^release_|^directory_/.test(error.message) ? error.message : 'release_activation_failed', true); } + } } }); + await socket.start(); return socket; +} +module.exports = { client, serve }; diff --git a/core/updates/worker.js b/core/updates/worker.js new file mode 100644 index 0000000..c5c0227 --- /dev/null +++ b/core/updates/worker.js @@ -0,0 +1,98 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'); +const { DatabaseSync } = require('node:sqlite'); +const { acquireLock } = require('../../host/controller/operations'); +const { LocalReleases } = require('./local-releases'); +const { UpdateCommands } = require('./commands'); +const { GitHubReleases } = require('./github'); +const { rootFor, loadConfiguration } = require('./configuration'); +const { coreHooks } = require('../../host/releases/core'); +const { client } = require('./transport'); +function authorizeOwner(paths, actorId) { + const file = path.join(paths.local, 'state/access-control/access-control.sqlite3'); + require('../../host/storage/backup-files').checked(file, false); + const db = new DatabaseSync(file, { readOnly: true }); + try { + const actor = db.prepare('SELECT platform_role,status FROM users WHERE id=?').get(actorId); + if (actor?.platform_role !== 'owner' || actor.status !== 'active') throw new Error('release_actor_forbidden'); + } finally { db.close(); } +} +class UpdateWorker { + constructor({ releases, commands, feed, invoke, authorize, clock = Date.now }) { + Object.assign(this, { releases, commands, feed, invoke, authorize, clock }); + this.lastRefresh = 0; this.pending = null; this.closed = false; + } + async initialize() { + for (const job of this.commands.list().filter(job => job.status === 'running')) { + job.status = 'failed'; job.failure = 'release_interrupted'; job.completedAt = this.clock(); this.commands.save(job); + } + const state = this.releases.state(); + if (!state.operation && state.rollout?.status === 'running') await this.releases.pause(); + this.commands.heartbeat(); + } + async execute(job) { + await this.authorize(job.actor); + if (['refresh', 'update_core', 'update_dev', 'rollout'].includes(job.action)) await this.feed.refresh(job.product); + await this.authorize(job.actor); + if (job.action === 'refresh') return; + if (job.action === 'update_core') { + if (['running', 'paused'].includes(this.releases.state().rollout?.status)) throw new Error('release_busy'); + return this.releases.updateCore(job.digest); + } + if (job.action === 'recover' && this.releases.state().operation?.product === 'core') return this.releases.recover(); + const input = { actor: job.actor }; + if (['update_dev', 'rollout'].includes(job.action)) input.digest = job.digest; + if (job.action === 'rollout') input.targets = job.targets; + await this.invoke(job.action, input); + } + tick() { + if (this.pending) return this.pending; + this.pending = this.run().finally(() => { this.pending = null; }); + return this.pending; + } + async run() { + const job = this.commands.list().find(item => item.status === 'queued'); + if (job) { + job.status = 'running'; this.commands.save(job); + try { await this.execute(job); job.status = 'completed'; job.failure = null; } + catch (error) { job.status = 'failed'; job.failure = /^release_[a-z_]+$/.test(error.message) ? error.message : 'release_operation_failed'; } + job.completedAt = this.clock(); this.commands.save(job); return; + } + const state = this.releases.state(); + if (state.operation) return; + if (state.rollout?.status === 'running') { + try { await this.authorize(state.rollout.actor); await this.invoke('step', { actor: state.rollout.actor }); } + catch { if (!this.releases.state().operation && this.releases.state().rollout?.status === 'running') await this.releases.pause(); } + return; + } + if (this.clock() - this.lastRefresh >= 300000) { + this.lastRefresh = this.clock(); + for (const product of ['core', 'dsp']) { + try { await this.feed.refresh(product); } + catch { this.commands.heartbeat('feed_unavailable'); } + } + } + } + async close() { this.closed = true; await this.pending; this.commands.heartbeat('stopped'); } +} +async function startWorker(paths, dependencies = {}) { + const configuration = loadConfiguration(paths); + if (!configuration) throw new Error('release_configuration_required'); + const directory = rootFor(paths), lock = acquireLock({ local: path.join(directory, 'worker-lock') }, 'controller'); + let releases; + const commands = new UpdateCommands(directory); + releases = new LocalReleases({ directory, devDspId: configuration.devDspId, + hooks: coreHooks({ paths, configuration, releases: () => releases.state(), ...dependencies }) }); + const feed = new GitHubReleases({ directory: path.join(directory, 'downloads'), releases }); + const worker = new UpdateWorker({ releases, commands, feed, invoke: client(paths), authorize: actor => authorizeOwner(paths, actor) }); + try { await worker.initialize(); } catch (error) { fs.closeSync(lock); throw error; } + const heartbeat = setInterval(() => commands.heartbeat(), 10000); + let timer; + const loop = () => { if (!worker.closed) worker.tick().catch(() => commands.heartbeat('unavailable')).finally(() => { + if (!worker.closed) timer = setTimeout(loop, 1000); + }); }; + loop(); + let closing; + return { worker, close() { return closing ||= (async () => { clearTimeout(timer); clearInterval(heartbeat); await worker.close(); fs.closeSync(lock); })(); } }; +} +module.exports = { UpdateWorker, startWorker, authorizeOwner }; diff --git a/dashboard/examples/independent-updates-preview.js b/dashboard/examples/independent-updates-preview.js new file mode 100644 index 0000000..4b7a0ea --- /dev/null +++ b/dashboard/examples/independent-updates-preview.js @@ -0,0 +1,86 @@ +#!/usr/bin/env node +'use strict'; +// Explicit synthetic fixture. The real API, command queue and release coordinator +// run here; host services and GitHub publication are simulated in private temp data. +const fs = require('node:fs'), path = require('node:path'), os = require('node:os'); +const { AccessStore, AccessControlService } = require('../../core/accounts/src'); +const { LocalReleases } = require('../../core/updates/local-releases'); +const { UpdateCommands } = require('../../core/updates/commands'); +const { UpdateWorker } = require('../../core/updates/worker'); +const { createUpdatesService } = require('../../core/updates/service'); +const { hash, inventory } = require('../../shared/releases/package'); +const { createDashboardServer } = require('../server/server'); +async function createPreview({ port = 0, automatic = true } = {}) { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dispatch-independent-updates-')); + const store = new AccessStore({ databaseRoot: path.join(root, 'access'), database: path.join(root, 'access/control.sqlite3') }); + const access = new AccessControlService(store, { installationOperatorEnabled: true, installationBackend: 'directory_service_v1' }); + const bootstrap = access.createPlatformBootstrap({ email: 'platform@example.test' }), password = 'synthetic preview password'; + const owner = await access.acceptNewUser({ token: bootstrap.token, firstName: 'Platform', lastName: 'Owner', password, confirmPassword: password }); + const dsps = [], owners = []; + for (const [index, name] of ['Dev DSP', 'Northline Logistics', 'Cedar Delivery'].entries()) { + const invitation = access.createOrganization(owner.session, { idempotencyKey: `preview:updates:dsp:${index}`, + ownerEmail: `owner${index}@example.test`, name, stationCode: 'TST1', timezone: 'UTC' }); + store.db.prepare("UPDATE installations SET status='ready' WHERE organization_id=?").run(invitation.organization.id); + store.updateOrganizationStatus(invitation.organization.id, 'active', Date.now()); + owners.push(await access.acceptNewUser({ token: invitation.token, firstName: 'DSP', lastName: 'Owner', password, confirmPassword: password })); + dsps.push(store.installationControl(invitation.organization.id).runtimeKey); + } + let failNext = false, events = []; + const hooks = { drain: async c => { events.push(['drain', c.product, c.dspId]); }, + snapshot: async () => ({ synthetic: true }), start: async () => {}, restore: async c => { events.push(['restore', c.dspId]); }, + verify: async c => { if (failNext && c.dspId === [...dsps.slice(1)].sort()[0]) { failNext = false; return false; } return true; } }; + const releases = new LocalReleases({ directory: path.join(root, 'updates'), devDspId: dsps[0], hooks, allowDevelopment: true }); + async function publish(product, version) { + const directory = path.join(root, `${product}-${version}`); fs.mkdirSync(directory, { mode: 0o700 }); + fs.mkdirSync(path.join(directory, 'code')); fs.writeFileSync(path.join(directory, 'code/version.json'), JSON.stringify({ version })); + fs.writeFileSync(path.join(directory, 'release-notes.md'), product === 'core' + ? 'Independent platform updates\n\n• Manage Core releases separately from DSP releases.\n• See installation progress and recover interrupted updates.\n• Keep installed DSP runtimes and plugins unchanged.' + : 'A better Paycom experience\n\n• Keep each DSP’s settings and credentials independent.\n• Display employee names as First Last by default.\n• Test plugin improvements on Dev before updating your fleet.'); + const manifest = { schemaVersion: 1, product, version, channel: 'development', protocol: 1, minimumProtocol: 1, + sourceDigest: 'a'.repeat(64), plugins: [], files: inventory(directory) }; + fs.writeFileSync(path.join(directory, 'release.json'), JSON.stringify(manifest)); + const digest = hash(JSON.stringify(manifest)); await releases.stage(directory, digest); return digest; + } + const core = await publish('core', '0.0.1'), dsp = await publish('dsp', '0.0.1'); + const state = releases.state(); state.active = { core, dsps: Object.fromEntries(dsps.map(id => [id, dsp])) }; releases.save(state); + await publish('core', '0.0.2'); await publish('dsp', '0.0.2'); + const commands = new UpdateCommands(path.join(root, 'updates')); + const worker = new UpdateWorker({ releases, commands, feed: { refresh: async product => releases.state().latest[product] }, + authorize: actor => { const row = store.userById(actor); if (row?.platform_role !== 'owner' || row.status !== 'active') throw new Error('release_actor_forbidden'); }, + invoke: async (action, input) => { + if (action === 'update_dev') await releases.updateDev(input.digest); + else if (action === 'rollout') await releases.beginRollout(input.digest, input.targets, input.actor); + else if (action === 'step') await releases.step(); + else if (action === 'pause') await releases.pause(); + else if (action === 'resume') await releases.resume(); + else if (action === 'recover') await releases.recover(); + else throw new Error('release_command_invalid'); + } }); + await worker.initialize(); + const updates = createUpdatesService({ releases, commands, store, devDspId: dsps[0] }); + const unavailable = async () => ({ ok: false, status: 'installation_not_ready', data: null, error: { code: 'installation_not_ready' } }); + const server = createDashboardServer({ access, updates, plugins: { catalog: () => ({ items: [] }) }, + client: { workforce: { day: unavailable }, sync: { status: unavailable, runNow: unavailable }, system: { status: unavailable } } }); + const original = server.listeners('request')[0]; server.removeAllListeners('request'); + server.on('request', async (request, response) => { + if (request.method === 'POST' && ['/__fixture/publish', '/__fixture/fail'].includes(request.url)) { + if (request.url.endsWith('/publish')) await publish('dsp', '0.0.3'); else failNext = true; + response.writeHead(200, { 'Content-Type': 'application/json' }); response.end('{}'); return; + } + original(request, response); + }); + await new Promise(resolve => server.listen(port, '127.0.0.1', resolve)); + const timer = automatic && setInterval(() => { commands.heartbeat(); worker.tick().catch(() => {}); }, 150); + return { root, store, access, owner, owners, dsps, releases, commands, worker, events, publish, server, + url: `http://127.0.0.1:${server.address().port}`, + async close() { clearInterval(timer); await worker.close(); await new Promise(resolve => server.close(resolve)); store.close(); fs.rmSync(root, { recursive: true, force: true }); } }; +} +if (require.main === module) { + if (process.env.DISPATCH_INDEPENDENT_UPDATES_FIXTURE !== '1') throw new Error('fixture_opt_in_required'); + createPreview({ port: Number(process.env.DISPATCH_UPDATES_PREVIEW_PORT || 0) }).then(app => { + const close = () => app.close().catch(() => { process.exitCode = 1; }); + process.once('SIGTERM', close); process.once('SIGINT', close); + process.stdout.write(`Synthetic updates preview: ${app.url}\n`); + }).catch(error => { process.stderr.write(error.stack + '\n'); process.exitCode = 1; }); +} +module.exports = { createPreview }; diff --git a/dashboard/frontend/src/App.tsx b/dashboard/frontend/src/App.tsx index 4dec9f4..1c09428 100644 --- a/dashboard/frontend/src/App.tsx +++ b/dashboard/frontend/src/App.tsx @@ -1,3 +1,4 @@ +import { Updates } from "@/pages/Updates"; import { PasswordRecovery } from "@/pages/PasswordRecovery"; import { DefaultShellLayout } from "@/themes/defaults/ShellLayout"; import { PluginBoundary } from "@/plugins/loader"; @@ -306,7 +307,9 @@ function Shell({ ) : route.id === "diagnostics" ? ( - ) : route.id === "updates" || route.id === "backups" ? ( + ) : route.id === "updates" ? ( + + ) : route.id === "backups" ? ( ) : route.id === "plugins" ? ( diff --git a/dashboard/frontend/src/pages/Updates.tsx b/dashboard/frontend/src/pages/Updates.tsx new file mode 100644 index 0000000..830c4ba --- /dev/null +++ b/dashboard/frontend/src/pages/Updates.tsx @@ -0,0 +1,129 @@ +import { useEffect, useRef, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { ArrowUpCircle, FlaskConical, Pause, Play, RefreshCw, Server } from "lucide-react"; +import { idempotent, queryClient, request } from "@/lib/api"; +import { Button } from "@/components/ui/button"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { ErrorNotice, Loading, Notice, PageHeading } from "@/components/shared"; +import { ManagedPage } from "./ManagedPage"; + +type Product = "core" | "dsp"; +type Release = { id: string; digest: string; version: string; notes: string; publishedAt: string | null; + url: string | null; source: { commit: string } | null }; +type Track = { latest: string | null; installedVersion: string | null; installedDigest: string | null; + release: Release | null; history: { id: string; version: string }[]; tested: boolean; canUpdate: boolean }; +type UpdatesView = { mode: string; enabled: boolean; busy: boolean; worker: { available: boolean; status: string }; + dev: { name: string; available: boolean }; recoveryRequired: boolean; + operation: { product: Product; phase: string; dspName: string | null } | null; + tracks: Record; + rollout: { version: string; status: string; failure: string | null; updated: number; total: number; + members: { name: string; status: string }[] } | null; + jobs: { id: string; action: string; product: Product; status: string; failure: string | null }[] }; +const failureText: Record = { + release_changed: "A newer release is available. Review it and try again.", + release_dev_required: "Install the latest release on Dev before starting rollout.", + release_dsp_not_ready: "This DSP needs to be running and finish setup before it can be updated.", + release_health_failed: "Health checks failed. The previous version was restored.", + release_recovery_required: "The update needs recovery before another update can start.", + release_interrupted: "The update worker restarted. Review the state before continuing.", + release_baseline_required: "The installed version must be registered before updates can begin.", + release_fleet_changed: "The DSP list changed. Review it and start rollout again.", + release_verification_failed: "The release could not be verified. Check the worker’s GitHub connection and retry.", +}; +export function Updates({ hash }: { hash: string }) { + const [product, setProduct] = useState("core"); + const [selected, setSelected] = useState(null); + const [sending, setSending] = useState(false); + const [error, setError] = useState(null); + const query = useQuery({ queryKey: ["independent-updates", selected], + queryFn: () => request(`/api/platform/updates${selected ? `?releaseId=${encodeURIComponent(selected)}` : ""}`), + refetchInterval: 3000 }); + const view = query.data; + const initialCore = useRef(undefined); + const coreDigest = view?.tracks?.core.installedDigest; + useEffect(() => { + if (view?.mode !== "independent") return; + const previous = initialCore.current; + initialCore.current = coreDigest; + if (previous !== undefined && coreDigest && previous !== coreDigest) window.location.reload(); + }, [view?.mode, coreDigest]); + if (view && view.mode !== "independent") return ; + async function command(action: string, digest: string | null = null) { + if (sending) return; + setSending(true); setError(null); + try { + await idempotent(`updates:${action}:${product}:${digest}`, "/api/platform/updates", { action, product, digest }); + await queryClient.invalidateQueries({ queryKey: ["independent-updates"] }); + } catch (cause) { setError(cause); } + finally { setSending(false); } + } + const activeJob = view?.jobs.find(job => ["queued", "running"].includes(job.status)); + const recentFailure = view?.jobs[0]?.status === "failed" ? view.jobs[0].failure : null; + const updatingCore = activeJob?.action === "update_core" || view?.operation?.product === "core"; + return <> + + + + + {updatingCore && Core is updating. This page will reconnect when it’s ready.} + {query.isPending ? : view ?
+ {!view.enabled && Updates need initial setup. Your current services will continue running.} + {view.enabled && !view.worker.available && The update worker is offline. Releases remain available to read.} + {recentFailure && {failureText[recentFailure] || "The update could not finish. Review the current state, then retry or recover."}} + {view.operation && !updatingCore && {view.operation.dspName || "Dev DSP"} is updating. Private data is being preserved.} + {view.recoveryRequired && !activeJob &&
+

Recover the interrupted update before installing another release.

+ +
} + { setProduct(value as Product); setSelected(null); setError(null); }}> + + + {(["core", "dsp"] as const).map(trackName => { + const track = view.tracks[trackName], release = track.release; + const latestSelected = Boolean(release && release.digest === track.latest); + const rolling = view.rollout && view.rollout.status !== "completed"; + const action = trackName === "core" ? "update_core" : track.tested ? "rollout" : "update_dev"; + const label = trackName === "core" ? "Update Core" : track.tested ? "Rollout Update" : "Update Dev"; + return +
+
+

{trackName === "core" ? "Dispatch Core" : "DSP runtime and plugins"}

+

{trackName === "core" ? "Installed" : `Installed on ${view.dev.name}`}: {track.installedVersion || "Not registered"}

+ +
+

{trackName === "core" + ? "Updates the shared dashboard, API and Core services. Installed DSP runtimes and plugins keep their current versions." + : track.tested ? "Dev has passed installation checks. Test the changes, then roll this version out to your DSPs one at a time." + : "Install this version on the permanent Dev DSP first. Your other DSPs receive it when you start rollout."}

+
+ {track.history.length > 0 && } + {release ? <>
+

Version {release.version}

+ {release.url && View release on GitHub} +
{release.notes}
+ {!latestSelected &&

You’re reading a previous release. Select the latest version to update.

} + :

No verified releases yet.

} +
+
+ {trackName === "dsp" && view.rollout &&
+

Rollout · {view.rollout.version}

+ {view.rollout.status === "running" && } + {view.rollout.status === "paused" && } +
+

{view.rollout.updated} of {view.rollout.total} DSPs updated · {view.rollout.status}

+ {view.rollout.status === "paused" && The rollout is paused. Resolve the affected DSP before resuming this version.} + +
    {view.rollout.members.map((member, index) =>
  • {member.name}{member.status}
  • )}
+
} +
; + })} +
+
: null} + ; +} diff --git a/dashboard/playwright.updates.config.cjs b/dashboard/playwright.updates.config.cjs new file mode 100644 index 0000000..b8861c4 --- /dev/null +++ b/dashboard/playwright.updates.config.cjs @@ -0,0 +1,8 @@ +const { defineConfig } = require('@playwright/test'); +module.exports = defineConfig({ + testDir: './tests/browser', testMatch: ['independent-updates.spec.cjs', 'updates-workspace.spec.cjs'], + workers: 1, timeout: 60000, + outputDir: process.env.DISPATCH_UI_ARTIFACTS || '/tmp/dispatch-updates-browser', + use: { viewport: { width: 1440, height: 1000 }, reducedMotion: 'reduce', + launchOptions: process.env.DISPATCH_CHROME_EXECUTABLE ? { executablePath: process.env.DISPATCH_CHROME_EXECUTABLE } : {} }, +}); diff --git a/dashboard/public/assets/frontend.js b/dashboard/public/assets/frontend.js index aa86cd0..68aff9b 100644 --- a/dashboard/public/assets/frontend.js +++ b/dashboard/public/assets/frontend.js @@ -5,13 +5,13 @@ `);for(i=r=0;ri||c[r]!==l[i]){var u=` `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{_e=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ge(n):``}function ye(e,t){switch(e.tag){case 26:case 27:case 5:return ge(e.type);case 16:return ge(`Lazy`);case 13:return e.child!==t&&t!==null?ge(`Suspense Fallback`):ge(`Suspense`);case 19:return ge(`SuspenseList`);case 0:case 15:return ve(e.type,!1);case 11:return ve(e.type.render,!1);case 1:return ve(e.type,!0);case 31:return ge(`Activity`);default:return``}}function be(e){try{var t=``,n=null;do t+=ye(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` -`+e.stack}}var xe=Object.prototype.hasOwnProperty,Se=t.unstable_scheduleCallback,Ce=t.unstable_cancelCallback,we=t.unstable_shouldYield,Te=t.unstable_requestPaint,Ee=t.unstable_now,De=t.unstable_getCurrentPriorityLevel,Oe=t.unstable_ImmediatePriority,ke=t.unstable_UserBlockingPriority,Ae=t.unstable_NormalPriority,je=t.unstable_LowPriority,Me=t.unstable_IdlePriority,Ne=t.log,Pe=t.unstable_setDisableYieldValue,Fe=null,Ie=null;function Le(e){if(typeof Ne==`function`&&Pe(e),Ie&&typeof Ie.setStrictMode==`function`)try{Ie.setStrictMode(Fe,e)}catch{}}var Re=Math.clz32?Math.clz32:Ve,ze=Math.log,Be=Math.LN2;function Ve(e){return e>>>=0,e===0?32:31-(ze(e)/Be|0)|0}var He=256,Ue=262144,We=4194304;function Ge(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ke(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Ge(n))):i=Ge(o):i=Ge(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ge(n))):i=Ge(o)):i=Ge(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function qe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Je(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ye(){var e=We;return We<<=1,!(We&62914560)&&(We=4194304),e}function Xe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ze(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Qe(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),dn=!1;if(un)try{var fn={};Object.defineProperty(fn,"passive",{get:function(){dn=!0}}),window.addEventListener(`test`,fn,fn),window.removeEventListener(`test`,fn,fn)}catch{dn=!1}var pn=null,mn=null,hn=null;function gn(){if(hn)return hn;var e,t=mn,n=t.length,r,i=`value`in pn?pn.value:pn.textContent,a=i.length;for(e=0;e=Jn),Zn=` `,Qn=!1;function $n(e,t){switch(e){case`keyup`:return Kn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function er(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var tr=!1;function nr(e,t){switch(e){case`compositionend`:return er(t);case`keypress`:return t.which===32?(Qn=!0,Zn):null;case`textInput`:return e=t.data,e===Zn&&Qn?null:e;default:return null}}function rr(e,t){if(tr)return e===`compositionend`||!qn&&$n(e,t)?(e=gn(),hn=mn=pn=null,tr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Cr(n)}}function Tr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Tr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function B(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Lt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Lt(e.document)}return t}function Er(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Dr=un&&`documentMode`in document&&11>=document.documentMode,Or=null,kr=null,Ar=null,jr=!1;function Mr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;jr||Or==null||Or!==Lt(r)||(r=Or,`selectionStart`in r&&Er(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ar&&Sr(Ar,r)||(Ar=r,r=Ed(kr,`onSelect`),0>=o,i-=o,Si=1<<32-Re(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),U&&wi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),U&&wi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return U&&wi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),U&&wi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Ca(l)===r.type){n(e,r.sibling),c=a(r,o.props),Aa(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=li(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=ci(o.type,o.key,o.props,null,e.mode,c),Aa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=fi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Ca(o),b(e,r,o,c)}if(ne(o))return h(e,r,o,c);if(j(o)){if(l=j(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,ka(o),c);if(o.$$typeof===C)return b(e,r,Zi(e,o),c);ja(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=ui(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Oa=0;var i=b(e,t,n,r);return Da=null,i}catch(t){if(t===_a||t===ya)throw t;var a=ii(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Na=Ma(!0),Pa=Ma(!1),Fa=!1;function Ia(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function La(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ra(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function za(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,q&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ti(e),ei(e,null,n),t}return Zr(e,r,t,n),ti(e)}function Ba(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,et(e,n)}}function Va(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ha=!1;function Ua(){if(Ha){var e=ca;if(e!==null)throw e}}function Wa(e,t,n,r){Ha=!1;var i=e.updateQueue;Fa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(Y&f)===f:(r&f)===f){f!==0&&f===sa&&(Ha=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=m({},d,f);break a;case 2:Fa=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Ga(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Ka(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=N.T,s={};N.T=s,js(e,!1,t,n);try{var c=i(),l=N.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?As(e,t,da(c,r),pu(e)):As(e,t,r,pu(e))}catch(n){As(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{P.p=a,o!==null&&s.types!==null&&(o.types=s.types),N.T=o}}function bs(){}function xs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Ss(e).queue;ys(e,a,t,re,n===null?bs:function(){return Cs(e),n(r)})}function Ss(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:re,baseState:re,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mo,lastRenderedState:re},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Cs(e){var t=Ss(e);t.next===null&&(t=e.alternate.memoizedState),As(e,t.next.queue,{},pu())}function ws(){return Xi($f)}function Ts(){return Do().memoizedState}function Es(){return Do().memoizedState}function Ds(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ra(n);var r=za(t,e,n);r!==null&&(hu(r,t,n),Ba(r,t,n)),t={cache:ra()},e.payload=t;return}t=t.return}}function Os(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Ms(e)?Ns(t,n):(n=Qr(e,t,n,r),n!==null&&(hu(n,e,r),Ps(n,t,r)))}function ks(e,t,n){As(e,t,n,pu())}function As(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ms(e))Ns(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,xr(s,o))return Zr(e,t,i,0),Rl===null&&Xr(),!1}catch{}if(n=Qr(e,t,i,r),n!==null)return hu(n,e,r),Ps(n,t,r),!0}return!1}function js(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Ms(e)){if(t)throw Error(i(479))}else t=Qr(e,n,r,2),t!==null&&hu(t,e,2)}function Ms(e){var t=e.alternate;return e===G||t!==null&&t===G}function Ns(e,t){uo=lo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ps(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,et(e,n)}}var Fs={readContext:Xi,use:Ao,useCallback:_o,useContext:_o,useEffect:_o,useImperativeHandle:_o,useLayoutEffect:_o,useInsertionEffect:_o,useMemo:_o,useReducer:_o,useRef:_o,useState:_o,useDebugValue:_o,useDeferredValue:_o,useTransition:_o,useSyncExternalStore:_o,useId:_o,useHostTransitionStatus:_o,useFormState:_o,useActionState:_o,useOptimistic:_o,useMemoCache:_o,useCacheRefresh:_o};Fs.useEffectEvent=_o;var Is={readContext:Xi,use:Ao,useCallback:function(e,t){return Eo().memoizedState=[e,t===void 0?null:t],e},useContext:Xi,useEffect:os,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),is(4194308,4,fs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return is(4194308,4,e,t)},useInsertionEffect:function(e,t){is(4,2,e,t)},useMemo:function(e,t){var n=Eo();t=t===void 0?null:t;var r=e();if(fo){Le(!0);try{e()}finally{Le(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Eo();if(n!==void 0){var i=n(t);if(fo){Le(!0);try{n(t)}finally{Le(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Os.bind(null,G,e),[r.memoizedState,e]},useRef:function(e){var t=Eo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ho(e);var t=e.queue,n=ks.bind(null,G,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ms,useDeferredValue:function(e,t){return _s(Eo(),e,t)},useTransition:function(){var e=Ho(!1);return e=ys.bind(null,G,e.queue,!0,!1),Eo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=G,a=Eo();if(U){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Rl===null)throw Error(i(349));Y&127||Lo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,os(zo.bind(null,r,o,e),[e]),r.flags|=2048,ns(9,{destroy:void 0},Ro.bind(null,r,o,n,t),null),n},useId:function(){var e=Eo(),t=Rl.identifierPrefix;if(U){var n=Ci,r=Si;n=(r&~(1<<32-Re(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=po++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[st]=t,o[ct]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Fd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Ac(t)}}return Fc(t),jc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Ac(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ce.current,Ii(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=ki,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[st]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Pi(t,!0)}else e=Vd(e).createTextNode(r),e[st]=t,t.stateNode=e}return Fc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ii(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[st]=t}else Li(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Fc(t),e=!1}else n=Ri(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(io(t),t):(io(t),null);if(t.flags&128)throw Error(i(558))}return Fc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ii(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[st]=t}else Li(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Fc(t),a=!1}else a=Ri(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(io(t),t):(io(t),null)}return io(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Nc(t,t.updateQueue),Fc(t),null);case 4:return de(),e===null&&Sd(t.stateNode.containerInfo),Fc(t),null;case 10:return Wi(t.type),Fc(t),null;case 19:if(I(ao),r=t.memoizedState,r===null)return Fc(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Pc(r,!1);else{if(Wl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=oo(e),o!==null){for(t.flags|=128,Pc(r,!1),e=o.updateQueue,t.updateQueue=e,Nc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)si(n,e),n=n.sibling;return L(ao,ao.current&1|2),U&&wi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ee()>tu&&(t.flags|=128,a=!0,Pc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=oo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Nc(t,e),Pc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!U)return Fc(t),null}else 2*Ee()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Pc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Fc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ee(),e.sibling=null,n=ao.current,L(ao,a?n&1|2:n&1),U&&wi(t,r.treeForkCount),e);case 22:case 23:return io(t),Za(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Fc(t),t.subtreeFlags&6&&(t.flags|=8192)):Fc(t),n=t.updateQueue,n!==null&&Nc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&I(pa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Wi(na),Fc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Lc(e,t){switch(Di(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Wi(na),de(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return pe(t),null;case 31:if(t.memoizedState!==null){if(io(t),t.alternate===null)throw Error(i(340));Li()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(io(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Li()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(ao),null;case 4:return de(),null;case 10:return Wi(t.type),null;case 22:case 23:return io(t),Za(),e!==null&&I(pa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Wi(na),null;case 25:return null;default:return null}}function Rc(e,t){switch(Di(t),t.tag){case 3:Wi(na),de();break;case 26:case 27:case 5:pe(t);break;case 4:de();break;case 31:t.memoizedState!==null&&io(t);break;case 13:io(t);break;case 19:I(ao);break;case 10:Wi(t.type);break;case 22:case 23:io(t),Za(),e!==null&&I(pa);break;case 24:Wi(na)}}function zc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Bc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Vc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Ka(t,n)}catch(t){Z(e,e.return,t)}}}function Hc(e,t,n){n.props=Us(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Uc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Wc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Gc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Kc(e,t,n){try{var r=e.stateNode;Id(r,e.type,n,t),r[ct]=t}catch(t){Z(e,e.return,t)}}function qc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Qd(e.type)||e.tag===4}function Jc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||qc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Qd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Yc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=en));else if(r!==4&&(r===27&&Qd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Yc(e,t,n),e=e.sibling;e!==null;)Yc(e,t,n),e=e.sibling}function Xc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Qd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Xc(e,t,n),e=e.sibling;e!==null;)Xc(e,t,n),e=e.sibling}function Zc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Fd(t,r,n),t[st]=e,t[ct]=n}catch(t){Z(e,e.return,t)}}var Qc=!1,$c=!1,el=!1,tl=typeof WeakSet==`function`?WeakSet:Set,nl=null;function rl(e,t){if(e=e.containerInfo,zd=sp,e=B(e),Er(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Bd={focusedElem:e,selectionRange:n},sp=!1,nl=t;nl!==null;)if(t=nl,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,nl=e;else for(;nl!==null;){switch(t=nl,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Fd(o,r,n),o[st]=e,bt(o),r=o;break a;case`link`:var s=Hf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=wr(s,h),v=wr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,N.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,q&6)throw Error(i(331));var c=q;if(q|=4,Nl(o.current),Tl(o,o.current,s,n),q=c,id(0,!1),Ie&&typeof Ie.onPostCommitFiberRoot==`function`)try{Ie.onPostCommitFiberRoot(Fe,o)}catch{}return!0}finally{P.p=a,N.T=r,Vu(e,t)}}function Wu(e,t,n){t=mi(n,t),t=Ys(e.stateNode,t,2),e=za(e,t,2),e!==null&&(Ze(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=mi(n,e),n=Xs(2),r=za(t,n,2),r!==null&&(Zs(n,r,t,e),Ze(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Ll;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Hl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Rl===e&&(Y&n)===n&&(Wl===4||Wl===3&&(Y&62914560)===Y&&300>Ee()-$l?!(q&2)&&Su(e,0):ql|=n,Yl===Y&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Ye()),e=$r(e,t),e!==null&&(Ze(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Se(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Re(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=Y,a=Ke(r,r===Rl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||qe(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Kd()&&(e=nd);for(var t=Ee(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Ld(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Sf(e,t,n){var r=xf;if(r&&typeof t==`string`&&t){var i=zt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),gf.has(i)||(gf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Fd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Cf(e){vf.D(e),Sf(`dns-prefetch`,e,null)}function wf(e,t){vf.C(e,t),Sf(`preconnect`,e,t)}function Tf(e,t,n){vf.L(e,t,n);var r=xf;if(r&&e&&t){var i=`link[rel="preload"][as="`+zt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+zt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+zt(n.imageSizes)+`"]`)):i+=`[href="`+zt(e)+`"]`;var a=i;switch(t){case`style`:a=jf(e);break;case`script`:a=Ff(e)}hf.has(a)||(e=m({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),hf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Mf(a))||t===`script`&&r.querySelector(If(a))||(t=r.createElement(`link`),Fd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Ef(e,t){vf.m(e,t);var n=xf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+zt(r)+`"][href="`+zt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Ff(e)}if(!hf.has(a)&&(e=m({rel:`modulepreload`,href:e},t),hf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(If(a)))return}r=n.createElement(`link`),Fd(r,`link`,e),bt(r),n.head.appendChild(r)}}}function Df(e,t,n){vf.S(e,t,n);var r=xf;if(r&&e){var i=yt(r).hoistableStyles,a=jf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Mf(a)))s.loading=5;else{e=m({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=hf.get(a))&&zf(e,n);var c=o=r.createElement(`link`);bt(c),Fd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Rf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Of(e,t){vf.X(e,t);var n=xf;if(n&&e){var r=yt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=m({src:e,async:!0},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),bt(a),Fd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t){vf.M(e,t);var n=xf;if(n&&e){var r=yt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=m({src:e,async:!0,type:`module`},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),bt(a),Fd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Af(e,t,n,r){var a=(a=ce.current)?_f(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=jf(n.href),n=yt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=jf(n.href);var o=yt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Mf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),hf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},hf.set(e,n),o||Pf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Ff(n),n=yt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function jf(e){return`href="`+zt(e)+`"`}function Mf(e){return`link[rel="stylesheet"][`+e+`]`}function Nf(e){return m({},e,{"data-precedence":e.precedence,precedence:null})}function Pf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Fd(t,`link`,n),bt(t),e.head.appendChild(t))}function Ff(e){return`[src="`+zt(e)+`"]`}function If(e){return`script[async]`+e}function Lf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+zt(n.href)+`"]`);if(r)return t.instance=r,bt(r),r;var a=m({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),bt(r),Fd(r,`style`,a),Rf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=jf(n.href);var o=e.querySelector(Mf(a));if(o)return t.state.loading|=4,t.instance=o,bt(o),o;r=Nf(n),(a=hf.get(a))&&zf(r,a),o=(e.ownerDocument||e).createElement(`link`),bt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Fd(o,`link`,r),t.state.loading|=4,Rf(o,n.precedence,e),t.instance=o;case`script`:return o=Ff(n.src),(a=e.querySelector(If(o)))?(t.instance=a,bt(a),a):(r=n,(a=hf.get(o))&&(r=m({},n),Bf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),bt(a),Fd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Rf(r,n.precedence,e));return t.instance}function Rf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Wf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Gf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Kf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=jf(r.href),a=t.querySelector(Mf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Yf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,bt(a);return}a=t.ownerDocument||t,r=Nf(r),(i=hf.get(i))&&zf(r,i),a=a.createElement(`link`),bt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Fd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Yf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var qf=0;function Jf(e,t){return e.stylesheets&&e.count===0&&Zf(e,e.stylesheets),0qf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Yf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Zf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Xf=null;function Zf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Xf=new Map,t.forEach(Qf,e),Xf=null,Yf.call(e))}function Qf(e,t){if(!(t.state.loading&4)){var n=Xf.get(e);if(n)var r=n.get(null);else{n=new Map,Xf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=g()})),v=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),y=o(((e,t)=>{t.exports=v()})),b=_(),x=l(p(),1),S=l(y(),1),C=x.createContext(void 0),w=e=>{let t=x.useContext(C);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},T=({client:e,children:t})=>(x.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,S.jsx)(C.Provider,{value:e,children:t})),E={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},D=new class{#e=E;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function O(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function k(){}function A(e,t){return typeof e==`function`?e(t):e}function j(e){return typeof e==`number`&&e>=0&&e!==1/0}function te(e,t){return Math.max(e+(t||0)-Date.now(),0)}function M(e,t){return typeof e==`function`?e(t):e}function ne(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==P(o,t.options))return!1}else if(!ie(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function N(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(re(t.options.mutationKey)!==re(a))return!1}else if(!ie(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function P(e,t){return(t?.queryKeyHashFn||re)(e)}function re(e){return JSON.stringify(e,(e,t)=>oe(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ie(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(Array.isArray(e)&&Array.isArray(t)){for(let n=0;n500)return t;let r=L(e)&&L(t);if(!r&&!(oe(e)&&oe(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{D.setTimeout(t,e)})}function le(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:F(e,t)}function ue(e){return e}function de(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function fe(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var pe=Symbol();function me(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===pe?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function he(e,t){return typeof e==`function`?e(...t):!!e}function ge(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var _e=()=>ee,ve=()=>_e(),ye={isServer:ve,setIsServer(e){_e=e}},be=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},xe=new class extends be{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}};function Se(e){let t;if(e.then(e=>(t=e,e),k)?.catch?.(k),t!==void 0)return{data:t}}function Ce(e){return{mutationKey:e.options.mutationKey,state:e.state,...e.options.scope&&{scope:e.options.scope},...e.meta&&{meta:e.meta}}}function we(e,t,n){let r=e.promise?.then(t).catch(e=>n?.(e)===!1?Promise.reject(e):Promise.reject(Error(`redacted`)));return r?.catch(k),r}function Te(e,t,n){return{dehydratedAt:Date.now(),state:{...e.state,...e.state.data!==void 0&&{data:t?t(e.state.data):e.state.data}},queryKey:e.queryKey,queryHash:e.queryHash,...e.state.status===`pending`&&{promise:we(e,t,n)},...e.meta&&{meta:e.meta},...e.queryType&&{queryType:e.queryType}}}function Ee(e){return e.state.isPaused}function De(e){return e.state.status===`success`}function Oe(e,t={}){let n=t.shouldDehydrateMutation??e.getDefaultOptions().dehydrate?.shouldDehydrateMutation??Ee,r=e.getMutationCache().getAll().flatMap(e=>n(e)?[Ce(e)]:[]),i=t.shouldDehydrateQuery??e.getDefaultOptions().dehydrate?.shouldDehydrateQuery??De,a=t.shouldRedactErrors??e.getDefaultOptions().dehydrate?.shouldRedactErrors,o=t.serializeData??e.getDefaultOptions().dehydrate?.serializeData;return{mutations:r,queries:e.getQueryCache().getAll().flatMap(e=>i(e)?[Te(e,o,a)]:[])}}function ke(e,t,n){let r=e.getMutationCache(),i=e.getQueryCache(),a=n?.defaultOptions?.deserializeData??e.getDefaultOptions().hydrate?.deserializeData;t.mutations?.forEach(({state:t,...i})=>{r.build(e,{...e.getDefaultOptions().hydrate?.mutations,...n?.defaultOptions?.mutations,...i},t)}),t.queries?.forEach(({queryKey:t,state:r,queryHash:o,meta:s,promise:c,dehydratedAt:l,queryType:u})=>{let d=c?Se(c):void 0,f=r.data===void 0?d?.data:r.data,p=f===void 0?f:a?a(f):f,m=i.get(o),h=m?.state.status===`pending`,g=m?.state.fetchStatus===`fetching`;if(m){let e=d&&l!==void 0&&l>m.state.dataUpdatedAt;if(r.dataUpdatedAt>m.state.dataUpdatedAt||e){let{fetchStatus:e,...t}=r;m.setState({...t,data:p,...r.status===`pending`&&p!==void 0&&{status:`success`,dataUpdatedAt:l??Date.now(),...!g&&{fetchStatus:`idle`}}})}}else m=i.build(e,{...e.getDefaultOptions().hydrate?.queries,...n?.defaultOptions?.queries,queryKey:t,queryHash:o,meta:s,_type:u},{...r,data:p,fetchStatus:`idle`,status:r.status===`pending`&&p!==void 0?`success`:r.status,...r.status===`pending`&&p!==void 0&&{dataUpdatedAt:l??Date.now()}});c&&!d&&!h&&!g&&(l===void 0||l>m.state.dataUpdatedAt)&&m.fetch(void 0,{initialPromise:Promise.resolve(c).then(a)}).catch(k)})}var Ae=O;function je(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Ae,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var Me=je(),Ne=new class extends be{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Pe(e){return Math.min(1e3*2**e,3e4)}function Fe(e){return(e??`online`)!==`online`||Ne.isOnline()}var Ie=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Le(e){return e instanceof Ie}function Re(e){let t=!1,n=0,r,i=`pending`,a,o,s=new Promise((e,t)=>{a=e,o=t});s.catch(k);let c=()=>i!==`pending`,l=t=>{if(!c()){let n=new Ie(t);h(n),e.onCancel?.(n)}},u=()=>{t=!0},d=()=>{t=!1},f=()=>xe.isFocused()&&(e.networkMode===`always`||Ne.isOnline())&&e.canRun(),p=()=>Fe(e.networkMode)&&e.canRun(),m=e=>{c()||(r?.(),i=`resolved`,a(e))},h=e=>{c()||(r?.(),i=`rejected`,o(e))},g=()=>new Promise(t=>{r=e=>{(c()||f())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,c()||e.onContinue?.()}),_=()=>{if(c())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(m).catch(r=>{if(c())return;let i=e.retry??(ve()?0:3),a=e.retryDelay??Pe,o=typeof a==`function`?a(n,r):a,s=i===!0||typeof i==`number`&&nf()?void 0:g()).then(()=>{t?h(r):_()})})};return{promise:s,status:()=>i,cancel:l,continue:()=>(r?.(),s),cancelRetry:u,continueRetry:d,canStart:p,start:()=>(p()?_():g().then(_),s)}}var ze=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),j(this.gcTime)&&(this.#e=D.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(ve()?1/0:3e5))}clearGcTimeout(){this.#e!==void 0&&(D.clearTimeout(this.#e),this.#e=void 0)}};function Be(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ge(e,()=>t.signal,()=>n=!0)},u=me(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=(()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})(),o=await u(a),{maxPages:s}=t.options,c=i?fe:de;return{pages:c(e.pages,o,s),pageParams:c(e.pageParams,r,s)}};if(i&&a.length){let e=i===`backward`,t=e?He:Ve,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:Ve(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):l}}}function Ve(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function He(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}function Ue(e,t){return t?Ve(e,t)!=null:!1}function We(e,t){return!t||!e.getPreviousPageParam?!1:He(e,t)!=null}var Ge=class extends ze{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Je(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Je(this.options);e.data!==void 0&&(this.setState(qe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=le(this.state.data,e,this.options);return this.#c({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#c({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(k).catch(k):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>M(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===pe||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0&&this.observers.some(e=>M(e.options.staleTime,this)===`static`)}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!te(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){let t=this.observers.indexOf(e);t!==-1&&(this.observers.splice(t,1),this.observers.length||(this.#a&&(this.#s||this.state.fetchStatus===`paused`&&this.state.status===`pending`?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||this.#c({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=me(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Be(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#c({type:`fetch`,meta:a.fetchOptions?.meta});let o=this.#a=Re({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof Ie&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#c({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#c({type:`pause`})},onContinue:()=>{this.#c({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await o.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof Ie){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#c({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.#a===o&&(this.#a=void 0),this.scheduleGc()}}#c(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Ke(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...qe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),Me.batch(()=>{this.observers.slice().forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Ke(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Fe(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function qe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Je(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Ye=class extends be{#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p=new Set;constructor(e,t){super(),this.options=t,this.#e=e,this.#o=null,this.bindMethods(),this.setOptions(t)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),Ze(this.#t,this.options)?this.#m():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Qe(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Qe(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof M(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!I(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&$e(this.#t,n,this.options,t)&&this.#m(),this.updateResult(),r&&(this.#t!==n||M(this.options.enabled,this.#t)!==M(t.enabled,this.#t)||M(this.options.staleTime,this.#t)!==M(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||M(this.options.enabled,this.#t)!==M(t.enabled,this.#t)||i!==this.#f)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return I(this.getCurrentResult(),n)||(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),Reflect.get(e,n))})}trackProp(e){this.#p.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t),r=()=>{},i,a=new Promise(e=>{i=e,r=this.#e.getQueryCache().subscribe(i=>{i.type===`updated`&&i.query.queryHash===n.queryHash&&n.state.data!==void 0&&(r(),e(this.createResult(n,t)))})});return Promise.race([n.fetch().then(()=>{let e=this.createResult(n,t);return i?.(e),e}).finally(()=>{r()}),a])}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#m(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(k)),t}#h(e){return!ve()&&M(this.options.enabled,this.#t)!==!1&&j(e)}#g(){this.#b();let e=M(this.options.staleTime,this.#t);if(this.#r.isStale||!this.#h(e))return;let t=te(this.#r.dataUpdatedAt,e)+1;this.#u=D.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#f=e,this.#f!==0&&this.#h(this.#f)&&(this.#d=D.setInterval(()=>{(this.options.refetchIntervalInBackground||xe.isFocused())&&this.#m()},this.#f))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#u!==void 0&&(D.clearTimeout(this.#u),this.#u=void 0)}#x(){this.#d!==void 0&&(D.clearInterval(this.#d),this.#d=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&Ze(e,t),o=i&&$e(e,n,t,r);(a||o)&&(l={...l,...Ke(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#l?.state.data,this.#l):t.placeholderData,e!==void 0&&(m=`success`,d=le(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h){if(i&&d===a?.data&&t.select===this.#s)d=this.#c;else try{this.#s=t.select,d=t.select(d),d=le(i?.data,d,t),this.#c=d,this.#o=null}catch(e){this.#o=e}}else d===void 0&&(this.#o=null);this.#o&&(f=this.#o,d=this.#c,p=Date.now(),m=`error`,u=!1);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0;return{status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:et(e,t),refetch:this.refetch,isEnabled:M(t.enabled,e)!==!1}}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);if(this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#l=this.#t),I(t,e))return;this.#r=t;let n=(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#p.size)return!0;let r=new Set(n??this.#p);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})();Me.batch(()=>{n&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}};function Xe(e,t){return M(t.enabled,e)!==!1&&e.state.data===void 0&&(e.state.status!==`error`||M(t.retryOnMount,e)!==!1)}function Ze(e,t){return Xe(e,t)||e.state.data!==void 0&&Qe(e,t,t.refetchOnMount)}function Qe(e,t,n){if(M(t.enabled,e)!==!1&&M(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&et(e,t)}return!1}function $e(e,t,n,r){return(e!==t||M(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&et(e,n)}function et(e,t){return M(t.enabled,e)!==!1&&e.isStaleByTime(M(t.staleTime,e))}var tt=class extends Ye{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,r=super.createResult(e,t),{isFetching:i,isRefetching:a,isError:o,isRefetchError:s}=r,c=n.fetchMeta?.fetchMore?.direction,l=o&&c===`forward`,u=i&&c===`forward`,d=o&&c===`backward`,f=i&&c===`backward`;return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:Ue(t,n.data),hasPreviousPage:We(t,n.data),isFetchNextPageError:l,isFetchingNextPage:u,isFetchPreviousPageError:d,isFetchingPreviousPage:f,isRefetchError:s&&!l&&!d,isRefetching:a&&!u&&!f}}},nt=class extends ze{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||rt(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??(this.state.status===`pending`?this.execute(this.state.variables):Promise.resolve())}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey},r=this.#r=Re({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)}),i=this.state.status===`pending`,a=!r.canStart();try{if(i)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let o=await r.start();return await this.#n.config.onSuccess?.(o,e,this.state.context,this,n),await this.options.onSuccess?.(o,e,this.state.context,n),await this.#n.config.onSettled?.(o,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(o,null,e,this.state.context,n),this.#i({type:`success`,data:o}),o}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#r===r&&(this.#r=void 0),this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),Me.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function rt(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var it=class extends be{#e;#t;#n;constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}build(e,t,n){let r=new nt({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=at(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=at(e);if(typeof t==`string`){let n=this.#t.get(t);if(n){if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=at(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}return!0}runNext(e){let t=at(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){Me.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>N(t,e))}findAll(e={}){return this.getAll().filter(t=>N(e,t))}notify(e){Me.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return Me.batch(()=>Promise.all(e.map(e=>e.continue().catch(k))))}};function at(e){return e.options.scope?.id}var ot=class extends be{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),I(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&re(t.mutationKey)!==re(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??rt();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){Me.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function st(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}var ct=class extends be{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,Me.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!I(e,n)});(o||s)&&(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(st(e,n).forEach(e=>{e.destroy()}),st(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){let n=new Set;return t.map((r,i)=>{let a=e[i];return r.defaultedQueryOptions.notifyOnChangeProps?a:r.observer.trackResult(a,e=>{n.has(e)||(n.add(e),t.forEach(t=>{t.observer.trackProp(e)}))})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=F(this.#a,t(e))),this.#a}return e}#f(){return!this.#r?.combine||this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Ye(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=this.#t.slice(),this.#t[n]=t,this.#h())}#h(){if(this.hasListeners()){let e=this.#f(),t=this.#a,n=e?t:this.#d(this.#u(this.#t,this.#l),this.#r?.combine);(e||t!==n)&&Me.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},lt=class extends be{#e;constructor(e={}){super(),this.config=e,this.#e=new Map}build(e,t,n){let r=t.queryKey,i=t.queryHash??P(r,t),a=this.get(i);return a||(a=new Ge({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){Me.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ne(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ne(e,t)):t}notify(e){Me.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){Me.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){Me.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},ut=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new lt,this.#t=e.mutationCache||new it,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=xe.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=Ne.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(M(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=A(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return Me.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;Me.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return Me.batch(()=>{let r=n.findAll(e),i=new Set(r);return r.forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,predicate:e=>i.has(e)},t)})}cancelQueries(e,t={}){let n={revert:!0,...t},r=Me.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(k).catch(k)}invalidateQueries(e,t={}){return Me.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=Me.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(k)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(k)}async query(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t),r=n.isStaleByTime(M(t.staleTime,n))?await n.fetch(t):n.state.data,i=t.select;return i?i(r):r}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(M(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(k).catch(k)}infiniteQuery(e){return e._type=`infinite`,this.query(e)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(k).catch(k)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return Ne.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(re(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ie(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(re(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ie(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=P(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===pe&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}};function dt({streamFn:e,refetchMode:t=`reset`,reducer:n=(e,t)=>de(e,t),initialValue:r=[]}){return async i=>{let a=i.client.getQueryCache().find({queryKey:i.queryKey,exact:!0}),o=!!a&&a.isFetched();o&&t===`reset`&&a.setState({...a.resetState,fetchStatus:`fetching`});let s=r,c=!1,l=await e(ge({client:i.client,meta:i.meta,queryKey:i.queryKey,pageParam:i.pageParam,direction:i.direction},()=>i.signal,()=>c=!0)),u=o&&t===`replace`;for await(let e of l){if(c)break;u?s=n(s,e):i.client.setQueryData(i.queryKey,t=>n(t===void 0?r:t,e))}return u&&!c&&i.client.setQueryData(i.queryKey,s),i.client.getQueryData(i.queryKey)??r}}var ft=Symbol(),pt=Symbol(),mt=Symbol(),ht=({children:e,options:t={},state:n,queryClient:r})=>{let i=w(r),a=x.useRef(t);x.useEffect(()=>{a.current=t});let o=x.useMemo(()=>{if(n){if(typeof n!=`object`)return;let e=i.getQueryCache(),t=n.queries||[],r=[],o=[];for(let n of t){let t=e.get(n.queryHash);t?(n.state.dataUpdatedAt>t.state.dataUpdatedAt||n.promise&&t.state.status!==`pending`&&t.state.fetchStatus!==`fetching`&&n.dehydratedAt!==void 0&&n.dehydratedAt>t.state.dataUpdatedAt)&&o.push(n):r.push(n)}if(r.length>0&&ke(i,{queries:r},a.current),o.length>0)return o}},[i,n]);return x.useEffect(()=>{o&&ke(i,{queries:o},a.current)},[i,o]),e},gt=x.createContext(!1),_t=()=>x.useContext(gt),vt=gt.Provider;function yt(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var bt=x.createContext(yt()),xt=()=>x.useContext(bt),St=({children:e})=>{let[t]=x.useState(()=>yt());return(0,S.jsx)(bt.Provider,{value:t,children:typeof e==`function`?e(t):e})},Ct=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?he(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||r)&&(t.isReset()||(e.retryOnMount=!1))},wt=e=>{x.useEffect(()=>{e.clearReset()},[e])},Tt=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||he(n,[e.error,r])),Et=(e,t)=>t.state.data===void 0,Dt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},Ot=(e,t)=>e?.suspense&&t.isPending,kt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function At({queries:e,...t},n){let r=w(n),i=_t(),a=xt(),o=t.subscribed!==!1,s=x.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:o?`optimistic`:void 0,t}),[e,r,i,o]);s.forEach(e=>{Dt(e);let t=r.getQueryCache().get(e.queryHash);Ct(e,a,t)}),wt(a);let[c]=x.useState(()=>new ct(r,s,t)),[l,u,d]=c.getOptimisticResult(s,t.combine),f=!i&&o;x.useSyncExternalStore(x.useCallback(e=>f?c.subscribe(Me.batchCalls(e)):k,[c,f]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),x.useEffect(()=>{c.setQueries(s,t)},[s,t,c]);let p=l.some((e,t)=>Ot(s[t],e))?l.flatMap((e,t)=>{let n=s[t];return n&&Ot(n,e)?kt(n,new Ye(r,n),a):[]}):[];if(p.length>0)throw Promise.all(p);let m=l.find((e,t)=>{let n=s[t];return n&&Tt({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(m)throw m.error;return u(d())}function jt(e,t,n){let r=_t(),i=xt(),a=w(n),o=a.defaultQueryOptions(e),s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,Dt(o),Ct(o,i,s),wt(i);let[l]=x.useState(()=>new t(a,o)),u=l.getOptimisticResult(o),d=!r&&c;if(x.useSyncExternalStore(x.useCallback(e=>{let t=d?l.subscribe(Me.batchCalls(e)):k;return l.updateResult(),t},[l,d]),()=>l.getCurrentResult(),()=>l.getCurrentResult()),x.useEffect(()=>{l.setOptions(o)},[o,l]),Ot(o,u))throw kt(o,l,i);if(Tt({result:u,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw u.error;return o.notifyOnChangeProps?u:l.trackResult(u)}function Mt(e,t){return jt(e,Ye,t)}function Nt(e,t){return jt({...e,enabled:!0,suspense:!0,throwOnError:Et,placeholderData:void 0},Ye,t)}function Pt(e,t){return jt({...e,enabled:!0,suspense:!0,throwOnError:Et,placeholderData:void 0},tt,t)}function Ft(e,t){return At({...e,queries:e.queries.map(e=>({...e,suspense:!0,throwOnError:Et,enabled:!0,placeholderData:void 0}))},t)}function It(e,t){let n=w(t);n.getQueryState(e.queryKey)||n.query(e).catch(k)}function Lt(e,t){let n=w(t);n.getQueryState(e.queryKey)||n.infiniteQuery(e).catch(k)}function Rt(e){return e}function zt(e){return e}function Bt(e,t){let n=w(t),r=n.getQueryCache();return x.useSyncExternalStore(x.useCallback(e=>r.subscribe(Me.batchCalls(e)),[r]),()=>n.isFetching(e),()=>n.isFetching(e))}function Vt(e,t){let n=w(t);return Ut({filters:{...e,status:`pending`}},n).length}function Ht(e,t){return e.findAll(t.filters).map(e=>t.select?t.select(e):e.state)}function Ut(e={},t){let n=w(t).getMutationCache(),r=x.useRef(e),i=x.useRef(null);return i.current===null&&(i.current=Ht(n,e)),x.useEffect(()=>{r.current=e}),x.useSyncExternalStore(x.useCallback(e=>n.subscribe(()=>{let t=F(i.current,Ht(n,r.current));i.current!==t&&(i.current=t,Me.schedule(e))}),[n]),()=>i.current,()=>i.current)}function Wt(e,t){let n=w(t),[r]=x.useState(()=>new ot(n,e));x.useEffect(()=>{r.setOptions(e)},[r,e]);let i=x.useSyncExternalStore(x.useCallback(e=>r.subscribe(Me.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=x.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(k)},[r]);if(i.error&&he(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}function Gt(e){return e}function Kt(e,t){return jt(e,tt,t)}var qt=s({CancelledError:()=>Ie,HydrationBoundary:()=>ht,InfiniteQueryObserver:()=>tt,IsRestoringProvider:()=>vt,Mutation:()=>nt,MutationCache:()=>it,MutationObserver:()=>ot,QueriesObserver:()=>ct,Query:()=>Ge,QueryCache:()=>lt,QueryClient:()=>ut,QueryClientContext:()=>C,QueryClientProvider:()=>T,QueryErrorResetBoundary:()=>St,QueryObserver:()=>Ye,dataTagErrorSymbol:()=>pt,dataTagSymbol:()=>ft,defaultScheduler:()=>Ae,defaultShouldDehydrateMutation:()=>Ee,defaultShouldDehydrateQuery:()=>De,dehydrate:()=>Oe,dehydrateQuery:()=>Te,environmentManager:()=>ye,experimental_streamedQuery:()=>dt,focusManager:()=>xe,hashKey:()=>re,hydrate:()=>ke,infiniteQueryOptions:()=>zt,isCancelledError:()=>Le,isServer:()=>ee,keepPreviousData:()=>ue,matchMutation:()=>N,matchQuery:()=>ne,mutationOptions:()=>Gt,noop:()=>k,notifyManager:()=>Me,onlineManager:()=>Ne,partialMatchKey:()=>ie,queryOptions:()=>Rt,replaceEqualDeep:()=>F,shouldThrowError:()=>he,skipToken:()=>pe,timeoutManager:()=>D,unsetMarker:()=>mt,useInfiniteQuery:()=>Kt,useIsFetching:()=>Bt,useIsMutating:()=>Vt,useIsRestoring:()=>_t,useMutation:()=>Wt,useMutationState:()=>Ut,usePrefetchInfiniteQuery:()=>Lt,usePrefetchQuery:()=>It,useQueries:()=>At,useQuery:()=>Mt,useQueryClient:()=>w,useQueryErrorResetBoundary:()=>xt,useSuspenseInfiniteQuery:()=>Pt,useSuspenseQueries:()=>Ft,useSuspenseQuery:()=>Nt}),Jt=class extends Error{code;status;constructor(e,t){super(e),this.code=e,this.status=t}},Yt=new ut({defaultOptions:{queries:{retry:!1,refetchOnWindowFocus:!0,staleTime:1e3},mutations:{retry:!1}}}),Xt=null,Zt=`dispatch-dsp-view`,Qt=sessionStorage.getItem(Zt);function $t(e){Qt=e,e?sessionStorage.setItem(Zt,e):sessionStorage.removeItem(Zt),Yt.clear(),an.clear()}function en(e){return JSON.stringify([e?.authenticated,e?.user?.id,e?.activeOrganizationId,e?.dspView?.viewRef,e?.platformPermissions,e?.memberships?.map(e=>[e.id,e.permissions,e.organization.status])])}function tn(e){en(Xt)!==en(e)&&(Yt.clear(),an.clear(),window.dispatchEvent(new Event(`dispatch-authority-changed`))),Xt=e}async function nn(e,t={}){let n=Qt;if(Xt?.dspView&&!n&&e!==`/api/auth/session`)throw new Jt(`dsp_view_changed`,409);let r=await fetch(e,{credentials:`same-origin`,...t,headers:{Accept:`application/json`,...t.body===void 0?{}:{"Content-Type":`application/json`},...t.headers,...n?{"X-Dispatch-DSP-View":n}:{}}}),i=await r.json().catch(()=>null);if(n!==Qt)throw new Jt(`dsp_view_changed`,409);if(!r.ok||!i?.ok)throw i?.error?.code===`dsp_view_unavailable`&&n&&($t(null),e!==`/api/auth/session`&&window.dispatchEvent(new Event(`dispatch-dsp-view-ended`))),r.status===401&&Xt?.authenticated&&($t(null),tn(null),window.dispatchEvent(new Event(`dispatch-session-expired`))),new Jt(i?.error?.code||`request_failed`,r.status);return i.data}function rn(e,t,n,r={}){return nn(e,{signal:r.signal,method:t,headers:Xt?.authenticated?{"X-Dispatch-CSRF":Xt.csrfToken}:{},body:JSON.stringify(n)})}var an=new Map;function on(e,t=e){return an.has(e)||an.set(e,`dashboard:${t}:${crypto.randomUUID()}`),an.get(e)}function sn(e,t=null){(t===null||t instanceof Jt&&t.status&&t.status>=400&&t.status<500)&&an.delete(e)}async function cn(e,t,n){try{let r=await rn(t,`POST`,{...n,idempotencyKey:on(e,`request`)});return sn(e),r}catch(t){throw sn(e,t),t}}var ln=(e,t)=>!!e?.permissions.includes(t),un=e=>!e.dspView&&!!e.platformPermissions?.includes(`platform.organizations.read`),dn=e=>un(e)?null:e.memberships?.find(t=>t.organizationId===e.activeOrganizationId)||null,fn=e=>{let t=dn(e);return t?.roleKey===`owner`&&ln(t,`organization.owner`)};function pn(){return(0,S.jsxs)(`span`,{className:`brand`,children:[(0,S.jsx)(`svg`,{viewBox:`0 0 28 28`,"aria-hidden":`true`,children:(0,S.jsx)(`path`,{fill:`currentColor`,d:`M3 3h9C20 3 25 7.5 25 14s-5 11-13 11H3v-7h6v2h3c4.5 0 7-2.2 7-6s-2.5-6-7-6H9v6H3V3Z`})}),(0,S.jsx)(`span`,{children:`Dispatch`})]})}function mn(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;ttypeof e==`boolean`?`${e}`:e===0?`0`:e,_n=hn,vn=(e,t)=>n=>{if(t?.variants==null)return _n(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let o=gn(t)||gn(a);return r[e][o]}),o=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return _n(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...o}[t]):{...i,...o}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)},yn=(e,t)=>{let n=Array(e.length+t.length);for(let t=0;t({classGroupId:e,validator:t}),xn=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),Sn=`-`,Cn=[],wn=`arbitrary..`,Tn=e=>{let t=On(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return Dn(e);let n=e.split(Sn);return En(n,+(n[0]===``&&n.length>1),t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?yn(i,t):t:i||Cn}return n[e]||Cn}}},En=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=En(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(Sn):e.slice(t).join(Sn),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?wn+r:void 0})(),On=e=>{let{theme:t,classGroups:n}=e;return kn(n,t)},kn=(e,t)=>{let n=xn();for(let r in e){let i=e[r];An(i,n,r,t)}return n},An=(e,t,n,r)=>{let i=e.length;for(let a=0;a{if(typeof e==`string`){Mn(e,t,n);return}if(typeof e==`function`){Nn(e,t,n,r);return}Pn(e,t,n,r)},Mn=(e,t,n)=>{let r=e===``?t:Fn(t,e);r.classGroupId=n},Nn=(e,t,n,r)=>{if(In(e)){An(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(bn(n,e))},Pn=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e{let n=e,r=t.split(Sn),i=r.length;for(let e=0;e`isThemeGetter`in e&&e.isThemeGetter===!0,Ln=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)}}},Rn=`!`,zn=`:`,Bn=[],Vn=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),Hn=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 Vn(t,l,c,u)};if(t){let e=t+zn,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):Vn(Bn,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},Un=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}},Wn=e=>({cache:Ln(e.cacheSize),parseClassName:Hn(e),sortModifiers:Un(e),postfixLookupClassGroupIds:Gn(e),...Tn(e)}),Gn=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(Kn),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?_+Rn:_,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},Jn=(...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=Wn(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=qn(e,n);return i(e,a),a};return a=o,(...e)=>a(Jn(...e))},Zn=[],Qn=e=>{let t=t=>t[e]||Zn;return t.isThemeGetter=!0,t},$n=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,er=/^\((?:(\w[\w-]*):)?(.+)\)$/i,tr=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,nr=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,rr=/\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$/,ir=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ar=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,or=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,sr=e=>tr.test(e),R=e=>!!e&&!Number.isNaN(Number(e)),cr=e=>!!e&&Number.isInteger(Number(e)),lr=e=>e.endsWith(`%`)&&R(e.slice(0,-1)),ur=e=>nr.test(e),dr=()=>!0,fr=e=>rr.test(e)&&!ir.test(e),pr=()=>!1,mr=e=>ar.test(e),hr=e=>or.test(e),gr=e=>!z(e)&&!B(e),_r=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)),vr=e=>Nr(e,Lr,pr),z=e=>$n.test(e),yr=e=>Nr(e,Rr,fr),br=e=>Nr(e,zr,R),xr=e=>Nr(e,Vr,dr),Sr=e=>Nr(e,Br,pr),Cr=e=>Nr(e,Fr,pr),wr=e=>Nr(e,Ir,hr),Tr=e=>Nr(e,Hr,mr),B=e=>er.test(e),Er=e=>Pr(e,Rr),Dr=e=>Pr(e,Br),Or=e=>Pr(e,Fr),kr=e=>Pr(e,Lr),Ar=e=>Pr(e,Ir),jr=e=>Pr(e,Hr,!0),Mr=e=>Pr(e,Vr,!0),Nr=(e,t,n)=>{let r=$n.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},Pr=(e,t,n=!1)=>{let r=er.exec(e);return r?r[1]?t(r[1]):n:!1},Fr=e=>e===`position`||e===`percentage`,Ir=e=>e===`image`||e===`url`,Lr=e=>e===`length`||e===`size`||e===`bg-size`,Rr=e=>e===`length`,zr=e=>e===`number`,Br=e=>e===`family-name`,Vr=e=>e===`number`||e===`weight`,Hr=e=>e===`shadow`,Ur=Xn(()=>{let e=Qn(`color`),t=Qn(`font`),n=Qn(`text`),r=Qn(`font-weight`),i=Qn(`tracking`),a=Qn(`leading`),o=Qn(`breakpoint`),s=Qn(`container`),c=Qn(`spacing`),l=Qn(`radius`),u=Qn(`shadow`),d=Qn(`inset-shadow`),f=Qn(`text-shadow`),p=Qn(`drop-shadow`),m=Qn(`blur`),h=Qn(`perspective`),g=Qn(`aspect`),_=Qn(`ease`),v=Qn(`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(),B,z],S=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],C=()=>[`auto`,`contain`,`none`],w=()=>[B,z,c],T=()=>[sr,`full`,`auto`,...w()],E=()=>[cr,`none`,`subgrid`,B,z],D=()=>[`auto`,{span:[`full`,cr,B,z]},cr,B,z],O=()=>[cr,`auto`,B,z],ee=()=>[`auto`,`min`,`max`,`fr`,B,z],k=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],A=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],j=()=>[`auto`,...w()],te=()=>[sr,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...w()],M=()=>[sr,`screen`,`full`,`dvw`,`lvw`,`svw`,`min`,`max`,`fit`,...w()],ne=()=>[sr,`screen`,`full`,`lh`,`dvh`,`lvh`,`svh`,`min`,`max`,`fit`,...w()],N=()=>[e,B,z],P=()=>[...b(),Or,Cr,{position:[B,z]}],re=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],ie=()=>[`auto`,`cover`,`contain`,kr,vr,{size:[B,z]}],ae=()=>[lr,Er,yr],F=()=>[``,`none`,`full`,l,B,z],I=()=>[``,R,Er,yr],L=()=>[`solid`,`dashed`,`dotted`,`double`],oe=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],se=()=>[R,lr,Or,Cr],ce=()=>[``,`none`,m,B,z],le=()=>[`none`,R,B,z],ue=()=>[`none`,R,B,z],de=()=>[R,B,z],fe=()=>[sr,`full`,...w()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[ur],breakpoint:[ur],color:[dr],container:[ur],"drop-shadow":[ur],ease:[`in`,`out`,`in-out`],font:[gr],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[ur],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[ur],shadow:[ur],spacing:[`px`,R],text:[ur],"text-shadow":[ur],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,sr,z,B,g]}],container:[`container`],"container-type":[{"@container":[``,`normal`,`size`,B,z]}],"container-named":[_r],columns:[{columns:[R,z,B,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:[cr,`auto`,B,z]}],basis:[{basis:[sr,`full`,`auto`,s,...w()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[R,sr,`auto`,`initial`,`none`,z]}],grow:[{grow:[``,R,B,z]}],shrink:[{shrink:[``,R,B,z]}],order:[{order:[cr,`first`,`last`,`none`,B,z]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:D()}],"col-start":[{"col-start":O()}],"col-end":[{"col-end":O()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:D()}],"row-start":[{"row-start":O()}],"row-end":[{"row-end":O()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":ee()}],"auto-rows":[{"auto-rows":ee()}],gap:[{gap:w()}],"gap-x":[{"gap-x":w()}],"gap-y":[{"gap-y":w()}],"justify-content":[{justify:[...k(),`normal`]}],"justify-items":[{"justify-items":[...A(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...A()]}],"align-content":[{content:[`normal`,...k()]}],"align-items":[{items:[...A(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...A(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":k()}],"place-items":[{"place-items":[...A(),`baseline`]}],"place-self":[{"place-self":[`auto`,...A()]}],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:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mbs:[{mbs:j()}],mbe:[{mbe:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":w()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":w()}],"space-y-reverse":[`space-y-reverse`],size:[{size:te()}],"inline-size":[{inline:[`auto`,...M()]}],"min-inline-size":[{"min-inline":[`auto`,...M()]}],"max-inline-size":[{"max-inline":[`none`,...M()]}],"block-size":[{block:[`auto`,...ne()]}],"min-block-size":[{"min-block":[`auto`,...ne()]}],"max-block-size":[{"max-block":[`none`,...ne()]}],w:[{w:[s,`screen`,...te()]}],"min-w":[{"min-w":[s,`screen`,`none`,...te()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...te()]}],h:[{h:[`screen`,`lh`,...te()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...te()]}],"max-h":[{"max-h":[`screen`,`lh`,...te()]}],"font-size":[{text:[`base`,n,Er,yr]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,Mr,xr]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,lr,z]}],"font-family":[{font:[Dr,Sr,t]}],"font-features":[{"font-features":[z]}],"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,B,z]}],"line-clamp":[{"line-clamp":[R,`none`,B,br]}],leading:[{leading:[a,...w()]}],"list-image":[{"list-image":[`none`,B,z]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,B,z]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:N()}],"text-color":[{text:N()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...L(),`wavy`]}],"text-decoration-thickness":[{decoration:[R,`from-font`,`auto`,B,yr]}],"text-decoration-color":[{decoration:N()}],"underline-offset":[{"underline-offset":[R,`auto`,B,z]}],"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:[cr,B,z]}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,B,z]}],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`,B,z]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:P()}],"bg-repeat":[{bg:re()}],"bg-size":[{bg:ie()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},cr,B,z],radial:[``,B,z],conic:[cr,B,z]},Ar,wr]}],"bg-color":[{bg:N()}],"gradient-from-pos":[{from:ae()}],"gradient-via-pos":[{via:ae()}],"gradient-to-pos":[{to:ae()}],"gradient-from":[{from:N()}],"gradient-via":[{via:N()}],"gradient-to":[{to:N()}],rounded:[{rounded:F()}],"rounded-s":[{"rounded-s":F()}],"rounded-e":[{"rounded-e":F()}],"rounded-t":[{"rounded-t":F()}],"rounded-r":[{"rounded-r":F()}],"rounded-b":[{"rounded-b":F()}],"rounded-l":[{"rounded-l":F()}],"rounded-ss":[{"rounded-ss":F()}],"rounded-se":[{"rounded-se":F()}],"rounded-ee":[{"rounded-ee":F()}],"rounded-es":[{"rounded-es":F()}],"rounded-tl":[{"rounded-tl":F()}],"rounded-tr":[{"rounded-tr":F()}],"rounded-br":[{"rounded-br":F()}],"rounded-bl":[{"rounded-bl":F()}],"border-w":[{border:I()}],"border-w-x":[{"border-x":I()}],"border-w-y":[{"border-y":I()}],"border-w-s":[{"border-s":I()}],"border-w-e":[{"border-e":I()}],"border-w-bs":[{"border-bs":I()}],"border-w-be":[{"border-be":I()}],"border-w-t":[{"border-t":I()}],"border-w-r":[{"border-r":I()}],"border-w-b":[{"border-b":I()}],"border-w-l":[{"border-l":I()}],"divide-x":[{"divide-x":I()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":I()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...L(),`hidden`,`none`]}],"divide-style":[{divide:[...L(),`hidden`,`none`]}],"border-color":[{border:N()}],"border-color-x":[{"border-x":N()}],"border-color-y":[{"border-y":N()}],"border-color-s":[{"border-s":N()}],"border-color-e":[{"border-e":N()}],"border-color-bs":[{"border-bs":N()}],"border-color-be":[{"border-be":N()}],"border-color-t":[{"border-t":N()}],"border-color-r":[{"border-r":N()}],"border-color-b":[{"border-b":N()}],"border-color-l":[{"border-l":N()}],"divide-color":[{divide:N()}],"outline-style":[{outline:[...L(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[R,B,z]}],"outline-w":[{outline:[``,R,Er,yr]}],"outline-color":[{outline:N()}],shadow:[{shadow:[``,`none`,u,jr,Tr]}],"shadow-color":[{shadow:N()}],"inset-shadow":[{"inset-shadow":[`none`,d,jr,Tr]}],"inset-shadow-color":[{"inset-shadow":N()}],"ring-w":[{ring:I()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:N()}],"ring-offset-w":[{"ring-offset":[R,yr]}],"ring-offset-color":[{"ring-offset":N()}],"inset-ring-w":[{"inset-ring":I()}],"inset-ring-color":[{"inset-ring":N()}],"text-shadow":[{"text-shadow":[`none`,f,jr,Tr]}],"text-shadow-color":[{"text-shadow":N()}],opacity:[{opacity:[R,B,z]}],"mix-blend":[{"mix-blend":[...oe(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":oe()}],"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":[R]}],"mask-image-linear-from-pos":[{"mask-linear-from":se()}],"mask-image-linear-to-pos":[{"mask-linear-to":se()}],"mask-image-linear-from-color":[{"mask-linear-from":N()}],"mask-image-linear-to-color":[{"mask-linear-to":N()}],"mask-image-t-from-pos":[{"mask-t-from":se()}],"mask-image-t-to-pos":[{"mask-t-to":se()}],"mask-image-t-from-color":[{"mask-t-from":N()}],"mask-image-t-to-color":[{"mask-t-to":N()}],"mask-image-r-from-pos":[{"mask-r-from":se()}],"mask-image-r-to-pos":[{"mask-r-to":se()}],"mask-image-r-from-color":[{"mask-r-from":N()}],"mask-image-r-to-color":[{"mask-r-to":N()}],"mask-image-b-from-pos":[{"mask-b-from":se()}],"mask-image-b-to-pos":[{"mask-b-to":se()}],"mask-image-b-from-color":[{"mask-b-from":N()}],"mask-image-b-to-color":[{"mask-b-to":N()}],"mask-image-l-from-pos":[{"mask-l-from":se()}],"mask-image-l-to-pos":[{"mask-l-to":se()}],"mask-image-l-from-color":[{"mask-l-from":N()}],"mask-image-l-to-color":[{"mask-l-to":N()}],"mask-image-x-from-pos":[{"mask-x-from":se()}],"mask-image-x-to-pos":[{"mask-x-to":se()}],"mask-image-x-from-color":[{"mask-x-from":N()}],"mask-image-x-to-color":[{"mask-x-to":N()}],"mask-image-y-from-pos":[{"mask-y-from":se()}],"mask-image-y-to-pos":[{"mask-y-to":se()}],"mask-image-y-from-color":[{"mask-y-from":N()}],"mask-image-y-to-color":[{"mask-y-to":N()}],"mask-image-radial":[{"mask-radial":[B,z]}],"mask-image-radial-from-pos":[{"mask-radial-from":se()}],"mask-image-radial-to-pos":[{"mask-radial-to":se()}],"mask-image-radial-from-color":[{"mask-radial-from":N()}],"mask-image-radial-to-color":[{"mask-radial-to":N()}],"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":[R]}],"mask-image-conic-from-pos":[{"mask-conic-from":se()}],"mask-image-conic-to-pos":[{"mask-conic-to":se()}],"mask-image-conic-from-color":[{"mask-conic-from":N()}],"mask-image-conic-to-color":[{"mask-conic-to":N()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:P()}],"mask-repeat":[{mask:re()}],"mask-size":[{mask:ie()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,B,z]}],filter:[{filter:[``,`none`,B,z]}],blur:[{blur:ce()}],brightness:[{brightness:[R,B,z]}],contrast:[{contrast:[R,B,z]}],"drop-shadow":[{"drop-shadow":[``,`none`,p,jr,Tr]}],"drop-shadow-color":[{"drop-shadow":N()}],grayscale:[{grayscale:[``,R,B,z]}],"hue-rotate":[{"hue-rotate":[R,B,z]}],invert:[{invert:[``,R,B,z]}],saturate:[{saturate:[R,B,z]}],sepia:[{sepia:[``,R,B,z]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,B,z]}],"backdrop-blur":[{"backdrop-blur":ce()}],"backdrop-brightness":[{"backdrop-brightness":[R,B,z]}],"backdrop-contrast":[{"backdrop-contrast":[R,B,z]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,R,B,z]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[R,B,z]}],"backdrop-invert":[{"backdrop-invert":[``,R,B,z]}],"backdrop-opacity":[{"backdrop-opacity":[R,B,z]}],"backdrop-saturate":[{"backdrop-saturate":[R,B,z]}],"backdrop-sepia":[{"backdrop-sepia":[``,R,B,z]}],"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`,B,z]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[R,`initial`,B,z]}],ease:[{ease:[`linear`,`initial`,_,B,z]}],delay:[{delay:[R,B,z]}],animate:[{animate:[`none`,v,B,z]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[h,B,z]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:le()}],"rotate-x":[{"rotate-x":le()}],"rotate-y":[{"rotate-y":le()}],"rotate-z":[{"rotate-z":le()}],scale:[{scale:ue()}],"scale-x":[{"scale-x":ue()}],"scale-y":[{"scale-y":ue()}],"scale-z":[{"scale-z":ue()}],"scale-3d":[`scale-3d`],skew:[{skew:de()}],"skew-x":[{"skew-x":de()}],"skew-y":[{"skew-y":de()}],transform:[{transform:[B,z,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:fe()}],"translate-x":[{"translate-x":fe()}],"translate-y":[{"translate-y":fe()}],"translate-z":[{"translate-z":fe()}],"translate-none":[`translate-none`],zoom:[{zoom:[cr,B,z]}],accent:[{accent:N()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:N()}],"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`,B,z]}],"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":N()}],"scrollbar-track-color":[{"scrollbar-track":N()}],"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`,B,z]}],fill:[{fill:[`none`,...N()]}],"stroke-w":[{stroke:[R,Er,yr,br]}],stroke:[{stroke:[`none`,...N()]}],"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 V(...e){return Ur(hn(e))}var Wr=Object.defineProperty,Gr=(e,t)=>Wr(e,`name`,{value:t,configurable:!0});function Kr(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}Gr(Kr,`setRef`);function qr(...e){return t=>{let n=!1,r=e.map(e=>{let r=Kr(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;tJr(e,`name`,{value:t,configurable:!0});function Xr(e){let t=x.forwardRef((t,n)=>{let{children:r,...i}=t,a=null,o=!1,s=[];ai(r)&&typeof li==`function`&&(r=li(r._payload)),x.Children.forEach(r,e=>{if(ri(e)){o=!0;let t=e,n=`child`in t.props?t.props.child:t.props.children;ai(n)&&typeof li==`function`&&(n=li(n._payload)),a=ei(t,n),s.push(a?.props?.children)}else s.push(e)}),a?a=x.cloneElement(a,void 0,s):!o&&x.Children.count(r)===1&&x.isValidElement(r)&&(a=r);let c=a?ni(a):void 0,l=H(n,c);if(!a){if(r||r===0)throw Error(o?ci(e):si(e));return r}let u=ti(i,a.props??{});return a.type!==x.Fragment&&(u.ref=n?l:c),x.cloneElement(a,u)});return t.displayName=`${e}.Slot`,t}Yr(Xr,`createSlot`);var Zr=Xr(`Slot`),Qr=Symbol.for(`radix.slottable`);function $r(e){let t=Yr(e=>`child`in e?e.children(e.child):e.children,`Slottable`);return t.displayName=`${e}.Slottable`,t.__radixId=Qr,t}Yr($r,`createSlottable`);var ei=Yr((e,t)=>{if(`child`in e.props){let t=e.props.child;return x.isValidElement(t)?x.cloneElement(t,void 0,e.props.children(t.props.children)):null}return x.isValidElement(t)?t:null},`getSlottableElementFromSlottable`);function ti(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}Yr(ti,`mergeProps`);function ni(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}Yr(ni,`getElementRef`);function ri(e){return x.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===Qr}Yr(ri,`isSlottable`);var ii=Symbol.for(`react.lazy`);function ai(e){return typeof e==`object`&&!!e&&`$$typeof`in e&&e.$$typeof===ii&&`_payload`in e&&oi(e._payload)}Yr(ai,`isLazyComponent`);function oi(e){return typeof e==`object`&&!!e&&`then`in e}Yr(oi,`isPromiseLike`);var si=Yr(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,`createSlotError`),ci=Yr(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,`createSlottableError`),li=x.use,ui=l(h(),1),di=Object.defineProperty,fi=(e,t)=>di(e,`name`,{value:t,configurable:!0}),pi=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=Xr(`Primitive.${t}`),r=x.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,S.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function mi(e,t){e&&ui.flushSync(()=>e.dispatchEvent(t))}fi(mi,`dispatchDiscreteCustomEvent`);var hi=Object.defineProperty,gi=(e,t)=>hi(e,`name`,{value:t,configurable:!0});function _i(e,t){let n=x.createContext(t);n.displayName=e+`Context`;let r=gi(e=>{let{children:t,...r}=e,i=x.useMemo(()=>r,Object.values(r));return(0,S.jsx)(n.Provider,{value:i,children:t})},`Provider`);r.displayName=e+`Provider`;function i(r,i={}){let{optional:a=!1}=i,o=x.useContext(n);if(o)return o;if(t!==void 0)return t;if(!a)throw Error(`\`${r}\` must be used within \`${e}\``)}return gi(i,`useContext`),[r,i]}gi(_i,`createContext`);function vi(e,t=[]){let n=[];function r(t,r){let i=x.createContext(r);i.displayName=t+`Context`;let a=n.length;n=[...n,r];let o=gi(t=>{let{scope:n,children:r,...o}=t,s=n?.[e]?.[a]||i,c=x.useMemo(()=>o,Object.values(o));return(0,S.jsx)(s.Provider,{value:c,children:r})},`Provider`);o.displayName=t+`Provider`;function s(n,o,s={}){let{optional:c=!1}=s,l=o?.[e]?.[a]||i,u=x.useContext(l);if(u)return u;if(r!==void 0)return r;if(!c)throw Error(`\`${n}\` must be used within \`${t}\``)}return gi(s,`useContext`),[o,s]}gi(r,`createContext`);let i=gi(()=>{let t=n.map(e=>x.createContext(e));return gi(function(n){let r=n?.[e]||t;return x.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])},`useScope`)},`createScope`);return i.scopeName=e,[r,yi(i,...t)]}gi(vi,`createContextScope`);function yi(...e){let t=e[0];if(e.length===1)return t;let n=gi(()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return gi(function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return x.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])},`useComposedScopes`)},`createScope`);return n.scopeName=t.scopeName,n}gi(yi,`composeContextScopes`);var bi=Object.defineProperty,xi=(e,t)=>bi(e,`name`,{value:t,configurable:!0});function Si(e){let t=e+`CollectionProvider`,[n,r]=vi(t),[i,a]=n(t,{collectionRef:{current:null},itemMap:new Map}),o=xi(e=>{let{scope:t,children:n}=e,r=x.useRef(null),a=x.useRef(new Map).current;return(0,S.jsx)(i,{scope:t,itemMap:a,collectionRef:r,children:n})},`CollectionProvider`);o.displayName=t;let s=e+`CollectionSlot`,c=Xr(s),l=x.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=H(t,a(s,n).collectionRef);return(0,S.jsx)(c,{ref:i,children:r})});l.displayName=s;let u=e+`CollectionItemSlot`,d=`data-radix-collection-item`,f=Xr(u),p=x.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=x.useRef(null),s=H(t,o),c=a(u,n);return x.useEffect(()=>(c.itemMap.set(o,{ref:o,...i}),()=>void c.itemMap.delete(o))),(0,S.jsx)(f,{[d]:``,ref:s,children:r})});p.displayName=u;function m(t){let n=a(e+`CollectionConsumer`,t);return x.useCallback(()=>{let e=n.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${d}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])}return xi(m,`useCollection`),[{Provider:o,Slot:l,ItemSlot:p},m,r]}xi(Si,`createCollection`);var Ci=new WeakMap,wi=class e extends Map{static{xi(this,`OrderedDict`)}#e;constructor(e){super(e),this.#e=[...super.keys()],Ci.set(this,!0)}set(e,t){return Ci.get(this)&&(this.has(e)?this.#e[this.#e.indexOf(e)]=e:this.#e.push(e)),super.set(e,t),this}insert(e,t,n){let r=this.has(t),i=this.#e.length,a=Di(e),o=a>=0?a:i+a,s=o<0||o>=i?-1:o;if(s===this.size||r&&s===this.size-1||s===-1)return this.set(t,n),this;let c=this.size+ +!r;a<0&&o++;let l=[...this.#e],u,d=!1;for(let e=o;e=this.size&&(r=this.size-1),this.at(r)}keyFrom(e,t){let n=this.indexOf(e);if(n===-1)return;let r=n+t;return r<0&&(r=0),r>=this.size&&(r=this.size-1),this.keyAt(r)}find(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return r;n++}}findIndex(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return n;n++}return-1}filter(t,n){let r=[],i=0;for(let e of this)Reflect.apply(t,n,[e,i,this])&&r.push(e),i++;return new e(r)}map(t,n){let r=[],i=0;for(let e of this)r.push([e[0],Reflect.apply(t,n,[e,i,this])]),i++;return new e(r)}reduce(...e){let[t,n]=e,r=0,i=n??this.at(0);for(let n of this)i=r===0&&e.length===1?n:Reflect.apply(t,this,[i,n,r,this]),r++;return i}reduceRight(...e){let[t,n]=e,r=n??this.at(-1);for(let n=this.size-1;n>=0;n--){let i=this.at(n);r=n===this.size-1&&e.length===1?i:Reflect.apply(t,this,[r,i,n,this])}return r}toSorted(t){let n=[...this.entries()].sort(t);return new e(n)}toReversed(){let t=new e;for(let e=this.size-1;e>=0;e--){let n=this.keyAt(e),r=this.get(n);t.set(n,r)}return t}toSpliced(...t){let n=[...this.entries()];return n.splice(...t),new e(n)}slice(t,n){let r=new e,i=this.size-1;if(t===void 0)return r;t<0&&(t+=this.size),n!==void 0&&n>0&&(i=n-1);for(let e=t;e<=i;e++){let t=this.keyAt(e),n=this.get(t);r.set(t,n)}return r}every(e,t){let n=0;for(let r of this){if(!Reflect.apply(e,t,[r,n,this]))return!1;n++}return!0}some(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return!0;n++}return!1}};function Ti(e,t){if(`at`in Array.prototype)return Array.prototype.at.call(e,t);let n=Ei(e,t);return n===-1?void 0:e[n]}xi(Ti,`at`);function Ei(e,t){let n=e.length,r=Di(t),i=r>=0?r:n+r;return i<0||i>=n?-1:i}xi(Ei,`toSafeIndex`);function Di(e){return e!==e||e===0?0:Math.trunc(e)}xi(Di,`toSafeInteger`);function Oi(e){let t=e+`CollectionProvider`,[n,r]=vi(t),[i,a]=n(t,{collectionElement:null,collectionRef:{current:null},collectionRefObject:{current:null},itemMap:new wi,setItemMap:xi(()=>void 0,`setItemMap`)}),o=xi(({state:e,...t})=>e?(0,S.jsx)(c,{...t,state:e}):(0,S.jsx)(s,{...t}),`CollectionProvider`);o.displayName=t;let s=xi(e=>{let t=h();return(0,S.jsx)(c,{...e,state:t})},`CollectionInit`);s.displayName=t+`Init`;let c=xi(e=>{let{scope:t,children:n,state:r}=e,a=x.useRef(null),[o,s]=x.useState(null),c=H(a,s),[l,u]=r;return x.useEffect(()=>{if(!o)return;let e=ji(()=>{});return e.observe(o,{childList:!0,subtree:!0}),()=>{e.disconnect()}},[o]),(0,S.jsx)(i,{scope:t,itemMap:l,setItemMap:u,collectionRef:c,collectionRefObject:a,collectionElement:o,children:n})},`CollectionProviderImpl`);c.displayName=t+`Impl`;let l=e+`CollectionSlot`,u=Xr(l),d=x.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=H(t,a(l,n).collectionRef);return(0,S.jsx)(u,{ref:i,children:r})});d.displayName=l;let f=e+`CollectionItemSlot`,p=Xr(f),m=x.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=x.useRef(null),[s,c]=x.useState(null),l=H(t,o,c),{setItemMap:u}=a(f,n),d=x.useRef(i);ki(d.current,i)||(d.current=i);let m=d.current;return x.useEffect(()=>{let e=m;return u(t=>s?t.has(s)?t.set(s,{...e,element:s}).toSorted(U):(t.set(s,{...e,element:s}),t.toSorted(U)):t),()=>{u(e=>!s||!e.has(s)?e:(e.delete(s),new wi(e)))}},[s,m,u]),(0,S.jsx)(p,{"data-radix-collection-item":``,ref:l,children:r})});m.displayName=f;function h(){return x.useState(new wi)}xi(h,`useInitCollection`);function g(t){let{itemMap:n}=a(e+`CollectionConsumer`,t);return n}return xi(g,`useCollection`),[{Provider:o,Slot:d,ItemSlot:m},{createCollectionScope:r,useCollection:g,useInitCollection:h}]}xi(Oi,`createCollection`);function ki(e,t){if(e===t)return!0;if(typeof e!=`object`||typeof t!=`object`||e==null||t==null)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||e[r]!==t[r])return!1;return!0}xi(ki,`shallowEqual`);function Ai(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}xi(Ai,`isElementPreceding`);function U(e,t){return!e[1].element||!t[1].element?0:Ai(e[1].element,t[1].element)?-1:1}xi(U,`sortByDocumentPosition`);function ji(e){return new MutationObserver(t=>{for(let n of t)if(n.type===`childList`){e();return}})}xi(ji,`getChildListObserver`);var Mi=Object.defineProperty,Ni=(e,t)=>Mi(e,`name`,{value:t,configurable:!0}),Pi=!!(typeof window<`u`&&window.document&&window.document.createElement);function W(e,t,{checkForDefaultPrevented:n=!0}={}){return Ni(function(r){if(e?.(r),n===!1||!r||!r.defaultPrevented)return t?.(r)},`handleEvent`)}Ni(W,`composeEventHandlers`);function Fi(e){if(!Pi)throw Error(`Cannot access window outside of the DOM`);return e?.ownerDocument?.defaultView??window}Ni(Fi,`getOwnerWindow`);function Ii(e){if(!Pi)throw Error(`Cannot access document outside of the DOM`);return e?.ownerDocument??document}Ni(Ii,`getOwnerDocument`);function Li(e,t=!1){let{activeElement:n}=Ii(e);if(!n?.nodeName)return null;if(Ri(n)&&n.contentDocument)return Li(n.contentDocument.body,t);if(t){let e=n.getAttribute(`aria-activedescendant`);if(e){let t=Ii(n).getElementById(e);if(t)return t}}return n}Ni(Li,`getActiveElement`);function Ri(e){return e.tagName===`IFRAME`}Ni(Ri,`isFrame`);var zi=globalThis?.document?x.useLayoutEffect:()=>{},Bi=Object.defineProperty,Vi=(e,t)=>Bi(e,`name`,{value:t,configurable:!0}),Hi=x.useEffectEvent,Ui=x.useInsertionEffect;function Wi(e){if(typeof Hi==`function`)return Hi(e);let t=x.useRef(()=>{throw Error(`Cannot call an event handler while rendering.`)});return typeof Ui==`function`?Ui(()=>{t.current=e}):zi(()=>{t.current=e}),x.useMemo(()=>((...e)=>t.current?.(...e)),[])}Vi(Wi,`useEffectEvent`);var Gi=Object.defineProperty,Ki=(e,t)=>Gi(e,`name`,{value:t,configurable:!0}),qi=x.useInsertionEffect||zi;function Ji({prop:e,defaultProp:t,onChange:n=Ki(()=>{},`onChange`),caller:r}){let[i,a,o]=Yi({defaultProp:t,onChange:n}),s=e!==void 0;return[s?e:i,x.useCallback(t=>{if(s){let n=Xi(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[s,e,a,o])]}Ki(Ji,`useControllableState`);function Yi({defaultProp:e,onChange:t}){let[n,r]=x.useState(e),i=x.useRef(n),a=x.useRef(t);return qi(()=>{a.current=t},[t]),x.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}Ki(Yi,`useUncontrolledState`);function Xi(e){return typeof e==`function`}Ki(Xi,`isFunction`);var Zi=Symbol(`RADIX:SYNC_STATE`);function Qi(e,t,n,r){let{prop:i,defaultProp:a,onChange:o,caller:s}=t,c=i!==void 0,l=Wi(o),u=[{...n,state:a}];r&&u.push(r);let[d,f]=x.useReducer((t,n)=>{if(n.type===Zi)return{...t,state:n.state};let r=e(t,n);return c&&!Object.is(r.state,t.state)&&l(r.state),r},...u),p=d.state,m=x.useRef(p);x.useEffect(()=>{m.current!==p&&(m.current=p,c||l(p))},[p,m,c]);let h=x.useMemo(()=>i===void 0?d:{...d,state:i},[d,i]);return x.useEffect(()=>{c&&!Object.is(i,d.state)&&f({type:Zi,state:i})},[i,d.state,c]),[h,f]}Ki(Qi,`useControllableStateReducer`);var $i=Object.defineProperty,ea=(e,t)=>$i(e,`name`,{value:t,configurable:!0});function ta(e,t){return x.useReducer((e,n)=>t[e][n]??e,e)}ea(ta,`useStateMachine`);var na=ea(e=>{let{present:t,children:n}=e,r=ra(t),i=typeof n==`function`?n({present:r.isPresent}):x.Children.only(n),a=aa(r.ref,sa(i));return typeof n==`function`||r.isPresent?x.cloneElement(i,{ref:a}):null},`Presence`);function ra(e){let[t,n]=x.useState(),r=x.useRef(null),i=x.useRef(e),a=x.useRef(`none`),o=x.useRef(void 0),[s,c]=ta(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return x.useEffect(()=>{s===`mounted`?(a.current=o.current??oa(r.current),o.current=void 0):a.current=`none`},[s]),zi(()=>{let t=r.current,n=i.current;if(n!==e){let r=a.current,s=oa(t);e?(o.current=s,c(`MOUNT`)):s===`none`||t?.display===`none`?c(`UNMOUNT`):c(n&&r!==s?`ANIMATION_OUT`:`UNMOUNT`),i.current=e}},[e,c]),zi(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,o=ea(a=>{let o=oa(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&o&&(c(`ANIMATION_END`),!i.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},`handleAnimationEnd`),s=ea(e=>{e.target===t&&(a.current=oa(r.current))},`handleAnimationStart`);return t.addEventListener(`animationstart`,s),t.addEventListener(`animationcancel`,o),t.addEventListener(`animationend`,o),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,s),t.removeEventListener(`animationcancel`,o),t.removeEventListener(`animationend`,o)}}c(`ANIMATION_END`)},[t,c]),{isPresent:[`mounted`,`unmountSuspended`].includes(s),ref:x.useCallback(e=>{if(e){let t=getComputedStyle(e);r.current=t,o.current=oa(t)}else r.current=null;n(e)},[])}}ea(ra,`usePresence`);function ia(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}ea(ia,`setRef`);function aa(...e){let t=x.useRef(e);return t.current=e,x.useCallback(e=>{let n=t.current,r=!1,i=n.map(t=>{let n=ia(t,e);return!r&&typeof n==`function`&&(r=!0),n});if(r)return()=>{for(let e=0;eca(e,`name`,{value:t,configurable:!0}),ua=x.useId||(()=>void 0),da=0;function fa(e){let[t,n]=x.useState(ua());return zi(()=>{e||n(e=>e??String(da++))},[e]),e||(t?`radix-${t}`:``)}la(fa,`useId`);var pa=Object.defineProperty,ma=(e,t)=>pa(e,`name`,{value:t,configurable:!0}),ha=x.createContext(void 0);function ga(e){let t=x.useContext(ha);return e||t||`ltr`}ma(ga,`useDirection`);var _a=Object.defineProperty,va=(e,t)=>_a(e,`name`,{value:t,configurable:!0});function ya(e){let t=x.useRef(e);return x.useEffect(()=>{t.current=e}),x.useMemo(()=>((...e)=>t.current?.(...e)),[])}va(ya,`useCallbackRef`);var ba=Object.defineProperty,xa=(e,t)=>ba(e,`name`,{value:t,configurable:!0}),Sa=`dismissableLayer.update`,Ca=`dismissableLayer.pointerDownOutside`,wa=`dismissableLayer.focusOutside`,Ta,Ea=x.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),Da=x.forwardRef(xa(function(e,t){let{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:i,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:s,onDismiss:c,...l}=e,u=x.useContext(Ea),[d,f]=x.useState(null),p=d?.ownerDocument??globalThis?.document,[,m]=x.useState({}),h=H(t,f),g=Array.from(u.layers),[_]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),v=_?g.indexOf(_):-1,y=d?g.indexOf(d):-1,b=u.layersWithOutsidePointerEventsDisabled.size>0,C=y>=v,w=x.useRef(!1),T=Aa(e=>{a?.(e),s?.(e),e.defaultPrevented||c?.()},{ownerDocument:p,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:w,dismissableSurfaces:u.dismissableSurfaces,shouldHandlePointerDownOutside:x.useCallback(e=>{if(!(e instanceof Node))return!1;let t=[...u.branches].some(t=>t.contains(e));return C&&!t},[u.branches,C])}),E=ja(e=>{if(r&&w.current)return;let t=e.target;[...u.branches].some(e=>e.contains(t))||(o?.(e),s?.(e),e.defaultPrevented||c?.())},p),D=d?y===g.length-1:!1,O=ya(e=>{e.key===`Escape`&&(i?.(e),!e.defaultPrevented&&c&&(e.preventDefault(),c()))});return x.useEffect(()=>{if(D)return p.addEventListener(`keydown`,O,{capture:!0}),()=>p.removeEventListener(`keydown`,O,{capture:!0})},[p,D,O]),x.useEffect(()=>{if(d)return n&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(Ta=p.body.style.pointerEvents,p.body.style.pointerEvents=`none`),u.layersWithOutsidePointerEventsDisabled.add(d)),u.layers.add(d),Ma(),()=>{n&&(u.layersWithOutsidePointerEventsDisabled.delete(d),u.layersWithOutsidePointerEventsDisabled.size===0&&(p.body.style.pointerEvents=Ta))}},[d,p,n,u]),x.useEffect(()=>()=>{d&&(u.layers.delete(d),u.layersWithOutsidePointerEventsDisabled.delete(d),Ma())},[d,u]),x.useEffect(()=>{let e=xa(()=>m({}),`handleUpdate`);return document.addEventListener(Sa,e),()=>document.removeEventListener(Sa,e)},[]),(0,S.jsx)(pi.div,{...l,ref:h,style:{pointerEvents:b?C?`auto`:`none`:void 0,...e.style},onFocusCapture:W(e.onFocusCapture,E.onFocusCapture),onBlurCapture:W(e.onBlurCapture,E.onBlurCapture),onPointerDownCapture:W(e.onPointerDownCapture,T.onPointerDownCapture)})},`DismissableLayer`));function Oa(){let e=x.useContext(Ea),[t,n]=x.useState(null);return x.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),n}xa(Oa,`useDismissableLayerSurface`);var ka=xa(()=>!0,`IS_TRUE`);function Aa(e,t){let{ownerDocument:n=globalThis?.document,deferPointerDownOutside:r=!1,isDeferredPointerDownOutsideRef:i,dismissableSurfaces:a,shouldHandlePointerDownOutside:o=ka}=t,s=ya(e),c=x.useRef(!1),l=x.useRef(!1),u=x.useRef(new Map),d=x.useRef(()=>{});return x.useEffect(()=>{function e(){l.current=!1,i.current=!1,u.current.clear()}xa(e,`resetOutsideInteraction`);function t(){return Array.from(u.current.values()).some(Boolean)}xa(t,`isOutsideInteractionIntercepted`);function f(e){if(!l.current)return;let t=e.target;t instanceof Node&&[...a].some(e=>e.contains(t))||u.current.set(e.type,!0),e.type===`click`&&window.setTimeout(()=>{l.current&&d.current()},0)}xa(f,`handleInteractionCapture`);function p(e){l.current&&u.current.set(e.type,!1)}xa(p,`handleInteractionBubble`);let m=xa(a=>{if(a.target&&!c.current){let f=function(){n.removeEventListener(`click`,d.current);let r=t();e(),r||Na(Ca,s,p,{discrete:!0})};if(xa(f,`handleAndDispatchPointerDownOutsideEvent`),!o(a.target)){n.removeEventListener(`click`,d.current),e(),c.current=!1;return}let p={originalEvent:a};l.current=!0,i.current=r&&a.button===0,u.current.clear(),!r||a.button!==0?f():(n.removeEventListener(`click`,d.current),d.current=f,n.addEventListener(`click`,d.current,{once:!0}))}else n.removeEventListener(`click`,d.current),e();c.current=!1},`handlePointerDown`),h=[`pointerup`,`mousedown`,`mouseup`,`touchstart`,`touchend`,`click`];for(let e of h)n.addEventListener(e,f,!0),n.addEventListener(e,p);let g=window.setTimeout(()=>{n.addEventListener(`pointerdown`,m)},0);return()=>{window.clearTimeout(g),n.removeEventListener(`pointerdown`,m),n.removeEventListener(`click`,d.current);for(let e of h)n.removeEventListener(e,f,!0),n.removeEventListener(e,p)}},[n,s,r,i,a,o]),{onPointerDownCapture:xa(()=>c.current=!0,`onPointerDownCapture`)}}xa(Aa,`usePointerDownOutside`);function ja(e,t=globalThis?.document){let n=ya(e),r=x.useRef(!1);return x.useEffect(()=>{let e=xa(e=>{e.target&&!r.current&&Na(wa,n,{originalEvent:e},{discrete:!1})},`handleFocus`);return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:xa(()=>r.current=!0,`onFocusCapture`),onBlurCapture:xa(()=>r.current=!1,`onBlurCapture`)}}xa(ja,`useFocusOutside`);function Ma(){let e=new CustomEvent(Sa);document.dispatchEvent(e)}xa(Ma,`dispatchUpdate`);function Na(e,t,n,{discrete:r}){let i=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&i.addEventListener(e,t,{once:!0}),r?mi(i,a):i.dispatchEvent(a)}xa(Na,`handleAndDispatchCustomEvent`);var Pa=Object.defineProperty,Fa=(e,t)=>Pa(e,`name`,{value:t,configurable:!0}),Ia=`focusScope.autoFocusOnMount`,La=`focusScope.autoFocusOnUnmount`,Ra={bubbles:!1,cancelable:!0},za=x.forwardRef(Fa(function(e,t){let{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:a,...o}=e,[s,c]=x.useState(null),l=ya(i),u=ya(a),d=x.useRef(null),f=H(t,c),p=x.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;x.useEffect(()=>{if(r){let e=function(e){if(p.paused||!s)return;let t=e.target;s.contains(t)?d.current=t:Ka(d.current,{select:!0})},t=function(e){if(p.paused||!s)return;let t=e.relatedTarget;t!==null&&(s.contains(t)||Ka(d.current,{select:!0}))},n=function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&Ka(s)};Fa(e,`handleFocusIn`),Fa(t,`handleFocusOut`),Fa(n,`handleMutations`),document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,t);let r=new MutationObserver(n);return s&&r.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,t),r.disconnect()}}},[r,s,p.paused]),x.useEffect(()=>{if(s){qa.add(p);let e=document.activeElement;if(!s.contains(e)){let t=new CustomEvent(Ia,Ra);s.addEventListener(Ia,l),s.dispatchEvent(t),t.defaultPrevented||(Ba(Xa(Ha(s)),{select:!0}),document.activeElement===e&&Ka(s))}return()=>{s.removeEventListener(Ia,l),setTimeout(()=>{let t=new CustomEvent(La,Ra);s.addEventListener(La,u),s.dispatchEvent(t),t.defaultPrevented||Ka(e??document.body,{select:!0}),s.removeEventListener(La,u),qa.remove(p)},0)}}},[s,l,u,p]);let m=x.useCallback(e=>{if(!n&&!r||p.paused)return;let t=e.key===`Tab`&&!e.altKey&&!e.ctrlKey&&!e.metaKey,i=document.activeElement;if(t&&i){let t=e.currentTarget,[r,a]=Va(t);r&&a?!e.shiftKey&&i===a?(e.preventDefault(),n&&Ka(r,{select:!0})):e.shiftKey&&i===r&&(e.preventDefault(),n&&Ka(a,{select:!0})):i===t&&e.preventDefault()}},[n,r,p.paused]);return(0,S.jsx)(pi.div,{tabIndex:-1,...o,ref:f,onKeyDown:m})},`FocusScope`));function Ba(e,{select:t=!1}={}){let n=document.activeElement;for(let r of e)if(Ka(r,{select:t}),document.activeElement!==n)return}Fa(Ba,`focusFirst`);function Va(e){let t=Ha(e);return[Ua(t,e),Ua(t.reverse(),e)]}Fa(Va,`getTabbableEdges`);function Ha(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:Fa(e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},`acceptNode`)});for(;n.nextNode();)t.push(n.currentNode);return t}Fa(Ha,`getTabbableCandidates`);function Ua(e,t){let n=typeof t.checkVisibility==`function`&&t.checkVisibility({checkVisibilityCSS:!0});for(let r of e)if(!(n?!r.checkVisibility({checkVisibilityCSS:!0}):Wa(r,{upTo:t})))return r}Fa(Ua,`findVisible`);function Wa(e,{upTo:t}){if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1}Fa(Wa,`isHidden`);function Ga(e){return e instanceof HTMLInputElement&&`select`in e}Fa(Ga,`isSelectableInput`);function Ka(e,{select:t=!1}={}){if(e&&e.focus){let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&Ga(e)&&t&&e.select()}}Fa(Ka,`focus`);var qa=Ja();function Ja(){let e=[];return{add(t){let n=e[0];t!==n&&n?.pause(),e=Ya(e,t),e.unshift(t)},remove(t){e=Ya(e,t),e[0]?.resume()}}}Fa(Ja,`createFocusScopesStack`);function Ya(e,t){let n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}Fa(Ya,`arrayRemove`);function Xa(e){return e.filter(e=>e.tagName!==`A`)}Fa(Xa,`removeLinks`);var Za=Object.defineProperty,Qa=x.forwardRef(((e,t)=>Za(e,`name`,{value:t,configurable:!0}))(function(e,t){let{container:n,...r}=e,[i,a]=x.useState(!1);zi(()=>a(!0),[]);let o=n||i&&globalThis?.document?.body;return o?ui.createPortal((0,S.jsx)(pi.div,{...r,ref:t}),o):null},`Portal`)),$a=Object.defineProperty,eo=(e,t)=>$a(e,`name`,{value:t,configurable:!0}),to=0,no=null;function ro(e){return io(),e.children}eo(ro,`FocusGuards`);function io(){x.useEffect(()=>{no||={start:ao(),end:ao()};let{start:e,end:t}=no;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement(`afterbegin`,e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement(`beforeend`,t),to++,()=>{to===1&&(no?.start.remove(),no?.end.remove(),no=null),to=Math.max(0,to-1)}},[])}eo(io,`useFocusGuards`);function ao(){let e=document.createElement(`span`);return e.setAttribute(`data-radix-focus-guard`,``),e.tabIndex=0,e.style.outline=`none`,e.style.opacity=`0`,e.style.position=`fixed`,e.style.pointerEvents=`none`,e}eo(ao,`createFocusGuard`);var oo=function(){return oo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n`u`)return Po;var t=Io(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},Ro=No(),zo=`data-scroll-locked`,Bo=function(e,t,n,r){var i=e.left,a=e.top,o=e.right,s=e.gap;return n===void 0&&(n=`margin`),` - .${lo} { +`+e.stack}}var xe=Object.prototype.hasOwnProperty,Se=t.unstable_scheduleCallback,Ce=t.unstable_cancelCallback,we=t.unstable_shouldYield,Te=t.unstable_requestPaint,Ee=t.unstable_now,De=t.unstable_getCurrentPriorityLevel,Oe=t.unstable_ImmediatePriority,ke=t.unstable_UserBlockingPriority,Ae=t.unstable_NormalPriority,je=t.unstable_LowPriority,Me=t.unstable_IdlePriority,Ne=t.log,Pe=t.unstable_setDisableYieldValue,Fe=null,Ie=null;function Le(e){if(typeof Ne==`function`&&Pe(e),Ie&&typeof Ie.setStrictMode==`function`)try{Ie.setStrictMode(Fe,e)}catch{}}var Re=Math.clz32?Math.clz32:Ve,ze=Math.log,Be=Math.LN2;function Ve(e){return e>>>=0,e===0?32:31-(ze(e)/Be|0)|0}var He=256,Ue=262144,We=4194304;function Ge(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ke(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Ge(n))):i=Ge(o):i=Ge(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ge(n))):i=Ge(o)):i=Ge(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function qe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Je(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ye(){var e=We;return We<<=1,!(We&62914560)&&(We=4194304),e}function Xe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ze(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Qe(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),dn=!1;if(un)try{var fn={};Object.defineProperty(fn,"passive",{get:function(){dn=!0}}),window.addEventListener(`test`,fn,fn),window.removeEventListener(`test`,fn,fn)}catch{dn=!1}var pn=null,mn=null,hn=null;function gn(){if(hn)return hn;var e,t=mn,n=t.length,r,i=`value`in pn?pn.value:pn.textContent,a=i.length;for(e=0;e=qn),Xn=` `,Zn=!1;function Qn(e,t){switch(e){case`keyup`:return Gn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function $n(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var er=!1;function tr(e,t){switch(e){case`compositionend`:return $n(t);case`keypress`:return t.which===32?(Zn=!0,Xn):null;case`textInput`:return e=t.data,e===Xn&&Zn?null:e;default:return null}}function nr(e,t){if(er)return e===`compositionend`||!Kn&&Qn(e,t)?(e=gn(),hn=mn=pn=null,er=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=wr(n)}}function Er(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Er(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Lt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Lt(e.document)}return t}function Or(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var kr=un&&`documentMode`in document&&11>=document.documentMode,Ar=null,jr=null,Mr=null,Nr=!1;function Pr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nr||Ar==null||Ar!==Lt(r)||(r=Ar,`selectionStart`in r&&Or(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Mr&&Cr(Mr,r)||(Mr=r,r=Ed(jr,`onSelect`),0>=o,i-=o,Ci=1<<32-Re(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),W&&wi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),W&&wi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return W&&wi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),W&&wi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Sa(l)===r.type){n(e,r.sibling),c=a(r,o.props),ka(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=ui(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=li(o.type,o.key,o.props,null,e.mode,c),ka(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=pi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Sa(o),b(e,r,o,c)}if(ne(o))return h(e,r,o,c);if(j(o)){if(l=j(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Oa(o),c);if(o.$$typeof===C)return b(e,r,Zi(e,o),c);Aa(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=di(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Da=0;var i=b(e,t,n,r);return Ea=null,i}catch(t){if(t===ga||t===va)throw t;var a=V(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ma=ja(!0),Na=ja(!1),Pa=!1;function Fa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ia(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function La(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ra(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,q&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ri(e),ni(e,null,n),t}return $r(e,r,t,n),ri(e)}function za(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,et(e,n)}}function Ba(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Va=!1;function Ha(){if(Va){var e=ca;if(e!==null)throw e}}function Ua(e,t,n,r){Va=!1;var i=e.updateQueue;Pa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(Y&f)===f:(r&f)===f){f!==0&&f===sa&&(Va=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=m({},d,f);break a;case 2:Pa=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Wa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Ga(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=N.T,s={};N.T=s,js(e,!1,t,n);try{var c=i(),l=N.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?As(e,t,da(c,r),pu(e)):As(e,t,r,pu(e))}catch(n){As(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{P.p=a,o!==null&&s.types!==null&&(o.types=s.types),N.T=o}}function bs(){}function xs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Ss(e).queue;ys(e,a,t,re,n===null?bs:function(){return Cs(e),n(r)})}function Ss(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:re,baseState:re,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mo,lastRenderedState:re},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Cs(e){var t=Ss(e);t.next===null&&(t=e.alternate.memoizedState),As(e,t.next.queue,{},pu())}function ws(){return Xi($f)}function Ts(){return Do().memoizedState}function Es(){return Do().memoizedState}function Ds(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=La(n);var r=Ra(t,e,n);r!==null&&(hu(r,t,n),za(r,t,n)),t={cache:ra()},e.payload=t;return}t=t.return}}function Os(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Ms(e)?Ns(t,n):(n=ei(e,t,n,r),n!==null&&(hu(n,e,r),Ps(n,t,r)))}function ks(e,t,n){As(e,t,n,pu())}function As(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ms(e))Ns(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Sr(s,o))return $r(e,t,i,0),Rl===null&&B(),!1}catch{}if(n=ei(e,t,i,r),n!==null)return hu(n,e,r),Ps(n,t,r),!0}return!1}function js(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Ms(e)){if(t)throw Error(i(479))}else t=ei(e,n,r,2),t!==null&&hu(t,e,2)}function Ms(e){var t=e.alternate;return e===K||t!==null&&t===K}function Ns(e,t){uo=lo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ps(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,et(e,n)}}var Fs={readContext:Xi,use:Ao,useCallback:_o,useContext:_o,useEffect:_o,useImperativeHandle:_o,useLayoutEffect:_o,useInsertionEffect:_o,useMemo:_o,useReducer:_o,useRef:_o,useState:_o,useDebugValue:_o,useDeferredValue:_o,useTransition:_o,useSyncExternalStore:_o,useId:_o,useHostTransitionStatus:_o,useFormState:_o,useActionState:_o,useOptimistic:_o,useMemoCache:_o,useCacheRefresh:_o};Fs.useEffectEvent=_o;var Is={readContext:Xi,use:Ao,useCallback:function(e,t){return Eo().memoizedState=[e,t===void 0?null:t],e},useContext:Xi,useEffect:os,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),is(4194308,4,fs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return is(4194308,4,e,t)},useInsertionEffect:function(e,t){is(4,2,e,t)},useMemo:function(e,t){var n=Eo();t=t===void 0?null:t;var r=e();if(fo){Le(!0);try{e()}finally{Le(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Eo();if(n!==void 0){var i=n(t);if(fo){Le(!0);try{n(t)}finally{Le(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Os.bind(null,K,e),[r.memoizedState,e]},useRef:function(e){var t=Eo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ho(e);var t=e.queue,n=ks.bind(null,K,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ms,useDeferredValue:function(e,t){return _s(Eo(),e,t)},useTransition:function(){var e=Ho(!1);return e=ys.bind(null,K,e.queue,!0,!1),Eo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=K,a=Eo();if(W){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Rl===null)throw Error(i(349));Y&127||Lo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,os(zo.bind(null,r,o,e),[e]),r.flags|=2048,ns(9,{destroy:void 0},Ro.bind(null,r,o,n,t),null),n},useId:function(){var e=Eo(),t=Rl.identifierPrefix;if(W){var n=H,r=Ci;n=(r&~(1<<32-Re(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=po++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[st]=t,o[ct]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Fd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Ac(t)}}return Fc(t),jc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Ac(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ce.current,Ii(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=ki,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[st]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Ni(t,!0)}else e=Vd(e).createTextNode(r),e[st]=t,t.stateNode=e}return Fc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ii(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[st]=t}else Li(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Fc(t),e=!1}else n=Ri(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ro(t),t):(ro(t),null);if(t.flags&128)throw Error(i(558))}return Fc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ii(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[st]=t}else Li(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Fc(t),a=!1}else a=Ri(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(ro(t),t):(ro(t),null)}return ro(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Nc(t,t.updateQueue),Fc(t),null);case 4:return de(),e===null&&Sd(t.stateNode.containerInfo),Fc(t),null;case 10:return Wi(t.type),Fc(t),null;case 19:if(I(io),r=t.memoizedState,r===null)return Fc(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Pc(r,!1);else{if(Wl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=ao(e),o!==null){for(t.flags|=128,Pc(r,!1),e=o.updateQueue,t.updateQueue=e,Nc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ci(n,e),n=n.sibling;return L(io,io.current&1|2),W&&wi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ee()>tu&&(t.flags|=128,a=!0,Pc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=ao(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Nc(t,e),Pc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!W)return Fc(t),null}else 2*Ee()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Pc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Fc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ee(),e.sibling=null,n=io.current,L(io,a?n&1|2:n&1),W&&wi(t,r.treeForkCount),e);case 22:case 23:return ro(t),Xa(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Fc(t),t.subtreeFlags&6&&(t.flags|=8192)):Fc(t),n=t.updateQueue,n!==null&&Nc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&I(pa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Wi(na),Fc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Lc(e,t){switch(Di(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Wi(na),de(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return pe(t),null;case 31:if(t.memoizedState!==null){if(ro(t),t.alternate===null)throw Error(i(340));Li()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ro(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Li()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(io),null;case 4:return de(),null;case 10:return Wi(t.type),null;case 22:case 23:return ro(t),Xa(),e!==null&&I(pa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Wi(na),null;case 25:return null;default:return null}}function Rc(e,t){switch(Di(t),t.tag){case 3:Wi(na),de();break;case 26:case 27:case 5:pe(t);break;case 4:de();break;case 31:t.memoizedState!==null&&ro(t);break;case 13:ro(t);break;case 19:I(io);break;case 10:Wi(t.type);break;case 22:case 23:ro(t),Xa(),e!==null&&I(pa);break;case 24:Wi(na)}}function zc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Bc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Vc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Ga(t,n)}catch(t){Z(e,e.return,t)}}}function Hc(e,t,n){n.props=Us(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Uc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Wc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Gc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Kc(e,t,n){try{var r=e.stateNode;Id(r,e.type,n,t),r[ct]=t}catch(t){Z(e,e.return,t)}}function qc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Qd(e.type)||e.tag===4}function Jc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||qc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Qd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Yc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=en));else if(r!==4&&(r===27&&Qd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Yc(e,t,n),e=e.sibling;e!==null;)Yc(e,t,n),e=e.sibling}function Xc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Qd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Xc(e,t,n),e=e.sibling;e!==null;)Xc(e,t,n),e=e.sibling}function Zc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Fd(t,r,n),t[st]=e,t[ct]=n}catch(t){Z(e,e.return,t)}}var Qc=!1,$c=!1,el=!1,tl=typeof WeakSet==`function`?WeakSet:Set,nl=null;function rl(e,t){if(e=e.containerInfo,zd=cp,e=Dr(e),Or(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Bd={focusedElem:e,selectionRange:n},cp=!1,nl=t;nl!==null;)if(t=nl,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,nl=e;else for(;nl!==null;){switch(t=nl,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Fd(o,r,n),o[st]=e,bt(o),r=o;break a;case`link`:var s=Hf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Tr(s,h),v=Tr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,N.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,q&6)throw Error(i(331));var c=q;if(q|=4,Nl(o.current),Tl(o,o.current,s,n),q=c,id(0,!1),Ie&&typeof Ie.onPostCommitFiberRoot==`function`)try{Ie.onPostCommitFiberRoot(Fe,o)}catch{}return!0}finally{P.p=a,N.T=r,Vu(e,t)}}function Wu(e,t,n){t=hi(n,t),t=Ys(e.stateNode,t,2),e=Ra(e,t,2),e!==null&&(Ze(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=hi(n,e),n=Xs(2),r=Ra(t,n,2),r!==null&&(Zs(n,r,t,e),Ze(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Ll;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Hl=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Rl===e&&(Y&n)===n&&(Wl===4||Wl===3&&(Y&62914560)===Y&&300>Ee()-$l?!(q&2)&&Su(e,0):ql|=n,Yl===Y&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Ye()),e=ti(e,t),e!==null&&(Ze(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Se(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Re(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=Y,a=Ke(r,r===Rl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||qe(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Kd()&&(e=nd);for(var t=Ee(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Ld(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Sf(e,t,n){var r=xf;if(r&&typeof t==`string`&&t){var i=zt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),gf.has(i)||(gf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Fd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Cf(e){vf.D(e),Sf(`dns-prefetch`,e,null)}function wf(e,t){vf.C(e,t),Sf(`preconnect`,e,t)}function Tf(e,t,n){vf.L(e,t,n);var r=xf;if(r&&e&&t){var i=`link[rel="preload"][as="`+zt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+zt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+zt(n.imageSizes)+`"]`)):i+=`[href="`+zt(e)+`"]`;var a=i;switch(t){case`style`:a=jf(e);break;case`script`:a=Ff(e)}hf.has(a)||(e=m({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),hf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Mf(a))||t===`script`&&r.querySelector(If(a))||(t=r.createElement(`link`),Fd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Ef(e,t){vf.m(e,t);var n=xf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+zt(r)+`"][href="`+zt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Ff(e)}if(!hf.has(a)&&(e=m({rel:`modulepreload`,href:e},t),hf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(If(a)))return}r=n.createElement(`link`),Fd(r,`link`,e),bt(r),n.head.appendChild(r)}}}function Df(e,t,n){vf.S(e,t,n);var r=xf;if(r&&e){var i=yt(r).hoistableStyles,a=jf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Mf(a)))s.loading=5;else{e=m({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=hf.get(a))&&zf(e,n);var c=o=r.createElement(`link`);bt(c),Fd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Rf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Of(e,t){vf.X(e,t);var n=xf;if(n&&e){var r=yt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=m({src:e,async:!0},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),bt(a),Fd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t){vf.M(e,t);var n=xf;if(n&&e){var r=yt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=m({src:e,async:!0,type:`module`},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),bt(a),Fd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Af(e,t,n,r){var a=(a=ce.current)?_f(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=jf(n.href),n=yt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=jf(n.href);var o=yt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Mf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),hf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},hf.set(e,n),o||Pf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Ff(n),n=yt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function jf(e){return`href="`+zt(e)+`"`}function Mf(e){return`link[rel="stylesheet"][`+e+`]`}function Nf(e){return m({},e,{"data-precedence":e.precedence,precedence:null})}function Pf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Fd(t,`link`,n),bt(t),e.head.appendChild(t))}function Ff(e){return`[src="`+zt(e)+`"]`}function If(e){return`script[async]`+e}function Lf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+zt(n.href)+`"]`);if(r)return t.instance=r,bt(r),r;var a=m({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),bt(r),Fd(r,`style`,a),Rf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=jf(n.href);var o=e.querySelector(Mf(a));if(o)return t.state.loading|=4,t.instance=o,bt(o),o;r=Nf(n),(a=hf.get(a))&&zf(r,a),o=(e.ownerDocument||e).createElement(`link`),bt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Fd(o,`link`,r),t.state.loading|=4,Rf(o,n.precedence,e),t.instance=o;case`script`:return o=Ff(n.src),(a=e.querySelector(If(o)))?(t.instance=a,bt(a),a):(r=n,(a=hf.get(o))&&(r=m({},n),Bf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),bt(a),Fd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Rf(r,n.precedence,e));return t.instance}function Rf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Wf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Gf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Kf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=jf(r.href),a=t.querySelector(Mf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Yf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,bt(a);return}a=t.ownerDocument||t,r=Nf(r),(i=hf.get(i))&&zf(r,i),a=a.createElement(`link`),bt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Fd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Yf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var qf=0;function Jf(e,t){return e.stylesheets&&e.count===0&&Zf(e,e.stylesheets),0qf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Yf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Zf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Xf=null;function Zf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Xf=new Map,t.forEach(Qf,e),Xf=null,Yf.call(e))}function Qf(e,t){if(!(t.state.loading&4)){var n=Xf.get(e);if(n)var r=n.get(null);else{n=new Map,Xf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=g()})),v=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),y=o(((e,t)=>{t.exports=v()})),b=_(),x=l(p(),1),S=l(y(),1),C=x.createContext(void 0),w=e=>{let t=x.useContext(C);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},T=({client:e,children:t})=>(x.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,S.jsx)(C.Provider,{value:e,children:t})),E={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},D=new class{#e=E;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function O(e){setTimeout(e,0)}var ee=typeof window>`u`||`Deno`in globalThis;function k(){}function A(e,t){return typeof e==`function`?e(t):e}function j(e){return typeof e==`number`&&e>=0&&e!==1/0}function te(e,t){return Math.max(e+(t||0)-Date.now(),0)}function M(e,t){return typeof e==`function`?e(t):e}function ne(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==P(o,t.options))return!1}else if(!ie(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function N(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(re(t.options.mutationKey)!==re(a))return!1}else if(!ie(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function P(e,t){return(t?.queryKeyHashFn||re)(e)}function re(e){return JSON.stringify(e,(e,t)=>oe(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ie(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(Array.isArray(e)&&Array.isArray(t)){for(let n=0;n500)return t;let r=L(e)&&L(t);if(!r&&!(oe(e)&&oe(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l{D.setTimeout(t,e)})}function le(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:F(e,t)}function ue(e){return e}function de(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function fe(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var pe=Symbol();function me(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===pe?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function he(e,t){return typeof e==`function`?e(...t):!!e}function ge(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var _e=()=>ee,ve=()=>_e(),ye={isServer:ve,setIsServer(e){_e=e}},be=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},xe=new class extends be{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}};function Se(e){let t;if(e.then(e=>(t=e,e),k)?.catch?.(k),t!==void 0)return{data:t}}function Ce(e){return{mutationKey:e.options.mutationKey,state:e.state,...e.options.scope&&{scope:e.options.scope},...e.meta&&{meta:e.meta}}}function we(e,t,n){let r=e.promise?.then(t).catch(e=>n?.(e)===!1?Promise.reject(e):Promise.reject(Error(`redacted`)));return r?.catch(k),r}function Te(e,t,n){return{dehydratedAt:Date.now(),state:{...e.state,...e.state.data!==void 0&&{data:t?t(e.state.data):e.state.data}},queryKey:e.queryKey,queryHash:e.queryHash,...e.state.status===`pending`&&{promise:we(e,t,n)},...e.meta&&{meta:e.meta},...e.queryType&&{queryType:e.queryType}}}function Ee(e){return e.state.isPaused}function De(e){return e.state.status===`success`}function Oe(e,t={}){let n=t.shouldDehydrateMutation??e.getDefaultOptions().dehydrate?.shouldDehydrateMutation??Ee,r=e.getMutationCache().getAll().flatMap(e=>n(e)?[Ce(e)]:[]),i=t.shouldDehydrateQuery??e.getDefaultOptions().dehydrate?.shouldDehydrateQuery??De,a=t.shouldRedactErrors??e.getDefaultOptions().dehydrate?.shouldRedactErrors,o=t.serializeData??e.getDefaultOptions().dehydrate?.serializeData;return{mutations:r,queries:e.getQueryCache().getAll().flatMap(e=>i(e)?[Te(e,o,a)]:[])}}function ke(e,t,n){let r=e.getMutationCache(),i=e.getQueryCache(),a=n?.defaultOptions?.deserializeData??e.getDefaultOptions().hydrate?.deserializeData;t.mutations?.forEach(({state:t,...i})=>{r.build(e,{...e.getDefaultOptions().hydrate?.mutations,...n?.defaultOptions?.mutations,...i},t)}),t.queries?.forEach(({queryKey:t,state:r,queryHash:o,meta:s,promise:c,dehydratedAt:l,queryType:u})=>{let d=c?Se(c):void 0,f=r.data===void 0?d?.data:r.data,p=f===void 0?f:a?a(f):f,m=i.get(o),h=m?.state.status===`pending`,g=m?.state.fetchStatus===`fetching`;if(m){let e=d&&l!==void 0&&l>m.state.dataUpdatedAt;if(r.dataUpdatedAt>m.state.dataUpdatedAt||e){let{fetchStatus:e,...t}=r;m.setState({...t,data:p,...r.status===`pending`&&p!==void 0&&{status:`success`,dataUpdatedAt:l??Date.now(),...!g&&{fetchStatus:`idle`}}})}}else m=i.build(e,{...e.getDefaultOptions().hydrate?.queries,...n?.defaultOptions?.queries,queryKey:t,queryHash:o,meta:s,_type:u},{...r,data:p,fetchStatus:`idle`,status:r.status===`pending`&&p!==void 0?`success`:r.status,...r.status===`pending`&&p!==void 0&&{dataUpdatedAt:l??Date.now()}});c&&!d&&!h&&!g&&(l===void 0||l>m.state.dataUpdatedAt)&&m.fetch(void 0,{initialPromise:Promise.resolve(c).then(a)}).catch(k)})}var Ae=O;function je(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=Ae,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var Me=je(),Ne=new class extends be{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Pe(e){return Math.min(1e3*2**e,3e4)}function Fe(e){return(e??`online`)!==`online`||Ne.isOnline()}var Ie=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function Le(e){return e instanceof Ie}function Re(e){let t=!1,n=0,r,i=`pending`,a,o,s=new Promise((e,t)=>{a=e,o=t});s.catch(k);let c=()=>i!==`pending`,l=t=>{if(!c()){let n=new Ie(t);h(n),e.onCancel?.(n)}},u=()=>{t=!0},d=()=>{t=!1},f=()=>xe.isFocused()&&(e.networkMode===`always`||Ne.isOnline())&&e.canRun(),p=()=>Fe(e.networkMode)&&e.canRun(),m=e=>{c()||(r?.(),i=`resolved`,a(e))},h=e=>{c()||(r?.(),i=`rejected`,o(e))},g=()=>new Promise(t=>{r=e=>{(c()||f())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,c()||e.onContinue?.()}),_=()=>{if(c())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(m).catch(r=>{if(c())return;let i=e.retry??(ve()?0:3),a=e.retryDelay??Pe,o=typeof a==`function`?a(n,r):a,s=i===!0||typeof i==`number`&&nf()?void 0:g()).then(()=>{t?h(r):_()})})};return{promise:s,status:()=>i,cancel:l,continue:()=>(r?.(),s),cancelRetry:u,continueRetry:d,canStart:p,start:()=>(p()?_():g().then(_),s)}}var ze=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),j(this.gcTime)&&(this.#e=D.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(ve()?1/0:3e5))}clearGcTimeout(){this.#e!==void 0&&(D.clearTimeout(this.#e),this.#e=void 0)}};function Be(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ge(e,()=>t.signal,()=>n=!0)},u=me(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=(()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})(),o=await u(a),{maxPages:s}=t.options,c=i?fe:de;return{pages:c(e.pages,o,s),pageParams:c(e.pageParams,r,s)}};if(i&&a.length){let e=i===`backward`,t=e?He:Ve,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:Ve(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(ct.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):l}}}function Ve(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function He(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}function Ue(e,t){return t?Ve(e,t)!=null:!1}function We(e,t){return!t||!e.getPreviousPageParam?!1:He(e,t)!=null}var Ge=class extends ze{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=Je(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=Je(this.options);e.data!==void 0&&(this.setState(qe(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=le(this.state.data,e,this.options);return this.#c({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#c({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(k).catch(k):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>M(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===pe||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0&&this.observers.some(e=>M(e.options.staleTime,this)===`static`)}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!te(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){let t=this.observers.indexOf(e);t!==-1&&(this.observers.splice(t,1),this.observers.length||(this.#a&&(this.#s||this.state.fetchStatus===`paused`&&this.state.status===`pending`?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||this.#c({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=me(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Be(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#c({type:`fetch`,meta:a.fetchOptions?.meta});let o=this.#a=Re({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof Ie&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#c({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#c({type:`pause`})},onContinue:()=>{this.#c({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await o.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof Ie){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#c({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.#a===o&&(this.#a=void 0),this.scheduleGc()}}#c(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Ke(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...qe(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),Me.batch(()=>{this.observers.slice().forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Ke(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Fe(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function qe(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function Je(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Ye=class extends be{#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p=new Set;constructor(e,t){super(),this.options=t,this.#e=e,this.#o=null,this.bindMethods(),this.setOptions(t)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),Ze(this.#t,this.options)?this.#m():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Qe(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Qe(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof M(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!I(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&$e(this.#t,n,this.options,t)&&this.#m(),this.updateResult(),r&&(this.#t!==n||M(this.options.enabled,this.#t)!==M(t.enabled,this.#t)||M(this.options.staleTime,this.#t)!==M(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||M(this.options.enabled,this.#t)!==M(t.enabled,this.#t)||i!==this.#f)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return I(this.getCurrentResult(),n)||(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),Reflect.get(e,n))})}trackProp(e){this.#p.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t),r=()=>{},i,a=new Promise(e=>{i=e,r=this.#e.getQueryCache().subscribe(i=>{i.type===`updated`&&i.query.queryHash===n.queryHash&&n.state.data!==void 0&&(r(),e(this.createResult(n,t)))})});return Promise.race([n.fetch().then(()=>{let e=this.createResult(n,t);return i?.(e),e}).finally(()=>{r()}),a])}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#m(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(k)),t}#h(e){return!ve()&&M(this.options.enabled,this.#t)!==!1&&j(e)}#g(){this.#b();let e=M(this.options.staleTime,this.#t);if(this.#r.isStale||!this.#h(e))return;let t=te(this.#r.dataUpdatedAt,e)+1;this.#u=D.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#f=e,this.#f!==0&&this.#h(this.#f)&&(this.#d=D.setInterval(()=>{(this.options.refetchIntervalInBackground||xe.isFocused())&&this.#m()},this.#f))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#u!==void 0&&(D.clearTimeout(this.#u),this.#u=void 0)}#x(){this.#d!==void 0&&(D.clearInterval(this.#d),this.#d=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&Ze(e,t),o=i&&$e(e,n,t,r);(a||o)&&(l={...l,...Ke(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#l?.state.data,this.#l):t.placeholderData,e!==void 0&&(m=`success`,d=le(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h){if(i&&d===a?.data&&t.select===this.#s)d=this.#c;else try{this.#s=t.select,d=t.select(d),d=le(i?.data,d,t),this.#c=d,this.#o=null}catch(e){this.#o=e}}else d===void 0&&(this.#o=null);this.#o&&(f=this.#o,d=this.#c,p=Date.now(),m=`error`,u=!1);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0;return{status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:et(e,t),refetch:this.refetch,isEnabled:M(t.enabled,e)!==!1}}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);if(this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#l=this.#t),I(t,e))return;this.#r=t;let n=(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#p.size)return!0;let r=new Set(n??this.#p);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})();Me.batch(()=>{n&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}};function Xe(e,t){return M(t.enabled,e)!==!1&&e.state.data===void 0&&(e.state.status!==`error`||M(t.retryOnMount,e)!==!1)}function Ze(e,t){return Xe(e,t)||e.state.data!==void 0&&Qe(e,t,t.refetchOnMount)}function Qe(e,t,n){if(M(t.enabled,e)!==!1&&M(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&et(e,t)}return!1}function $e(e,t,n,r){return(e!==t||M(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&et(e,n)}function et(e,t){return M(t.enabled,e)!==!1&&e.isStaleByTime(M(t.staleTime,e))}var tt=class extends Ye{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,r=super.createResult(e,t),{isFetching:i,isRefetching:a,isError:o,isRefetchError:s}=r,c=n.fetchMeta?.fetchMore?.direction,l=o&&c===`forward`,u=i&&c===`forward`,d=o&&c===`backward`,f=i&&c===`backward`;return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:Ue(t,n.data),hasPreviousPage:We(t,n.data),isFetchNextPageError:l,isFetchingNextPage:u,isFetchPreviousPageError:d,isFetchingPreviousPage:f,isRefetchError:s&&!l&&!d,isRefetching:a&&!u&&!f}}},nt=class extends ze{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||rt(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??(this.state.status===`pending`?this.execute(this.state.variables):Promise.resolve())}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey},r=this.#r=Re({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)}),i=this.state.status===`pending`,a=!r.canStart();try{if(i)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let o=await r.start();return await this.#n.config.onSuccess?.(o,e,this.state.context,this,n),await this.options.onSuccess?.(o,e,this.state.context,n),await this.#n.config.onSettled?.(o,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(o,null,e,this.state.context,n),this.#i({type:`success`,data:o}),o}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#r===r&&(this.#r=void 0),this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),Me.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function rt(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var it=class extends be{#e;#t;#n;constructor(e={}){super(),this.config=e,this.#e=new Set,this.#t=new Map,this.#n=0}build(e,t,n){let r=new nt({client:e,mutationCache:this,mutationId:++this.#n,options:e.defaultMutationOptions(t),state:n});return this.add(r),r}add(e){this.#e.add(e);let t=at(e);if(typeof t==`string`){let n=this.#t.get(t);n?n.push(e):this.#t.set(t,[e])}this.notify({type:`added`,mutation:e})}remove(e){if(this.#e.delete(e)){let t=at(e);if(typeof t==`string`){let n=this.#t.get(t);if(n){if(n.length>1){let t=n.indexOf(e);t!==-1&&n.splice(t,1)}else n[0]===e&&this.#t.delete(t)}}}this.notify({type:`removed`,mutation:e})}canRun(e){let t=at(e);if(typeof t==`string`){let n=this.#t.get(t)?.find(e=>e.state.status===`pending`);return!n||n===e}return!0}runNext(e){let t=at(e);return typeof t==`string`?(this.#t.get(t)?.find(t=>t!==e&&t.state.isPaused))?.continue()??Promise.resolve():Promise.resolve()}clear(){Me.batch(()=>{this.#e.forEach(e=>{this.notify({type:`removed`,mutation:e})}),this.#e.clear(),this.#t.clear()})}getAll(){return Array.from(this.#e)}find(e){let t={exact:!0,...e};return this.getAll().find(e=>N(t,e))}findAll(e={}){return this.getAll().filter(t=>N(e,t))}notify(e){Me.batch(()=>{this.listeners.forEach(t=>{t(e)})})}resumePausedMutations(){let e=this.getAll().filter(e=>e.state.isPaused);return Me.batch(()=>Promise.all(e.map(e=>e.continue().catch(k))))}};function at(e){return e.options.scope?.id}var ot=class extends be{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),I(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&re(t.mutationKey)!==re(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??rt();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){Me.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}};function st(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}var ct=class extends be{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,Me.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!I(e,n)});(o||s)&&(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(st(e,n).forEach(e=>{e.destroy()}),st(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){let n=new Set;return t.map((r,i)=>{let a=e[i];return r.defaultedQueryOptions.notifyOnChangeProps?a:r.observer.trackResult(a,e=>{n.has(e)||(n.add(e),t.forEach(t=>{t.observer.trackProp(e)}))})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=F(this.#a,t(e))),this.#a}return e}#f(){return!this.#r?.combine||this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let n=[];return e.forEach(e=>{let r=this.#e.defaultQueryOptions(e),i=t.get(r.queryHash)?.shift()??new Ye(this.#e,r);n.push({defaultedQueryOptions:r,observer:i})}),n}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=this.#t.slice(),this.#t[n]=t,this.#h())}#h(){if(this.hasListeners()){let e=this.#f(),t=this.#a,n=e?t:this.#d(this.#u(this.#t,this.#l),this.#r?.combine);(e||t!==n)&&Me.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},lt=class extends be{#e;constructor(e={}){super(),this.config=e,this.#e=new Map}build(e,t,n){let r=t.queryKey,i=t.queryHash??P(r,t),a=this.get(i);return a||(a=new Ge({client:e,queryKey:r,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(r)}),this.add(a)),a}add(e){this.#e.has(e.queryHash)||(this.#e.set(e.queryHash,e),this.notify({type:`added`,query:e}))}remove(e){let t=this.#e.get(e.queryHash);t&&(e.destroy(),t===e&&this.#e.delete(e.queryHash),this.notify({type:`removed`,query:e}))}clear(){Me.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return this.#e.get(e)}getAll(){return[...this.#e.values()]}find(e){let t={exact:!0,...e};return this.getAll().find(e=>ne(t,e))}findAll(e={}){let t=this.getAll();return Object.keys(e).length>0?t.filter(t=>ne(e,t)):t}notify(e){Me.batch(()=>{this.listeners.forEach(t=>{t(e)})})}onFocus(){Me.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){Me.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},ut=class{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e={}){this.#e=e.queryCache||new lt,this.#t=e.mutationCache||new it,this.#n=e.defaultOptions||{},this.#r=new Map,this.#i=new Map,this.#a=0}mount(){this.#a++,this.#a===1&&(this.#o=xe.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onFocus())}),this.#s=Ne.subscribe(async e=>{e&&(await this.resumePausedMutations(),this.#e.onOnline())}))}unmount(){this.#a--,this.#a===0&&(this.#o?.(),this.#o=void 0,this.#s?.(),this.#s=void 0)}isFetching(e){return this.#e.findAll({...e,fetchStatus:`fetching`}).length}isMutating(e){return this.#t.findAll({...e,status:`pending`}).length}getQueryData(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state.data}ensureQueryData(e){let t=this.defaultQueryOptions(e),n=this.#e.build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(M(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return this.#e.findAll(e).map(({queryKey:e,state:t})=>[e,t.data])}setQueryData(e,t,n){let r=this.defaultQueryOptions({queryKey:e}),i=this.#e.get(r.queryHash)?.state.data,a=A(t,i);if(a!==void 0)return this.#e.build(this,r).setData(a,{...n,manual:!0})}setQueriesData(e,t,n){return Me.batch(()=>this.#e.findAll(e).map(({queryKey:e})=>[e,this.setQueryData(e,t,n)]))}getQueryState(e){let t=this.defaultQueryOptions({queryKey:e});return this.#e.get(t.queryHash)?.state}removeQueries(e){let t=this.#e;Me.batch(()=>{t.findAll(e).forEach(e=>{t.remove(e)})})}resetQueries(e,t){let n=this.#e;return Me.batch(()=>{let r=n.findAll(e),i=new Set(r);return r.forEach(e=>{e.reset()}),this.refetchQueries({type:`active`,predicate:e=>i.has(e)},t)})}cancelQueries(e,t={}){let n={revert:!0,...t},r=Me.batch(()=>this.#e.findAll(e).map(e=>e.cancel(n)));return Promise.all(r).then(k).catch(k)}invalidateQueries(e,t={}){return Me.batch(()=>(this.#e.findAll(e).forEach(e=>{e.invalidate()}),e?.refetchType===`none`?Promise.resolve():this.refetchQueries({...e,type:e?.refetchType??e?.type??`active`},t)))}refetchQueries(e,t={}){let n={...t,cancelRefetch:t.cancelRefetch??!0},r=Me.batch(()=>this.#e.findAll(e).filter(e=>!e.isDisabled()&&!e.isStatic()).map(e=>{let t=e.fetch(void 0,n);return n.throwOnError||(t=t.catch(k)),e.state.fetchStatus===`paused`?Promise.resolve():t}));return Promise.all(r).then(k)}async query(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t),r=n.isStaleByTime(M(t.staleTime,n))?await n.fetch(t):n.state.data,i=t.select;return i?i(r):r}fetchQuery(e){let t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);let n=this.#e.build(this,t);return n.isStaleByTime(M(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(k).catch(k)}infiniteQuery(e){return e._type=`infinite`,this.query(e)}fetchInfiniteQuery(e){return e._type=`infinite`,this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(k).catch(k)}ensureInfiniteQueryData(e){return e._type=`infinite`,this.ensureQueryData(e)}resumePausedMutations(){return Ne.isOnline()?this.#t.resumePausedMutations():Promise.resolve()}getQueryCache(){return this.#e}getMutationCache(){return this.#t}getDefaultOptions(){return this.#n}setDefaultOptions(e){this.#n=e}setQueryDefaults(e,t){this.#r.set(re(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){let t=[...this.#r.values()],n={};return t.forEach(t=>{ie(e,t.queryKey)&&Object.assign(n,t.defaultOptions)}),n}setMutationDefaults(e,t){this.#i.set(re(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){let t=[...this.#i.values()],n={};return t.forEach(t=>{ie(e,t.mutationKey)&&Object.assign(n,t.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;let t={...this.#n.queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||=P(t.queryKey,t),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!==`always`),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode=`offlineFirst`),t.queryFn===pe&&(t.enabled=!1),t}defaultMutationOptions(e){return e?._defaulted?e:{...this.#n.mutations,...e?.mutationKey&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){this.#e.clear(),this.#t.clear()}};function dt({streamFn:e,refetchMode:t=`reset`,reducer:n=(e,t)=>de(e,t),initialValue:r=[]}){return async i=>{let a=i.client.getQueryCache().find({queryKey:i.queryKey,exact:!0}),o=!!a&&a.isFetched();o&&t===`reset`&&a.setState({...a.resetState,fetchStatus:`fetching`});let s=r,c=!1,l=await e(ge({client:i.client,meta:i.meta,queryKey:i.queryKey,pageParam:i.pageParam,direction:i.direction},()=>i.signal,()=>c=!0)),u=o&&t===`replace`;for await(let e of l){if(c)break;u?s=n(s,e):i.client.setQueryData(i.queryKey,t=>n(t===void 0?r:t,e))}return u&&!c&&i.client.setQueryData(i.queryKey,s),i.client.getQueryData(i.queryKey)??r}}var ft=Symbol(),pt=Symbol(),mt=Symbol(),ht=({children:e,options:t={},state:n,queryClient:r})=>{let i=w(r),a=x.useRef(t);x.useEffect(()=>{a.current=t});let o=x.useMemo(()=>{if(n){if(typeof n!=`object`)return;let e=i.getQueryCache(),t=n.queries||[],r=[],o=[];for(let n of t){let t=e.get(n.queryHash);t?(n.state.dataUpdatedAt>t.state.dataUpdatedAt||n.promise&&t.state.status!==`pending`&&t.state.fetchStatus!==`fetching`&&n.dehydratedAt!==void 0&&n.dehydratedAt>t.state.dataUpdatedAt)&&o.push(n):r.push(n)}if(r.length>0&&ke(i,{queries:r},a.current),o.length>0)return o}},[i,n]);return x.useEffect(()=>{o&&ke(i,{queries:o},a.current)},[i,o]),e},gt=x.createContext(!1),_t=()=>x.useContext(gt),vt=gt.Provider;function yt(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var bt=x.createContext(yt()),xt=()=>x.useContext(bt),St=({children:e})=>{let[t]=x.useState(()=>yt());return(0,S.jsx)(bt.Provider,{value:t,children:typeof e==`function`?e(t):e})},Ct=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?he(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||r)&&(t.isReset()||(e.retryOnMount=!1))},wt=e=>{x.useEffect(()=>{e.clearReset()},[e])},Tt=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||he(n,[e.error,r])),Et=(e,t)=>t.state.data===void 0,Dt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},Ot=(e,t)=>e?.suspense&&t.isPending,kt=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function At({queries:e,...t},n){let r=w(n),i=_t(),a=xt(),o=t.subscribed!==!1,s=x.useMemo(()=>e.map(e=>{let t=r.defaultQueryOptions(e);return t._optimisticResults=i?`isRestoring`:o?`optimistic`:void 0,t}),[e,r,i,o]);s.forEach(e=>{Dt(e);let t=r.getQueryCache().get(e.queryHash);Ct(e,a,t)}),wt(a);let[c]=x.useState(()=>new ct(r,s,t)),[l,u,d]=c.getOptimisticResult(s,t.combine),f=!i&&o;x.useSyncExternalStore(x.useCallback(e=>f?c.subscribe(Me.batchCalls(e)):k,[c,f]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),x.useEffect(()=>{c.setQueries(s,t)},[s,t,c]);let p=l.some((e,t)=>Ot(s[t],e))?l.flatMap((e,t)=>{let n=s[t];return n&&Ot(n,e)?kt(n,new Ye(r,n),a):[]}):[];if(p.length>0)throw Promise.all(p);let m=l.find((e,t)=>{let n=s[t];return n&&Tt({result:e,errorResetBoundary:a,throwOnError:n.throwOnError,query:r.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(m)throw m.error;return u(d())}function jt(e,t,n){let r=_t(),i=xt(),a=w(n),o=a.defaultQueryOptions(e),s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,Dt(o),Ct(o,i,s),wt(i);let[l]=x.useState(()=>new t(a,o)),u=l.getOptimisticResult(o),d=!r&&c;if(x.useSyncExternalStore(x.useCallback(e=>{let t=d?l.subscribe(Me.batchCalls(e)):k;return l.updateResult(),t},[l,d]),()=>l.getCurrentResult(),()=>l.getCurrentResult()),x.useEffect(()=>{l.setOptions(o)},[o,l]),Ot(o,u))throw kt(o,l,i);if(Tt({result:u,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw u.error;return o.notifyOnChangeProps?u:l.trackResult(u)}function Mt(e,t){return jt(e,Ye,t)}function Nt(e,t){return jt({...e,enabled:!0,suspense:!0,throwOnError:Et,placeholderData:void 0},Ye,t)}function Pt(e,t){return jt({...e,enabled:!0,suspense:!0,throwOnError:Et,placeholderData:void 0},tt,t)}function Ft(e,t){return At({...e,queries:e.queries.map(e=>({...e,suspense:!0,throwOnError:Et,enabled:!0,placeholderData:void 0}))},t)}function It(e,t){let n=w(t);n.getQueryState(e.queryKey)||n.query(e).catch(k)}function Lt(e,t){let n=w(t);n.getQueryState(e.queryKey)||n.infiniteQuery(e).catch(k)}function Rt(e){return e}function zt(e){return e}function Bt(e,t){let n=w(t),r=n.getQueryCache();return x.useSyncExternalStore(x.useCallback(e=>r.subscribe(Me.batchCalls(e)),[r]),()=>n.isFetching(e),()=>n.isFetching(e))}function Vt(e,t){let n=w(t);return Ut({filters:{...e,status:`pending`}},n).length}function Ht(e,t){return e.findAll(t.filters).map(e=>t.select?t.select(e):e.state)}function Ut(e={},t){let n=w(t).getMutationCache(),r=x.useRef(e),i=x.useRef(null);return i.current===null&&(i.current=Ht(n,e)),x.useEffect(()=>{r.current=e}),x.useSyncExternalStore(x.useCallback(e=>n.subscribe(()=>{let t=F(i.current,Ht(n,r.current));i.current!==t&&(i.current=t,Me.schedule(e))}),[n]),()=>i.current,()=>i.current)}function Wt(e,t){let n=w(t),[r]=x.useState(()=>new ot(n,e));x.useEffect(()=>{r.setOptions(e)},[r,e]);let i=x.useSyncExternalStore(x.useCallback(e=>r.subscribe(Me.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=x.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(k)},[r]);if(i.error&&he(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}function Gt(e){return e}function Kt(e,t){return jt(e,tt,t)}var qt=s({CancelledError:()=>Ie,HydrationBoundary:()=>ht,InfiniteQueryObserver:()=>tt,IsRestoringProvider:()=>vt,Mutation:()=>nt,MutationCache:()=>it,MutationObserver:()=>ot,QueriesObserver:()=>ct,Query:()=>Ge,QueryCache:()=>lt,QueryClient:()=>ut,QueryClientContext:()=>C,QueryClientProvider:()=>T,QueryErrorResetBoundary:()=>St,QueryObserver:()=>Ye,dataTagErrorSymbol:()=>pt,dataTagSymbol:()=>ft,defaultScheduler:()=>Ae,defaultShouldDehydrateMutation:()=>Ee,defaultShouldDehydrateQuery:()=>De,dehydrate:()=>Oe,dehydrateQuery:()=>Te,environmentManager:()=>ye,experimental_streamedQuery:()=>dt,focusManager:()=>xe,hashKey:()=>re,hydrate:()=>ke,infiniteQueryOptions:()=>zt,isCancelledError:()=>Le,isServer:()=>ee,keepPreviousData:()=>ue,matchMutation:()=>N,matchQuery:()=>ne,mutationOptions:()=>Gt,noop:()=>k,notifyManager:()=>Me,onlineManager:()=>Ne,partialMatchKey:()=>ie,queryOptions:()=>Rt,replaceEqualDeep:()=>F,shouldThrowError:()=>he,skipToken:()=>pe,timeoutManager:()=>D,unsetMarker:()=>mt,useInfiniteQuery:()=>Kt,useIsFetching:()=>Bt,useIsMutating:()=>Vt,useIsRestoring:()=>_t,useMutation:()=>Wt,useMutationState:()=>Ut,usePrefetchInfiniteQuery:()=>Lt,usePrefetchQuery:()=>It,useQueries:()=>At,useQuery:()=>Mt,useQueryClient:()=>w,useQueryErrorResetBoundary:()=>xt,useSuspenseInfiniteQuery:()=>Pt,useSuspenseQueries:()=>Ft,useSuspenseQuery:()=>Nt}),Jt=class extends Error{code;status;constructor(e,t){super(e),this.code=e,this.status=t}},Yt=new ut({defaultOptions:{queries:{retry:!1,refetchOnWindowFocus:!0,staleTime:1e3},mutations:{retry:!1}}}),Xt=null,Zt=`dispatch-dsp-view`,Qt=sessionStorage.getItem(Zt);function $t(e){Qt=e,e?sessionStorage.setItem(Zt,e):sessionStorage.removeItem(Zt),Yt.clear(),an.clear()}function en(e){return JSON.stringify([e?.authenticated,e?.user?.id,e?.activeOrganizationId,e?.dspView?.viewRef,e?.platformPermissions,e?.memberships?.map(e=>[e.id,e.permissions,e.organization.status])])}function tn(e){en(Xt)!==en(e)&&(Yt.clear(),an.clear(),window.dispatchEvent(new Event(`dispatch-authority-changed`))),Xt=e}async function nn(e,t={}){let n=Qt;if(Xt?.dspView&&!n&&e!==`/api/auth/session`)throw new Jt(`dsp_view_changed`,409);let r=await fetch(e,{credentials:`same-origin`,...t,headers:{Accept:`application/json`,...t.body===void 0?{}:{"Content-Type":`application/json`},...t.headers,...n?{"X-Dispatch-DSP-View":n}:{}}}),i=await r.json().catch(()=>null);if(n!==Qt)throw new Jt(`dsp_view_changed`,409);if(!r.ok||!i?.ok)throw i?.error?.code===`dsp_view_unavailable`&&n&&($t(null),e!==`/api/auth/session`&&window.dispatchEvent(new Event(`dispatch-dsp-view-ended`))),r.status===401&&Xt?.authenticated&&($t(null),tn(null),window.dispatchEvent(new Event(`dispatch-session-expired`))),new Jt(i?.error?.code||`request_failed`,r.status);return i.data}function rn(e,t,n,r={}){return nn(e,{signal:r.signal,method:t,headers:Xt?.authenticated?{"X-Dispatch-CSRF":Xt.csrfToken}:{},body:JSON.stringify(n)})}var an=new Map;function on(e,t=e){return an.has(e)||an.set(e,`dashboard:${t}:${crypto.randomUUID()}`),an.get(e)}function sn(e,t=null){(t===null||t instanceof Jt&&t.status&&t.status>=400&&t.status<500)&&an.delete(e)}async function cn(e,t,n){try{let r=await rn(t,`POST`,{...n,idempotencyKey:on(e,`request`)});return sn(e),r}catch(t){throw sn(e,t),t}}var ln=(e,t)=>!!e?.permissions.includes(t),un=e=>!e.dspView&&!!e.platformPermissions?.includes(`platform.organizations.read`),dn=e=>un(e)?null:e.memberships?.find(t=>t.organizationId===e.activeOrganizationId)||null,fn=e=>{let t=dn(e);return t?.roleKey===`owner`&&ln(t,`organization.owner`)},pn=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),mn=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),hn=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),gn=e=>{let t=hn(e);return t.charAt(0).toUpperCase()+t.slice(1)},_n={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},vn=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},yn=(0,x.createContext)({}),bn=()=>(0,x.useContext)(yn),xn=(0,x.forwardRef)(({color:e,size:t,strokeWidth:n,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>{let{size:l=24,strokeWidth:u=2,absoluteStrokeWidth:d=!1,color:f=`currentColor`,className:p=``}=bn()??{},m=r??d?Number(n??u)*24/Number(t??l):n??u;return(0,x.createElement)(`svg`,{ref:c,..._n,width:t??l??_n.width,height:t??l??_n.height,stroke:e??f,strokeWidth:m,className:pn(`lucide`,p,i),...!a&&!vn(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,x.createElement)(e,t)),...Array.isArray(a)?a:[a]])}),R=(e,t)=>{let n=(0,x.forwardRef)(({className:n,...r},i)=>(0,x.createElement)(xn,{ref:i,iconNode:t,className:pn(`lucide-${mn(gn(e))}`,`lucide-${e}`,n),...r}));return n.displayName=gn(e),n},Sn=R(`arrow-up-from-line`,[[`path`,{d:`m18 9-6-6-6 6`,key:`kcunyi`}],[`path`,{d:`M12 3v14`,key:`7cf3v8`}],[`path`,{d:`M5 21h14`,key:`11awu3`}]]),Cn=R(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),wn=R(`building-2`,[[`path`,{d:`M10 12h4`,key:`a56b0p`}],[`path`,{d:`M10 8h4`,key:`1sr2af`}],[`path`,{d:`M14 21v-3a2 2 0 0 0-4 0v3`,key:`1rgiei`}],[`path`,{d:`M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2`,key:`secmi2`}],[`path`,{d:`M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16`,key:`16ra0t`}]]),Tn=R(`calendar-days`,[[`path`,{d:`M8 2v3`,key:`1ioesn`}],[`path`,{d:`M16 2v3`,key:`otl347`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M8 13h.01`,key:`1sbv64`}],[`path`,{d:`M12 13h.01`,key:`y0uutt`}],[`path`,{d:`M16 13h.01`,key:`wip0gl`}],[`path`,{d:`M8 17h.01`,key:`p3bg7i`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}],[`path`,{d:`M16 17h.01`,key:`ql8jdd`}]]),En=R(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),Dn=R(`circle-arrow-up`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m16 12-4-4-4 4`,key:`177agl`}],[`path`,{d:`M12 16V8`,key:`1sbj14`}]]),On=R(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),kn=R(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]),An=R(`eye`,[[`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`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),jn=R(`flask-conical`,[[`path`,{d:`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2`,key:`18mbvz`}],[`path`,{d:`M6.453 15h11.094`,key:`3shlmq`}],[`path`,{d:`M8.5 2h7`,key:`csnxdl`}]]),Mn=R(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),Nn=R(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),Pn=R(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),Fn=R(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),In=R(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),Ln=R(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),Rn=R(`plug`,[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]),zn=R(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Bn=R(`puzzle`,[[`path`,{d:`M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z`,key:`w46dr5`}]]),Vn=R(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),Hn=R(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),Un=R(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),Wn=R(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Gn=R(`shield-check`,[[`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`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),Kn=R(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),qn=R(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function Jn(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;ttypeof e==`boolean`?`${e}`:e===0?`0`:e,Zn=Yn,Qn=(e,t)=>n=>{if(t?.variants==null)return Zn(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let o=Xn(t)||Xn(a);return r[e][o]}),o=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return Zn(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...o}[t]):{...i,...o}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)},$n=(e,t)=>{let n=Array(e.length+t.length);for(let t=0;t({classGroupId:e,validator:t}),tr=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),nr=`-`,rr=[],ir=`arbitrary..`,ar=e=>{let t=cr(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return sr(e);let n=e.split(nr);return or(n,+(n[0]===``&&n.length>1),t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?$n(i,t):t:i||rr}return n[e]||rr}}},or=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=or(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(nr):e.slice(t).join(nr),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?ir+r:void 0})(),cr=e=>{let{theme:t,classGroups:n}=e;return lr(n,t)},lr=(e,t)=>{let n=tr();for(let r in e){let i=e[r];ur(i,n,r,t)}return n},ur=(e,t,n,r)=>{let i=e.length;for(let a=0;a{if(typeof e==`string`){fr(e,t,n);return}if(typeof e==`function`){pr(e,t,n,r);return}mr(e,t,n,r)},fr=(e,t,n)=>{let r=e===``?t:hr(t,e);r.classGroupId=n},pr=(e,t,n,r)=>{if(gr(e)){ur(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(er(n,e))},mr=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e{let n=e,r=t.split(nr),i=r.length;for(let e=0;e`isThemeGetter`in e&&e.isThemeGetter===!0,_r=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)}}},vr=`!`,yr=`:`,br=[],xr=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),Sr=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 xr(t,l,c,u)};if(t){let e=t+yr,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):xr(br,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},Cr=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}},wr=e=>({cache:_r(e.cacheSize),parseClassName:Sr(e),sortModifiers:Cr(e),postfixLookupClassGroupIds:Tr(e),...ar(e)}),Tr=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(Er),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?_+vr:_,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},Or=(...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=wr(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=Dr(e,n);return i(e,a),a};return a=o,(...e)=>a(Or(...e))},jr=[],Mr=e=>{let t=t=>t[e]||jr;return t.isThemeGetter=!0,t},Nr=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Pr=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Fr=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,Ir=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Lr=/\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$/,Rr=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,zr=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Br=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Vr=e=>Fr.test(e),z=e=>!!e&&!Number.isNaN(Number(e)),Hr=e=>!!e&&Number.isInteger(Number(e)),Ur=e=>e.endsWith(`%`)&&z(e.slice(0,-1)),Wr=e=>Ir.test(e),Gr=()=>!0,Kr=e=>Lr.test(e)&&!Rr.test(e),qr=()=>!1,Jr=e=>zr.test(e),Yr=e=>Br.test(e),Xr=e=>!B(e)&&!V(e),Zr=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)),Qr=e=>pi(e,_i,qr),B=e=>Nr.test(e),$r=e=>pi(e,vi,Kr),ei=e=>pi(e,yi,z),ti=e=>pi(e,xi,Gr),ni=e=>pi(e,bi,qr),ri=e=>pi(e,hi,qr),ii=e=>pi(e,gi,Yr),ai=e=>pi(e,Si,Jr),V=e=>Pr.test(e),oi=e=>mi(e,vi),si=e=>mi(e,bi),ci=e=>mi(e,hi),li=e=>mi(e,_i),ui=e=>mi(e,gi),di=e=>mi(e,Si,!0),fi=e=>mi(e,xi,!0),pi=(e,t,n)=>{let r=Nr.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},mi=(e,t,n=!1)=>{let r=Pr.exec(e);return r?r[1]?t(r[1]):n:!1},hi=e=>e===`position`||e===`percentage`,gi=e=>e===`image`||e===`url`,_i=e=>e===`length`||e===`size`||e===`bg-size`,vi=e=>e===`length`,yi=e=>e===`number`,bi=e=>e===`family-name`,xi=e=>e===`number`||e===`weight`,Si=e=>e===`shadow`,Ci=Ar(()=>{let e=Mr(`color`),t=Mr(`font`),n=Mr(`text`),r=Mr(`font-weight`),i=Mr(`tracking`),a=Mr(`leading`),o=Mr(`breakpoint`),s=Mr(`container`),c=Mr(`spacing`),l=Mr(`radius`),u=Mr(`shadow`),d=Mr(`inset-shadow`),f=Mr(`text-shadow`),p=Mr(`drop-shadow`),m=Mr(`blur`),h=Mr(`perspective`),g=Mr(`aspect`),_=Mr(`ease`),v=Mr(`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(),V,B],S=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],C=()=>[`auto`,`contain`,`none`],w=()=>[V,B,c],T=()=>[Vr,`full`,`auto`,...w()],E=()=>[Hr,`none`,`subgrid`,V,B],D=()=>[`auto`,{span:[`full`,Hr,V,B]},Hr,V,B],O=()=>[Hr,`auto`,V,B],ee=()=>[`auto`,`min`,`max`,`fr`,V,B],k=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],A=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],j=()=>[`auto`,...w()],te=()=>[Vr,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...w()],M=()=>[Vr,`screen`,`full`,`dvw`,`lvw`,`svw`,`min`,`max`,`fit`,...w()],ne=()=>[Vr,`screen`,`full`,`lh`,`dvh`,`lvh`,`svh`,`min`,`max`,`fit`,...w()],N=()=>[e,V,B],P=()=>[...b(),ci,ri,{position:[V,B]}],re=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],ie=()=>[`auto`,`cover`,`contain`,li,Qr,{size:[V,B]}],ae=()=>[Ur,oi,$r],F=()=>[``,`none`,`full`,l,V,B],I=()=>[``,z,oi,$r],L=()=>[`solid`,`dashed`,`dotted`,`double`],oe=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],se=()=>[z,Ur,ci,ri],ce=()=>[``,`none`,m,V,B],le=()=>[`none`,z,V,B],ue=()=>[`none`,z,V,B],de=()=>[z,V,B],fe=()=>[Vr,`full`,...w()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[Wr],breakpoint:[Wr],color:[Gr],container:[Wr],"drop-shadow":[Wr],ease:[`in`,`out`,`in-out`],font:[Xr],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[Wr],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[Wr],shadow:[Wr],spacing:[`px`,z],text:[Wr],"text-shadow":[Wr],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,Vr,B,V,g]}],container:[`container`],"container-type":[{"@container":[``,`normal`,`size`,V,B]}],"container-named":[Zr],columns:[{columns:[z,B,V,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:[Hr,`auto`,V,B]}],basis:[{basis:[Vr,`full`,`auto`,s,...w()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[z,Vr,`auto`,`initial`,`none`,B]}],grow:[{grow:[``,z,V,B]}],shrink:[{shrink:[``,z,V,B]}],order:[{order:[Hr,`first`,`last`,`none`,V,B]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:D()}],"col-start":[{"col-start":O()}],"col-end":[{"col-end":O()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:D()}],"row-start":[{"row-start":O()}],"row-end":[{"row-end":O()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":ee()}],"auto-rows":[{"auto-rows":ee()}],gap:[{gap:w()}],"gap-x":[{"gap-x":w()}],"gap-y":[{"gap-y":w()}],"justify-content":[{justify:[...k(),`normal`]}],"justify-items":[{"justify-items":[...A(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...A()]}],"align-content":[{content:[`normal`,...k()]}],"align-items":[{items:[...A(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...A(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":k()}],"place-items":[{"place-items":[...A(),`baseline`]}],"place-self":[{"place-self":[`auto`,...A()]}],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:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mbs:[{mbs:j()}],mbe:[{mbe:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":w()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":w()}],"space-y-reverse":[`space-y-reverse`],size:[{size:te()}],"inline-size":[{inline:[`auto`,...M()]}],"min-inline-size":[{"min-inline":[`auto`,...M()]}],"max-inline-size":[{"max-inline":[`none`,...M()]}],"block-size":[{block:[`auto`,...ne()]}],"min-block-size":[{"min-block":[`auto`,...ne()]}],"max-block-size":[{"max-block":[`none`,...ne()]}],w:[{w:[s,`screen`,...te()]}],"min-w":[{"min-w":[s,`screen`,`none`,...te()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...te()]}],h:[{h:[`screen`,`lh`,...te()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...te()]}],"max-h":[{"max-h":[`screen`,`lh`,...te()]}],"font-size":[{text:[`base`,n,oi,$r]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,fi,ti]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,Ur,B]}],"font-family":[{font:[si,ni,t]}],"font-features":[{"font-features":[B]}],"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,V,B]}],"line-clamp":[{"line-clamp":[z,`none`,V,ei]}],leading:[{leading:[a,...w()]}],"list-image":[{"list-image":[`none`,V,B]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,V,B]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:N()}],"text-color":[{text:N()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...L(),`wavy`]}],"text-decoration-thickness":[{decoration:[z,`from-font`,`auto`,V,$r]}],"text-decoration-color":[{decoration:N()}],"underline-offset":[{"underline-offset":[z,`auto`,V,B]}],"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:[Hr,V,B]}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,V,B]}],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`,V,B]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:P()}],"bg-repeat":[{bg:re()}],"bg-size":[{bg:ie()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},Hr,V,B],radial:[``,V,B],conic:[Hr,V,B]},ui,ii]}],"bg-color":[{bg:N()}],"gradient-from-pos":[{from:ae()}],"gradient-via-pos":[{via:ae()}],"gradient-to-pos":[{to:ae()}],"gradient-from":[{from:N()}],"gradient-via":[{via:N()}],"gradient-to":[{to:N()}],rounded:[{rounded:F()}],"rounded-s":[{"rounded-s":F()}],"rounded-e":[{"rounded-e":F()}],"rounded-t":[{"rounded-t":F()}],"rounded-r":[{"rounded-r":F()}],"rounded-b":[{"rounded-b":F()}],"rounded-l":[{"rounded-l":F()}],"rounded-ss":[{"rounded-ss":F()}],"rounded-se":[{"rounded-se":F()}],"rounded-ee":[{"rounded-ee":F()}],"rounded-es":[{"rounded-es":F()}],"rounded-tl":[{"rounded-tl":F()}],"rounded-tr":[{"rounded-tr":F()}],"rounded-br":[{"rounded-br":F()}],"rounded-bl":[{"rounded-bl":F()}],"border-w":[{border:I()}],"border-w-x":[{"border-x":I()}],"border-w-y":[{"border-y":I()}],"border-w-s":[{"border-s":I()}],"border-w-e":[{"border-e":I()}],"border-w-bs":[{"border-bs":I()}],"border-w-be":[{"border-be":I()}],"border-w-t":[{"border-t":I()}],"border-w-r":[{"border-r":I()}],"border-w-b":[{"border-b":I()}],"border-w-l":[{"border-l":I()}],"divide-x":[{"divide-x":I()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":I()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...L(),`hidden`,`none`]}],"divide-style":[{divide:[...L(),`hidden`,`none`]}],"border-color":[{border:N()}],"border-color-x":[{"border-x":N()}],"border-color-y":[{"border-y":N()}],"border-color-s":[{"border-s":N()}],"border-color-e":[{"border-e":N()}],"border-color-bs":[{"border-bs":N()}],"border-color-be":[{"border-be":N()}],"border-color-t":[{"border-t":N()}],"border-color-r":[{"border-r":N()}],"border-color-b":[{"border-b":N()}],"border-color-l":[{"border-l":N()}],"divide-color":[{divide:N()}],"outline-style":[{outline:[...L(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[z,V,B]}],"outline-w":[{outline:[``,z,oi,$r]}],"outline-color":[{outline:N()}],shadow:[{shadow:[``,`none`,u,di,ai]}],"shadow-color":[{shadow:N()}],"inset-shadow":[{"inset-shadow":[`none`,d,di,ai]}],"inset-shadow-color":[{"inset-shadow":N()}],"ring-w":[{ring:I()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:N()}],"ring-offset-w":[{"ring-offset":[z,$r]}],"ring-offset-color":[{"ring-offset":N()}],"inset-ring-w":[{"inset-ring":I()}],"inset-ring-color":[{"inset-ring":N()}],"text-shadow":[{"text-shadow":[`none`,f,di,ai]}],"text-shadow-color":[{"text-shadow":N()}],opacity:[{opacity:[z,V,B]}],"mix-blend":[{"mix-blend":[...oe(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":oe()}],"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":[z]}],"mask-image-linear-from-pos":[{"mask-linear-from":se()}],"mask-image-linear-to-pos":[{"mask-linear-to":se()}],"mask-image-linear-from-color":[{"mask-linear-from":N()}],"mask-image-linear-to-color":[{"mask-linear-to":N()}],"mask-image-t-from-pos":[{"mask-t-from":se()}],"mask-image-t-to-pos":[{"mask-t-to":se()}],"mask-image-t-from-color":[{"mask-t-from":N()}],"mask-image-t-to-color":[{"mask-t-to":N()}],"mask-image-r-from-pos":[{"mask-r-from":se()}],"mask-image-r-to-pos":[{"mask-r-to":se()}],"mask-image-r-from-color":[{"mask-r-from":N()}],"mask-image-r-to-color":[{"mask-r-to":N()}],"mask-image-b-from-pos":[{"mask-b-from":se()}],"mask-image-b-to-pos":[{"mask-b-to":se()}],"mask-image-b-from-color":[{"mask-b-from":N()}],"mask-image-b-to-color":[{"mask-b-to":N()}],"mask-image-l-from-pos":[{"mask-l-from":se()}],"mask-image-l-to-pos":[{"mask-l-to":se()}],"mask-image-l-from-color":[{"mask-l-from":N()}],"mask-image-l-to-color":[{"mask-l-to":N()}],"mask-image-x-from-pos":[{"mask-x-from":se()}],"mask-image-x-to-pos":[{"mask-x-to":se()}],"mask-image-x-from-color":[{"mask-x-from":N()}],"mask-image-x-to-color":[{"mask-x-to":N()}],"mask-image-y-from-pos":[{"mask-y-from":se()}],"mask-image-y-to-pos":[{"mask-y-to":se()}],"mask-image-y-from-color":[{"mask-y-from":N()}],"mask-image-y-to-color":[{"mask-y-to":N()}],"mask-image-radial":[{"mask-radial":[V,B]}],"mask-image-radial-from-pos":[{"mask-radial-from":se()}],"mask-image-radial-to-pos":[{"mask-radial-to":se()}],"mask-image-radial-from-color":[{"mask-radial-from":N()}],"mask-image-radial-to-color":[{"mask-radial-to":N()}],"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":[z]}],"mask-image-conic-from-pos":[{"mask-conic-from":se()}],"mask-image-conic-to-pos":[{"mask-conic-to":se()}],"mask-image-conic-from-color":[{"mask-conic-from":N()}],"mask-image-conic-to-color":[{"mask-conic-to":N()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:P()}],"mask-repeat":[{mask:re()}],"mask-size":[{mask:ie()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,V,B]}],filter:[{filter:[``,`none`,V,B]}],blur:[{blur:ce()}],brightness:[{brightness:[z,V,B]}],contrast:[{contrast:[z,V,B]}],"drop-shadow":[{"drop-shadow":[``,`none`,p,di,ai]}],"drop-shadow-color":[{"drop-shadow":N()}],grayscale:[{grayscale:[``,z,V,B]}],"hue-rotate":[{"hue-rotate":[z,V,B]}],invert:[{invert:[``,z,V,B]}],saturate:[{saturate:[z,V,B]}],sepia:[{sepia:[``,z,V,B]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,V,B]}],"backdrop-blur":[{"backdrop-blur":ce()}],"backdrop-brightness":[{"backdrop-brightness":[z,V,B]}],"backdrop-contrast":[{"backdrop-contrast":[z,V,B]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,z,V,B]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[z,V,B]}],"backdrop-invert":[{"backdrop-invert":[``,z,V,B]}],"backdrop-opacity":[{"backdrop-opacity":[z,V,B]}],"backdrop-saturate":[{"backdrop-saturate":[z,V,B]}],"backdrop-sepia":[{"backdrop-sepia":[``,z,V,B]}],"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`,V,B]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[z,`initial`,V,B]}],ease:[{ease:[`linear`,`initial`,_,V,B]}],delay:[{delay:[z,V,B]}],animate:[{animate:[`none`,v,V,B]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[h,V,B]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:le()}],"rotate-x":[{"rotate-x":le()}],"rotate-y":[{"rotate-y":le()}],"rotate-z":[{"rotate-z":le()}],scale:[{scale:ue()}],"scale-x":[{"scale-x":ue()}],"scale-y":[{"scale-y":ue()}],"scale-z":[{"scale-z":ue()}],"scale-3d":[`scale-3d`],skew:[{skew:de()}],"skew-x":[{"skew-x":de()}],"skew-y":[{"skew-y":de()}],transform:[{transform:[V,B,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:fe()}],"translate-x":[{"translate-x":fe()}],"translate-y":[{"translate-y":fe()}],"translate-z":[{"translate-z":fe()}],"translate-none":[`translate-none`],zoom:[{zoom:[Hr,V,B]}],accent:[{accent:N()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:N()}],"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`,V,B]}],"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":N()}],"scrollbar-track-color":[{"scrollbar-track":N()}],"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`,V,B]}],fill:[{fill:[`none`,...N()]}],"stroke-w":[{stroke:[z,oi,$r,ei]}],stroke:[{stroke:[`none`,...N()]}],"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 H(...e){return Ci(Yn(e))}var wi=Object.defineProperty,Ti=(e,t)=>wi(e,`name`,{value:t,configurable:!0});function Ei(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}Ti(Ei,`setRef`);function Di(...e){return t=>{let n=!1,r=e.map(e=>{let r=Ei(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;tki(e,`name`,{value:t,configurable:!0});function W(e){let t=x.forwardRef((t,n)=>{let{children:r,...i}=t,a=null,o=!1,s=[];Ri(r)&&typeof Hi==`function`&&(r=Hi(r._payload)),x.Children.forEach(r,e=>{if(Ii(e)){o=!0;let t=e,n=`child`in t.props?t.props.child:t.props.children;Ri(n)&&typeof Hi==`function`&&(n=Hi(n._payload)),a=Ni(t,n),s.push(a?.props?.children)}else s.push(e)}),a?a=x.cloneElement(a,void 0,s):!o&&x.Children.count(r)===1&&x.isValidElement(r)&&(a=r);let c=a?Fi(a):void 0,l=Oi(n,c);if(!a){if(r||r===0)throw Error(o?Vi(e):Bi(e));return r}let u=Pi(i,a.props??{});return a.type!==x.Fragment&&(u.ref=n?l:c),x.cloneElement(a,u)});return t.displayName=`${e}.Slot`,t}U(W,`createSlot`);var Ai=W(`Slot`),ji=Symbol.for(`radix.slottable`);function Mi(e){let t=U(e=>`child`in e?e.children(e.child):e.children,`Slottable`);return t.displayName=`${e}.Slottable`,t.__radixId=ji,t}U(Mi,`createSlottable`);var Ni=U((e,t)=>{if(`child`in e.props){let t=e.props.child;return x.isValidElement(t)?x.cloneElement(t,void 0,e.props.children(t.props.children)):null}return x.isValidElement(t)?t:null},`getSlottableElementFromSlottable`);function Pi(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}U(Pi,`mergeProps`);function Fi(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}U(Fi,`getElementRef`);function Ii(e){return x.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===ji}U(Ii,`isSlottable`);var Li=Symbol.for(`react.lazy`);function Ri(e){return typeof e==`object`&&!!e&&`$$typeof`in e&&e.$$typeof===Li&&`_payload`in e&&zi(e._payload)}U(Ri,`isLazyComponent`);function zi(e){return typeof e==`object`&&!!e&&`then`in e}U(zi,`isPromiseLike`);var Bi=U(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,`createSlotError`),Vi=U(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,`createSlottableError`),Hi=x.use,Ui=l(h(),1),Wi=Object.defineProperty,Gi=(e,t)=>Wi(e,`name`,{value:t,configurable:!0}),Ki=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=W(`Primitive.${t}`),r=x.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,S.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function qi(e,t){e&&Ui.flushSync(()=>e.dispatchEvent(t))}Gi(qi,`dispatchDiscreteCustomEvent`);var Ji=Object.defineProperty,Yi=(e,t)=>Ji(e,`name`,{value:t,configurable:!0});function Xi(e,t){let n=x.createContext(t);n.displayName=e+`Context`;let r=Yi(e=>{let{children:t,...r}=e,i=x.useMemo(()=>r,Object.values(r));return(0,S.jsx)(n.Provider,{value:i,children:t})},`Provider`);r.displayName=e+`Provider`;function i(r,i={}){let{optional:a=!1}=i,o=x.useContext(n);if(o)return o;if(t!==void 0)return t;if(!a)throw Error(`\`${r}\` must be used within \`${e}\``)}return Yi(i,`useContext`),[r,i]}Yi(Xi,`createContext`);function Zi(e,t=[]){let n=[];function r(t,r){let i=x.createContext(r);i.displayName=t+`Context`;let a=n.length;n=[...n,r];let o=Yi(t=>{let{scope:n,children:r,...o}=t,s=n?.[e]?.[a]||i,c=x.useMemo(()=>o,Object.values(o));return(0,S.jsx)(s.Provider,{value:c,children:r})},`Provider`);o.displayName=t+`Provider`;function s(n,o,s={}){let{optional:c=!1}=s,l=o?.[e]?.[a]||i,u=x.useContext(l);if(u)return u;if(r!==void 0)return r;if(!c)throw Error(`\`${n}\` must be used within \`${t}\``)}return Yi(s,`useContext`),[o,s]}Yi(r,`createContext`);let i=Yi(()=>{let t=n.map(e=>x.createContext(e));return Yi(function(n){let r=n?.[e]||t;return x.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])},`useScope`)},`createScope`);return i.scopeName=e,[r,Qi(i,...t)]}Yi(Zi,`createContextScope`);function Qi(...e){let t=e[0];if(e.length===1)return t;let n=Yi(()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return Yi(function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return x.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])},`useComposedScopes`)},`createScope`);return n.scopeName=t.scopeName,n}Yi(Qi,`composeContextScopes`);var $i=Object.defineProperty,ea=(e,t)=>$i(e,`name`,{value:t,configurable:!0});function ta(e){let t=e+`CollectionProvider`,[n,r]=Zi(t),[i,a]=n(t,{collectionRef:{current:null},itemMap:new Map}),o=ea(e=>{let{scope:t,children:n}=e,r=x.useRef(null),a=x.useRef(new Map).current;return(0,S.jsx)(i,{scope:t,itemMap:a,collectionRef:r,children:n})},`CollectionProvider`);o.displayName=t;let s=e+`CollectionSlot`,c=W(s),l=x.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=Oi(t,a(s,n).collectionRef);return(0,S.jsx)(c,{ref:i,children:r})});l.displayName=s;let u=e+`CollectionItemSlot`,d=`data-radix-collection-item`,f=W(u),p=x.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=x.useRef(null),s=Oi(t,o),c=a(u,n);return x.useEffect(()=>(c.itemMap.set(o,{ref:o,...i}),()=>void c.itemMap.delete(o))),(0,S.jsx)(f,{[d]:``,ref:s,children:r})});p.displayName=u;function m(t){let n=a(e+`CollectionConsumer`,t);return x.useCallback(()=>{let e=n.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${d}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])}return ea(m,`useCollection`),[{Provider:o,Slot:l,ItemSlot:p},m,r]}ea(ta,`createCollection`);var na=new WeakMap,ra=class e extends Map{static{ea(this,`OrderedDict`)}#e;constructor(e){super(e),this.#e=[...super.keys()],na.set(this,!0)}set(e,t){return na.get(this)&&(this.has(e)?this.#e[this.#e.indexOf(e)]=e:this.#e.push(e)),super.set(e,t),this}insert(e,t,n){let r=this.has(t),i=this.#e.length,a=oa(e),o=a>=0?a:i+a,s=o<0||o>=i?-1:o;if(s===this.size||r&&s===this.size-1||s===-1)return this.set(t,n),this;let c=this.size+ +!r;a<0&&o++;let l=[...this.#e],u,d=!1;for(let e=o;e=this.size&&(r=this.size-1),this.at(r)}keyFrom(e,t){let n=this.indexOf(e);if(n===-1)return;let r=n+t;return r<0&&(r=0),r>=this.size&&(r=this.size-1),this.keyAt(r)}find(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return r;n++}}findIndex(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return n;n++}return-1}filter(t,n){let r=[],i=0;for(let e of this)Reflect.apply(t,n,[e,i,this])&&r.push(e),i++;return new e(r)}map(t,n){let r=[],i=0;for(let e of this)r.push([e[0],Reflect.apply(t,n,[e,i,this])]),i++;return new e(r)}reduce(...e){let[t,n]=e,r=0,i=n??this.at(0);for(let n of this)i=r===0&&e.length===1?n:Reflect.apply(t,this,[i,n,r,this]),r++;return i}reduceRight(...e){let[t,n]=e,r=n??this.at(-1);for(let n=this.size-1;n>=0;n--){let i=this.at(n);r=n===this.size-1&&e.length===1?i:Reflect.apply(t,this,[r,i,n,this])}return r}toSorted(t){let n=[...this.entries()].sort(t);return new e(n)}toReversed(){let t=new e;for(let e=this.size-1;e>=0;e--){let n=this.keyAt(e),r=this.get(n);t.set(n,r)}return t}toSpliced(...t){let n=[...this.entries()];return n.splice(...t),new e(n)}slice(t,n){let r=new e,i=this.size-1;if(t===void 0)return r;t<0&&(t+=this.size),n!==void 0&&n>0&&(i=n-1);for(let e=t;e<=i;e++){let t=this.keyAt(e),n=this.get(t);r.set(t,n)}return r}every(e,t){let n=0;for(let r of this){if(!Reflect.apply(e,t,[r,n,this]))return!1;n++}return!0}some(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return!0;n++}return!1}};function ia(e,t){if(`at`in Array.prototype)return Array.prototype.at.call(e,t);let n=aa(e,t);return n===-1?void 0:e[n]}ea(ia,`at`);function aa(e,t){let n=e.length,r=oa(t),i=r>=0?r:n+r;return i<0||i>=n?-1:i}ea(aa,`toSafeIndex`);function oa(e){return e!==e||e===0?0:Math.trunc(e)}ea(oa,`toSafeInteger`);function sa(e){let t=e+`CollectionProvider`,[n,r]=Zi(t),[i,a]=n(t,{collectionElement:null,collectionRef:{current:null},collectionRefObject:{current:null},itemMap:new ra,setItemMap:ea(()=>void 0,`setItemMap`)}),o=ea(({state:e,...t})=>e?(0,S.jsx)(c,{...t,state:e}):(0,S.jsx)(s,{...t}),`CollectionProvider`);o.displayName=t;let s=ea(e=>{let t=h();return(0,S.jsx)(c,{...e,state:t})},`CollectionInit`);s.displayName=t+`Init`;let c=ea(e=>{let{scope:t,children:n,state:r}=e,a=x.useRef(null),[o,s]=x.useState(null),c=Oi(a,s),[l,u]=r;return x.useEffect(()=>{if(!o)return;let e=da(()=>{});return e.observe(o,{childList:!0,subtree:!0}),()=>{e.disconnect()}},[o]),(0,S.jsx)(i,{scope:t,itemMap:l,setItemMap:u,collectionRef:c,collectionRefObject:a,collectionElement:o,children:n})},`CollectionProviderImpl`);c.displayName=t+`Impl`;let l=e+`CollectionSlot`,u=W(l),d=x.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=Oi(t,a(l,n).collectionRef);return(0,S.jsx)(u,{ref:i,children:r})});d.displayName=l;let f=e+`CollectionItemSlot`,p=W(f),m=x.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=x.useRef(null),[s,c]=x.useState(null),l=Oi(t,o,c),{setItemMap:u}=a(f,n),d=x.useRef(i);ca(d.current,i)||(d.current=i);let m=d.current;return x.useEffect(()=>{let e=m;return u(t=>s?t.has(s)?t.set(s,{...e,element:s}).toSorted(ua):(t.set(s,{...e,element:s}),t.toSorted(ua)):t),()=>{u(e=>!s||!e.has(s)?e:(e.delete(s),new ra(e)))}},[s,m,u]),(0,S.jsx)(p,{"data-radix-collection-item":``,ref:l,children:r})});m.displayName=f;function h(){return x.useState(new ra)}ea(h,`useInitCollection`);function g(t){let{itemMap:n}=a(e+`CollectionConsumer`,t);return n}return ea(g,`useCollection`),[{Provider:o,Slot:d,ItemSlot:m},{createCollectionScope:r,useCollection:g,useInitCollection:h}]}ea(sa,`createCollection`);function ca(e,t){if(e===t)return!0;if(typeof e!=`object`||typeof t!=`object`||e==null||t==null)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||e[r]!==t[r])return!1;return!0}ea(ca,`shallowEqual`);function la(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}ea(la,`isElementPreceding`);function ua(e,t){return!e[1].element||!t[1].element?0:la(e[1].element,t[1].element)?-1:1}ea(ua,`sortByDocumentPosition`);function da(e){return new MutationObserver(t=>{for(let n of t)if(n.type===`childList`){e();return}})}ea(da,`getChildListObserver`);var fa=Object.defineProperty,pa=(e,t)=>fa(e,`name`,{value:t,configurable:!0}),ma=!!(typeof window<`u`&&window.document&&window.document.createElement);function G(e,t,{checkForDefaultPrevented:n=!0}={}){return pa(function(r){if(e?.(r),n===!1||!r||!r.defaultPrevented)return t?.(r)},`handleEvent`)}pa(G,`composeEventHandlers`);function ha(e){if(!ma)throw Error(`Cannot access window outside of the DOM`);return e?.ownerDocument?.defaultView??window}pa(ha,`getOwnerWindow`);function ga(e){if(!ma)throw Error(`Cannot access document outside of the DOM`);return e?.ownerDocument??document}pa(ga,`getOwnerDocument`);function _a(e,t=!1){let{activeElement:n}=ga(e);if(!n?.nodeName)return null;if(va(n)&&n.contentDocument)return _a(n.contentDocument.body,t);if(t){let e=n.getAttribute(`aria-activedescendant`);if(e){let t=ga(n).getElementById(e);if(t)return t}}return n}pa(_a,`getActiveElement`);function va(e){return e.tagName===`IFRAME`}pa(va,`isFrame`);var ya=globalThis?.document?x.useLayoutEffect:()=>{},ba=Object.defineProperty,xa=(e,t)=>ba(e,`name`,{value:t,configurable:!0}),Sa=x.useEffectEvent,Ca=x.useInsertionEffect;function wa(e){if(typeof Sa==`function`)return Sa(e);let t=x.useRef(()=>{throw Error(`Cannot call an event handler while rendering.`)});return typeof Ca==`function`?Ca(()=>{t.current=e}):ya(()=>{t.current=e}),x.useMemo(()=>((...e)=>t.current?.(...e)),[])}xa(wa,`useEffectEvent`);var Ta=Object.defineProperty,Ea=(e,t)=>Ta(e,`name`,{value:t,configurable:!0}),Da=x.useInsertionEffect||ya;function Oa({prop:e,defaultProp:t,onChange:n=Ea(()=>{},`onChange`),caller:r}){let[i,a,o]=ka({defaultProp:t,onChange:n}),s=e!==void 0;return[s?e:i,x.useCallback(t=>{if(s){let n=Aa(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[s,e,a,o])]}Ea(Oa,`useControllableState`);function ka({defaultProp:e,onChange:t}){let[n,r]=x.useState(e),i=x.useRef(n),a=x.useRef(t);return Da(()=>{a.current=t},[t]),x.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}Ea(ka,`useUncontrolledState`);function Aa(e){return typeof e==`function`}Ea(Aa,`isFunction`);var ja=Symbol(`RADIX:SYNC_STATE`);function Ma(e,t,n,r){let{prop:i,defaultProp:a,onChange:o,caller:s}=t,c=i!==void 0,l=wa(o),u=[{...n,state:a}];r&&u.push(r);let[d,f]=x.useReducer((t,n)=>{if(n.type===ja)return{...t,state:n.state};let r=e(t,n);return c&&!Object.is(r.state,t.state)&&l(r.state),r},...u),p=d.state,m=x.useRef(p);x.useEffect(()=>{m.current!==p&&(m.current=p,c||l(p))},[p,m,c]);let h=x.useMemo(()=>i===void 0?d:{...d,state:i},[d,i]);return x.useEffect(()=>{c&&!Object.is(i,d.state)&&f({type:ja,state:i})},[i,d.state,c]),[h,f]}Ea(Ma,`useControllableStateReducer`);var Na=Object.defineProperty,Pa=(e,t)=>Na(e,`name`,{value:t,configurable:!0});function Fa(e,t){return x.useReducer((e,n)=>t[e][n]??e,e)}Pa(Fa,`useStateMachine`);var Ia=Pa(e=>{let{present:t,children:n}=e,r=La(t),i=typeof n==`function`?n({present:r.isPresent}):x.Children.only(n),a=za(r.ref,Va(i));return typeof n==`function`||r.isPresent?x.cloneElement(i,{ref:a}):null},`Presence`);function La(e){let[t,n]=x.useState(),r=x.useRef(null),i=x.useRef(e),a=x.useRef(`none`),o=x.useRef(void 0),[s,c]=Fa(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return x.useEffect(()=>{s===`mounted`?(a.current=o.current??Ba(r.current),o.current=void 0):a.current=`none`},[s]),ya(()=>{let t=r.current,n=i.current;if(n!==e){let r=a.current,s=Ba(t);e?(o.current=s,c(`MOUNT`)):s===`none`||t?.display===`none`?c(`UNMOUNT`):c(n&&r!==s?`ANIMATION_OUT`:`UNMOUNT`),i.current=e}},[e,c]),ya(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,o=Pa(a=>{let o=Ba(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&o&&(c(`ANIMATION_END`),!i.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},`handleAnimationEnd`),s=Pa(e=>{e.target===t&&(a.current=Ba(r.current))},`handleAnimationStart`);return t.addEventListener(`animationstart`,s),t.addEventListener(`animationcancel`,o),t.addEventListener(`animationend`,o),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,s),t.removeEventListener(`animationcancel`,o),t.removeEventListener(`animationend`,o)}}c(`ANIMATION_END`)},[t,c]),{isPresent:[`mounted`,`unmountSuspended`].includes(s),ref:x.useCallback(e=>{if(e){let t=getComputedStyle(e);r.current=t,o.current=Ba(t)}else r.current=null;n(e)},[])}}Pa(La,`usePresence`);function Ra(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}Pa(Ra,`setRef`);function za(...e){let t=x.useRef(e);return t.current=e,x.useCallback(e=>{let n=t.current,r=!1,i=n.map(t=>{let n=Ra(t,e);return!r&&typeof n==`function`&&(r=!0),n});if(r)return()=>{for(let e=0;eHa(e,`name`,{value:t,configurable:!0}),Wa=x.useId||(()=>void 0),Ga=0;function Ka(e){let[t,n]=x.useState(Wa());return ya(()=>{e||n(e=>e??String(Ga++))},[e]),e||(t?`radix-${t}`:``)}Ua(Ka,`useId`);var qa=Object.defineProperty,Ja=(e,t)=>qa(e,`name`,{value:t,configurable:!0}),Ya=x.createContext(void 0);function Xa(e){let t=x.useContext(Ya);return e||t||`ltr`}Ja(Xa,`useDirection`);var Za=Object.defineProperty,Qa=(e,t)=>Za(e,`name`,{value:t,configurable:!0});function $a(e){let t=x.useRef(e);return x.useEffect(()=>{t.current=e}),x.useMemo(()=>((...e)=>t.current?.(...e)),[])}Qa($a,`useCallbackRef`);var eo=Object.defineProperty,to=(e,t)=>eo(e,`name`,{value:t,configurable:!0}),no=`dismissableLayer.update`,ro=`dismissableLayer.pointerDownOutside`,io=`dismissableLayer.focusOutside`,ao,oo=x.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),K=x.forwardRef(to(function(e,t){let{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:i,onPointerDownOutside:a,onFocusOutside:o,onInteractOutside:s,onDismiss:c,...l}=e,u=x.useContext(oo),[d,f]=x.useState(null),p=d?.ownerDocument??globalThis?.document,[,m]=x.useState({}),h=Oi(t,f),g=Array.from(u.layers),[_]=[...u.layersWithOutsidePointerEventsDisabled].slice(-1),v=_?g.indexOf(_):-1,y=d?g.indexOf(d):-1,b=u.layersWithOutsidePointerEventsDisabled.size>0,C=y>=v,w=x.useRef(!1),T=lo(e=>{a?.(e),s?.(e),e.defaultPrevented||c?.()},{ownerDocument:p,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:w,dismissableSurfaces:u.dismissableSurfaces,shouldHandlePointerDownOutside:x.useCallback(e=>{if(!(e instanceof Node))return!1;let t=[...u.branches].some(t=>t.contains(e));return C&&!t},[u.branches,C])}),E=uo(e=>{if(r&&w.current)return;let t=e.target;[...u.branches].some(e=>e.contains(t))||(o?.(e),s?.(e),e.defaultPrevented||c?.())},p),D=d?y===g.length-1:!1,O=$a(e=>{e.key===`Escape`&&(i?.(e),!e.defaultPrevented&&c&&(e.preventDefault(),c()))});return x.useEffect(()=>{if(D)return p.addEventListener(`keydown`,O,{capture:!0}),()=>p.removeEventListener(`keydown`,O,{capture:!0})},[p,D,O]),x.useEffect(()=>{if(d)return n&&(u.layersWithOutsidePointerEventsDisabled.size===0&&(ao=p.body.style.pointerEvents,p.body.style.pointerEvents=`none`),u.layersWithOutsidePointerEventsDisabled.add(d)),u.layers.add(d),fo(),()=>{n&&(u.layersWithOutsidePointerEventsDisabled.delete(d),u.layersWithOutsidePointerEventsDisabled.size===0&&(p.body.style.pointerEvents=ao))}},[d,p,n,u]),x.useEffect(()=>()=>{d&&(u.layers.delete(d),u.layersWithOutsidePointerEventsDisabled.delete(d),fo())},[d,u]),x.useEffect(()=>{let e=to(()=>m({}),`handleUpdate`);return document.addEventListener(no,e),()=>document.removeEventListener(no,e)},[]),(0,S.jsx)(Ki.div,{...l,ref:h,style:{pointerEvents:b?C?`auto`:`none`:void 0,...e.style},onFocusCapture:G(e.onFocusCapture,E.onFocusCapture),onBlurCapture:G(e.onBlurCapture,E.onBlurCapture),onPointerDownCapture:G(e.onPointerDownCapture,T.onPointerDownCapture)})},`DismissableLayer`));function so(){let e=x.useContext(oo),[t,n]=x.useState(null);return x.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),n}to(so,`useDismissableLayerSurface`);var co=to(()=>!0,`IS_TRUE`);function lo(e,t){let{ownerDocument:n=globalThis?.document,deferPointerDownOutside:r=!1,isDeferredPointerDownOutsideRef:i,dismissableSurfaces:a,shouldHandlePointerDownOutside:o=co}=t,s=$a(e),c=x.useRef(!1),l=x.useRef(!1),u=x.useRef(new Map),d=x.useRef(()=>{});return x.useEffect(()=>{function e(){l.current=!1,i.current=!1,u.current.clear()}to(e,`resetOutsideInteraction`);function t(){return Array.from(u.current.values()).some(Boolean)}to(t,`isOutsideInteractionIntercepted`);function f(e){if(!l.current)return;let t=e.target;t instanceof Node&&[...a].some(e=>e.contains(t))||u.current.set(e.type,!0),e.type===`click`&&window.setTimeout(()=>{l.current&&d.current()},0)}to(f,`handleInteractionCapture`);function p(e){l.current&&u.current.set(e.type,!1)}to(p,`handleInteractionBubble`);let m=to(a=>{if(a.target&&!c.current){let f=function(){n.removeEventListener(`click`,d.current);let r=t();e(),r||po(ro,s,p,{discrete:!0})};if(to(f,`handleAndDispatchPointerDownOutsideEvent`),!o(a.target)){n.removeEventListener(`click`,d.current),e(),c.current=!1;return}let p={originalEvent:a};l.current=!0,i.current=r&&a.button===0,u.current.clear(),!r||a.button!==0?f():(n.removeEventListener(`click`,d.current),d.current=f,n.addEventListener(`click`,d.current,{once:!0}))}else n.removeEventListener(`click`,d.current),e();c.current=!1},`handlePointerDown`),h=[`pointerup`,`mousedown`,`mouseup`,`touchstart`,`touchend`,`click`];for(let e of h)n.addEventListener(e,f,!0),n.addEventListener(e,p);let g=window.setTimeout(()=>{n.addEventListener(`pointerdown`,m)},0);return()=>{window.clearTimeout(g),n.removeEventListener(`pointerdown`,m),n.removeEventListener(`click`,d.current);for(let e of h)n.removeEventListener(e,f,!0),n.removeEventListener(e,p)}},[n,s,r,i,a,o]),{onPointerDownCapture:to(()=>c.current=!0,`onPointerDownCapture`)}}to(lo,`usePointerDownOutside`);function uo(e,t=globalThis?.document){let n=$a(e),r=x.useRef(!1);return x.useEffect(()=>{let e=to(e=>{e.target&&!r.current&&po(io,n,{originalEvent:e},{discrete:!1})},`handleFocus`);return t.addEventListener(`focusin`,e),()=>t.removeEventListener(`focusin`,e)},[t,n]),{onFocusCapture:to(()=>r.current=!0,`onFocusCapture`),onBlurCapture:to(()=>r.current=!1,`onBlurCapture`)}}to(uo,`useFocusOutside`);function fo(){let e=new CustomEvent(no);document.dispatchEvent(e)}to(fo,`dispatchUpdate`);function po(e,t,n,{discrete:r}){let i=n.originalEvent.target,a=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&i.addEventListener(e,t,{once:!0}),r?qi(i,a):i.dispatchEvent(a)}to(po,`handleAndDispatchCustomEvent`);var mo=Object.defineProperty,ho=(e,t)=>mo(e,`name`,{value:t,configurable:!0}),go=`focusScope.autoFocusOnMount`,_o=`focusScope.autoFocusOnUnmount`,vo={bubbles:!1,cancelable:!0},yo=x.forwardRef(ho(function(e,t){let{loop:n=!1,trapped:r=!1,onMountAutoFocus:i,onUnmountAutoFocus:a,...o}=e,[s,c]=x.useState(null),l=$a(i),u=$a(a),d=x.useRef(null),f=Oi(t,c),p=x.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;x.useEffect(()=>{if(r){let e=function(e){if(p.paused||!s)return;let t=e.target;s.contains(t)?d.current=t:Eo(d.current,{select:!0})},t=function(e){if(p.paused||!s)return;let t=e.relatedTarget;t!==null&&(s.contains(t)||Eo(d.current,{select:!0}))},n=function(e){if(document.activeElement===document.body)for(let t of e)t.removedNodes.length>0&&Eo(s)};ho(e,`handleFocusIn`),ho(t,`handleFocusOut`),ho(n,`handleMutations`),document.addEventListener(`focusin`,e),document.addEventListener(`focusout`,t);let r=new MutationObserver(n);return s&&r.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener(`focusin`,e),document.removeEventListener(`focusout`,t),r.disconnect()}}},[r,s,p.paused]),x.useEffect(()=>{if(s){Do.add(p);let e=document.activeElement;if(!s.contains(e)){let t=new CustomEvent(go,vo);s.addEventListener(go,l),s.dispatchEvent(t),t.defaultPrevented||(bo(Ao(So(s)),{select:!0}),document.activeElement===e&&Eo(s))}return()=>{s.removeEventListener(go,l),setTimeout(()=>{let t=new CustomEvent(_o,vo);s.addEventListener(_o,u),s.dispatchEvent(t),t.defaultPrevented||Eo(e??document.body,{select:!0}),s.removeEventListener(_o,u),Do.remove(p)},0)}}},[s,l,u,p]);let m=x.useCallback(e=>{if(!n&&!r||p.paused)return;let t=e.key===`Tab`&&!e.altKey&&!e.ctrlKey&&!e.metaKey,i=document.activeElement;if(t&&i){let t=e.currentTarget,[r,a]=xo(t);r&&a?!e.shiftKey&&i===a?(e.preventDefault(),n&&Eo(r,{select:!0})):e.shiftKey&&i===r&&(e.preventDefault(),n&&Eo(a,{select:!0})):i===t&&e.preventDefault()}},[n,r,p.paused]);return(0,S.jsx)(Ki.div,{tabIndex:-1,...o,ref:f,onKeyDown:m})},`FocusScope`));function bo(e,{select:t=!1}={}){let n=document.activeElement;for(let r of e)if(Eo(r,{select:t}),document.activeElement!==n)return}ho(bo,`focusFirst`);function xo(e){let t=So(e);return[Co(t,e),Co(t.reverse(),e)]}ho(xo,`getTabbableEdges`);function So(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:ho(e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},`acceptNode`)});for(;n.nextNode();)t.push(n.currentNode);return t}ho(So,`getTabbableCandidates`);function Co(e,t){let n=typeof t.checkVisibility==`function`&&t.checkVisibility({checkVisibilityCSS:!0});for(let r of e)if(!(n?!r.checkVisibility({checkVisibilityCSS:!0}):wo(r,{upTo:t})))return r}ho(Co,`findVisible`);function wo(e,{upTo:t}){if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1}ho(wo,`isHidden`);function To(e){return e instanceof HTMLInputElement&&`select`in e}ho(To,`isSelectableInput`);function Eo(e,{select:t=!1}={}){if(e&&e.focus){let n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&To(e)&&t&&e.select()}}ho(Eo,`focus`);var Do=Oo();function Oo(){let e=[];return{add(t){let n=e[0];t!==n&&n?.pause(),e=ko(e,t),e.unshift(t)},remove(t){e=ko(e,t),e[0]?.resume()}}}ho(Oo,`createFocusScopesStack`);function ko(e,t){let n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r,1),n}ho(ko,`arrayRemove`);function Ao(e){return e.filter(e=>e.tagName!==`A`)}ho(Ao,`removeLinks`);var jo=Object.defineProperty,Mo=x.forwardRef(((e,t)=>jo(e,`name`,{value:t,configurable:!0}))(function(e,t){let{container:n,...r}=e,[i,a]=x.useState(!1);ya(()=>a(!0),[]);let o=n||i&&globalThis?.document?.body;return o?Ui.createPortal((0,S.jsx)(Ki.div,{...r,ref:t}),o):null},`Portal`)),No=Object.defineProperty,Po=(e,t)=>No(e,`name`,{value:t,configurable:!0}),Fo=0,Io=null;function Lo(e){return Ro(),e.children}Po(Lo,`FocusGuards`);function Ro(){x.useEffect(()=>{Io||={start:zo(),end:zo()};let{start:e,end:t}=Io;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement(`afterbegin`,e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement(`beforeend`,t),Fo++,()=>{Fo===1&&(Io?.start.remove(),Io?.end.remove(),Io=null),Fo=Math.max(0,Fo-1)}},[])}Po(Ro,`useFocusGuards`);function zo(){let e=document.createElement(`span`);return e.setAttribute(`data-radix-focus-guard`,``),e.tabIndex=0,e.style.outline=`none`,e.style.opacity=`0`,e.style.position=`fixed`,e.style.pointerEvents=`none`,e}Po(zo,`createFocusGuard`);var Bo=function(){return Bo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n`u`)return hs;var t=_s(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},ys=ms(),bs=`data-scroll-locked`,xs=function(e,t,n,r){var i=e.left,a=e.top,o=e.right,s=e.gap;return n===void 0&&(n=`margin`),` + .${Go} { overflow: hidden ${r}; padding-right: ${s}px ${r}; } - body[${zo}] { + body[${bs}] { overflow: hidden ${r}; overscroll-behavior: contain; ${[t&&`position: relative ${r};`,n===`margin`&&` @@ -24,26 +24,26 @@ Error generating stack: `+e.message+` `,n===`padding`&&`padding-right: ${s}px ${r};`].filter(Boolean).join(``)} } - .${K} { + .${Uo} { right: ${s}px ${r}; } - .${co} { + .${Wo} { margin-right: ${s}px ${r}; } - .${K} .${K} { + .${Uo} .${Uo} { right: 0 ${r}; } - .${co} .${co} { + .${Wo} .${Wo} { margin-right: 0 ${r}; } - body[${zo}] { - ${uo}: ${s}px; + body[${bs}] { + ${Ko}: ${s}px; } -`},Vo=function(){var e=parseInt(document.body.getAttribute(`data-scroll-locked`)||`0`,10);return isFinite(e)?e:0},Ho=function(){x.useEffect(function(){return document.body.setAttribute(zo,(Vo()+1).toString()),function(){var e=Vo()-1;e<=0?document.body.removeAttribute(zo):document.body.setAttribute(zo,e.toString())}},[])},Uo=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,i=r===void 0?`margin`:r;Ho();var a=x.useMemo(function(){return Lo(i)},[i]);return x.createElement(Ro,{styles:Bo(a,!t,i,n?``:`!important`)})},Wo=!1;if(typeof window<`u`)try{var Go=Object.defineProperty({},"passive",{get:function(){return Wo=!0,!0}});window.addEventListener(`test`,Go,Go),window.removeEventListener(`test`,Go,Go)}catch{Wo=!1}var Ko=Wo?{passive:!1}:!1,qo=function(e){return e.tagName===`TEXTAREA`},Jo=function(e,t){if(!(e instanceof Element))return!1;var n=window.getComputedStyle(e);return n[t]!==`hidden`&&!(n.overflowY===n.overflowX&&!qo(e)&&n[t]===`visible`)},Yo=function(e){return Jo(e,`overflowY`)},Xo=function(e){return Jo(e,`overflowX`)},Zo=function(e,t){var n=t.ownerDocument,r=t;do{if(typeof ShadowRoot<`u`&&r instanceof ShadowRoot&&(r=r.host),es(e,r)){var i=ts(e,r);if(i[1]>i[2])return!0}r=r.parentNode}while(r&&r!==n.body);return!1},Qo=function(e){return[e.scrollTop,e.scrollHeight,e.clientHeight]},$o=function(e){return[e.scrollLeft,e.scrollWidth,e.clientWidth]},es=function(e,t){return e===`v`?Yo(t):Xo(t)},ts=function(e,t){return e===`v`?Qo(t):$o(t)},ns=function(e,t){return e===`h`&&t===`rtl`?-1:1},rs=function(e,t,n,r,i){var a=ns(e,window.getComputedStyle(t).direction),o=a*r,s=n.target,c=t.contains(s),l=!1,u=o>0,d=0,f=0;do{if(!s)break;var p=ts(e,s),m=p[0],h=p[1]-p[2]-a*m;(m||h)&&es(e,s)&&(d+=h,f+=m);var g=s.parentNode;s=g&&g.nodeType===Node.DOCUMENT_FRAGMENT_NODE?g.host:g}while(!c&&s!==document.body||c&&(t.contains(s)||t===s));return(u&&(i&&Math.abs(d)<1||!i&&o>d)||!u&&(i&&Math.abs(f)<1||!i&&-o>f))&&(l=!0),l},is=function(e){return`changedTouches`in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},as=function(e){return[e.deltaX,e.deltaY]},os=function(e){return e&&`current`in e?e.current:e},ss=function(e,t){return e[0]===t[0]&&e[1]===t[1]},cs=function(e){return` +`},Ss=function(){var e=parseInt(document.body.getAttribute(`data-scroll-locked`)||`0`,10);return isFinite(e)?e:0},Cs=function(){x.useEffect(function(){return document.body.setAttribute(bs,(Ss()+1).toString()),function(){var e=Ss()-1;e<=0?document.body.removeAttribute(bs):document.body.setAttribute(bs,e.toString())}},[])},ws=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,i=r===void 0?`margin`:r;Cs();var a=x.useMemo(function(){return vs(i)},[i]);return x.createElement(ys,{styles:xs(a,!t,i,n?``:`!important`)})},Ts=!1;if(typeof window<`u`)try{var Es=Object.defineProperty({},"passive",{get:function(){return Ts=!0,!0}});window.addEventListener(`test`,Es,Es),window.removeEventListener(`test`,Es,Es)}catch{Ts=!1}var Ds=Ts?{passive:!1}:!1,Os=function(e){return e.tagName===`TEXTAREA`},ks=function(e,t){if(!(e instanceof Element))return!1;var n=window.getComputedStyle(e);return n[t]!==`hidden`&&!(n.overflowY===n.overflowX&&!Os(e)&&n[t]===`visible`)},As=function(e){return ks(e,`overflowY`)},js=function(e){return ks(e,`overflowX`)},Ms=function(e,t){var n=t.ownerDocument,r=t;do{if(typeof ShadowRoot<`u`&&r instanceof ShadowRoot&&(r=r.host),Fs(e,r)){var i=Is(e,r);if(i[1]>i[2])return!0}r=r.parentNode}while(r&&r!==n.body);return!1},Ns=function(e){return[e.scrollTop,e.scrollHeight,e.clientHeight]},Ps=function(e){return[e.scrollLeft,e.scrollWidth,e.clientWidth]},Fs=function(e,t){return e===`v`?As(t):js(t)},Is=function(e,t){return e===`v`?Ns(t):Ps(t)},Ls=function(e,t){return e===`h`&&t===`rtl`?-1:1},Rs=function(e,t,n,r,i){var a=Ls(e,window.getComputedStyle(t).direction),o=a*r,s=n.target,c=t.contains(s),l=!1,u=o>0,d=0,f=0;do{if(!s)break;var p=Is(e,s),m=p[0],h=p[1]-p[2]-a*m;(m||h)&&Fs(e,s)&&(d+=h,f+=m);var g=s.parentNode;s=g&&g.nodeType===Node.DOCUMENT_FRAGMENT_NODE?g.host:g}while(!c&&s!==document.body||c&&(t.contains(s)||t===s));return(u&&(i&&Math.abs(d)<1||!i&&o>d)||!u&&(i&&Math.abs(f)<1||!i&&-o>f))&&(l=!0),l},zs=function(e){return`changedTouches`in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Bs=function(e){return[e.deltaX,e.deltaY]},Vs=function(e){return e&&`current`in e?e.current:e},Hs=function(e,t){return e[0]===t[0]&&e[1]===t[1]},Us=function(e){return` .block-interactivity-${e} {pointer-events: none;} .allow-interactivity-${e} {pointer-events: all;} -`},ls=0,us=[];function ds(e){var t=x.useRef([]),n=x.useRef([0,0]),r=x.useRef(),i=x.useState(ls++)[0],a=x.useState(No)[0],o=x.useRef(e);x.useEffect(function(){o.current=e},[e]),x.useEffect(function(){if(e.inert){document.body.classList.add(`block-interactivity-${i}`);var t=G([e.lockRef.current],(e.shards||[]).map(os),!0).filter(Boolean);return t.forEach(function(e){return e.classList.add(`allow-interactivity-${i}`)}),function(){document.body.classList.remove(`block-interactivity-${i}`),t.forEach(function(e){return e.classList.remove(`allow-interactivity-${i}`)})}}},[e.inert,e.lockRef.current,e.shards]);var s=x.useCallback(function(e,t){if(`touches`in e&&e.touches.length===2||e.type===`wheel`&&e.ctrlKey)return!o.current.allowPinchZoom;var i=is(e),a=n.current,s=`deltaX`in e?e.deltaX:a[0]-i[0],c=`deltaY`in e?e.deltaY:a[1]-i[1],l,u=e.target,d=Math.abs(s)>Math.abs(c)?`h`:`v`;if(`touches`in e&&d===`h`&&u.type===`range`)return!1;var f=window.getSelection(),p=f&&f.anchorNode;if(p&&(p===u||p.contains(u)))return!1;var m=Zo(d,u);if(!m)return!0;if(m?l=d:(l=d===`v`?`h`:`v`,m=Zo(d,u)),!m)return!1;if(!r.current&&`changedTouches`in e&&(s||c)&&(r.current=l),!l)return!0;var h=r.current||l;return rs(h,t,e,h===`h`?s:c,!0)},[]),c=x.useCallback(function(e){var n=e;if(us.length&&us[us.length-1]===a){var r=`deltaY`in n?as(n):is(n),i=t.current.filter(function(e){return e.name===n.type&&(e.target===n.target||n.target===e.shadowParent)&&ss(e.delta,r)})[0];if(i&&i.should){n.cancelable&&n.preventDefault();return}if(!i){var c=(o.current.shards||[]).map(os).filter(Boolean).filter(function(e){return e.contains(n.target)});(c.length>0?s(n,c[0]):!o.current.noIsolation)&&n.cancelable&&n.preventDefault()}}},[]),l=x.useCallback(function(e,n,r,i){var a={name:e,delta:n,target:r,should:i,shadowParent:fs(r)};t.current.push(a),setTimeout(function(){t.current=t.current.filter(function(e){return e!==a})},1)},[]),u=x.useCallback(function(e){n.current=is(e),r.current=void 0},[]),d=x.useCallback(function(t){l(t.type,as(t),t.target,s(t,e.lockRef.current))},[]),f=x.useCallback(function(t){l(t.type,is(t),t.target,s(t,e.lockRef.current))},[]);x.useEffect(function(){return us.push(a),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:f}),document.addEventListener(`wheel`,c,Ko),document.addEventListener(`touchmove`,c,Ko),document.addEventListener(`touchstart`,u,Ko),function(){us=us.filter(function(e){return e!==a}),document.removeEventListener(`wheel`,c,Ko),document.removeEventListener(`touchmove`,c,Ko),document.removeEventListener(`touchstart`,u,Ko)}},[]);var p=e.removeScrollBar,m=e.inert;return x.createElement(x.Fragment,null,m?x.createElement(a,{styles:cs(i)}):null,p?x.createElement(Uo,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function fs(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}var ps=xo(So,ds),ms=x.forwardRef(function(e,t){return x.createElement(wo,oo({},e,{ref:t,sideCar:ps}))});ms.classNames=wo.classNames;var hs=function(e){return typeof document>`u`?null:(Array.isArray(e)?e[0]:e).ownerDocument.body},gs=new WeakMap,_s=new WeakMap,vs={},ys=0,bs=function(e){return e&&(e.host||bs(e.parentNode))},xs=function(e,t){return t.map(function(t){if(e.contains(t))return t;var n=bs(t);return n&&e.contains(n)?n:(console.error(`aria-hidden`,t,`in not contained inside`,e,`. Doing nothing`),null)}).filter(function(e){return!!e})},Ss=function(e,t,n,r){var i=xs(t,Array.isArray(e)?e:[e]);vs[n]||(vs[n]=new WeakMap);var a=vs[n],o=[],s=new Set,c=new Set(i),l=function(e){e&&!s.has(e)&&(s.add(e),l(e.parentNode))};i.forEach(l);var u=function(e){e&&!c.has(e)&&Array.prototype.forEach.call(e.children,function(e){if(s.has(e))u(e);else try{var t=e.getAttribute(r),i=t!==null&&t!==`false`,c=(gs.get(e)||0)+1,l=(a.get(e)||0)+1;gs.set(e,c),a.set(e,l),o.push(e),c===1&&i&&_s.set(e,!0),l===1&&e.setAttribute(n,`true`),i||e.setAttribute(r,`true`)}catch(t){console.error(`aria-hidden: cannot operate on `,e,t)}})};return u(t),s.clear(),ys++,function(){o.forEach(function(e){var t=gs.get(e)-1,i=a.get(e)-1;gs.set(e,t),a.set(e,i),t||(_s.has(e)||e.removeAttribute(r),_s.delete(e)),i||e.removeAttribute(n)}),ys--,ys||(gs=new WeakMap,gs=new WeakMap,_s=new WeakMap,vs={})}},Cs=function(e,t,n){n===void 0&&(n=`data-aria-hidden`);var r=Array.from(Array.isArray(e)?e:[e]),i=t||hs(e);return i?(r.push.apply(r,Array.from(i.querySelectorAll(`[aria-live], script`))),Ss(r,i,n,`aria-hidden`)):function(){return null}},ws=Object.defineProperty,Ts=(e,t)=>ws(e,`name`,{value:t,configurable:!0}),Es=`Dialog`,[Ds,Os]=vi(Es),[ks,As]=Ds(Es),js=Ts(e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=x.useRef(null),c=x.useRef(null),[l,u]=Ji({prop:r,defaultProp:i??!1,onChange:a,caller:Es}),[d,f]=x.useState(0),[p,m]=x.useState(0);return(0,S.jsx)(ks,{scope:t,triggerRef:s,contentRef:c,contentId:fa(),titleId:fa(),descriptionId:fa(),titlePresent:d>0,descriptionPresent:p>0,setTitleCount:f,setDescriptionCount:m,open:l,onOpenChange:u,onOpenToggle:x.useCallback(()=>u(e=>!e),[u]),modal:o,children:n})},`Dialog`),Ms=`DialogPortal`,[Ns,Ps]=Ds(Ms,{forceMount:void 0}),Fs=Ts(e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=As(Ms,t);return(0,S.jsx)(Ns,{scope:t,forceMount:n,children:x.Children.map(r,e=>(0,S.jsx)(na,{present:n||a.open,children:(0,S.jsx)(Qa,{asChild:!0,container:i,children:e})}))})},`DialogPortal`),Is=`DialogOverlay`,Ls=x.forwardRef(Ts(function(e,t){let n=Ps(Is,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=As(Is,e.__scopeDialog);return a.modal?(0,S.jsx)(na,{present:r||a.open,children:(0,S.jsx)(zs,{...i,ref:t})}):null},`DialogOverlay`)),Rs=Xr(`DialogOverlay.RemoveScroll`),zs=x.forwardRef(Ts(function(e,t){let{__scopeDialog:n,...r}=e,i=As(Is,n),a=H(t,Oa());return(0,S.jsx)(ms,{as:Rs,allowPinchZoom:!0,shards:[i.contentRef],children:(0,S.jsx)(pi.div,{"data-state":Zs(i.open),...r,ref:a,style:{pointerEvents:`auto`,...r.style}})})},`DialogOverlayImpl`)),Bs=`DialogContent`,Vs=x.forwardRef(Ts(function(e,t){let n=Ps(Bs,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=As(Bs,e.__scopeDialog);return(0,S.jsx)(na,{present:r||a.open,children:a.modal?(0,S.jsx)(Hs,{...i,ref:t}):(0,S.jsx)(Us,{...i,ref:t})})},`DialogContent`)),Hs=x.forwardRef(Ts(function(e,t){let n=As(Bs,e.__scopeDialog),r=x.useRef(null),i=H(t,n.contentRef,r);return x.useEffect(()=>{let e=r.current;if(e)return Cs(e)},[]),(0,S.jsx)(Ws,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:W(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:W(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:W(e.onFocusOutside,e=>e.preventDefault())})},`DialogContentModal`)),Us=x.forwardRef(Ts(function(e,t){let n=As(Bs,e.__scopeDialog),r=x.useRef(!1),i=x.useRef(!1);return(0,S.jsx)(Ws,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})},`DialogContentNonModal`)),Ws=x.forwardRef(Ts(function(e,t){let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,...o}=e,s=As(Bs,n);return io(),(0,S.jsx)(S.Fragment,{children:(0,S.jsx)(za,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,S.jsx)(Da,{role:`dialog`,id:s.contentId,"aria-describedby":s.descriptionPresent?s.descriptionId:void 0,"aria-labelledby":s.titlePresent?s.titleId:void 0,"data-state":Zs(s.open),...o,ref:t,deferPointerDownOutside:!0,onDismiss:()=>s.onOpenChange(!1)})})})},`DialogContentImpl`)),Gs=`DialogTitle`,Ks=x.forwardRef(Ts(function(e,t){let{__scopeDialog:n,...r}=e,i=As(Gs,n),{setTitleCount:a}=i;return zi(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,S.jsx)(pi.h2,{id:i.titleId,...r,ref:t})},`DialogTitle`)),qs=`DialogDescription`,Js=x.forwardRef(Ts(function(e,t){let{__scopeDialog:n,...r}=e,i=As(qs,n),{setDescriptionCount:a}=i;return zi(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,S.jsx)(pi.p,{id:i.descriptionId,...r,ref:t})},`DialogDescription`)),Ys=`DialogClose`,Xs=x.forwardRef(Ts(function(e,t){let{__scopeDialog:n,...r}=e,i=As(Ys,n);return(0,S.jsx)(pi.button,{type:`button`,...r,ref:t,onClick:W(e.onClick,()=>i.onOpenChange(!1))})},`DialogClose`));function Zs(e){return e?`open`:`closed`}Ts(Zs,`getState`);var Qs=Object.defineProperty,$s=(e,t)=>Qs(e,`name`,{value:t,configurable:!0});function ec(e){let[t,n]=x.useState(void 0);return zi(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let r=t[0],i,a;if(`borderBoxSize`in r){let e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;i=t.inlineSize,a=t.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}n(void 0)},[e]),t}$s(ec,`useSize`);var tc=[`top`,`right`,`bottom`,`left`],nc=Math.min,rc=Math.max,ic=Math.round,ac=Math.floor,oc=e=>({x:e,y:e}),sc={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function cc(e,t,n){return rc(e,nc(t,n))}function lc(e,t){return typeof e==`function`?e(t):e}function uc(e){return e.split(`-`)[0]}function dc(e){return e.split(`-`)[1]}function fc(e){return e===`x`?`y`:`x`}function pc(e){return e===`y`?`height`:`width`}function mc(e){let t=e[0];return t===`t`||t===`b`?`y`:`x`}function hc(e){return fc(mc(e))}function gc(e,t,n){n===void 0&&(n=!1);let r=dc(e),i=hc(e),a=pc(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=Tc(o)),[o,Tc(o)]}function _c(e){let t=Tc(e);return[vc(e),t,vc(t)]}function vc(e){return e.includes(`start`)?e.replace(`start`,`end`):e.replace(`end`,`start`)}var yc=[`left`,`right`],bc=[`right`,`left`],xc=[`top`,`bottom`],Sc=[`bottom`,`top`];function Cc(e,t,n){switch(e){case`top`:case`bottom`:return n?t?bc:yc:t?yc:bc;case`left`:case`right`:return t?xc:Sc;default:return[]}}function wc(e,t,n,r){let i=dc(e),a=Cc(uc(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map(vc)))),a}function Tc(e){let t=uc(e);return sc[t]+e.slice(t.length)}function Ec(e){return{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}}function Dc(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:Ec(e)}function Oc(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function kc(e,t,n){let{reference:r,floating:i}=e,a=mc(t),o=hc(t),s=pc(o),c=uc(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}let m=dc(t);return m&&(p[o]+=f*(m===`end`?1:-1)*(n&&l?-1:1)),p}async function Ac(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a,elements:o,strategy:s}=e,{boundary:c=`clippingAncestors`,rootBoundary:l=`viewport`,elementContext:u=`floating`,altBoundary:d=!1,padding:f=0}=lc(t,e),p=Dc(f),m=o[d?u===`floating`?`reference`:`floating`:u],h=Oc(await i.getClippingRect({element:await(i.isElement==null?void 0:i.isElement(m))??!0?m:m.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(o.floating)),boundary:c,rootBoundary:l,strategy:s})),g=u===`floating`?{x:n,y:r,width:a.floating.width,height:a.floating.height}:a.reference,_=await(i.getOffsetParent==null?void 0:i.getOffsetParent(o.floating)),v=await(i.isElement==null?void 0:i.isElement(_))&&await(i.getScale==null?void 0:i.getScale(_))||{x:1,y:1},y=Oc(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:o,rect:g,offsetParent:_,strategy:s}):g);return{top:(h.top-y.top+p.top)/v.y,bottom:(y.bottom-h.bottom+p.bottom)/v.y,left:(h.left-y.left+p.left)/v.x,right:(y.right-h.right+p.right)/v.x}}var jc=50,Mc=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=o.detectOverflow?o:{...o,detectOverflow:Ac},c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=kc(l,r,c),f=r,p=0,m={};for(let n=0;n({name:`arrow`,options:e,async fn(t){let{x:n,y:r,placement:i,rects:a,platform:o,elements:s,middlewareData:c}=t,{element:l,padding:u=0}=lc(e,t)||{};if(l==null)return{};let d=Dc(u),f={x:n,y:r},p=hc(i),m=pc(p),h=await o.getDimensions(l),g=p===`y`,_=g?`top`:`left`,v=g?`bottom`:`right`,y=g?`clientHeight`:`clientWidth`,b=a.reference[m]+a.reference[p]-f[p]-a.floating[m],x=f[p]-a.reference[p],S=await(o.getOffsetParent==null?void 0:o.getOffsetParent(l)),C=S?S[y]:0;(!C||!await(o.isElement==null?void 0:o.isElement(S)))&&(C=s.floating[y]||a.floating[m]);let w=b/2-x/2,T=C/2-h[m]/2-1,E=nc(d[_],T),D=nc(d[v],T),O=C-h[m]-D,ee=C/2-h[m]/2+w,k=cc(E,ee,O),A=!c.arrow&&dc(i)!=null&&ee!==k&&a.reference[m]/2-(eee<=0)){let e=(i.flip?.index||0)+1,t=S[e];if(t&&(u!==`alignment`||_===mc(t)||T.every(e=>mc(e.placement)!==_||e.overflows[0]>0)))return{data:{index:e,overflows:T},reset:{placement:t}};let n=T.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=T.filter(e=>{if(x){let t=mc(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o}if(r!==n)return{reset:{placement:n}}}return{}}}};function Fc(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Ic(e){return tc.some(t=>e[t]>=0)}var Lc=function(e){return e===void 0&&(e={}),{name:`hide`,options:e,async fn(t){let{rects:n,platform:r}=t,{strategy:i=`referenceHidden`,...a}=lc(e,t);switch(i){case`referenceHidden`:{let e=Fc(await r.detectOverflow(t,{...a,elementContext:`reference`}),n.reference);return{data:{referenceHiddenOffsets:e,referenceHidden:Ic(e)}}}case`escaped`:{let e=Fc(await r.detectOverflow(t,{...a,altBoundary:!0}),n.floating);return{data:{escapedOffsets:e,escaped:Ic(e)}}}default:return{}}}}},Rc=new Set([`left`,`top`]);async function zc(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=uc(n),s=dc(n),c=mc(n)===`y`,l=Rc.has(o)?-1:1,u=a&&c?-1:1,d=lc(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}var Bc=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await zc(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},Vc=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i,platform:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:c={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...l}=lc(e,t),u={x:n,y:r},d=await a.detectOverflow(t,l),f=mc(i),p=fc(f),m=u[p],h=u[f],g=(e,t)=>cc(t+d[e===`y`?`top`:`left`],t,t-d[e===`y`?`bottom`:`right`]);o&&(m=g(p,m)),s&&(h=g(f,h));let _=c.fn({...t,[p]:m,[f]:h});return{..._,data:{x:_.x-n,y:_.y-r,enabled:{[p]:o,[f]:s}}}}}},Hc=function(e){return e===void 0&&(e={}),{options:e,fn(t){let{x:n,y:r,placement:i,rects:a,middlewareData:o}=t,{offset:s=0,mainAxis:c=!0,crossAxis:l=!0}=lc(e,t),u={x:n,y:r},d=mc(i),f=fc(d),p=u[f],m=u[d],h=lc(s,t),g=typeof h==`number`?{mainAxis:h,crossAxis:0}:{mainAxis:h.mainAxis??0,crossAxis:h.crossAxis??0};if(c){let e=f===`y`?`height`:`width`,t=a.reference[f]-a.floating[e]+g.mainAxis,n=a.reference[f]+a.reference[e]-g.mainAxis;pn&&(p=n)}if(l){let e=f===`y`?`width`:`height`,t=Rc.has(uc(i)),n=a.reference[d]-a.floating[e]+(t&&o.offset?.[d]||0)+(t?0:g.crossAxis),r=a.reference[d]+a.reference[e]+(t?0:o.offset?.[d]||0)-(t?g.crossAxis:0);mr&&(m=r)}return{[f]:p,[d]:m}}}},Uc=function(e){return e===void 0&&(e={}),{name:`size`,options:e,async fn(t){let{placement:n,rects:r,platform:i,elements:a}=t,{apply:o=()=>{},...s}=lc(e,t),c=await i.detectOverflow(t,s),l=uc(n),u=dc(n),d=mc(n)===`y`,{width:f,height:p}=r.floating,m,h;l===`top`||l===`bottom`?(m=l,h=u===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?`start`:`end`)?`left`:`right`):(h=l,m=u===`end`?`top`:`bottom`);let g=p-c.top-c.bottom,_=f-c.left-c.right,v=nc(p-c[m],g),y=nc(f-c[h],_),b=t.middlewareData.shift,x=!b,S=v,C=y;b!=null&&b.enabled.x&&(C=_),b!=null&&b.enabled.y&&(S=g),x&&!u&&(d?C=f-2*rc(c.left,c.right):S=p-2*rc(c.top,c.bottom)),await o({...t,availableWidth:C,availableHeight:S});let w=await i.getDimensions(a.floating);return f!==w.width||p!==w.height?{reset:{rects:!0}}:{}}}};function Wc(){return typeof window<`u`}function Gc(e){return Jc(e)?(e.nodeName||``).toLowerCase():`#document`}function Kc(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function qc(e){return((Jc(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function Jc(e){return Wc()?e instanceof Node||e instanceof Kc(e).Node:!1}function Yc(e){return Wc()?e instanceof Element||e instanceof Kc(e).Element:!1}function Xc(e){return Wc()?e instanceof HTMLElement||e instanceof Kc(e).HTMLElement:!1}function Zc(e){return!Wc()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof Kc(e).ShadowRoot}function Qc(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=ll(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&i!==`inline`&&i!==`contents`}function $c(e){return/^(table|td|th)$/.test(Gc(e))}function el(e){try{if(e.matches(`:popover-open`))return!0}catch{}try{return e.matches(`:modal`)}catch{return!1}}var tl=/transform|translate|scale|rotate|perspective|filter/,nl=/paint|layout|strict|content/,rl=e=>!!e&&e!==`none`,il;function al(e){let t=Yc(e)?ll(e):e;return rl(t.transform)||rl(t.translate)||rl(t.scale)||rl(t.rotate)||rl(t.perspective)||!sl()&&(rl(t.backdropFilter)||rl(t.filter))||tl.test(t.willChange||``)||nl.test(t.contain||``)}function ol(e){let t=dl(e);for(;Xc(t)&&!cl(t);){if(al(t))return t;if(el(t))return null;t=dl(t)}return null}function sl(){return il??=typeof CSS<`u`&&CSS.supports&&CSS.supports(`-webkit-backdrop-filter`,`none`),il}function cl(e){return/^(html|body|#document)$/.test(Gc(e))}function ll(e){return Kc(e).getComputedStyle(e)}function ul(e){return Yc(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function dl(e){if(Gc(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Zc(e)&&e.host||qc(e);return Zc(t)?t.host:t}function fl(e){let t=dl(e);return cl(t)?(e.ownerDocument||e).body:Xc(t)&&Qc(t)?t:fl(t)}function pl(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=fl(e),i=r===e.ownerDocument?.body,a=Kc(r);if(i){let e=ml(a);return t.concat(a,a.visualViewport||[],Qc(r)?r:[],e&&n?pl(e):[])}return t.concat(r,pl(r,[],n))}function ml(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function hl(e){let t=ll(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=Xc(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=ic(n)!==a||ic(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function gl(e){return Yc(e)?e:e.contextElement}function _l(e){let t=gl(e);if(!Xc(t))return oc(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=hl(t),o=(a?ic(n.width):n.width)/r,s=(a?ic(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}var vl=oc(0);function yl(e){let t=Kc(e);return!sl()||!t.visualViewport?vl:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function bl(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===Kc(e)}function xl(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=gl(e),o=oc(1);t&&(r?Yc(r)&&(o=_l(r)):o=_l(e));let s=bl(a,n,r)?yl(a):oc(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a&&r){let e=Kc(a),t=Yc(r)?Kc(r):r,n=e,i=ml(n);for(;i&&t!==n;){let e=_l(i),t=i.getBoundingClientRect(),r=ll(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=Kc(i),i=ml(n)}}return Oc({width:u,height:d,x:c,y:l})}function Sl(e,t){let n=ul(e).scrollLeft;return t?t.left+n:xl(qc(e)).left+n}function Cl(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-Sl(e,n),y:n.top+t.scrollTop}}function wl(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=qc(r),s=t?el(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=oc(1),u=oc(0),d=Xc(r);if((d||!a)&&((Gc(r)!==`body`||Qc(o))&&(c=ul(r)),d)){let e=xl(r);l=_l(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?Cl(o,c):oc(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function Tl(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function El(e){let t=ul(e),n=e.ownerDocument.body,r=rc(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),i=rc(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),a=-t.scrollLeft+Sl(e),o=-t.scrollTop;return ll(n).direction===`rtl`&&(a+=rc(e.clientWidth,n.clientWidth)-r),{width:r,height:i,x:a,y:o}}var Dl=25;function Ol(e,t,n){n===void 0&&(n=`viewport`);let r=n===`layoutViewport`,i=Kc(e),a=qc(e),o=i.visualViewport,s=a.clientWidth,c=a.clientHeight,l=0,u=0;if(o){let e=!sl()||t===`fixed`;r?e||(l=-o.offsetLeft,u=-o.offsetTop):(s=o.width,c=o.height,e&&(l=o.offsetLeft,u=o.offsetTop))}if(Sl(a)<=0){let e=a.ownerDocument,t=e.body,n=getComputedStyle(t),r=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(a.clientWidth-t.clientWidth-r),o=getComputedStyle(a).scrollbarGutter===`stable both-edges`?i/2:i;o<=Dl&&(s-=o)}return{width:s,height:c,x:l,y:u}}function kl(e,t){let n=xl(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=_l(e);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function Al(e,t,n){let r;if(t===`viewport`||t===`layoutViewport`)r=Ol(e,n,t);else if(t===`document`)r=El(qc(e));else if(Yc(t))r=kl(t,n);else{let n=yl(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return Oc(r)}function jl(e,t){let n=t.get(e);if(n)return n;let r=pl(e,[],!1).filter(e=>Yc(e)&&Gc(e)!==`body`),i=null,a=ll(e).position===`fixed`,o=a?dl(e):e;for(;Yc(o)&&!cl(o);){let e=ll(o),t=al(o),n=i?i.position:a?`fixed`:``;!t&&(n===`fixed`||n===`absolute`&&e.position===`static`)?r=r.filter(e=>e!==o):i=e,o=dl(o)}return t.set(e,r),r}function Ml(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?el(t)?[]:jl(t,this._c):[].concat(n),r],o=Al(t,a[0],i),s=o.top,c=o.right,l=o.bottom,u=o.left;for(let e=1;e{s(!1,1e-7)},1e3)}y=!1}try{r=new IntersectionObserver(b,{...v,root:a.ownerDocument})}catch{r=new IntersectionObserver(b,v)}r.observe(e)}let c=Kc(e),l=()=>s(n);return c.addEventListener(`resize`,l),s(!0),()=>{c.removeEventListener(`resize`,l),o()}}function zl(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=gl(e),u=i||a?[...l?pl(l):[],...t?pl(t):[]]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n),a&&e.addEventListener(`resize`,n)});let d=l&&s?X(l,n,a):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&t&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),t&&p.observe(t));let m,h=c?xl(e):null;c&&g();function g(){let t=xl(e);h&&!Y(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}var Bl=Bc,Vl=Vc,Hl=Pc,Ul=Uc,Wl=Lc,Gl=Nc,Kl=Hc,ql=(e,t,n)=>{let r=new Map,i=n??{},a={...J,...i.platform,_c:r};return Mc(e,t,{...i,platform:a})},Jl=typeof document<`u`?x.useLayoutEffect:function(){};function Yl(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e==`function`&&e.toString()===t.toString())return!0;let n,r,i;if(e&&t&&typeof e==`object`){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!Yl(e[r],t[r]))return!1;return!0}if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,i[r]))return!1;for(r=n;r--!==0;){let n=i[r];if(!(n===`_owner`&&e.$$typeof)&&!Yl(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function Xl(e){return typeof window>`u`?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Zl(e,t){let n=Xl(e);return Math.round(t*n)/n}function Ql(e){let t=x.useRef(e);return Jl(()=>{t.current=e}),t}function $l(e){e===void 0&&(e={});let{placement:t=`bottom`,strategy:n=`absolute`,middleware:r=[],platform:i,elements:{reference:a,floating:o}={},transform:s=!0,whileElementsMounted:c,open:l}=e,[u,d]=x.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[f,p]=x.useState(r);Yl(f,r)||p(r);let[m,h]=x.useState(null),[g,_]=x.useState(null),v=x.useCallback(e=>{e!==C.current&&(C.current=e,h(e))},[]),y=x.useCallback(e=>{e!==w.current&&(w.current=e,_(e))},[]),b=a||m,S=o||g,C=x.useRef(null),w=x.useRef(null),T=x.useRef(u),E=c!=null,D=Ql(c),O=Ql(i),ee=Ql(l),k=x.useCallback(()=>{if(!C.current||!w.current)return;let e={placement:t,strategy:n,middleware:f};O.current&&(e.platform=O.current),ql(C.current,w.current,e).then(e=>{let t={...e,isPositioned:ee.current!==!1};A.current&&!Yl(T.current,t)&&(T.current=t,ui.flushSync(()=>{d(t)}))})},[f,t,n,O,ee]);Jl(()=>{l===!1&&T.current.isPositioned&&(T.current.isPositioned=!1,d(e=>({...e,isPositioned:!1})))},[l]);let A=x.useRef(!1);Jl(()=>(A.current=!0,()=>{A.current=!1}),[]),Jl(()=>{if(b&&(C.current=b),S&&(w.current=S),b&&S){if(D.current)return D.current(b,S,k);k()}},[b,S,k,D,E]);let j=x.useMemo(()=>({reference:C,floating:w,setReference:v,setFloating:y}),[v,y]),te=x.useMemo(()=>({reference:b,floating:S}),[b,S]),M=x.useMemo(()=>{let e={position:n,left:0,top:0};if(!te.floating)return e;let t=Zl(te.floating,u.x),r=Zl(te.floating,u.y);return s?{...e,transform:`translate(`+t+`px, `+r+`px)`,...Xl(te.floating)>=1.5&&{willChange:`transform`}}:{position:n,left:t,top:r}},[n,s,te.floating,u.x,u.y]);return x.useMemo(()=>({...u,update:k,refs:j,elements:te,floatingStyles:M}),[u,k,j,te,M])}var eu=e=>{function t(e){return{}.hasOwnProperty.call(e,`current`)}return{name:`arrow`,options:e,fn(n){let{element:r,padding:i}=typeof e==`function`?e(n):e;return r&&t(r)?r.current==null?{}:Gl({element:r.current,padding:i}).fn(n):r?Gl({element:r,padding:i}).fn(n):{}}}},tu=(e,t)=>{let n=Bl(e);return{name:n.name,fn:n.fn,options:[e,t]}},nu=(e,t)=>{let n=Vl(e);return{name:n.name,fn:n.fn,options:[e,t]}},ru=(e,t)=>({fn:Kl(e).fn,options:[e,t]}),iu=(e,t)=>{let n=Hl(e);return{name:n.name,fn:n.fn,options:[e,t]}},au=(e,t)=>{let n=Ul(e);return{name:n.name,fn:n.fn,options:[e,t]}},ou=(e,t)=>{let n=Wl(e);return{name:n.name,fn:n.fn,options:[e,t]}},su=(e,t)=>{let n=eu(e);return{name:n.name,fn:n.fn,options:[e,t]}},cu=Object.defineProperty,lu=(e,t)=>cu(e,`name`,{value:t,configurable:!0}),uu=`Popper`,[du,fu]=vi(uu),[pu,mu]=du(uu),hu=lu(e=>{let{__scopePopper:t,children:n}=e,[r,i]=x.useState(null),[a,o]=x.useState(void 0);return(0,S.jsx)(pu,{scope:t,anchor:r,onAnchorChange:i,placementState:a,setPlacementState:o,children:n})},`Popper`),gu=`PopperAnchor`,_u=x.forwardRef(lu(function(e,t){let{__scopePopper:n,virtualRef:r,...i}=e,a=mu(gu,n),o=x.useRef(null),s=a.onAnchorChange,c=H(t,x.useCallback(e=>{o.current=e,e&&s(e)},[s])),l=x.useRef(null);x.useEffect(()=>{if(!r)return;let e=l.current;l.current=r.current,e!==l.current&&s(l.current)});let u=a.placementState&&wu(a.placementState),d=u?.[0],f=u?.[1];return r?null:(0,S.jsx)(pi.div,{"data-radix-popper-side":d,"data-radix-popper-align":f,...i,ref:c})},`PopperAnchor`)),vu=`PopperContent`,[yu,bu]=du(vu),xu=x.forwardRef(lu(function(e,t){let{__scopePopper:n,side:r=`bottom`,sideOffset:i=0,align:a=`center`,alignOffset:o=0,arrowPadding:s=0,avoidCollisions:c=!0,collisionBoundary:l=[],collisionPadding:u=0,sticky:d=`partial`,hideWhenDetached:f=!1,updatePositionStrategy:p=`optimized`,onPlaced:m,...h}=e,g=mu(vu,n),[_,v]=x.useState(null),y=H(t,v),[b,C]=x.useState(null),w=ec(b),T=w?.width??0,E=w?.height??0,D=r+(a===`center`?``:`-`+a),O=typeof u==`number`?u:{top:0,right:0,bottom:0,left:0,...u},ee=Array.isArray(l)?l:[l],k=ee.length>0,A={padding:O,boundary:ee.filter(Su),altBoundary:k},{refs:j,floatingStyles:te,placement:M,isPositioned:ne,middlewareData:N}=$l({strategy:`fixed`,placement:D,whileElementsMounted:lu((...e)=>zl(...e,{animationFrame:p===`always`}),`whileElementsMounted`),elements:{reference:g.anchor},middleware:[tu({mainAxis:i+E,alignmentAxis:o}),c&&nu({mainAxis:!0,crossAxis:!1,limiter:d===`partial`?ru():void 0,...A}),c&&iu({...A}),au({...A,apply:lu(({elements:e,rects:t,availableWidth:n,availableHeight:r})=>{let{width:i,height:a}=t.reference,o=e.floating.style;o.setProperty(`--radix-popper-available-width`,`${n}px`),o.setProperty(`--radix-popper-available-height`,`${r}px`),o.setProperty(`--radix-popper-anchor-width`,`${i}px`),o.setProperty(`--radix-popper-anchor-height`,`${a}px`)},`apply`)}),b&&su({element:b,padding:s}),Cu({arrowWidth:T,arrowHeight:E}),f&&ou({strategy:`referenceHidden`,...A,boundary:k?A.boundary:void 0})]}),P=g.setPlacementState;zi(()=>(P(M),()=>{P(void 0)}),[M,P]);let[re,ie]=wu(M),ae=ya(m);zi(()=>{ne&&ae?.()},[ne,ae]);let F=N.arrow?.x,I=N.arrow?.y,L=N.arrow?.centerOffset!==0,[oe,se]=x.useState();return zi(()=>{_&&se(window.getComputedStyle(_).zIndex)},[_]),(0,S.jsx)(`div`,{ref:j.setFloating,"data-radix-popper-content-wrapper":``,style:{...te,transform:ne?te.transform:`translate(0, -200%)`,minWidth:`max-content`,zIndex:oe,"--radix-popper-transform-origin":[N.transformOrigin?.x,N.transformOrigin?.y].join(` `),...N.hide?.referenceHidden&&{visibility:`hidden`,pointerEvents:`none`}},dir:e.dir,children:(0,S.jsx)(yu,{scope:n,placedSide:re,placedAlign:ie,onArrowChange:C,arrowX:F,arrowY:I,shouldHideArrow:L,children:(0,S.jsx)(pi.div,{"data-side":re,"data-align":ie,...h,ref:y,style:{...h.style,animation:ne?h.style?.animation:`none`}})})})},`PopperContent`));function Su(e){return e!==null}lu(Su,`isNotNull`);var Cu=lu(e=>({name:`transformOrigin`,options:e,fn(t){let{placement:n,rects:r,middlewareData:i}=t,a=i.arrow?.centerOffset!==0,o=a?0:e.arrowWidth,s=a?0:e.arrowHeight,[c,l]=wu(n),u={start:`0%`,center:`50%`,end:`100%`}[l],d=(i.arrow?.x??0)+o/2,f=(i.arrow?.y??0)+s/2,p=``,m=``;return c===`bottom`?(p=a?u:`${d}px`,m=`${-s}px`):c===`top`?(p=a?u:`${d}px`,m=`${r.floating.height+s}px`):c===`right`?(p=`${-s}px`,m=a?u:`${f}px`):c===`left`&&(p=`${r.floating.width+s}px`,m=a?u:`${f}px`),{data:{x:p,y:m}}}}),`transformOrigin`);function wu(e){let[t,n=`center`]=e.split(`-`);return[t,n]}lu(wu,`getSideAndAlignFromPlacement`);var Tu=hu,Eu=_u,Du=xu,Ou=Object.defineProperty,ku=(e,t)=>Ou(e,`name`,{value:t,configurable:!0}),Au=!1;function ju(){let[e,t]=x.useState(Au);return x.useEffect(()=>{Au||(Au=!0,t(!0))},[]),e}ku(ju,`useIsHydrated`);var Mu=x.useSyncExternalStore;function Nu(){return()=>{}}ku(Nu,`subscribe`);function Pu(){return Mu(Nu,()=>!0,()=>!1)}ku(Pu,`useIsHydratedModern`);var Fu=typeof Mu==`function`?Pu:ju,Iu=Object.defineProperty,Lu=(e,t)=>Iu(e,`name`,{value:t,configurable:!0}),Ru=`rovingFocusGroup.onEntryFocus`,zu={bubbles:!1,cancelable:!0},Bu=`RovingFocusGroup`,[Vu,Hu,Uu]=Si(Bu),[Wu,Z]=vi(Bu,[Uu]),[Gu,Ku]=Wu(Bu),qu=x.forwardRef(Lu(function(e,t){return(0,S.jsx)(Vu.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,S.jsx)(Vu.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,S.jsx)(Ju,{...e,ref:t})})})},`RovingFocusGroup`)),Ju=x.forwardRef(Lu(function(e,t){let{__scopeRovingFocusGroup:n,orientation:r,loop:i=!1,dir:a,currentTabStopId:o,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:c,onEntryFocus:l,preventScrollOnEntryFocus:u=!1,...d}=e,f=x.useRef(null),p=H(t,f),m=ga(a),[h,g]=Ji({prop:o,defaultProp:s??null,onChange:c,caller:Bu}),[_,v]=x.useState(!1),y=ya(l),b=Hu(n),C=x.useRef(!1),[w,T]=x.useState(0);return x.useEffect(()=>{let e=f.current;if(e)return e.addEventListener(Ru,y),()=>e.removeEventListener(Ru,y)},[y]),(0,S.jsx)(Gu,{scope:n,orientation:r,dir:m,loop:i,currentTabStopId:h,onItemFocus:x.useCallback(e=>g(e),[g]),onItemShiftTab:x.useCallback(()=>v(!0),[]),onFocusableItemAdd:x.useCallback(()=>T(e=>e+1),[]),onFocusableItemRemove:x.useCallback(()=>T(e=>e-1),[]),children:(0,S.jsx)(pi.div,{tabIndex:_||w===0?-1:0,"data-orientation":r,...d,ref:p,style:{outline:`none`,...e.style},onMouseDown:W(e.onMouseDown,()=>{C.current=!0}),onFocus:W(e.onFocus,e=>{let t=!C.current;if(e.target===e.currentTarget&&t&&!_){let t=new CustomEvent(Ru,zu);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=b().filter(e=>e.focusable);ed([e.find(e=>e.active),e.find(e=>e.id===h),...e].filter(Boolean).map(e=>e.ref.current),u)}}C.current=!1}),onBlur:W(e.onBlur,()=>v(!1))})})},`RovingFocusGroupImpl`)),Yu=`RovingFocusGroupItem`,Xu=x.forwardRef(Lu(function(e,t){let{__scopeRovingFocusGroup:n,focusable:r=!0,active:i=!1,tabStopId:a,children:o,...s}=e,c=fa(),l=a||c,u=Ku(Yu,n),d=u.currentTabStopId===l,f=Hu(n),{onFocusableItemAdd:p,onFocusableItemRemove:m,currentTabStopId:h}=u,g=Fu();return zi(()=>{if(g&&r)return p(),()=>m()},[g,r,p,m]),x.useEffect(()=>{if(!g&&r)return p(),()=>m()},[g,r,p,m]),(0,S.jsx)(Vu.ItemSlot,{scope:n,id:l,focusable:r,active:i,children:(0,S.jsx)(pi.span,{tabIndex:d?0:-1,"data-orientation":u.orientation,...s,ref:t,onMouseDown:W(e.onMouseDown,e=>{r?u.onItemFocus(l):e.preventDefault()}),onFocus:W(e.onFocus,()=>u.onItemFocus(l)),onKeyDown:W(e.onKeyDown,e=>{if(e.key===`Tab`&&e.shiftKey){u.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=$u(e,u.orientation,u.dir);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let n=f().filter(e=>e.focusable).map(e=>e.ref.current);if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=u.loop?td(n,r+1):n.slice(r+1)}setTimeout(()=>ed(n))}}),children:typeof o==`function`?o({isCurrentTabStop:d,hasTabStop:h!=null}):o})})},`RovingFocusGroupItem`)),Zu={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function Qu(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}Lu(Qu,`getDirectionAwareKey`);function $u(e,t,n){let r=Qu(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return Zu[r]}Lu($u,`getFocusIntent`);function ed(e,t=!1){let n=document.activeElement;for(let r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}Lu(ed,`focusFirst`);function td(e,t){return e.map((n,r)=>e[(t+r)%e.length])}Lu(td,`wrapArray`);var nd=qu,rd=Xu,id=Object.defineProperty,ad=(e,t)=>id(e,`name`,{value:t,configurable:!0}),od=[`Enter`,` `],sd=[`ArrowDown`,`PageUp`,`Home`],cd=[`ArrowUp`,`PageDown`,`End`],ld=[...sd,...cd];[...od],[...od];var ud=`Menu`,[dd,fd,pd]=Si(ud),[md,hd]=vi(ud,[pd,fu,Z]),gd=fu(),_d=Z(),[vd,yd]=md(ud),[Q,bd]=md(ud),xd=ad(e=>{let{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:a,modal:o=!0}=e,s=gd(t),[c,l]=x.useState(null),u=x.useRef(!1),d=ya(a),f=ga(i);return x.useEffect(()=>{let e=ad(()=>{u.current=!0,document.addEventListener(`pointerdown`,t,{capture:!0,once:!0}),document.addEventListener(`pointermove`,t,{capture:!0,once:!0})},`handleKeyDown`),t=ad(()=>u.current=!1,`handlePointer`);return document.addEventListener(`keydown`,e,{capture:!0}),()=>{document.removeEventListener(`keydown`,e,{capture:!0}),document.removeEventListener(`pointerdown`,t,{capture:!0}),document.removeEventListener(`pointermove`,t,{capture:!0})}},[]),x.useEffect(()=>{if(!n)return;let e=ad(()=>d(!1),`handleBlur`);return window.addEventListener(`blur`,e),()=>window.removeEventListener(`blur`,e)},[n,d]),(0,S.jsx)(Tu,{...s,children:(0,S.jsx)(vd,{scope:t,open:n,onOpenChange:d,content:c,onContentChange:l,children:(0,S.jsx)(Q,{scope:t,onClose:x.useCallback(()=>d(!1),[d]),isUsingKeyboardRef:u,dir:f,modal:o,children:r})})})},`Menu`),Sd=x.forwardRef(ad(function(e,t){let{__scopeMenu:n,...r}=e,i=gd(n);return(0,S.jsx)(Eu,{...i,...r,ref:t})},`MenuAnchor`)),Cd=`MenuPortal`,[wd,Td]=md(Cd,{forceMount:void 0}),Ed=ad(e=>{let{__scopeMenu:t,forceMount:n,children:r,container:i}=e,a=yd(Cd,t);return(0,S.jsx)(wd,{scope:t,forceMount:n,children:(0,S.jsx)(na,{present:n||a.open,children:(0,S.jsx)(Qa,{asChild:!0,container:i,children:r})})})},`MenuPortal`),Dd=`MenuContent`,[Od,kd]=md(Dd),Ad=x.forwardRef(ad(function(e,t){let n=Td(Dd,e.__scopeMenu),{forceMount:r=n.forceMount,...i}=e,a=yd(Dd,e.__scopeMenu),o=bd(Dd,e.__scopeMenu);return(0,S.jsx)(dd.Provider,{scope:e.__scopeMenu,children:(0,S.jsx)(na,{present:r||a.open,children:(0,S.jsx)(dd.Slot,{scope:e.__scopeMenu,children:o.modal?(0,S.jsx)(jd,{...i,ref:t}):(0,S.jsx)(Md,{...i,ref:t})})})})},`MenuContent`)),jd=x.forwardRef(ad(function(e,t){let n=yd(Dd,e.__scopeMenu),r=x.useRef(null),i=H(t,r);return x.useEffect(()=>{let e=r.current;if(e)return Cs(e)},[]),(0,S.jsx)(Pd,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:W(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})},`MenuRootContentModal`)),Md=x.forwardRef(ad(function(e,t){let n=yd(Dd,e.__scopeMenu);return(0,S.jsx)(Pd,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})},`MenuRootContentNonModal`)),Nd=Xr(`MenuContent.ScrollLock`),Pd=x.forwardRef(ad(function(e,t){let{__scopeMenu:n,loop:r=!1,trapFocus:i,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:s,onEntryFocus:c,onEscapeKeyDown:l,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:f,onDismiss:p,disableOutsideScroll:m,...h}=e,g=yd(Dd,n),_=bd(Dd,n),v=gd(n),y=_d(n),b=fd(n),[C,w]=x.useState(null),T=x.useRef(null),E=H(t,T,g.onContentChange),D=x.useRef(0),O=x.useRef(``),ee=x.useRef(0),k=x.useRef(null),A=x.useRef(`right`),j=x.useRef(0),te=m?ms:x.Fragment,M=m?{as:Nd,allowPinchZoom:!0}:void 0,ne=ad(e=>{let t=O.current+e,n=b().filter(e=>!e.disabled),r=document.activeElement,i=n.find(e=>e.ref.current===r)?.textValue,a=Zd(n.map(e=>e.textValue),t,i),o=n.find(e=>e.textValue===a)?.ref.current;ad((function e(t){O.current=t,window.clearTimeout(D.current),t!==``&&(D.current=window.setTimeout(()=>e(``),1e3))}),`updateSearch`)(t),o&&setTimeout(()=>o.focus())},`handleTypeaheadSearch`);x.useEffect(()=>()=>window.clearTimeout(D.current),[]),io();let N=x.useCallback(e=>A.current===k.current?.side&&$d(e,k.current?.area),[]);return(0,S.jsx)(Od,{scope:n,searchRef:O,onItemEnter:x.useCallback(e=>{N(e)&&e.preventDefault()},[N]),onItemLeave:x.useCallback(e=>{N(e)||(T.current?.focus(),w(null))},[N]),onTriggerLeave:x.useCallback(e=>{N(e)&&e.preventDefault()},[N]),pointerGraceTimerRef:ee,onPointerGraceIntentChange:x.useCallback(e=>{k.current=e},[]),children:(0,S.jsx)(te,{...M,children:(0,S.jsx)(za,{asChild:!0,trapped:i,onMountAutoFocus:W(a,e=>{e.preventDefault(),T.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:o,children:(0,S.jsx)(Da,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:l,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:f,onDismiss:p,children:(0,S.jsx)(nd,{asChild:!0,...y,dir:_.dir,orientation:`vertical`,loop:r,currentTabStopId:C,onCurrentTabStopIdChange:w,onEntryFocus:W(c,e=>{_.isUsingKeyboardRef.current||e.preventDefault()}),preventScrollOnEntryFocus:!0,children:(0,S.jsx)(Du,{role:`menu`,"aria-orientation":`vertical`,"data-state":Kd(g.open),"data-radix-menu-content":``,dir:_.dir,...v,...h,ref:E,style:{outline:`none`,...h.style},onKeyDown:W(h.onKeyDown,e=>{let t=e.target.closest(`[data-radix-menu-content]`)===e.currentTarget,n=e.ctrlKey||e.altKey||e.metaKey,r=e.key.length===1;t&&(e.key===`Tab`&&e.preventDefault(),!n&&r&&ne(e.key));let i=T.current;if(e.target!==i||!ld.includes(e.key))return;e.preventDefault();let a=b().filter(e=>!e.disabled).map(e=>e.ref.current);cd.includes(e.key)&&a.reverse(),Yd(a)}),onBlur:W(e.onBlur,e=>{e.currentTarget.contains(e.target)||(window.clearTimeout(D.current),O.current=``)}),onPointerMove:W(e.onPointerMove,ef(e=>{let t=e.target,n=j.current!==e.clientX;if(e.currentTarget.contains(t)&&n){let t=e.clientX>j.current?`right`:`left`;A.current=t,j.current=e.clientX}}))})})})})})})},`MenuContentImpl`)),Fd=x.forwardRef(ad(function(e,t){let{__scopeMenu:n,...r}=e;return(0,S.jsx)(pi.div,{role:`group`,...r,ref:t})},`MenuGroup`)),Id=`MenuItem`,Ld=`menu.itemSelect`,Rd=x.forwardRef(ad(function(e,t){let{disabled:n=!1,onSelect:r,...i}=e,a=x.useRef(null),o=bd(Id,e.__scopeMenu),s=kd(Id,e.__scopeMenu),c=H(t,a),l=x.useRef(!1),u=ad(()=>{let e=a.current;if(!n&&e){let t=new CustomEvent(Ld,{bubbles:!0,cancelable:!0});e.addEventListener(Ld,e=>r?.(e),{once:!0}),mi(e,t),t.defaultPrevented?l.current=!1:o.onClose()}},`handleSelect`);return(0,S.jsx)(zd,{...i,ref:c,disabled:n,onClick:W(e.onClick,u),onPointerDown:t=>{e.onPointerDown?.(t),l.current=!0},onPointerUp:W(e.onPointerUp,e=>{l.current||e.currentTarget?.click()}),onKeyDown:W(e.onKeyDown,e=>{n||e.target!==e.currentTarget||(s.searchRef.current===``||e.key!==` `)&&od.includes(e.key)&&(e.currentTarget.click(),e.preventDefault())})})},`MenuItem`)),zd=x.forwardRef(ad(function(e,t){let{__scopeMenu:n,disabled:r=!1,textValue:i,...a}=e,o=kd(Id,n),s=_d(n),c=x.useRef(null),l=H(t,c),[u,d]=x.useState(!1),[f,p]=x.useState(``);return x.useEffect(()=>{let e=c.current;e&&p((e.textContent??``).trim())},[a.children]),(0,S.jsx)(dd.ItemSlot,{scope:n,disabled:r,textValue:i??f,children:(0,S.jsx)(rd,{asChild:!0,...s,focusable:!r,children:(0,S.jsx)(pi.div,{role:`menuitem`,"data-highlighted":u?``:void 0,"aria-disabled":r||void 0,"data-disabled":r?``:void 0,...a,ref:l,onPointerMove:W(e.onPointerMove,ef(e=>{r?o.onItemLeave(e):(o.onItemEnter(e),e.defaultPrevented||e.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:W(e.onPointerLeave,ef(e=>o.onItemLeave(e))),onFocus:W(e.onFocus,()=>d(!0)),onBlur:W(e.onBlur,()=>d(!1))})})})},`MenuItemImpl`)),[Bd,Vd]=md(`MenuRadioGroup`,{value:void 0,onValueChange:ad(()=>{},`onValueChange`)}),[Hd,Ud]=md(`MenuItemIndicator`,{checked:!1}),[Wd,Gd]=md(`MenuSub`);function Kd(e){return e?`open`:`closed`}ad(Kd,`getOpenState`);function qd(e){return e===`indeterminate`}ad(qd,`isIndeterminate`);function Jd(e){return qd(e)?`indeterminate`:e?`checked`:`unchecked`}ad(Jd,`getCheckedState`);function Yd(e){let t=document.activeElement;for(let n of e)if(n===t||(n.focus(),document.activeElement!==t))return}ad(Yd,`focusFirst`);function Xd(e,t){return e.map((n,r)=>e[(t+r)%e.length])}ad(Xd,`wrapArray`);function Zd(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=Xd(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}ad(Zd,`getNextMatch`);function Qd(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;er!=d>r&&n<(u-c)*(r-l)/(d-l)+c&&(i=!i)}return i}ad(Qd,`isPointInPolygon`);function $d(e,t){return t?Qd({x:e.clientX,y:e.clientY},t):!1}ad($d,`isPointerInGraceArea`);function ef(e){return t=>t.pointerType===`mouse`?e(t):void 0}ad(ef,`whenMouse`);var tf=xd,nf=Sd,rf=Ed,af=Ad,of=Fd,sf=Rd,cf=Object.defineProperty,lf=(e,t)=>cf(e,`name`,{value:t,configurable:!0}),uf=`DropdownMenu`,[df,ff]=vi(uf,[hd]),pf=hd(),[mf,hf]=df(uf),gf=lf(e=>{let{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:a,onOpenChange:o,modal:s=!0}=e,c=pf(t),l=x.useRef(null),[u,d]=Ji({prop:i,defaultProp:a??!1,onChange:o,caller:uf});return(0,S.jsx)(mf,{scope:t,triggerId:fa(),triggerRef:l,contentId:fa(),open:u,onOpenChange:d,onOpenToggle:x.useCallback(()=>d(e=>!e),[d]),modal:s,children:(0,S.jsx)(tf,{...c,open:u,onOpenChange:d,dir:r,modal:s,children:n})})},`DropdownMenu`),_f=`DropdownMenuTrigger`,vf=x.forwardRef(lf(function(e,t){let{__scopeDropdownMenu:n,disabled:r=!1,...i}=e,a=hf(_f,n),o=pf(n),s=H(t,a.triggerRef);return(0,S.jsx)(nf,{asChild:!0,...o,children:(0,S.jsx)(pi.button,{type:`button`,id:a.triggerId,"aria-haspopup":`menu`,"aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":a.open?`open`:`closed`,"data-disabled":r?``:void 0,disabled:r,...i,ref:s,onPointerDown:W(e.onPointerDown,e=>{!r&&e.button===0&&e.ctrlKey===!1&&(a.onOpenToggle(),a.open||e.preventDefault())}),onKeyDown:W(e.onKeyDown,e=>{r||([`Enter`,` `].includes(e.key)&&a.onOpenToggle(),e.key===`ArrowDown`&&a.onOpenChange(!0),[`Enter`,` `,`ArrowDown`].includes(e.key)&&e.preventDefault())})})})},`DropdownMenuTrigger`)),yf=lf(e=>{let{__scopeDropdownMenu:t,...n}=e,r=pf(t);return(0,S.jsx)(rf,{...r,...n})},`DropdownMenuPortal`),bf=`DropdownMenuContent`,xf=x.forwardRef(lf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=hf(bf,n),a=pf(n),o=x.useRef(!1);return(0,S.jsx)(af,{id:i.contentId,"aria-labelledby":i.triggerId,...a,...r,ref:t,onCloseAutoFocus:W(e.onCloseAutoFocus,e=>{o.current||i.triggerRef.current?.focus(),o.current=!1,e.preventDefault()}),onInteractOutside:W(e.onInteractOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0,r=t.button===2||n;(!i.modal||r)&&(o.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-dropdown-menu-content-available-width":`var(--radix-popper-available-width)`,"--radix-dropdown-menu-content-available-height":`var(--radix-popper-available-height)`,"--radix-dropdown-menu-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-dropdown-menu-trigger-height":`var(--radix-popper-anchor-height)`}})},`DropdownMenuContent`)),Sf=x.forwardRef(lf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=pf(n);return(0,S.jsx)(of,{...i,...r,ref:t})},`DropdownMenuGroup`)),Cf=x.forwardRef(lf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=pf(n);return(0,S.jsx)(sf,{...i,...r,ref:t})},`DropdownMenuItem`)),wf=gf,Tf=vf,Ef=yf,Df=xf,Of=Sf,kf=Cf,Af=Object.defineProperty,jf=x.forwardRef(((e,t)=>Af(e,`name`,{value:t,configurable:!0}))(function(e,t){return(0,S.jsx)(pi.label,{...e,ref:t,onMouseDown:t=>{t.target.closest(`button, input, select, textarea`)||(e.onMouseDown?.(t),!t.defaultPrevented&&t.detail>1&&t.preventDefault())}})},`Label`)),Mf=Object.defineProperty,Nf=(e,t)=>Mf(e,`name`,{value:t,configurable:!0}),Pf=`Tabs`,[Ff,If]=vi(Pf,[Z]),Lf=Z(),[Rf,zf]=Ff(Pf),Bf=x.forwardRef(Nf(function(e,t){let{__scopeTabs:n,value:r,onValueChange:i,defaultValue:a,orientation:o=`horizontal`,dir:s,activationMode:c=`automatic`,...l}=e,u=ga(s),[d,f]=Ji({prop:r,onChange:i,defaultProp:a??``,caller:Pf});return(0,S.jsx)(Rf,{scope:n,baseId:fa(),value:d,onValueChange:f,orientation:o,dir:u,activationMode:c,children:(0,S.jsx)(pi.div,{dir:u,"data-orientation":o,...l,ref:t})})},`Tabs`)),Vf=`TabsList`,Hf=x.forwardRef(Nf(function(e,t){let{__scopeTabs:n,loop:r=!0,...i}=e,a=zf(Vf,n),o=Lf(n);return(0,S.jsx)(nd,{asChild:!0,...o,orientation:a.orientation,dir:a.dir,loop:r,children:(0,S.jsx)(pi.div,{role:`tablist`,"aria-orientation":a.orientation,...i,ref:t})})},`TabsList`)),Uf=`TabsTrigger`,Wf=x.forwardRef(Nf(function(e,t){let{__scopeTabs:n,value:r,disabled:i=!1,...a}=e,o=zf(Uf,n),s=Lf(n),c=qf(o.baseId,r),l=Jf(o.baseId,r),u=r===o.value;return(0,S.jsx)(rd,{asChild:!0,...s,focusable:!i,active:u,children:(0,S.jsx)(pi.button,{type:`button`,role:`tab`,"aria-selected":u,"aria-controls":l,"data-state":u?`active`:`inactive`,"data-disabled":i?``:void 0,disabled:i,id:c,...a,ref:t,onMouseDown:W(e.onMouseDown,e=>{!i&&e.button===0&&e.ctrlKey===!1?o.onValueChange(r):e.preventDefault()}),onKeyDown:W(e.onKeyDown,e=>{i||e.target!==e.currentTarget||[` `,`Enter`].includes(e.key)&&o.onValueChange(r)}),onFocus:W(e.onFocus,()=>{let e=o.activationMode!==`manual`;!u&&!i&&e&&o.onValueChange(r)})})})},`TabsTrigger`)),Gf=`TabsContent`,Kf=x.forwardRef(Nf(function(e,t){let{__scopeTabs:n,value:r,forceMount:i,children:a,...o}=e,s=zf(Gf,n),c=qf(s.baseId,r),l=Jf(s.baseId,r),u=r===s.value,d=x.useRef(u);return x.useEffect(()=>{let e=requestAnimationFrame(()=>d.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,S.jsx)(na,{present:i||u,children:({present:n})=>(0,S.jsx)(pi.div,{"data-state":u?`active`:`inactive`,"data-orientation":s.orientation,role:`tabpanel`,"aria-labelledby":c,hidden:!n,id:l,tabIndex:0,...o,ref:t,style:{...e.style,animationDuration:d.current?`0s`:void 0},children:n&&a})})},`TabsContent`));function qf(e,t){return`${e}-trigger-${t}`}Nf(qf,`makeTriggerId`);function Jf(e,t){return`${e}-content-${t}`}Nf(Jf,`makeContentId`);var Yf=Bf,Xf=Hf,Zf=Wf,Qf=Kf,$f=vn(`inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40`,outline:`border bg-background hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-9 px-4 py-2 has-[>svg]:px-3`,xs:`h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5`,lg:`h-10 rounded-md px-6 has-[>svg]:px-4`,icon:`size-9`,"icon-xs":`size-6 rounded-md [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-8`,"icon-lg":`size-10`}},defaultVariants:{variant:`default`,size:`default`}});function $({className:e,variant:t=`default`,size:n=`default`,asChild:r=!1,...i}){let a=r?Zr:`button`;return(0,S.jsx)(a,{"data-slot":`button`,"data-variant":t,"data-size":n,className:V($f({variant:t,size:n,className:e})),...i})}var ep=null;function tp(){return window.turnstile?Promise.resolve(window.turnstile):ep||(ep=new Promise((e,t)=>{let n=document.createElement(`script`);n.src=`https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit`,n.async=!0;let r=()=>{clearTimeout(i),n.onload=null,n.onerror=null,n.remove(),t(Error(`turnstile_unavailable`))},i=window.setTimeout(r,15e3);n.onerror=r,n.onload=()=>{if(!window.turnstile)return r();clearTimeout(i),n.onload=null,n.onerror=null,e(window.turnstile)},document.head.appendChild(n)}).catch(e=>{throw ep=null,e}),ep)}function np({siteKey:e,action:t,onToken:n,busy:r}){let i=(0,x.useRef)(null),[a,o]=(0,x.useState)(0),[s,c]=(0,x.useState)(`checking`);return(0,x.useEffect)(()=>{let r=!1,a,o;n(``),c(`checking`);let s=e=>{r||(n(``),c(e))};return tp().then(l=>{!r&&i.current&&(a=l,o=a.render(i.current,{sitekey:e,action:t,size:`flexible`,"response-field":!1,callback:e=>{r||(n(e),c(`ready`))},"error-callback":()=>s(`error`),"expired-callback":()=>s(`expired`),"timeout-callback":()=>s(`expired`),"unsupported-callback":()=>s(`error`)}))}).catch(()=>s(`error`)),()=>{r=!0,o!==void 0&&a?.remove(o)}},[e,t,a,n]),(0,S.jsxs)(`div`,{className:`min-w-0 space-y-2`,"aria-label":`Security verification`,children:[(0,S.jsx)(`div`,{ref:i}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,role:`status`,"aria-live":`polite`,children:s===`checking`?`Checking your browser…`:s===`ready`?`Security check complete.`:s===`expired`?`Security check expired. Please verify again.`:`Security check could not load. Check your connection and try again.`}),(s===`error`||s===`expired`)&&(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:r,onClick:()=>o(e=>e+1),children:`Retry security check`})]})}function rp({className:e,...t}){return(0,S.jsx)(jf,{"data-slot":`label`,className:V(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}function ip({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`field-group`,className:V(`group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4`,e),...t})}var ap=vn(`group/field flex w-full gap-3 data-[invalid=true]:text-destructive`,{variants:{orientation:{vertical:[`flex-col [&>*]:w-full [&>.sr-only]:w-auto`],horizontal:[`flex-row items-center`,`[&>[data-slot=field-label]]:flex-auto`,`has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px`],responsive:[`flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto`,`@md/field-group:[&>[data-slot=field-label]]:flex-auto`,`@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px`]}},defaultVariants:{orientation:`vertical`}});function op({className:e,orientation:t=`vertical`,...n}){return(0,S.jsx)(`div`,{role:`group`,"data-slot":`field`,"data-orientation":t,className:V(ap({orientation:t}),e),...n})}function sp({className:e,...t}){return(0,S.jsx)(rp,{"data-slot":`field-label`,className:V(`group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50`,`has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4`,`has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10`,e),...t})}function cp({className:e,...t}){return(0,S.jsx)(`p`,{"data-slot":`field-description`,className:V(`text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance`,`last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5`,`[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary`,e),...t})}function lp(e){if(e.apiVersion!==1||!/^[a-z][a-z0-9-]*$/.test(e.id))throw Error(`Invalid theme pack: ${e.id}`);return e}var up=lp({apiVersion:1,id:`precision`,name:`Precision`,description:`Clear typography, quiet surfaces, and a cobalt accent.`}),dp=Object.assign({"./packs/precision/index.ts":up}),fp=`precision`,pp=Object.values(dp).sort((e,t)=>e.id===`precision`?-1:t.id===`precision`?1:e.name.localeCompare(t.name)),mp=new Map;for(let e of pp){if(mp.has(e.id))throw Error(`Duplicate theme pack: ${e.id}`);mp.set(e.id,e)}if(!mp.has(`precision`))throw Error(`The default theme is required`);function hp(e){return mp.get(e)||mp.get(`precision`)}var gp={themeId:fp,appearance:`light`},_p=e=>e===`light`||e===`dark`||e===`system`,vp=e=>`dispatch:theme:v1:${e}`;function yp(e){try{let t=e?localStorage.getItem(vp(e)):null;if(!t)return gp;let n=JSON.parse(t);return!n||typeof n!=`object`?gp:{themeId:hp(n.themeId).id,appearance:_p(n.appearance)?n.appearance:`light`}}catch{return gp}}var bp=(0,x.createContext)(null);function xp({userId:e,children:t}){let[n,r]=(0,x.useState)(()=>({userId:e,preference:yp(e),storageUnavailable:!1}));n.userId!==e&&r({userId:e,preference:yp(e),storageUnavailable:!1});let{preference:i,storageUnavailable:a}=n,{appearance:o,themeId:s}=i,c=hp(s),[l,u]=(0,x.useState)(()=>matchMedia(`(prefers-color-scheme: dark)`).matches),d=o===`system`?l?`dark`:`light`:o;(0,x.useLayoutEffect)(()=>{document.documentElement.dataset.theme=d,document.documentElement.dataset.themePack=c.id,document.querySelector(`meta[name="theme-color"]`)?.setAttribute(`content`,getComputedStyle(document.documentElement).getPropertyValue(`--background`).trim())},[d,c.id]),(0,x.useEffect)(()=>{let e=matchMedia(`(prefers-color-scheme: dark)`),t=()=>u(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),(0,x.useEffect)(()=>{if(!e)return;let t=t=>{(t.key===null||t.key===vp(e))&&r(t=>t.userId===e?{...t,preference:yp(e)}:t)};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},[e]);function f(t){let n=!1;try{if(!e)return;localStorage.setItem(vp(e),JSON.stringify(t))}catch{n=!0}r({userId:e,preference:t,storageUnavailable:n})}return(0,S.jsx)(bp.Provider,{value:{appearance:o,themePack:c,storageUnavailable:a,setAppearance:e=>f({...i,appearance:e}),setThemePack:e=>f({...i,themeId:hp(e).id})},children:t})}function Sp(){let e=(0,x.useContext)(bp);if(!e)throw Error(`ThemeProvider is required`);return e}var Cp=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),wp=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),Tp=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),Ep=e=>{let t=Tp(e);return t.charAt(0).toUpperCase()+t.slice(1)},Dp={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},Op=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},kp=(0,x.createContext)({}),Ap=()=>(0,x.useContext)(kp),jp=(0,x.forwardRef)(({color:e,size:t,strokeWidth:n,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>{let{size:l=24,strokeWidth:u=2,absoluteStrokeWidth:d=!1,color:f=`currentColor`,className:p=``}=Ap()??{},m=r??d?Number(n??u)*24/Number(t??l):n??u;return(0,x.createElement)(`svg`,{ref:c,...Dp,width:t??l??Dp.width,height:t??l??Dp.height,stroke:e??f,strokeWidth:m,className:Cp(`lucide`,p,i),...!a&&!Op(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,x.createElement)(e,t)),...Array.isArray(a)?a:[a]])}),Mp=(e,t)=>{let n=(0,x.forwardRef)(({className:n,...r},i)=>(0,x.createElement)(jp,{ref:i,iconNode:t,className:Cp(`lucide-${wp(Ep(e))}`,`lucide-${e}`,n),...r}));return n.displayName=Ep(e),n},Np=Mp(`arrow-up-from-line`,[[`path`,{d:`m18 9-6-6-6 6`,key:`kcunyi`}],[`path`,{d:`M12 3v14`,key:`7cf3v8`}],[`path`,{d:`M5 21h14`,key:`11awu3`}]]),Pp=Mp(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),Fp=Mp(`building-2`,[[`path`,{d:`M10 12h4`,key:`a56b0p`}],[`path`,{d:`M10 8h4`,key:`1sr2af`}],[`path`,{d:`M14 21v-3a2 2 0 0 0-4 0v3`,key:`1rgiei`}],[`path`,{d:`M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2`,key:`secmi2`}],[`path`,{d:`M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16`,key:`16ra0t`}]]),Ip=Mp(`calendar-days`,[[`path`,{d:`M8 2v3`,key:`1ioesn`}],[`path`,{d:`M16 2v3`,key:`otl347`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M8 13h.01`,key:`1sbv64`}],[`path`,{d:`M12 13h.01`,key:`y0uutt`}],[`path`,{d:`M16 13h.01`,key:`wip0gl`}],[`path`,{d:`M8 17h.01`,key:`p3bg7i`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}],[`path`,{d:`M16 17h.01`,key:`ql8jdd`}]]),Lp=Mp(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),Rp=Mp(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),zp=Mp(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]),Bp=Mp(`eye`,[[`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`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Vp=Mp(`flask-conical`,[[`path`,{d:`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2`,key:`18mbvz`}],[`path`,{d:`M6.453 15h11.094`,key:`3shlmq`}],[`path`,{d:`M8.5 2h7`,key:`csnxdl`}]]),Hp=Mp(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),Up=Mp(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),Wp=Mp(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),Gp=Mp(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),Kp=Mp(`plug`,[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]),qp=Mp(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Jp=Mp(`puzzle`,[[`path`,{d:`M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z`,key:`w46dr5`}]]),Yp=Mp(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),Xp=Mp(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),Zp=Mp(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Qp=Mp(`shield-check`,[[`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`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),$p=Mp(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),em=Mp(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);function tm({className:e,type:t,...n}){return(0,S.jsx)(`input`,{type:t,"data-slot":`input`,className:V(`h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30`,`focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`,`aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40`,e),...n})}function nm({...e}){return(0,S.jsx)(js,{"data-slot":`sheet`,...e})}function rm({...e}){return(0,S.jsx)(Fs,{"data-slot":`sheet-portal`,...e})}function im({className:e,...t}){return(0,S.jsx)(Ls,{"data-slot":`sheet-overlay`,className:V(`fixed inset-0 z-50 bg-black/15 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function am({className:e,children:t,side:n=`right`,showCloseButton:r=!0,...i}){return(0,S.jsxs)(rm,{children:[(0,S.jsx)(im,{}),(0,S.jsxs)(Vs,{"data-slot":`sheet-content`,className:V(`fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-200`,n===`right`&&`inset-y-0 right-0 h-full w-full border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-[440px]`,n===`left`&&`inset-y-0 left-0 h-full w-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-[440px]`,n===`top`&&`inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top`,n===`bottom`&&`inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom`,e),...i,children:[t,r&&(0,S.jsxs)(Xs,{className:`absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary`,children:[(0,S.jsx)(em,{className:`size-4`}),(0,S.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function om({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`sheet-header`,className:V(`flex flex-col gap-1.5 p-4`,e),...t})}function sm({className:e,...t}){return(0,S.jsx)(Ks,{"data-slot":`sheet-title`,className:V(`font-semibold text-foreground`,e),...t})}function cm({className:e,...t}){return(0,S.jsx)(Js,{"data-slot":`sheet-description`,className:V(`text-sm text-muted-foreground`,e),...t})}function lm({...e}){return(0,S.jsx)(js,{"data-slot":`dialog`,...e})}function um({...e}){return(0,S.jsx)(Fs,{"data-slot":`dialog-portal`,...e})}function dm({className:e,...t}){return(0,S.jsx)(Ls,{"data-slot":`dialog-overlay`,className:V(`fixed inset-0 z-50 bg-black/15 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function fm({className:e,children:t,showCloseButton:n=!0,...r}){return(0,S.jsxs)(um,{"data-slot":`dialog-portal`,children:[(0,S.jsx)(dm,{}),(0,S.jsxs)(Vs,{"data-slot":`dialog-content`,className:V(`fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg`,e),...r,children:[t,n&&(0,S.jsxs)(Xs,{"data-slot":`dialog-close`,className:`absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,children:[(0,S.jsx)(em,{}),(0,S.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function pm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`dialog-header`,className:V(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function mm({className:e,showCloseButton:t=!1,children:n,...r}){return(0,S.jsxs)(`div`,{"data-slot":`dialog-footer`,className:V(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...r,children:[n,t&&(0,S.jsx)(Xs,{asChild:!0,children:(0,S.jsx)($,{variant:`outline`,children:`Close`})})]})}function hm({className:e,...t}){return(0,S.jsx)(Ks,{"data-slot":`dialog-title`,className:V(`text-lg leading-none font-semibold`,e),...t})}function gm({className:e,...t}){return(0,S.jsx)(Js,{"data-slot":`dialog-description`,className:V(`text-sm text-muted-foreground`,e),...t})}var _m=vn(`relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current`}},defaultVariants:{variant:`default`}});function vm({className:e,variant:t,...n}){return(0,S.jsx)(`div`,{"data-slot":`alert`,role:`alert`,className:V(_m({variant:t}),e),...n})}function ym({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`alert-description`,className:V(`col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed`,e),...t})}function bm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`skeleton`,className:V(`animate-pulse rounded-md bg-accent`,e),...t})}function xm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty`,className:V(`flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12`,e),...t})}function Sm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-header`,className:V(`flex max-w-sm flex-col items-center gap-2 text-center`,e),...t})}function Cm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-title`,className:V(`text-lg font-medium tracking-tight`,e),...t})}function wm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-description`,className:V(`text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary`,e),...t})}function Tm(e){return{dsp_view_scope:`Exit this DSP to use platform controls or switch accounts.`,dsp_view_unavailable:`This DSP view expired or is no longer available. Open it again from DSPs.`,dsp_view_changed:`The DSP view changed. Refresh to load the current workspace.`,invalid_input:`Check the fields and use a valid station code and business timezone.`,container_provisioning_required:`DSP provisioning is not configured on this server. Contact the platform operator.`,native_migration_required:`Finish migrating or removing existing legacy DSPs before starting this update.`,organization_details_required:`Finish your DSP details before continuing setup.`,organization_details_complete:`Your DSP details have already been saved.`,update_unavailable:`This update is no longer available. Refresh and try again.`,rollout_in_progress:`A rollout is already in progress.`,rollout_empty:`Create a DSP before starting a rollout.`,rollout_not_active:`There is no active rollout to change.`,invalid_credentials:`The email address or password was not accepted.`,password_reset_invalid:`This reset link is invalid or has expired. Request a new link to continue.`,password_recovery_rate_limited:`Too many recovery attempts. Please try again in 15 minutes.`,password_recovery_busy:`Password recovery is busy. Please try again shortly.`,password_recovery_unavailable:`Password recovery is temporarily unavailable. Please contact your Dispatch administrator.`,turnstile_required:`Complete the security check before continuing.`,turnstile_invalid:`The security check was not accepted. Please verify again and retry.`,turnstile_unavailable:`Security verification is temporarily unavailable. Please try again shortly.`,login_rate_limited:`Too many sign-in attempts. Wait before trying again.`,invitation_invalid:`This invitation is invalid, expired, revoked, or already used.`,invitation_email_mismatch:`Sign in with the exact email address named by this invitation.`,password_policy_failed:`Use a password containing at least 12 characters.`,password_confirmation_mismatch:`The password confirmation does not match.`,user_already_belongs_to_dsp:`This user already belongs to another DSP.`,current_password_invalid:`The current password was not accepted.`,password_unchanged:`Choose a new password that differs from the current password.`,account_exists:`An account already exists for this invitation. Sign in instead.`,invitation_pending:`A pending invitation already exists for that email.`,membership_exists:`That user already belongs to this DSP.`,conflict:`That name or account is already in use.`,role_in_use:`Move all members off this role before deleting it.`,fixed_roles_only:`DSP roles are fixed to Owner, Manager, Dispatcher, and Driver.`,last_owner_protected:`Assign another Owner before changing or removing the last Owner.`,system_role_protected:`System roles are protected and cannot be changed.`,role_not_assignable:`Choose a standard role from this DSP.`,self_role_change_forbidden:`You cannot change your own role.`,organization_forbidden:`Your account does not have permission for that DSP.`,workforce_changed:`The employee list changed while loading. Please retry.`,workforce_unavailable:`Workforce data is temporarily unavailable. Please retry.`,not_initialized:`Paycom has not collected workforce data yet.`,employee_not_found:`This employee is no longer in the collected roster.`,paycom_credentials_invalid:`Complete all Paycom fields and enter five distinct security PINs in their original Paycom numbering.`,confirmation_mismatch:`Type the DSP name exactly as displayed to confirm.`,primary_credentials_rejected:`Paycom did not accept the client code, username or password.`,security_answers_rejected:`Paycom did not accept the security PINs.`,attempt_cooldown:`Paycom setup is waiting for the authentication cooldown. Retry after it clears.`,profile_locked:`This Paycom profile is locked. Review the failure before replacing its credentials.`,provider_setup_failed:`Paycom setup could not complete. Review your details and retry.`,profile_exists:`Paycom credentials are already saved. Select replacement only if you intend to change them.`,captcha_required:`Paycom needs verification. Contact the Platform Owner.`,manual_verification_required:`Paycom needs verification. Contact the Platform Owner.`,mfa_required:`Paycom requires additional verification. Resolve it with your authorized Paycom administrator before retrying.`,account_locked:`Paycom reports that the account is locked. Resolve the lock before retrying.`,setup_interrupted:`Setup was interrupted. Review your details and retry.`,platform_forbidden:`You do not have permission to manage DSP installations.`,platform_control_invalid:`This control expired or belongs to another session. Refresh and try again.`,installation_operator_disabled:`DSP provisioning is not enabled on this server. Server setup must be completed before creating DSPs or starting updates.`,invitation_email_unavailable:`Invitation email is not configured on this server. No invitation was sent. Contact the platform owner to finish email setup.`,dashboard_unavailable:`Dispatch is temporarily unavailable. Refresh to check whether your request completed before trying again.`,installation_revision_conflict:`The installation changed in another session. Refresh before trying again.`,installation_operation_in_progress:`An installation operation is already in progress. Its status will keep updating.`,installation_operation_not_allowed:`This installation cannot be changed from its current state.`,installation_operation_not_found:`That installation operation is no longer available. Refresh the status.`,idempotency_conflict:`This request was reused for different input. Refresh and try again.`,installation_not_ready:`This DSP runtime is not ready yet. Operational data will be available after setup completes.`,provider_auth_required:`Paycom access needs attention. Contact the platform owner for assistance.`,first_publication_failed:`Private runtime verification did not complete. Contact the platform operator.`,runtime_boundary_violation:`The private runtime could not be verified. Contact the platform operator.`}[typeof e==`string`?e:e instanceof Jt?e.code:``]||`The request could not be completed. Please try again.`}function Em(e){if(typeof e!=`string`||!e||e.length>64)return!1;try{return new Intl.DateTimeFormat(void 0,{timeZone:e}).format(0),!0}catch{return!1}}function Dm(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`}catch{return`UTC`}}function Om(e,t=Dm()){let n=e instanceof Date?e:new Date(e);return Number.isFinite(n.valueOf())?new Intl.DateTimeFormat(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,timeZoneName:`short`,timeZone:t}).format(n):`—`}function km(e,t=new Date){let n=Object.fromEntries(new Intl.DateTimeFormat(`en-CA`,{timeZone:e,year:`numeric`,month:`2-digit`,day:`2-digit`}).formatToParts(t).map(e=>[e.type,e.value]));return`${n.year}-${n.month}-${n.day}`}function Am(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw Error(`invalid_calendar_date`);let t=new Date(`${e}T12:00:00Z`);if(!Number.isFinite(t.valueOf())||t.toISOString().slice(0,10)!==e)throw Error(`invalid_calendar_date`);return t}function jm(e,t){if(!Number.isInteger(t))throw Error(`invalid_calendar_date`);let n=Am(e);return n.setUTCDate(n.getUTCDate()+t),n.toISOString().slice(0,10)}function Mm(e){return new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,year:`numeric`,timeZone:`UTC`}).format(Am(e))}function Nm(e){let t=Sp().themePack.components?.PageHeading||Pm;return(0,S.jsx)(t,{...e})}function Pm({title:e,description:t,children:n}){return(0,S.jsxs)(`div`,{className:`page-heading`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h1`,{tabIndex:-1,children:e}),t&&(0,S.jsx)(`p`,{children:t})]}),n&&(0,S.jsx)(`div`,{className:`page-actions`,children:n})]})}function Fm({label:e,description:t,...n}){let r=(0,x.useId)();return(0,S.jsxs)(op,{"data-disabled":n.disabled,children:[(0,S.jsx)(sp,{htmlFor:r,children:e}),(0,S.jsx)(tm,{id:r,...n}),t&&(0,S.jsx)(cp,{children:t})]})}function Im({children:e,error:t=!1}){return(0,S.jsx)(vm,{variant:t?`destructive`:`default`,role:t?`alert`:`status`,className:`my-4`,children:(0,S.jsx)(ym,{children:e})})}function Lm({error:e}){return e?(0,S.jsx)(Im,{error:!0,children:Tm(e)}):null}function Rm(){return(0,S.jsxs)(`div`,{className:`flex flex-col gap-5 py-8`,role:`status`,"aria-label":`Loading`,children:[(0,S.jsx)(bm,{className:`h-6 w-48`}),[0,1,2].map(e=>(0,S.jsx)(bm,{className:`h-12 w-full`},e))]})}function zm({title:e,description:t}){return(0,S.jsx)(xm,{children:(0,S.jsxs)(Sm,{children:[(0,S.jsx)(Cm,{children:e}),t&&(0,S.jsx)(wm,{children:t})]})})}function Bm({onClick:e,busy:t=!1}){return(0,S.jsx)($,{variant:`outline`,size:`icon`,"aria-label":`Refresh`,disabled:t,onClick:e,children:(0,S.jsx)(Yp,{"data-icon":`inline-start`,className:V(t&&`animate-spin`)})})}function Vm({value:e,onChange:t,placeholder:n}){return(0,S.jsxs)(`label`,{className:`search-input`,children:[(0,S.jsx)(Xp,{"aria-hidden":`true`}),(0,S.jsx)(tm,{type:`search`,"aria-label":n,placeholder:n,value:e,onChange:e=>t(e.target.value)})]})}function Hm({busy:e,children:t,...n}){return(0,S.jsxs)($,{type:`submit`,disabled:e,...n,children:[e&&(0,S.jsx)(Up,{"data-icon":`inline-start`,className:`animate-spin`}),t]})}function Um({value:e,children:t}){return(0,S.jsxs)(`span`,{className:V(`status`,`status-${e.replaceAll(`_`,`-`)}`),children:[(0,S.jsx)(`span`,{"aria-hidden":`true`}),t||e.replaceAll(`_`,` `)]})}function Wm({open:e,onClose:t,title:n,description:r,children:i,busy:a=!1}){let o=(0,x.useRef)(null);return(0,S.jsx)(nm,{open:e,onOpenChange:e=>{!e&&!a&&t()},children:(0,S.jsxs)(am,{showCloseButton:!a,onOpenAutoFocus:()=>{o.current=document.activeElement},onCloseAutoFocus:e=>{e.preventDefault(),o.current?.isConnected?o.current.focus():document.querySelector(`.page-heading h1`)?.focus()},children:[(0,S.jsxs)(om,{children:[(0,S.jsx)(sm,{children:n}),(0,S.jsx)(cm,{children:r||`Review details and manage access.`})]}),i]})})}function Gm({title:e,description:t,confirmation:n,passwordRequired:r=!1,onConfirm:i,onClose:a}){let[o,s]=(0,x.useState)(``),[c,l]=(0,x.useState)(!1),[u,d]=(0,x.useState)(null);return(0,S.jsx)(lm,{open:!0,onOpenChange:e=>{!e&&!c&&a()},children:(0,S.jsxs)(fm,{showCloseButton:!c,children:[(0,S.jsxs)(pm,{children:[(0,S.jsx)(hm,{children:e}),(0,S.jsx)(gm,{children:t})]}),(0,S.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!(n&&o!==n)){l(!0),d(null);try{await i(r?o:void 0),a()}catch(e){r&&s(``),d(e)}finally{l(!1)}}},className:`flex flex-col gap-5`,children:[r&&(0,S.jsx)(Fm,{label:`Your password`,type:`password`,autoComplete:`current-password`,value:o,onChange:e=>s(e.target.value),required:!0,disabled:c}),n&&(0,S.jsx)(Fm,{label:`Type ${n} to confirm`,value:o,onChange:e=>s(e.target.value),autoComplete:`off`,disabled:c,required:!0}),(0,S.jsx)(Lm,{error:u}),(0,S.jsxs)(mm,{children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:c,onClick:a,children:`Cancel`}),(0,S.jsx)(Hm,{busy:c,variant:`destructive`,disabled:c||!!(n&&o!==n)||r&&!o,children:e})]})]})]})})}function Km({result:e}){if(!e)return null;let t=e.ownerInvitation?.email||e.invitation?.email||`the recipient`;if(e.delivery?.status===`accepted`)return(0,S.jsxs)(Im,{children:[`Invitation sent to `,t,`.`]});if(!e.invitationPath)return(0,S.jsx)(Im,{children:`The invitation request was already processed. No new invitation was sent.`});let n=new URL(e.invitationPath,window.location.origin).href;return(0,S.jsx)(Im,{children:(0,S.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,S.jsx)(`p`,{children:e.delivery?.status===`unknown`?`Email delivery could not be confirmed. Use this same link if a private handoff is needed.`:e.delivery?.status===`failed`?`The invitation email could not be sent. Share this one-time invitation through a private channel.`:`No email was sent because invitation email is not configured. Share this one-time invitation through a private channel.`}),(0,S.jsx)(tm,{"aria-label":`Invitation link`,value:n,readOnly:!0,onFocus:e=>e.target.select()}),(0,S.jsx)($,{variant:`outline`,onClick:()=>navigator.clipboard.writeText(n).catch(()=>{}),children:`Copy link`})]})})}function qm({hash:e,session:t,refresh:n}){let r=e===`#/forgot-password`,[i,a]=(0,x.useState)(()=>/^#\/reset-password\/([A-Za-z0-9_-]{43})$/.exec(e)?.[1]||``),[o,s]=(0,x.useState)(!1),[c,l]=(0,x.useState)(null),[u,d]=(0,x.useState)(``),[f,p]=(0,x.useState)(``),[m,h]=(0,x.useState)(0),g=r?t?.turnstile?.siteKey:null;(0,x.useEffect)(()=>{r||history.replaceState(null,``,`${location.pathname}#/reset-password`)},[r]);async function _(e){if(e.preventDefault(),o||g&&!f)return;let t=e.currentTarget,c=new FormData(t);s(!0),l(null);try{let e=await fetch(r?`/api/auth/forgot-password`:`/api/auth/reset-password`,{method:`POST`,credentials:`omit`,cache:`no-store`,referrerPolicy:`no-referrer`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({...Object.fromEntries(c),...r?g?{turnstileToken:f}:{}:{token:i}})}),o=await e.json().catch(()=>null);if(!e.ok||!o?.ok)throw new Jt(o?.error?.code||`request_failed`,e.status);t.reset(),d(o.data.message),r||(a(``),n().catch(()=>{}))}catch(e){l(e)}finally{s(!1),p(``),h(e=>e+1)}}return(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(pn,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[(0,S.jsx)(`h1`,{children:u?r?`Check your email`:`Password reset`:r?`Forgot your password?`:`Set a new password`}),(0,S.jsx)(`p`,{className:`auth-description`,children:r?`Enter your Dispatch account email and we’ll send you a reset link.`:`Choose a password you haven’t used elsewhere.`}),(0,S.jsx)(Lm,{error:c}),u?(0,S.jsx)(Im,{children:u}):!r&&!i?(0,S.jsx)(Im,{children:`This reset link is invalid or has expired. Request a new link to continue.`}):(0,S.jsx)(`form`,{onSubmit:_,children:(0,S.jsxs)(ip,{children:[r?(0,S.jsx)(Fm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`username`,required:!0,maxLength:254,disabled:o}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Fm,{label:`New password`,name:`newPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:o,description:`Use 12–128 characters.`}),(0,S.jsx)(Fm,{label:`Confirm new password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:o})]}),g&&(0,S.jsx)(np,{siteKey:g,action:`forgot_password`,onToken:p,busy:o},m),(0,S.jsx)(Hm,{busy:o,disabled:o||!(!g||f),children:r?`Send reset link`:`Reset password`})]})}),(0,S.jsxs)(`div`,{className:`mt-6 flex flex-wrap gap-4 text-sm text-primary`,children:[(0,S.jsx)(`a`,{className:`underline-offset-4 hover:underline`,href:`#/login`,children:`Back to sign in`}),!r&&(0,S.jsx)(`a`,{className:`underline-offset-4 hover:underline`,href:`#/forgot-password`,children:`Request a new link`})]})]}),(0,S.jsx)(`p`,{className:`auth-footnote`,children:r?`Reset links expire after 30 minutes.`:`Resetting your password signs out your existing sessions.`})]})}function Jm({navigation:e,mobileNavigation:t,banner:n,header:r,children:i}){return(0,S.jsxs)(`div`,{className:`application`,children:[(0,S.jsx)(`aside`,{className:`desktop-sidebar`,children:e}),t,(0,S.jsxs)(`div`,{className:`main-area`,children:[n,(0,S.jsx)(`header`,{className:`topbar`,children:r}),(0,S.jsx)(`main`,{id:`main-content`,className:`page-container`,tabIndex:-1,children:i})]})]})}var Ym=(0,x.createContext)(null);function Xm(){let e=(0,x.useContext)(Ym);if(!e)throw Error(`Session required`);return e}var Zm=e=>`dispatch:timezone:v1:${e}`;function Qm(e){try{let t=e?JSON.parse(localStorage.getItem(Zm(e))||`null`):null;return Em(t?.timeZone)?t.timeZone:null}catch{return null}}var $m=(0,x.createContext)(null);function eh({userId:e,children:t}){let[n,r]=(0,x.useState)(()=>({userId:e,preference:Qm(e),storageUnavailable:!1}));n.userId!==e&&r({userId:e,preference:Qm(e),storageUnavailable:!1});let[i,a]=(0,x.useState)(Dm);(0,x.useEffect)(()=>{let e=()=>a(Dm()),t=window.setInterval(e,6e4);return window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,e),()=>{clearInterval(t),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,e)}},[]),(0,x.useEffect)(()=>{if(!e)return;let t=t=>{(t.key===null||t.key===Zm(e))&&r(t=>t.userId===e?{...t,preference:Qm(e)}:t)};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},[e]);function o(t){if(!e||t!==null&&!Em(t))return;let n=!1;try{localStorage.setItem(Zm(e),JSON.stringify({timeZone:t}))}catch{n=!0}r({userId:e,preference:t,storageUnavailable:n})}return(0,S.jsx)($m.Provider,{value:{timeZone:n.preference||i,deviceZone:i,preference:n.preference,setPreference:o,storageUnavailable:n.storageUnavailable},children:t})}function th(){let e=(0,x.useContext)($m);if(!e)throw Error(`TimezoneProvider is required`);return e}function nh(e){let[t,n]=(0,x.useState)(Date.now);return(0,x.useEffect)(()=>{let e=()=>n(Date.now()),t=window.setInterval(e,3e4);return window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,e),()=>{clearInterval(t),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,e)}},[]),km(e,t)}var rh=vn(`inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3`,{variants:{variant:{default:`bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90`,outline:`border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,ghost:`[a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,link:`text-primary underline-offset-4 [a&]:hover:underline`}},defaultVariants:{variant:`default`}});function ih({className:e,variant:t=`default`,asChild:n=!1,...r}){let i=n?Zr:`span`;return(0,S.jsx)(i,{"data-slot":`badge`,"data-variant":t,className:V(rh({variant:t}),e),...r})}function ah({className:e,orientation:t=`horizontal`,...n}){return(0,S.jsx)(Yf,{"data-slot":`tabs`,"data-orientation":t,orientation:t,className:V(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,e),...n})}var oh=vn(`group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function sh({className:e,variant:t=`default`,...n}){return(0,S.jsx)(Xf,{"data-slot":`tabs-list`,"data-variant":t,className:V(oh({variant:t}),e),...n})}function ch({className:e,...t}){return(0,S.jsx)(Zf,{"data-slot":`tabs-trigger`,className:V(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,e),...t})}function lh({className:e,...t}){return(0,S.jsx)(Qf,{"data-slot":`tabs-content`,className:V(`flex-1 outline-none`,e),...t})}function uh({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`table-container`,className:`relative w-full overflow-x-auto`,children:(0,S.jsx)(`table`,{"data-slot":`table`,className:V(`w-full caption-bottom text-sm`,e),...t})})}function dh({className:e,...t}){return(0,S.jsx)(`thead`,{"data-slot":`table-header`,className:V(`[&_tr]:border-b`,e),...t})}function fh({className:e,...t}){return(0,S.jsx)(`tbody`,{"data-slot":`table-body`,className:V(`[&_tr:last-child]:border-0`,e),...t})}function ph({className:e,...t}){return(0,S.jsx)(`tr`,{"data-slot":`table-row`,className:V(`border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted`,e),...t})}function mh({className:e,...t}){return(0,S.jsx)(`th`,{"data-slot":`table-head`,className:V(`h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t})}function hh({className:e,...t}){return(0,S.jsx)(`td`,{"data-slot":`table-cell`,className:V(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t})}var gh=o(((e,t)=>{var n=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function r(e,t){return!e||n(t[e.field],e.equals)}function i(e,t){return(e.rules||[]).filter(e=>{if(!r(e.when,t))return!1;if(e.kind===`included`){let n=t[e.selection],r=t[e.field];return r!==null&&n!==null&&!n.includes(r)}return!r(e.require,t)}).map(e=>({id:e.id,field:e.field||e.require.field,severity:e.severity,message:e.message}))}function a(e,t,n={}){if(t===void 0)return`Not recorded`;if(t===null)return`All current and future options`;if(typeof t==`boolean`)return t?`On`:`Off`;let r=e.options||n[e.optionsSource]||[],i=e=>r.find(t=>t.value===e)?.label||String(e);return Array.isArray(t)?t.length?t.map(i).join(`, `):`None`:i(t)}function o(e,t,r,i={}){let a=r.find(t=>t.id===e.field);if(e.kind===`choice`)return e.examples.find(e=>n(e.value,t[a.id]))?.text||``;if(e.kind===`columns`)return[e.leading,...(t[a.id]||[]).map(e=>(a.options||[]).find(t=>t.value===e)?.label||e)].filter(Boolean).join(` · `);let o=i[a.optionsSource]||[],s=t[a.id],c=s===null?o:o.filter(e=>s.includes(e.value));return`${c.reduce((e,t)=>e+(t.count||0),0)} ${e.unit} from ${c.length} ${e.groupLabel}.`}t.exports={same:n,conditionMatches:r,settingsIssues:i,formatSettingValue:a,settingsPreview:o,EFFECTS:Object.freeze({immediate:`Display changes take effect after saving.`,next_job:`Collection changes apply to new jobs. Running jobs keep their current settings.`,next_connection:`Changes apply to the next connection. An active connection keeps its current settings.`,schedule:`The schedule is updated after saving. Running collections are allowed to finish.`})}}))();function _h({pluginId:e,scope:t,snapshot:n,busy:r,onRestore:i}){let[a,o]=(0,x.useState)([null]),s=a[a.length-1],{timeZone:c}=th(),l=Mt({queryKey:[`plugin-settings`,e,t,`history`,n.revision,s],queryFn:({signal:t})=>nn(`/api/organization/plugins/${encodeURIComponent(e)}/settings/history${s===null?``:`?before=${s}`}`,{signal:t})});return(0,S.jsxs)(`section`,{className:`plugin-settings-history`,"aria-label":`Settings change history`,children:[(0,S.jsx)(`h2`,{children:`Change history`}),(0,S.jsx)(`p`,{children:`Restore values into your draft, then review and save. History belongs to this DSP.`}),(0,S.jsx)(Lm,{error:l.error}),l.isPending&&(0,S.jsx)(Rm,{}),l.data?.items.map(e=>(0,S.jsxs)(`details`,{"data-revision":e.revision,children:[(0,S.jsxs)(`summary`,{children:[Om(e.updatedAt,c),` ·`,` `,e.kind===`initial`?`Initial settings`:e.actorName||`Plugin update`,` `,`· Revision `,e.revision]}),e.changes.length?(0,S.jsx)(`ul`,{children:e.changes.map(e=>{let t=n.definition.fields.find(t=>t.id===e.field),r=e=>t?(0,gh.formatSettingValue)(t,e):JSON.stringify(e);return(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.label}),`: `,r(e.before),` →`,` `,r(e.after),e.beforeSource!==e.afterSource&&(0,S.jsxs)(`span`,{children:[` `,`(`,e.afterSource==="default"?`Plugin default`:`DSP override`,`)`]})]},e.field)})}):(0,S.jsx)(`p`,{children:`No values changed.`}),e.canRestore?(0,S.jsxs)(`div`,{className:`plugin-settings-history-actions`,children:[n.definition.sections.map(t=>(0,S.jsxs)($,{variant:`outline`,size:`sm`,disabled:r,onClick:()=>i(e.values,e.sources,n.definition.fields.filter(e=>e.section===t.id).map(e=>e.id)),children:[`Restore `,t.label]},t.id)),(0,S.jsxs)(`details`,{children:[(0,S.jsx)(`summary`,{children:`Restore an individual setting`}),n.definition.fields.map(t=>(0,S.jsxs)($,{variant:`ghost`,size:`sm`,disabled:r,onClick:()=>i(e.values,e.sources,[t.id]),children:[`Restore `,t.label]},t.id))]})]}):(0,S.jsx)(`p`,{children:`This entry predates the current settings definition and cannot be restored directly.`})]},e.revision)),(0,S.jsxs)(`div`,{className:`plugin-settings-history-pagination`,children:[(0,S.jsx)($,{variant:`outline`,disabled:a.length===1||l.isFetching,onClick:()=>o(e=>e.slice(0,-1)),children:`Newer changes`}),(0,S.jsx)($,{variant:`outline`,disabled:l.data?.nextBefore==null||l.isFetching,onClick:()=>o(e=>[...e,l.data.nextBefore]),children:`Older changes`})]})]})}function vh(e,t=!1){let{session:n}=Xm(),r=dn(n),i=`${n.user?.id}:${r?.organizationId}:${n.dspView?.viewRef||`member`}`,a=`${r?.organizationId}:${n.dspView?.viewRef||`member`}`,o=`/api/organization/plugins/${encodeURIComponent(e)}/settings`,s=[`plugin-settings`,e,i],c=w(),l=n.authenticated&&!!r;return{query:Mt({queryKey:s,queryFn:({signal:e})=>nn(o,{signal:e}),enabled:l,refetchInterval:15e3}),options:Mt({queryKey:[...s,`options`],queryFn:({signal:e})=>nn(`${o}/options`,{signal:e}),enabled:l&&t,staleTime:3e4}),update:Wt({mutationFn:({values:t,snapshot:n,sources:r})=>cn(`plugin-settings:${e}:${i}:${n.revision}`,o,{values:t,...r?{sources:r}:{},expectedRevision:n.revision,definitionVersion:n.definitionVersion}),onSuccess:async t=>{c.setQueryData(s,t),await c.invalidateQueries({predicate:t=>t.queryKey[0]!==`plugin-settings`&&String(t.queryKey[0]).startsWith(e+`-`)&&t.queryKey.some(e=>e===i||e===a)})}}),scope:i}}function yh({field:e,value:t,options:n={},disabled:r=!1,onChange:i}){let a=e.options||e.optionsSource&&n[e.optionsSource]||[],o=`plugin-setting-${(0,x.useId)()}`;if(e.type===`boolean`)return(0,S.jsxs)(`div`,{className:`plugin-setting-toggle`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),e.description&&(0,S.jsx)(`p`,{children:e.description})]}),(0,S.jsx)(`input`,{id:o,type:`checkbox`,role:`switch`,checked:t===!0,disabled:r,onChange:e=>i(e.target.checked)})]});if(e.type===`strings`){let n=t===null?a.map(e=>String(e.value)):t,o=new Map(a.map(e=>[String(e.value),e])),c=[...n,...a.map(e=>String(e.value)).filter(e=>!n.includes(e))];function s(e,t){i(t?[...n,e]:n.filter(t=>t!==e))}return(0,S.jsxs)(`fieldset`,{className:`plugin-setting-multiple`,disabled:r,children:[(0,S.jsx)(`legend`,{children:e.label}),e.description&&(0,S.jsx)(`p`,{children:e.description}),e.nullable&&(0,S.jsxs)(`label`,{className:`plugin-setting-choice`,children:[(0,S.jsx)(`input`,{type:`checkbox`,checked:t===null,onChange:e=>i(e.target.checked?null:[...n])}),`Include all current and future options`]}),(0,S.jsx)(`div`,{className:`plugin-setting-choices`,children:c.map((a,c)=>{let l=o.get(a),u=n.includes(a);return(0,S.jsxs)(`div`,{className:`plugin-setting-option`,children:[(0,S.jsxs)(`label`,{className:`plugin-setting-choice`,children:[(0,S.jsx)(`input`,{type:`checkbox`,checked:u,disabled:t===null,onChange:e=>s(a,e.target.checked)}),(0,S.jsx)(`span`,{children:l?.label||`${a} (not currently available)`}),l?.count!==void 0&&(0,S.jsx)(`span`,{className:`plugin-setting-count`,children:l.count})]}),e.ordered&&u&&(0,S.jsx)(`div`,{className:`plugin-setting-order`,children:[-1,1].map(e=>(0,S.jsx)($,{type:`button`,variant:`ghost`,size:`sm`,"aria-label":`Move ${l?.label||a} ${e<0?`earlier`:`later`}`,disabled:r||c+e<0||c+e>=n.length,onClick:()=>{let t=[...n];[t[c],t[c+e]]=[t[c+e],t[c]],i(t)},children:e<0?`↑`:`↓`},e))})]},a)})}),!c.length&&(0,S.jsx)(`p`,{children:`No options are available yet.`})]})}if(a.length||e.optionsSource){let n=t!==null&&!a.some(e=>String(e.value)===String(t));return(0,S.jsxs)(`div`,{className:`plugin-setting-field`,children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),(0,S.jsxs)(`select`,{id:o,value:t===null?``:String(t),disabled:r,onChange:t=>i(t.target.value===``&&e.nullable?null:e.type===`integer`?Number(t.target.value):t.target.value),children:[e.nullable&&(0,S.jsxs)(`option`,{value:``,children:[`All `,e.optionsSource||`options`]}),n&&(0,S.jsxs)(`option`,{value:String(t),children:[String(t),` (not currently available)`]}),a.map(e=>(0,S.jsx)(`option`,{value:String(e.value),children:e.label},String(e.value)))]}),e.description&&(0,S.jsx)(`p`,{children:e.description})]})}return(0,S.jsxs)(`div`,{className:`plugin-setting-field`,children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),(0,S.jsx)(`input`,{id:o,type:e.type===`integer`?`number`:`text`,value:String(t??``),min:e.minimum,max:e.maximum,maxLength:128,disabled:r,onChange:t=>i(e.type===`integer`?Number(t.target.value):t.target.value)}),e.description&&(0,S.jsx)(`p`,{children:e.description})]})}function bh({pluginId:e,title:t,description:n,backHref:r,renderSection:i}){let{session:a}=Xm(),o=vh(e,!0),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)({}),[h,g]=(0,x.useState)(!1),[_,v]=(0,x.useState)(``),[y,b]=(0,x.useState)([]),C=!!s&&(JSON.stringify(l)!==JSON.stringify(s.values)||JSON.stringify(p)!==JSON.stringify(s.sources));(0,x.useEffect)(()=>{o.query.data&&!C&&(c(o.query.data),u(structuredClone(o.query.data.values)),m({...o.query.data.sources}))},[o.query.data,C]);let w=!!s&&!!o.query.data&&(s.revision!==o.query.data.revision||s.definitionVersion!==o.query.data.definitionVersion);if(!fn(a))return(0,S.jsx)(Im,{children:`Your DSP owner can manage plugin settings.`});if(o.query.isPending)return(0,S.jsx)(Rm,{});if(!s||!l)return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Lm,{error:o.query.error}),(0,S.jsx)($,{onClick:()=>void o.query.refetch(),children:`Retry settings`})]});let T=o.options.data||{},E=o.update.isPending,D=(0,gh.settingsIssues)(s.definition,l),O=D.some(e=>e.severity===`error`);async function ee(){if(s&&l)try{let e=await o.update.mutateAsync({values:l,snapshot:s,sources:p}),t=new Set(s.definition.fields.filter(t=>JSON.stringify(s.values[t.id])!==JSON.stringify(e.values[t.id])).map(e=>e.applies).filter(e=>e!==void 0));b([...t].map(e=>gh.EFFECTS[e])),c(e),u(structuredClone(e.values)),m({...e.sources}),v(``)}catch{}}function k(){let e=o.query.data||s;e&&(c(e),u(structuredClone(e.values)),m({...e.sources}),v(``),b([]),o.update.reset())}function A(e,t,n){u(r=>({...r,...Object.fromEntries(n.map(n=>[n,structuredClone(t[n]==="default"?s.definition.fields.find(e=>e.id===n).default:e[n])]))})),m(e=>({...e,...Object.fromEntries(n.map(e=>[e,t[e]]))})),v(`Restored into your draft. Review your changes before saving.`),o.update.reset()}function j(e){A(Object.fromEntries(s.definition.fields.map(e=>[e.id,e.default])),Object.fromEntries(e.map(e=>[e,`default`])),e)}return(0,S.jsxs)(`div`,{className:`plugin-settings-page`,children:[(0,S.jsx)(`a`,{className:`plugin-settings-back`,href:r,children:`← Back`}),(0,S.jsx)(Nm,{title:t,description:n}),(0,S.jsx)(Lm,{error:o.query.error||o.options.error||o.update.error}),w&&(0,S.jsx)(Im,{children:`These settings changed in another session. Discard your draft to load the latest settings before saving.`}),_&&(0,S.jsx)(Im,{children:_}),D.map(e=>(0,S.jsx)(`p`,{className:`plugin-settings-rule`,role:e.severity===`error`?`alert`:`status`,children:e.message},e.id)),(0,S.jsxs)(ah,{defaultValue:s.definition.sections[0].id,children:[(0,S.jsx)(sh,{variant:`line`,"aria-label":`${t} sections`,children:s.definition.sections.map(e=>(0,S.jsx)(ch,{value:e.id,children:e.label},e.id))}),s.definition.sections.map(e=>(0,S.jsxs)(lh,{value:e.id,children:[e.description&&(0,S.jsx)(`p`,{className:`plugin-settings-description`,children:e.description}),(0,S.jsx)(`div`,{className:`plugin-settings-fields`,children:s.definition.fields.filter(t=>t.section===e.id&&(0,gh.conditionMatches)(t.visibleWhen,l)).map(e=>(0,S.jsxs)(`div`,{className:e.type===`boolean`||e.type===`strings`?`plugin-setting-wide`:``,children:[(0,S.jsx)(yh,{field:e,value:l[e.id],options:T,disabled:E||!(0,gh.conditionMatches)(e.enabledWhen,l)||!!e.optionsSource&&o.options.isPending,onChange:t=>{u(n=>({...n,[e.id]:t})),m(t=>({...t,[e.id]:`override`})),v(``),o.update.reset()}}),!(0,gh.conditionMatches)(e.enabledWhen,l)&&e.disabledReason&&(0,S.jsx)(`p`,{className:`plugin-setting-help`,children:e.disabledReason}),(0,S.jsxs)(`div`,{className:`plugin-setting-source`,children:[(0,S.jsx)(`span`,{children:p[e.id]==="default"?`Plugin default`:`DSP override`}),(0,S.jsx)($,{type:`button`,variant:`ghost`,size:`sm`,disabled:E,"aria-label":p[e.id]==="default"?`Keep current value for ${e.label}`:`Use plugin default for ${e.label}`,onClick:()=>p[e.id]==="default"?m(t=>({...t,[e.id]:`override`})):j([e.id]),children:p[e.id]==="default"?`Keep this value`:`Use plugin default`})]}),(0,S.jsxs)(`p`,{className:`plugin-setting-help`,children:[`Default:`,` `,(0,gh.formatSettingValue)(e,e.default,T)]})]},e.id))}),(s.definition.previews||[]).filter(t=>t.section===e.id).map(e=>(0,S.jsxs)(`p`,{role:`status`,className:`plugin-settings-preview`,children:[e.label,`:`,` `,(0,gh.settingsPreview)(e,l,s.definition.fields,T)]},e.id)),i?.(e.id,l,T),(0,S.jsxs)($,{type:`button`,variant:`outline`,size:`sm`,disabled:E,onClick:()=>j(s.definition.fields.filter(t=>t.section===e.id).map(e=>e.id)),children:[`Restore `,e.label,` defaults`]})]},e.id))]}),(0,S.jsxs)(`div`,{className:`plugin-settings-defaults`,children:[(0,S.jsx)($,{type:`button`,variant:`ghost`,disabled:E,onClick:()=>f(!0),children:`Restore defaults`}),(0,S.jsx)($,{variant:`ghost`,type:`button`,onClick:()=>g(e=>!e),"aria-expanded":h,children:`Change history`}),(0,S.jsx)(`span`,{children:`Settings apply to this DSP.`})]}),h&&(0,S.jsx)(_h,{pluginId:e,scope:o.scope,snapshot:s,busy:E||w,onRestore:A},o.scope),!C&&y.map(e=>(0,S.jsx)(`p`,{className:`plugin-settings-effect`,role:`status`,children:e},e)),(0,S.jsxs)(`footer`,{className:`plugin-settings-footer`,children:[(0,S.jsx)(`span`,{role:`status`,children:C?`You have unsaved changes`:s.appliedRevision===s.revision?o.update.isSuccess?`Settings saved`:`All changes saved`:`Saved. Applying settings…`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)($,{variant:`outline`,disabled:!C||E,onClick:k,children:`Discard`}),(0,S.jsx)($,{disabled:!C||E||w||O,onClick:()=>void ee(),children:E?`Saving…`:`Save changes`})]})]}),(0,S.jsx)(lm,{open:d,onOpenChange:f,children:(0,S.jsxs)(fm,{children:[(0,S.jsxs)(pm,{children:[(0,S.jsx)(hm,{children:`Restore plugin defaults?`}),(0,S.jsx)(gm,{children:`Your connection and collected records are preserved. Review the defaults before saving.`})]}),(0,S.jsxs)(mm,{children:[(0,S.jsx)($,{variant:`outline`,onClick:()=>f(!1),children:`Cancel`}),(0,S.jsx)($,{onClick:()=>{j(s.definition.fields.map(e=>e.id)),f(!1)},children:`Restore defaults`})]})]})})]})}function xh(e){let{session:t}=Xm(),n=`${e.pluginId}:${t.user?.id}:${dn(t)?.organizationId}:${t.dspView?.viewRef||`member`}`;return(0,S.jsx)(bh,{...e},n)}async function Sh(e,t,n,r){if(!/^[a-z][a-z0-9-]{0,63}$/.test(e)||!/^[a-z][a-z0-9_.]{0,63}$/.test(t))throw Error(`Invalid plugin operation`);return{ok:!0,data:await rn(`/api/plugins/${e}/${t}`,`POST`,n,r)}}var Ch=s({ApiError:()=>Jt,Badge:()=>ih,Button:()=>$,EmptyState:()=>zm,ErrorNotice:()=>Lm,Loading:()=>Rm,Notice:()=>Im,PageHeading:()=>Nm,PluginSettingsField:()=>yh,PluginSettingsForm:()=>xh,Table:()=>uh,TableBody:()=>fh,TableCell:()=>hh,TableHead:()=>mh,TableHeader:()=>dh,TableRow:()=>ph,Tabs:()=>ah,TabsContent:()=>lh,TabsList:()=>sh,TabsTrigger:()=>ch,TextField:()=>Fm,activeMembership:()=>dn,calendarDateLabel:()=>Mm,dateTime:()=>Om,has:()=>ln,idempotent:()=>cn,invokePluginOperation:()=>Sh,isDspOwner:()=>fn,moveCalendarDate:()=>jm,mutation:()=>rn,request:()=>nn,useBusinessToday:()=>nh,usePluginSettings:()=>vh,useSession:()=>Xm,useTimezone:()=>th}),wh=new Map,Th=(e,t)=>wh.get(`${e}@${t}`);Object.defineProperty(globalThis,"DispatchPluginHost",{value:Object.freeze({react:x,jsx:S,query:qt,ui:Ch,register(e){if(e.apiVersion!==1||!/^[a-z][a-z0-9-]{0,63}$/.test(e.id)||!/^\d+\.\d+\.\d+$/.test(e.version)||!e.pages||Object.values(e.pages).some(e=>typeof e!=`function`))throw Error(`Plugin interface unavailable`);if(wh.size>=64)throw Error(`Plugin limit reached`);wh.set(`${e.id}@${e.version}`,Object.freeze(e))}}),writable:!1,configurable:!1});var Eh=new Map,Dh=new Map;window.addEventListener(`dispatch-authority-changed`,()=>{Eh.clear(),Dh.clear()});async function Oh(e,t,n){let r=await nn(`/api/plugin-assets/${e}/${n}`);if(r.id!==e||r.version!==t||r.revision!==n||typeof r.javascript!=`string`||r.javascript.length>2097152||typeof r.stylesheet!=`string`||r.stylesheet.length>1048576)throw new Jt(`plugin_unavailable`);let i=document.querySelector(`meta[name=dispatch-style-nonce]`)?.content;if(!i)throw new Jt(`plugin_unavailable`);let a=document.createElement(`script`);if(a.nonce=i,a.textContent=r.javascript,document.head.append(a),a.remove(),!Th(e,t))throw new Jt(`plugin_unavailable`);let o=document.createElement(`style`);o.nonce=i,o.textContent=r.stylesheet,o.dataset.dispatchPlugin=`${e}@${t}`,document.head.append(o)}function kh(e,t,n,r){let i=`${e}@${t}:${n}`,a=`${i}/${r}`,o=Eh.get(a);return o||(o=(0,x.lazy)(async()=>{if(!Th(e,t)){let r=Dh.get(i);r||(r=Oh(e,t,n).catch(e=>{throw Dh.delete(i),e}),Dh.set(i,r)),await r}let a=Th(e,t)?.pages[r];if(!a)throw new Jt(`plugin_unavailable`);return{default:a}}),Eh.size>=128&&Eh.delete(Eh.keys().next().value),Eh.set(a,o)),o}var Ah=class extends x.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}render(){return this.state.error?(0,S.jsx)(Lm,{error:this.state.error}):(0,S.jsx)(x.Suspense,{fallback:(0,S.jsx)(Rm,{}),children:this.props.children})}},jh=[{title:`New`,kinds:[`added`]},{title:`Improved`,kinds:[`improved`,`changed`]},{title:`Fixed`,kinds:[`fixed`]},{title:`Removed`,kinds:[`removed`]}];function Mh(){let{session:e}=Xm(),{timeZone:t}=th(),[n,r]=(0,x.useState)(null),[i,a]=(0,x.useState)(!1),[o,s]=(0,x.useState)(!1),c=(0,x.useRef)(!1),l=(0,x.useRef)(null);(0,x.useEffect)(()=>{let e=!1;return nn(`/api/updates/popup`).then(t=>{e||r(t.release)}).catch(()=>{}),()=>{e=!0}},[]);async function u(){if(n&&!c.current){c.current=!0,a(!0),s(!1);try{await rn(`/api/updates/popup`,`POST`,{releaseId:n.releaseId}),r(null)}catch{s(!0)}finally{c.current=!1,a(!1)}}}return(0,x.useEffect)(()=>{if(!n)return;let e=()=>{nn(`/api/updates/popup`).then(e=>{e.release||r(null)}).catch(()=>{})};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[n]),!n||e.dspView?null:(0,S.jsx)(lm,{open:!0,onOpenChange:e=>{e||u()},children:(0,S.jsxs)(fm,{className:`release-popup`,showCloseButton:!1,onInteractOutside:e=>e.preventDefault(),onOpenAutoFocus:e=>{e.preventDefault(),l.current?.focus()},onCloseAutoFocus:e=>{e.preventDefault(),document.getElementById(`main-content`)?.focus()},children:[(0,S.jsxs)(`header`,{className:`release-popup-header`,children:[(0,S.jsx)(`p`,{className:`release-popup-eyebrow`,children:`What’s new`}),(0,S.jsxs)(hm,{ref:l,tabIndex:-1,className:`release-popup-title`,children:[`Dispatch `,n.version]}),(0,S.jsxs)(gm,{children:[(0,S.jsx)(`time`,{dateTime:n.publishedAt,children:new Date(n.publishedAt).toLocaleDateString(void 0,{month:`long`,day:`numeric`,year:`numeric`,timeZone:t})}),(0,S.jsx)(`span`,{className:`release-popup-intro`,children:`Here’s what changed in the latest release.`})]}),(0,S.jsx)($,{variant:`ghost`,size:`icon`,className:`release-popup-close`,"aria-label":`Close update`,disabled:i,onClick:()=>void u(),children:(0,S.jsx)(em,{"aria-hidden":`true`})})]}),(0,S.jsxs)(`div`,{className:`release-popup-body`,children:[jh.map(e=>{let t=n.changelog.filter(t=>e.kinds.includes(t.kind));return t.length?(0,S.jsxs)(`section`,{"aria-label":e.title,children:[(0,S.jsx)(`h3`,{children:e.title}),(0,S.jsx)(`ul`,{children:t.map((e,t)=>(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.title}),e.description&&(0,S.jsx)(`p`,{children:e.description})]},t))})]},e.title):null}),n.afterUpdating.length>0&&(0,S.jsxs)(`section`,{"aria-label":`After updating`,children:[(0,S.jsx)(`h3`,{children:`After updating`}),(0,S.jsx)(`ul`,{children:n.afterUpdating.map((e,t)=>(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.title}),(0,S.jsx)(`p`,{children:e.description})]},t))})]})]}),(0,S.jsxs)(`footer`,{className:`release-popup-footer`,children:[o&&(0,S.jsx)(`p`,{role:`alert`,children:`We couldn’t save your dismissal. Please try again.`}),(0,S.jsx)($,{disabled:i,onClick:()=>void u(),children:i?`Saving…`:o?`Try again`:`Got it`})]})]})})}function Nh({...e}){return(0,S.jsx)(wf,{"data-slot":`dropdown-menu`,...e})}function Ph({...e}){return(0,S.jsx)(Tf,{"data-slot":`dropdown-menu-trigger`,...e})}function Fh({className:e,sideOffset:t=4,...n}){return(0,S.jsx)(Ef,{children:(0,S.jsx)(Df,{"data-slot":`dropdown-menu-content`,sideOffset:t,className:V(`z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,e),...n})})}function Ih({...e}){return(0,S.jsx)(Of,{"data-slot":`dropdown-menu-group`,...e})}function Lh({className:e,inset:t,variant:n=`default`,...r}){return(0,S.jsx)(kf,{"data-slot":`dropdown-menu-item`,"data-inset":t,"data-variant":n,className:V(`relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!`,e),...r})}function Rh(e){let t=e.toLocaleUpperCase(`en-US`).match(/[\p{L}\p{N}]+/gu)||[];return{initials:t.length>1?`${[...t[0]][0]}${[...t[1]][0]}`:[...t[0]||`?`].slice(0,2).join(``),className:`dsp-avatar tone-${[...t.join(` `)].reduce((e,t)=>e*31+t.codePointAt(0)>>>0,0)%5}`}}function zh({name:e}){let{initials:t,className:n}=Rh(e);return(0,S.jsx)(`span`,{"aria-hidden":`true`,className:n,children:t})}function Bh(e){let t=Sp().themePack.components?.DspAvatar||zh;return(0,S.jsx)(t,{...e})}var Vh=e=>e.installation.operation?.kind===`destroy`,Hh=e=>Vh(e)||e.installation.operation?.kind===`restore_dsp`||[`decommissioning`,`decommissioned`].includes(e.installation.state)||e.installation.operation?.kind===`decommission`,Uh=e=>!Hh(e)&&!Vh(e)&&e.organizationStatus===`active`&&e.installation.state===`ready`,Wh=e=>!Hh(e)&&!Vh(e)&&!Uh(e)&&e.organizationStatus!==`suspended`,Gh={ready:`Running`,pending:`Queued`,provisioning:`Creating`,waiting_for_owner:`Prepared`,waiting_for_provider_auth:`Prepared`,verifying:`Verifying`,failed:`Needs attention`,suspended:`Suspended`,decommissioning:`Removing`,decommissioned:`Removed`},Kh={provision:`Start provisioning`,retry_provision:`Retry provisioning`,decommission:`Remove DSP`,destroy:`Permanently delete DSP`,restore_dsp:`Restore DSP`,suspend:`Suspend DSP`,resume:`Resume DSP`,restart:`Restart runtime`,revoke_owner_invitation:`Revoke invitation`,issue_owner_invitation:`Invite owner`},qh=e=>e.detailsStatus===`required`?e.ownerEmail||`New DSP`:e.name;function Jh(e){return Vh(e)||Hh(e)?`Closed`:e.ownerStatus===`pending`?`Invitation pending`:e.ownerStatus===`missing`?`Invite needed`:e.detailsStatus===`complete`?[`ready`,`suspended`].includes(e.installation.state)?`Complete`:`Finishing setup`:`DSP details needed`}function Yh(e){return Vh(e)?e.installation.operation?.status===`failed`?`Deletion failed`:`Deleting`:e.installation.operation?.kind===`restore_dsp`?e.installation.operation.status===`failed`?`Restore failed`:`Restoring`:Gh[e.installation.state]||`Unavailable`}function Xh(){let{refresh:e}=Xm(),t=Mt({queryKey:[`fleet`],queryFn:({signal:e})=>nn(`/api/platform/organizations`,{signal:e}),refetchInterval:5e3}),[n,r]=(0,x.useState)(``),[i,a]=(0,x.useState)(`all`),[o,s]=(0,x.useState)(!1),[c,l]=(0,x.useState)(null),[u,d]=(0,x.useState)(null),[f,p]=(0,x.useState)(null),[m,h]=(0,x.useState)(null),[g,_]=(0,x.useState)(!1),[v,y]=(0,x.useState)(null),[b,C]=(0,x.useState)(``),w=t.data||[],T=w.filter(e=>(i===`removed`?Hh(e):i===`running`?Uh(e):i===`onboarding`?Wh(e):!Hh(e))&&`${e.name} ${e.abbreviation||``} ${e.ownerEmail||``} ${e.stations.map(e=>e.code).join(` `)}`.toLowerCase().includes(n.trim().toLowerCase())),E=t.error?void 0:w.find(e=>e.continuityRef===c),D=e=>!Hh(e)&&!Vh(e)&&e.organizationStatus!==`suspended`;async function O(t){_(!0),y(null);try{let n=await rn(`/api/platform/organization/view`,`POST`,{controlRef:t.controlRef});$t(n.dspView.viewRef),await e(n),location.hash=n.memberships[0].organization.status===`active`?`#/dashboard`:`#/team`}catch(e){y(e)}finally{_(!1)}}async function ee(e){e.preventDefault(),_(!0),y(null);let n=new FormData(e.currentTarget).get(`ownerEmail`);try{let e=await cn(f?`${f.continuityRef}:invite`:`organization:create`,f?`/api/platform/organization/owner-invitation`:`/api/platform/organizations`,{ownerEmail:n,...f?{controlRef:f.controlRef}:{}});h(e),s(!1),p(null),await t.refetch()}catch(e){y(e)}finally{_(!1)}}async function k(e){if(!u)return;let{org:n,kind:r}=u,i=w.find(e=>e.continuityRef===n.continuityRef);if(!i)throw Error(`DSP unavailable`);let a=`${n.continuityRef}:${r}`;try{r===`revoke_owner_invitation`?await cn(a,`/api/platform/organization/owner-invitation/revoke`,{controlRef:i.controlRef}):await cn(a,`/api/platform/installation/${{provision:`provision`,retry_provision:`retry`,decommission:`remove`,destroy:`delete`,restore_dsp:`restore`,suspend:`suspend`,resume:`resume`,restart:`restart`}[r]}`,{controlRef:i.controlRef,expectedRevision:i.installation.revision,...r===`destroy`?{password:e}:{}}),C(`${n.name}: request accepted.`)}finally{await t.refetch()}}function A(e){return[...e.installation.availableActions,...e.availableActions].filter(e=>Kh[e]&&(![`destroy`,`restore_dsp`].includes(e)||i===`removed`))}function j(e,t){l(null),y(null),t===`issue_owner_invitation`?p(e):d({org:e,kind:t})}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Nm,{title:`DSPs`,description:`Manage your DSPs and onboarding.`,children:(0,S.jsxs)($,{onClick:()=>{s(!0),y(null)},children:[(0,S.jsx)(qp,{"data-icon":`inline-start`}),`Create new DSP`]})}),(0,S.jsxs)(`div`,{className:`inline-summary`,"aria-label":`DSP summary`,children:[(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(e=>!Hh(e)).length}),` `,`DSPs`]}),(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(Uh).length}),` running`]}),(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(Wh).length}),` onboarding`]})]}),(0,S.jsx)(Km,{result:m}),b&&(0,S.jsx)(Im,{children:b}),(0,S.jsx)(ah,{value:i,onValueChange:a,children:(0,S.jsx)(sh,{variant:`line`,className:`page-tabs`,children:[[`all`,`All DSPs`],[`running`,`Running`],[`onboarding`,`Onboarding`],[`removed`,`Removed`]].map(([e,t])=>(0,S.jsx)(ch,{value:e,children:t},e))})}),(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(Vm,{value:n,onChange:r,placeholder:`Search DSPs or owner email`}),(0,S.jsx)(Bm,{onClick:()=>void t.refetch(),busy:t.isFetching})]}),(0,S.jsx)(Lm,{error:t.error}),(0,S.jsx)(Lm,{error:v}),t.isPending?(0,S.jsx)(Rm,{}):t.error?null:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(uh,{className:`fleet-table`,children:[(0,S.jsx)(dh,{children:(0,S.jsxs)(ph,{children:[(0,S.jsx)(mh,{className:`w-[28%]`,children:`DSP`}),(0,S.jsx)(mh,{children:`Owner`}),(0,S.jsx)(mh,{children:`Runtime`}),(0,S.jsx)(mh,{children:`Onboarding`}),(0,S.jsx)(mh,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(fh,{children:T.map(e=>(0,S.jsxs)(ph,{"data-state":c===e.continuityRef?`selected`:void 0,children:[(0,S.jsx)(hh,{children:(0,S.jsxs)(`button`,{className:`identity-button`,onClick:()=>l(e.continuityRef),children:[(0,S.jsx)(Bh,{name:qh(e)}),(0,S.jsxs)(`span`,{className:`dsp-identity-copy`,children:[(0,S.jsx)(`strong`,{children:qh(e)}),(0,S.jsx)(`span`,{children:e.detailsStatus===`complete`?e.abbreviation||e.stations.map(e=>e.code).join(`, `):e.detailsStatus===`submitted`?`Applying DSP details`:`Awaiting DSP details`})]})]})}),(0,S.jsx)(hh,{className:`text-muted-foreground`,children:e.ownerEmail||`No owner assigned`}),(0,S.jsx)(hh,{children:(0,S.jsx)(Um,{value:e.installation.state,children:Yh(e)})}),(0,S.jsx)(hh,{children:(0,S.jsx)(Um,{value:Jh(e)===`Complete`?`neutral`:`pending`,children:Jh(e)})}),(0,S.jsx)(hh,{className:`text-right`,children:(0,S.jsxs)(Nh,{children:[(0,S.jsx)(Ph,{asChild:!0,children:(0,S.jsx)($,{variant:`ghost`,size:`icon`,"aria-label":`Actions for ${qh(e)}`,children:(0,S.jsx)(zp,{})})}),(0,S.jsx)(Fh,{align:`end`,children:(0,S.jsxs)(Ih,{children:[(0,S.jsxs)(Lh,{disabled:g||!D(e),onSelect:()=>void O(e),children:[(0,S.jsx)(Bp,{}),` View`]}),A(e).map(t=>(0,S.jsx)(Lh,{disabled:!A(e).includes(t),variant:[`destroy`,`decommission`,`suspend`,`revoke_owner_invitation`].includes(t)?`destructive`:`default`,onSelect:()=>j(e,t),children:Kh[t]},t))]})})]})})]},e.continuityRef))})]}),!T.length&&(0,S.jsx)(zm,{title:n?`No DSPs match your search`:i===`removed`?`No removed DSPs`:`No DSPs here yet`,description:n?`Try another name or email.`:`Create a DSP to invite its owner.`}),(0,S.jsxs)(`p`,{className:`table-count`,children:[T.length,` DSP`,T.length===1?``:`s`]})]}),(0,S.jsx)(Wm,{open:o||!!f,onClose:()=>{s(!1),p(null)},title:f?`Invite DSP owner`:`Create new DSP`,description:`Invite an owner. Their workspace will be prepared while they finish setup.`,busy:g,children:(0,S.jsxs)(`form`,{onSubmit:ee,className:`panel-form`,children:[(0,S.jsxs)(ip,{children:[(0,S.jsx)(Fm,{label:`Owner email`,name:`ownerEmail`,type:`email`,autoComplete:`off`,maxLength:254,required:!0,disabled:g}),(0,S.jsx)(Lm,{error:v})]}),(0,S.jsxs)(`div`,{className:`panel-footer`,children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:g,onClick:()=>{s(!1),p(null)},children:`Cancel`}),(0,S.jsx)(Hm,{busy:g,children:f?`Create invitation`:`Create DSP`})]})]})}),(0,S.jsx)(Wm,{open:!!E,onClose:()=>l(null),title:E?(0,S.jsxs)(`span`,{className:`dsp-panel-identity`,children:[(0,S.jsx)(Bh,{name:qh(E)}),(0,S.jsx)(`span`,{children:qh(E)})]}):`DSP details`,description:`DSP ownership and runtime status.`,children:E&&(0,S.jsxs)(`div`,{className:`panel-body`,children:[(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Owner`}),(0,S.jsx)(`dd`,{children:E.ownerEmail||`Not assigned`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Runtime`}),(0,S.jsx)(`dd`,{children:(0,S.jsx)(Um,{value:E.installation.state,children:Yh(E)})})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Onboarding`}),(0,S.jsx)(`dd`,{children:Jh(E)})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Station`}),(0,S.jsx)(`dd`,{children:E.stations.map(e=>e.code).join(`, `)||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Timezone`}),(0,S.jsx)(`dd`,{children:E.timezone||`—`})]})]}),!!E.installation.failure&&(0,S.jsx)(Im,{error:!0,children:`This DSP needs attention. Review its setup or retry the failed operation.`}),(0,S.jsxs)(`div`,{className:`flex flex-col gap-2 mt-6`,children:[(0,S.jsxs)($,{disabled:g||!D(E),onClick:()=>void O(E),children:[(0,S.jsx)(Bp,{}),` `,g?`Opening…`:`View`]}),!D(E)&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Viewing is unavailable for suspended or removed DSPs.`}),(0,S.jsx)(Lm,{error:v}),A(E).map(e=>(0,S.jsxs)($,{variant:`outline`,onClick:()=>j(E,e),children:[Kh[e],(0,S.jsx)(Pp,{"data-icon":`inline-end`})]},e))]})]})}),u&&(0,S.jsx)(Gm,{title:Kh[u.kind],passwordRequired:u.kind===`destroy`,description:u.kind===`destroy`?`Permanently delete ${u.org.name} and all its runtime data and backups. Everyone will lose access. This cannot be undone.`:u.kind===`decommission`?`Remove ${u.org.name}. Access will stop immediately and its services will stop. Existing data will be retained so you can restore this DSP later.`:u.kind===`restore_dsp`?`Restore ${u.org.name} with its retained data and settings. Users can sign in again once services are healthy.`:u.kind===`suspend`?`Suspend ${u.org.name}. User access and collection will stop. All data and saved connections will be retained.`:u.kind===`resume`?`Resume ${u.org.name}. Its services and user access will return once the runtime is healthy.`:u.kind===`restart`?`Restart the runtime for ${u.org.name}. Collection and user access will pause briefly.`:u.kind===`revoke_owner_invitation`?`Revoke the owner invitation for ${u.org.name}? The invitation link will stop working.`:`Confirm this action for ${u.org.name}.`,onClose:()=>d(null),onConfirm:k},`${u.org.continuityRef}:${u.kind}`)]})}function Zh(){let[e,t]=(0,x.useState)(!1),[n,r]=(0,x.useState)(null),i=Mt({queryKey:[`platform-diagnostics`],queryFn:()=>nn(`/api/platform/diagnostics`),refetchInterval:5e3}),a=Mt({queryKey:[`platform-runtime`],queryFn:()=>nn(`/api/platform/runtime`),refetchInterval:5e3});async function o(){if(!e){t(!0),r(null);try{let e=await cn(`diagnostics-create`,`/api/platform/diagnostics`,{});Yt.setQueryData([`platform-diagnostics`],e),await Yt.invalidateQueries({queryKey:[`fleet`]})}catch(e){r(e)}finally{t(!1)}}}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Nm,{title:`Diagnostics`,description:`Check runtime health and create test DSPs.`}),(0,S.jsx)(Lm,{error:n||i.error||a.error}),a.data?.enabled&&(0,S.jsxs)(`section`,{"aria-label":`Runtime health`,className:`rounded-xl border bg-card p-6 mb-6 space-y-3`,children:[(0,S.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Runtime health`}),(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Available storage: `,((a.data.storageAvailableBytes??0)/1024**3).toFixed(1),` GiB`]}),a.data.runtimes.map(e=>(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-between gap-2 border-t pt-3 text-sm`,children:[(0,S.jsx)(`span`,{children:e.name}),(0,S.jsxs)(`span`,{children:[e.status,` · `,e.memoryBytes===null?`—`:`${Math.round(e.memoryBytes/1024**2)} MiB`,` · `,e.tasks??0,` tasks`,e.storage?.limited?` · ${((e.storage.availableBytes??0)/1024**3).toFixed(1)} GiB storage free`:e.storage?.limited===!1?` · Storage limit pending migration`:` · Storage unavailable`]})]},e.reference)),!a.data.runtimes.length&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No DSP runtimes yet.`})]}),i.isPending?(0,S.jsx)(Rm,{}):i.data?(0,S.jsxs)(`div`,{className:`space-y-6`,children:[(0,S.jsxs)(`section`,{className:`rounded-xl border bg-card p-6 space-y-4`,"aria-labelledby":`test-dsp-title`,children:[(0,S.jsx)(`h2`,{id:`test-dsp-title`,className:`text-lg font-semibold`,children:`Test DSP`}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Deploy a DSP with synthetic employees and timecards. It stays available until you delete it from DSPs. Provider collection stays stopped, and no invitation email is sent.`}),(0,S.jsxs)($,{onClick:o,disabled:e||!i.data.enabled,children:[(0,S.jsx)(Vp,{"aria-hidden":`true`}),e?`Requesting test DSP…`:`Deploy test DSP`]}),i.data.enabled?null:(0,S.jsx)(Im,{children:`Test DSP deployment is unavailable on this installation.`})]}),(0,S.jsx)(`section`,{"aria-label":`Test DSP deployments`,className:`space-y-3`,"aria-live":`polite`,children:i.data.dsps.map(e=>(0,S.jsxs)(`div`,{className:`rounded-xl border p-4`,children:[(0,S.jsx)(`h3`,{className:`font-medium`,children:e.name}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.status===`pending`?`Creating DSP and preparing synthetic data…`:e.status===`failed`?`Setup needs attention. Open DSPs to inspect or delete this test DSP.`:`Synthetic data prepared · ${e.installation.state===`ready`?`Available`:e.installation.state}`})]},e.name))}),(0,S.jsx)(`a`,{href:`#/platform`,className:`text-sm underline`,children:`Manage test DSPs in DSPs`})]}):null]})}function Qh({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card`,className:V(`flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm`,e),...t})}function $h({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-header`,className:V(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,e),...t})}function eg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-title`,className:V(`leading-none font-semibold`,e),...t})}function tg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-description`,className:V(`text-sm text-muted-foreground`,e),...t})}function ng({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-content`,className:V(`px-6`,e),...t})}function rg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-footer`,className:V(`flex items-center px-6 [.border-t]:pt-6`,e),...t})}var ig={not_connected:`Not connected`,not_verified:`Not verified`,checking:`Checking connection`,connected:`Connected`,verification_required:`Verification required`,credentials_rejected:`Credentials rejected`,temporarily_unavailable:`Temporarily unavailable`};function ag(e){if(e.state===`checking`){if(e.assistance)return`Completing CAPTCHA`;if(e.check?.phase===`checking_session`)return`Checking session`;if(e.check?.phase===`signing_in`)return`Signing in`}return ig[e.state]}function og(e){return e.assistance?.phase===`queued`?`Paycom requested a CAPTCHA. Waiting for automatic verification to start.`:e.assistance?.phase===`solving`?`Completing Paycom’s CAPTCHA automatically. You can leave this page while verification finishes.`:e.assistance?.phase===`verifying`?`Checking Paycom’s response before continuing.`:e.check?.phase===`checking_session`?`Checking whether your saved Paycom session is still signed in.`:e.check?.phase===`signing_in`?`Signing in to Paycom with your saved credentials and security answers.`:e.reason===`verification_code_rejected`?`Amazon didn’t accept that code. Enter the newest code from your email.`:e.reason===`verification_expired`?`This verification attempt ended. Test the connection to start a new sign-in.`:e.verification&&e.state!==`checking`?`Amazon sent you an email verification code. Enter it below to finish signing in.`:e.reason===`attempt_cooldown`?`The service needs a pause before another login attempt. Retry after the time shown below.`:e.service===`paycom`&&e.reason===`captcha_required`?`Paycom requires a CAPTCHA before sign-in can finish. Contact your Dispatch administrator to complete verification. Connection tests will remain blocked until it is resolved.`:e.service===`paycom`&&e.reason===`security_answers_rejected`?`Paycom rejected the security-answer step. Contact your Dispatch administrator to verify the saved numbered PINs and complete sign-in.`:e.state===`verification_required`?`The service needs human verification. Contact your Dispatch administrator to complete it, then test the connection again.`:e.state===`credentials_rejected`?`The service rejected the saved login. Check your account details and update the credentials.`:e.state===`temporarily_unavailable`?`We couldn’t verify this connection. Your credentials remain saved. Try testing it again shortly.`:e.state===`checking`?`Verifying your login. You can leave this page while the check finishes.`:e.state===`not_verified`?`Credentials are saved. Test the connection to verify access.`:e.state===`connected`?`Signed in successfully. Your DSP’s connection is saved securely.`:`Connect once to make this service available to your DSP’s features.`}function sg({verification:e,busy:t,onVerify:n}){let{timeZone:r}=th();async function i(t){t.preventDefault();let r=t.currentTarget,i={code:String(new FormData(r).get(`code`)||``).trim(),verificationId:e.id};r.reset();try{await n(i)}finally{i.code=``}}return(0,S.jsxs)(`form`,{onSubmit:i,className:`flex flex-col gap-3`,"aria-label":`Cortex email verification`,children:[(0,S.jsx)(Fm,{label:`Email verification code`,name:`code`,type:`text`,inputMode:`numeric`,autoComplete:`one-time-code`,pattern:`[0-9]{6}`,minLength:6,maxLength:6,required:!0,disabled:t}),(0,S.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Enter the six-digit code. This prompt expires at`,` `,Om(e.expiresAt,r),`.`]}),(0,S.jsx)(Hm,{busy:t,disabled:t||e.attemptsRemaining===0,children:`Verify code`})]})}function cg(){let{timeZone:e}=th(),{session:t}=Xm(),n=dn(t),r=fn(t),i=Mt({queryKey:[`connections`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/connections`,{signal:e}),enabled:r,refetchInterval:e=>e.state.data?.items.some(e=>e.state===`checking`||e.state===`not_verified`||!!e.verification)?2e3:15e3}),[a,o]=(0,x.useState)(null),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(null),[p,m]=(0,x.useState)(null),[h,g]=(0,x.useState)(!1),_=i.data?.items.find(e=>e.service===p),v=p&&_?`${i.data?.services.find(e=>e.id===p)?.name}: ${s===p?`Checking session`:ag(_)}.`:null;if(!r)return null;async function y(e,t,r){c(e.id),u(null),f(null),m(t===`test`?e.id:null),g(!1);try{let a=await rn(`/api/organization/connections/${e.id}/${t}`,`POST`,t===`save`?{credentials:r}:t===`verify`?r:{});t===`test`&&Yt.setQueryData([`connections`,n?.organizationId],t=>t&&{...t,items:t.items.map(t=>t.service===e.id?a:t)}),await Yt.invalidateQueries({queryKey:[`paycom-connection`,n?.organizationId]}),o(null),f(t===`verify`?null:t===`disconnect`?`${e.name} disconnected.`:t===`save`?`${e.name} credentials saved.`:null),await i.refetch()}catch(e){u(e),m(null),t===`save`&&(!(e instanceof Jt)||!e.status||e.status>=500)&&(g(!0),await i.refetch())}finally{c(null)}}async function b(e){if(e.preventDefault(),!a)return;let t=e.currentTarget,n=Object.fromEntries(new FormData(t));t.reset(),await y(a.service,`save`,n);for(let e of Object.keys(n))n[e]=``}return(0,S.jsxs)(`section`,{className:`flex flex-col gap-6 py-6`,"aria-labelledby":`connections-heading`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`connections-heading`,className:`text-lg font-semibold`,children:`Connections`}),(0,S.jsx)(`p`,{className:`text-muted-foreground`,children:`Connect the services your DSP uses. All supported features share these connections.`})]}),!a&&(0,S.jsx)(Lm,{error:l||i.error}),d&&(0,S.jsx)(Im,{children:d}),v&&(0,S.jsx)(`div`,{role:`status`,children:(0,S.jsx)(Im,{error:!!_&&![`checking`,`connected`].includes(_.state),children:v})}),i.isPending?(0,S.jsx)(Rm,{}):i.data?(0,S.jsx)(`div`,{className:`grid gap-6 lg:grid-cols-2`,children:i.data.services.map(t=>{let n=i.data.items.find(e=>e.service===t.id);if(!n)return null;let r=n.state===`checking`,a=s!==null||r;return(0,S.jsxs)(Qh,{children:[(0,S.jsxs)($h,{children:[(0,S.jsxs)(eg,{className:`flex items-center gap-3`,children:[(0,S.jsx)(Kp,{className:`size-5`,"aria-hidden":`true`}),t.name]}),(0,S.jsx)(tg,{children:t.id===`cortex`?`Amazon Logistics dashboard`:`Workforce and timecards`})]}),(0,S.jsxs)(ng,{className:`flex flex-col gap-4`,children:[(0,S.jsx)(`div`,{role:`status`,children:(0,S.jsx)(ih,{variant:n.state===`connected`?`default`:`secondary`,children:ag(n)})}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:og(n)}),n.verification&&(0,S.jsx)(sg,{verification:n.verification,busy:a,onVerify:e=>y(t,`verify`,e)},n.verification.id),n.checkedAt&&(0,S.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Last checked: `,Om(n.checkedAt,e)]}),n.retryAt&&(0,S.jsxs)(`p`,{className:`text-sm`,children:[`Retry after `,Om(n.retryAt,e)]})]}),(0,S.jsxs)(rg,{className:`mt-auto flex flex-wrap gap-2`,children:[(0,S.jsx)($,{disabled:a,onClick:()=>{u(null),g(!1),o({service:t,action:`save`})},children:n.configured?`Update credentials`:`Connect ${t.name}`}),n.configured&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)($,{variant:`outline`,disabled:a||!!n.verification||t.id!==`paycom`&&!!n.retryAt&&Date.parse(n.retryAt)>Date.now(),onClick:()=>void y(t,`test`),children:[(0,S.jsx)(Yp,{className:`size-4`,"aria-hidden":`true`}),`Test connection`]}),(0,S.jsx)($,{variant:`ghost`,disabled:a,onClick:()=>{u(null),o({service:t,action:`disconnect`})},children:`Disconnect`})]})]})]},t.id)})}):(0,S.jsx)($,{variant:`outline`,onClick:()=>void i.refetch(),children:`Retry loading connections`}),(0,S.jsxs)(`p`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,S.jsx)(Qp,{className:`size-4 shrink-0`,"aria-hidden":`true`}),`DSP owners and platform owners can manage these credentials.`]}),(0,S.jsx)(lm,{open:a!==null,onOpenChange:e=>{!e&&!s&&(o(null),u(null))},children:(0,S.jsxs)(fm,{className:`max-h-[90dvh] overflow-y-auto`,children:[(0,S.jsxs)(pm,{children:[(0,S.jsx)(hm,{children:a?.action===`disconnect`?`Disconnect ${a.service.name}?`:`${a?.service.name||`Service`} credentials`}),(0,S.jsx)(gm,{children:a?.action===`disconnect`?`Features will lose access to this service until you reconnect. Previously collected data will remain available.`:`Enter the account your DSP uses. Saved credentials are encrypted and are never displayed here.`})]}),a?.action===`save`?(0,S.jsx)(`form`,{onSubmit:b,children:(0,S.jsxs)(ip,{children:[a.service.fields.map(e=>(0,S.jsx)(Fm,{name:e.name,label:e.label,type:e.name===`password`||e.name.startsWith(`pin`)?`password`:`text`,autoComplete:e.name===`username`?`username`:`off`,maxLength:e.maximum,required:!0,disabled:s!==null},e.name)),a.service.id===`paycom`&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter all five distinct security answers in the order configured for your Paycom account.`}),(0,S.jsx)(Lm,{error:l}),h&&(0,S.jsx)(Im,{children:`We couldn’t confirm this save. Your credentials may already be stored. Close this form to check the connection before retrying.`}),(0,S.jsxs)(mm,{children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:s!==null,onClick:()=>o(null),children:`Cancel`}),(0,S.jsx)(Hm,{busy:s!==null,disabled:s!==null,children:`Save and connect`})]})]})},a.service.id):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Lm,{error:l}),(0,S.jsxs)(mm,{children:[(0,S.jsx)($,{variant:`outline`,disabled:s!==null,onClick:()=>o(null),children:`Cancel`}),(0,S.jsx)($,{variant:`destructive`,disabled:s!==null,onClick:()=>a&&void y(a.service,`disconnect`),children:`Disconnect`})]})]})]})})]})}function lg(){let{session:e}=Xm(),{timeZone:t}=th(),n=dn(e),r=n?.organization.status===`suspended`,i=Mt({queryKey:[`organization-audit`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/audit`,{signal:e}),enabled:ln(n,`audit.read`)&&!r,refetchInterval:15e3});return r?(0,S.jsx)(Im,{children:`This DSP is suspended. The audit log is unavailable.`}):ln(n,`audit.read`)?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Recent changes to your DSP, team, and access.`}),(0,S.jsx)(Bm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsx)(Lm,{error:i.error}),i.isPending?(0,S.jsx)(Rm,{}):i.data&&!i.error?i.data.audit.length?(0,S.jsxs)(uh,{children:[(0,S.jsx)(dh,{children:(0,S.jsxs)(ph,{children:[(0,S.jsx)(mh,{children:`Action`}),(0,S.jsx)(mh,{children:`By`}),(0,S.jsx)(mh,{children:`Date`}),(0,S.jsx)(mh,{children:`Result`})]})}),(0,S.jsx)(fh,{children:i.data.audit.map((e,n)=>(0,S.jsxs)(ph,{children:[(0,S.jsx)(hh,{children:e.action.replaceAll(`.`,` `)}),(0,S.jsx)(hh,{children:e.actor}),(0,S.jsx)(hh,{children:Om(e.createdAt,t)}),(0,S.jsx)(hh,{children:(0,S.jsx)(Um,{value:e.result,children:e.result})})]},e.id||n))})]}):(0,S.jsx)(zm,{title:`No audit events yet`,description:`Changes to your DSP will appear here.`}):null]}):null}var ug=[{value:`light`,label:`Light`,description:`A bright, clean workspace.`},{value:`dark`,label:`Dark`,description:`A calm, low-light workspace.`},{value:`system`,label:`System`,description:`Match your device settings.`}];function dg({mode:e}){let{themePack:t}=Sp();return(0,S.jsxs)(`span`,{className:`theme-preview-ui theme-preview-scope`,"data-theme":e,"data-theme-pack":t.id,children:[(0,S.jsxs)(`span`,{className:`theme-preview-sidebar`,children:[(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{})]}),(0,S.jsxs)(`span`,{className:`theme-preview-content`,children:[(0,S.jsx)(`span`,{className:`theme-preview-heading`}),(0,S.jsx)(`span`,{className:`theme-preview-subheading`}),(0,S.jsx)(`span`,{className:`theme-preview-table`,children:[0,1,2].map(e=>(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{})]},e))})]})]})}function fg(){let{appearance:e,setAppearance:t,themePack:n,setThemePack:r,storageUnavailable:i}=Sp();return(0,S.jsxs)(`section`,{className:`theme-section`,children:[(0,S.jsxs)(`div`,{className:`theme-pack-field`,children:[(0,S.jsx)(`label`,{htmlFor:`theme-pack`,children:`Theme`}),(0,S.jsx)(`select`,{id:`theme-pack`,value:n.id,onChange:e=>r(e.target.value),"aria-describedby":`theme-pack-description`,children:pp.map(e=>(0,S.jsx)(`option`,{value:e.id,children:e.name},e.id))}),(0,S.jsx)(`p`,{id:`theme-pack-description`,children:n.description})]}),(0,S.jsxs)(`fieldset`,{"aria-describedby":`theme-description theme-persistence`,children:[(0,S.jsx)(`legend`,{children:`Appearance`}),(0,S.jsx)(`p`,{id:`theme-description`,children:`Choose how Dispatch looks for you.`}),(0,S.jsx)(`div`,{className:`theme-options`,children:ug.map(({value:n,label:r,description:i})=>(0,S.jsxs)(`label`,{className:`theme-option`,children:[(0,S.jsx)(`input`,{type:`radio`,name:`theme`,value:n,checked:e===n,onChange:()=>t(n),"aria-label":r,"aria-describedby":`theme-${n}-description`}),(0,S.jsxs)(`span`,{className:`theme-preview theme-preview-${n}`,"aria-hidden":`true`,children:[(0,S.jsx)(dg,{mode:n===`dark`?`dark`:`light`}),n===`system`&&(0,S.jsx)(dg,{mode:`dark`})]}),(0,S.jsx)(`span`,{className:`theme-option-label`,children:r}),(0,S.jsx)(`span`,{id:`theme-${n}-description`,className:`theme-option-description`,children:i})]},n))}),(0,S.jsx)(`p`,{id:`theme-persistence`,className:`theme-persistence`,children:`Saved for your account on this browser. Other users keep their own theme.`}),i&&(0,S.jsx)(`p`,{role:`status`,className:`theme-storage-notice`,children:`Theme applied for this visit. Browser storage is unavailable, so it could not be saved.`})]})]})}var pg=typeof Intl.supportedValuesOf==`function`?Intl.supportedValuesOf(`timeZone`):[`America/Los_Angeles`,`America/Phoenix`,`America/Denver`,`America/Chicago`,`America/New_York`,`Europe/London`];function mg(){let{timeZone:e,deviceZone:t,preference:n,setPreference:r,storageUnavailable:i}=th(),a=[...new Set([`UTC`,t,n,...pg].filter(Em))].sort();return(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Date & time`}),(0,S.jsx)(`p`,{children:`Choose how event times appear for you.`})]}),(0,S.jsxs)(`div`,{className:`theme-pack-field`,children:[(0,S.jsx)(`label`,{htmlFor:`display-timezone`,children:`Display timezone`}),(0,S.jsxs)(`select`,{id:`display-timezone`,value:n||`automatic`,onChange:e=>r(e.target.value===`automatic`?null:e.target.value),"aria-describedby":`display-timezone-description`,children:[(0,S.jsxs)(`option`,{value:`automatic`,children:[`Automatic — device timezone (`,t.replaceAll(`_`,` `),`)`]}),a.map(e=>(0,S.jsx)(`option`,{value:e,children:e.replaceAll(`_`,` `)},e))]}),(0,S.jsxs)(`p`,{id:`display-timezone-description`,children:[`Sync and activity times use `,e.replaceAll(`_`,` `),`. Timecards keep the DSP’s business timezone.`]}),(0,S.jsx)(`p`,{children:`Saved for your account on this browser.`}),i&&(0,S.jsx)(`p`,{role:`status`,children:`Applied for this visit. Browser storage is unavailable, so this preference could not be saved.`})]})]})}function hg({onboarding:e=!1}){let{session:t,refresh:n}=Xm(),r=e?t.memberships.find(e=>e.organizationId===t.activeOrganizationId)||null:dn(t),i=Mt({queryKey:[`profile`,r?.organizationId],queryFn:()=>nn(`/api/organization/profile`),enabled:ln(r,`organization.owner`)&&r?.organization.status!==`suspended`,refetchInterval:e=>e.state.data?.status===`submitted`&&2e3}),[a,o]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null);if(!ln(r,`organization.owner`))return null;if(i.error)return(0,S.jsx)(Lm,{error:i.error});if(!i.data)return e?(0,S.jsx)(Rm,{}):null;if(i.data.status===`complete`||i.data.status===`submitted`)return!e&&i.data.status===`complete`?null:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Im,{children:i.data.status===`complete`?`Your DSP details are complete. You can continue to your workspace.`:`Your DSP details are saved. They’ll be applied when your workspace is ready.`}),e&&(0,S.jsx)($,{className:`mt-6`,onClick:()=>{location.hash=un(t)?`#/platform`:`#/settings`},children:`Continue to workspace`})]});async function l(e){e.preventDefault();let t=Object.fromEntries(new FormData(e.currentTarget));o(!0),c(null);try{await rn(`/api/organization/profile`,`POST`,t),await i.refetch(),await n()}catch(e){c(e)}finally{o(!1)}}return(0,S.jsxs)(`section`,{className:e?`onboarding-details`:`setup-section`,children:[!e&&(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Set up your DSP`}),(0,S.jsx)(`p`,{children:`Your workspace is being prepared. Add your DSP details to finish onboarding.`})]}),(0,S.jsx)(`form`,{onSubmit:l,children:(0,S.jsxs)(ip,{children:[(0,S.jsx)(Fm,{label:`DSP name`,name:`name`,minLength:2,maxLength:120,required:!0,disabled:a}),(0,S.jsx)(Fm,{label:`Abbreviation (optional)`,name:`abbreviation`,maxLength:16,disabled:a}),(0,S.jsx)(Fm,{label:`Station code`,name:`stationCode`,pattern:`[A-Za-z0-9]{3,8}`,maxLength:8,required:!0,disabled:a}),(0,S.jsx)(Fm,{label:`Business timezone`,name:`timezone`,defaultValue:Dm(),maxLength:64,required:!0,disabled:a}),(0,S.jsx)(Lm,{error:s}),(0,S.jsx)(Hm,{busy:a,disabled:a,children:`Save DSP details`})]})})]})}function gg(){let{session:e,refresh:t}=Xm(),n=()=>{let e=new URLSearchParams(location.hash.split(`?`)[1]).get(`tab`);return e===`theme`||e===`security`||e===`audit`||e===`connections`?e:`general`},[r,i]=(0,x.useState)(n);(0,x.useEffect)(()=>{let e=()=>i(n());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let a=un(e),o=dn(e),s=fn(e),c=!a&&ln(o,`audit.read`),[l,u]=(0,x.useState)(!1),[d,f]=(0,x.useState)(null),[p,m]=(0,x.useState)(!1);async function h(e){e.preventDefault();let n=e.currentTarget,r=Object.fromEntries(new FormData(n));u(!0),m(!1),f(null);try{await rn(`/api/auth/change-password`,`POST`,r),await t(),n.reset(),m(!0)}catch(e){f(e)}finally{u(!1)}}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Nm,{title:`Settings`,description:a?`Your platform account and security.`:`Your account, workspace, and security.`}),(0,S.jsxs)(ah,{value:r===`audit`&&!c||r===`connections`&&!s?`general`:r,onValueChange:e=>{i(e),history.replaceState({},``,`${location.pathname}${location.search}${location.hash.split(`?`)[0]}?tab=${e}`)},children:[(0,S.jsxs)(sh,{variant:`line`,className:`page-tabs`,children:[(0,S.jsx)(ch,{value:`general`,children:`General`}),(0,S.jsx)(ch,{value:`security`,children:`Security`}),s&&(0,S.jsx)(ch,{value:`connections`,children:`Connections`}),(0,S.jsx)(ch,{value:`theme`,children:`Theme`}),c&&(0,S.jsx)(ch,{value:`audit`,children:`Audit log`})]}),s&&(0,S.jsx)(lh,{value:`connections`,children:(0,S.jsx)(cg,{},o?.organizationId)}),(0,S.jsxs)(lh,{value:`general`,children:[(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Account`}),(0,S.jsx)(`p`,{children:e.dspView?`You are signed in with your platform account.`:`Your Dispatch sign-in details.`})]}),(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Name`}),(0,S.jsx)(`dd`,{children:e.user.name})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Email address`}),(0,S.jsx)(`dd`,{children:e.user.email})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Role`}),(0,S.jsx)(`dd`,{children:a||e.dspView?`Platform owner`:o?.roleName||`No DSP access`})]})]})]}),(0,S.jsx)(mg,{}),!a&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Workspace`}),(0,S.jsx)(`p`,{children:`Your current DSP context.`})]}),(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`DSP`}),(0,S.jsx)(`dd`,{children:o?.organization.name||`No DSP selected`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Station`}),(0,S.jsx)(`dd`,{children:o?.organization.stations.map(e=>e.code).join(`, `)||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Business timezone`}),(0,S.jsx)(`dd`,{children:o?.organization.timezone||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Status`}),(0,S.jsx)(`dd`,{children:o?.organization.status.replaceAll(`_`,` `)||`Unavailable`})]})]})]}),(0,S.jsx)(hg,{})]})]}),c&&(0,S.jsx)(lh,{value:`audit`,children:(0,S.jsx)(lg,{})}),(0,S.jsx)(lh,{value:`theme`,children:(0,S.jsx)(fg,{})}),(0,S.jsx)(lh,{value:`security`,children:(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Change password`}),(0,S.jsx)(`p`,{children:`Changing your password signs out every other session.`})]}),(0,S.jsx)(`form`,{onSubmit:h,className:`max-w-md`,children:(0,S.jsxs)(ip,{children:[(0,S.jsx)(Fm,{label:`Current password`,name:`currentPassword`,type:`password`,autoComplete:`current-password`,maxLength:128,required:!0,disabled:l}),(0,S.jsx)(Fm,{label:`New password`,name:`newPassword`,type:`password`,autoComplete:`new-password`,minLength:12,maxLength:128,required:!0,disabled:l,description:`Use at least 12 characters.`}),(0,S.jsx)(Fm,{label:`Confirm new password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,minLength:12,maxLength:128,required:!0,disabled:l}),(0,S.jsx)(Lm,{error:d}),p&&(0,S.jsx)(Im,{children:`Password changed. Other sessions have been signed out.`}),(0,S.jsx)(`div`,{children:(0,S.jsx)(Hm,{busy:l,disabled:l,children:`Change password`})})]})})]})})]})]})}function _g(){return(0,x.useEffect)(()=>{document.title=`Set up your DSP · Dispatch`},[]),(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(pn,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground mb-3`,children:`Step 2 of 2 · DSP details`}),(0,S.jsx)(`h1`,{children:`Set up your DSP`}),(0,S.jsx)(`p`,{className:`auth-description`,children:`Your account is ready. Add your DSP details while we prepare your workspace.`}),(0,S.jsx)(hg,{onboarding:!0})]})]})}function vg(e,t){let n=e.find(e=>e.available&&e.pages.some(e=>e.id===t));return n?kh(n.id,n.version,n.revision,t):void 0}function yg(e,t){let n=dn(t);return e.filter(e=>e.available).flatMap(e=>e.pages).filter(e=>ln(n,e.permission))}function bg(e){let t=un(e),n=dn(e);return Mt({queryKey:[`plugins`,t?`platform`:n?.organizationId],queryFn:({signal:e})=>nn(t?`/api/platform/plugins`:`/api/organization/plugins`,{signal:e}),initialData:!t&&e.plugins?{items:e.plugins}:void 0,enabled:e.authenticated&&(t||!!n&&ln(n,`dashboard.view`)),refetchInterval:e=>e.state.data?.items.some(e=>e.pending)?2e3:15e3})}function xg(){let{session:e,refresh:t}=Xm(),n=un(e),r=fn(e),i=bg(e),[a,o]=(0,x.useState)(null),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null);async function d(n,r){o(n.id),c(null);try{await cn(`plugin:${n.id}:${r}:${n.revision}`,`/api/organization/plugins/${n.id}`,{action:r,expectedRevision:n.revision}),u(null),await i.refetch(),await Yt.invalidateQueries({queryKey:[`connections`,dn(e)?.organizationId]}),await t()}catch(e){c(e)}finally{o(null)}}return(0,S.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,S.jsx)(Nm,{title:`Plugins`,description:n?`Available plugins that DSP owners can install for their workspace.`:`Choose the features your DSP uses. Your saved data stays with your DSP.`}),(0,S.jsx)(Lm,{error:s||i.error}),i.isPending?(0,S.jsx)(Rm,{}):(0,S.jsx)(`div`,{className:`grid gap-4 md:grid-cols-2 xl:grid-cols-3`,children:i.data?.items.map(e=>(0,S.jsxs)(Qh,{children:[(0,S.jsxs)($h,{children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,S.jsx)(Jp,{"aria-hidden":`true`,className:`size-5 text-muted-foreground`}),!n&&(0,S.jsx)(ih,{variant:`secondary`,children:e.pending?`Applying changes`:e.state===`enabled`?`Installed`:e.state===`disabled`?`Disabled`:`Not installed`})]}),(0,S.jsx)(eg,{children:e.name}),(0,S.jsx)(tg,{children:e.description})]}),(0,S.jsx)(ng,{children:e.failureCode?(0,S.jsx)(Im,{error:!0,children:`We couldn’t finish applying this change. Dispatch will retry when your DSP is available.`}):e.pending?(0,S.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Updating this plugin for your DSP…`}):!n&&e.state===`disabled`?(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Its pages and background work are stopped. Your saved data and credentials are retained.`}):null}),!n&&r&&(0,S.jsx)(rg,{className:`flex flex-wrap gap-2`,children:e.state===`uninstalled`?(0,S.jsxs)($,{disabled:!!a||e.pending,onClick:()=>void d(e,`install`),children:[`Install `,e.name]}):(0,S.jsxs)(S.Fragment,{children:[e.available&&e.pages[0]&&(0,S.jsx)($,{asChild:!0,children:(0,S.jsxs)(`a`,{href:`#/${e.pages[0].id}`,children:[`Open `,e.name]})}),e.available&&e.hasSettings&&e.pages[0]&&(0,S.jsx)($,{asChild:!0,variant:`outline`,children:(0,S.jsx)(`a`,{href:`#/${e.pages[0].id}?settings`,children:`Settings`})}),(0,S.jsx)($,{variant:`outline`,disabled:!!a||e.pending,onClick:()=>void d(e,e.state===`disabled`?`enable`:`disable`),children:e.state===`disabled`?`Enable`:`Disable`}),(0,S.jsx)($,{variant:`ghost`,disabled:!!a||e.pending,onClick:()=>u(e),children:`Uninstall`})]})})]},e.id))}),(0,S.jsx)(lm,{open:!!l,onOpenChange:e=>{!e&&!a&&u(null)},children:(0,S.jsxs)(fm,{children:[(0,S.jsxs)(pm,{children:[(0,S.jsxs)(hm,{children:[`Uninstall `,l?.name,`?`]}),(0,S.jsx)(gm,{children:`Its pages and background work will stop. Your collected data and saved credentials will stay with this DSP so you can reinstall it later.`})]}),(0,S.jsxs)(mm,{children:[(0,S.jsx)($,{variant:`outline`,disabled:!!a,onClick:()=>u(null),children:`Cancel`}),(0,S.jsx)($,{disabled:!!a,onClick:()=>l&&void d(l,`uninstall`),children:`Uninstall plugin`})]})]})})]})}function Sg({className:e,size:t=`default`,...n}){return(0,S.jsxs)(`div`,{className:`group/native-select relative w-fit has-[select:disabled]:opacity-50`,"data-slot":`native-select-wrapper`,children:[(0,S.jsx)(`select`,{"data-slot":`native-select`,"data-size":t,className:V(`h-9 w-full min-w-0 appearance-none rounded-md border border-input bg-transparent px-3 py-2 pr-9 text-sm shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed data-[size=sm]:h-8 data-[size=sm]:py-1 dark:bg-input/30 dark:hover:bg-input/50`,`focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`,`aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40`,e),...n}),(0,S.jsx)(Lp,{className:`pointer-events-none absolute top-1/2 right-3.5 size-4 -translate-y-1/2 text-muted-foreground opacity-50 select-none`,"aria-hidden":`true`,"data-slot":`native-select-icon`})]})}function Cg({className:e,...t}){return(0,S.jsx)(`option`,{"data-slot":`native-select-option`,className:V(`bg-[Canvas] text-[CanvasText]`,e),...t})}function wg(){let{session:e}=Xm(),{timeZone:t}=th(),n=dn(e),r=n?.organization.status===`suspended`,i=Mt({queryKey:[`team`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/administration`,{signal:e}),enabled:!r,refetchInterval:15e3}),[a,o]=(0,x.useState)(`members`),[s,c]=(0,x.useState)(``),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)(null),[h,g]=(0,x.useState)(null),[_,v]=(0,x.useState)(null),y=i.data,b=y?.roles.filter(e=>e.permissions.every(e=>n?.permissions.includes(e)))||[],C=y?.members.filter(e=>`${e.user.name} ${e.user.email}`.toLowerCase().includes(s.toLowerCase()))||[];function w(e){m(null),u(e)}async function T(e){if(e.preventDefault(),!l)return;f(!0),m(null);let t=new FormData(e.currentTarget);try{l.kind===`invite`?g(await rn(`/api/organization/invitations`,`POST`,{email:t.get(`email`),roleId:t.get(`roleId`)})):l.kind===`member`&&await rn(`/api/organization/members/${l.member.id}/role`,`PUT`,{roleId:t.get(`roleId`)}),u(null),await i.refetch()}catch(e){m(e)}finally{f(!1)}}let E=y?.invitations.filter(e=>e.status===`pending`)||[];return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Nm,{title:`Team & Roles`,description:`Manage your team and their access.`,children:!r&&ln(n,`members.invite`)&&(0,S.jsxs)($,{onClick:()=>w({kind:`invite`}),children:[(0,S.jsx)(qp,{"data-icon":`inline-start`}),`Invite member`]})}),r?(0,S.jsx)(Im,{children:`This DSP is suspended. Team administration is unavailable.`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(hg,{}),(0,S.jsx)(Km,{result:h}),(0,S.jsx)(Lm,{error:i.error}),i.isPending?(0,S.jsx)(Rm,{}):y&&!i.error?(0,S.jsxs)(ah,{value:a,onValueChange:o,children:[(0,S.jsxs)(sh,{variant:`line`,className:`page-tabs`,children:[(0,S.jsx)(ch,{value:`members`,children:`Members`}),(0,S.jsx)(ch,{value:`roles`,children:`Roles`}),(0,S.jsxs)(ch,{value:`invitations`,children:[`Invitations`,E.length>0&&(0,S.jsx)(`span`,{className:`tab-count`,children:E.length})]})]}),(0,S.jsxs)(lh,{value:`members`,children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(Vm,{value:s,onChange:c,placeholder:`Search members`}),(0,S.jsx)(Bm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsxs)(uh,{children:[(0,S.jsx)(dh,{children:(0,S.jsxs)(ph,{children:[(0,S.jsx)(mh,{className:`w-[45%]`,children:`Member`}),(0,S.jsx)(mh,{children:`Role`}),(0,S.jsx)(mh,{children:`Access`}),(0,S.jsx)(mh,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(fh,{children:C.map(t=>(0,S.jsxs)(ph,{children:[(0,S.jsx)(hh,{children:(0,S.jsxs)(`div`,{className:`member-identity`,children:[(0,S.jsx)(`span`,{className:`avatar`,children:t.user.name.split(/\s+/).map(e=>e[0]).slice(0,2).join(``)}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`strong`,{children:t.user.name}),(0,S.jsx)(`span`,{children:t.user.email})]})]})}),(0,S.jsx)(hh,{children:t.role.name}),(0,S.jsx)(hh,{children:(0,S.jsx)(Um,{value:`active`,children:`Active`})}),(0,S.jsx)(hh,{className:`text-right`,children:t.user.id!==e.user.id&&ln(n,`members.manage`)&&(0,S.jsxs)(Nh,{children:[(0,S.jsx)(Ph,{asChild:!0,children:(0,S.jsx)($,{size:`icon`,variant:`ghost`,"aria-label":`Actions for ${t.user.name}`,children:(0,S.jsx)(zp,{})})}),(0,S.jsx)(Fh,{align:`end`,children:(0,S.jsxs)(Ih,{children:[(0,S.jsx)(Lh,{onSelect:()=>w({kind:`member`,member:t}),children:`Change role`}),(0,S.jsx)(Lh,{variant:`destructive`,onSelect:()=>v({title:`Remove member`,description:`Remove ${t.user.name} from ${y.organization.name}?`,path:`/api/organization/members/${t.id}`}),children:`Remove member`})]})})]})})]},t.id))})]}),!C.length&&(0,S.jsx)(zm,{title:`No members found`,description:`Try a different name or email.`}),(0,S.jsxs)(`p`,{className:`table-count`,children:[C.length,` member`,C.length===1?``:`s`]})]}),(0,S.jsxs)(lh,{value:`roles`,children:[(0,S.jsx)(`div`,{className:`table-toolbar`,children:(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Standard roles for your DSP. All roles currently have the same permissions.`})}),(0,S.jsx)(`div`,{className:`role-list`,children:y.roles.map(e=>(0,S.jsx)(`section`,{className:`role-row`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{children:e.name}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Standard role`})]}),(0,S.jsx)(`p`,{children:e.description})]})},e.id))})]}),(0,S.jsxs)(lh,{value:`invitations`,children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Pending invitations to your DSP.`}),(0,S.jsx)(Bm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsxs)(uh,{children:[(0,S.jsx)(dh,{children:(0,S.jsxs)(ph,{children:[(0,S.jsx)(mh,{children:`Email address`}),(0,S.jsx)(mh,{children:`Role`}),(0,S.jsx)(mh,{children:`Expires`}),(0,S.jsx)(mh,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(fh,{children:E.map(e=>(0,S.jsxs)(ph,{children:[(0,S.jsx)(hh,{children:e.email}),(0,S.jsx)(hh,{children:e.roleName}),(0,S.jsx)(hh,{children:Om(e.expiresAt,t)}),(0,S.jsx)(hh,{className:`text-right`,children:ln(n,`members.invite`)&&(0,S.jsx)($,{variant:`ghost`,size:`sm`,"aria-label":`Revoke invitation for ${e.email}`,onClick:()=>v({title:`Revoke invitation`,description:`Revoke the invitation for ${e.email}?`,path:`/api/organization/invitations/${e.id}`}),children:`Revoke`})})]},e.id))})]}),!E.length&&(0,S.jsx)(zm,{title:`No pending invitations`,description:`New invitations will appear here until they’re accepted.`})]})]}):null]}),(0,S.jsx)(Wm,{open:!!l,onClose:()=>u(null),title:l?.kind===`invite`?`Invite member`:`Change role`,description:l?.kind===`member`?`Update the role for ${l.member.user.name}.`:`Send an invitation to join your DSP.`,busy:d,children:l&&(0,S.jsxs)(`form`,{onSubmit:T,className:`panel-form`,children:[(0,S.jsxs)(ip,{children:[l.kind===`invite`&&(0,S.jsx)(Fm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`off`,required:!0,disabled:d}),` `,(0,S.jsxs)(op,{children:[(0,S.jsx)(sp,{htmlFor:`editor-role`,children:`Role`}),(0,S.jsx)(Sg,{id:`editor-role`,name:`roleId`,defaultValue:l.kind===`member`?l.member.role.id:b.find(e=>e.key===`driver`)?.id,disabled:d,required:!0,children:b.map(e=>(0,S.jsx)(Cg,{value:e.id,children:e.name},e.id))})]}),(0,S.jsx)(Lm,{error:p})]}),(0,S.jsxs)(`div`,{className:`panel-footer`,children:[(0,S.jsx)($,{variant:`outline`,type:`button`,disabled:d,onClick:()=>u(null),children:`Cancel`}),(0,S.jsx)(Hm,{busy:d,children:l.kind===`invite`?`Send invitation`:`Save role`})]})]},l.kind===`member`?l.member.id:`invite`)}),_&&(0,S.jsx)(Gm,{title:_.title,description:_.description,onClose:()=>v(null),onConfirm:async()=>{await rn(_.path,`DELETE`,{}),await i.refetch()}})]})}function Tg({session:e,refresh:t,token:n}){let[r,i]=(0,x.useState)(!1),[a,o]=(0,x.useState)(null),s=Mt({queryKey:[`invitation`,n],enabled:!!n&&!r,queryFn:()=>rn(`/api/auth/invitation/inspect`,`POST`,{token:n}),refetchOnWindowFocus:!1});(0,x.useEffect)(()=>{o(null)},[n]);let c=s.data,l=!!n,u=l&&!c?.accountExists,d=u?`register`:`login`,f=e?.turnstile?.siteKey,p=`${f}:${d}:${n||``}`,[m,h]=(0,x.useState)({scope:``,token:``}),[g,_]=(0,x.useState)(0),v=m.scope===p?m.token:``,y=(0,x.useCallback)(e=>{h({scope:p,token:e})},[p]),b=c?.kind===`organization_owner`;async function C(){await t(),history.replaceState({},``,`${location.pathname}${location.search}${b?`#/onboarding`:`#/team`}`),window.dispatchEvent(new HashChangeEvent(`hashchange`))}async function w(e){if(e.preventDefault(),r)return;if(f&&!v){o(`turnstile_required`);return}let a=new FormData(e.currentTarget),s=f?{turnstileToken:v}:{};i(!0),o(null);try{u?(await rn(`/api/auth/register`,`POST`,{token:n,...Object.fromEntries(a),...s}),await C()):(await rn(`/api/auth/login`,`POST`,{...Object.fromEntries(a),...s}),await t(),l&&(await rn(`/api/auth/accept-invitation`,`POST`,{token:n}),await C()))}catch(e){o(e),y(``),_(e=>e+1)}finally{i(!1)}}async function T(){i(!0),o(null);try{await rn(`/api/auth/accept-invitation`,`POST`,{token:n}),await C()}catch(e){o(e)}finally{i(!1)}}return(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(pn,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[l&&b&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground mb-3`,children:`Step 1 of 2 · Your account`}),(0,S.jsx)(`h1`,{children:l&&b?`Create your DSP`:l?c?.kind===`platform_owner`?`Join Dispatch`:`Join ${c?.organization?.name||`Dispatch`}`:`Sign in to Dispatch`}),(0,S.jsx)(`p`,{className:`auth-description`,children:l?c?`${c.email} · ${c.role?.name||`Platform owner`}`:`Checking your invitation…`:`Welcome back. Sign in to your workspace.`}),l&&c&&(0,S.jsx)(`p`,{className:`auth-description`,children:c.accountExists?`You already have a Dispatch account. Use it to continue`+(b?` setting up your new DSP.`:` with this invitation.`):b?`Create your account, then add your DSP details to finish setup.`:`Create your account to accept this invitation.`}),(0,S.jsx)(Lm,{error:a||s.error}),e?.bootstrap?.initialized===!1&&(0,S.jsx)(Im,{children:`Platform setup required. Create the platform owner using the private access administration command.`}),l&&s.isPending?(0,S.jsx)(Rm,{}):l&&!c?null:l&&c?.accountExists&&e?.authenticated?(0,S.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Signed in as `,e.user.email,`.`]}),(0,S.jsx)($,{disabled:r,onClick:T,children:b?`Continue to DSP setup`:`Accept invitation`}),(0,S.jsx)($,{variant:`outline`,disabled:r,onClick:async()=>{i(!0);try{await rn(`/api/auth/logout`,`POST`,{}),await t()}catch(e){o(e)}finally{i(!1)}},children:`Use another account`})]}):(0,S.jsx)(`form`,{onSubmit:w,children:(0,S.jsxs)(ip,{children:[u?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Fm,{label:`First name`,name:`firstName`,autoComplete:`given-name`,required:!0,maxLength:80,disabled:r}),(0,S.jsx)(Fm,{label:`Last name`,name:`lastName`,autoComplete:`family-name`,required:!0,maxLength:80,disabled:r})]}):(0,S.jsx)(Fm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`username`,required:!0,maxLength:254,disabled:r}),(0,S.jsx)(Fm,{label:`Password`,name:`password`,type:`password`,autoComplete:u?`new-password`:`current-password`,minLength:u?12:void 0,maxLength:128,required:!0,disabled:r,description:u?`Use at least 12 characters.`:void 0}),!u&&(0,S.jsx)(`a`,{className:`text-sm text-primary underline-offset-4 hover:underline`,href:`#/forgot-password`,children:`Forgot password?`}),u&&(0,S.jsx)(Fm,{label:`Confirm password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:r}),f&&(0,S.jsx)(np,{siteKey:f,action:d,onToken:y,busy:r},`${p}:${g}`),(0,S.jsx)(Hm,{busy:r,disabled:r||!(!f||v),children:u?b?`Create account and continue`:`Create account and accept`:l?`Sign in and continue`:`Sign in`})]})})]}),(0,S.jsx)(`p`,{className:`auth-footnote`,children:`Access is by invitation.`})]})}var Eg={timeZone:void 0,dspIdentity:Rh,byId:e=>document.getElementById(e),node:(e,t,n)=>{let r=document.createElement(e);return t&&(r.className=t),n!==void 0&&(r.textContent=String(n)),r},mutation:rn,request:nn,mutationKey:on,settleMutationKey:sn,errorMessage:Tm};function Dg({page:e,hash:t}){let{timeZone:n}=th(),r=(0,x.useMemo)(()=>e===`updates`?window.createUpdatesViews({...Eg,timeZone:n}):window.createBackupsViews({...Eg,timeZone:n}),[e,n]),[i,a]=(0,x.useState)(null),o=()=>`renderUpdates`in r?r.renderUpdates():r.renderBackups();return(0,x.useEffect)(()=>(window.showToast=(e,t,n)=>a({text:[e,t].filter(Boolean).join(`. `),error:n===`error`}),`setUpdatesActive`in r?r.setUpdatesActive(!0):r.setBackupsActive(!0),o(),()=>{`setUpdatesActive`in r?r.setUpdatesActive(!1):r.setBackupsActive(!1),delete window.showToast}),[r,t]),(0,S.jsxs)(S.Fragment,{children:[e===`updates`&&(0,S.jsx)(Nm,{title:`Updates`,description:`Explore what’s new in Dispatch.`,children:(0,S.jsx)(Bm,{onClick:()=>void o()})}),i&&(0,S.jsx)(Im,{error:i.error,children:i.text}),(0,S.jsx)(`div`,{id:e===`updates`?`platform-updates-content`:`platform-backups-content`,className:e===`updates`?`updates-workspace`:`backup-workspace`})]})}function Og(e,t){if(un(e))return[{id:`platform`,label:`DSPs`,icon:Fp},{id:`updates`,label:`Updates`,icon:Np},{id:`backups`,label:`Backups`,icon:Rp},{id:`plugins`,label:`Plugins`,icon:Jp},{id:`diagnostics`,label:`Diagnostics`,icon:Vp},{id:`platform-settings`,label:`Settings`,icon:Zp}];let n=dn(e),r=n?.organization.status===`active`;return[...r&&ln(n,`dashboard.view`)?[{id:`dashboard`,label:`Home Page`,icon:Hp}]:[],...r?yg(t,e).map(e=>({id:e.id,label:e.label,icon:e.icon===`calendar`?Ip:Jp})):[],...r&&fn(e)?[{id:`plugins`,label:`Plugins`,icon:Jp}]:[],...ln(n,`members.read`)&&ln(n,`roles.read`)?[{id:`team`,label:`Team & Roles`,icon:$p}]:[],{id:`settings`,label:`Settings`,icon:Zp}]}function kg({session:e,refresh:t,hash:n,viewEnded:r}){let i=Sp().themePack.components?.ShellLayout||Jm,a=un(e),o=dn(e),s=bg(e).data?.items||[],c=Og(e,s),l=n.replace(/^#\//,``).split(/[/?]/)[0],u=c.find(e=>e.id===l)||c[0],d=vg(s,u.id),[f,p]=(0,x.useState)(!1),[m,h]=(0,x.useState)(null),[g,_]=(0,x.useState)(!1);async function v(){_(!0),h(null);try{$t(null),await t(),location.hash=`#/platform`}catch(e){h(e)}finally{_(!1)}}(0,x.useEffect)(()=>{l!==u.id&&(history.replaceState({},``,`${location.pathname}${location.search}#/${u.id}`),window.dispatchEvent(new HashChangeEvent(`hashchange`))),document.title=`${u.label} · Dispatch`,p(!1)},[l,u.id,u.label]);let y=(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`sidebar-brand`,children:[(0,S.jsx)(pn,{}),(0,S.jsx)(`p`,{children:a?`Platform`:o?.organization.name||`Workspace`})]}),(0,S.jsx)(`nav`,{className:`nav-list`,"aria-label":`Primary navigation`,children:c.map(({id:e,label:t,icon:n})=>(0,S.jsxs)(`a`,{href:`#/${e}`,"aria-current":e===u.id?`page`:void 0,className:`nav-item`,onClick:()=>p(!1),children:[(0,S.jsx)(n,{"aria-hidden":`true`}),(0,S.jsx)(`span`,{children:t})]},e))}),(0,S.jsx)(`div`,{className:`sidebar-account`,children:(0,S.jsxs)(Nh,{children:[(0,S.jsx)(Ph,{asChild:!0,children:(0,S.jsxs)(`button`,{className:`account-button`,children:[(0,S.jsxs)(`span`,{className:`avatar`,children:[e.user.firstName?.[0],e.user.lastName?.[0]]}),(0,S.jsxs)(`span`,{className:`account-copy`,children:[(0,S.jsx)(`strong`,{children:e.user.name}),(0,S.jsx)(`span`,{children:e.dspView?`Platform owner · Viewing DSP`:a?`Platform owner`:o?.roleName||`No DSP access`})]}),(0,S.jsx)(Lp,{"aria-hidden":`true`})]})}),(0,S.jsx)(Fh,{align:`start`,children:(0,S.jsxs)(Ih,{children:[(0,S.jsx)(Lh,{asChild:!0,children:(0,S.jsx)(`a`,{href:`#/${a?`platform-settings`:`settings`}`,children:`Account settings`})}),(0,S.jsxs)(Lh,{disabled:g,onSelect:async()=>{_(!0);try{await rn(`/api/auth/logout`,`POST`,{}),$t(null),tn(null),Yt.clear(),location.hash=``,await t()}catch(e){h(e)}finally{_(!1)}},children:[(0,S.jsx)(Wp,{}),`Sign out`]})]})})]})})]});return(0,S.jsxs)(Ym.Provider,{value:{session:e,refresh:t},children:[(0,S.jsx)(`a`,{href:`#main-content`,className:`skip-link`,onClick:e=>{e.preventDefault(),document.getElementById(`main-content`)?.focus()},children:`Skip to content`}),(0,S.jsxs)(i,{navigation:y,mobileNavigation:(0,S.jsx)(nm,{open:f,onOpenChange:p,children:(0,S.jsxs)(am,{side:`left`,className:`mobile-sidebar`,children:[(0,S.jsx)(sm,{className:`sr-only`,children:`Navigation`}),(0,S.jsx)(cm,{className:`sr-only`,children:`Your Dispatch workspace pages.`}),y]})}),banner:e.dspView&&(0,S.jsxs)(`div`,{className:`dsp-view-banner`,role:`region`,"aria-label":`DSP viewing mode`,children:[(0,S.jsx)(Bp,{"aria-hidden":`true`}),(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`strong`,{children:[`Viewing `,o?.organization.name,` as DSP owner`]}),(0,S.jsx)(`span`,{children:`Full owner access. Changes are saved to this DSP.`})]}),(0,S.jsx)($,{variant:`outline`,disabled:g,onClick:()=>void v(),children:g?`Exiting…`:`Exit view`})]}),header:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)($,{className:`mobile-menu`,size:`icon`,variant:`ghost`,"aria-label":`Open navigation`,onClick:()=>p(!0),children:(0,S.jsx)(Gp,{})}),(0,S.jsxs)(`div`,{className:`breadcrumb`,children:[(0,S.jsx)(`span`,{children:a?`Platform`:o?.organization.name||`Workspace`}),(0,S.jsx)(`span`,{"aria-hidden":`true`,children:`/`}),(0,S.jsx)(`strong`,{children:u.label})]})]}),children:[r&&!e.dspView&&(0,S.jsx)(Im,{children:`The DSP view expired or is no longer available. You’re back in the platform console.`}),(0,S.jsx)(Lm,{error:m}),u.id===`platform`?(0,S.jsx)(Xh,{}):u.id===`diagnostics`?(0,S.jsx)(Zh,{}):u.id===`updates`||u.id===`backups`?(0,S.jsx)(Dg,{page:u.id,hash:n},u.id):u.id===`plugins`?(0,S.jsx)(xg,{}):d?(0,S.jsx)(Ah,{children:(0,S.jsx)(d,{})},`${u.id}:${s.find(e=>e.pages.some(e=>e.id===u.id))?.revision}`):u.id===`team`?(0,S.jsx)(wg,{}):u.id===`settings`||u.id===`platform-settings`?(0,S.jsx)(gg,{},u.id):(0,S.jsx)(Nm,{title:u.label})]}),(0,S.jsx)(Mh,{})]})}function Ag(){let[e,t]=(0,x.useState)(null),[n,r]=(0,x.useState)(!1),[i,a]=(0,x.useState)(null),[o,s]=(0,x.useState)(location.hash),[c,l]=(0,x.useState)(0),[u,d]=(0,x.useState)(!1),f=(0,x.useCallback)(async e=>{let n;try{n=e||await nn(`/api/auth/session`)}catch(e){if(!(e instanceof Jt)||e.code!==`dsp_view_unavailable`)throw e;d(!0),n=await nn(`/api/auth/session`)}(n.dspView||!n.authenticated)&&d(!1),n.authenticated||$t(null),tn(n),t(n),r(!0),a(null)},[]);(0,x.useEffect)(()=>{f().catch(e=>{a(e),r(!0)});let e=()=>{s(location.hash),l(e=>e+1)},n=()=>{tn(null),t(null)},i=()=>{d(!0),f().catch(a)};return window.addEventListener(`hashchange`,e),window.addEventListener(`dispatch-session-expired`,n),window.addEventListener(`dispatch-dsp-view-ended`,i),()=>{window.removeEventListener(`hashchange`,e),window.removeEventListener(`dispatch-session-expired`,n),window.removeEventListener(`dispatch-dsp-view-ended`,i)}},[f]),(0,x.useEffect)(()=>{if(!e?.authenticated)return;let t=()=>{f().catch(()=>{})};return window.addEventListener(`focus`,t),()=>window.removeEventListener(`focus`,t)},[e?.authenticated,f]),(0,x.useEffect)(()=>{if(!e?.dspView)return;let t=window.setTimeout(()=>void f().catch(a),Math.max(0,Date.parse(e.dspView.expiresAt)-Date.now())+100);return()=>window.clearTimeout(t)},[e?.dspView?.expiresAt,f]);function p(){if(!n)return(0,S.jsxs)(`div`,{className:`initial-loading`,children:[(0,S.jsx)(pn,{}),(0,S.jsx)(Rm,{})]});if(i)return(0,S.jsxs)(`main`,{className:`initial-loading`,children:[(0,S.jsx)(pn,{}),(0,S.jsx)(Lm,{error:i}),(0,S.jsx)($,{onClick:()=>void f().catch(a),children:`Try again`})]});if(o===`#/forgot-password`||o===`#/reset-password`||o.startsWith(`#/reset-password/`))return(0,S.jsx)(qm,{hash:o,session:e,refresh:f},`${o}:${c}`);let t=/^#\/invitation\/([A-Za-z0-9_-]{43})$/.exec(o)?.[1]||null;return!e?.authenticated||t?(0,S.jsx)(Tg,{session:e,refresh:f,token:t}):!e.dspView&&o===`#/onboarding`&&e.memberships.some(t=>t.organizationId===e.activeOrganizationId&&t.organization.status!==`suspended`&&t.permissions.includes(`organization.owner`))?(0,S.jsx)(Ym.Provider,{value:{session:e,refresh:f},children:(0,S.jsx)(_g,{})}):(0,S.jsx)(kg,{session:e,refresh:f,hash:o,viewEnded:u},`${e.user.id}:${e.dspView?.viewRef||e.activeOrganizationId||`platform`}`)}let m=e?.authenticated?e.user.id:null;return(0,S.jsx)(xp,{userId:m,children:(0,S.jsx)(eh,{userId:m,children:p()})})}var jg=document.querySelector(`meta[name=dispatch-style-nonce]`)?.content;jg&&Eo(jg),(0,b.createRoot)(document.getElementById(`root`)).render((0,S.jsx)(T,{client:Yt,children:(0,S.jsx)(Ag,{})}))})(); \ No newline at end of file +`},Ws=0,Gs=[];function Ks(e){var t=x.useRef([]),n=x.useRef([0,0]),r=x.useRef(),i=x.useState(Ws++)[0],a=x.useState(ms)[0],o=x.useRef(e);x.useEffect(function(){o.current=e},[e]),x.useEffect(function(){if(e.inert){document.body.classList.add(`block-interactivity-${i}`);var t=Ho([e.lockRef.current],(e.shards||[]).map(Vs),!0).filter(Boolean);return t.forEach(function(e){return e.classList.add(`allow-interactivity-${i}`)}),function(){document.body.classList.remove(`block-interactivity-${i}`),t.forEach(function(e){return e.classList.remove(`allow-interactivity-${i}`)})}}},[e.inert,e.lockRef.current,e.shards]);var s=x.useCallback(function(e,t){if(`touches`in e&&e.touches.length===2||e.type===`wheel`&&e.ctrlKey)return!o.current.allowPinchZoom;var i=zs(e),a=n.current,s=`deltaX`in e?e.deltaX:a[0]-i[0],c=`deltaY`in e?e.deltaY:a[1]-i[1],l,u=e.target,d=Math.abs(s)>Math.abs(c)?`h`:`v`;if(`touches`in e&&d===`h`&&u.type===`range`)return!1;var f=window.getSelection(),p=f&&f.anchorNode;if(p&&(p===u||p.contains(u)))return!1;var m=Ms(d,u);if(!m)return!0;if(m?l=d:(l=d===`v`?`h`:`v`,m=Ms(d,u)),!m)return!1;if(!r.current&&`changedTouches`in e&&(s||c)&&(r.current=l),!l)return!0;var h=r.current||l;return Rs(h,t,e,h===`h`?s:c,!0)},[]),c=x.useCallback(function(e){var n=e;if(Gs.length&&Gs[Gs.length-1]===a){var r=`deltaY`in n?Bs(n):zs(n),i=t.current.filter(function(e){return e.name===n.type&&(e.target===n.target||n.target===e.shadowParent)&&Hs(e.delta,r)})[0];if(i&&i.should){n.cancelable&&n.preventDefault();return}if(!i){var c=(o.current.shards||[]).map(Vs).filter(Boolean).filter(function(e){return e.contains(n.target)});(c.length>0?s(n,c[0]):!o.current.noIsolation)&&n.cancelable&&n.preventDefault()}}},[]),l=x.useCallback(function(e,n,r,i){var a={name:e,delta:n,target:r,should:i,shadowParent:qs(r)};t.current.push(a),setTimeout(function(){t.current=t.current.filter(function(e){return e!==a})},1)},[]),u=x.useCallback(function(e){n.current=zs(e),r.current=void 0},[]),d=x.useCallback(function(t){l(t.type,Bs(t),t.target,s(t,e.lockRef.current))},[]),f=x.useCallback(function(t){l(t.type,zs(t),t.target,s(t,e.lockRef.current))},[]);x.useEffect(function(){return Gs.push(a),e.setCallbacks({onScrollCapture:d,onWheelCapture:d,onTouchMoveCapture:f}),document.addEventListener(`wheel`,c,Ds),document.addEventListener(`touchmove`,c,Ds),document.addEventListener(`touchstart`,u,Ds),function(){Gs=Gs.filter(function(e){return e!==a}),document.removeEventListener(`wheel`,c,Ds),document.removeEventListener(`touchmove`,c,Ds),document.removeEventListener(`touchstart`,u,Ds)}},[]);var p=e.removeScrollBar,m=e.inert;return x.createElement(x.Fragment,null,m?x.createElement(a,{styles:Us(i)}):null,p?x.createElement(ws,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function qs(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}var Js=ns(rs,Ks),Ys=x.forwardRef(function(e,t){return x.createElement(as,Bo({},e,{ref:t,sideCar:Js}))});Ys.classNames=as.classNames;var Xs=function(e){return typeof document>`u`?null:(Array.isArray(e)?e[0]:e).ownerDocument.body},Zs=new WeakMap,Qs=new WeakMap,$s={},ec=0,tc=function(e){return e&&(e.host||tc(e.parentNode))},nc=function(e,t){return t.map(function(t){if(e.contains(t))return t;var n=tc(t);return n&&e.contains(n)?n:(console.error(`aria-hidden`,t,`in not contained inside`,e,`. Doing nothing`),null)}).filter(function(e){return!!e})},rc=function(e,t,n,r){var i=nc(t,Array.isArray(e)?e:[e]);$s[n]||($s[n]=new WeakMap);var a=$s[n],o=[],s=new Set,c=new Set(i),l=function(e){e&&!s.has(e)&&(s.add(e),l(e.parentNode))};i.forEach(l);var u=function(e){e&&!c.has(e)&&Array.prototype.forEach.call(e.children,function(e){if(s.has(e))u(e);else try{var t=e.getAttribute(r),i=t!==null&&t!==`false`,c=(Zs.get(e)||0)+1,l=(a.get(e)||0)+1;Zs.set(e,c),a.set(e,l),o.push(e),c===1&&i&&Qs.set(e,!0),l===1&&e.setAttribute(n,`true`),i||e.setAttribute(r,`true`)}catch(t){console.error(`aria-hidden: cannot operate on `,e,t)}})};return u(t),s.clear(),ec++,function(){o.forEach(function(e){var t=Zs.get(e)-1,i=a.get(e)-1;Zs.set(e,t),a.set(e,i),t||(Qs.has(e)||e.removeAttribute(r),Qs.delete(e)),i||e.removeAttribute(n)}),ec--,ec||(Zs=new WeakMap,Zs=new WeakMap,Qs=new WeakMap,$s={})}},ic=function(e,t,n){n===void 0&&(n=`data-aria-hidden`);var r=Array.from(Array.isArray(e)?e:[e]),i=t||Xs(e);return i?(r.push.apply(r,Array.from(i.querySelectorAll(`[aria-live], script`))),rc(r,i,n,`aria-hidden`)):function(){return null}},ac=Object.defineProperty,oc=(e,t)=>ac(e,`name`,{value:t,configurable:!0}),sc=`Dialog`,[cc,lc]=Zi(sc),[uc,dc]=cc(sc),fc=oc(e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=x.useRef(null),c=x.useRef(null),[l,u]=Oa({prop:r,defaultProp:i??!1,onChange:a,caller:sc}),[d,f]=x.useState(0),[p,m]=x.useState(0);return(0,S.jsx)(uc,{scope:t,triggerRef:s,contentRef:c,contentId:Ka(),titleId:Ka(),descriptionId:Ka(),titlePresent:d>0,descriptionPresent:p>0,setTitleCount:f,setDescriptionCount:m,open:l,onOpenChange:u,onOpenToggle:x.useCallback(()=>u(e=>!e),[u]),modal:o,children:n})},`Dialog`),pc=`DialogPortal`,[mc,hc]=cc(pc,{forceMount:void 0}),gc=oc(e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=dc(pc,t);return(0,S.jsx)(mc,{scope:t,forceMount:n,children:x.Children.map(r,e=>(0,S.jsx)(Ia,{present:n||a.open,children:(0,S.jsx)(Mo,{asChild:!0,container:i,children:e})}))})},`DialogPortal`),_c=`DialogOverlay`,vc=x.forwardRef(oc(function(e,t){let n=hc(_c,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=dc(_c,e.__scopeDialog);return a.modal?(0,S.jsx)(Ia,{present:r||a.open,children:(0,S.jsx)(bc,{...i,ref:t})}):null},`DialogOverlay`)),yc=W(`DialogOverlay.RemoveScroll`),bc=x.forwardRef(oc(function(e,t){let{__scopeDialog:n,...r}=e,i=dc(_c,n),a=Oi(t,so());return(0,S.jsx)(Ys,{as:yc,allowPinchZoom:!0,shards:[i.contentRef],children:(0,S.jsx)(Ki.div,{"data-state":Mc(i.open),...r,ref:a,style:{pointerEvents:`auto`,...r.style}})})},`DialogOverlayImpl`)),xc=`DialogContent`,Sc=x.forwardRef(oc(function(e,t){let n=hc(xc,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=dc(xc,e.__scopeDialog);return(0,S.jsx)(Ia,{present:r||a.open,children:a.modal?(0,S.jsx)(Cc,{...i,ref:t}):(0,S.jsx)(wc,{...i,ref:t})})},`DialogContent`)),Cc=x.forwardRef(oc(function(e,t){let n=dc(xc,e.__scopeDialog),r=x.useRef(null),i=Oi(t,n.contentRef,r);return x.useEffect(()=>{let e=r.current;if(e)return ic(e)},[]),(0,S.jsx)(Tc,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:G(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:G(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:G(e.onFocusOutside,e=>e.preventDefault())})},`DialogContentModal`)),wc=x.forwardRef(oc(function(e,t){let n=dc(xc,e.__scopeDialog),r=x.useRef(!1),i=x.useRef(!1);return(0,S.jsx)(Tc,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})},`DialogContentNonModal`)),Tc=x.forwardRef(oc(function(e,t){let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,...o}=e,s=dc(xc,n);return Ro(),(0,S.jsx)(S.Fragment,{children:(0,S.jsx)(yo,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,S.jsx)(K,{role:`dialog`,id:s.contentId,"aria-describedby":s.descriptionPresent?s.descriptionId:void 0,"aria-labelledby":s.titlePresent?s.titleId:void 0,"data-state":Mc(s.open),...o,ref:t,deferPointerDownOutside:!0,onDismiss:()=>s.onOpenChange(!1)})})})},`DialogContentImpl`)),Ec=`DialogTitle`,Dc=x.forwardRef(oc(function(e,t){let{__scopeDialog:n,...r}=e,i=dc(Ec,n),{setTitleCount:a}=i;return ya(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,S.jsx)(Ki.h2,{id:i.titleId,...r,ref:t})},`DialogTitle`)),Oc=`DialogDescription`,kc=x.forwardRef(oc(function(e,t){let{__scopeDialog:n,...r}=e,i=dc(Oc,n),{setDescriptionCount:a}=i;return ya(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,S.jsx)(Ki.p,{id:i.descriptionId,...r,ref:t})},`DialogDescription`)),Ac=`DialogClose`,jc=x.forwardRef(oc(function(e,t){let{__scopeDialog:n,...r}=e,i=dc(Ac,n);return(0,S.jsx)(Ki.button,{type:`button`,...r,ref:t,onClick:G(e.onClick,()=>i.onOpenChange(!1))})},`DialogClose`));function Mc(e){return e?`open`:`closed`}oc(Mc,`getState`);var Nc=Object.defineProperty,Pc=(e,t)=>Nc(e,`name`,{value:t,configurable:!0});function Fc(e){let[t,n]=x.useState(void 0);return ya(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let r=t[0],i,a;if(`borderBoxSize`in r){let e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;i=t.inlineSize,a=t.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}n(void 0)},[e]),t}Pc(Fc,`useSize`);var Ic=[`top`,`right`,`bottom`,`left`],Lc=Math.min,Rc=Math.max,zc=Math.round,Bc=Math.floor,Vc=e=>({x:e,y:e}),Hc={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function Uc(e,t,n){return Rc(e,Lc(t,n))}function Wc(e,t){return typeof e==`function`?e(t):e}function Gc(e){return e.split(`-`)[0]}function Kc(e){return e.split(`-`)[1]}function qc(e){return e===`x`?`y`:`x`}function Jc(e){return e===`y`?`height`:`width`}function Yc(e){let t=e[0];return t===`t`||t===`b`?`y`:`x`}function Xc(e){return qc(Yc(e))}function Zc(e,t,n){n===void 0&&(n=!1);let r=Kc(e),i=Xc(e),a=Jc(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=ol(o)),[o,ol(o)]}function Qc(e){let t=ol(e);return[$c(e),t,$c(t)]}function $c(e){return e.includes(`start`)?e.replace(`start`,`end`):e.replace(`end`,`start`)}var el=[`left`,`right`],tl=[`right`,`left`],nl=[`top`,`bottom`],rl=[`bottom`,`top`];function il(e,t,n){switch(e){case`top`:case`bottom`:return n?t?tl:el:t?el:tl;case`left`:case`right`:return t?nl:rl;default:return[]}}function al(e,t,n,r){let i=Kc(e),a=il(Gc(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map($c)))),a}function ol(e){let t=Gc(e);return Hc[t]+e.slice(t.length)}function sl(e){return{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}}function cl(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:sl(e)}function ll(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function ul(e,t,n){let{reference:r,floating:i}=e,a=Yc(t),o=Xc(t),s=Jc(o),c=Gc(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}let m=Kc(t);return m&&(p[o]+=f*(m===`end`?1:-1)*(n&&l?-1:1)),p}async function dl(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a,elements:o,strategy:s}=e,{boundary:c=`clippingAncestors`,rootBoundary:l=`viewport`,elementContext:u=`floating`,altBoundary:d=!1,padding:f=0}=Wc(t,e),p=cl(f),m=o[d?u===`floating`?`reference`:`floating`:u],h=ll(await i.getClippingRect({element:await(i.isElement==null?void 0:i.isElement(m))??!0?m:m.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(o.floating)),boundary:c,rootBoundary:l,strategy:s})),g=u===`floating`?{x:n,y:r,width:a.floating.width,height:a.floating.height}:a.reference,_=await(i.getOffsetParent==null?void 0:i.getOffsetParent(o.floating)),v=await(i.isElement==null?void 0:i.isElement(_))&&await(i.getScale==null?void 0:i.getScale(_))||{x:1,y:1},y=ll(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:o,rect:g,offsetParent:_,strategy:s}):g);return{top:(h.top-y.top+p.top)/v.y,bottom:(y.bottom-h.bottom+p.bottom)/v.y,left:(h.left-y.left+p.left)/v.x,right:(y.right-h.right+p.right)/v.x}}var fl=50,pl=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=o.detectOverflow?o:{...o,detectOverflow:dl},c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=ul(l,r,c),f=r,p=0,m={};for(let n=0;n({name:`arrow`,options:e,async fn(t){let{x:n,y:r,placement:i,rects:a,platform:o,elements:s,middlewareData:c}=t,{element:l,padding:u=0}=Wc(e,t)||{};if(l==null)return{};let d=cl(u),f={x:n,y:r},p=Xc(i),m=Jc(p),h=await o.getDimensions(l),g=p===`y`,_=g?`top`:`left`,v=g?`bottom`:`right`,y=g?`clientHeight`:`clientWidth`,b=a.reference[m]+a.reference[p]-f[p]-a.floating[m],x=f[p]-a.reference[p],S=await(o.getOffsetParent==null?void 0:o.getOffsetParent(l)),C=S?S[y]:0;(!C||!await(o.isElement==null?void 0:o.isElement(S)))&&(C=s.floating[y]||a.floating[m]);let w=b/2-x/2,T=C/2-h[m]/2-1,E=Lc(d[_],T),D=Lc(d[v],T),O=C-h[m]-D,ee=C/2-h[m]/2+w,k=Uc(E,ee,O),A=!c.arrow&&Kc(i)!=null&&ee!==k&&a.reference[m]/2-(eee<=0)){let e=(i.flip?.index||0)+1,t=S[e];if(t&&(u!==`alignment`||_===Yc(t)||T.every(e=>Yc(e.placement)!==_||e.overflows[0]>0)))return{data:{index:e,overflows:T},reset:{placement:t}};let n=T.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=T.filter(e=>{if(x){let t=Yc(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o}if(r!==n)return{reset:{placement:n}}}return{}}}};function gl(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function _l(e){return Ic.some(t=>e[t]>=0)}var vl=function(e){return e===void 0&&(e={}),{name:`hide`,options:e,async fn(t){let{rects:n,platform:r}=t,{strategy:i=`referenceHidden`,...a}=Wc(e,t);switch(i){case`referenceHidden`:{let e=gl(await r.detectOverflow(t,{...a,elementContext:`reference`}),n.reference);return{data:{referenceHiddenOffsets:e,referenceHidden:_l(e)}}}case`escaped`:{let e=gl(await r.detectOverflow(t,{...a,altBoundary:!0}),n.floating);return{data:{escapedOffsets:e,escaped:_l(e)}}}default:return{}}}}},yl=new Set([`left`,`top`]);async function bl(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=Gc(n),s=Kc(n),c=Yc(n)===`y`,l=yl.has(o)?-1:1,u=a&&c?-1:1,d=Wc(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}var xl=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await bl(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},Sl=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i,platform:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:c={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...l}=Wc(e,t),u={x:n,y:r},d=await a.detectOverflow(t,l),f=Yc(i),p=qc(f),m=u[p],h=u[f],g=(e,t)=>Uc(t+d[e===`y`?`top`:`left`],t,t-d[e===`y`?`bottom`:`right`]);o&&(m=g(p,m)),s&&(h=g(f,h));let _=c.fn({...t,[p]:m,[f]:h});return{..._,data:{x:_.x-n,y:_.y-r,enabled:{[p]:o,[f]:s}}}}}},Cl=function(e){return e===void 0&&(e={}),{options:e,fn(t){let{x:n,y:r,placement:i,rects:a,middlewareData:o}=t,{offset:s=0,mainAxis:c=!0,crossAxis:l=!0}=Wc(e,t),u={x:n,y:r},d=Yc(i),f=qc(d),p=u[f],m=u[d],h=Wc(s,t),g=typeof h==`number`?{mainAxis:h,crossAxis:0}:{mainAxis:h.mainAxis??0,crossAxis:h.crossAxis??0};if(c){let e=f===`y`?`height`:`width`,t=a.reference[f]-a.floating[e]+g.mainAxis,n=a.reference[f]+a.reference[e]-g.mainAxis;pn&&(p=n)}if(l){let e=f===`y`?`width`:`height`,t=yl.has(Gc(i)),n=a.reference[d]-a.floating[e]+(t&&o.offset?.[d]||0)+(t?0:g.crossAxis),r=a.reference[d]+a.reference[e]+(t?0:o.offset?.[d]||0)-(t?g.crossAxis:0);mr&&(m=r)}return{[f]:p,[d]:m}}}},wl=function(e){return e===void 0&&(e={}),{name:`size`,options:e,async fn(t){let{placement:n,rects:r,platform:i,elements:a}=t,{apply:o=()=>{},...s}=Wc(e,t),c=await i.detectOverflow(t,s),l=Gc(n),u=Kc(n),d=Yc(n)===`y`,{width:f,height:p}=r.floating,m,h;l===`top`||l===`bottom`?(m=l,h=u===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?`start`:`end`)?`left`:`right`):(h=l,m=u===`end`?`top`:`bottom`);let g=p-c.top-c.bottom,_=f-c.left-c.right,v=Lc(p-c[m],g),y=Lc(f-c[h],_),b=t.middlewareData.shift,x=!b,S=v,C=y;b!=null&&b.enabled.x&&(C=_),b!=null&&b.enabled.y&&(S=g),x&&!u&&(d?C=f-2*Rc(c.left,c.right):S=p-2*Rc(c.top,c.bottom)),await o({...t,availableWidth:C,availableHeight:S});let w=await i.getDimensions(a.floating);return f!==w.width||p!==w.height?{reset:{rects:!0}}:{}}}};function Tl(){return typeof window<`u`}function El(e){return kl(e)?(e.nodeName||``).toLowerCase():`#document`}function Dl(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Ol(e){return((kl(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function kl(e){return Tl()?e instanceof Node||e instanceof Dl(e).Node:!1}function Al(e){return Tl()?e instanceof Element||e instanceof Dl(e).Element:!1}function jl(e){return Tl()?e instanceof HTMLElement||e instanceof Dl(e).HTMLElement:!1}function Ml(e){return!Tl()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof Dl(e).ShadowRoot}function Nl(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=Bl(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&i!==`inline`&&i!==`contents`}function Pl(e){return/^(table|td|th)$/.test(El(e))}function Fl(e){try{if(e.matches(`:popover-open`))return!0}catch{}try{return e.matches(`:modal`)}catch{return!1}}var Il=/transform|translate|scale|rotate|perspective|filter/,Ll=/paint|layout|strict|content/,q=e=>!!e&&e!==`none`,Rl;function J(e){let t=Al(e)?Bl(e):e;return q(t.transform)||q(t.translate)||q(t.scale)||q(t.rotate)||q(t.perspective)||!X()&&(q(t.backdropFilter)||q(t.filter))||Il.test(t.willChange||``)||Ll.test(t.contain||``)}function Y(e){let t=Hl(e);for(;jl(t)&&!zl(t);){if(J(t))return t;if(Fl(t))return null;t=Hl(t)}return null}function X(){return Rl??=typeof CSS<`u`&&CSS.supports&&CSS.supports(`-webkit-backdrop-filter`,`none`),Rl}function zl(e){return/^(html|body|#document)$/.test(El(e))}function Bl(e){return Dl(e).getComputedStyle(e)}function Vl(e){return Al(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Hl(e){if(El(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Ml(e)&&e.host||Ol(e);return Ml(t)?t.host:t}function Ul(e){let t=Hl(e);return zl(t)?(e.ownerDocument||e).body:jl(t)&&Nl(t)?t:Ul(t)}function Wl(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=Ul(e),i=r===e.ownerDocument?.body,a=Dl(r);if(i){let e=Gl(a);return t.concat(a,a.visualViewport||[],Nl(r)?r:[],e&&n?Wl(e):[])}return t.concat(r,Wl(r,[],n))}function Gl(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Kl(e){let t=Bl(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=jl(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=zc(n)!==a||zc(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function ql(e){return Al(e)?e:e.contextElement}function Jl(e){let t=ql(e);if(!jl(t))return Vc(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=Kl(t),o=(a?zc(n.width):n.width)/r,s=(a?zc(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}var Yl=Vc(0);function Xl(e){let t=Dl(e);return!X()||!t.visualViewport?Yl:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Zl(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===Dl(e)}function Ql(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=ql(e),o=Vc(1);t&&(r?Al(r)&&(o=Jl(r)):o=Jl(e));let s=Zl(a,n,r)?Xl(a):Vc(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a&&r){let e=Dl(a),t=Al(r)?Dl(r):r,n=e,i=Gl(n);for(;i&&t!==n;){let e=Jl(i),t=i.getBoundingClientRect(),r=Bl(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=Dl(i),i=Gl(n)}}return ll({width:u,height:d,x:c,y:l})}function $l(e,t){let n=Vl(e).scrollLeft;return t?t.left+n:Ql(Ol(e)).left+n}function eu(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-$l(e,n),y:n.top+t.scrollTop}}function tu(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=Ol(r),s=t?Fl(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=Vc(1),u=Vc(0),d=jl(r);if((d||!a)&&((El(r)!==`body`||Nl(o))&&(c=Vl(r)),d)){let e=Ql(r);l=Jl(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?eu(o,c):Vc(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function nu(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function ru(e){let t=Vl(e),n=e.ownerDocument.body,r=Rc(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),i=Rc(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),a=-t.scrollLeft+$l(e),o=-t.scrollTop;return Bl(n).direction===`rtl`&&(a+=Rc(e.clientWidth,n.clientWidth)-r),{width:r,height:i,x:a,y:o}}var iu=25;function au(e,t,n){n===void 0&&(n=`viewport`);let r=n===`layoutViewport`,i=Dl(e),a=Ol(e),o=i.visualViewport,s=a.clientWidth,c=a.clientHeight,l=0,u=0;if(o){let e=!X()||t===`fixed`;r?e||(l=-o.offsetLeft,u=-o.offsetTop):(s=o.width,c=o.height,e&&(l=o.offsetLeft,u=o.offsetTop))}if($l(a)<=0){let e=a.ownerDocument,t=e.body,n=getComputedStyle(t),r=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(a.clientWidth-t.clientWidth-r),o=getComputedStyle(a).scrollbarGutter===`stable both-edges`?i/2:i;o<=iu&&(s-=o)}return{width:s,height:c,x:l,y:u}}function ou(e,t){let n=Ql(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=Jl(e);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function su(e,t,n){let r;if(t===`viewport`||t===`layoutViewport`)r=au(e,n,t);else if(t===`document`)r=ru(Ol(e));else if(Al(t))r=ou(t,n);else{let n=Xl(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return ll(r)}function cu(e,t){let n=t.get(e);if(n)return n;let r=Wl(e,[],!1).filter(e=>Al(e)&&El(e)!==`body`),i=null,a=Bl(e).position===`fixed`,o=a?Hl(e):e;for(;Al(o)&&!zl(o);){let e=Bl(o),t=J(o),n=i?i.position:a?`fixed`:``;!t&&(n===`fixed`||n===`absolute`&&e.position===`static`)?r=r.filter(e=>e!==o):i=e,o=Hl(o)}return t.set(e,r),r}function lu(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?Fl(t)?[]:cu(t,this._c):[].concat(n),r],o=su(t,a[0],i),s=o.top,c=o.right,l=o.bottom,u=o.left;for(let e=1;e{s(!1,1e-7)},1e3)}y=!1}try{r=new IntersectionObserver(b,{...v,root:a.ownerDocument})}catch{r=new IntersectionObserver(b,v)}r.observe(e)}let c=Dl(e),l=()=>s(n);return c.addEventListener(`resize`,l),s(!0),()=>{c.removeEventListener(`resize`,l),o()}}function bu(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=ql(e),u=i||a?[...l?Wl(l):[],...t?Wl(t):[]]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n),a&&e.addEventListener(`resize`,n)});let d=l&&s?yu(l,n,a):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&t&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),t&&p.observe(t));let m,h=c?Ql(e):null;c&&g();function g(){let t=Ql(e);h&&!vu(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}var xu=xl,Su=Sl,Cu=hl,wu=wl,Tu=vl,Eu=ml,Du=Cl,Ou=(e,t,n)=>{let r=new Map,i=n??{},a={..._u,...i.platform,_c:r};return pl(e,t,{...i,platform:a})},ku=typeof document<`u`?x.useLayoutEffect:function(){};function Au(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e==`function`&&e.toString()===t.toString())return!0;let n,r,i;if(e&&t&&typeof e==`object`){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!Au(e[r],t[r]))return!1;return!0}if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,i[r]))return!1;for(r=n;r--!==0;){let n=i[r];if(!(n===`_owner`&&e.$$typeof)&&!Au(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function ju(e){return typeof window>`u`?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Mu(e,t){let n=ju(e);return Math.round(t*n)/n}function Nu(e){let t=x.useRef(e);return ku(()=>{t.current=e}),t}function Pu(e){e===void 0&&(e={});let{placement:t=`bottom`,strategy:n=`absolute`,middleware:r=[],platform:i,elements:{reference:a,floating:o}={},transform:s=!0,whileElementsMounted:c,open:l}=e,[u,d]=x.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[f,p]=x.useState(r);Au(f,r)||p(r);let[m,h]=x.useState(null),[g,_]=x.useState(null),v=x.useCallback(e=>{e!==C.current&&(C.current=e,h(e))},[]),y=x.useCallback(e=>{e!==w.current&&(w.current=e,_(e))},[]),b=a||m,S=o||g,C=x.useRef(null),w=x.useRef(null),T=x.useRef(u),E=c!=null,D=Nu(c),O=Nu(i),ee=Nu(l),k=x.useCallback(()=>{if(!C.current||!w.current)return;let e={placement:t,strategy:n,middleware:f};O.current&&(e.platform=O.current),Ou(C.current,w.current,e).then(e=>{let t={...e,isPositioned:ee.current!==!1};A.current&&!Au(T.current,t)&&(T.current=t,Ui.flushSync(()=>{d(t)}))})},[f,t,n,O,ee]);ku(()=>{l===!1&&T.current.isPositioned&&(T.current.isPositioned=!1,d(e=>({...e,isPositioned:!1})))},[l]);let A=x.useRef(!1);ku(()=>(A.current=!0,()=>{A.current=!1}),[]),ku(()=>{if(b&&(C.current=b),S&&(w.current=S),b&&S){if(D.current)return D.current(b,S,k);k()}},[b,S,k,D,E]);let j=x.useMemo(()=>({reference:C,floating:w,setReference:v,setFloating:y}),[v,y]),te=x.useMemo(()=>({reference:b,floating:S}),[b,S]),M=x.useMemo(()=>{let e={position:n,left:0,top:0};if(!te.floating)return e;let t=Mu(te.floating,u.x),r=Mu(te.floating,u.y);return s?{...e,transform:`translate(`+t+`px, `+r+`px)`,...ju(te.floating)>=1.5&&{willChange:`transform`}}:{position:n,left:t,top:r}},[n,s,te.floating,u.x,u.y]);return x.useMemo(()=>({...u,update:k,refs:j,elements:te,floatingStyles:M}),[u,k,j,te,M])}var Fu=e=>{function t(e){return{}.hasOwnProperty.call(e,`current`)}return{name:`arrow`,options:e,fn(n){let{element:r,padding:i}=typeof e==`function`?e(n):e;return r&&t(r)?r.current==null?{}:Eu({element:r.current,padding:i}).fn(n):r?Eu({element:r,padding:i}).fn(n):{}}}},Iu=(e,t)=>{let n=xu(e);return{name:n.name,fn:n.fn,options:[e,t]}},Lu=(e,t)=>{let n=Su(e);return{name:n.name,fn:n.fn,options:[e,t]}},Ru=(e,t)=>({fn:Du(e).fn,options:[e,t]}),zu=(e,t)=>{let n=Cu(e);return{name:n.name,fn:n.fn,options:[e,t]}},Bu=(e,t)=>{let n=wu(e);return{name:n.name,fn:n.fn,options:[e,t]}},Vu=(e,t)=>{let n=Tu(e);return{name:n.name,fn:n.fn,options:[e,t]}},Hu=(e,t)=>{let n=Fu(e);return{name:n.name,fn:n.fn,options:[e,t]}},Uu=Object.defineProperty,Wu=(e,t)=>Uu(e,`name`,{value:t,configurable:!0}),Z=`Popper`,[Gu,Ku]=Zi(Z),[qu,Ju]=Gu(Z),Yu=Wu(e=>{let{__scopePopper:t,children:n}=e,[r,i]=x.useState(null),[a,o]=x.useState(void 0);return(0,S.jsx)(qu,{scope:t,anchor:r,onAnchorChange:i,placementState:a,setPlacementState:o,children:n})},`Popper`),Xu=`PopperAnchor`,Zu=x.forwardRef(Wu(function(e,t){let{__scopePopper:n,virtualRef:r,...i}=e,a=Ju(Xu,n),o=x.useRef(null),s=a.onAnchorChange,c=Oi(t,x.useCallback(e=>{o.current=e,e&&s(e)},[s])),l=x.useRef(null);x.useEffect(()=>{if(!r)return;let e=l.current;l.current=r.current,e!==l.current&&s(l.current)});let u=a.placementState&&id(a.placementState),d=u?.[0],f=u?.[1];return r?null:(0,S.jsx)(Ki.div,{"data-radix-popper-side":d,"data-radix-popper-align":f,...i,ref:c})},`PopperAnchor`)),Qu=`PopperContent`,[$u,ed]=Gu(Qu),td=x.forwardRef(Wu(function(e,t){let{__scopePopper:n,side:r=`bottom`,sideOffset:i=0,align:a=`center`,alignOffset:o=0,arrowPadding:s=0,avoidCollisions:c=!0,collisionBoundary:l=[],collisionPadding:u=0,sticky:d=`partial`,hideWhenDetached:f=!1,updatePositionStrategy:p=`optimized`,onPlaced:m,...h}=e,g=Ju(Qu,n),[_,v]=x.useState(null),y=Oi(t,v),[b,C]=x.useState(null),w=Fc(b),T=w?.width??0,E=w?.height??0,D=r+(a===`center`?``:`-`+a),O=typeof u==`number`?u:{top:0,right:0,bottom:0,left:0,...u},ee=Array.isArray(l)?l:[l],k=ee.length>0,A={padding:O,boundary:ee.filter(nd),altBoundary:k},{refs:j,floatingStyles:te,placement:M,isPositioned:ne,middlewareData:N}=Pu({strategy:`fixed`,placement:D,whileElementsMounted:Wu((...e)=>bu(...e,{animationFrame:p===`always`}),`whileElementsMounted`),elements:{reference:g.anchor},middleware:[Iu({mainAxis:i+E,alignmentAxis:o}),c&&Lu({mainAxis:!0,crossAxis:!1,limiter:d===`partial`?Ru():void 0,...A}),c&&zu({...A}),Bu({...A,apply:Wu(({elements:e,rects:t,availableWidth:n,availableHeight:r})=>{let{width:i,height:a}=t.reference,o=e.floating.style;o.setProperty(`--radix-popper-available-width`,`${n}px`),o.setProperty(`--radix-popper-available-height`,`${r}px`),o.setProperty(`--radix-popper-anchor-width`,`${i}px`),o.setProperty(`--radix-popper-anchor-height`,`${a}px`)},`apply`)}),b&&Hu({element:b,padding:s}),rd({arrowWidth:T,arrowHeight:E}),f&&Vu({strategy:`referenceHidden`,...A,boundary:k?A.boundary:void 0})]}),P=g.setPlacementState;ya(()=>(P(M),()=>{P(void 0)}),[M,P]);let[re,ie]=id(M),ae=$a(m);ya(()=>{ne&&ae?.()},[ne,ae]);let F=N.arrow?.x,I=N.arrow?.y,L=N.arrow?.centerOffset!==0,[oe,se]=x.useState();return ya(()=>{_&&se(window.getComputedStyle(_).zIndex)},[_]),(0,S.jsx)(`div`,{ref:j.setFloating,"data-radix-popper-content-wrapper":``,style:{...te,transform:ne?te.transform:`translate(0, -200%)`,minWidth:`max-content`,zIndex:oe,"--radix-popper-transform-origin":[N.transformOrigin?.x,N.transformOrigin?.y].join(` `),...N.hide?.referenceHidden&&{visibility:`hidden`,pointerEvents:`none`}},dir:e.dir,children:(0,S.jsx)($u,{scope:n,placedSide:re,placedAlign:ie,onArrowChange:C,arrowX:F,arrowY:I,shouldHideArrow:L,children:(0,S.jsx)(Ki.div,{"data-side":re,"data-align":ie,...h,ref:y,style:{...h.style,animation:ne?h.style?.animation:`none`}})})})},`PopperContent`));function nd(e){return e!==null}Wu(nd,`isNotNull`);var rd=Wu(e=>({name:`transformOrigin`,options:e,fn(t){let{placement:n,rects:r,middlewareData:i}=t,a=i.arrow?.centerOffset!==0,o=a?0:e.arrowWidth,s=a?0:e.arrowHeight,[c,l]=id(n),u={start:`0%`,center:`50%`,end:`100%`}[l],d=(i.arrow?.x??0)+o/2,f=(i.arrow?.y??0)+s/2,p=``,m=``;return c===`bottom`?(p=a?u:`${d}px`,m=`${-s}px`):c===`top`?(p=a?u:`${d}px`,m=`${r.floating.height+s}px`):c===`right`?(p=`${-s}px`,m=a?u:`${f}px`):c===`left`&&(p=`${r.floating.width+s}px`,m=a?u:`${f}px`),{data:{x:p,y:m}}}}),`transformOrigin`);function id(e){let[t,n=`center`]=e.split(`-`);return[t,n]}Wu(id,`getSideAndAlignFromPlacement`);var ad=Yu,od=Zu,sd=td,cd=Object.defineProperty,ld=(e,t)=>cd(e,`name`,{value:t,configurable:!0}),ud=!1;function dd(){let[e,t]=x.useState(ud);return x.useEffect(()=>{ud||(ud=!0,t(!0))},[]),e}ld(dd,`useIsHydrated`);var fd=x.useSyncExternalStore;function pd(){return()=>{}}ld(pd,`subscribe`);function md(){return fd(pd,()=>!0,()=>!1)}ld(md,`useIsHydratedModern`);var hd=typeof fd==`function`?md:dd,gd=Object.defineProperty,_d=(e,t)=>gd(e,`name`,{value:t,configurable:!0}),vd=`rovingFocusGroup.onEntryFocus`,yd={bubbles:!1,cancelable:!0},Q=`RovingFocusGroup`,[bd,xd,Sd]=ta(Q),[Cd,wd]=Zi(Q,[Sd]),[Td,Ed]=Cd(Q),Dd=x.forwardRef(_d(function(e,t){return(0,S.jsx)(bd.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,S.jsx)(bd.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,S.jsx)(Od,{...e,ref:t})})})},`RovingFocusGroup`)),Od=x.forwardRef(_d(function(e,t){let{__scopeRovingFocusGroup:n,orientation:r,loop:i=!1,dir:a,currentTabStopId:o,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:c,onEntryFocus:l,preventScrollOnEntryFocus:u=!1,...d}=e,f=x.useRef(null),p=Oi(t,f),m=Xa(a),[h,g]=Oa({prop:o,defaultProp:s??null,onChange:c,caller:Q}),[_,v]=x.useState(!1),y=$a(l),b=xd(n),C=x.useRef(!1),[w,T]=x.useState(0);return x.useEffect(()=>{let e=f.current;if(e)return e.addEventListener(vd,y),()=>e.removeEventListener(vd,y)},[y]),(0,S.jsx)(Td,{scope:n,orientation:r,dir:m,loop:i,currentTabStopId:h,onItemFocus:x.useCallback(e=>g(e),[g]),onItemShiftTab:x.useCallback(()=>v(!0),[]),onFocusableItemAdd:x.useCallback(()=>T(e=>e+1),[]),onFocusableItemRemove:x.useCallback(()=>T(e=>e-1),[]),children:(0,S.jsx)(Ki.div,{tabIndex:_||w===0?-1:0,"data-orientation":r,...d,ref:p,style:{outline:`none`,...e.style},onMouseDown:G(e.onMouseDown,()=>{C.current=!0}),onFocus:G(e.onFocus,e=>{let t=!C.current;if(e.target===e.currentTarget&&t&&!_){let t=new CustomEvent(vd,yd);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){let e=b().filter(e=>e.focusable);Pd([e.find(e=>e.active),e.find(e=>e.id===h),...e].filter(Boolean).map(e=>e.ref.current),u)}}C.current=!1}),onBlur:G(e.onBlur,()=>v(!1))})})},`RovingFocusGroupImpl`)),kd=`RovingFocusGroupItem`,Ad=x.forwardRef(_d(function(e,t){let{__scopeRovingFocusGroup:n,focusable:r=!0,active:i=!1,tabStopId:a,children:o,...s}=e,c=Ka(),l=a||c,u=Ed(kd,n),d=u.currentTabStopId===l,f=xd(n),{onFocusableItemAdd:p,onFocusableItemRemove:m,currentTabStopId:h}=u,g=hd();return ya(()=>{if(g&&r)return p(),()=>m()},[g,r,p,m]),x.useEffect(()=>{if(!g&&r)return p(),()=>m()},[g,r,p,m]),(0,S.jsx)(bd.ItemSlot,{scope:n,id:l,focusable:r,active:i,children:(0,S.jsx)(Ki.span,{tabIndex:d?0:-1,"data-orientation":u.orientation,...s,ref:t,onMouseDown:G(e.onMouseDown,e=>{r?u.onItemFocus(l):e.preventDefault()}),onFocus:G(e.onFocus,()=>u.onItemFocus(l)),onKeyDown:G(e.onKeyDown,e=>{if(e.key===`Tab`&&e.shiftKey){u.onItemShiftTab();return}if(e.target!==e.currentTarget)return;let t=Nd(e,u.orientation,u.dir);if(t!==void 0){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let n=f().filter(e=>e.focusable).map(e=>e.ref.current);if(t===`last`)n.reverse();else if(t===`prev`||t===`next`){t===`prev`&&n.reverse();let r=n.indexOf(e.currentTarget);n=u.loop?Fd(n,r+1):n.slice(r+1)}setTimeout(()=>Pd(n))}}),children:typeof o==`function`?o({isCurrentTabStop:d,hasTabStop:h!=null}):o})})},`RovingFocusGroupItem`)),jd={ArrowLeft:`prev`,ArrowUp:`prev`,ArrowRight:`next`,ArrowDown:`next`,PageUp:`first`,Home:`first`,PageDown:`last`,End:`last`};function Md(e,t){return t===`rtl`?e===`ArrowLeft`?`ArrowRight`:e===`ArrowRight`?`ArrowLeft`:e:e}_d(Md,`getDirectionAwareKey`);function Nd(e,t,n){let r=Md(e.key,n);if(!(t===`vertical`&&[`ArrowLeft`,`ArrowRight`].includes(r))&&!(t===`horizontal`&&[`ArrowUp`,`ArrowDown`].includes(r)))return jd[r]}_d(Nd,`getFocusIntent`);function Pd(e,t=!1){let n=document.activeElement;for(let r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}_d(Pd,`focusFirst`);function Fd(e,t){return e.map((n,r)=>e[(t+r)%e.length])}_d(Fd,`wrapArray`);var Id=Dd,Ld=Ad,Rd=Object.defineProperty,zd=(e,t)=>Rd(e,`name`,{value:t,configurable:!0}),Bd=[`Enter`,` `],Vd=[`ArrowDown`,`PageUp`,`Home`],Hd=[`ArrowUp`,`PageDown`,`End`],Ud=[...Vd,...Hd];[...Bd],[...Bd];var Wd=`Menu`,[Gd,Kd,qd]=ta(Wd),[Jd,Yd]=Zi(Wd,[qd,Ku,wd]),Xd=Ku(),Zd=wd(),[Qd,$d]=Jd(Wd),[ef,tf]=Jd(Wd),nf=zd(e=>{let{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:a,modal:o=!0}=e,s=Xd(t),[c,l]=x.useState(null),u=x.useRef(!1),d=$a(a),f=Xa(i);return x.useEffect(()=>{let e=zd(()=>{u.current=!0,document.addEventListener(`pointerdown`,t,{capture:!0,once:!0}),document.addEventListener(`pointermove`,t,{capture:!0,once:!0})},`handleKeyDown`),t=zd(()=>u.current=!1,`handlePointer`);return document.addEventListener(`keydown`,e,{capture:!0}),()=>{document.removeEventListener(`keydown`,e,{capture:!0}),document.removeEventListener(`pointerdown`,t,{capture:!0}),document.removeEventListener(`pointermove`,t,{capture:!0})}},[]),x.useEffect(()=>{if(!n)return;let e=zd(()=>d(!1),`handleBlur`);return window.addEventListener(`blur`,e),()=>window.removeEventListener(`blur`,e)},[n,d]),(0,S.jsx)(ad,{...s,children:(0,S.jsx)(Qd,{scope:t,open:n,onOpenChange:d,content:c,onContentChange:l,children:(0,S.jsx)(ef,{scope:t,onClose:x.useCallback(()=>d(!1),[d]),isUsingKeyboardRef:u,dir:f,modal:o,children:r})})})},`Menu`),rf=x.forwardRef(zd(function(e,t){let{__scopeMenu:n,...r}=e,i=Xd(n);return(0,S.jsx)(od,{...i,...r,ref:t})},`MenuAnchor`)),af=`MenuPortal`,[of,sf]=Jd(af,{forceMount:void 0}),cf=zd(e=>{let{__scopeMenu:t,forceMount:n,children:r,container:i}=e,a=$d(af,t);return(0,S.jsx)(of,{scope:t,forceMount:n,children:(0,S.jsx)(Ia,{present:n||a.open,children:(0,S.jsx)(Mo,{asChild:!0,container:i,children:r})})})},`MenuPortal`),lf=`MenuContent`,[uf,df]=Jd(lf),ff=x.forwardRef(zd(function(e,t){let n=sf(lf,e.__scopeMenu),{forceMount:r=n.forceMount,...i}=e,a=$d(lf,e.__scopeMenu),o=tf(lf,e.__scopeMenu);return(0,S.jsx)(Gd.Provider,{scope:e.__scopeMenu,children:(0,S.jsx)(Ia,{present:r||a.open,children:(0,S.jsx)(Gd.Slot,{scope:e.__scopeMenu,children:o.modal?(0,S.jsx)(pf,{...i,ref:t}):(0,S.jsx)(mf,{...i,ref:t})})})})},`MenuContent`)),pf=x.forwardRef(zd(function(e,t){let n=$d(lf,e.__scopeMenu),r=x.useRef(null),i=Oi(t,r);return x.useEffect(()=>{let e=r.current;if(e)return ic(e)},[]),(0,S.jsx)(gf,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:G(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})},`MenuRootContentModal`)),mf=x.forwardRef(zd(function(e,t){let n=$d(lf,e.__scopeMenu);return(0,S.jsx)(gf,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})},`MenuRootContentNonModal`)),hf=W(`MenuContent.ScrollLock`),gf=x.forwardRef(zd(function(e,t){let{__scopeMenu:n,loop:r=!1,trapFocus:i,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:s,onEntryFocus:c,onEscapeKeyDown:l,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:f,onDismiss:p,disableOutsideScroll:m,...h}=e,g=$d(lf,n),_=tf(lf,n),v=Xd(n),y=Zd(n),b=Kd(n),[C,w]=x.useState(null),T=x.useRef(null),E=Oi(t,T,g.onContentChange),D=x.useRef(0),O=x.useRef(``),ee=x.useRef(0),k=x.useRef(null),A=x.useRef(`right`),j=x.useRef(0),te=m?Ys:x.Fragment,M=m?{as:hf,allowPinchZoom:!0}:void 0,ne=zd(e=>{let t=O.current+e,n=b().filter(e=>!e.disabled),r=document.activeElement,i=n.find(e=>e.ref.current===r)?.textValue,a=Nf(n.map(e=>e.textValue),t,i),o=n.find(e=>e.textValue===a)?.ref.current;zd((function e(t){O.current=t,window.clearTimeout(D.current),t!==``&&(D.current=window.setTimeout(()=>e(``),1e3))}),`updateSearch`)(t),o&&setTimeout(()=>o.focus())},`handleTypeaheadSearch`);x.useEffect(()=>()=>window.clearTimeout(D.current),[]),Ro();let N=x.useCallback(e=>A.current===k.current?.side&&Ff(e,k.current?.area),[]);return(0,S.jsx)(uf,{scope:n,searchRef:O,onItemEnter:x.useCallback(e=>{N(e)&&e.preventDefault()},[N]),onItemLeave:x.useCallback(e=>{N(e)||(T.current?.focus(),w(null))},[N]),onTriggerLeave:x.useCallback(e=>{N(e)&&e.preventDefault()},[N]),pointerGraceTimerRef:ee,onPointerGraceIntentChange:x.useCallback(e=>{k.current=e},[]),children:(0,S.jsx)(te,{...M,children:(0,S.jsx)(yo,{asChild:!0,trapped:i,onMountAutoFocus:G(a,e=>{e.preventDefault(),T.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:o,children:(0,S.jsx)(K,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:l,onPointerDownOutside:u,onFocusOutside:d,onInteractOutside:f,onDismiss:p,children:(0,S.jsx)(Id,{asChild:!0,...y,dir:_.dir,orientation:`vertical`,loop:r,currentTabStopId:C,onCurrentTabStopIdChange:w,onEntryFocus:G(c,e=>{_.isUsingKeyboardRef.current||e.preventDefault()}),preventScrollOnEntryFocus:!0,children:(0,S.jsx)(sd,{role:`menu`,"aria-orientation":`vertical`,"data-state":Of(g.open),"data-radix-menu-content":``,dir:_.dir,...v,...h,ref:E,style:{outline:`none`,...h.style},onKeyDown:G(h.onKeyDown,e=>{let t=e.target.closest(`[data-radix-menu-content]`)===e.currentTarget,n=e.ctrlKey||e.altKey||e.metaKey,r=e.key.length===1;t&&(e.key===`Tab`&&e.preventDefault(),!n&&r&&ne(e.key));let i=T.current;if(e.target!==i||!Ud.includes(e.key))return;e.preventDefault();let a=b().filter(e=>!e.disabled).map(e=>e.ref.current);Hd.includes(e.key)&&a.reverse(),jf(a)}),onBlur:G(e.onBlur,e=>{e.currentTarget.contains(e.target)||(window.clearTimeout(D.current),O.current=``)}),onPointerMove:G(e.onPointerMove,If(e=>{let t=e.target,n=j.current!==e.clientX;if(e.currentTarget.contains(t)&&n){let t=e.clientX>j.current?`right`:`left`;A.current=t,j.current=e.clientX}}))})})})})})})},`MenuContentImpl`)),_f=x.forwardRef(zd(function(e,t){let{__scopeMenu:n,...r}=e;return(0,S.jsx)(Ki.div,{role:`group`,...r,ref:t})},`MenuGroup`)),vf=`MenuItem`,yf=`menu.itemSelect`,bf=x.forwardRef(zd(function(e,t){let{disabled:n=!1,onSelect:r,...i}=e,a=x.useRef(null),o=tf(vf,e.__scopeMenu),s=df(vf,e.__scopeMenu),c=Oi(t,a),l=x.useRef(!1),u=zd(()=>{let e=a.current;if(!n&&e){let t=new CustomEvent(yf,{bubbles:!0,cancelable:!0});e.addEventListener(yf,e=>r?.(e),{once:!0}),qi(e,t),t.defaultPrevented?l.current=!1:o.onClose()}},`handleSelect`);return(0,S.jsx)(xf,{...i,ref:c,disabled:n,onClick:G(e.onClick,u),onPointerDown:t=>{e.onPointerDown?.(t),l.current=!0},onPointerUp:G(e.onPointerUp,e=>{l.current||e.currentTarget?.click()}),onKeyDown:G(e.onKeyDown,e=>{n||e.target!==e.currentTarget||(s.searchRef.current===``||e.key!==` `)&&Bd.includes(e.key)&&(e.currentTarget.click(),e.preventDefault())})})},`MenuItem`)),xf=x.forwardRef(zd(function(e,t){let{__scopeMenu:n,disabled:r=!1,textValue:i,...a}=e,o=df(vf,n),s=Zd(n),c=x.useRef(null),l=Oi(t,c),[u,d]=x.useState(!1),[f,p]=x.useState(``);return x.useEffect(()=>{let e=c.current;e&&p((e.textContent??``).trim())},[a.children]),(0,S.jsx)(Gd.ItemSlot,{scope:n,disabled:r,textValue:i??f,children:(0,S.jsx)(Ld,{asChild:!0,...s,focusable:!r,children:(0,S.jsx)(Ki.div,{role:`menuitem`,"data-highlighted":u?``:void 0,"aria-disabled":r||void 0,"data-disabled":r?``:void 0,...a,ref:l,onPointerMove:G(e.onPointerMove,If(e=>{r?o.onItemLeave(e):(o.onItemEnter(e),e.defaultPrevented||e.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:G(e.onPointerLeave,If(e=>o.onItemLeave(e))),onFocus:G(e.onFocus,()=>d(!0)),onBlur:G(e.onBlur,()=>d(!1))})})})},`MenuItemImpl`)),[Sf,Cf]=Jd(`MenuRadioGroup`,{value:void 0,onValueChange:zd(()=>{},`onValueChange`)}),[wf,Tf]=Jd(`MenuItemIndicator`,{checked:!1}),[Ef,Df]=Jd(`MenuSub`);function Of(e){return e?`open`:`closed`}zd(Of,`getOpenState`);function kf(e){return e===`indeterminate`}zd(kf,`isIndeterminate`);function Af(e){return kf(e)?`indeterminate`:e?`checked`:`unchecked`}zd(Af,`getCheckedState`);function jf(e){let t=document.activeElement;for(let n of e)if(n===t||(n.focus(),document.activeElement!==t))return}zd(jf,`focusFirst`);function Mf(e,t){return e.map((n,r)=>e[(t+r)%e.length])}zd(Mf,`wrapArray`);function Nf(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=Mf(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}zd(Nf,`getNextMatch`);function Pf(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;er!=d>r&&n<(u-c)*(r-l)/(d-l)+c&&(i=!i)}return i}zd(Pf,`isPointInPolygon`);function Ff(e,t){return t?Pf({x:e.clientX,y:e.clientY},t):!1}zd(Ff,`isPointerInGraceArea`);function If(e){return t=>t.pointerType===`mouse`?e(t):void 0}zd(If,`whenMouse`);var Lf=nf,Rf=rf,zf=cf,Bf=ff,Vf=_f,Hf=bf,Uf=Object.defineProperty,Wf=(e,t)=>Uf(e,`name`,{value:t,configurable:!0}),Gf=`DropdownMenu`,[Kf,qf]=Zi(Gf,[Yd]),Jf=Yd(),[Yf,Xf]=Kf(Gf),Zf=Wf(e=>{let{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:a,onOpenChange:o,modal:s=!0}=e,c=Jf(t),l=x.useRef(null),[u,d]=Oa({prop:i,defaultProp:a??!1,onChange:o,caller:Gf});return(0,S.jsx)(Yf,{scope:t,triggerId:Ka(),triggerRef:l,contentId:Ka(),open:u,onOpenChange:d,onOpenToggle:x.useCallback(()=>d(e=>!e),[d]),modal:s,children:(0,S.jsx)(Lf,{...c,open:u,onOpenChange:d,dir:r,modal:s,children:n})})},`DropdownMenu`),Qf=`DropdownMenuTrigger`,$f=x.forwardRef(Wf(function(e,t){let{__scopeDropdownMenu:n,disabled:r=!1,...i}=e,a=Xf(Qf,n),o=Jf(n),s=Oi(t,a.triggerRef);return(0,S.jsx)(Rf,{asChild:!0,...o,children:(0,S.jsx)(Ki.button,{type:`button`,id:a.triggerId,"aria-haspopup":`menu`,"aria-expanded":a.open,"aria-controls":a.open?a.contentId:void 0,"data-state":a.open?`open`:`closed`,"data-disabled":r?``:void 0,disabled:r,...i,ref:s,onPointerDown:G(e.onPointerDown,e=>{!r&&e.button===0&&e.ctrlKey===!1&&(a.onOpenToggle(),a.open||e.preventDefault())}),onKeyDown:G(e.onKeyDown,e=>{r||([`Enter`,` `].includes(e.key)&&a.onOpenToggle(),e.key===`ArrowDown`&&a.onOpenChange(!0),[`Enter`,` `,`ArrowDown`].includes(e.key)&&e.preventDefault())})})})},`DropdownMenuTrigger`)),ep=Wf(e=>{let{__scopeDropdownMenu:t,...n}=e,r=Jf(t);return(0,S.jsx)(zf,{...r,...n})},`DropdownMenuPortal`),tp=`DropdownMenuContent`,np=x.forwardRef(Wf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=Xf(tp,n),a=Jf(n),o=x.useRef(!1);return(0,S.jsx)(Bf,{id:i.contentId,"aria-labelledby":i.triggerId,...a,...r,ref:t,onCloseAutoFocus:G(e.onCloseAutoFocus,e=>{o.current||i.triggerRef.current?.focus(),o.current=!1,e.preventDefault()}),onInteractOutside:G(e.onInteractOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0,r=t.button===2||n;(!i.modal||r)&&(o.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-dropdown-menu-content-available-width":`var(--radix-popper-available-width)`,"--radix-dropdown-menu-content-available-height":`var(--radix-popper-available-height)`,"--radix-dropdown-menu-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-dropdown-menu-trigger-height":`var(--radix-popper-anchor-height)`}})},`DropdownMenuContent`)),rp=x.forwardRef(Wf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=Jf(n);return(0,S.jsx)(Vf,{...i,...r,ref:t})},`DropdownMenuGroup`)),ip=x.forwardRef(Wf(function(e,t){let{__scopeDropdownMenu:n,...r}=e,i=Jf(n);return(0,S.jsx)(Hf,{...i,...r,ref:t})},`DropdownMenuItem`)),ap=Zf,op=$f,sp=ep,cp=np,lp=rp,up=ip,dp=Object.defineProperty,fp=x.forwardRef(((e,t)=>dp(e,`name`,{value:t,configurable:!0}))(function(e,t){return(0,S.jsx)(Ki.label,{...e,ref:t,onMouseDown:t=>{t.target.closest(`button, input, select, textarea`)||(e.onMouseDown?.(t),!t.defaultPrevented&&t.detail>1&&t.preventDefault())}})},`Label`)),pp=Object.defineProperty,mp=(e,t)=>pp(e,`name`,{value:t,configurable:!0}),hp=`Tabs`,[gp,_p]=Zi(hp,[wd]),vp=wd(),[yp,bp]=gp(hp),xp=x.forwardRef(mp(function(e,t){let{__scopeTabs:n,value:r,onValueChange:i,defaultValue:a,orientation:o=`horizontal`,dir:s,activationMode:c=`automatic`,...l}=e,u=Xa(s),[d,f]=Oa({prop:r,onChange:i,defaultProp:a??``,caller:hp});return(0,S.jsx)(yp,{scope:n,baseId:Ka(),value:d,onValueChange:f,orientation:o,dir:u,activationMode:c,children:(0,S.jsx)(Ki.div,{dir:u,"data-orientation":o,...l,ref:t})})},`Tabs`)),Sp=`TabsList`,Cp=x.forwardRef(mp(function(e,t){let{__scopeTabs:n,loop:r=!0,...i}=e,a=bp(Sp,n),o=vp(n);return(0,S.jsx)(Id,{asChild:!0,...o,orientation:a.orientation,dir:a.dir,loop:r,children:(0,S.jsx)(Ki.div,{role:`tablist`,"aria-orientation":a.orientation,...i,ref:t})})},`TabsList`)),wp=`TabsTrigger`,Tp=x.forwardRef(mp(function(e,t){let{__scopeTabs:n,value:r,disabled:i=!1,...a}=e,o=bp(wp,n),s=vp(n),c=Op(o.baseId,r),l=kp(o.baseId,r),u=r===o.value;return(0,S.jsx)(Ld,{asChild:!0,...s,focusable:!i,active:u,children:(0,S.jsx)(Ki.button,{type:`button`,role:`tab`,"aria-selected":u,"aria-controls":l,"data-state":u?`active`:`inactive`,"data-disabled":i?``:void 0,disabled:i,id:c,...a,ref:t,onMouseDown:G(e.onMouseDown,e=>{!i&&e.button===0&&e.ctrlKey===!1?o.onValueChange(r):e.preventDefault()}),onKeyDown:G(e.onKeyDown,e=>{i||e.target!==e.currentTarget||[` `,`Enter`].includes(e.key)&&o.onValueChange(r)}),onFocus:G(e.onFocus,()=>{let e=o.activationMode!==`manual`;!u&&!i&&e&&o.onValueChange(r)})})})},`TabsTrigger`)),Ep=`TabsContent`,Dp=x.forwardRef(mp(function(e,t){let{__scopeTabs:n,value:r,forceMount:i,children:a,...o}=e,s=bp(Ep,n),c=Op(s.baseId,r),l=kp(s.baseId,r),u=r===s.value,d=x.useRef(u);return x.useEffect(()=>{let e=requestAnimationFrame(()=>d.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,S.jsx)(Ia,{present:i||u,children:({present:n})=>(0,S.jsx)(Ki.div,{"data-state":u?`active`:`inactive`,"data-orientation":s.orientation,role:`tabpanel`,"aria-labelledby":c,hidden:!n,id:l,tabIndex:0,...o,ref:t,style:{...e.style,animationDuration:d.current?`0s`:void 0},children:n&&a})})},`TabsContent`));function Op(e,t){return`${e}-trigger-${t}`}mp(Op,`makeTriggerId`);function kp(e,t){return`${e}-content-${t}`}mp(kp,`makeContentId`);var Ap=xp,jp=Cp,Mp=Tp,Np=Dp,Pp=Qn(`inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40`,outline:`border bg-background hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-9 px-4 py-2 has-[>svg]:px-3`,xs:`h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5`,lg:`h-10 rounded-md px-6 has-[>svg]:px-4`,icon:`size-9`,"icon-xs":`size-6 rounded-md [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-8`,"icon-lg":`size-10`}},defaultVariants:{variant:`default`,size:`default`}});function $({className:e,variant:t=`default`,size:n=`default`,asChild:r=!1,...i}){let a=r?Ai:`button`;return(0,S.jsx)(a,{"data-slot":`button`,"data-variant":t,"data-size":n,className:H(Pp({variant:t,size:n,className:e})),...i})}function Fp({className:e,orientation:t=`horizontal`,...n}){return(0,S.jsx)(Ap,{"data-slot":`tabs`,"data-orientation":t,orientation:t,className:H(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,e),...n})}var Ip=Qn(`group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function Lp({className:e,variant:t=`default`,...n}){return(0,S.jsx)(jp,{"data-slot":`tabs-list`,"data-variant":t,className:H(Ip({variant:t}),e),...n})}function Rp({className:e,...t}){return(0,S.jsx)(Mp,{"data-slot":`tabs-trigger`,className:H(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,e),...t})}function zp({className:e,...t}){return(0,S.jsx)(Np,{"data-slot":`tabs-content`,className:H(`flex-1 outline-none`,e),...t})}function Bp(e){if(e.apiVersion!==1||!/^[a-z][a-z0-9-]*$/.test(e.id))throw Error(`Invalid theme pack: ${e.id}`);return e}var Vp=Bp({apiVersion:1,id:`precision`,name:`Precision`,description:`Clear typography, quiet surfaces, and a cobalt accent.`}),Hp=Object.assign({"./packs/precision/index.ts":Vp}),Up=`precision`,Wp=Object.values(Hp).sort((e,t)=>e.id===`precision`?-1:t.id===`precision`?1:e.name.localeCompare(t.name)),Gp=new Map;for(let e of Wp){if(Gp.has(e.id))throw Error(`Duplicate theme pack: ${e.id}`);Gp.set(e.id,e)}if(!Gp.has(`precision`))throw Error(`The default theme is required`);function Kp(e){return Gp.get(e)||Gp.get(`precision`)}var qp={themeId:Up,appearance:`light`},Jp=e=>e===`light`||e===`dark`||e===`system`,Yp=e=>`dispatch:theme:v1:${e}`;function Xp(e){try{let t=e?localStorage.getItem(Yp(e)):null;if(!t)return qp;let n=JSON.parse(t);return!n||typeof n!=`object`?qp:{themeId:Kp(n.themeId).id,appearance:Jp(n.appearance)?n.appearance:`light`}}catch{return qp}}var Zp=(0,x.createContext)(null);function Qp({userId:e,children:t}){let[n,r]=(0,x.useState)(()=>({userId:e,preference:Xp(e),storageUnavailable:!1}));n.userId!==e&&r({userId:e,preference:Xp(e),storageUnavailable:!1});let{preference:i,storageUnavailable:a}=n,{appearance:o,themeId:s}=i,c=Kp(s),[l,u]=(0,x.useState)(()=>matchMedia(`(prefers-color-scheme: dark)`).matches),d=o===`system`?l?`dark`:`light`:o;(0,x.useLayoutEffect)(()=>{document.documentElement.dataset.theme=d,document.documentElement.dataset.themePack=c.id,document.querySelector(`meta[name="theme-color"]`)?.setAttribute(`content`,getComputedStyle(document.documentElement).getPropertyValue(`--background`).trim())},[d,c.id]),(0,x.useEffect)(()=>{let e=matchMedia(`(prefers-color-scheme: dark)`),t=()=>u(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),(0,x.useEffect)(()=>{if(!e)return;let t=t=>{(t.key===null||t.key===Yp(e))&&r(t=>t.userId===e?{...t,preference:Xp(e)}:t)};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},[e]);function f(t){let n=!1;try{if(!e)return;localStorage.setItem(Yp(e),JSON.stringify(t))}catch{n=!0}r({userId:e,preference:t,storageUnavailable:n})}return(0,S.jsx)(Zp.Provider,{value:{appearance:o,themePack:c,storageUnavailable:a,setAppearance:e=>f({...i,appearance:e}),setThemePack:e=>f({...i,themeId:Kp(e).id})},children:t})}function $p(){let e=(0,x.useContext)(Zp);if(!e)throw Error(`ThemeProvider is required`);return e}function em({className:e,...t}){return(0,S.jsx)(fp,{"data-slot":`label`,className:H(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}function tm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`field-group`,className:H(`group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4`,e),...t})}var nm=Qn(`group/field flex w-full gap-3 data-[invalid=true]:text-destructive`,{variants:{orientation:{vertical:[`flex-col [&>*]:w-full [&>.sr-only]:w-auto`],horizontal:[`flex-row items-center`,`[&>[data-slot=field-label]]:flex-auto`,`has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px`],responsive:[`flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto`,`@md/field-group:[&>[data-slot=field-label]]:flex-auto`,`@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px`]}},defaultVariants:{orientation:`vertical`}});function rm({className:e,orientation:t=`vertical`,...n}){return(0,S.jsx)(`div`,{role:`group`,"data-slot":`field`,"data-orientation":t,className:H(nm({orientation:t}),e),...n})}function im({className:e,...t}){return(0,S.jsx)(em,{"data-slot":`field-label`,className:H(`group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50`,`has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4`,`has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10`,e),...t})}function am({className:e,...t}){return(0,S.jsx)(`p`,{"data-slot":`field-description`,className:H(`text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance`,`last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5`,`[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary`,e),...t})}function om({className:e,type:t,...n}){return(0,S.jsx)(`input`,{type:t,"data-slot":`input`,className:H(`h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30`,`focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`,`aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40`,e),...n})}function sm({...e}){return(0,S.jsx)(fc,{"data-slot":`sheet`,...e})}function cm({...e}){return(0,S.jsx)(gc,{"data-slot":`sheet-portal`,...e})}function lm({className:e,...t}){return(0,S.jsx)(vc,{"data-slot":`sheet-overlay`,className:H(`fixed inset-0 z-50 bg-black/15 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function um({className:e,children:t,side:n=`right`,showCloseButton:r=!0,...i}){return(0,S.jsxs)(cm,{children:[(0,S.jsx)(lm,{}),(0,S.jsxs)(Sc,{"data-slot":`sheet-content`,className:H(`fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-200`,n===`right`&&`inset-y-0 right-0 h-full w-full border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-[440px]`,n===`left`&&`inset-y-0 left-0 h-full w-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-[440px]`,n===`top`&&`inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top`,n===`bottom`&&`inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom`,e),...i,children:[t,r&&(0,S.jsxs)(jc,{className:`absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary`,children:[(0,S.jsx)(qn,{className:`size-4`}),(0,S.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function dm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`sheet-header`,className:H(`flex flex-col gap-1.5 p-4`,e),...t})}function fm({className:e,...t}){return(0,S.jsx)(Dc,{"data-slot":`sheet-title`,className:H(`font-semibold text-foreground`,e),...t})}function pm({className:e,...t}){return(0,S.jsx)(kc,{"data-slot":`sheet-description`,className:H(`text-sm text-muted-foreground`,e),...t})}function mm({...e}){return(0,S.jsx)(fc,{"data-slot":`dialog`,...e})}function hm({...e}){return(0,S.jsx)(gc,{"data-slot":`dialog-portal`,...e})}function gm({className:e,...t}){return(0,S.jsx)(vc,{"data-slot":`dialog-overlay`,className:H(`fixed inset-0 z-50 bg-black/15 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function _m({className:e,children:t,showCloseButton:n=!0,...r}){return(0,S.jsxs)(hm,{"data-slot":`dialog-portal`,children:[(0,S.jsx)(gm,{}),(0,S.jsxs)(Sc,{"data-slot":`dialog-content`,className:H(`fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg`,e),...r,children:[t,n&&(0,S.jsxs)(jc,{"data-slot":`dialog-close`,className:`absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,children:[(0,S.jsx)(qn,{}),(0,S.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function vm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`dialog-header`,className:H(`flex flex-col gap-2 text-center sm:text-left`,e),...t})}function ym({className:e,showCloseButton:t=!1,children:n,...r}){return(0,S.jsxs)(`div`,{"data-slot":`dialog-footer`,className:H(`flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,e),...r,children:[n,t&&(0,S.jsx)(jc,{asChild:!0,children:(0,S.jsx)($,{variant:`outline`,children:`Close`})})]})}function bm({className:e,...t}){return(0,S.jsx)(Dc,{"data-slot":`dialog-title`,className:H(`text-lg leading-none font-semibold`,e),...t})}function xm({className:e,...t}){return(0,S.jsx)(kc,{"data-slot":`dialog-description`,className:H(`text-sm text-muted-foreground`,e),...t})}var Sm=Qn(`relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current`}},defaultVariants:{variant:`default`}});function Cm({className:e,variant:t,...n}){return(0,S.jsx)(`div`,{"data-slot":`alert`,role:`alert`,className:H(Sm({variant:t}),e),...n})}function wm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`alert-description`,className:H(`col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed`,e),...t})}function Tm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`skeleton`,className:H(`animate-pulse rounded-md bg-accent`,e),...t})}function Em({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty`,className:H(`flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12`,e),...t})}function Dm({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-header`,className:H(`flex max-w-sm flex-col items-center gap-2 text-center`,e),...t})}function Om({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-title`,className:H(`text-lg font-medium tracking-tight`,e),...t})}function km({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`empty-description`,className:H(`text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary`,e),...t})}function Am(e){return{dsp_view_scope:`Exit this DSP to use platform controls or switch accounts.`,dsp_view_unavailable:`This DSP view expired or is no longer available. Open it again from DSPs.`,dsp_view_changed:`The DSP view changed. Refresh to load the current workspace.`,invalid_input:`Check the fields and use a valid station code and business timezone.`,container_provisioning_required:`DSP provisioning is not configured on this server. Contact the platform operator.`,native_migration_required:`Finish migrating or removing existing legacy DSPs before starting this update.`,organization_details_required:`Finish your DSP details before continuing setup.`,organization_details_complete:`Your DSP details have already been saved.`,update_unavailable:`This update is no longer available. Refresh and try again.`,rollout_in_progress:`A rollout is already in progress.`,rollout_empty:`Create a DSP before starting a rollout.`,rollout_not_active:`There is no active rollout to change.`,invalid_credentials:`The email address or password was not accepted.`,password_reset_invalid:`This reset link is invalid or has expired. Request a new link to continue.`,password_recovery_rate_limited:`Too many recovery attempts. Please try again in 15 minutes.`,password_recovery_busy:`Password recovery is busy. Please try again shortly.`,password_recovery_unavailable:`Password recovery is temporarily unavailable. Please contact your Dispatch administrator.`,turnstile_required:`Complete the security check before continuing.`,turnstile_invalid:`The security check was not accepted. Please verify again and retry.`,turnstile_unavailable:`Security verification is temporarily unavailable. Please try again shortly.`,login_rate_limited:`Too many sign-in attempts. Wait before trying again.`,invitation_invalid:`This invitation is invalid, expired, revoked, or already used.`,invitation_email_mismatch:`Sign in with the exact email address named by this invitation.`,password_policy_failed:`Use a password containing at least 12 characters.`,password_confirmation_mismatch:`The password confirmation does not match.`,user_already_belongs_to_dsp:`This user already belongs to another DSP.`,current_password_invalid:`The current password was not accepted.`,password_unchanged:`Choose a new password that differs from the current password.`,account_exists:`An account already exists for this invitation. Sign in instead.`,invitation_pending:`A pending invitation already exists for that email.`,membership_exists:`That user already belongs to this DSP.`,conflict:`That name or account is already in use.`,role_in_use:`Move all members off this role before deleting it.`,fixed_roles_only:`DSP roles are fixed to Owner, Manager, Dispatcher, and Driver.`,last_owner_protected:`Assign another Owner before changing or removing the last Owner.`,system_role_protected:`System roles are protected and cannot be changed.`,role_not_assignable:`Choose a standard role from this DSP.`,self_role_change_forbidden:`You cannot change your own role.`,organization_forbidden:`Your account does not have permission for that DSP.`,workforce_changed:`The employee list changed while loading. Please retry.`,workforce_unavailable:`Workforce data is temporarily unavailable. Please retry.`,not_initialized:`Paycom has not collected workforce data yet.`,employee_not_found:`This employee is no longer in the collected roster.`,paycom_credentials_invalid:`Complete all Paycom fields and enter five distinct security PINs in their original Paycom numbering.`,confirmation_mismatch:`Type the DSP name exactly as displayed to confirm.`,primary_credentials_rejected:`Paycom did not accept the client code, username or password.`,security_answers_rejected:`Paycom did not accept the security PINs.`,attempt_cooldown:`Paycom setup is waiting for the authentication cooldown. Retry after it clears.`,profile_locked:`This Paycom profile is locked. Review the failure before replacing its credentials.`,provider_setup_failed:`Paycom setup could not complete. Review your details and retry.`,profile_exists:`Paycom credentials are already saved. Select replacement only if you intend to change them.`,captcha_required:`Paycom needs verification. Contact the Platform Owner.`,manual_verification_required:`Paycom needs verification. Contact the Platform Owner.`,mfa_required:`Paycom requires additional verification. Resolve it with your authorized Paycom administrator before retrying.`,account_locked:`Paycom reports that the account is locked. Resolve the lock before retrying.`,setup_interrupted:`Setup was interrupted. Review your details and retry.`,platform_forbidden:`You do not have permission to manage DSP installations.`,platform_control_invalid:`This control expired or belongs to another session. Refresh and try again.`,installation_operator_disabled:`DSP provisioning is not enabled on this server. Server setup must be completed before creating DSPs or starting updates.`,invitation_email_unavailable:`Invitation email is not configured on this server. No invitation was sent. Contact the platform owner to finish email setup.`,dashboard_unavailable:`Dispatch is temporarily unavailable. Refresh to check whether your request completed before trying again.`,installation_revision_conflict:`The installation changed in another session. Refresh before trying again.`,installation_operation_in_progress:`An installation operation is already in progress. Its status will keep updating.`,installation_operation_not_allowed:`This installation cannot be changed from its current state.`,installation_operation_not_found:`That installation operation is no longer available. Refresh the status.`,idempotency_conflict:`This request was reused for different input. Refresh and try again.`,installation_not_ready:`This DSP runtime is not ready yet. Operational data will be available after setup completes.`,provider_auth_required:`Paycom access needs attention. Contact the platform owner for assistance.`,first_publication_failed:`Private runtime verification did not complete. Contact the platform operator.`,runtime_boundary_violation:`The private runtime could not be verified. Contact the platform operator.`}[typeof e==`string`?e:e instanceof Jt?e.code:``]||`The request could not be completed. Please try again.`}function jm(e){if(typeof e!=`string`||!e||e.length>64)return!1;try{return new Intl.DateTimeFormat(void 0,{timeZone:e}).format(0),!0}catch{return!1}}function Mm(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`}catch{return`UTC`}}function Nm(e,t=Mm()){let n=e instanceof Date?e:new Date(e);return Number.isFinite(n.valueOf())?new Intl.DateTimeFormat(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,timeZoneName:`short`,timeZone:t}).format(n):`—`}function Pm(e,t=new Date){let n=Object.fromEntries(new Intl.DateTimeFormat(`en-CA`,{timeZone:e,year:`numeric`,month:`2-digit`,day:`2-digit`}).formatToParts(t).map(e=>[e.type,e.value]));return`${n.year}-${n.month}-${n.day}`}function Fm(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw Error(`invalid_calendar_date`);let t=new Date(`${e}T12:00:00Z`);if(!Number.isFinite(t.valueOf())||t.toISOString().slice(0,10)!==e)throw Error(`invalid_calendar_date`);return t}function Im(e,t){if(!Number.isInteger(t))throw Error(`invalid_calendar_date`);let n=Fm(e);return n.setUTCDate(n.getUTCDate()+t),n.toISOString().slice(0,10)}function Lm(e){return new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,year:`numeric`,timeZone:`UTC`}).format(Fm(e))}function Rm(e){let t=$p().themePack.components?.PageHeading||zm;return(0,S.jsx)(t,{...e})}function zm({title:e,description:t,children:n}){return(0,S.jsxs)(`div`,{className:`page-heading`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h1`,{tabIndex:-1,children:e}),t&&(0,S.jsx)(`p`,{children:t})]}),n&&(0,S.jsx)(`div`,{className:`page-actions`,children:n})]})}function Bm({label:e,description:t,...n}){let r=(0,x.useId)();return(0,S.jsxs)(rm,{"data-disabled":n.disabled,children:[(0,S.jsx)(im,{htmlFor:r,children:e}),(0,S.jsx)(om,{id:r,...n}),t&&(0,S.jsx)(am,{children:t})]})}function Vm({children:e,error:t=!1}){return(0,S.jsx)(Cm,{variant:t?`destructive`:`default`,role:t?`alert`:`status`,className:`my-4`,children:(0,S.jsx)(wm,{children:e})})}function Hm({error:e}){return e?(0,S.jsx)(Vm,{error:!0,children:Am(e)}):null}function Um(){return(0,S.jsxs)(`div`,{className:`flex flex-col gap-5 py-8`,role:`status`,"aria-label":`Loading`,children:[(0,S.jsx)(Tm,{className:`h-6 w-48`}),[0,1,2].map(e=>(0,S.jsx)(Tm,{className:`h-12 w-full`},e))]})}function Wm({title:e,description:t}){return(0,S.jsx)(Em,{children:(0,S.jsxs)(Dm,{children:[(0,S.jsx)(Om,{children:e}),t&&(0,S.jsx)(km,{children:t})]})})}function Gm({onClick:e,busy:t=!1}){return(0,S.jsx)($,{variant:`outline`,size:`icon`,"aria-label":`Refresh`,disabled:t,onClick:e,children:(0,S.jsx)(Vn,{"data-icon":`inline-start`,className:H(t&&`animate-spin`)})})}function Km({value:e,onChange:t,placeholder:n}){return(0,S.jsxs)(`label`,{className:`search-input`,children:[(0,S.jsx)(Hn,{"aria-hidden":`true`}),(0,S.jsx)(om,{type:`search`,"aria-label":n,placeholder:n,value:e,onChange:e=>t(e.target.value)})]})}function qm({busy:e,children:t,...n}){return(0,S.jsxs)($,{type:`submit`,disabled:e,...n,children:[e&&(0,S.jsx)(Nn,{"data-icon":`inline-start`,className:`animate-spin`}),t]})}function Jm({value:e,children:t}){return(0,S.jsxs)(`span`,{className:H(`status`,`status-${e.replaceAll(`_`,`-`)}`),children:[(0,S.jsx)(`span`,{"aria-hidden":`true`}),t||e.replaceAll(`_`,` `)]})}function Ym({open:e,onClose:t,title:n,description:r,children:i,busy:a=!1}){let o=(0,x.useRef)(null);return(0,S.jsx)(sm,{open:e,onOpenChange:e=>{!e&&!a&&t()},children:(0,S.jsxs)(um,{showCloseButton:!a,onOpenAutoFocus:()=>{o.current=document.activeElement},onCloseAutoFocus:e=>{e.preventDefault(),o.current?.isConnected?o.current.focus():document.querySelector(`.page-heading h1`)?.focus()},children:[(0,S.jsxs)(dm,{children:[(0,S.jsx)(fm,{children:n}),(0,S.jsx)(pm,{children:r||`Review details and manage access.`})]}),i]})})}function Xm({title:e,description:t,confirmation:n,passwordRequired:r=!1,onConfirm:i,onClose:a}){let[o,s]=(0,x.useState)(``),[c,l]=(0,x.useState)(!1),[u,d]=(0,x.useState)(null);return(0,S.jsx)(mm,{open:!0,onOpenChange:e=>{!e&&!c&&a()},children:(0,S.jsxs)(_m,{showCloseButton:!c,children:[(0,S.jsxs)(vm,{children:[(0,S.jsx)(bm,{children:e}),(0,S.jsx)(xm,{children:t})]}),(0,S.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!(n&&o!==n)){l(!0),d(null);try{await i(r?o:void 0),a()}catch(e){r&&s(``),d(e)}finally{l(!1)}}},className:`flex flex-col gap-5`,children:[r&&(0,S.jsx)(Bm,{label:`Your password`,type:`password`,autoComplete:`current-password`,value:o,onChange:e=>s(e.target.value),required:!0,disabled:c}),n&&(0,S.jsx)(Bm,{label:`Type ${n} to confirm`,value:o,onChange:e=>s(e.target.value),autoComplete:`off`,disabled:c,required:!0}),(0,S.jsx)(Hm,{error:u}),(0,S.jsxs)(ym,{children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:c,onClick:a,children:`Cancel`}),(0,S.jsx)(qm,{busy:c,variant:`destructive`,disabled:c||!!(n&&o!==n)||r&&!o,children:e})]})]})]})})}function Zm({result:e}){if(!e)return null;let t=e.ownerInvitation?.email||e.invitation?.email||`the recipient`;if(e.delivery?.status===`accepted`)return(0,S.jsxs)(Vm,{children:[`Invitation sent to `,t,`.`]});if(!e.invitationPath)return(0,S.jsx)(Vm,{children:`The invitation request was already processed. No new invitation was sent.`});let n=new URL(e.invitationPath,window.location.origin).href;return(0,S.jsx)(Vm,{children:(0,S.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,S.jsx)(`p`,{children:e.delivery?.status===`unknown`?`Email delivery could not be confirmed. Use this same link if a private handoff is needed.`:e.delivery?.status===`failed`?`The invitation email could not be sent. Share this one-time invitation through a private channel.`:`No email was sent because invitation email is not configured. Share this one-time invitation through a private channel.`}),(0,S.jsx)(om,{"aria-label":`Invitation link`,value:n,readOnly:!0,onFocus:e=>e.target.select()}),(0,S.jsx)($,{variant:`outline`,onClick:()=>navigator.clipboard.writeText(n).catch(()=>{}),children:`Copy link`})]})})}function Qm(e){let t=e.toLocaleUpperCase(`en-US`).match(/[\p{L}\p{N}]+/gu)||[];return{initials:t.length>1?`${[...t[0]][0]}${[...t[1]][0]}`:[...t[0]||`?`].slice(0,2).join(``),className:`dsp-avatar tone-${[...t.join(` `)].reduce((e,t)=>e*31+t.codePointAt(0)>>>0,0)%5}`}}var $m=e=>`dispatch:timezone:v1:${e}`;function eh(e){try{let t=e?JSON.parse(localStorage.getItem($m(e))||`null`):null;return jm(t?.timeZone)?t.timeZone:null}catch{return null}}var th=(0,x.createContext)(null);function nh({userId:e,children:t}){let[n,r]=(0,x.useState)(()=>({userId:e,preference:eh(e),storageUnavailable:!1}));n.userId!==e&&r({userId:e,preference:eh(e),storageUnavailable:!1});let[i,a]=(0,x.useState)(Mm);(0,x.useEffect)(()=>{let e=()=>a(Mm()),t=window.setInterval(e,6e4);return window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,e),()=>{clearInterval(t),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,e)}},[]),(0,x.useEffect)(()=>{if(!e)return;let t=t=>{(t.key===null||t.key===$m(e))&&r(t=>t.userId===e?{...t,preference:eh(e)}:t)};return window.addEventListener(`storage`,t),()=>window.removeEventListener(`storage`,t)},[e]);function o(t){if(!e||t!==null&&!jm(t))return;let n=!1;try{localStorage.setItem($m(e),JSON.stringify({timeZone:t}))}catch{n=!0}r({userId:e,preference:t,storageUnavailable:n})}return(0,S.jsx)(th.Provider,{value:{timeZone:n.preference||i,deviceZone:i,preference:n.preference,setPreference:o,storageUnavailable:n.storageUnavailable},children:t})}function rh(){let e=(0,x.useContext)(th);if(!e)throw Error(`TimezoneProvider is required`);return e}function ih(e){let[t,n]=(0,x.useState)(Date.now);return(0,x.useEffect)(()=>{let e=()=>n(Date.now()),t=window.setInterval(e,3e4);return window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,e),()=>{clearInterval(t),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,e)}},[]),Pm(e,t)}var ah={timeZone:void 0,dspIdentity:Qm,byId:e=>document.getElementById(e),node:(e,t,n)=>{let r=document.createElement(e);return t&&(r.className=t),n!==void 0&&(r.textContent=String(n)),r},mutation:rn,request:nn,mutationKey:on,settleMutationKey:sn,errorMessage:Am};function oh({page:e,hash:t}){let{timeZone:n}=rh(),r=(0,x.useMemo)(()=>e===`updates`?window.createUpdatesViews({...ah,timeZone:n}):window.createBackupsViews({...ah,timeZone:n}),[e,n]),[i,a]=(0,x.useState)(null),o=()=>`renderUpdates`in r?r.renderUpdates():r.renderBackups();return(0,x.useEffect)(()=>(window.showToast=(e,t,n)=>a({text:[e,t].filter(Boolean).join(`. `),error:n===`error`}),`setUpdatesActive`in r?r.setUpdatesActive(!0):r.setBackupsActive(!0),o(),()=>{`setUpdatesActive`in r?r.setUpdatesActive(!1):r.setBackupsActive(!1),delete window.showToast}),[r,t]),(0,S.jsxs)(S.Fragment,{children:[e===`updates`&&(0,S.jsx)(Rm,{title:`Updates`,description:`Explore what’s new in Dispatch.`,children:(0,S.jsx)(Gm,{onClick:()=>void o()})}),i&&(0,S.jsx)(Vm,{error:i.error,children:i.text}),(0,S.jsx)(`div`,{id:e===`updates`?`platform-updates-content`:`platform-backups-content`,className:e===`updates`?`updates-workspace`:`backup-workspace`})]})}var sh={release_changed:`A newer release is available. Review it and try again.`,release_dev_required:`Install the latest release on Dev before starting rollout.`,release_dsp_not_ready:`This DSP needs to be running and finish setup before it can be updated.`,release_health_failed:`Health checks failed. The previous version was restored.`,release_recovery_required:`The update needs recovery before another update can start.`,release_interrupted:`The update worker restarted. Review the state before continuing.`,release_baseline_required:`The installed version must be registered before updates can begin.`,release_fleet_changed:`The DSP list changed. Review it and start rollout again.`,release_verification_failed:`The release could not be verified. Check the worker’s GitHub connection and retry.`};function ch({hash:e}){let[t,n]=(0,x.useState)(`core`),[r,i]=(0,x.useState)(null),[a,o]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null),l=Mt({queryKey:[`independent-updates`,r],queryFn:()=>nn(`/api/platform/updates${r?`?releaseId=${encodeURIComponent(r)}`:``}`),refetchInterval:3e3}),u=l.data,d=(0,x.useRef)(void 0),f=u?.tracks?.core.installedDigest;if((0,x.useEffect)(()=>{if(u?.mode!==`independent`)return;let e=d.current;d.current=f,e!==void 0&&f&&e!==f&&window.location.reload()},[u?.mode,f]),u&&u.mode!==`independent`)return(0,S.jsx)(oh,{page:`updates`,hash:e});async function p(e,n=null){if(!a){o(!0),c(null);try{await cn(`updates:${e}:${t}:${n}`,`/api/platform/updates`,{action:e,product:t,digest:n}),await Yt.invalidateQueries({queryKey:[`independent-updates`]})}catch(e){c(e)}finally{o(!1)}}}let m=u?.jobs.find(e=>[`queued`,`running`].includes(e.status)),h=u?.jobs[0]?.status===`failed`?u.jobs[0].failure:null,g=m?.action===`update_core`||u?.operation?.product===`core`;return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Rm,{title:`Updates`,description:`Choose when Core and your DSPs receive new releases.`,children:(0,S.jsxs)($,{variant:`outline`,disabled:a||u?.busy||!u?.worker.available,onClick:()=>void p(`refresh`),children:[(0,S.jsx)(Vn,{"aria-hidden":`true`}),`Check for updates`]})}),(0,S.jsx)(Hm,{error:s||(g?null:l.error)}),g&&(0,S.jsx)(Vm,{children:`Core is updating. This page will reconnect when it’s ready.`}),l.isPending?(0,S.jsx)(Um,{}):u?(0,S.jsxs)(`div`,{className:`space-y-5`,id:`platform-updates-content`,children:[!u.enabled&&(0,S.jsx)(Vm,{children:`Updates need initial setup. Your current services will continue running.`}),u.enabled&&!u.worker.available&&(0,S.jsx)(Vm,{error:!0,children:`The update worker is offline. Releases remain available to read.`}),h&&(0,S.jsx)(Vm,{error:!0,children:sh[h]||`The update could not finish. Review the current state, then retry or recover.`}),u.operation&&!g&&(0,S.jsxs)(Vm,{children:[u.operation.dspName||`Dev DSP`,` is updating. Private data is being preserved.`]}),u.recoveryRequired&&!m&&(0,S.jsxs)(`div`,{className:`rounded-xl border bg-card p-5 space-y-3`,children:[(0,S.jsx)(`p`,{children:`Recover the interrupted update before installing another release.`}),(0,S.jsx)($,{disabled:a||!u.worker.available,onClick:()=>void p(`recover`),children:`Recover update`})]}),(0,S.jsxs)(Fp,{value:t,onValueChange:e=>{n(e),i(null),c(null)},children:[(0,S.jsxs)(Lp,{"aria-label":`Update products`,children:[(0,S.jsxs)(Rp,{value:`core`,children:[(0,S.jsx)(Un,{"aria-hidden":`true`}),`Core`]}),(0,S.jsxs)(Rp,{value:`dsp`,children:[(0,S.jsx)(jn,{"aria-hidden":`true`}),`DSPs`]})]}),[`core`,`dsp`].map(e=>{let t=u.tracks[e],n=t.release,r=!!(n&&n.digest===t.latest),o=u.rollout&&u.rollout.status!==`completed`,s=e===`core`?`update_core`:t.tested?`rollout`:`update_dev`,c=e===`core`?`Update Core`:t.tested?`Rollout Update`:`Update Dev`;return(0,S.jsxs)(zp,{value:e,className:`space-y-5 pt-3`,children:[(0,S.jsxs)(`section`,{className:`rounded-xl border bg-card p-6 space-y-5`,"aria-label":`${e===`core`?`Core`:`DSP`} release`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-between items-start gap-4`,children:[(0,S.jsxs)(`div`,{className:`space-y-1`,children:[(0,S.jsx)(`h2`,{className:`text-xl font-semibold`,children:e===`core`?`Dispatch Core`:`DSP runtime and plugins`}),(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[e===`core`?`Installed`:`Installed on ${u.dev.name}`,`: `,t.installedVersion||`Not registered`]})]}),(0,S.jsxs)($,{disabled:a||!t.canUpdate||!r||e===`dsp`&&(!u.dev.available||!!o),onClick:()=>void p(s,t.latest),children:[(0,S.jsx)(Dn,{"aria-hidden":`true`}),c]})]}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e===`core`?`Updates the shared dashboard, API and Core services. Installed DSP runtimes and plugins keep their current versions.`:t.tested?`Dev has passed installation checks. Test the changes, then roll this version out to your DSPs one at a time.`:`Install this version on the permanent Dev DSP first. Your other DSPs receive it when you start rollout.`}),(0,S.jsxs)(`div`,{className:`border-t pt-5 space-y-4`,children:[t.history.length>0&&(0,S.jsxs)(`label`,{className:`flex flex-wrap items-center gap-3 text-sm font-medium`,children:[`Release history`,(0,S.jsx)(`select`,{"aria-label":`${e===`core`?`Core`:`DSP`} release history`,value:n?.id||``,onChange:e=>i(e.target.value),className:`rounded-md border bg-background px-3 py-2 max-w-full`,children:t.history.map(e=>(0,S.jsxs)(`option`,{value:e.id,children:[`Version `,e.version]},e.id))})]}),n?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-between gap-3 items-baseline`,children:[(0,S.jsxs)(`h3`,{className:`text-lg font-semibold`,children:[`Version `,n.version]}),n.url&&(0,S.jsx)(`a`,{className:`text-sm underline underline-offset-4`,href:n.url,target:`_blank`,rel:`noreferrer`,children:`View release on GitHub`})]}),(0,S.jsx)(`div`,{className:`whitespace-pre-wrap break-words text-sm leading-7`,"aria-label":`Changelog`,children:n.notes}),!r&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`You’re reading a previous release. Select the latest version to update.`})]}):(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No verified releases yet.`})]})]}),e===`dsp`&&u.rollout&&(0,S.jsxs)(`section`,{className:`rounded-xl border bg-card p-6 space-y-4`,"aria-label":`Rollout progress`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-between gap-3 items-center`,children:[(0,S.jsxs)(`h2`,{className:`text-lg font-semibold`,children:[`Rollout · `,u.rollout.version]}),u.rollout.status===`running`&&(0,S.jsxs)($,{variant:`outline`,disabled:a||!u.worker.available,onClick:()=>void p(`pause`),children:[(0,S.jsx)(In,{"aria-hidden":`true`}),`Pause rollout`]}),u.rollout.status===`paused`&&(0,S.jsxs)($,{disabled:a||u.recoveryRequired||!u.worker.available||!!m,onClick:()=>void p(`resume`),children:[(0,S.jsx)(Ln,{"aria-hidden":`true`}),`Resume rollout`]})]}),(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[u.rollout.updated,` of `,u.rollout.total,` DSPs updated · `,u.rollout.status]}),u.rollout.status===`paused`&&(0,S.jsx)(Vm,{children:`The rollout is paused. Resolve the affected DSP before resuming this version.`}),(0,S.jsx)(`progress`,{"aria-label":`DSPs updated`,value:u.rollout.updated,max:Math.max(1,u.rollout.total),className:`w-full accent-primary`}),(0,S.jsx)(`ul`,{className:`divide-y`,children:u.rollout.members.map((e,t)=>(0,S.jsxs)(`li`,{className:`flex justify-between gap-4 py-3 text-sm`,children:[(0,S.jsx)(`span`,{children:e.name}),(0,S.jsx)(`span`,{className:`text-muted-foreground`,children:e.status})]},t))})]})]},e)})]})]}):null]})}function lh(){return(0,S.jsxs)(`span`,{className:`brand`,children:[(0,S.jsx)(`svg`,{viewBox:`0 0 28 28`,"aria-hidden":`true`,children:(0,S.jsx)(`path`,{fill:`currentColor`,d:`M3 3h9C20 3 25 7.5 25 14s-5 11-13 11H3v-7h6v2h3c4.5 0 7-2.2 7-6s-2.5-6-7-6H9v6H3V3Z`})}),(0,S.jsx)(`span`,{children:`Dispatch`})]})}var uh=null;function dh(){return window.turnstile?Promise.resolve(window.turnstile):uh||(uh=new Promise((e,t)=>{let n=document.createElement(`script`);n.src=`https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit`,n.async=!0;let r=()=>{clearTimeout(i),n.onload=null,n.onerror=null,n.remove(),t(Error(`turnstile_unavailable`))},i=window.setTimeout(r,15e3);n.onerror=r,n.onload=()=>{if(!window.turnstile)return r();clearTimeout(i),n.onload=null,n.onerror=null,e(window.turnstile)},document.head.appendChild(n)}).catch(e=>{throw uh=null,e}),uh)}function fh({siteKey:e,action:t,onToken:n,busy:r}){let i=(0,x.useRef)(null),[a,o]=(0,x.useState)(0),[s,c]=(0,x.useState)(`checking`);return(0,x.useEffect)(()=>{let r=!1,a,o;n(``),c(`checking`);let s=e=>{r||(n(``),c(e))};return dh().then(l=>{!r&&i.current&&(a=l,o=a.render(i.current,{sitekey:e,action:t,size:`flexible`,"response-field":!1,callback:e=>{r||(n(e),c(`ready`))},"error-callback":()=>s(`error`),"expired-callback":()=>s(`expired`),"timeout-callback":()=>s(`expired`),"unsupported-callback":()=>s(`error`)}))}).catch(()=>s(`error`)),()=>{r=!0,o!==void 0&&a?.remove(o)}},[e,t,a,n]),(0,S.jsxs)(`div`,{className:`min-w-0 space-y-2`,"aria-label":`Security verification`,children:[(0,S.jsx)(`div`,{ref:i}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,role:`status`,"aria-live":`polite`,children:s===`checking`?`Checking your browser…`:s===`ready`?`Security check complete.`:s===`expired`?`Security check expired. Please verify again.`:`Security check could not load. Check your connection and try again.`}),(s===`error`||s===`expired`)&&(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:r,onClick:()=>o(e=>e+1),children:`Retry security check`})]})}function ph({hash:e,session:t,refresh:n}){let r=e===`#/forgot-password`,[i,a]=(0,x.useState)(()=>/^#\/reset-password\/([A-Za-z0-9_-]{43})$/.exec(e)?.[1]||``),[o,s]=(0,x.useState)(!1),[c,l]=(0,x.useState)(null),[u,d]=(0,x.useState)(``),[f,p]=(0,x.useState)(``),[m,h]=(0,x.useState)(0),g=r?t?.turnstile?.siteKey:null;(0,x.useEffect)(()=>{r||history.replaceState(null,``,`${location.pathname}#/reset-password`)},[r]);async function _(e){if(e.preventDefault(),o||g&&!f)return;let t=e.currentTarget,c=new FormData(t);s(!0),l(null);try{let e=await fetch(r?`/api/auth/forgot-password`:`/api/auth/reset-password`,{method:`POST`,credentials:`omit`,cache:`no-store`,referrerPolicy:`no-referrer`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({...Object.fromEntries(c),...r?g?{turnstileToken:f}:{}:{token:i}})}),o=await e.json().catch(()=>null);if(!e.ok||!o?.ok)throw new Jt(o?.error?.code||`request_failed`,e.status);t.reset(),d(o.data.message),r||(a(``),n().catch(()=>{}))}catch(e){l(e)}finally{s(!1),p(``),h(e=>e+1)}}return(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(lh,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[(0,S.jsx)(`h1`,{children:u?r?`Check your email`:`Password reset`:r?`Forgot your password?`:`Set a new password`}),(0,S.jsx)(`p`,{className:`auth-description`,children:r?`Enter your Dispatch account email and we’ll send you a reset link.`:`Choose a password you haven’t used elsewhere.`}),(0,S.jsx)(Hm,{error:c}),u?(0,S.jsx)(Vm,{children:u}):!r&&!i?(0,S.jsx)(Vm,{children:`This reset link is invalid or has expired. Request a new link to continue.`}):(0,S.jsx)(`form`,{onSubmit:_,children:(0,S.jsxs)(tm,{children:[r?(0,S.jsx)(Bm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`username`,required:!0,maxLength:254,disabled:o}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Bm,{label:`New password`,name:`newPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:o,description:`Use 12–128 characters.`}),(0,S.jsx)(Bm,{label:`Confirm new password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:o})]}),g&&(0,S.jsx)(fh,{siteKey:g,action:`forgot_password`,onToken:p,busy:o},m),(0,S.jsx)(qm,{busy:o,disabled:o||!(!g||f),children:r?`Send reset link`:`Reset password`})]})}),(0,S.jsxs)(`div`,{className:`mt-6 flex flex-wrap gap-4 text-sm text-primary`,children:[(0,S.jsx)(`a`,{className:`underline-offset-4 hover:underline`,href:`#/login`,children:`Back to sign in`}),!r&&(0,S.jsx)(`a`,{className:`underline-offset-4 hover:underline`,href:`#/forgot-password`,children:`Request a new link`})]})]}),(0,S.jsx)(`p`,{className:`auth-footnote`,children:r?`Reset links expire after 30 minutes.`:`Resetting your password signs out your existing sessions.`})]})}function mh({navigation:e,mobileNavigation:t,banner:n,header:r,children:i}){return(0,S.jsxs)(`div`,{className:`application`,children:[(0,S.jsx)(`aside`,{className:`desktop-sidebar`,children:e}),t,(0,S.jsxs)(`div`,{className:`main-area`,children:[n,(0,S.jsx)(`header`,{className:`topbar`,children:r}),(0,S.jsx)(`main`,{id:`main-content`,className:`page-container`,tabIndex:-1,children:i})]})]})}var hh=(0,x.createContext)(null);function gh(){let e=(0,x.useContext)(hh);if(!e)throw Error(`Session required`);return e}var _h=Qn(`inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3`,{variants:{variant:{default:`bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90`,outline:`border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,ghost:`[a&]:hover:bg-accent [a&]:hover:text-accent-foreground`,link:`text-primary underline-offset-4 [a&]:hover:underline`}},defaultVariants:{variant:`default`}});function vh({className:e,variant:t=`default`,asChild:n=!1,...r}){let i=n?Ai:`span`;return(0,S.jsx)(i,{"data-slot":`badge`,"data-variant":t,className:H(_h({variant:t}),e),...r})}function yh({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`table-container`,className:`relative w-full overflow-x-auto`,children:(0,S.jsx)(`table`,{"data-slot":`table`,className:H(`w-full caption-bottom text-sm`,e),...t})})}function bh({className:e,...t}){return(0,S.jsx)(`thead`,{"data-slot":`table-header`,className:H(`[&_tr]:border-b`,e),...t})}function xh({className:e,...t}){return(0,S.jsx)(`tbody`,{"data-slot":`table-body`,className:H(`[&_tr:last-child]:border-0`,e),...t})}function Sh({className:e,...t}){return(0,S.jsx)(`tr`,{"data-slot":`table-row`,className:H(`border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted`,e),...t})}function Ch({className:e,...t}){return(0,S.jsx)(`th`,{"data-slot":`table-head`,className:H(`h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t})}function wh({className:e,...t}){return(0,S.jsx)(`td`,{"data-slot":`table-cell`,className:H(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t})}var Th=o(((e,t)=>{var n=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function r(e,t){return!e||n(t[e.field],e.equals)}function i(e,t){return(e.rules||[]).filter(e=>{if(!r(e.when,t))return!1;if(e.kind===`included`){let n=t[e.selection],r=t[e.field];return r!==null&&n!==null&&!n.includes(r)}return!r(e.require,t)}).map(e=>({id:e.id,field:e.field||e.require.field,severity:e.severity,message:e.message}))}function a(e,t,n={}){if(t===void 0)return`Not recorded`;if(t===null)return`All current and future options`;if(typeof t==`boolean`)return t?`On`:`Off`;let r=e.options||n[e.optionsSource]||[],i=e=>r.find(t=>t.value===e)?.label||String(e);return Array.isArray(t)?t.length?t.map(i).join(`, `):`None`:i(t)}function o(e,t,r,i={}){let a=r.find(t=>t.id===e.field);if(e.kind===`choice`)return e.examples.find(e=>n(e.value,t[a.id]))?.text||``;if(e.kind===`columns`)return[e.leading,...(t[a.id]||[]).map(e=>(a.options||[]).find(t=>t.value===e)?.label||e)].filter(Boolean).join(` · `);let o=i[a.optionsSource]||[],s=t[a.id],c=s===null?o:o.filter(e=>s.includes(e.value));return`${c.reduce((e,t)=>e+(t.count||0),0)} ${e.unit} from ${c.length} ${e.groupLabel}.`}t.exports={same:n,conditionMatches:r,settingsIssues:i,formatSettingValue:a,settingsPreview:o,EFFECTS:Object.freeze({immediate:`Display changes take effect after saving.`,next_job:`Collection changes apply to new jobs. Running jobs keep their current settings.`,next_connection:`Changes apply to the next connection. An active connection keeps its current settings.`,schedule:`The schedule is updated after saving. Running collections are allowed to finish.`})}}))();function Eh({pluginId:e,scope:t,snapshot:n,busy:r,onRestore:i}){let[a,o]=(0,x.useState)([null]),s=a[a.length-1],{timeZone:c}=rh(),l=Mt({queryKey:[`plugin-settings`,e,t,`history`,n.revision,s],queryFn:({signal:t})=>nn(`/api/organization/plugins/${encodeURIComponent(e)}/settings/history${s===null?``:`?before=${s}`}`,{signal:t})});return(0,S.jsxs)(`section`,{className:`plugin-settings-history`,"aria-label":`Settings change history`,children:[(0,S.jsx)(`h2`,{children:`Change history`}),(0,S.jsx)(`p`,{children:`Restore values into your draft, then review and save. History belongs to this DSP.`}),(0,S.jsx)(Hm,{error:l.error}),l.isPending&&(0,S.jsx)(Um,{}),l.data?.items.map(e=>(0,S.jsxs)(`details`,{"data-revision":e.revision,children:[(0,S.jsxs)(`summary`,{children:[Nm(e.updatedAt,c),` ·`,` `,e.kind===`initial`?`Initial settings`:e.actorName||`Plugin update`,` `,`· Revision `,e.revision]}),e.changes.length?(0,S.jsx)(`ul`,{children:e.changes.map(e=>{let t=n.definition.fields.find(t=>t.id===e.field),r=e=>t?(0,Th.formatSettingValue)(t,e):JSON.stringify(e);return(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.label}),`: `,r(e.before),` →`,` `,r(e.after),e.beforeSource!==e.afterSource&&(0,S.jsxs)(`span`,{children:[` `,`(`,e.afterSource==="default"?`Plugin default`:`DSP override`,`)`]})]},e.field)})}):(0,S.jsx)(`p`,{children:`No values changed.`}),e.canRestore?(0,S.jsxs)(`div`,{className:`plugin-settings-history-actions`,children:[n.definition.sections.map(t=>(0,S.jsxs)($,{variant:`outline`,size:`sm`,disabled:r,onClick:()=>i(e.values,e.sources,n.definition.fields.filter(e=>e.section===t.id).map(e=>e.id)),children:[`Restore `,t.label]},t.id)),(0,S.jsxs)(`details`,{children:[(0,S.jsx)(`summary`,{children:`Restore an individual setting`}),n.definition.fields.map(t=>(0,S.jsxs)($,{variant:`ghost`,size:`sm`,disabled:r,onClick:()=>i(e.values,e.sources,[t.id]),children:[`Restore `,t.label]},t.id))]})]}):(0,S.jsx)(`p`,{children:`This entry predates the current settings definition and cannot be restored directly.`})]},e.revision)),(0,S.jsxs)(`div`,{className:`plugin-settings-history-pagination`,children:[(0,S.jsx)($,{variant:`outline`,disabled:a.length===1||l.isFetching,onClick:()=>o(e=>e.slice(0,-1)),children:`Newer changes`}),(0,S.jsx)($,{variant:`outline`,disabled:l.data?.nextBefore==null||l.isFetching,onClick:()=>o(e=>[...e,l.data.nextBefore]),children:`Older changes`})]})]})}function Dh(e,t=!1){let{session:n}=gh(),r=dn(n),i=`${n.user?.id}:${r?.organizationId}:${n.dspView?.viewRef||`member`}`,a=`${r?.organizationId}:${n.dspView?.viewRef||`member`}`,o=`/api/organization/plugins/${encodeURIComponent(e)}/settings`,s=[`plugin-settings`,e,i],c=w(),l=n.authenticated&&!!r;return{query:Mt({queryKey:s,queryFn:({signal:e})=>nn(o,{signal:e}),enabled:l,refetchInterval:15e3}),options:Mt({queryKey:[...s,`options`],queryFn:({signal:e})=>nn(`${o}/options`,{signal:e}),enabled:l&&t,staleTime:3e4}),update:Wt({mutationFn:({values:t,snapshot:n,sources:r})=>cn(`plugin-settings:${e}:${i}:${n.revision}`,o,{values:t,...r?{sources:r}:{},expectedRevision:n.revision,definitionVersion:n.definitionVersion}),onSuccess:async t=>{c.setQueryData(s,t),await c.invalidateQueries({predicate:t=>t.queryKey[0]!==`plugin-settings`&&String(t.queryKey[0]).startsWith(e+`-`)&&t.queryKey.some(e=>e===i||e===a)})}}),scope:i}}function Oh({field:e,value:t,options:n={},disabled:r=!1,onChange:i}){let a=e.options||e.optionsSource&&n[e.optionsSource]||[],o=`plugin-setting-${(0,x.useId)()}`;if(e.type===`boolean`)return(0,S.jsxs)(`div`,{className:`plugin-setting-toggle`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),e.description&&(0,S.jsx)(`p`,{children:e.description})]}),(0,S.jsx)(`input`,{id:o,type:`checkbox`,role:`switch`,checked:t===!0,disabled:r,onChange:e=>i(e.target.checked)})]});if(e.type===`strings`){let n=t===null?a.map(e=>String(e.value)):t,o=new Map(a.map(e=>[String(e.value),e])),c=[...n,...a.map(e=>String(e.value)).filter(e=>!n.includes(e))];function s(e,t){i(t?[...n,e]:n.filter(t=>t!==e))}return(0,S.jsxs)(`fieldset`,{className:`plugin-setting-multiple`,disabled:r,children:[(0,S.jsx)(`legend`,{children:e.label}),e.description&&(0,S.jsx)(`p`,{children:e.description}),e.nullable&&(0,S.jsxs)(`label`,{className:`plugin-setting-choice`,children:[(0,S.jsx)(`input`,{type:`checkbox`,checked:t===null,onChange:e=>i(e.target.checked?null:[...n])}),`Include all current and future options`]}),(0,S.jsx)(`div`,{className:`plugin-setting-choices`,children:c.map((a,c)=>{let l=o.get(a),u=n.includes(a);return(0,S.jsxs)(`div`,{className:`plugin-setting-option`,children:[(0,S.jsxs)(`label`,{className:`plugin-setting-choice`,children:[(0,S.jsx)(`input`,{type:`checkbox`,checked:u,disabled:t===null,onChange:e=>s(a,e.target.checked)}),(0,S.jsx)(`span`,{children:l?.label||`${a} (not currently available)`}),l?.count!==void 0&&(0,S.jsx)(`span`,{className:`plugin-setting-count`,children:l.count})]}),e.ordered&&u&&(0,S.jsx)(`div`,{className:`plugin-setting-order`,children:[-1,1].map(e=>(0,S.jsx)($,{type:`button`,variant:`ghost`,size:`sm`,"aria-label":`Move ${l?.label||a} ${e<0?`earlier`:`later`}`,disabled:r||c+e<0||c+e>=n.length,onClick:()=>{let t=[...n];[t[c],t[c+e]]=[t[c+e],t[c]],i(t)},children:e<0?`↑`:`↓`},e))})]},a)})}),!c.length&&(0,S.jsx)(`p`,{children:`No options are available yet.`})]})}if(a.length||e.optionsSource){let n=t!==null&&!a.some(e=>String(e.value)===String(t));return(0,S.jsxs)(`div`,{className:`plugin-setting-field`,children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),(0,S.jsxs)(`select`,{id:o,value:t===null?``:String(t),disabled:r,onChange:t=>i(t.target.value===``&&e.nullable?null:e.type===`integer`?Number(t.target.value):t.target.value),children:[e.nullable&&(0,S.jsxs)(`option`,{value:``,children:[`All `,e.optionsSource||`options`]}),n&&(0,S.jsxs)(`option`,{value:String(t),children:[String(t),` (not currently available)`]}),a.map(e=>(0,S.jsx)(`option`,{value:String(e.value),children:e.label},String(e.value)))]}),e.description&&(0,S.jsx)(`p`,{children:e.description})]})}return(0,S.jsxs)(`div`,{className:`plugin-setting-field`,children:[(0,S.jsx)(`label`,{htmlFor:o,children:e.label}),(0,S.jsx)(`input`,{id:o,type:e.type===`integer`?`number`:`text`,value:String(t??``),min:e.minimum,max:e.maximum,maxLength:128,disabled:r,onChange:t=>i(e.type===`integer`?Number(t.target.value):t.target.value)}),e.description&&(0,S.jsx)(`p`,{children:e.description})]})}function kh({pluginId:e,title:t,description:n,backHref:r,renderSection:i}){let{session:a}=gh(),o=Dh(e,!0),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)({}),[h,g]=(0,x.useState)(!1),[_,v]=(0,x.useState)(``),[y,b]=(0,x.useState)([]),C=!!s&&(JSON.stringify(l)!==JSON.stringify(s.values)||JSON.stringify(p)!==JSON.stringify(s.sources));(0,x.useEffect)(()=>{o.query.data&&!C&&(c(o.query.data),u(structuredClone(o.query.data.values)),m({...o.query.data.sources}))},[o.query.data,C]);let w=!!s&&!!o.query.data&&(s.revision!==o.query.data.revision||s.definitionVersion!==o.query.data.definitionVersion);if(!fn(a))return(0,S.jsx)(Vm,{children:`Your DSP owner can manage plugin settings.`});if(o.query.isPending)return(0,S.jsx)(Um,{});if(!s||!l)return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Hm,{error:o.query.error}),(0,S.jsx)($,{onClick:()=>void o.query.refetch(),children:`Retry settings`})]});let T=o.options.data||{},E=o.update.isPending,D=(0,Th.settingsIssues)(s.definition,l),O=D.some(e=>e.severity===`error`);async function ee(){if(s&&l)try{let e=await o.update.mutateAsync({values:l,snapshot:s,sources:p}),t=new Set(s.definition.fields.filter(t=>JSON.stringify(s.values[t.id])!==JSON.stringify(e.values[t.id])).map(e=>e.applies).filter(e=>e!==void 0));b([...t].map(e=>Th.EFFECTS[e])),c(e),u(structuredClone(e.values)),m({...e.sources}),v(``)}catch{}}function k(){let e=o.query.data||s;e&&(c(e),u(structuredClone(e.values)),m({...e.sources}),v(``),b([]),o.update.reset())}function A(e,t,n){u(r=>({...r,...Object.fromEntries(n.map(n=>[n,structuredClone(t[n]==="default"?s.definition.fields.find(e=>e.id===n).default:e[n])]))})),m(e=>({...e,...Object.fromEntries(n.map(e=>[e,t[e]]))})),v(`Restored into your draft. Review your changes before saving.`),o.update.reset()}function j(e){A(Object.fromEntries(s.definition.fields.map(e=>[e.id,e.default])),Object.fromEntries(e.map(e=>[e,`default`])),e)}return(0,S.jsxs)(`div`,{className:`plugin-settings-page`,children:[(0,S.jsx)(`a`,{className:`plugin-settings-back`,href:r,children:`← Back`}),(0,S.jsx)(Rm,{title:t,description:n}),(0,S.jsx)(Hm,{error:o.query.error||o.options.error||o.update.error}),w&&(0,S.jsx)(Vm,{children:`These settings changed in another session. Discard your draft to load the latest settings before saving.`}),_&&(0,S.jsx)(Vm,{children:_}),D.map(e=>(0,S.jsx)(`p`,{className:`plugin-settings-rule`,role:e.severity===`error`?`alert`:`status`,children:e.message},e.id)),(0,S.jsxs)(Fp,{defaultValue:s.definition.sections[0].id,children:[(0,S.jsx)(Lp,{variant:`line`,"aria-label":`${t} sections`,children:s.definition.sections.map(e=>(0,S.jsx)(Rp,{value:e.id,children:e.label},e.id))}),s.definition.sections.map(e=>(0,S.jsxs)(zp,{value:e.id,children:[e.description&&(0,S.jsx)(`p`,{className:`plugin-settings-description`,children:e.description}),(0,S.jsx)(`div`,{className:`plugin-settings-fields`,children:s.definition.fields.filter(t=>t.section===e.id&&(0,Th.conditionMatches)(t.visibleWhen,l)).map(e=>(0,S.jsxs)(`div`,{className:e.type===`boolean`||e.type===`strings`?`plugin-setting-wide`:``,children:[(0,S.jsx)(Oh,{field:e,value:l[e.id],options:T,disabled:E||!(0,Th.conditionMatches)(e.enabledWhen,l)||!!e.optionsSource&&o.options.isPending,onChange:t=>{u(n=>({...n,[e.id]:t})),m(t=>({...t,[e.id]:`override`})),v(``),o.update.reset()}}),!(0,Th.conditionMatches)(e.enabledWhen,l)&&e.disabledReason&&(0,S.jsx)(`p`,{className:`plugin-setting-help`,children:e.disabledReason}),(0,S.jsxs)(`div`,{className:`plugin-setting-source`,children:[(0,S.jsx)(`span`,{children:p[e.id]==="default"?`Plugin default`:`DSP override`}),(0,S.jsx)($,{type:`button`,variant:`ghost`,size:`sm`,disabled:E,"aria-label":p[e.id]==="default"?`Keep current value for ${e.label}`:`Use plugin default for ${e.label}`,onClick:()=>p[e.id]==="default"?m(t=>({...t,[e.id]:`override`})):j([e.id]),children:p[e.id]==="default"?`Keep this value`:`Use plugin default`})]}),(0,S.jsxs)(`p`,{className:`plugin-setting-help`,children:[`Default:`,` `,(0,Th.formatSettingValue)(e,e.default,T)]})]},e.id))}),(s.definition.previews||[]).filter(t=>t.section===e.id).map(e=>(0,S.jsxs)(`p`,{role:`status`,className:`plugin-settings-preview`,children:[e.label,`:`,` `,(0,Th.settingsPreview)(e,l,s.definition.fields,T)]},e.id)),i?.(e.id,l,T),(0,S.jsxs)($,{type:`button`,variant:`outline`,size:`sm`,disabled:E,onClick:()=>j(s.definition.fields.filter(t=>t.section===e.id).map(e=>e.id)),children:[`Restore `,e.label,` defaults`]})]},e.id))]}),(0,S.jsxs)(`div`,{className:`plugin-settings-defaults`,children:[(0,S.jsx)($,{type:`button`,variant:`ghost`,disabled:E,onClick:()=>f(!0),children:`Restore defaults`}),(0,S.jsx)($,{variant:`ghost`,type:`button`,onClick:()=>g(e=>!e),"aria-expanded":h,children:`Change history`}),(0,S.jsx)(`span`,{children:`Settings apply to this DSP.`})]}),h&&(0,S.jsx)(Eh,{pluginId:e,scope:o.scope,snapshot:s,busy:E||w,onRestore:A},o.scope),!C&&y.map(e=>(0,S.jsx)(`p`,{className:`plugin-settings-effect`,role:`status`,children:e},e)),(0,S.jsxs)(`footer`,{className:`plugin-settings-footer`,children:[(0,S.jsx)(`span`,{role:`status`,children:C?`You have unsaved changes`:s.appliedRevision===s.revision?o.update.isSuccess?`Settings saved`:`All changes saved`:`Saved. Applying settings…`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)($,{variant:`outline`,disabled:!C||E,onClick:k,children:`Discard`}),(0,S.jsx)($,{disabled:!C||E||w||O,onClick:()=>void ee(),children:E?`Saving…`:`Save changes`})]})]}),(0,S.jsx)(mm,{open:d,onOpenChange:f,children:(0,S.jsxs)(_m,{children:[(0,S.jsxs)(vm,{children:[(0,S.jsx)(bm,{children:`Restore plugin defaults?`}),(0,S.jsx)(xm,{children:`Your connection and collected records are preserved. Review the defaults before saving.`})]}),(0,S.jsxs)(ym,{children:[(0,S.jsx)($,{variant:`outline`,onClick:()=>f(!1),children:`Cancel`}),(0,S.jsx)($,{onClick:()=>{j(s.definition.fields.map(e=>e.id)),f(!1)},children:`Restore defaults`})]})]})})]})}function Ah(e){let{session:t}=gh(),n=`${e.pluginId}:${t.user?.id}:${dn(t)?.organizationId}:${t.dspView?.viewRef||`member`}`;return(0,S.jsx)(kh,{...e},n)}async function jh(e,t,n,r){if(!/^[a-z][a-z0-9-]{0,63}$/.test(e)||!/^[a-z][a-z0-9_.]{0,63}$/.test(t))throw Error(`Invalid plugin operation`);return{ok:!0,data:await rn(`/api/plugins/${e}/${t}`,`POST`,n,r)}}var Mh=s({ApiError:()=>Jt,Badge:()=>vh,Button:()=>$,EmptyState:()=>Wm,ErrorNotice:()=>Hm,Loading:()=>Um,Notice:()=>Vm,PageHeading:()=>Rm,PluginSettingsField:()=>Oh,PluginSettingsForm:()=>Ah,Table:()=>yh,TableBody:()=>xh,TableCell:()=>wh,TableHead:()=>Ch,TableHeader:()=>bh,TableRow:()=>Sh,Tabs:()=>Fp,TabsContent:()=>zp,TabsList:()=>Lp,TabsTrigger:()=>Rp,TextField:()=>Bm,activeMembership:()=>dn,calendarDateLabel:()=>Lm,dateTime:()=>Nm,has:()=>ln,idempotent:()=>cn,invokePluginOperation:()=>jh,isDspOwner:()=>fn,moveCalendarDate:()=>Im,mutation:()=>rn,request:()=>nn,useBusinessToday:()=>ih,usePluginSettings:()=>Dh,useSession:()=>gh,useTimezone:()=>rh}),Nh=new Map,Ph=(e,t)=>Nh.get(`${e}@${t}`);Object.defineProperty(globalThis,"DispatchPluginHost",{value:Object.freeze({react:x,jsx:S,query:qt,ui:Mh,register(e){if(e.apiVersion!==1||!/^[a-z][a-z0-9-]{0,63}$/.test(e.id)||!/^\d+\.\d+\.\d+$/.test(e.version)||!e.pages||Object.values(e.pages).some(e=>typeof e!=`function`))throw Error(`Plugin interface unavailable`);if(Nh.size>=64)throw Error(`Plugin limit reached`);Nh.set(`${e.id}@${e.version}`,Object.freeze(e))}}),writable:!1,configurable:!1});var Fh=new Map,Ih=new Map;window.addEventListener(`dispatch-authority-changed`,()=>{Fh.clear(),Ih.clear()});async function Lh(e,t,n){let r=await nn(`/api/plugin-assets/${e}/${n}`);if(r.id!==e||r.version!==t||r.revision!==n||typeof r.javascript!=`string`||r.javascript.length>2097152||typeof r.stylesheet!=`string`||r.stylesheet.length>1048576)throw new Jt(`plugin_unavailable`);let i=document.querySelector(`meta[name=dispatch-style-nonce]`)?.content;if(!i)throw new Jt(`plugin_unavailable`);let a=document.createElement(`script`);if(a.nonce=i,a.textContent=r.javascript,document.head.append(a),a.remove(),!Ph(e,t))throw new Jt(`plugin_unavailable`);let o=document.createElement(`style`);o.nonce=i,o.textContent=r.stylesheet,o.dataset.dispatchPlugin=`${e}@${t}`,document.head.append(o)}function Rh(e,t,n,r){let i=`${e}@${t}:${n}`,a=`${i}/${r}`,o=Fh.get(a);return o||(o=(0,x.lazy)(async()=>{if(!Ph(e,t)){let r=Ih.get(i);r||(r=Lh(e,t,n).catch(e=>{throw Ih.delete(i),e}),Ih.set(i,r)),await r}let a=Ph(e,t)?.pages[r];if(!a)throw new Jt(`plugin_unavailable`);return{default:a}}),Fh.size>=128&&Fh.delete(Fh.keys().next().value),Fh.set(a,o)),o}var zh=class extends x.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}render(){return this.state.error?(0,S.jsx)(Hm,{error:this.state.error}):(0,S.jsx)(x.Suspense,{fallback:(0,S.jsx)(Um,{}),children:this.props.children})}},Bh=[{title:`New`,kinds:[`added`]},{title:`Improved`,kinds:[`improved`,`changed`]},{title:`Fixed`,kinds:[`fixed`]},{title:`Removed`,kinds:[`removed`]}];function Vh(){let{session:e}=gh(),{timeZone:t}=rh(),[n,r]=(0,x.useState)(null),[i,a]=(0,x.useState)(!1),[o,s]=(0,x.useState)(!1),c=(0,x.useRef)(!1),l=(0,x.useRef)(null);(0,x.useEffect)(()=>{let e=!1;return nn(`/api/updates/popup`).then(t=>{e||r(t.release)}).catch(()=>{}),()=>{e=!0}},[]);async function u(){if(n&&!c.current){c.current=!0,a(!0),s(!1);try{await rn(`/api/updates/popup`,`POST`,{releaseId:n.releaseId}),r(null)}catch{s(!0)}finally{c.current=!1,a(!1)}}}return(0,x.useEffect)(()=>{if(!n)return;let e=()=>{nn(`/api/updates/popup`).then(e=>{e.release||r(null)}).catch(()=>{})};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[n]),!n||e.dspView?null:(0,S.jsx)(mm,{open:!0,onOpenChange:e=>{e||u()},children:(0,S.jsxs)(_m,{className:`release-popup`,showCloseButton:!1,onInteractOutside:e=>e.preventDefault(),onOpenAutoFocus:e=>{e.preventDefault(),l.current?.focus()},onCloseAutoFocus:e=>{e.preventDefault(),document.getElementById(`main-content`)?.focus()},children:[(0,S.jsxs)(`header`,{className:`release-popup-header`,children:[(0,S.jsx)(`p`,{className:`release-popup-eyebrow`,children:`What’s new`}),(0,S.jsxs)(bm,{ref:l,tabIndex:-1,className:`release-popup-title`,children:[`Dispatch `,n.version]}),(0,S.jsxs)(xm,{children:[(0,S.jsx)(`time`,{dateTime:n.publishedAt,children:new Date(n.publishedAt).toLocaleDateString(void 0,{month:`long`,day:`numeric`,year:`numeric`,timeZone:t})}),(0,S.jsx)(`span`,{className:`release-popup-intro`,children:`Here’s what changed in the latest release.`})]}),(0,S.jsx)($,{variant:`ghost`,size:`icon`,className:`release-popup-close`,"aria-label":`Close update`,disabled:i,onClick:()=>void u(),children:(0,S.jsx)(qn,{"aria-hidden":`true`})})]}),(0,S.jsxs)(`div`,{className:`release-popup-body`,children:[Bh.map(e=>{let t=n.changelog.filter(t=>e.kinds.includes(t.kind));return t.length?(0,S.jsxs)(`section`,{"aria-label":e.title,children:[(0,S.jsx)(`h3`,{children:e.title}),(0,S.jsx)(`ul`,{children:t.map((e,t)=>(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.title}),e.description&&(0,S.jsx)(`p`,{children:e.description})]},t))})]},e.title):null}),n.afterUpdating.length>0&&(0,S.jsxs)(`section`,{"aria-label":`After updating`,children:[(0,S.jsx)(`h3`,{children:`After updating`}),(0,S.jsx)(`ul`,{children:n.afterUpdating.map((e,t)=>(0,S.jsxs)(`li`,{children:[(0,S.jsx)(`strong`,{children:e.title}),(0,S.jsx)(`p`,{children:e.description})]},t))})]})]}),(0,S.jsxs)(`footer`,{className:`release-popup-footer`,children:[o&&(0,S.jsx)(`p`,{role:`alert`,children:`We couldn’t save your dismissal. Please try again.`}),(0,S.jsx)($,{disabled:i,onClick:()=>void u(),children:i?`Saving…`:o?`Try again`:`Got it`})]})]})})}function Hh({...e}){return(0,S.jsx)(ap,{"data-slot":`dropdown-menu`,...e})}function Uh({...e}){return(0,S.jsx)(op,{"data-slot":`dropdown-menu-trigger`,...e})}function Wh({className:e,sideOffset:t=4,...n}){return(0,S.jsx)(sp,{children:(0,S.jsx)(cp,{"data-slot":`dropdown-menu-content`,sideOffset:t,className:H(`z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,e),...n})})}function Gh({...e}){return(0,S.jsx)(lp,{"data-slot":`dropdown-menu-group`,...e})}function Kh({className:e,inset:t,variant:n=`default`,...r}){return(0,S.jsx)(up,{"data-slot":`dropdown-menu-item`,"data-inset":t,"data-variant":n,className:H(`relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!`,e),...r})}function qh({name:e}){let{initials:t,className:n}=Qm(e);return(0,S.jsx)(`span`,{"aria-hidden":`true`,className:n,children:t})}function Jh(e){let t=$p().themePack.components?.DspAvatar||qh;return(0,S.jsx)(t,{...e})}var Yh=e=>e.installation.operation?.kind===`destroy`,Xh=e=>Yh(e)||e.installation.operation?.kind===`restore_dsp`||[`decommissioning`,`decommissioned`].includes(e.installation.state)||e.installation.operation?.kind===`decommission`,Zh=e=>!Xh(e)&&!Yh(e)&&e.organizationStatus===`active`&&e.installation.state===`ready`,Qh=e=>!Xh(e)&&!Yh(e)&&!Zh(e)&&e.organizationStatus!==`suspended`,$h={ready:`Running`,pending:`Queued`,provisioning:`Creating`,waiting_for_owner:`Prepared`,waiting_for_provider_auth:`Prepared`,verifying:`Verifying`,failed:`Needs attention`,suspended:`Suspended`,decommissioning:`Removing`,decommissioned:`Removed`},eg={provision:`Start provisioning`,retry_provision:`Retry provisioning`,decommission:`Remove DSP`,destroy:`Permanently delete DSP`,restore_dsp:`Restore DSP`,suspend:`Suspend DSP`,resume:`Resume DSP`,restart:`Restart runtime`,revoke_owner_invitation:`Revoke invitation`,issue_owner_invitation:`Invite owner`},tg=e=>e.detailsStatus===`required`?e.ownerEmail||`New DSP`:e.name;function ng(e){return Yh(e)||Xh(e)?`Closed`:e.ownerStatus===`pending`?`Invitation pending`:e.ownerStatus===`missing`?`Invite needed`:e.detailsStatus===`complete`?[`ready`,`suspended`].includes(e.installation.state)?`Complete`:`Finishing setup`:`DSP details needed`}function rg(e){return Yh(e)?e.installation.operation?.status===`failed`?`Deletion failed`:`Deleting`:e.installation.operation?.kind===`restore_dsp`?e.installation.operation.status===`failed`?`Restore failed`:`Restoring`:$h[e.installation.state]||`Unavailable`}function ig(){let{refresh:e}=gh(),t=Mt({queryKey:[`fleet`],queryFn:({signal:e})=>nn(`/api/platform/organizations`,{signal:e}),refetchInterval:5e3}),[n,r]=(0,x.useState)(``),[i,a]=(0,x.useState)(`all`),[o,s]=(0,x.useState)(!1),[c,l]=(0,x.useState)(null),[u,d]=(0,x.useState)(null),[f,p]=(0,x.useState)(null),[m,h]=(0,x.useState)(null),[g,_]=(0,x.useState)(!1),[v,y]=(0,x.useState)(null),[b,C]=(0,x.useState)(``),w=t.data||[],T=w.filter(e=>(i===`removed`?Xh(e):i===`running`?Zh(e):i===`onboarding`?Qh(e):!Xh(e))&&`${e.name} ${e.abbreviation||``} ${e.ownerEmail||``} ${e.stations.map(e=>e.code).join(` `)}`.toLowerCase().includes(n.trim().toLowerCase())),E=t.error?void 0:w.find(e=>e.continuityRef===c),D=e=>!Xh(e)&&!Yh(e)&&e.organizationStatus!==`suspended`;async function O(t){_(!0),y(null);try{let n=await rn(`/api/platform/organization/view`,`POST`,{controlRef:t.controlRef});$t(n.dspView.viewRef),await e(n),location.hash=n.memberships[0].organization.status===`active`?`#/dashboard`:`#/team`}catch(e){y(e)}finally{_(!1)}}async function ee(e){e.preventDefault(),_(!0),y(null);let n=new FormData(e.currentTarget).get(`ownerEmail`);try{let e=await cn(f?`${f.continuityRef}:invite`:`organization:create`,f?`/api/platform/organization/owner-invitation`:`/api/platform/organizations`,{ownerEmail:n,...f?{controlRef:f.controlRef}:{}});h(e),s(!1),p(null),await t.refetch()}catch(e){y(e)}finally{_(!1)}}async function k(e){if(!u)return;let{org:n,kind:r}=u,i=w.find(e=>e.continuityRef===n.continuityRef);if(!i)throw Error(`DSP unavailable`);let a=`${n.continuityRef}:${r}`;try{r===`revoke_owner_invitation`?await cn(a,`/api/platform/organization/owner-invitation/revoke`,{controlRef:i.controlRef}):await cn(a,`/api/platform/installation/${{provision:`provision`,retry_provision:`retry`,decommission:`remove`,destroy:`delete`,restore_dsp:`restore`,suspend:`suspend`,resume:`resume`,restart:`restart`}[r]}`,{controlRef:i.controlRef,expectedRevision:i.installation.revision,...r===`destroy`?{password:e}:{}}),C(`${n.name}: request accepted.`)}finally{await t.refetch()}}function A(e){return[...e.installation.availableActions,...e.availableActions].filter(e=>eg[e]&&(![`destroy`,`restore_dsp`].includes(e)||i===`removed`))}function j(e,t){l(null),y(null),t===`issue_owner_invitation`?p(e):d({org:e,kind:t})}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Rm,{title:`DSPs`,description:`Manage your DSPs and onboarding.`,children:(0,S.jsxs)($,{onClick:()=>{s(!0),y(null)},children:[(0,S.jsx)(zn,{"data-icon":`inline-start`}),`Create new DSP`]})}),(0,S.jsxs)(`div`,{className:`inline-summary`,"aria-label":`DSP summary`,children:[(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(e=>!Xh(e)).length}),` `,`DSPs`]}),(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(Zh).length}),` running`]}),(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`strong`,{children:w.filter(Qh).length}),` onboarding`]})]}),(0,S.jsx)(Zm,{result:m}),b&&(0,S.jsx)(Vm,{children:b}),(0,S.jsx)(Fp,{value:i,onValueChange:a,children:(0,S.jsx)(Lp,{variant:`line`,className:`page-tabs`,children:[[`all`,`All DSPs`],[`running`,`Running`],[`onboarding`,`Onboarding`],[`removed`,`Removed`]].map(([e,t])=>(0,S.jsx)(Rp,{value:e,children:t},e))})}),(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(Km,{value:n,onChange:r,placeholder:`Search DSPs or owner email`}),(0,S.jsx)(Gm,{onClick:()=>void t.refetch(),busy:t.isFetching})]}),(0,S.jsx)(Hm,{error:t.error}),(0,S.jsx)(Hm,{error:v}),t.isPending?(0,S.jsx)(Um,{}):t.error?null:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(yh,{className:`fleet-table`,children:[(0,S.jsx)(bh,{children:(0,S.jsxs)(Sh,{children:[(0,S.jsx)(Ch,{className:`w-[28%]`,children:`DSP`}),(0,S.jsx)(Ch,{children:`Owner`}),(0,S.jsx)(Ch,{children:`Runtime`}),(0,S.jsx)(Ch,{children:`Onboarding`}),(0,S.jsx)(Ch,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(xh,{children:T.map(e=>(0,S.jsxs)(Sh,{"data-state":c===e.continuityRef?`selected`:void 0,children:[(0,S.jsx)(wh,{children:(0,S.jsxs)(`button`,{className:`identity-button`,onClick:()=>l(e.continuityRef),children:[(0,S.jsx)(Jh,{name:tg(e)}),(0,S.jsxs)(`span`,{className:`dsp-identity-copy`,children:[(0,S.jsx)(`strong`,{children:tg(e)}),(0,S.jsx)(`span`,{children:e.detailsStatus===`complete`?e.abbreviation||e.stations.map(e=>e.code).join(`, `):e.detailsStatus===`submitted`?`Applying DSP details`:`Awaiting DSP details`})]})]})}),(0,S.jsx)(wh,{className:`text-muted-foreground`,children:e.ownerEmail||`No owner assigned`}),(0,S.jsx)(wh,{children:(0,S.jsx)(Jm,{value:e.installation.state,children:rg(e)})}),(0,S.jsx)(wh,{children:(0,S.jsx)(Jm,{value:ng(e)===`Complete`?`neutral`:`pending`,children:ng(e)})}),(0,S.jsx)(wh,{className:`text-right`,children:(0,S.jsxs)(Hh,{children:[(0,S.jsx)(Uh,{asChild:!0,children:(0,S.jsx)($,{variant:`ghost`,size:`icon`,"aria-label":`Actions for ${tg(e)}`,children:(0,S.jsx)(kn,{})})}),(0,S.jsx)(Wh,{align:`end`,children:(0,S.jsxs)(Gh,{children:[(0,S.jsxs)(Kh,{disabled:g||!D(e),onSelect:()=>void O(e),children:[(0,S.jsx)(An,{}),` View`]}),A(e).map(t=>(0,S.jsx)(Kh,{disabled:!A(e).includes(t),variant:[`destroy`,`decommission`,`suspend`,`revoke_owner_invitation`].includes(t)?`destructive`:`default`,onSelect:()=>j(e,t),children:eg[t]},t))]})})]})})]},e.continuityRef))})]}),!T.length&&(0,S.jsx)(Wm,{title:n?`No DSPs match your search`:i===`removed`?`No removed DSPs`:`No DSPs here yet`,description:n?`Try another name or email.`:`Create a DSP to invite its owner.`}),(0,S.jsxs)(`p`,{className:`table-count`,children:[T.length,` DSP`,T.length===1?``:`s`]})]}),(0,S.jsx)(Ym,{open:o||!!f,onClose:()=>{s(!1),p(null)},title:f?`Invite DSP owner`:`Create new DSP`,description:`Invite an owner. Their workspace will be prepared while they finish setup.`,busy:g,children:(0,S.jsxs)(`form`,{onSubmit:ee,className:`panel-form`,children:[(0,S.jsxs)(tm,{children:[(0,S.jsx)(Bm,{label:`Owner email`,name:`ownerEmail`,type:`email`,autoComplete:`off`,maxLength:254,required:!0,disabled:g}),(0,S.jsx)(Hm,{error:v})]}),(0,S.jsxs)(`div`,{className:`panel-footer`,children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:g,onClick:()=>{s(!1),p(null)},children:`Cancel`}),(0,S.jsx)(qm,{busy:g,children:f?`Create invitation`:`Create DSP`})]})]})}),(0,S.jsx)(Ym,{open:!!E,onClose:()=>l(null),title:E?(0,S.jsxs)(`span`,{className:`dsp-panel-identity`,children:[(0,S.jsx)(Jh,{name:tg(E)}),(0,S.jsx)(`span`,{children:tg(E)})]}):`DSP details`,description:`DSP ownership and runtime status.`,children:E&&(0,S.jsxs)(`div`,{className:`panel-body`,children:[(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Owner`}),(0,S.jsx)(`dd`,{children:E.ownerEmail||`Not assigned`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Runtime`}),(0,S.jsx)(`dd`,{children:(0,S.jsx)(Jm,{value:E.installation.state,children:rg(E)})})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Onboarding`}),(0,S.jsx)(`dd`,{children:ng(E)})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Station`}),(0,S.jsx)(`dd`,{children:E.stations.map(e=>e.code).join(`, `)||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Timezone`}),(0,S.jsx)(`dd`,{children:E.timezone||`—`})]})]}),!!E.installation.failure&&(0,S.jsx)(Vm,{error:!0,children:`This DSP needs attention. Review its setup or retry the failed operation.`}),(0,S.jsxs)(`div`,{className:`flex flex-col gap-2 mt-6`,children:[(0,S.jsxs)($,{disabled:g||!D(E),onClick:()=>void O(E),children:[(0,S.jsx)(An,{}),` `,g?`Opening…`:`View`]}),!D(E)&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Viewing is unavailable for suspended or removed DSPs.`}),(0,S.jsx)(Hm,{error:v}),A(E).map(e=>(0,S.jsxs)($,{variant:`outline`,onClick:()=>j(E,e),children:[eg[e],(0,S.jsx)(Cn,{"data-icon":`inline-end`})]},e))]})]})}),u&&(0,S.jsx)(Xm,{title:eg[u.kind],passwordRequired:u.kind===`destroy`,description:u.kind===`destroy`?`Permanently delete ${u.org.name} and all its runtime data and backups. Everyone will lose access. This cannot be undone.`:u.kind===`decommission`?`Remove ${u.org.name}. Access will stop immediately and its services will stop. Existing data will be retained so you can restore this DSP later.`:u.kind===`restore_dsp`?`Restore ${u.org.name} with its retained data and settings. Users can sign in again once services are healthy.`:u.kind===`suspend`?`Suspend ${u.org.name}. User access and collection will stop. All data and saved connections will be retained.`:u.kind===`resume`?`Resume ${u.org.name}. Its services and user access will return once the runtime is healthy.`:u.kind===`restart`?`Restart the runtime for ${u.org.name}. Collection and user access will pause briefly.`:u.kind===`revoke_owner_invitation`?`Revoke the owner invitation for ${u.org.name}? The invitation link will stop working.`:`Confirm this action for ${u.org.name}.`,onClose:()=>d(null),onConfirm:k},`${u.org.continuityRef}:${u.kind}`)]})}function ag(){let[e,t]=(0,x.useState)(!1),[n,r]=(0,x.useState)(null),i=Mt({queryKey:[`platform-diagnostics`],queryFn:()=>nn(`/api/platform/diagnostics`),refetchInterval:5e3}),a=Mt({queryKey:[`platform-runtime`],queryFn:()=>nn(`/api/platform/runtime`),refetchInterval:5e3});async function o(){if(!e){t(!0),r(null);try{let e=await cn(`diagnostics-create`,`/api/platform/diagnostics`,{});Yt.setQueryData([`platform-diagnostics`],e),await Yt.invalidateQueries({queryKey:[`fleet`]})}catch(e){r(e)}finally{t(!1)}}}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Rm,{title:`Diagnostics`,description:`Check runtime health and create test DSPs.`}),(0,S.jsx)(Hm,{error:n||i.error||a.error}),a.data?.enabled&&(0,S.jsxs)(`section`,{"aria-label":`Runtime health`,className:`rounded-xl border bg-card p-6 mb-6 space-y-3`,children:[(0,S.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Runtime health`}),(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Available storage: `,((a.data.storageAvailableBytes??0)/1024**3).toFixed(1),` GiB`]}),a.data.runtimes.map(e=>(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-between gap-2 border-t pt-3 text-sm`,children:[(0,S.jsx)(`span`,{children:e.name}),(0,S.jsxs)(`span`,{children:[e.status,` · `,e.memoryBytes===null?`—`:`${Math.round(e.memoryBytes/1024**2)} MiB`,` · `,e.tasks??0,` tasks`,e.storage?.limited?` · ${((e.storage.availableBytes??0)/1024**3).toFixed(1)} GiB storage free`:e.storage?.limited===!1?` · Storage limit pending migration`:` · Storage unavailable`]})]},e.reference)),!a.data.runtimes.length&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No DSP runtimes yet.`})]}),i.isPending?(0,S.jsx)(Um,{}):i.data?(0,S.jsxs)(`div`,{className:`space-y-6`,children:[(0,S.jsxs)(`section`,{className:`rounded-xl border bg-card p-6 space-y-4`,"aria-labelledby":`test-dsp-title`,children:[(0,S.jsx)(`h2`,{id:`test-dsp-title`,className:`text-lg font-semibold`,children:`Test DSP`}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Deploy a DSP with synthetic employees and timecards. It stays available until you delete it from DSPs. Provider collection stays stopped, and no invitation email is sent.`}),(0,S.jsxs)($,{onClick:o,disabled:e||!i.data.enabled,children:[(0,S.jsx)(jn,{"aria-hidden":`true`}),e?`Requesting test DSP…`:`Deploy test DSP`]}),i.data.enabled?null:(0,S.jsx)(Vm,{children:`Test DSP deployment is unavailable on this installation.`})]}),(0,S.jsx)(`section`,{"aria-label":`Test DSP deployments`,className:`space-y-3`,"aria-live":`polite`,children:i.data.dsps.map(e=>(0,S.jsxs)(`div`,{className:`rounded-xl border p-4`,children:[(0,S.jsx)(`h3`,{className:`font-medium`,children:e.name}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.status===`pending`?`Creating DSP and preparing synthetic data…`:e.status===`failed`?`Setup needs attention. Open DSPs to inspect or delete this test DSP.`:`Synthetic data prepared · ${e.installation.state===`ready`?`Available`:e.installation.state}`})]},e.name))}),(0,S.jsx)(`a`,{href:`#/platform`,className:`text-sm underline`,children:`Manage test DSPs in DSPs`})]}):null]})}function og({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card`,className:H(`flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm`,e),...t})}function sg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-header`,className:H(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,e),...t})}function cg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-title`,className:H(`leading-none font-semibold`,e),...t})}function lg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-description`,className:H(`text-sm text-muted-foreground`,e),...t})}function ug({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-content`,className:H(`px-6`,e),...t})}function dg({className:e,...t}){return(0,S.jsx)(`div`,{"data-slot":`card-footer`,className:H(`flex items-center px-6 [.border-t]:pt-6`,e),...t})}var fg={not_connected:`Not connected`,not_verified:`Not verified`,checking:`Checking connection`,connected:`Connected`,verification_required:`Verification required`,credentials_rejected:`Credentials rejected`,temporarily_unavailable:`Temporarily unavailable`};function pg(e){if(e.state===`checking`){if(e.assistance)return`Completing CAPTCHA`;if(e.check?.phase===`checking_session`)return`Checking session`;if(e.check?.phase===`signing_in`)return`Signing in`}return fg[e.state]}function mg(e){return e.assistance?.phase===`queued`?`Paycom requested a CAPTCHA. Waiting for automatic verification to start.`:e.assistance?.phase===`solving`?`Completing Paycom’s CAPTCHA automatically. You can leave this page while verification finishes.`:e.assistance?.phase===`verifying`?`Checking Paycom’s response before continuing.`:e.check?.phase===`checking_session`?`Checking whether your saved Paycom session is still signed in.`:e.check?.phase===`signing_in`?`Signing in to Paycom with your saved credentials and security answers.`:e.reason===`verification_code_rejected`?`Amazon didn’t accept that code. Enter the newest code from your email.`:e.reason===`verification_expired`?`This verification attempt ended. Test the connection to start a new sign-in.`:e.verification&&e.state!==`checking`?`Amazon sent you an email verification code. Enter it below to finish signing in.`:e.reason===`attempt_cooldown`?`The service needs a pause before another login attempt. Retry after the time shown below.`:e.service===`paycom`&&e.reason===`captcha_required`?`Paycom requires a CAPTCHA before sign-in can finish. Contact your Dispatch administrator to complete verification. Connection tests will remain blocked until it is resolved.`:e.service===`paycom`&&e.reason===`security_answers_rejected`?`Paycom rejected the security-answer step. Contact your Dispatch administrator to verify the saved numbered PINs and complete sign-in.`:e.state===`verification_required`?`The service needs human verification. Contact your Dispatch administrator to complete it, then test the connection again.`:e.state===`credentials_rejected`?`The service rejected the saved login. Check your account details and update the credentials.`:e.state===`temporarily_unavailable`?`We couldn’t verify this connection. Your credentials remain saved. Try testing it again shortly.`:e.state===`checking`?`Verifying your login. You can leave this page while the check finishes.`:e.state===`not_verified`?`Credentials are saved. Test the connection to verify access.`:e.state===`connected`?`Signed in successfully. Your DSP’s connection is saved securely.`:`Connect once to make this service available to your DSP’s features.`}function hg({verification:e,busy:t,onVerify:n}){let{timeZone:r}=rh();async function i(t){t.preventDefault();let r=t.currentTarget,i={code:String(new FormData(r).get(`code`)||``).trim(),verificationId:e.id};r.reset();try{await n(i)}finally{i.code=``}}return(0,S.jsxs)(`form`,{onSubmit:i,className:`flex flex-col gap-3`,"aria-label":`Cortex email verification`,children:[(0,S.jsx)(Bm,{label:`Email verification code`,name:`code`,type:`text`,inputMode:`numeric`,autoComplete:`one-time-code`,pattern:`[0-9]{6}`,minLength:6,maxLength:6,required:!0,disabled:t}),(0,S.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Enter the six-digit code. This prompt expires at`,` `,Nm(e.expiresAt,r),`.`]}),(0,S.jsx)(qm,{busy:t,disabled:t||e.attemptsRemaining===0,children:`Verify code`})]})}function gg(){let{timeZone:e}=rh(),{session:t}=gh(),n=dn(t),r=fn(t),i=Mt({queryKey:[`connections`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/connections`,{signal:e}),enabled:r,refetchInterval:e=>e.state.data?.items.some(e=>e.state===`checking`||e.state===`not_verified`||!!e.verification)?2e3:15e3}),[a,o]=(0,x.useState)(null),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(null),[p,m]=(0,x.useState)(null),[h,g]=(0,x.useState)(!1),_=i.data?.items.find(e=>e.service===p),v=p&&_?`${i.data?.services.find(e=>e.id===p)?.name}: ${s===p?`Checking session`:pg(_)}.`:null;if(!r)return null;async function y(e,t,r){c(e.id),u(null),f(null),m(t===`test`?e.id:null),g(!1);try{let a=await rn(`/api/organization/connections/${e.id}/${t}`,`POST`,t===`save`?{credentials:r}:t===`verify`?r:{});t===`test`&&Yt.setQueryData([`connections`,n?.organizationId],t=>t&&{...t,items:t.items.map(t=>t.service===e.id?a:t)}),await Yt.invalidateQueries({queryKey:[`paycom-connection`,n?.organizationId]}),o(null),f(t===`verify`?null:t===`disconnect`?`${e.name} disconnected.`:t===`save`?`${e.name} credentials saved.`:null),await i.refetch()}catch(e){u(e),m(null),t===`save`&&(!(e instanceof Jt)||!e.status||e.status>=500)&&(g(!0),await i.refetch())}finally{c(null)}}async function b(e){if(e.preventDefault(),!a)return;let t=e.currentTarget,n=Object.fromEntries(new FormData(t));t.reset(),await y(a.service,`save`,n);for(let e of Object.keys(n))n[e]=``}return(0,S.jsxs)(`section`,{className:`flex flex-col gap-6 py-6`,"aria-labelledby":`connections-heading`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`connections-heading`,className:`text-lg font-semibold`,children:`Connections`}),(0,S.jsx)(`p`,{className:`text-muted-foreground`,children:`Connect the services your DSP uses. All supported features share these connections.`})]}),!a&&(0,S.jsx)(Hm,{error:l||i.error}),d&&(0,S.jsx)(Vm,{children:d}),v&&(0,S.jsx)(`div`,{role:`status`,children:(0,S.jsx)(Vm,{error:!!_&&![`checking`,`connected`].includes(_.state),children:v})}),i.isPending?(0,S.jsx)(Um,{}):i.data?(0,S.jsx)(`div`,{className:`grid gap-6 lg:grid-cols-2`,children:i.data.services.map(t=>{let n=i.data.items.find(e=>e.service===t.id);if(!n)return null;let r=n.state===`checking`,a=s!==null||r;return(0,S.jsxs)(og,{children:[(0,S.jsxs)(sg,{children:[(0,S.jsxs)(cg,{className:`flex items-center gap-3`,children:[(0,S.jsx)(Rn,{className:`size-5`,"aria-hidden":`true`}),t.name]}),(0,S.jsx)(lg,{children:t.id===`cortex`?`Amazon Logistics dashboard`:`Workforce and timecards`})]}),(0,S.jsxs)(ug,{className:`flex flex-col gap-4`,children:[(0,S.jsx)(`div`,{role:`status`,children:(0,S.jsx)(vh,{variant:n.state===`connected`?`default`:`secondary`,children:pg(n)})}),(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:mg(n)}),n.verification&&(0,S.jsx)(hg,{verification:n.verification,busy:a,onVerify:e=>y(t,`verify`,e)},n.verification.id),n.checkedAt&&(0,S.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Last checked: `,Nm(n.checkedAt,e)]}),n.retryAt&&(0,S.jsxs)(`p`,{className:`text-sm`,children:[`Retry after `,Nm(n.retryAt,e)]})]}),(0,S.jsxs)(dg,{className:`mt-auto flex flex-wrap gap-2`,children:[(0,S.jsx)($,{disabled:a,onClick:()=>{u(null),g(!1),o({service:t,action:`save`})},children:n.configured?`Update credentials`:`Connect ${t.name}`}),n.configured&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)($,{variant:`outline`,disabled:a||!!n.verification||t.id!==`paycom`&&!!n.retryAt&&Date.parse(n.retryAt)>Date.now(),onClick:()=>void y(t,`test`),children:[(0,S.jsx)(Vn,{className:`size-4`,"aria-hidden":`true`}),`Test connection`]}),(0,S.jsx)($,{variant:`ghost`,disabled:a,onClick:()=>{u(null),o({service:t,action:`disconnect`})},children:`Disconnect`})]})]})]},t.id)})}):(0,S.jsx)($,{variant:`outline`,onClick:()=>void i.refetch(),children:`Retry loading connections`}),(0,S.jsxs)(`p`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,S.jsx)(Gn,{className:`size-4 shrink-0`,"aria-hidden":`true`}),`DSP owners and platform owners can manage these credentials.`]}),(0,S.jsx)(mm,{open:a!==null,onOpenChange:e=>{!e&&!s&&(o(null),u(null))},children:(0,S.jsxs)(_m,{className:`max-h-[90dvh] overflow-y-auto`,children:[(0,S.jsxs)(vm,{children:[(0,S.jsx)(bm,{children:a?.action===`disconnect`?`Disconnect ${a.service.name}?`:`${a?.service.name||`Service`} credentials`}),(0,S.jsx)(xm,{children:a?.action===`disconnect`?`Features will lose access to this service until you reconnect. Previously collected data will remain available.`:`Enter the account your DSP uses. Saved credentials are encrypted and are never displayed here.`})]}),a?.action===`save`?(0,S.jsx)(`form`,{onSubmit:b,children:(0,S.jsxs)(tm,{children:[a.service.fields.map(e=>(0,S.jsx)(Bm,{name:e.name,label:e.label,type:e.name===`password`||e.name.startsWith(`pin`)?`password`:`text`,autoComplete:e.name===`username`?`username`:`off`,maxLength:e.maximum,required:!0,disabled:s!==null},e.name)),a.service.id===`paycom`&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter all five distinct security answers in the order configured for your Paycom account.`}),(0,S.jsx)(Hm,{error:l}),h&&(0,S.jsx)(Vm,{children:`We couldn’t confirm this save. Your credentials may already be stored. Close this form to check the connection before retrying.`}),(0,S.jsxs)(ym,{children:[(0,S.jsx)($,{type:`button`,variant:`outline`,disabled:s!==null,onClick:()=>o(null),children:`Cancel`}),(0,S.jsx)(qm,{busy:s!==null,disabled:s!==null,children:`Save and connect`})]})]})},a.service.id):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Hm,{error:l}),(0,S.jsxs)(ym,{children:[(0,S.jsx)($,{variant:`outline`,disabled:s!==null,onClick:()=>o(null),children:`Cancel`}),(0,S.jsx)($,{variant:`destructive`,disabled:s!==null,onClick:()=>a&&void y(a.service,`disconnect`),children:`Disconnect`})]})]})]})})]})}function _g(){let{session:e}=gh(),{timeZone:t}=rh(),n=dn(e),r=n?.organization.status===`suspended`,i=Mt({queryKey:[`organization-audit`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/audit`,{signal:e}),enabled:ln(n,`audit.read`)&&!r,refetchInterval:15e3});return r?(0,S.jsx)(Vm,{children:`This DSP is suspended. The audit log is unavailable.`}):ln(n,`audit.read`)?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Recent changes to your DSP, team, and access.`}),(0,S.jsx)(Gm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsx)(Hm,{error:i.error}),i.isPending?(0,S.jsx)(Um,{}):i.data&&!i.error?i.data.audit.length?(0,S.jsxs)(yh,{children:[(0,S.jsx)(bh,{children:(0,S.jsxs)(Sh,{children:[(0,S.jsx)(Ch,{children:`Action`}),(0,S.jsx)(Ch,{children:`By`}),(0,S.jsx)(Ch,{children:`Date`}),(0,S.jsx)(Ch,{children:`Result`})]})}),(0,S.jsx)(xh,{children:i.data.audit.map((e,n)=>(0,S.jsxs)(Sh,{children:[(0,S.jsx)(wh,{children:e.action.replaceAll(`.`,` `)}),(0,S.jsx)(wh,{children:e.actor}),(0,S.jsx)(wh,{children:Nm(e.createdAt,t)}),(0,S.jsx)(wh,{children:(0,S.jsx)(Jm,{value:e.result,children:e.result})})]},e.id||n))})]}):(0,S.jsx)(Wm,{title:`No audit events yet`,description:`Changes to your DSP will appear here.`}):null]}):null}var vg=[{value:`light`,label:`Light`,description:`A bright, clean workspace.`},{value:`dark`,label:`Dark`,description:`A calm, low-light workspace.`},{value:`system`,label:`System`,description:`Match your device settings.`}];function yg({mode:e}){let{themePack:t}=$p();return(0,S.jsxs)(`span`,{className:`theme-preview-ui theme-preview-scope`,"data-theme":e,"data-theme-pack":t.id,children:[(0,S.jsxs)(`span`,{className:`theme-preview-sidebar`,children:[(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{})]}),(0,S.jsxs)(`span`,{className:`theme-preview-content`,children:[(0,S.jsx)(`span`,{className:`theme-preview-heading`}),(0,S.jsx)(`span`,{className:`theme-preview-subheading`}),(0,S.jsx)(`span`,{className:`theme-preview-table`,children:[0,1,2].map(e=>(0,S.jsxs)(`span`,{children:[(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{}),(0,S.jsx)(`i`,{})]},e))})]})]})}function bg(){let{appearance:e,setAppearance:t,themePack:n,setThemePack:r,storageUnavailable:i}=$p();return(0,S.jsxs)(`section`,{className:`theme-section`,children:[(0,S.jsxs)(`div`,{className:`theme-pack-field`,children:[(0,S.jsx)(`label`,{htmlFor:`theme-pack`,children:`Theme`}),(0,S.jsx)(`select`,{id:`theme-pack`,value:n.id,onChange:e=>r(e.target.value),"aria-describedby":`theme-pack-description`,children:Wp.map(e=>(0,S.jsx)(`option`,{value:e.id,children:e.name},e.id))}),(0,S.jsx)(`p`,{id:`theme-pack-description`,children:n.description})]}),(0,S.jsxs)(`fieldset`,{"aria-describedby":`theme-description theme-persistence`,children:[(0,S.jsx)(`legend`,{children:`Appearance`}),(0,S.jsx)(`p`,{id:`theme-description`,children:`Choose how Dispatch looks for you.`}),(0,S.jsx)(`div`,{className:`theme-options`,children:vg.map(({value:n,label:r,description:i})=>(0,S.jsxs)(`label`,{className:`theme-option`,children:[(0,S.jsx)(`input`,{type:`radio`,name:`theme`,value:n,checked:e===n,onChange:()=>t(n),"aria-label":r,"aria-describedby":`theme-${n}-description`}),(0,S.jsxs)(`span`,{className:`theme-preview theme-preview-${n}`,"aria-hidden":`true`,children:[(0,S.jsx)(yg,{mode:n===`dark`?`dark`:`light`}),n===`system`&&(0,S.jsx)(yg,{mode:`dark`})]}),(0,S.jsx)(`span`,{className:`theme-option-label`,children:r}),(0,S.jsx)(`span`,{id:`theme-${n}-description`,className:`theme-option-description`,children:i})]},n))}),(0,S.jsx)(`p`,{id:`theme-persistence`,className:`theme-persistence`,children:`Saved for your account on this browser. Other users keep their own theme.`}),i&&(0,S.jsx)(`p`,{role:`status`,className:`theme-storage-notice`,children:`Theme applied for this visit. Browser storage is unavailable, so it could not be saved.`})]})]})}var xg=typeof Intl.supportedValuesOf==`function`?Intl.supportedValuesOf(`timeZone`):[`America/Los_Angeles`,`America/Phoenix`,`America/Denver`,`America/Chicago`,`America/New_York`,`Europe/London`];function Sg(){let{timeZone:e,deviceZone:t,preference:n,setPreference:r,storageUnavailable:i}=rh(),a=[...new Set([`UTC`,t,n,...xg].filter(jm))].sort();return(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Date & time`}),(0,S.jsx)(`p`,{children:`Choose how event times appear for you.`})]}),(0,S.jsxs)(`div`,{className:`theme-pack-field`,children:[(0,S.jsx)(`label`,{htmlFor:`display-timezone`,children:`Display timezone`}),(0,S.jsxs)(`select`,{id:`display-timezone`,value:n||`automatic`,onChange:e=>r(e.target.value===`automatic`?null:e.target.value),"aria-describedby":`display-timezone-description`,children:[(0,S.jsxs)(`option`,{value:`automatic`,children:[`Automatic — device timezone (`,t.replaceAll(`_`,` `),`)`]}),a.map(e=>(0,S.jsx)(`option`,{value:e,children:e.replaceAll(`_`,` `)},e))]}),(0,S.jsxs)(`p`,{id:`display-timezone-description`,children:[`Sync and activity times use `,e.replaceAll(`_`,` `),`. Timecards keep the DSP’s business timezone.`]}),(0,S.jsx)(`p`,{children:`Saved for your account on this browser.`}),i&&(0,S.jsx)(`p`,{role:`status`,children:`Applied for this visit. Browser storage is unavailable, so this preference could not be saved.`})]})]})}function Cg({onboarding:e=!1}){let{session:t,refresh:n}=gh(),r=e?t.memberships.find(e=>e.organizationId===t.activeOrganizationId)||null:dn(t),i=Mt({queryKey:[`profile`,r?.organizationId],queryFn:()=>nn(`/api/organization/profile`),enabled:ln(r,`organization.owner`)&&r?.organization.status!==`suspended`,refetchInterval:e=>e.state.data?.status===`submitted`&&2e3}),[a,o]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null);if(!ln(r,`organization.owner`))return null;if(i.error)return(0,S.jsx)(Hm,{error:i.error});if(!i.data)return e?(0,S.jsx)(Um,{}):null;if(i.data.status===`complete`||i.data.status===`submitted`)return!e&&i.data.status===`complete`?null:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Vm,{children:i.data.status===`complete`?`Your DSP details are complete. You can continue to your workspace.`:`Your DSP details are saved. They’ll be applied when your workspace is ready.`}),e&&(0,S.jsx)($,{className:`mt-6`,onClick:()=>{location.hash=un(t)?`#/platform`:`#/settings`},children:`Continue to workspace`})]});async function l(e){e.preventDefault();let t=Object.fromEntries(new FormData(e.currentTarget));o(!0),c(null);try{await rn(`/api/organization/profile`,`POST`,t),await i.refetch(),await n()}catch(e){c(e)}finally{o(!1)}}return(0,S.jsxs)(`section`,{className:e?`onboarding-details`:`setup-section`,children:[!e&&(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Set up your DSP`}),(0,S.jsx)(`p`,{children:`Your workspace is being prepared. Add your DSP details to finish onboarding.`})]}),(0,S.jsx)(`form`,{onSubmit:l,children:(0,S.jsxs)(tm,{children:[(0,S.jsx)(Bm,{label:`DSP name`,name:`name`,minLength:2,maxLength:120,required:!0,disabled:a}),(0,S.jsx)(Bm,{label:`Abbreviation (optional)`,name:`abbreviation`,maxLength:16,disabled:a}),(0,S.jsx)(Bm,{label:`Station code`,name:`stationCode`,pattern:`[A-Za-z0-9]{3,8}`,maxLength:8,required:!0,disabled:a}),(0,S.jsx)(Bm,{label:`Business timezone`,name:`timezone`,defaultValue:Mm(),maxLength:64,required:!0,disabled:a}),(0,S.jsx)(Hm,{error:s}),(0,S.jsx)(qm,{busy:a,disabled:a,children:`Save DSP details`})]})})]})}function wg(){let{session:e,refresh:t}=gh(),n=()=>{let e=new URLSearchParams(location.hash.split(`?`)[1]).get(`tab`);return e===`theme`||e===`security`||e===`audit`||e===`connections`?e:`general`},[r,i]=(0,x.useState)(n);(0,x.useEffect)(()=>{let e=()=>i(n());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let a=un(e),o=dn(e),s=fn(e),c=!a&&ln(o,`audit.read`),[l,u]=(0,x.useState)(!1),[d,f]=(0,x.useState)(null),[p,m]=(0,x.useState)(!1);async function h(e){e.preventDefault();let n=e.currentTarget,r=Object.fromEntries(new FormData(n));u(!0),m(!1),f(null);try{await rn(`/api/auth/change-password`,`POST`,r),await t(),n.reset(),m(!0)}catch(e){f(e)}finally{u(!1)}}return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Rm,{title:`Settings`,description:a?`Your platform account and security.`:`Your account, workspace, and security.`}),(0,S.jsxs)(Fp,{value:r===`audit`&&!c||r===`connections`&&!s?`general`:r,onValueChange:e=>{i(e),history.replaceState({},``,`${location.pathname}${location.search}${location.hash.split(`?`)[0]}?tab=${e}`)},children:[(0,S.jsxs)(Lp,{variant:`line`,className:`page-tabs`,children:[(0,S.jsx)(Rp,{value:`general`,children:`General`}),(0,S.jsx)(Rp,{value:`security`,children:`Security`}),s&&(0,S.jsx)(Rp,{value:`connections`,children:`Connections`}),(0,S.jsx)(Rp,{value:`theme`,children:`Theme`}),c&&(0,S.jsx)(Rp,{value:`audit`,children:`Audit log`})]}),s&&(0,S.jsx)(zp,{value:`connections`,children:(0,S.jsx)(gg,{},o?.organizationId)}),(0,S.jsxs)(zp,{value:`general`,children:[(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Account`}),(0,S.jsx)(`p`,{children:e.dspView?`You are signed in with your platform account.`:`Your Dispatch sign-in details.`})]}),(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Name`}),(0,S.jsx)(`dd`,{children:e.user.name})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Email address`}),(0,S.jsx)(`dd`,{children:e.user.email})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Role`}),(0,S.jsx)(`dd`,{children:a||e.dspView?`Platform owner`:o?.roleName||`No DSP access`})]})]})]}),(0,S.jsx)(Sg,{}),!a&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Workspace`}),(0,S.jsx)(`p`,{children:`Your current DSP context.`})]}),(0,S.jsxs)(`dl`,{className:`detail-list`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`DSP`}),(0,S.jsx)(`dd`,{children:o?.organization.name||`No DSP selected`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Station`}),(0,S.jsx)(`dd`,{children:o?.organization.stations.map(e=>e.code).join(`, `)||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Business timezone`}),(0,S.jsx)(`dd`,{children:o?.organization.timezone||`—`})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`dt`,{children:`Status`}),(0,S.jsx)(`dd`,{children:o?.organization.status.replaceAll(`_`,` `)||`Unavailable`})]})]})]}),(0,S.jsx)(Cg,{})]})]}),c&&(0,S.jsx)(zp,{value:`audit`,children:(0,S.jsx)(_g,{})}),(0,S.jsx)(zp,{value:`theme`,children:(0,S.jsx)(bg,{})}),(0,S.jsx)(zp,{value:`security`,children:(0,S.jsxs)(`section`,{className:`settings-section`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{children:`Change password`}),(0,S.jsx)(`p`,{children:`Changing your password signs out every other session.`})]}),(0,S.jsx)(`form`,{onSubmit:h,className:`max-w-md`,children:(0,S.jsxs)(tm,{children:[(0,S.jsx)(Bm,{label:`Current password`,name:`currentPassword`,type:`password`,autoComplete:`current-password`,maxLength:128,required:!0,disabled:l}),(0,S.jsx)(Bm,{label:`New password`,name:`newPassword`,type:`password`,autoComplete:`new-password`,minLength:12,maxLength:128,required:!0,disabled:l,description:`Use at least 12 characters.`}),(0,S.jsx)(Bm,{label:`Confirm new password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,minLength:12,maxLength:128,required:!0,disabled:l}),(0,S.jsx)(Hm,{error:d}),p&&(0,S.jsx)(Vm,{children:`Password changed. Other sessions have been signed out.`}),(0,S.jsx)(`div`,{children:(0,S.jsx)(qm,{busy:l,disabled:l,children:`Change password`})})]})})]})})]})]})}function Tg(){return(0,x.useEffect)(()=>{document.title=`Set up your DSP · Dispatch`},[]),(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(lh,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground mb-3`,children:`Step 2 of 2 · DSP details`}),(0,S.jsx)(`h1`,{children:`Set up your DSP`}),(0,S.jsx)(`p`,{className:`auth-description`,children:`Your account is ready. Add your DSP details while we prepare your workspace.`}),(0,S.jsx)(Cg,{onboarding:!0})]})]})}function Eg(e,t){let n=e.find(e=>e.available&&e.pages.some(e=>e.id===t));return n?Rh(n.id,n.version,n.revision,t):void 0}function Dg(e,t){let n=dn(t);return e.filter(e=>e.available).flatMap(e=>e.pages).filter(e=>ln(n,e.permission))}function Og(e){let t=un(e),n=dn(e);return Mt({queryKey:[`plugins`,t?`platform`:n?.organizationId],queryFn:({signal:e})=>nn(t?`/api/platform/plugins`:`/api/organization/plugins`,{signal:e}),initialData:!t&&e.plugins?{items:e.plugins}:void 0,enabled:e.authenticated&&(t||!!n&&ln(n,`dashboard.view`)),refetchInterval:e=>e.state.data?.items.some(e=>e.pending)?2e3:15e3})}function kg(){let{session:e,refresh:t}=gh(),n=un(e),r=fn(e),i=Og(e),[a,o]=(0,x.useState)(null),[s,c]=(0,x.useState)(null),[l,u]=(0,x.useState)(null);async function d(n,r){o(n.id),c(null);try{await cn(`plugin:${n.id}:${r}:${n.revision}`,`/api/organization/plugins/${n.id}`,{action:r,expectedRevision:n.revision}),u(null),await i.refetch(),await Yt.invalidateQueries({queryKey:[`connections`,dn(e)?.organizationId]}),await t()}catch(e){c(e)}finally{o(null)}}return(0,S.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,S.jsx)(Rm,{title:`Plugins`,description:n?`Available plugins that DSP owners can install for their workspace.`:`Choose the features your DSP uses. Your saved data stays with your DSP.`}),(0,S.jsx)(Hm,{error:s||i.error}),i.isPending?(0,S.jsx)(Um,{}):(0,S.jsx)(`div`,{className:`grid gap-4 md:grid-cols-2 xl:grid-cols-3`,children:i.data?.items.map(e=>(0,S.jsxs)(og,{children:[(0,S.jsxs)(sg,{children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,S.jsx)(Bn,{"aria-hidden":`true`,className:`size-5 text-muted-foreground`}),!n&&(0,S.jsx)(vh,{variant:`secondary`,children:e.pending?`Applying changes`:e.state===`enabled`?`Installed`:e.state===`disabled`?`Disabled`:`Not installed`})]}),(0,S.jsx)(cg,{children:e.name}),(0,S.jsx)(lg,{children:e.description})]}),(0,S.jsx)(ug,{children:e.failureCode?(0,S.jsx)(Vm,{error:!0,children:`We couldn’t finish applying this change. Dispatch will retry when your DSP is available.`}):e.pending?(0,S.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Updating this plugin for your DSP…`}):!n&&e.state===`disabled`?(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Its pages and background work are stopped. Your saved data and credentials are retained.`}):null}),!n&&r&&(0,S.jsx)(dg,{className:`flex flex-wrap gap-2`,children:e.state===`uninstalled`?(0,S.jsxs)($,{disabled:!!a||e.pending,onClick:()=>void d(e,`install`),children:[`Install `,e.name]}):(0,S.jsxs)(S.Fragment,{children:[e.available&&e.pages[0]&&(0,S.jsx)($,{asChild:!0,children:(0,S.jsxs)(`a`,{href:`#/${e.pages[0].id}`,children:[`Open `,e.name]})}),e.available&&e.hasSettings&&e.pages[0]&&(0,S.jsx)($,{asChild:!0,variant:`outline`,children:(0,S.jsx)(`a`,{href:`#/${e.pages[0].id}?settings`,children:`Settings`})}),(0,S.jsx)($,{variant:`outline`,disabled:!!a||e.pending,onClick:()=>void d(e,e.state===`disabled`?`enable`:`disable`),children:e.state===`disabled`?`Enable`:`Disable`}),(0,S.jsx)($,{variant:`ghost`,disabled:!!a||e.pending,onClick:()=>u(e),children:`Uninstall`})]})})]},e.id))}),(0,S.jsx)(mm,{open:!!l,onOpenChange:e=>{!e&&!a&&u(null)},children:(0,S.jsxs)(_m,{children:[(0,S.jsxs)(vm,{children:[(0,S.jsxs)(bm,{children:[`Uninstall `,l?.name,`?`]}),(0,S.jsx)(xm,{children:`Its pages and background work will stop. Your collected data and saved credentials will stay with this DSP so you can reinstall it later.`})]}),(0,S.jsxs)(ym,{children:[(0,S.jsx)($,{variant:`outline`,disabled:!!a,onClick:()=>u(null),children:`Cancel`}),(0,S.jsx)($,{disabled:!!a,onClick:()=>l&&void d(l,`uninstall`),children:`Uninstall plugin`})]})]})})]})}function Ag({className:e,size:t=`default`,...n}){return(0,S.jsxs)(`div`,{className:`group/native-select relative w-fit has-[select:disabled]:opacity-50`,"data-slot":`native-select-wrapper`,children:[(0,S.jsx)(`select`,{"data-slot":`native-select`,"data-size":t,className:H(`h-9 w-full min-w-0 appearance-none rounded-md border border-input bg-transparent px-3 py-2 pr-9 text-sm shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed data-[size=sm]:h-8 data-[size=sm]:py-1 dark:bg-input/30 dark:hover:bg-input/50`,`focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`,`aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40`,e),...n}),(0,S.jsx)(En,{className:`pointer-events-none absolute top-1/2 right-3.5 size-4 -translate-y-1/2 text-muted-foreground opacity-50 select-none`,"aria-hidden":`true`,"data-slot":`native-select-icon`})]})}function jg({className:e,...t}){return(0,S.jsx)(`option`,{"data-slot":`native-select-option`,className:H(`bg-[Canvas] text-[CanvasText]`,e),...t})}function Mg(){let{session:e}=gh(),{timeZone:t}=rh(),n=dn(e),r=n?.organization.status===`suspended`,i=Mt({queryKey:[`team`,n?.organizationId],queryFn:({signal:e})=>nn(`/api/organization/administration`,{signal:e}),enabled:!r,refetchInterval:15e3}),[a,o]=(0,x.useState)(`members`),[s,c]=(0,x.useState)(``),[l,u]=(0,x.useState)(null),[d,f]=(0,x.useState)(!1),[p,m]=(0,x.useState)(null),[h,g]=(0,x.useState)(null),[_,v]=(0,x.useState)(null),y=i.data,b=y?.roles.filter(e=>e.permissions.every(e=>n?.permissions.includes(e)))||[],C=y?.members.filter(e=>`${e.user.name} ${e.user.email}`.toLowerCase().includes(s.toLowerCase()))||[];function w(e){m(null),u(e)}async function T(e){if(e.preventDefault(),!l)return;f(!0),m(null);let t=new FormData(e.currentTarget);try{l.kind===`invite`?g(await rn(`/api/organization/invitations`,`POST`,{email:t.get(`email`),roleId:t.get(`roleId`)})):l.kind===`member`&&await rn(`/api/organization/members/${l.member.id}/role`,`PUT`,{roleId:t.get(`roleId`)}),u(null),await i.refetch()}catch(e){m(e)}finally{f(!1)}}let E=y?.invitations.filter(e=>e.status===`pending`)||[];return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Rm,{title:`Team & Roles`,description:`Manage your team and their access.`,children:!r&&ln(n,`members.invite`)&&(0,S.jsxs)($,{onClick:()=>w({kind:`invite`}),children:[(0,S.jsx)(zn,{"data-icon":`inline-start`}),`Invite member`]})}),r?(0,S.jsx)(Vm,{children:`This DSP is suspended. Team administration is unavailable.`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Cg,{}),(0,S.jsx)(Zm,{result:h}),(0,S.jsx)(Hm,{error:i.error}),i.isPending?(0,S.jsx)(Um,{}):y&&!i.error?(0,S.jsxs)(Fp,{value:a,onValueChange:o,children:[(0,S.jsxs)(Lp,{variant:`line`,className:`page-tabs`,children:[(0,S.jsx)(Rp,{value:`members`,children:`Members`}),(0,S.jsx)(Rp,{value:`roles`,children:`Roles`}),(0,S.jsxs)(Rp,{value:`invitations`,children:[`Invitations`,E.length>0&&(0,S.jsx)(`span`,{className:`tab-count`,children:E.length})]})]}),(0,S.jsxs)(zp,{value:`members`,children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(Km,{value:s,onChange:c,placeholder:`Search members`}),(0,S.jsx)(Gm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsxs)(yh,{children:[(0,S.jsx)(bh,{children:(0,S.jsxs)(Sh,{children:[(0,S.jsx)(Ch,{className:`w-[45%]`,children:`Member`}),(0,S.jsx)(Ch,{children:`Role`}),(0,S.jsx)(Ch,{children:`Access`}),(0,S.jsx)(Ch,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(xh,{children:C.map(t=>(0,S.jsxs)(Sh,{children:[(0,S.jsx)(wh,{children:(0,S.jsxs)(`div`,{className:`member-identity`,children:[(0,S.jsx)(`span`,{className:`avatar`,children:t.user.name.split(/\s+/).map(e=>e[0]).slice(0,2).join(``)}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`strong`,{children:t.user.name}),(0,S.jsx)(`span`,{children:t.user.email})]})]})}),(0,S.jsx)(wh,{children:t.role.name}),(0,S.jsx)(wh,{children:(0,S.jsx)(Jm,{value:`active`,children:`Active`})}),(0,S.jsx)(wh,{className:`text-right`,children:t.user.id!==e.user.id&&ln(n,`members.manage`)&&(0,S.jsxs)(Hh,{children:[(0,S.jsx)(Uh,{asChild:!0,children:(0,S.jsx)($,{size:`icon`,variant:`ghost`,"aria-label":`Actions for ${t.user.name}`,children:(0,S.jsx)(kn,{})})}),(0,S.jsx)(Wh,{align:`end`,children:(0,S.jsxs)(Gh,{children:[(0,S.jsx)(Kh,{onSelect:()=>w({kind:`member`,member:t}),children:`Change role`}),(0,S.jsx)(Kh,{variant:`destructive`,onSelect:()=>v({title:`Remove member`,description:`Remove ${t.user.name} from ${y.organization.name}?`,path:`/api/organization/members/${t.id}`}),children:`Remove member`})]})})]})})]},t.id))})]}),!C.length&&(0,S.jsx)(Wm,{title:`No members found`,description:`Try a different name or email.`}),(0,S.jsxs)(`p`,{className:`table-count`,children:[C.length,` member`,C.length===1?``:`s`]})]}),(0,S.jsxs)(zp,{value:`roles`,children:[(0,S.jsx)(`div`,{className:`table-toolbar`,children:(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Standard roles for your DSP. All roles currently have the same permissions.`})}),(0,S.jsx)(`div`,{className:`role-list`,children:y.roles.map(e=>(0,S.jsx)(`section`,{className:`role-row`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{children:e.name}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Standard role`})]}),(0,S.jsx)(`p`,{children:e.description})]})},e.id))})]}),(0,S.jsxs)(zp,{value:`invitations`,children:[(0,S.jsxs)(`div`,{className:`table-toolbar`,children:[(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Pending invitations to your DSP.`}),(0,S.jsx)(Gm,{onClick:()=>void i.refetch(),busy:i.isFetching})]}),(0,S.jsxs)(yh,{children:[(0,S.jsx)(bh,{children:(0,S.jsxs)(Sh,{children:[(0,S.jsx)(Ch,{children:`Email address`}),(0,S.jsx)(Ch,{children:`Role`}),(0,S.jsx)(Ch,{children:`Expires`}),(0,S.jsx)(Ch,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,S.jsx)(xh,{children:E.map(e=>(0,S.jsxs)(Sh,{children:[(0,S.jsx)(wh,{children:e.email}),(0,S.jsx)(wh,{children:e.roleName}),(0,S.jsx)(wh,{children:Nm(e.expiresAt,t)}),(0,S.jsx)(wh,{className:`text-right`,children:ln(n,`members.invite`)&&(0,S.jsx)($,{variant:`ghost`,size:`sm`,"aria-label":`Revoke invitation for ${e.email}`,onClick:()=>v({title:`Revoke invitation`,description:`Revoke the invitation for ${e.email}?`,path:`/api/organization/invitations/${e.id}`}),children:`Revoke`})})]},e.id))})]}),!E.length&&(0,S.jsx)(Wm,{title:`No pending invitations`,description:`New invitations will appear here until they’re accepted.`})]})]}):null]}),(0,S.jsx)(Ym,{open:!!l,onClose:()=>u(null),title:l?.kind===`invite`?`Invite member`:`Change role`,description:l?.kind===`member`?`Update the role for ${l.member.user.name}.`:`Send an invitation to join your DSP.`,busy:d,children:l&&(0,S.jsxs)(`form`,{onSubmit:T,className:`panel-form`,children:[(0,S.jsxs)(tm,{children:[l.kind===`invite`&&(0,S.jsx)(Bm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`off`,required:!0,disabled:d}),` `,(0,S.jsxs)(rm,{children:[(0,S.jsx)(im,{htmlFor:`editor-role`,children:`Role`}),(0,S.jsx)(Ag,{id:`editor-role`,name:`roleId`,defaultValue:l.kind===`member`?l.member.role.id:b.find(e=>e.key===`driver`)?.id,disabled:d,required:!0,children:b.map(e=>(0,S.jsx)(jg,{value:e.id,children:e.name},e.id))})]}),(0,S.jsx)(Hm,{error:p})]}),(0,S.jsxs)(`div`,{className:`panel-footer`,children:[(0,S.jsx)($,{variant:`outline`,type:`button`,disabled:d,onClick:()=>u(null),children:`Cancel`}),(0,S.jsx)(qm,{busy:d,children:l.kind===`invite`?`Send invitation`:`Save role`})]})]},l.kind===`member`?l.member.id:`invite`)}),_&&(0,S.jsx)(Xm,{title:_.title,description:_.description,onClose:()=>v(null),onConfirm:async()=>{await rn(_.path,`DELETE`,{}),await i.refetch()}})]})}function Ng({session:e,refresh:t,token:n}){let[r,i]=(0,x.useState)(!1),[a,o]=(0,x.useState)(null),s=Mt({queryKey:[`invitation`,n],enabled:!!n&&!r,queryFn:()=>rn(`/api/auth/invitation/inspect`,`POST`,{token:n}),refetchOnWindowFocus:!1});(0,x.useEffect)(()=>{o(null)},[n]);let c=s.data,l=!!n,u=l&&!c?.accountExists,d=u?`register`:`login`,f=e?.turnstile?.siteKey,p=`${f}:${d}:${n||``}`,[m,h]=(0,x.useState)({scope:``,token:``}),[g,_]=(0,x.useState)(0),v=m.scope===p?m.token:``,y=(0,x.useCallback)(e=>{h({scope:p,token:e})},[p]),b=c?.kind===`organization_owner`;async function C(){await t(),history.replaceState({},``,`${location.pathname}${location.search}${b?`#/onboarding`:`#/team`}`),window.dispatchEvent(new HashChangeEvent(`hashchange`))}async function w(e){if(e.preventDefault(),r)return;if(f&&!v){o(`turnstile_required`);return}let a=new FormData(e.currentTarget),s=f?{turnstileToken:v}:{};i(!0),o(null);try{u?(await rn(`/api/auth/register`,`POST`,{token:n,...Object.fromEntries(a),...s}),await C()):(await rn(`/api/auth/login`,`POST`,{...Object.fromEntries(a),...s}),await t(),l&&(await rn(`/api/auth/accept-invitation`,`POST`,{token:n}),await C()))}catch(e){o(e),y(``),_(e=>e+1)}finally{i(!1)}}async function T(){i(!0),o(null);try{await rn(`/api/auth/accept-invitation`,`POST`,{token:n}),await C()}catch(e){o(e)}finally{i(!1)}}return(0,S.jsxs)(`main`,{className:`auth-layout`,children:[(0,S.jsx)(`div`,{className:`auth-brand`,children:(0,S.jsx)(lh,{})}),(0,S.jsxs)(`section`,{className:`auth-panel`,children:[l&&b&&(0,S.jsx)(`p`,{className:`text-sm text-muted-foreground mb-3`,children:`Step 1 of 2 · Your account`}),(0,S.jsx)(`h1`,{children:l&&b?`Create your DSP`:l?c?.kind===`platform_owner`?`Join Dispatch`:`Join ${c?.organization?.name||`Dispatch`}`:`Sign in to Dispatch`}),(0,S.jsx)(`p`,{className:`auth-description`,children:l?c?`${c.email} · ${c.role?.name||`Platform owner`}`:`Checking your invitation…`:`Welcome back. Sign in to your workspace.`}),l&&c&&(0,S.jsx)(`p`,{className:`auth-description`,children:c.accountExists?`You already have a Dispatch account. Use it to continue`+(b?` setting up your new DSP.`:` with this invitation.`):b?`Create your account, then add your DSP details to finish setup.`:`Create your account to accept this invitation.`}),(0,S.jsx)(Hm,{error:a||s.error}),e?.bootstrap?.initialized===!1&&(0,S.jsx)(Vm,{children:`Platform setup required. Create the platform owner using the private access administration command.`}),l&&s.isPending?(0,S.jsx)(Um,{}):l&&!c?null:l&&c?.accountExists&&e?.authenticated?(0,S.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,S.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Signed in as `,e.user.email,`.`]}),(0,S.jsx)($,{disabled:r,onClick:T,children:b?`Continue to DSP setup`:`Accept invitation`}),(0,S.jsx)($,{variant:`outline`,disabled:r,onClick:async()=>{i(!0);try{await rn(`/api/auth/logout`,`POST`,{}),await t()}catch(e){o(e)}finally{i(!1)}},children:`Use another account`})]}):(0,S.jsx)(`form`,{onSubmit:w,children:(0,S.jsxs)(tm,{children:[u?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(Bm,{label:`First name`,name:`firstName`,autoComplete:`given-name`,required:!0,maxLength:80,disabled:r}),(0,S.jsx)(Bm,{label:`Last name`,name:`lastName`,autoComplete:`family-name`,required:!0,maxLength:80,disabled:r})]}):(0,S.jsx)(Bm,{label:`Email address`,name:`email`,type:`email`,autoComplete:`username`,required:!0,maxLength:254,disabled:r}),(0,S.jsx)(Bm,{label:`Password`,name:`password`,type:`password`,autoComplete:u?`new-password`:`current-password`,minLength:u?12:void 0,maxLength:128,required:!0,disabled:r,description:u?`Use at least 12 characters.`:void 0}),!u&&(0,S.jsx)(`a`,{className:`text-sm text-primary underline-offset-4 hover:underline`,href:`#/forgot-password`,children:`Forgot password?`}),u&&(0,S.jsx)(Bm,{label:`Confirm password`,name:`confirmPassword`,type:`password`,autoComplete:`new-password`,required:!0,minLength:12,maxLength:128,disabled:r}),f&&(0,S.jsx)(fh,{siteKey:f,action:d,onToken:y,busy:r},`${p}:${g}`),(0,S.jsx)(qm,{busy:r,disabled:r||!(!f||v),children:u?b?`Create account and continue`:`Create account and accept`:l?`Sign in and continue`:`Sign in`})]})})]}),(0,S.jsx)(`p`,{className:`auth-footnote`,children:`Access is by invitation.`})]})}function Pg(e,t){if(un(e))return[{id:`platform`,label:`DSPs`,icon:wn},{id:`updates`,label:`Updates`,icon:Sn},{id:`backups`,label:`Backups`,icon:On},{id:`plugins`,label:`Plugins`,icon:Bn},{id:`diagnostics`,label:`Diagnostics`,icon:jn},{id:`platform-settings`,label:`Settings`,icon:Wn}];let n=dn(e),r=n?.organization.status===`active`;return[...r&&ln(n,`dashboard.view`)?[{id:`dashboard`,label:`Home Page`,icon:Mn}]:[],...r?Dg(t,e).map(e=>({id:e.id,label:e.label,icon:e.icon===`calendar`?Tn:Bn})):[],...r&&fn(e)?[{id:`plugins`,label:`Plugins`,icon:Bn}]:[],...ln(n,`members.read`)&&ln(n,`roles.read`)?[{id:`team`,label:`Team & Roles`,icon:Kn}]:[],{id:`settings`,label:`Settings`,icon:Wn}]}function Fg({session:e,refresh:t,hash:n,viewEnded:r}){let i=$p().themePack.components?.ShellLayout||mh,a=un(e),o=dn(e),s=Og(e).data?.items||[],c=Pg(e,s),l=n.replace(/^#\//,``).split(/[/?]/)[0],u=c.find(e=>e.id===l)||c[0],d=Eg(s,u.id),[f,p]=(0,x.useState)(!1),[m,h]=(0,x.useState)(null),[g,_]=(0,x.useState)(!1);async function v(){_(!0),h(null);try{$t(null),await t(),location.hash=`#/platform`}catch(e){h(e)}finally{_(!1)}}(0,x.useEffect)(()=>{l!==u.id&&(history.replaceState({},``,`${location.pathname}${location.search}#/${u.id}`),window.dispatchEvent(new HashChangeEvent(`hashchange`))),document.title=`${u.label} · Dispatch`,p(!1)},[l,u.id,u.label]);let y=(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`sidebar-brand`,children:[(0,S.jsx)(lh,{}),(0,S.jsx)(`p`,{children:a?`Platform`:o?.organization.name||`Workspace`})]}),(0,S.jsx)(`nav`,{className:`nav-list`,"aria-label":`Primary navigation`,children:c.map(({id:e,label:t,icon:n})=>(0,S.jsxs)(`a`,{href:`#/${e}`,"aria-current":e===u.id?`page`:void 0,className:`nav-item`,onClick:()=>p(!1),children:[(0,S.jsx)(n,{"aria-hidden":`true`}),(0,S.jsx)(`span`,{children:t})]},e))}),(0,S.jsx)(`div`,{className:`sidebar-account`,children:(0,S.jsxs)(Hh,{children:[(0,S.jsx)(Uh,{asChild:!0,children:(0,S.jsxs)(`button`,{className:`account-button`,children:[(0,S.jsxs)(`span`,{className:`avatar`,children:[e.user.firstName?.[0],e.user.lastName?.[0]]}),(0,S.jsxs)(`span`,{className:`account-copy`,children:[(0,S.jsx)(`strong`,{children:e.user.name}),(0,S.jsx)(`span`,{children:e.dspView?`Platform owner · Viewing DSP`:a?`Platform owner`:o?.roleName||`No DSP access`})]}),(0,S.jsx)(En,{"aria-hidden":`true`})]})}),(0,S.jsx)(Wh,{align:`start`,children:(0,S.jsxs)(Gh,{children:[(0,S.jsx)(Kh,{asChild:!0,children:(0,S.jsx)(`a`,{href:`#/${a?`platform-settings`:`settings`}`,children:`Account settings`})}),(0,S.jsxs)(Kh,{disabled:g,onSelect:async()=>{_(!0);try{await rn(`/api/auth/logout`,`POST`,{}),$t(null),tn(null),Yt.clear(),location.hash=``,await t()}catch(e){h(e)}finally{_(!1)}},children:[(0,S.jsx)(Pn,{}),`Sign out`]})]})})]})})]});return(0,S.jsxs)(hh.Provider,{value:{session:e,refresh:t},children:[(0,S.jsx)(`a`,{href:`#main-content`,className:`skip-link`,onClick:e=>{e.preventDefault(),document.getElementById(`main-content`)?.focus()},children:`Skip to content`}),(0,S.jsxs)(i,{navigation:y,mobileNavigation:(0,S.jsx)(sm,{open:f,onOpenChange:p,children:(0,S.jsxs)(um,{side:`left`,className:`mobile-sidebar`,children:[(0,S.jsx)(fm,{className:`sr-only`,children:`Navigation`}),(0,S.jsx)(pm,{className:`sr-only`,children:`Your Dispatch workspace pages.`}),y]})}),banner:e.dspView&&(0,S.jsxs)(`div`,{className:`dsp-view-banner`,role:`region`,"aria-label":`DSP viewing mode`,children:[(0,S.jsx)(An,{"aria-hidden":`true`}),(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`strong`,{children:[`Viewing `,o?.organization.name,` as DSP owner`]}),(0,S.jsx)(`span`,{children:`Full owner access. Changes are saved to this DSP.`})]}),(0,S.jsx)($,{variant:`outline`,disabled:g,onClick:()=>void v(),children:g?`Exiting…`:`Exit view`})]}),header:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)($,{className:`mobile-menu`,size:`icon`,variant:`ghost`,"aria-label":`Open navigation`,onClick:()=>p(!0),children:(0,S.jsx)(Fn,{})}),(0,S.jsxs)(`div`,{className:`breadcrumb`,children:[(0,S.jsx)(`span`,{children:a?`Platform`:o?.organization.name||`Workspace`}),(0,S.jsx)(`span`,{"aria-hidden":`true`,children:`/`}),(0,S.jsx)(`strong`,{children:u.label})]})]}),children:[r&&!e.dspView&&(0,S.jsx)(Vm,{children:`The DSP view expired or is no longer available. You’re back in the platform console.`}),(0,S.jsx)(Hm,{error:m}),u.id===`platform`?(0,S.jsx)(ig,{}):u.id===`diagnostics`?(0,S.jsx)(ag,{}):u.id===`updates`?(0,S.jsx)(ch,{hash:n}):u.id===`backups`?(0,S.jsx)(oh,{page:u.id,hash:n},u.id):u.id===`plugins`?(0,S.jsx)(kg,{}):d?(0,S.jsx)(zh,{children:(0,S.jsx)(d,{})},`${u.id}:${s.find(e=>e.pages.some(e=>e.id===u.id))?.revision}`):u.id===`team`?(0,S.jsx)(Mg,{}):u.id===`settings`||u.id===`platform-settings`?(0,S.jsx)(wg,{},u.id):(0,S.jsx)(Rm,{title:u.label})]}),(0,S.jsx)(Vh,{})]})}function Ig(){let[e,t]=(0,x.useState)(null),[n,r]=(0,x.useState)(!1),[i,a]=(0,x.useState)(null),[o,s]=(0,x.useState)(location.hash),[c,l]=(0,x.useState)(0),[u,d]=(0,x.useState)(!1),f=(0,x.useCallback)(async e=>{let n;try{n=e||await nn(`/api/auth/session`)}catch(e){if(!(e instanceof Jt)||e.code!==`dsp_view_unavailable`)throw e;d(!0),n=await nn(`/api/auth/session`)}(n.dspView||!n.authenticated)&&d(!1),n.authenticated||$t(null),tn(n),t(n),r(!0),a(null)},[]);(0,x.useEffect)(()=>{f().catch(e=>{a(e),r(!0)});let e=()=>{s(location.hash),l(e=>e+1)},n=()=>{tn(null),t(null)},i=()=>{d(!0),f().catch(a)};return window.addEventListener(`hashchange`,e),window.addEventListener(`dispatch-session-expired`,n),window.addEventListener(`dispatch-dsp-view-ended`,i),()=>{window.removeEventListener(`hashchange`,e),window.removeEventListener(`dispatch-session-expired`,n),window.removeEventListener(`dispatch-dsp-view-ended`,i)}},[f]),(0,x.useEffect)(()=>{if(!e?.authenticated)return;let t=()=>{f().catch(()=>{})};return window.addEventListener(`focus`,t),()=>window.removeEventListener(`focus`,t)},[e?.authenticated,f]),(0,x.useEffect)(()=>{if(!e?.dspView)return;let t=window.setTimeout(()=>void f().catch(a),Math.max(0,Date.parse(e.dspView.expiresAt)-Date.now())+100);return()=>window.clearTimeout(t)},[e?.dspView?.expiresAt,f]);function p(){if(!n)return(0,S.jsxs)(`div`,{className:`initial-loading`,children:[(0,S.jsx)(lh,{}),(0,S.jsx)(Um,{})]});if(i)return(0,S.jsxs)(`main`,{className:`initial-loading`,children:[(0,S.jsx)(lh,{}),(0,S.jsx)(Hm,{error:i}),(0,S.jsx)($,{onClick:()=>void f().catch(a),children:`Try again`})]});if(o===`#/forgot-password`||o===`#/reset-password`||o.startsWith(`#/reset-password/`))return(0,S.jsx)(ph,{hash:o,session:e,refresh:f},`${o}:${c}`);let t=/^#\/invitation\/([A-Za-z0-9_-]{43})$/.exec(o)?.[1]||null;return!e?.authenticated||t?(0,S.jsx)(Ng,{session:e,refresh:f,token:t}):!e.dspView&&o===`#/onboarding`&&e.memberships.some(t=>t.organizationId===e.activeOrganizationId&&t.organization.status!==`suspended`&&t.permissions.includes(`organization.owner`))?(0,S.jsx)(hh.Provider,{value:{session:e,refresh:f},children:(0,S.jsx)(Tg,{})}):(0,S.jsx)(Fg,{session:e,refresh:f,hash:o,viewEnded:u},`${e.user.id}:${e.dspView?.viewRef||e.activeOrganizationId||`platform`}`)}let m=e?.authenticated?e.user.id:null;return(0,S.jsx)(Qp,{userId:m,children:(0,S.jsx)(nh,{userId:m,children:p()})})}var Lg=document.querySelector(`meta[name=dispatch-style-nonce]`)?.content;Lg&&ss(Lg),(0,b.createRoot)(document.getElementById(`root`)).render((0,S.jsx)(T,{client:Yt,children:(0,S.jsx)(Ig,{})}))})(); \ No newline at end of file diff --git a/dashboard/public/assets/styles.css b/dashboard/public/assets/styles.css index 1d0efc6..ba2533e 100644 --- a/dashboard/public/assets/styles.css +++ b/dashboard/public/assets/styles.css @@ -1,2 +1,2 @@ -.plugin-setting-field{flex-direction:column;gap:.5rem;min-width:0;font-size:.875rem;display:flex}.plugin-setting-field>label,.plugin-setting-toggle label,.plugin-setting-multiple legend{font-weight:500}.plugin-setting-field select,.plugin-setting-field>input{background:var(--background);width:100%;min-height:2.5rem;color:var(--foreground);border:1px solid var(--input);border-radius:.45rem;padding:.5rem .75rem}.plugin-setting-field p,.plugin-setting-toggle p,.plugin-setting-multiple>p{color:var(--muted-foreground);margin:.35rem 0 0;font-size:.8125rem;line-height:1.6}.plugin-setting-toggle{justify-content:space-between;align-items:center;gap:1.25rem;display:flex}.plugin-setting-toggle input{accent-color:var(--primary);flex-shrink:0;width:1.25rem;height:1.25rem}.plugin-setting-multiple{border:0;min-width:0;margin:0;padding:0}.plugin-setting-choice{cursor:pointer;flex:1;align-items:center;gap:.6rem;min-width:0;padding:.6rem 0;font-size:.875rem;display:flex}.plugin-setting-choice input{width:1rem;height:1rem;accent-color:var(--primary);flex-shrink:0}.plugin-setting-choices{border:1px solid var(--border);border-radius:.5rem;margin-top:1rem;overflow:hidden}.plugin-setting-option{border-bottom:1px solid var(--border);align-items:center;gap:.5rem;padding:.35rem .85rem;display:flex}.plugin-setting-option:last-child{border-bottom:0}.plugin-setting-count{white-space:nowrap;color:var(--muted-foreground);margin-left:auto;font-size:.75rem}.plugin-setting-order{flex-shrink:0;display:flex}.plugin-settings-page{flex-direction:column;gap:1.5rem;max-width:56rem;display:flex}.plugin-settings-back{color:var(--muted-foreground);width:max-content;font-size:.8125rem}.plugin-settings-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.5rem;margin-top:1.5rem;display:grid}.plugin-setting-wide{grid-column:1/-1}.plugin-settings-defaults,.plugin-settings-footer{color:var(--muted-foreground);justify-content:space-between;align-items:center;gap:1rem;font-size:.8125rem;display:flex}.plugin-settings-footer{border-top:1px solid var(--border);padding-top:1.25rem}.plugin-settings-footer>div{gap:.5rem;display:flex}.plugin-settings-description{color:var(--muted-foreground);margin-top:1rem;font-size:.875rem}@media (width<=580px){.plugin-settings-fields{grid-template-columns:1fr}.plugin-settings-footer{flex-wrap:wrap}.plugin-settings-footer>div{margin-left:auto}.plugin-settings-page [role=tablist]{flex-wrap:wrap;height:auto}.plugin-settings-defaults{align-items:flex-start}}@media (width<=480px){.plugin-setting-choice{flex-wrap:wrap}.plugin-setting-count{margin-left:1.6rem}.plugin-setting-field select,.plugin-setting-field>input{font-size:1rem}.plugin-setting-option{padding:.3rem .65rem}}.plugin-setting-toggle input{appearance:none;background:var(--muted);border:1px solid var(--border);cursor:pointer;border-radius:999px;width:2.5rem;height:1.4rem;transition:background .15s;position:relative}.plugin-setting-toggle input:after{content:"";background:var(--foreground);border-radius:50%;width:.95rem;height:.95rem;transition:transform .15s;position:absolute;top:.15rem;left:.15rem}.plugin-setting-toggle input:checked{background:var(--primary)}.plugin-setting-toggle input:checked:after{background:var(--primary-foreground);transform:translate(1.1rem)}.plugin-setting-toggle input:focus-visible{outline:2px solid var(--ring);outline-offset:3px}.plugin-setting-source{color:var(--muted-foreground);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.35rem;font-size:.75rem;display:flex}.plugin-setting-help{color:var(--muted-foreground);overflow-wrap:anywhere;margin-top:.25rem;font-size:.75rem;line-height:1.5}.plugin-setting-field select:disabled,.plugin-setting-field input:disabled,.plugin-setting-multiple input:disabled{opacity:.55;cursor:not-allowed}.plugin-settings-preview,.plugin-settings-rule,.plugin-settings-effect{border:1px solid var(--border);overflow-wrap:anywhere;border-radius:.5rem;margin-top:1rem;padding:.85rem 1rem;font-size:.875rem;line-height:1.6}.plugin-settings-rule{border-inline-start:3px solid var(--primary)}.plugin-settings-history{border:1px solid var(--border);border-radius:.5rem;min-width:0;padding:1rem;font-size:.8125rem}.plugin-settings-history h2{font-size:1rem;font-weight:600}.plugin-settings-history>p{color:var(--muted-foreground);margin:.5rem 0 1rem}.plugin-settings-history>details{border-top:1px solid var(--border);padding:.75rem 0}.plugin-settings-history summary{cursor:pointer;overflow-wrap:anywhere;line-height:1.6}.plugin-settings-history ul{margin:.75rem 0 .75rem 1.25rem;list-style:outside}.plugin-settings-history li{overflow-wrap:anywhere;margin-bottom:.5rem}.plugin-settings-history-actions,.plugin-settings-history-pagination{flex-wrap:wrap;gap:.5rem;margin-top:1rem;display:flex}.plugin-settings-history-actions>details{width:100%}.plugin-settings-page [role=tabpanel]>button{margin-top:1rem}@media (width<=580px){.plugin-settings-defaults{flex-wrap:wrap;justify-content:flex-start}.plugin-settings-defaults>span{flex-basis:100%}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-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-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-family);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-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:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){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}*{border-color:var(--border)}body{min-width:320px;font-size:var(--body-size);margin:0;line-height:1.5}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:default}a{text-decoration:none}h1,h2,h3,p{margin:0}h2{letter-spacing:-.25px;font-size:16px;font-weight:600}svg{flex-shrink:0}:focus-visible{outline:2px solid var(--ring);outline-offset:3px}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.\@container\/field-group{container:field-group/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-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-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\[90dvh\]{max-height:90dvh}.min-h-4{min-height:calc(var(--spacing) * 4)}.w-48{width:calc(var(--spacing) * 48)}.w-\[28\%\]{width:28%}.w-\[45\%\]{width:45%}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-items-start{justify-items:start}.gap-1{gap:var(--spacing)}.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-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-\[Canvas\]{background-color:canvas}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/15{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.bg-black\/15{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted,.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.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-sm\/relaxed{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.whitespace-nowrap{white-space:nowrap}.text-\[CanvasText\]{color:canvastext}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-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-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.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-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}.group-has-\[\[data-orientation\=horizontal\]\]\/field\:text-balance:is(:where(.group\/field):has([data-orientation=horizontal]) *){text-wrap:balance}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *),.group-data-\[disabled\=true\]\/field\:opacity-50:is(:where(.group\/field)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-data-\[variant\=outline\]\/field-group\:-mb-2:is(:where(.group\/field-group)[data-variant=outline] *){margin-bottom:calc(var(--spacing) * -2)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:mt-0:last-child{margin-top:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.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(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[state\=checked\]\:border-primary:has([data-state=checked]){border-color:var(--primary)}.has-data-\[state\=checked\]\:bg-primary\/5:has([data-state=checked]){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.has-data-\[state\=checked\]\:bg-primary\/5:has([data-state=checked]){background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.has-\[select\:disabled\]\:opacity-50:has(:is(select:disabled)){opacity:.5}.has-\[\>\[data-slot\=checkbox-group\]\]\:gap-3:has(>[data-slot=checkbox-group]){gap:calc(var(--spacing) * 3)}.has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}.has-\[\>\[data-slot\=field\]\]\:w-full:has(>[data-slot=field]){width:100%}.has-\[\>\[data-slot\=field\]\]\:flex-col:has(>[data-slot=field]){flex-direction:column}.has-\[\>\[data-slot\=field\]\]\:rounded-md:has(>[data-slot=field]){border-radius:var(--radius)}.has-\[\>\[data-slot\=field\]\]\:border:has(>[data-slot=field]){border-style:var(--tw-border-style);border-width:1px}.has-\[\>\[data-slot\=radio-group\]\]\:gap-3:has(>[data-slot=radio-group]){gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--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(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:var(--destructive)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:py-1[data-size=sm]{padding-block:var(--spacing)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.data-\[slot\=checkbox-group\]\:gap-3[data-slot=checkbox-group]{gap:calc(var(--spacing) * 3)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:duration-200[data-state=open]{--tw-duration:.2s;transition-duration:.2s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}.data-\[variant\=label\]\:text-sm[data-variant=label]{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.data-\[variant\=legend\]\:text-base[data-variant=legend]{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}.nth-last-2\:-mt-1:nth-last-child(2){margin-top:calc(var(--spacing) * -1)}@media (width>=40rem){.sm\:max-w-\[440px\]{max-width:440px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container field-group (width>=28rem){.\@md\/field-group\:flex-row{flex-direction:row}.\@md\/field-group\:items-center{align-items:center}.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}}.dark\:border-input:where([data-theme=dark],[data-theme=dark] *){border-color:var(--input)}.dark\:bg-destructive\/60:where([data-theme=dark],[data-theme=dark] *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:where([data-theme=dark],[data-theme=dark] *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:has-data-\[state\=checked\]\:bg-primary\/10:where([data-theme=dark],[data-theme=dark] *):has([data-state=checked]){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:has-data-\[state\=checked\]\:bg-primary\/10:where([data-theme=dark],[data-theme=dark] *):has([data-state=checked]){background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:where([data-theme=dark],[data-theme=dark] *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:where([data-theme=dark],[data-theme=dark] *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where([data-theme=dark],[data-theme=dark] *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where([data-theme=dark],[data-theme=dark] *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_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)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6 svg:not([class*=size-]){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>\*\]\:data-\[slot\=field\]\:p-4>[data-slot=field]{padding:calc(var(--spacing) * 4)}@container field-group (width>=28rem){.\@md\/field-group\:\[\&\>\*\]\:w-auto>*{width:auto}}.\[\&\>\.sr-only\]\:w-auto>.sr-only{width:auto}.\[\&\>\[data-slot\=field-group\]\]\:gap-4>[data-slot=field-group]{gap:calc(var(--spacing) * 4)}.\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}@container field-group (width>=28rem){.\@md\/field-group\:\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}@container field-group (width>=28rem){:is(.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}}.\[\&\>a\]\:underline>a{text-decoration-line:underline}.\[\&\>a\]\:underline-offset-4>a{text-underline-offset:4px}.\[\&\>a\:hover\]\:text-primary>a:hover{color:var(--primary)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}[data-variant=legend]+.\[\[data-variant\=legend\]\+\&\]\:-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.backup-workspace,.backup-dialog{--backup-ink:var(--foreground);--backup-muted:var(--muted-foreground);--backup-border:var(--border);--backup-blue:var(--primary);color:var(--backup-ink);font-size:14px;line-height:1.5}.backup-workspace h1{letter-spacing:-.7px;margin:0;font-size:32px;line-height:1.2}.backup-workspace h2,.backup-dialog h2{letter-spacing:-.25px;margin:0 0 20px;font-size:18px;line-height:1.4}.backup-workspace h3,.backup-dialog h3{margin:0 0 12px;font-size:15px;line-height:1.5}.backup-workspace p,.backup-dialog p{line-height:1.6}.backup-workspace input,.backup-workspace select,.backup-dialog input,.backup-dialog select{font:inherit;color:inherit}.backup-workspace select,.backup-workspace input:not([type=checkbox]),.backup-dialog select,.backup-dialog input:not([type=checkbox]){border:1px solid var(--input);background:var(--background);border-radius:6px;max-width:100%;min-height:40px;padding:9px 12px;font-size:13px}.backup-workspace input[type=checkbox],.backup-dialog input[type=checkbox]{width:18px;height:18px;accent-color:var(--backup-blue);flex-shrink:0}.backup-header{justify-content:space-between;align-items:center;gap:20px;margin-bottom:24px;display:flex}.backup-actions{flex-wrap:wrap;align-items:center;gap:18px;display:flex}.backup-button{border:1px solid var(--backup-border);min-height:40px;font:600 13px/1.3 var(--font-family);cursor:pointer;background:var(--background);color:var(--backup-ink);border-radius:7px;justify-content:center;align-items:center;gap:9px;padding:10px 17px;text-decoration:none;transition:background .15s;display:inline-flex}.backup-button-primary{color:var(--primary-foreground);background:var(--backup-blue);border-color:var(--backup-blue)}.backup-button-primary:hover{background:var(--primary-hover)}.backup-button-secondary:hover{background:var(--accent)}.backup-button-warning{background:var(--warning-button);color:var(--warning-button-foreground);border-color:var(--warning-border)}.backup-button-warning:hover{background:var(--warning-button)}.backup-button-icon{background:0 0;border-color:#0000;min-width:36px;min-height:36px;padding:8px}.backup-workspace button:disabled,.backup-dialog button:disabled,.backup-dialog input:disabled{opacity:.5;cursor:not-allowed}.backup-link{color:var(--backup-blue);align-items:center;gap:8px;font-size:13px;font-weight:600;text-decoration:none;display:inline-flex}.backup-link:hover{text-decoration:underline}.backup-icon{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;flex:0 0 20px;width:20px;height:20px}.backup-tabs{border-bottom:1px solid var(--backup-border);gap:32px;margin-bottom:26px;display:flex;overflow-x:auto}.backup-tabs a{color:var(--foreground);white-space:nowrap;border-bottom:3px solid #0000;padding:0 4px 17px;font-size:14px}.backup-tabs a[aria-current=page]{border-color:var(--backup-blue);color:var(--backup-blue)}.backup-card{background:var(--background);border:1px solid var(--backup-border);border-radius:10px;min-width:0;padding:24px}.backup-card-title{align-items:center;gap:15px;display:flex}.backup-icon-tile{background:var(--selection);width:40px;height:40px;color:var(--primary);border-radius:11px;flex:0 0 40px;justify-content:center;align-items:center;display:inline-flex}.backup-icon-tile.warning{background:var(--warning-surface);color:var(--warning)}.backup-icon-tile.success{background:var(--success-surface);color:var(--success)}.backup-overview-grid{grid-template-columns:minmax(0,2.2fr) minmax(300px,1fr);align-items:start;gap:22px;margin-bottom:22px;display:grid}.backup-stack{gap:22px;min-width:0;display:grid}.backup-attention{border:1px solid var(--warning-border);background:var(--warning-surface);border-radius:10px;align-items:center;gap:20px;padding:24px;display:flex}.backup-attention .backup-icon-tile{border:1px solid var(--warning-border);flex-basis:64px;width:64px;height:64px}.backup-attention .backup-icon-tile svg{width:30px;height:30px}.backup-attention h2{margin:0 0 6px;font-size:17px}.backup-attention p{margin:0;font-size:13px}.backup-attention>div{flex:1}.backup-attention .backup-button{flex-shrink:0}.backup-pairs{margin:0 0 18px}.backup-pairs>div{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:18px;padding:14px 0;font-size:13px;display:flex}.backup-pairs dt{font-weight:500}.backup-pairs dd{text-align:right;overflow-wrap:anywhere;margin:0}.backup-muted{color:var(--backup-muted);font-size:13px}.backup-toolbar{flex-wrap:wrap;align-items:end;gap:16px;margin:0 0 22px;display:flex}.backup-search-wrap{align-items:center;width:320px;max-width:100%;display:flex;position:relative}.backup-search-wrap>svg{color:var(--muted-foreground);pointer-events:none;position:absolute;left:12px}.backup-search-wrap input{width:100%;padding-left:40px!important}.backup-search-wrap input::placeholder{color:var(--muted-foreground)}.backup-table-scroll{max-width:100%;overflow-x:auto}.backup-table{border-collapse:separate;border-spacing:0;text-align:left;width:100%;min-width:570px;margin:0}.backup-table th{text-transform:uppercase;letter-spacing:.04em;color:var(--foreground);background:var(--background);border:0;height:auto;padding:8px 12px 17px;font-size:11px;font-weight:600;line-height:1.4}.backup-table td{border-bottom:1px solid var(--border);background:var(--background);vertical-align:middle;height:auto;padding:17px 12px;font-size:13px;line-height:1.5}.backup-table td:first-child{padding-left:12px}.backup-table tbody tr:first-child td:first-child{border-top-left-radius:8px}.backup-table tbody tr:first-child td:last-child{border-top-right-radius:8px}.backup-table td:first-child{border-left:1px solid var(--border)}.backup-table td:last-child{border-right:1px solid var(--border);text-align:right}.backup-table tbody tr:last-child td:first-child{border-bottom-left-radius:8px}.backup-table tbody tr:last-child td:last-child{border-bottom-right-radius:8px}.backup-table tr:hover td{background:var(--accent)}.backup-dsp-name{color:var(--backup-ink);font-size:13px;font-weight:600}.backup-table .backup-dsp-name{white-space:nowrap}.backup-avatar{width:38px;height:42px;color:var(--primary);background:var(--selection);border-radius:10px;flex:0 0 38px;justify-content:center;align-items:center;font-size:15px;font-weight:600;display:inline-flex}.backup-avatar.tone-1{color:var(--success);background:var(--success-surface)}.backup-avatar.tone-2{color:var(--warning);background:var(--warning-surface)}.backup-avatar.tone-3{color:var(--violet);background:var(--violet-surface)}.backup-status{white-space:nowrap;color:var(--muted-foreground);align-items:center;gap:8px;font-size:13px;font-weight:500;display:inline-flex}.backup-status.verified,.backup-status.completed{color:var(--success)}.backup-status.failed{color:var(--warning)}.backup-status.running,.backup-status.pending,.backup-status.queued{color:var(--primary)}.backup-note{border:1px solid var(--border);background:var(--surface);border-radius:8px;align-items:center;gap:12px;margin:20px 0;padding:18px 20px;font-size:13px;line-height:1.6;display:flex}.backup-note>span{flex:1;min-width:0}.backup-note .backup-link{flex-shrink:0}.backup-note-warning{border-color:var(--warning-border);color:var(--warning);background:var(--warning-surface)}.backup-note-check,.backup-note-shield{color:var(--foreground)}.backup-card>.backup-note:last-child{background:0 0;border:0;margin:20px 0 0;padding:8px 0 0}.backup-core-note{margin:6px 0 0}.backup-activity{margin:0 0 22px;padding:0;list-style:none}.backup-activity li+li{border-top:1px solid var(--border)}.backup-activity-entry{grid-template-columns:36px minmax(0,1fr) minmax(72px,.6fr);align-items:center;gap:12px;padding:17px 0;display:grid}.backup-activity-entry:hover strong{color:var(--backup-blue)}.backup-activity-entry .backup-icon-tile{width:36px;height:36px}.backup-activity strong{font-size:13px;font-weight:600;display:block}.backup-activity small{color:var(--backup-muted);margin-top:3px;font-size:12px;display:block}.backup-activity time{color:var(--backup-muted);text-align:right;font-size:12px}.backup-breadcrumb{color:var(--backup-muted);flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 20px;font-size:13px;display:flex}.backup-breadcrumb svg{flex-basis:13px;width:13px;height:13px}.backup-page-title{justify-content:space-between;align-items:center;gap:18px;margin-bottom:24px;display:flex}.backup-page-title h2{margin:0;font-size:26px}.backup-page-title p{margin:6px 0 0}.backup-summary{border:1px solid var(--backup-border);background:var(--background);border-radius:8px;flex-wrap:wrap;align-items:center;gap:24px;margin-bottom:20px;padding:20px;font-size:13px;display:flex}.backup-workspace>.backup-card{margin-bottom:20px}.backup-pagination{color:var(--backup-muted);justify-content:space-between;align-items:center;gap:20px;padding-top:20px;font-size:12px;display:flex}.backup-pagination .backup-button{min-height:34px;padding:8px 10px}.backup-field{flex-direction:column;gap:8px;margin:0;font-size:13px;display:flex}.backup-field>span{font-weight:600}.backup-form-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;display:grid}.backup-field input:not([type=checkbox]),.backup-field select{width:100%}.backup-card-heading{justify-content:space-between;align-items:center;gap:20px;margin-bottom:22px;display:flex}.backup-card-heading h2,.backup-card-heading h3{margin:0}.backup-card-heading .backup-field{flex-direction:row;align-items:center}.backup-form-section{border-top:1px solid var(--backup-border);margin-top:26px;padding-top:24px}.backup-form-section .backup-field{max-width:560px}.backup-form-footer{border-top:1px solid var(--backup-border);justify-content:flex-end;align-items:center;gap:12px;margin-top:24px;padding-top:24px;display:flex}.backup-switch{appearance:none;background:var(--input);cursor:pointer;border-radius:20px;position:relative;width:42px!important;height:24px!important}.backup-switch:checked{background:var(--success)}.backup-switch:after{content:"";background:var(--background);border-radius:50%;width:18px;height:18px;transition:transform .15s;position:absolute;top:3px;left:3px}.backup-switch:checked:after{transform:translate(18px)}.backup-filter-tabs{gap:10px;margin-bottom:22px;display:flex}.backup-filter-tabs button[aria-pressed=true]{background:var(--selection);border-color:var(--primary);color:var(--backup-blue)}.backup-detail-pairs{grid-template-columns:repeat(3,minmax(0,1fr));gap:0 28px;margin-top:20px;display:grid}.backup-detail-pairs>div{flex-direction:column;align-items:flex-start;gap:5px}.backup-detail-pairs dd{text-align:left}.backup-empty{text-align:center;color:var(--backup-muted);padding:36px 20px}.backup-empty>svg{margin:0 auto 14px}.backup-empty h3{color:var(--backup-ink)}.backup-empty p{margin:8px 0 18px}.backup-notice{background:var(--selection);border:1px solid var(--selection);border-radius:8px;margin:0 0 20px;padding:14px 18px;font-size:13px}.backup-error{color:var(--destructive);font-size:13px;line-height:1.6}.backup-error:empty{display:none}.backup-progress{background:var(--selection);border-radius:8px;width:100%;height:7px;margin:24px 0;display:block;position:relative;overflow:hidden}.backup-progress:after{content:"";background:var(--backup-blue);border-radius:inherit;width:35%;animation:1.8s ease-in-out infinite alternate backup-progress;position:absolute;inset:0 auto 0 0}@keyframes backup-progress{to{transform:translate(185%)}}.backup-stages{margin:24px 0;padding:0;list-style:none}.backup-stages li{border-bottom:1px solid var(--border);grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:14px;padding:22px 0;display:grid}.backup-stages small{color:var(--backup-muted);font-size:12px}.backup-stages .done>svg{color:var(--success)}.backup-stages .active{color:var(--backup-blue)}.backup-stages .pending{color:var(--muted-foreground)}.backup-issue-card>h3{margin:20px 0 10px}.backup-technical{border-top:1px solid var(--backup-border);margin-top:26px;padding-top:22px}.backup-technical summary{cursor:pointer;font-weight:600}.backup-technical .backup-pairs{margin-top:12px}.backup-dialog{border:1px solid var(--border);background:var(--background);width:min(680px,100% - 32px);max-height:calc(100dvh - 32px);box-shadow:0 24px 80px var(--shadow-color);border-radius:12px;padding:28px;overflow-y:auto}.backup-dialog .backup-card-heading{margin-bottom:10px}.backup-dialog h2{font-size:23px}.backup-dialog .backup-pairs{margin-top:14px}.backup-dialog .backup-note{margin:18px 0;padding:14px}.backup-check-row{flex-direction:row-reverse;justify-content:flex-end;align-items:center;gap:12px;margin:20px 0}.backup-check-row span{font-weight:400}.backup-selection-list{border:1px solid var(--backup-border);border-radius:7px;max-height:360px;overflow-y:auto}.backup-selection-row{cursor:pointer;align-items:center;gap:14px;padding:13px;display:flex}.backup-selection-row+.backup-selection-row{border-top:1px solid var(--border)}.backup-selection-row strong{flex:1;font-size:13px;font-weight:600}.backup-selection-row .backup-status{font-size:12px}.backup-workspace :focus-visible,.backup-dialog :focus-visible{outline:3px solid var(--ring);outline-offset:3px}.backup-spin{animation:1.5s linear infinite backup-spin}@keyframes backup-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.backup-spin,.backup-progress:after{animation:none}}@media (width<=1250px){.backup-overview-grid{grid-template-columns:minmax(0,1.7fr) minmax(280px,1fr)}.backup-attention{flex-wrap:wrap}.backup-attention>div{min-width:200px}.backup-header .backup-actions{gap:14px}.backup-header .backup-status{font-size:12px}.backup-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=1050px){.backup-overview-grid{grid-template-columns:1fr}.backup-overview-grid>aside.backup-stack{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-page-title{flex-wrap:wrap}.backup-header{align-items:flex-start}.backup-header .backup-actions{justify-content:flex-end}}@media (width<=760px){.backup-table{display:table}.backup-table thead{display:table-header-group}.backup-table tbody{padding:0;display:table-row-group}.backup-table tr{border:0;padding:0;display:table-row}.backup-table td{display:table-cell}.backup-table td:before{display:none}.backup-detail-pairs{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-toolbar>.backup-field{flex:1;min-width:130px}.backup-overview-grid>aside.backup-stack{grid-template-columns:1fr}}@media (width<=600px){.backup-header{flex-direction:column;gap:20px}.backup-header .backup-actions{justify-content:flex-start;gap:16px}.backup-header h1{font-size:28px}.backup-tabs{gap:22px}.backup-tabs a{padding-bottom:13px;font-size:13px}.backup-card{padding:18px}.backup-attention{gap:14px;padding:18px}.backup-attention .backup-icon-tile{flex-basis:42px;width:42px;height:42px}.backup-attention>div{min-width:150px}.backup-attention h2{font-size:16px}.backup-attention .backup-button{margin-left:56px}.backup-note{flex-wrap:wrap;gap:10px;padding:14px}.backup-note>span{flex-basis:calc(100% - 40px)}.backup-core-note .backup-link{margin-left:30px}.backup-form-grid,.backup-detail-pairs{grid-template-columns:1fr}.backup-page-title h2{font-size:23px}.backup-page-title .backup-actions{gap:12px;width:100%}.backup-page-title select{width:100%}.backup-card-heading{flex-wrap:wrap;gap:12px}.backup-pagination{flex-wrap:wrap}.backup-dialog{padding:20px}.backup-dialog h2{font-size:20px}.backup-selection-row{flex-wrap:wrap;gap:10px}.backup-selection-row .backup-status{flex-basis:calc(100% - 28px);margin-left:28px}.backup-selection-row .backup-avatar{flex-basis:30px;width:30px;height:34px}.backup-selection-row strong{min-width:140px}.backup-stages li{grid-template-columns:24px minmax(0,1fr)}.backup-stages small{grid-column:2}.backup-summary{gap:14px}.backup-form-footer{flex-wrap:wrap}.backup-toolbar .backup-search-wrap{width:100%}}.backup-table td{padding-block:10px}.backup-attention{padding-block:20px}.backup-core-note>span{flex:0 auto}.backup-core-note>.backup-link{border:1px solid var(--border);background:var(--background);border-radius:6px;padding:6px 12px}.backup-attention .backup-icon-tile .backup-icon{flex-basis:30px;width:30px;height:30px}@media (width<=600px){.backup-dsp-table-wrap .backup-table{min-width:0;display:block}.backup-dsp-table-wrap .backup-table thead{clip-path:inset(50%);width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.backup-dsp-table-wrap .backup-table tbody{display:block}.backup-dsp-table-wrap .backup-table tr{border-bottom:1px solid var(--border);border-radius:0;grid-template-columns:minmax(0,1fr) 24px;gap:6px 8px;margin:0;padding:13px 0;display:grid}.backup-dsp-table-wrap .backup-table td{grid-column:1;display:block;border:0!important;padding:0!important}.backup-dsp-table-wrap .backup-table td:last-child{grid-area:1/2/4;align-self:center}.backup-dsp-table-wrap .backup-table td:nth-child(2),.backup-dsp-table-wrap .backup-table td:nth-child(3){padding-left:46px!important}.backup-dsp-table-wrap .backup-table td:nth-child(2){color:var(--backup-muted);font-size:12px}.backup-dsp-table-wrap .backup-table .backup-dsp-name{white-space:normal;gap:10px}.backup-dsp-table-wrap .backup-avatar{flex-basis:36px;width:36px;height:36px}}.backup-fleet-summary{border:1px solid var(--backup-border);background:var(--background);border-radius:10px;grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 30px;padding:30px 24px;display:grid}.backup-fleet-metric{align-items:center;gap:24px;padding:0 24px;display:flex}.backup-fleet-metric+.backup-fleet-metric{border-left:1px solid var(--backup-border)}.backup-fleet-metric .backup-icon-tile{border-radius:18px;flex-basis:68px;width:68px;height:68px}.backup-fleet-metric .backup-icon{flex-basis:30px;width:30px;height:30px;animation:none}.backup-fleet-metric dd{margin:0 0 2px;font-size:32px;font-weight:700;line-height:1.2}.backup-fleet-metric.success dd{color:var(--success)}.backup-fleet-metric.warning dd{color:var(--warning)}.backup-overview-issues{border-color:var(--warning-border);padding:22px}.backup-overview-issues h2{color:var(--warning);align-items:center;gap:12px;margin-bottom:18px;font-size:16px;display:flex}.backup-overview-issues h2 .backup-icon{flex-basis:25px;width:25px;height:25px}.backup-issue-row{align-items:center;gap:20px;display:flex}.backup-issue-row+.backup-issue-row{border-top:1px solid var(--warning-border);margin-top:18px;padding-top:18px}.backup-issue-row>div{flex:1;min-width:0}.backup-issue-row strong{font-size:15px}.backup-issue-row p{margin:6px 0 0}.backup-issue-row>.backup-link{flex-shrink:0}.backup-issue-row .backup-avatar{width:58px;height:58px;color:var(--warning);background:var(--warning-surface);border-radius:14px;flex-basis:58px;font-size:20px}.backup-overview-issues>.backup-link{margin-top:20px}.backup-dashboard-grid .backup-activity-entry{padding:14px 0}.backup-dashboard-grid .backup-activity{margin-bottom:20px}.backup-dashboard-grid .backup-card-title{margin-bottom:26px}.backup-next-layout{grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:24px;margin:38px 0;display:grid}.backup-next-when{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.backup-next-when strong{white-space:nowrap;font-size:30px;line-height:1.3}.backup-next-when .backup-muted{overflow-wrap:anywhere;font-size:13px}.backup-next-policy{border-left:1px solid var(--backup-border);align-content:start;gap:20px;padding-left:24px;font-size:13px;display:grid}.backup-next-policy>div{align-items:center;gap:14px;display:flex}.backup-next-policy .backup-icon{color:var(--backup-muted)}.backup-core-summary>.backup-status{margin:4px 0 0;font-size:15px;font-weight:600}.backup-core-summary>p{margin:10px 0 30px 28px}.backup-core-summary>.backup-link{margin-right:22px}.backup-inspector{border:1px solid var(--backup-border);background:var(--background);border-radius:10px;grid-template-columns:minmax(300px,1fr) minmax(0,2.05fr);min-height:640px;display:grid;overflow:hidden}.backup-dsp-navigator{border-right:1px solid var(--backup-border);min-width:0;padding:28px 16px}.backup-dsp-navigator .backup-toolbar{flex-wrap:nowrap;gap:16px;margin:0 10px 26px}.backup-dsp-navigator .backup-search-wrap{flex:1;min-width:0}.backup-dsp-navigator select{width:145px;min-width:0}.backup-dsp-list{max-height:550px;scroll-padding:8px;overflow-y:auto}.backup-dsp-option{border:1px solid #0000;border-bottom-color:var(--border);color:var(--backup-ink);border-radius:0;align-items:center;gap:16px;padding:20px 16px;text-decoration:none;display:flex}.backup-dsp-option strong{overflow-wrap:anywhere;flex:1;min-width:0;font-size:13px;line-height:1.5}.backup-dsp-option .backup-status{flex-shrink:0;font-size:12px}.backup-dsp-option .backup-avatar{flex-basis:42px;width:42px;height:42px}.backup-dsp-option:hover{background:var(--accent)}.backup-dsp-option[aria-current=page]{background:var(--selection);border-color:var(--border);border-radius:7px}.backup-dsp-inspector-detail{min-width:0;padding:36px 30px}.backup-inspector-heading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:25px;display:flex}.backup-inspector-heading>div{flex-wrap:wrap;align-items:center;gap:22px;display:flex}.backup-inspector-heading h2{margin:0;font-size:28px}.backup-inspector-heading .backup-button{flex-shrink:0}.backup-inspector-heading .backup-status{background:var(--muted);border-radius:6px;padding:7px 12px}.backup-inspector-heading .backup-status.verified{background:var(--success-surface)}.backup-inspector-heading .backup-status.failed{background:var(--warning-surface)}.backup-inspector-heading .backup-status.running,.backup-inspector-heading .backup-status.pending{background:var(--selection)}.backup-inspector-metadata{color:var(--backup-muted);border-bottom:1px solid var(--backup-border);flex-wrap:wrap;align-items:center;gap:22px;margin-bottom:30px;padding-bottom:30px;font-size:13px;display:flex}.backup-inspector-metadata>span{align-items:center;gap:10px;display:flex}.backup-inspector-metadata>span+span{border-left:1px solid var(--backup-border);padding-left:22px}.backup-dsp-inspector-detail>h3{margin-bottom:26px;font-size:17px}.backup-dsp-inspector-detail>.backup-note{margin-bottom:26px}.backup-dsp-inspector-detail>.backup-link{margin-top:26px}.backup-inspector-history .backup-table{min-width:550px}.backup-inspector-history .backup-table th{padding-left:12px}.backup-inspector-history .backup-table td{border-left:0;border-right:0;padding:19px 12px}.backup-inspector-history .backup-table tbody tr:first-child td{background:var(--surface)}.backup-inspector-history .backup-table td:last-child{white-space:nowrap}@media (width<=1500px){.backup-fleet-metric{gap:16px;padding-inline:16px}.backup-fleet-metric .backup-icon-tile{flex-basis:54px;width:54px;height:54px}.backup-dsp-navigator .backup-toolbar{flex-wrap:wrap}.backup-dsp-navigator .backup-search-wrap{flex-basis:100%}.backup-dsp-navigator select{width:100%}.backup-dsp-option{flex-wrap:wrap;gap:8px 12px}.backup-dsp-option .backup-status{flex-basis:calc(100% - 54px);margin-left:54px}.backup-inspector-heading{flex-wrap:wrap;align-items:flex-start}.backup-next-layout{grid-template-columns:1fr;margin:26px 0}.backup-next-policy{border-left:0;gap:12px;padding-left:0}}@media (width<=1100px){.backup-fleet-summary{padding:24px 12px}.backup-fleet-metric{gap:12px;padding-inline:12px}.backup-fleet-metric .backup-icon-tile{display:none}.backup-fleet-metric dd{font-size:28px}.backup-dashboard-grid{grid-template-columns:1fr}.backup-dashboard-grid>aside.backup-stack{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-inspector{grid-template-columns:1fr}.backup-dsp-navigator{border-right:0;border-bottom:1px solid var(--backup-border);padding:20px}.backup-dsp-navigator .backup-toolbar{flex-wrap:nowrap;margin:0 0 16px}.backup-dsp-navigator select{width:180px}.backup-dsp-list{max-height:255px}.backup-dsp-option{flex-wrap:nowrap}.backup-dsp-option .backup-status{flex-basis:auto;margin-left:0}.backup-inspector-heading{flex-wrap:nowrap}}@media (width<=600px){.backup-fleet-summary{grid-template-columns:repeat(2,minmax(0,1fr));gap:0;padding:10px 18px}.backup-fleet-metric{padding:18px 12px}.backup-fleet-metric:nth-child(3){border-left:0}.backup-fleet-metric:nth-child(n+3){border-top:1px solid var(--backup-border)}.backup-fleet-metric dt{font-size:12px}.backup-dashboard-grid>aside.backup-stack{grid-template-columns:1fr}.backup-issue-row{flex-wrap:wrap;gap:12px}.backup-issue-row>.backup-link{margin-left:70px}.backup-next-layout{grid-template-columns:1fr}.backup-next-policy{border-left:0;padding-left:0}.backup-dsp-inspector-detail{padding:24px 18px}.backup-inspector-heading{flex-wrap:wrap}.backup-inspector-heading h2{font-size:23px}.backup-dsp-navigator .backup-toolbar{flex-wrap:wrap}.backup-dsp-navigator select{width:100%}.backup-dsp-option{gap:8px;padding:14px 10px}.backup-dsp-option strong{font-size:12px}.backup-dsp-option .backup-status{gap:5px;font-size:11px}.backup-dsp-option .backup-avatar{flex-basis:32px;width:32px;height:36px}.backup-inspector-metadata{gap:14px}.backup-inspector-metadata>span+span{border-left:0;padding-left:0}.backup-issue-row{grid-template-columns:58px minmax(0,1fr);align-items:start;display:grid}.backup-issue-row>.backup-link{grid-column:2;margin-left:0}.backup-inspector-history .backup-table{min-width:0;display:block}.backup-inspector-history .backup-table thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-inspector-history .backup-table tbody{display:block}.backup-inspector-history .backup-table tr{border-bottom:1px solid var(--backup-border);grid-template-columns:minmax(0,1fr) auto;gap:5px 10px;margin:0;padding:16px 0;display:grid}.backup-inspector-history .backup-table td{grid-column:1;padding:0;display:block;background:0 0!important;border:0!important}.backup-inspector-history .backup-table td:first-child{font-weight:600}.backup-inspector-history .backup-table td:last-child{grid-area:1/2/span 3;align-self:center}.backup-inspector-history .backup-table tbody tr:first-child{background:var(--surface)}}.backup-workspace.backup-streamlined{--backup-section-gap:36px;min-width:0;font-size:15px}.backup-streamlined .backup-header{align-items:center;margin-bottom:46px}.backup-workspace.backup-streamlined h1{letter-spacing:-1.2px;font-size:38px;font-weight:600}.backup-streamlined .backup-tabs{gap:36px;margin-bottom:0}.backup-streamlined .backup-tabs a{padding:0 6px 20px;font-size:15px;font-weight:450}.backup-streamlined .backup-header .backup-actions{gap:28px}.backup-streamlined .backup-button{min-height:44px;padding:11px 18px;font-size:15px}.backup-streamlined .backup-link{font-size:15px;font-weight:450}.backup-streamlined .backup-button-text{color:var(--primary);background:0 0;border:0;justify-content:flex-start;min-height:32px;padding:0;font-weight:450}.backup-streamlined .backup-button-text:hover{text-decoration:underline}.backup-streamlined .backup-split{grid-template-columns:minmax(0,2.2fr) minmax(250px,1fr);gap:0;min-height:550px;display:grid}.backup-streamlined .backup-split:has(>aside[hidden]){grid-template-columns:minmax(0,1fr)}.backup-streamlined .backup-main{min-width:0;padding:36px 42px 40px 0}.backup-streamlined .backup-rail{border-left:1px solid var(--border);min-width:0;padding:36px 0 40px 34px}.backup-streamlined .backup-rail[hidden]{display:none}.backup-streamlined .backup-section{min-width:0}.backup-streamlined .backup-section>h2,.backup-streamlined .backup-scope-heading h2{letter-spacing:-.35px;margin:0 0 24px;font-size:19px;font-weight:600}.backup-streamlined .backup-main>.backup-section+.backup-section{margin-top:var(--backup-section-gap);padding-top:var(--backup-section-gap);border-top:1px solid var(--border)}.backup-streamlined .backup-rail>.backup-section+.backup-section{border-top:1px solid var(--border);margin-top:32px;padding-top:32px}.backup-streamlined .backup-section p{margin:0 0 16px}.backup-streamlined .backup-rail p{overflow-wrap:anywhere;line-height:1.6}.backup-streamlined .backup-rail>p{border-top:1px solid var(--border);margin-top:28px;padding-top:28px}.backup-streamlined .backup-latest{flex-wrap:wrap;align-items:center;gap:16px;margin:26px 0 14px;display:flex}.backup-streamlined .backup-latest>p{letter-spacing:-.65px;margin:0;font-size:25px;line-height:1.4}.backup-streamlined .backup-latest+p{margin-bottom:26px}.backup-streamlined .backup-latest-label{margin-top:32px}.backup-streamlined .backup-latest-label+.backup-latest{margin-top:8px}.backup-streamlined .backup-status{white-space:nowrap;font-size:14px}.backup-streamlined .backup-status:before{flex-shrink:0;width:7px;height:7px}.backup-streamlined .backup-latest .backup-status:before,.backup-streamlined .backup-scope-heading .backup-status:before{display:none}.backup-streamlined .backup-latest .backup-status svg,.backup-streamlined .backup-scope-heading .backup-status svg{display:block}.backup-streamlined .backup-latest .backup-status.verified,.backup-streamlined .backup-scope-heading .backup-status.verified{color:var(--success)!important}.backup-streamlined .backup-off{color:var(--warning);margin-left:8px}.backup-streamlined .backup-table-scroll{border:0;border-radius:0;overflow-x:auto}.backup-streamlined .backup-table{table-layout:auto;width:100%;min-width:0;display:table}.backup-streamlined .backup-table thead{display:table-header-group}.backup-streamlined .backup-table tbody{display:table-row-group}.backup-streamlined .backup-table tr{border:0;display:table-row}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td{border:0;border-bottom:1px solid var(--border);text-align:left;white-space:normal;vertical-align:middle;padding:18px 12px;font-size:14px;display:table-cell}.backup-streamlined .backup-table th{padding-top:8px;padding-bottom:14px;font-weight:450}.backup-streamlined .backup-table td:before{display:none}.backup-streamlined .backup-table td:first-child,.backup-streamlined .backup-table th:first-child{padding-left:2px}.backup-streamlined .backup-table td:last-child,.backup-streamlined .backup-table th:last-child{text-align:right;padding-right:2px}.backup-streamlined .backup-table td{font-weight:400}.backup-streamlined .backup-table .backup-link{color:var(--primary);white-space:nowrap;font-size:14px}.backup-streamlined .backup-table .backup-dsp-name .backup-link{color:var(--foreground);white-space:normal}.backup-streamlined .backup-table td:last-child .backup-icon{display:none}.backup-streamlined .backup-dsp-picker{max-width:320px;margin-bottom:32px}.backup-streamlined select,.backup-streamlined input:not([type=checkbox]){min-height:42px;font-size:14px}.backup-streamlined .backup-scope-heading{flex-wrap:wrap;align-items:center;gap:24px;margin-bottom:18px;display:flex}.backup-streamlined .backup-scope-heading h2{margin:0;font-size:23px}.backup-streamlined .backup-toolbar{flex-wrap:wrap;align-items:center;gap:16px;margin:20px 0 24px;display:flex}.backup-streamlined .backup-toolbar .backup-search-wrap{flex:220px;min-width:0}.backup-streamlined .backup-toolbar .backup-field{flex:0 200px}.backup-streamlined .backup-toolbar .backup-field>span{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-streamlined .backup-toolbar select{width:100%}.backup-streamlined .backup-rail>.backup-field{margin-bottom:26px}.backup-streamlined .backup-rail>.backup-button-text{border-top:1px solid var(--border);width:100%;padding-top:24px}.backup-streamlined .backup-filter-tabs{border-bottom:1px solid var(--border);gap:20px;margin:0 0 24px;padding:0}.backup-streamlined .backup-filter-tabs button{min-height:36px;color:var(--foreground);background:0 0;border:0;border-bottom:2px solid #0000;border-radius:0;padding:0 8px 12px;font-weight:400}.backup-streamlined .backup-filter-tabs button[aria-pressed=true]{border-color:var(--foreground);background:0 0;font-weight:600}.backup-streamlined .backup-event-type{flex-direction:column;gap:4px;display:flex}.backup-streamlined .backup-event-type small{font-size:12px}.backup-streamlined .backup-event-count{margin-top:20px}.backup-streamlined .backup-storage-total{margin:0 0 10px;font-size:28px}.backup-streamlined .backup-disclosure{border-bottom:1px solid var(--border)}.backup-streamlined .backup-disclosure>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;padding:20px 2px;font-weight:500;list-style:none;display:flex}.backup-streamlined .backup-disclosure>summary::-webkit-details-marker{display:none}.backup-streamlined .backup-disclosure[open]>summary>svg{transform:rotate(90deg)}.backup-streamlined .backup-disclosure>p,.backup-streamlined .backup-disclosure>.backup-pairs{margin:16px 0}.backup-streamlined .backup-disclosure>.backup-button{margin:12px 12px 20px 0}.backup-streamlined .backup-settings-scope{max-width:460px;margin:28px 0 34px}.backup-streamlined .backup-form-grid{border:0;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px;min-width:0;margin:28px 0 36px;padding:0;display:grid}.backup-streamlined .backup-form-grid input,.backup-streamlined .backup-form-grid select{width:100%}.backup-streamlined input:disabled,.backup-streamlined select:disabled{opacity:.55;cursor:not-allowed}.backup-streamlined .backup-toggle-label{align-items:center;gap:10px;display:inline-flex}.backup-streamlined .backup-toggle-label .backup-switch{width:40px;height:24px}.backup-streamlined .backup-toggle-label .backup-switch:after{width:18px;height:18px;top:3px;left:3px}.backup-streamlined .backup-toggle-label .backup-switch:checked:after{transform:translate(16px)}.backup-streamlined .backup-form-section{padding-top:28px}.backup-streamlined .backup-form-section .backup-field{max-width:460px;margin:22px 0 16px}.backup-streamlined .backup-note{margin:24px 0}.backup-streamlined .backup-empty{text-align:left;padding:24px 0}.backup-streamlined .backup-empty>svg{display:none}.backup-streamlined>.backup-card,.backup-streamlined>.backup-page-title{margin-top:32px}@media (width<=1100px){.backup-streamlined .backup-split{grid-template-columns:minmax(0,1.8fr) minmax(220px,1fr)}.backup-streamlined .backup-main{padding-right:24px}.backup-streamlined .backup-rail{padding-left:24px}.backup-streamlined .backup-table{min-width:560px}.backup-streamlined .backup-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=800px){.backup-streamlined .backup-split{flex-direction:column;min-height:0;display:flex}.backup-streamlined .backup-main{padding:28px 0}.backup-streamlined .backup-rail{border-left:0;border-top:1px solid var(--border);padding:28px 0}.backup-streamlined .backup-header{flex-direction:column;align-items:flex-start;gap:20px;margin-bottom:30px}.backup-streamlined .backup-header .backup-actions{justify-content:flex-start;gap:20px}.backup-workspace.backup-streamlined h1{font-size:32px}.backup-streamlined .backup-tabs{gap:24px}.backup-streamlined .backup-tabs a{padding-bottom:16px;font-size:14px}.backup-streamlined .backup-latest>p{font-size:22px}.backup-streamlined .backup-form-grid{grid-template-columns:minmax(0,1fr)}.backup-streamlined .backup-settings-scope{max-width:none}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td{padding:16px 10px}.backup-streamlined .backup-table-scroll{max-width:100%}}.backup-streamlined .backup-header a[aria-current=page]{color:var(--foreground);font-weight:600}.backup-streamlined .backup-tabs a[aria-current=page]{border-bottom-color:var(--primary)}.backup-streamlined .backup-filter-tabs button[aria-pressed=true]{color:var(--foreground)}.backup-streamlined .backup-rail>.backup-button-text{border-radius:0}.backup-streamlined .backup-field>span{font-size:14px;font-weight:450}.backup-streamlined .backup-card-heading h3,.backup-streamlined .backup-form-section h3{font-size:18px;font-weight:600}@media (width<=800px){.backup-streamlined .backup-storage-table .backup-table{table-layout:fixed;min-width:0}.backup-streamlined .backup-storage-table .backup-table th:first-child{width:50%}.backup-streamlined .backup-storage-table .backup-table th:not(:first-child){width:auto}.backup-streamlined .backup-storage-table th,.backup-streamlined .backup-storage-table td{overflow-wrap:anywhere;padding:14px 6px;font-size:13px}.backup-streamlined .backup-storage-table .backup-link{white-space:normal}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) .backup-table{min-width:0}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) tbody{display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) tr{border-bottom:1px solid var(--border);grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 20px;padding:18px 0;display:grid}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td{text-align:left;overflow-wrap:anywhere;border:0;padding:0;display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td:first-child{grid-column:1/-1}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td:not(:first-child):before{content:attr(data-label);color:var(--muted-foreground);margin-bottom:5px;font-size:12px;display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) .backup-status{white-space:normal}}.backup-workspace.backup-streamlined{container:backups/inline-size}.backup-streamlined .backup-muted{font-size:inherit}.backup-streamlined .backup-toolbar>select{flex:0 200px;width:200px}.backup-streamlined[data-view=dsps] .backup-main>.backup-section+.backup-section,.backup-streamlined[data-view=storage] .backup-main>.backup-section+.backup-section{border-top:0;padding-top:0}@container backups (width>=1300px){.backup-streamlined .backup-header{margin-bottom:60px;padding-top:24px}.backup-workspace.backup-streamlined h1{font-size:46px}.backup-streamlined .backup-tabs{gap:40px}.backup-streamlined .backup-tabs a{padding-bottom:24px;font-size:18px}.backup-streamlined .backup-main{padding:60px 56px 48px 0}.backup-streamlined .backup-rail{padding:54px 0 48px 42px}.backup-streamlined .backup-section>h2,.backup-streamlined .backup-scope-heading h2{font-size:22px}.backup-streamlined .backup-section p,.backup-streamlined .backup-rail p,.backup-streamlined .backup-link,.backup-streamlined .backup-button,.backup-streamlined .backup-tabs a{font-size:18px}.backup-streamlined .backup-button{min-height:50px}.backup-streamlined .backup-button-text{min-height:36px}.backup-streamlined .backup-latest{margin-top:36px}.backup-streamlined .backup-latest>p{font-size:30px}.backup-streamlined .backup-main>.backup-section+.backup-section{margin-top:48px;padding-top:48px}.backup-streamlined .backup-rail>.backup-section+.backup-section{margin-top:40px;padding-top:40px}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td,.backup-streamlined .backup-table .backup-link,.backup-streamlined .backup-status,.backup-streamlined .backup-field>span,.backup-streamlined input:not([type=checkbox]),.backup-streamlined select{font-size:16px}.backup-streamlined .backup-section .backup-storage-total{font-size:32px}.backup-streamlined .backup-scope-heading h2{font-size:28px}}:root,.theme-preview-scope{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--font-family:Inter, ui-sans-serif, system-ui, sans-serif;--background:#fff;--foreground:#171b25;--card:#fff;--card-foreground:var(--foreground);--popover:#fff;--popover-foreground:var(--foreground);--sidebar:#f7f8fa;--surface:#f8f9fc;--primary:#2055ed;--primary-hover:#1745cd;--primary-foreground:#fff;--secondary:#f0f2f5;--secondary-foreground:var(--foreground);--muted:#edf0f4;--muted-foreground:#626b7a;--accent:#f0f3f8;--accent-foreground:var(--foreground);--selection:#edf1fd;--destructive:#b42332;--danger-button:#b42332;--border:#e3e7ee;--input:#ced5e0;--ring:#3765e8;--success:#16814b;--success-surface:#edf8f1;--warning:#956009;--warning-surface:#fff8eb;--warning-border:#eed5a7;--warning-button:#ffce60;--warning-button-foreground:#523711;--violet:#6553aa;--violet-surface:#f0edf9;--sage:#36765e;--sage-surface:#eaf4ee;--slate:#51647d;--slate-surface:#eaf0f7;--steel:#427380;--steel-surface:#e9f3f5;--overlay:#10182755;--shadow-color:#10182726;--radius:.5rem;--sidebar-width:240px;--page-gutter:36px;--heading-size:32px;--body-size:14px;--table-row-padding:15px;--control-height:40px;--motion-duration:.16s}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--background:#11151d;--foreground:#edf1f7;--card:#171c26;--popover:#1b2230;--sidebar:#171c26;--surface:#1b2230;--primary:#8eaaff;--primary-hover:#adc1ff;--primary-foreground:#111827;--secondary:#252e3d;--muted:#252e3d;--muted-foreground:#a6b1c2;--accent:#242d3d;--selection:#253251;--destructive:#f49aaa;--danger-button:#a72b41;--border:#303949;--input:#465269;--ring:#8eaaff;--success:#6ed39a;--success-surface:#19362a;--warning:#e9b963;--warning-surface:#32291c;--warning-border:#65512f;--violet:#b5a5ec;--violet-surface:#302a43;--sage:#94cdb3;--sage-surface:#24392f;--slate:#b2c4de;--slate-surface:#29374b;--steel:#9ecad4;--steel-surface:#243c44;--overlay:#0009;--shadow-color:#0006}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter.woff2)format("woff2")}:root{font-family:var(--font-family);font-synthesis:none;color:var(--foreground);background:var(--background)}.application{min-height:100dvh}.brand{letter-spacing:-.7px;color:var(--foreground);align-items:center;gap:12px;font-size:22px;font-weight:600;display:inline-flex}.brand svg{width:29px;height:29px;color:var(--primary)}.desktop-sidebar{width:var(--sidebar-width);background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;display:flex;position:fixed;inset:0 auto 0 0}.sidebar-brand{padding:27px 24px 26px}.sidebar-brand p{color:var(--muted-foreground);overflow-wrap:anywhere;margin-top:13px;font-size:13px}.nav-list{flex-direction:column;flex:1;gap:7px;padding:14px 12px;display:flex}.nav-item{border-radius:var(--radius);min-height:42px;color:var(--foreground);align-items:center;gap:12px;padding:10px 15px;font-size:14px;font-weight:450;display:flex;position:relative}.nav-item svg{stroke-width:1.65px;width:18px;height:18px}.nav-item:hover{background:var(--accent);color:var(--foreground)}.nav-item[aria-current=page]{color:var(--primary);background:var(--selection);font-weight:550}.nav-item[aria-current=page]:before{content:"";background:var(--primary);border-radius:2px;width:3px;position:absolute;top:11px;bottom:11px;left:0}.sidebar-account{border-top:1px solid var(--border);margin:0 12px;padding:16px 12px}.account-button{text-align:left;border-radius:var(--radius);align-items:center;gap:10px;width:100%;display:flex}.account-copy{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.account-copy strong{text-overflow:ellipsis;font-size:12px;font-weight:550;overflow:hidden}.account-copy>span{color:var(--muted-foreground);font-size:11px}.account-button>svg{width:14px;height:14px;color:var(--muted-foreground)}.avatar{background:var(--muted);width:34px;height:34px;color:var(--foreground);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:500;display:inline-flex}.main-area{margin-left:var(--sidebar-width);min-width:0}.topbar{height:65px;padding:0 var(--page-gutter);align-items:center;gap:12px;display:flex}.breadcrumb{color:var(--muted-foreground);align-items:center;gap:13px;min-width:0;font-size:13px;display:flex}.breadcrumb>span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.breadcrumb strong{color:var(--foreground);white-space:nowrap;font-weight:450}.page-container{max-width:1600px;padding:15px var(--page-gutter) 48px;outline:none;margin:0 auto}.page-heading{justify-content:space-between;align-items:center;gap:24px;margin-bottom:35px;display:flex}.page-heading h1,.backup-workspace h1{font-size:var(--heading-size);letter-spacing:-1.1px;font-weight:600;line-height:1.3}.page-heading p{color:var(--muted-foreground);margin-top:8px;font-size:14px}.page-actions{align-items:center;gap:10px;display:flex}.inline-summary{color:var(--muted-foreground);grid-template-columns:repeat(3,minmax(0,1fr));margin:0 0 30px;padding:4px 0 12px;font-size:13px;display:grid}.inline-summary>span{border-left:1px solid var(--border);flex-direction:column;align-items:center;gap:5px;padding:0 24px;display:flex}.inline-summary>span:first-child{border:0}.inline-summary strong{color:var(--foreground);font-variant-numeric:tabular-nums;letter-spacing:-.8px;font-size:30px;font-weight:600;line-height:1.2}[data-slot=tabs-list].page-tabs{border-bottom:1px solid var(--border);border-radius:0;justify-content:flex-start;gap:30px;width:100%;height:43px;padding:0}.page-tabs [data-slot=tabs-trigger]{border:0;border-radius:0;flex:none;height:100%;padding:0 0 14px;font-size:13px;font-weight:450}.page-tabs [data-slot=tabs-trigger][data-state=active]{color:var(--primary);font-weight:550}.page-tabs [data-slot=tabs-trigger]:after{background:var(--primary);bottom:0}.tab-count{color:var(--muted-foreground);margin-left:4px;font-size:11px}.table-toolbar{justify-content:space-between;align-items:center;gap:14px;padding:19px 0 15px;display:flex}.search-input{width:330px;max-width:100%;display:block;position:relative}.search-input>svg{width:16px;height:16px;color:var(--muted-foreground);pointer-events:none;position:absolute;top:10px;left:11px}.search-input input{box-shadow:none;padding-left:34px;font-size:12px}[data-slot=table-container]{overflow-x:auto}[data-slot=table-head]{height:46px;padding:12px 8px;font-size:12px;font-weight:500}[data-slot=table-cell]{padding:var(--table-row-padding) 8px;font-size:var(--body-size);vertical-align:middle}[data-slot=table-row]:hover{background:var(--accent)}[data-slot=table-header] [data-slot=table-row]:hover{background:0 0}[data-slot=table-row]{border-color:var(--border)}.identity-button{text-align:left;align-items:center;gap:12px;display:flex}.identity-button strong,.member-identity strong{font-size:13px;font-weight:550}.dsp-identity-copy>span,.member-identity div>span{color:var(--muted-foreground);font-size:12px}.identity-button:hover strong{color:var(--primary)}.status{white-space:nowrap;text-transform:none;align-items:center;gap:8px;font-size:12px;display:inline-flex}.status>span{background:var(--muted-foreground);border-radius:50%;width:6px;height:6px}.status-ready>span,.status-active>span,.status-success>span,.status-verified>span,.status-completed>span{background:var(--success)}.status-pending>span,.status-provisioning>span,.status-verifying>span,.status-waiting-for-owner>span,.status-waiting-for-provider-auth>span{background:var(--warning)}.status-failed>span,.status-suspended>span{background:var(--destructive)}.table-count{color:var(--muted-foreground);margin-top:19px;font-size:12px}.member-identity{align-items:center;gap:12px;display:flex}.member-identity div{flex-direction:column;gap:4px;display:flex}.role-row{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:24px;padding:24px 0;display:flex}.role-row p{color:var(--muted-foreground);margin:6px 0 12px;font-size:13px}.role-row details{color:var(--muted-foreground);font-size:12px}.role-row details summary{cursor:pointer;color:var(--foreground)}.role-row details ul{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 24px;margin-top:12px;display:grid}.settings-section,.setup-section{border-bottom:1px solid var(--border);grid-template-columns:minmax(170px,1fr) minmax(300px,2fr);gap:48px;max-width:900px;padding:32px 0;display:grid}.settings-section>div>p,.setup-section>div>p{color:var(--muted-foreground);max-width:240px;margin-top:8px;font-size:13px}.detail-list{font-size:13px}.detail-list>div{border-bottom:1px solid var(--border);justify-content:space-between;gap:24px;padding:16px 0;display:flex}.detail-list>div:first-child{padding-top:0}.detail-list>div:last-child{border-bottom:0}.detail-list dt{color:var(--muted-foreground)}.detail-list dd{text-align:right;overflow-wrap:anywhere}.setup-section{margin-bottom:28px}.setup-section form{max-width:440px}.panel-form{flex-direction:column;flex:1;min-height:0;padding:12px 24px 24px;display:flex;overflow:auto}.panel-form>[data-slot=field-group]{padding-bottom:32px}.panel-body{padding:12px 24px 24px;overflow:auto}.panel-footer{border-top:1px solid var(--border);justify-content:flex-end;gap:10px;margin-top:auto;padding-top:22px;display:flex}[data-slot=sheet-header]{gap:10px;padding:30px 24px 20px}[data-slot=sheet-title]{letter-spacing:-.25px;font-size:17px}[data-slot=sheet-description]{line-height:1.6}[data-slot=field-group]{gap:24px}[data-slot=field]{gap:9px}[data-slot=field-label]{font-size:13px;font-weight:500}[data-slot=input],[data-slot=native-select]{box-shadow:none}[data-slot=native-select-wrapper]{width:100%}.permission-row{align-items:center;gap:10px;font-size:13px;display:flex}.permission-row input{width:16px;height:16px;accent-color:var(--primary)}.auth-layout{flex-direction:column;align-items:center;min-height:100dvh;padding:44px 24px;display:flex}.auth-brand{align-self:flex-start}.auth-panel{width:360px;max-width:100%;margin:auto 0;padding:56px 0}.auth-panel h1{letter-spacing:-.8px;font-size:26px;font-weight:600}.auth-description{color:var(--muted-foreground);margin:10px 0 28px;font-size:13px}.auth-footnote{color:var(--muted-foreground);font-size:12px}.initial-loading{width:360px;max-width:100%;margin:15vh auto;padding:24px}.mobile-menu{display:none}.mobile-sidebar{background:var(--sidebar);gap:0;padding:0;max-width:280px!important}.skip-link{z-index:100;background:var(--background);padding:12px;position:fixed;top:-100px;left:16px}.skip-link:focus{top:8px}@media (width<=980px){.desktop-sidebar{display:none}.main-area{margin-left:0}.mobile-menu{display:inline-flex}.topbar{padding:0 20px}.page-container{padding:16px 24px 40px}}@media (width<=600px){.page-container{padding:12px 18px 32px}.topbar{height:58px;padding:0 12px}.page-heading{flex-wrap:wrap;align-items:flex-start;gap:18px;margin-bottom:28px}.page-heading h1,.backup-workspace h1{font-size:28px}.page-heading p{font-size:13px}.page-tabs{overflow:auto}.inline-summary>span{padding:0 14px}.inline-summary{margin-bottom:26px;font-size:12px}.table-toolbar{gap:10px}.search-input{width:100%}.settings-section,.setup-section{grid-template-columns:1fr;gap:25px;padding:25px 0}.settings-section>div>p,.setup-section>div>p{max-width:100%}.detail-list>div{gap:15px}.role-row details ul{grid-template-columns:1fr}.auth-brand{align-self:center}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.backup-workspace,.backup-dialog{--backup-ink:var(--foreground);--backup-muted:var(--muted-foreground);--backup-border:var(--border);--backup-blue:var(--primary);font-family:var(--font-family)}.backup-workspace h1,.backup-workspace h2,.backup-dialog h2{font-weight:600}.backup-header{margin-bottom:32px}.backup-header>div:first-child>p{color:var(--muted-foreground);margin-top:8px;font-size:14px}.backup-button{border-radius:var(--radius);min-height:36px;padding:8px 13px;font-size:13px;font-weight:500}.backup-tabs{gap:30px;margin-bottom:30px}.backup-tabs a{color:var(--muted-foreground);border-bottom-width:2px;padding:0 0 14px;font-size:13px;font-weight:450}.backup-tabs a[aria-current=page]{color:var(--primary);border-color:var(--primary);font-weight:550}.backup-card{box-shadow:none;background:0 0;border:0;border-radius:0;padding:0}.backup-card-title{gap:10px;margin-bottom:20px!important;font-size:15px!important}.backup-card-title .backup-icon-tile{display:none}.backup-dashboard-grid{grid-template-columns:minmax(0,2fr) minmax(240px,1fr);gap:32px}.backup-dashboard-grid>aside{border-left:1px solid var(--border);padding-left:28px}.backup-dashboard-grid .backup-stack{gap:36px}.backup-fleet-summary{box-shadow:none;background:0 0;border:0;border-radius:0;flex-wrap:wrap;align-items:center;margin-bottom:34px;padding:0;display:flex}.backup-storage-metrics{grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:24px;margin:24px 0 36px;display:grid}.backup-storage-metrics dt{color:var(--muted-foreground);font-size:13px}.backup-storage-metrics dd,.backup-storage-total{margin:8px 0;font-size:28px;font-weight:600}.backup-storage-table .backup-table{table-layout:fixed;min-width:0}.backup-storage-table th:first-child{width:54%}.backup-storage-table th:not(:first-child){width:23%}.backup-storage-table .backup-table td{white-space:normal;overflow-wrap:anywhere}@media (width<=650px){.backup-storage-table .backup-table th,.backup-storage-table .backup-table td{padding:12px 6px;font-size:12px}}.backup-fleet-metric{border-left:1px solid var(--border);padding:0 20px;display:block}.backup-fleet-metric:first-child{border-left:0;padding-left:0}.backup-fleet-metric .backup-icon-tile{display:none}.backup-fleet-metric>div{align-items:baseline;gap:6px;display:flex}.backup-fleet-metric dd,.backup-fleet-metric dt{color:var(--foreground);font-size:13px;font-weight:450}.backup-fleet-metric dt{color:var(--muted-foreground)}.backup-overview-issues{background:0 0;border:0}.backup-overview-issues>h2>svg{width:17px;color:var(--warning)}.backup-issue-row{gap:12px;padding:16px 0}.backup-issue-row .backup-avatar{display:none}.backup-issue-row strong{font-size:13px;font-weight:500}.backup-issue-row .backup-link{font-size:12px;font-weight:450}.backup-next-layout{grid-template-columns:1fr;gap:18px}.backup-next-policy{border-left:0;padding-left:0}.backup-next-when strong{font-size:24px;font-weight:500}.backup-next-policy svg{width:16px;height:16px}.backup-core-summary{border-top:1px solid var(--border);padding-top:24px}.backup-activity-entry{gap:10px;padding:14px 0}.backup-activity-entry time{font-size:10px}.backup-activity-entry strong{font-size:12px;font-weight:500}.backup-activity-entry .backup-icon-tile{background:0 0;flex-basis:22px;width:22px;height:22px}.backup-activity-entry>div{min-width:0}.backup-status{border:0;padding:0;font-size:12px;font-weight:400;color:var(--foreground)!important;background:0 0!important}.backup-status svg{display:none}.backup-status:before{content:"";background:var(--muted-foreground);border-radius:50%;width:6px;height:6px}.backup-status.verified:before,.backup-status.completed:before{background:var(--success)}.backup-status.failed:before{background:var(--destructive)}.backup-status.empty:before,.backup-status.running:before,.backup-status.pending:before{background:var(--warning)}.backup-table th{color:var(--foreground);background:0 0;padding:12px 8px;font-size:12px;font-weight:500}.backup-table td{padding:16px 8px;font-size:12px}.backup-table tbody tr:first-child{background:0 0}.backup-table tbody tr:hover{background:var(--accent)}.backup-inspector{border:1px solid var(--border);border-radius:var(--radius);box-shadow:none}.backup-dsp-navigator{background:var(--sidebar)}.backup-dsp-option[aria-current=page]{background:var(--selection);box-shadow:none;border-color:#0000}.backup-avatar{border-radius:var(--radius);box-shadow:none;border:0!important}.backup-note{border-radius:var(--radius);box-shadow:none;background:var(--accent)}.backup-dialog{border:1px solid var(--border);box-shadow:0 16px 50px var(--overlay);border-radius:8px}.backup-dialog::backdrop{background:var(--overlay)}.backup-form-section{padding:24px 0}.backup-form-section h3{font-weight:550}.backup-form-footer{border-top:1px solid var(--border);padding-top:24px}.backup-page-title h2{font-size:20px}.backup-filter-tabs button[aria-pressed=true]{background:var(--selection);color:var(--primary)}.updates-workspace h2{letter-spacing:-.6px;font-size:22px;font-weight:550}.updates-workspace h3{font-size:14px;font-weight:550}.update-muted{color:var(--muted-foreground);font-size:13px;line-height:1.7}.update-release-card{border-top:1px solid var(--border);padding-top:28px}.update-eyebrow{display:none}.update-release-heading{justify-content:space-between;align-items:center;gap:20px;display:flex}.primary-button,.secondary-button{border:1px solid var(--border);border-radius:var(--radius);min-height:36px;font:500 13px/1.4 var(--font-family);background:var(--background);cursor:pointer;justify-content:center;align-items:center;gap:8px;padding:8px 14px;display:inline-flex}.primary-button{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}.primary-button:disabled,.secondary-button:disabled{opacity:.5;cursor:default}.secondary-button:hover{background:var(--accent)}.update-changelog{border-top:1px solid var(--border);margin-top:30px;padding-top:26px}.update-changes{margin-top:12px;padding:0;list-style:none}.update-changes li{border-bottom:1px solid var(--border);align-items:baseline;gap:24px;padding:20px 0;display:flex}.update-change-kind{min-width:66px;color:var(--muted-foreground);font-size:12px}.update-changes strong{font-size:14px;font-weight:500}.update-changes p{margin-top:5px}.update-rollout-summary{border-top:1px solid var(--border);justify-content:space-between;align-items:center;gap:24px;padding:24px 0;display:flex}.update-rollout-title{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.update-rollout-icon{display:none}.update-status{color:var(--muted-foreground);font-size:12px}.update-status.paused{color:var(--warning)}.update-status.completed{color:var(--success)}.update-progress-grid{grid-template-columns:1fr 1.4fr;gap:36px;margin:22px 0 36px;display:grid}.update-progress-card{min-width:0}.update-stage-list{margin-top:20px;padding:0;list-style:none}.update-stage-list li{gap:16px;min-height:78px;padding:14px 12px 26px;display:flex;position:relative}.update-stage-list li:last-child{min-height:60px;padding-bottom:14px}.update-stage-list li:not(:last-child):after{content:"";background:var(--border);transform-origin:top;width:2px;position:absolute;top:46px;bottom:-10px;left:26px}.update-stage-list li.done:after{background:var(--primary)}.update-stage-list li.current:before,.update-stage-list li.paused:before{content:"";background:var(--primary);border-radius:12px;position:absolute;inset:0 0 12px}@supports (color:color-mix(in lab, red, red)){.update-stage-list li.current:before,.update-stage-list li.paused:before{background:color-mix(in srgb, var(--primary) 6%, transparent)}}.update-stage-list li.paused:before{background:var(--warning)}@supports (color:color-mix(in lab, red, red)){.update-stage-list li.paused:before{background:color-mix(in srgb, var(--warning) 7%, transparent)}}.update-stage-list li>div{min-width:0;padding-top:3px;position:relative}.update-stage-marker{z-index:1;border:1px solid var(--border);background:var(--background);width:30px;height:30px;color:var(--muted-foreground);border-radius:50%;flex:0 0 30px;justify-content:center;align-items:center;font-size:12px;transition:background-color .25s,border-color .25s,color .25s;display:flex;position:relative}.done .update-stage-marker{color:var(--success);border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.done .update-stage-marker{border-color:color-mix(in srgb, var(--success) 30%, transparent)}}.done .update-stage-marker{background:var(--success)}@supports (color:color-mix(in lab, red, red)){.done .update-stage-marker{background:color-mix(in srgb, var(--success) 8%, var(--background))}}.current .update-stage-marker{color:var(--primary);background:var(--background);border-color:#0000}.current .update-stage-marker:after{content:"";border:2px solid var(--primary);position:absolute;inset:-3px}@supports (color:color-mix(in lab, red, red)){.current .update-stage-marker:after{border:2px solid color-mix(in srgb, var(--primary) 16%, transparent)}}.current .update-stage-marker:after{border-top-color:var(--primary);border-radius:50%;animation:1.8s linear infinite update-spin}.paused .update-stage-marker{color:var(--warning);border-color:var(--warning)}.update-stage-list strong{font-size:13px;font-weight:500}.update-stage-detail{color:var(--muted-foreground);margin:5px 0 0;font-size:12px;line-height:1.6}.update-current-activity{color:var(--muted-foreground);margin:-8px 0 26px;font-size:13px}.update-message-enter{animation:.25s ease-out update-fade}.update-check{border-bottom:2px solid;border-right:2px solid;width:7px;height:12px;margin-top:-3px;display:inline-block;transform:rotate(45deg)}.update-step-enter .update-check,.update-completion-enter .update-check{animation:.4s ease-out both update-check-draw}.update-stage-list .update-step-enter:after{animation:.35s ease-out both update-connect}.update-rollout-icon.completed{width:36px;height:36px;color:var(--success);background:var(--success);border-radius:50%;flex:0 0 36px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.update-rollout-icon.completed{background:color-mix(in srgb, var(--success) 10%, transparent)}}.update-completion-enter{animation:.35s ease-out both update-fade}.update-progress{background:var(--primary);border-radius:999px;width:100%;height:8px;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.update-progress{background:color-mix(in srgb, var(--primary) 9%, var(--background))}}.update-progress{margin:22px 0}.update-progress-fill{border-radius:inherit;background:var(--primary);height:100%;animation:.4s ease-out both update-fill;display:block;position:relative;overflow:hidden}.update-progress.is-active .update-progress-fill:after{content:"";background:linear-gradient(100deg,#0000 20%,#fff5 50%,#0000 80%);animation:2.2s ease-in-out infinite update-sheen;position:absolute;inset:0}.update-empty-fleet{border:1px solid var(--border);border-radius:12px;margin-top:20px;padding:22px}.update-empty-fleet strong{font-size:14px;font-weight:500}.update-empty-fleet p{margin:8px 0 0;font-size:13px;line-height:1.6}.update-reconnecting{background:var(--primary);border-radius:8px;margin:0 0 18px;padding:12px 16px}@supports (color:color-mix(in lab, red, red)){.update-reconnecting{background:color-mix(in srgb, var(--primary) 6%, transparent)}}.update-reconnecting{color:var(--muted-foreground);font-size:13px}#platform-updates-content[data-connection=reconnecting] *,#platform-updates-content[data-connection=reconnecting] :before,#platform-updates-content[data-connection=reconnecting] :after,#platform-updates-content[data-rollout-status=paused] *,#platform-updates-content[data-rollout-status=paused] :before,#platform-updates-content[data-rollout-status=paused] :after{animation:none!important}@keyframes update-spin{to{transform:rotate(360deg)}}@keyframes update-fade{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}@keyframes update-check-draw{0%{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0)}}@keyframes update-connect{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes update-fill{0%{width:var(--update-progress-from)}}@keyframes update-sheen{0%{transform:translate(-100%)}to{transform:translate(100%)}}@media (prefers-reduced-motion:reduce){#platform-updates-content *,#platform-updates-content :before,#platform-updates-content :after{transition:none!important;animation:none!important}}.update-dsp-list{padding:0;list-style:none}.update-dsp-list li{border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:16px 0;display:flex}.update-dsp-list strong{font-size:13px;font-weight:500}.update-dsp-status{color:var(--muted-foreground);margin-left:auto;font-size:12px}.update-dsp-marker{width:16px;font-size:12px}.updated .update-dsp-marker{color:var(--success)}.blocked .update-dsp-marker{color:var(--destructive)}.update-activity{border-top:1px solid var(--border);padding-top:26px}.update-activity ul{margin-top:12px;padding:0;list-style:none}.update-activity li{justify-content:space-between;gap:24px;padding:12px 0;display:flex}.update-activity strong{font-size:13px;font-weight:450}.update-attention,.update-status-unavailable{border:1px solid var(--border);border-radius:var(--radius);color:var(--destructive);margin:20px 0;padding:14px;font-size:13px}@media (width<=1100px){.backup-dashboard-grid{grid-template-columns:1fr}.backup-dashboard-grid>aside{border-left:0;border-top:1px solid var(--border);grid-template-columns:1fr 1fr;gap:28px;padding:26px 0 0;display:grid}}@media (width<=600px){.backup-header{flex-direction:column;align-items:flex-start}.backup-actions{gap:12px}.backup-dashboard-grid>aside{grid-template-columns:1fr}.backup-fleet-summary{row-gap:16px}.backup-fleet-metric{border-top:0!important;padding:0 12px!important}.backup-fleet-metric:first-child{padding-left:0!important}.backup-fleet-metric dd,.backup-fleet-metric dt{font-size:12px}.backup-issue-row{flex-wrap:wrap;display:flex}.backup-issue-row>.backup-link{margin-left:0}.update-progress-grid{grid-template-columns:1fr}.update-release-heading,.update-rollout-summary{flex-wrap:wrap}.update-changes li{gap:12px}.update-activity li{flex-direction:column;gap:3px}}.backup-table-scroll{border:0;border-radius:0}.backup-table th{text-transform:none;letter-spacing:0}.backup-table tbody tr:first-child td{border-top:1px solid var(--border)}.backup-table tbody tr:last-child td{border-bottom:1px solid var(--border)}.backup-table .backup-link{color:var(--foreground);font-weight:500}.backup-fleet-metric.warning dd,.backup-fleet-metric.success dd{color:var(--foreground)}@media (width<=600px){.fleet-table th:nth-child(2),.fleet-table td:nth-child(2),.fleet-table th:nth-child(4),.fleet-table td:nth-child(4){display:none}.fleet-table .identity-button{max-width:170px}.fleet-table .identity-button strong{text-overflow:ellipsis;max-width:170px;overflow:hidden}.fleet-table [data-slot=table-cell]{padding:14px 4px}[data-slot=button][data-size=default]{min-height:44px}}.backup-table{border-collapse:collapse;border-spacing:0}.backup-table tbody{border:0;border-radius:0}.backup-table td:first-child,.backup-table td:last-child{border-left:0;border-right:0;border-radius:0!important}.backup-fleet-metric:last-child dd{color:var(--foreground)}.dsp-view-banner{z-index:30;background:var(--muted);border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:14px 24px;display:flex;position:sticky;top:0}.dsp-view-banner>svg{flex-shrink:0;width:20px;height:20px}.dsp-view-banner>div{flex:1;min-width:0}.dsp-view-banner strong,.dsp-view-banner span{overflow-wrap:anywhere;font-size:13px;display:block}.dsp-view-banner span{color:var(--muted-foreground);margin-top:3px}.dsp-view-banner>button{flex-shrink:0}@media (width<=640px){.dsp-view-banner{gap:8px;padding:12px 16px}.dsp-view-banner>svg{display:none}}.updates-workspace{max-width:none}.update-notes-panel{min-width:0}.update-notes-title{justify-content:space-between;align-items:center;gap:12px;display:flex}.update-notes-title>h2{letter-spacing:-1px;font-size:26px;font-weight:600;line-height:1.3}.update-release-summary{color:var(--muted-foreground);margin:6px 0 22px;font-size:14px;line-height:1.6}.update-feature-group{--group-color:var(--primary);--group-background:var(--selection);border:1px solid var(--border);border-radius:var(--radius);margin-top:16px;padding:20px}.update-feature-heading{align-items:center;gap:14px;min-height:38px;display:flex}.update-feature-heading h3{letter-spacing:-.4px;font-size:18px;font-weight:600;line-height:1.3}.update-group-icon{width:38px;height:38px;color:var(--group-color);background:var(--group-background);border-radius:50%;flex:0 0 38px;justify-content:center;align-items:center;display:flex}.update-note-icon{flex:0 0 24px;width:24px;height:24px;display:block}.update-group-count{white-space:nowrap;background:var(--selection);color:var(--primary);border-radius:4px;padding:4px 8px;font-size:12px;line-height:1.3}.update-feature-changes{margin:12px 0 0 52px;padding:0;list-style:none}.update-feature-changes li{align-items:flex-start;gap:12px;padding:10px 0;display:flex}.update-feature-changes .update-note-icon{color:var(--muted-foreground);margin-top:2px}.update-feature-changes strong{font-size:13px;font-weight:500;line-height:1.45;display:block}.update-feature-changes p{color:var(--muted-foreground);margin:1px 0 0;font-size:13px;line-height:1.5}.update-feature-changes>li>div{overflow-wrap:anywhere;min-width:0}.update-details-toggle{min-height:24px;color:var(--primary);font:500 13px/1.4 var(--font-family);background:0 0;border:0;align-items:center;gap:6px;margin:8px 0 0 52px;padding:0;display:flex}.update-details-toggle .update-note-icon{flex-basis:16px;width:16px;height:16px;transition:transform .15s}.update-details-toggle[aria-expanded=true] .update-note-icon{transform:rotate(90deg)}.update-expanded-details{border-top:1px solid var(--border);margin:12px 0 0 52px}.update-expanded-details>div{margin:16px 0}.update-expanded-details h4{font-size:13px;font-weight:550}.update-expanded-details p{color:var(--muted-foreground);white-space:pre-line;overflow-wrap:anywhere;margin-top:5px;font-size:13px;line-height:1.7}.update-release-state{background:var(--muted);color:var(--muted-foreground);white-space:nowrap;border-radius:5px;padding:5px 8px;font-size:12px}.update-after-section{border-top:1px solid var(--border);margin-top:32px;padding-top:24px}.update-after-notice{border:1px solid var(--warning-border);border-radius:var(--radius);background:var(--warning-surface);color:var(--warning);align-items:flex-start;gap:16px;padding:18px;display:flex}.update-after-notice>.update-note-icon{color:var(--warning);margin-top:2px}.update-after-notice h3{margin:0 0 8px;font-size:14px;font-weight:550}.update-after-notice strong{font-size:13px;font-weight:500;display:block}.update-after-notice p{margin:5px 0 0;font-size:13px;line-height:1.65}.update-after-notice+.update-after-notice{margin-top:12px}.paycom-page{max-width:1056px}.paycom-connection{border:1px solid var(--border);background:var(--card);color:var(--card-foreground);border-radius:12px}.paycom-connection-header{border-bottom:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:20px;padding:28px 32px;display:flex}.paycom-connection-identity{align-items:center;gap:20px;display:flex}.paycom-connection-icon{width:56px;height:56px;color:var(--primary);background:var(--selection);border-radius:10px;flex-shrink:0;place-items:center;display:grid}.paycom-connection-icon svg{stroke-width:1.6px;width:28px;height:28px}.paycom-connection-identity h2{letter-spacing:-.4px;font-size:20px;font-weight:600;line-height:1.4}.paycom-connection-identity p,.paycom-connection-message p{color:var(--muted-foreground);margin-top:6px;font-size:14px;line-height:1.7}.paycom-status-dot{background:currentColor;border-radius:50%;width:6px;height:6px;margin-right:3px}.paycom-connection-body{padding:32px}.paycom-connection-message h3{letter-spacing:-.5px;font-size:24px;font-weight:600;line-height:1.4}.paycom-connection-actions{flex-wrap:wrap;align-items:center;gap:12px;margin-top:24px;display:flex}.paycom-connection-hint,.paycom-security-help{color:var(--muted-foreground);font-size:13px;line-height:1.7}.paycom-connection-hint{margin-top:12px}.paycom-connection-footer{border-top:1px solid var(--border);background:var(--surface);color:var(--muted-foreground);border-radius:0 0 12px 12px;align-items:flex-start;gap:12px;padding:18px 32px;font-size:13px;line-height:1.6;display:flex}.paycom-connection-footer svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.paycom-credentials{border-top:1px solid var(--border);margin-top:28px;padding-top:28px}.paycom-credentials fieldset{gap:16px;min-width:0}.paycom-credentials legend{margin-bottom:16px}.paycom-login-fields,.paycom-security-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.paycom-login-fields>:first-child{grid-column:1/-1}.paycom-credentials .paycom-connection-actions{margin-top:0}@media (width<=640px){.paycom-connection-header,.paycom-connection-body{padding:24px 20px}.paycom-connection-identity{align-items:flex-start;gap:14px}.paycom-connection-icon{width:44px;height:44px}.paycom-connection-identity h2{font-size:18px}.paycom-connection-message h3{font-size:21px}.paycom-connection-footer{padding:18px 20px}.paycom-login-fields,.paycom-security-fields{grid-template-columns:minmax(0,1fr)}.paycom-connection-actions>button{white-space:normal;height:auto;min-height:var(--control-height);max-width:100%}}.release-popup{border-radius:16px;flex-direction:column;gap:0;width:min(640px,100vw - 32px);max-width:640px;max-height:calc(100dvh - 48px);padding:0;display:flex;overflow:hidden}.release-popup-header{border-bottom:1px solid var(--border);padding:32px 36px 24px;position:relative}.release-popup-eyebrow{letter-spacing:.1em;text-transform:uppercase;color:var(--primary);margin:0 0 12px;font-size:11px;font-weight:650}.release-popup-title{letter-spacing:-.03em;outline:none;margin:0 32px 12px 0;font-size:28px;line-height:1.25}.release-popup-intro{margin-top:16px;display:block}.release-popup-close{position:absolute;top:20px;right:20px}.release-popup-body{overscroll-behavior:contain;flex-direction:column;gap:26px;min-height:0;padding:28px 36px;display:flex;overflow-y:auto}.release-popup-body h3{margin:0 0 12px;font-size:16px;font-weight:650}.release-popup-body ul{flex-direction:column;gap:16px;margin:0;padding-left:18px;list-style:outside;display:flex}.release-popup-body li{overflow-wrap:anywhere;padding-left:4px;font-size:14px;line-height:1.65}.release-popup-body strong{font-weight:550}.release-popup-body p{color:var(--muted-foreground);margin:3px 0 0}.release-popup-footer{border-top:1px solid var(--border);justify-content:flex-end;align-items:center;gap:16px;padding:20px 36px;display:flex}.release-popup-footer>button{flex-shrink:0;min-width:100px}.release-popup-footer [role=alert]{color:var(--destructive);margin:0;font-size:13px}@media (width<=600px){.release-popup{max-height:calc(100dvh - 24px)}.release-popup-header{padding:24px 24px 20px}.release-popup-title{font-size:24px}.release-popup-body{padding:24px}.release-popup-footer{padding:16px 24px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}body{background:var(--background);color:var(--foreground)}button,input,select,textarea{font-family:var(--font-family)}[data-slot=button][data-size=default],[data-slot=button][data-size=icon]{min-height:var(--control-height)}[data-slot=button][data-variant=destructive]{background:var(--danger-button);color:#fff}[data-slot=dialog-overlay],[data-slot=sheet-overlay]{background:var(--overlay)}[data-slot=input],[data-slot=native-select]{background:var(--background);color:var(--foreground);min-height:var(--control-height)}[data-slot=table-row][data-state=selected]{background:var(--selection)}.nav-item,.identity-button,.theme-option{transition:background-color var(--motion-duration), border-color var(--motion-duration), color var(--motion-duration)}.nav-item:last-child{margin-top:40px}.nav-item:last-child:after{content:"";background:var(--border);height:1px;position:absolute;top:-20px;left:12px;right:12px}.dsp-avatar{--identity-ink:var(--slate);--identity-surface:var(--slate-surface);border-radius:var(--radius);width:36px;height:36px;color:var(--identity-ink);background:var(--identity-surface);letter-spacing:-.2px;flex:0 0 36px;justify-content:center;align-items:center;font-size:12px;font-weight:550;display:inline-flex}.dsp-avatar.tone-1{--identity-ink:var(--sage);--identity-surface:var(--sage-surface)}.dsp-avatar.tone-2{--identity-ink:var(--violet);--identity-surface:var(--violet-surface)}.dsp-avatar.tone-3{--identity-ink:var(--slate);--identity-surface:var(--slate-surface)}.dsp-avatar.tone-4{--identity-ink:var(--steel);--identity-surface:var(--steel-surface)}.backup-avatar.dsp-avatar{color:var(--identity-ink);background:var(--identity-surface)}.dsp-identity-copy{flex-direction:column;gap:3px;min-width:0;display:flex}.dsp-panel-identity,.backup-dsp-identity{align-items:center;gap:12px;display:inline-flex}.dsp-panel-identity .dsp-avatar{flex-basis:40px;width:40px;height:40px}.backup-dsp-identity{white-space:normal}.backup-dsp-identity .dsp-avatar{flex-basis:30px;width:30px;height:30px;font-size:11px}.backup-fleet-summary{grid-template-columns:repeat(4,minmax(0,1fr));padding-block:12px;display:grid}.backup-fleet-metric{padding-inline:24px}.backup-fleet-metric>div{flex-direction:column;gap:5px}.backup-fleet-metric dd{font-variant-numeric:tabular-nums;letter-spacing:-.8px;margin:0;font-size:30px;font-weight:600;line-height:1.2}.backup-fleet-metric dt{font-size:13px}.backup-storage-metrics dd,.backup-storage-total{font-variant-numeric:tabular-nums;letter-spacing:-.6px}.backup-button,.primary-button,.secondary-button{min-height:var(--control-height);border-radius:var(--radius)}.primary-button,.backup-button-primary{color:var(--primary-foreground)}.backup-inspector-heading>div{gap:12px}.backup-workspace .backup-tabs a[aria-current=page]{color:var(--primary);border-color:var(--primary)}.update-notes-panel{padding:0}.update-group-count{background:var(--muted);color:var(--muted-foreground)}.update-feature-changes .update-note-icon{flex-basis:18px;width:18px;height:18px}.update-feature-changes strong{font-size:14px}.update-feature-changes p{margin-top:4px}.update-count-icon .update-note-icon{flex-basis:20px;width:20px;height:20px}.update-feature-group{background:var(--card)}.theme-section{max-width:960px;padding:32px 0}.theme-section fieldset{min-width:0}.theme-section legend{letter-spacing:-.3px;font-size:18px;font-weight:600}.theme-section p{color:var(--muted-foreground);margin-top:8px;font-size:13px;line-height:1.6}.theme-pack-field{border-bottom:1px solid var(--border);grid-template-columns:minmax(140px,1fr) minmax(200px,2fr);gap:8px 32px;max-width:700px;margin-bottom:28px;padding-bottom:28px;display:grid}.theme-pack-field>label{align-self:center;font-weight:600}.theme-pack-field>select{border:1px solid var(--input);border-radius:var(--radius);background:var(--background);min-width:0;max-width:100%;color:var(--foreground);min-height:var(--control-height);padding:8px 12px}.theme-pack-field>p{grid-column:2;margin-top:0}.theme-options{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:22px;display:grid}.theme-option{border:1px solid var(--border);border-radius:var(--radius);background:var(--card);cursor:pointer;grid-template-columns:18px minmax(0,1fr);align-content:start;gap:6px 10px;padding:16px;display:grid}.theme-option:hover{border-color:var(--input)}.theme-option:has(input:checked){border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}.theme-option:has(input:focus-visible){outline:2px solid var(--ring);outline-offset:4px}.theme-option>input{width:16px;height:16px;accent-color:var(--primary);grid-area:2/1;margin-top:3px}.theme-option-label{grid-area:2/2;font-weight:550}.theme-option-description{color:var(--muted-foreground);grid-area:3/2;font-size:12px;line-height:1.6}.theme-preview{aspect-ratio:1.65;border:1px solid var(--border);border-radius:5px;grid-area:1/1/auto/-1;margin-bottom:14px;display:block;position:relative;overflow:hidden}.theme-preview-ui{background:var(--background);height:100%;display:flex}.theme-preview-system>.theme-preview-ui:last-child{clip-path:inset(0 0 0 50%);position:absolute;inset:0}.theme-preview-sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;gap:9px;width:24%;padding:15px 10px;display:flex}.theme-preview-sidebar i{background:var(--muted-foreground);opacity:.45;border-radius:2px;height:4px;display:block}.theme-preview-sidebar i:first-child{background:var(--primary);opacity:1;width:12px;height:12px;margin-bottom:6px}.theme-preview-content{flex:1;padding:20px 12px;display:block}.theme-preview-heading,.theme-preview-subheading{background:var(--muted-foreground);border-radius:2px;width:48%;height:4px;display:block}.theme-preview-subheading{opacity:.45;width:70%;height:3px;margin-top:6px}.theme-preview-table{border:1px solid var(--border);border-radius:3px;margin-top:16px;display:block}.theme-preview-table>span{border-bottom:1px solid var(--border);align-items:center;gap:8px;height:23px;padding:5px;display:flex}.theme-preview-table>span:last-child{border:0}.theme-preview-table i{background:var(--muted-foreground);opacity:.45;border-radius:2px;flex:1;height:3px}.theme-preview-table i:first-child{flex:0 0 8px;height:9px}.theme-section .theme-persistence{margin-top:24px}.theme-section .theme-storage-notice{color:var(--warning)}@media (width<=1100px){.update-feature-changes,.update-details-toggle,.update-expanded-details{margin-left:0}}@media (width<=700px){.theme-options{grid-template-columns:1fr}.theme-option{grid-template-columns:110px 18px minmax(0,1fr);align-content:center;gap:5px 12px}.theme-preview{grid-area:1/1/4;align-self:center;margin:0}.theme-option>input{grid-area:1/2}.theme-option-label{grid-area:1/3}.theme-option-description{grid-area:2/3/4}.theme-preview-content{padding:8px 6px}.theme-preview-heading{height:2px}.theme-preview-subheading{height:2px;margin-top:3px}.theme-preview-sidebar{gap:5px;padding:10px 5px}.theme-preview-sidebar i:first-child{width:8px;height:8px;margin-bottom:0}.theme-preview-table{margin-top:4px}.theme-preview-table>span{gap:4px;height:7px;padding:2px}.theme-preview-table i:first-child{flex-basis:5px;height:5px}.theme-pack-field{grid-template-columns:1fr;gap:10px}.theme-pack-field>p{grid-column:1}}@media (width<=600px){.page-heading{margin-bottom:24px}.inline-summary{margin-bottom:20px}.inline-summary>span{padding-inline:10px}.inline-summary strong,.backup-fleet-metric dd{font-size:26px}.backup-fleet-summary{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:20px}.backup-fleet-metric:nth-child(odd){border-left:0;padding-left:0!important}.backup-fleet-metric dt{font-size:12px}.fleet-table .identity-button{gap:8px;max-width:none}.fleet-table .dsp-identity-copy strong{max-width:120px}.fleet-table .dsp-avatar{flex-basis:28px;width:28px;height:28px;font-size:10px}.theme-option{grid-template-columns:86px 16px minmax(0,1fr);gap:6px 9px;padding:12px}}.update-empty-state{padding:40px 0}.update-empty-state h2{margin-bottom:8px;font-size:20px}.update-browser-columns{grid-template-columns:230px minmax(0,1fr);gap:36px;min-height:calc(100dvh - 260px);display:grid}.update-release-navigation{border-right:1px solid var(--border);min-width:0;padding:24px 24px 32px 0}.update-release-navigation h2{margin:0 12px 18px;font-size:16px;font-weight:600}.update-release-search{border:1px solid var(--border);border-radius:var(--radius);background:var(--background);width:calc(100% - 24px);color:var(--foreground);font:400 14px/1.4 var(--font-family);margin:0 12px 20px;padding:10px 12px;display:block}.update-release-list{margin:0;padding:0;list-style:none}.update-release-list li+li{border-top:1px solid var(--border)}.update-release-link{width:100%;min-height:84px;color:var(--foreground);text-align:left;font:500 14px/1.5 var(--font-family);overflow-wrap:anywhere;border-left:3px solid #0000;flex-wrap:wrap;align-items:center;gap:6px 8px;padding:16px 12px;display:flex}.update-release-link:hover{background:var(--accent)}.update-release-link[aria-current=page]{background:var(--selection);border-left-color:var(--primary)}.update-release-version{width:100%}.update-release-date{color:var(--muted-foreground);font-size:13px;font-weight:400}.update-release-link .update-release-state{color:var(--primary);margin-left:auto}.update-release-state{background:0 0;padding:0;font-size:13px;font-weight:400}.update-browser-content{min-width:0;padding-top:24px}.update-release-meta{flex-wrap:wrap;gap:8px 16px;margin-top:10px;display:flex}.update-release-summary{border-block:1px solid var(--border);margin:24px 0 0;padding:16px 0}.update-feature-group{border:0;border-bottom:1px solid var(--border);border-radius:0;margin:0;padding:24px 0}.update-group-icon{width:28px;height:28px;color:var(--foreground);background:0 0;flex-basis:28px}.update-group-icon .update-note-icon{width:26px;height:26px}.update-group-count{color:var(--muted-foreground);background:0 0;margin-left:auto;padding:0}.update-feature-changes{margin:16px 0 0}.update-feature-changes li{grid-template-columns:88px minmax(0,1fr);gap:16px;padding:14px 0;display:grid}.update-feature-changes li+li{border-top:1px solid var(--border)}.update-change-kind{font-size:13px;font-weight:400}.update-change-kind.added,.update-change-kind.improved{color:var(--primary)}.update-feature-changes strong{font-size:14px;font-weight:550}.update-feature-changes p{margin-top:5px;font-size:14px}.update-details-toggle{min-height:32px;margin:8px 0 0;font-size:14px}.update-expanded-details{margin-left:0}.update-release-navigation>.update-muted{padding:0 12px;font-size:14px}@media (width<=1100px){.update-browser-columns{grid-template-columns:200px minmax(0,1fr);gap:24px}.update-feature-heading{flex-wrap:wrap;gap:8px 12px}}@media (width<=850px){.update-browser-columns{min-height:0;display:block}.update-release-navigation{border-right:0;border-bottom:1px solid var(--border);padding:12px 0 20px}.update-release-navigation h2{margin-left:0}.update-release-search{width:100%;margin-left:0;margin-right:0}.update-release-list{max-height:240px;overflow-y:auto}.update-release-link{min-height:76px}.update-feature-changes li{grid-template-columns:68px minmax(0,1fr);gap:12px}.update-feature-heading h3{font-size:17px}} +.plugin-setting-field{flex-direction:column;gap:.5rem;min-width:0;font-size:.875rem;display:flex}.plugin-setting-field>label,.plugin-setting-toggle label,.plugin-setting-multiple legend{font-weight:500}.plugin-setting-field select,.plugin-setting-field>input{background:var(--background);width:100%;min-height:2.5rem;color:var(--foreground);border:1px solid var(--input);border-radius:.45rem;padding:.5rem .75rem}.plugin-setting-field p,.plugin-setting-toggle p,.plugin-setting-multiple>p{color:var(--muted-foreground);margin:.35rem 0 0;font-size:.8125rem;line-height:1.6}.plugin-setting-toggle{justify-content:space-between;align-items:center;gap:1.25rem;display:flex}.plugin-setting-toggle input{accent-color:var(--primary);flex-shrink:0;width:1.25rem;height:1.25rem}.plugin-setting-multiple{border:0;min-width:0;margin:0;padding:0}.plugin-setting-choice{cursor:pointer;flex:1;align-items:center;gap:.6rem;min-width:0;padding:.6rem 0;font-size:.875rem;display:flex}.plugin-setting-choice input{width:1rem;height:1rem;accent-color:var(--primary);flex-shrink:0}.plugin-setting-choices{border:1px solid var(--border);border-radius:.5rem;margin-top:1rem;overflow:hidden}.plugin-setting-option{border-bottom:1px solid var(--border);align-items:center;gap:.5rem;padding:.35rem .85rem;display:flex}.plugin-setting-option:last-child{border-bottom:0}.plugin-setting-count{white-space:nowrap;color:var(--muted-foreground);margin-left:auto;font-size:.75rem}.plugin-setting-order{flex-shrink:0;display:flex}.plugin-settings-page{flex-direction:column;gap:1.5rem;max-width:56rem;display:flex}.plugin-settings-back{color:var(--muted-foreground);width:max-content;font-size:.8125rem}.plugin-settings-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.5rem;margin-top:1.5rem;display:grid}.plugin-setting-wide{grid-column:1/-1}.plugin-settings-defaults,.plugin-settings-footer{color:var(--muted-foreground);justify-content:space-between;align-items:center;gap:1rem;font-size:.8125rem;display:flex}.plugin-settings-footer{border-top:1px solid var(--border);padding-top:1.25rem}.plugin-settings-footer>div{gap:.5rem;display:flex}.plugin-settings-description{color:var(--muted-foreground);margin-top:1rem;font-size:.875rem}@media (width<=580px){.plugin-settings-fields{grid-template-columns:1fr}.plugin-settings-footer{flex-wrap:wrap}.plugin-settings-footer>div{margin-left:auto}.plugin-settings-page [role=tablist]{flex-wrap:wrap;height:auto}.plugin-settings-defaults{align-items:flex-start}}@media (width<=480px){.plugin-setting-choice{flex-wrap:wrap}.plugin-setting-count{margin-left:1.6rem}.plugin-setting-field select,.plugin-setting-field>input{font-size:1rem}.plugin-setting-option{padding:.3rem .65rem}}.plugin-setting-toggle input{appearance:none;background:var(--muted);border:1px solid var(--border);cursor:pointer;border-radius:999px;width:2.5rem;height:1.4rem;transition:background .15s;position:relative}.plugin-setting-toggle input:after{content:"";background:var(--foreground);border-radius:50%;width:.95rem;height:.95rem;transition:transform .15s;position:absolute;top:.15rem;left:.15rem}.plugin-setting-toggle input:checked{background:var(--primary)}.plugin-setting-toggle input:checked:after{background:var(--primary-foreground);transform:translate(1.1rem)}.plugin-setting-toggle input:focus-visible{outline:2px solid var(--ring);outline-offset:3px}.plugin-setting-source{color:var(--muted-foreground);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.35rem;font-size:.75rem;display:flex}.plugin-setting-help{color:var(--muted-foreground);overflow-wrap:anywhere;margin-top:.25rem;font-size:.75rem;line-height:1.5}.plugin-setting-field select:disabled,.plugin-setting-field input:disabled,.plugin-setting-multiple input:disabled{opacity:.55;cursor:not-allowed}.plugin-settings-preview,.plugin-settings-rule,.plugin-settings-effect{border:1px solid var(--border);overflow-wrap:anywhere;border-radius:.5rem;margin-top:1rem;padding:.85rem 1rem;font-size:.875rem;line-height:1.6}.plugin-settings-rule{border-inline-start:3px solid var(--primary)}.plugin-settings-history{border:1px solid var(--border);border-radius:.5rem;min-width:0;padding:1rem;font-size:.8125rem}.plugin-settings-history h2{font-size:1rem;font-weight:600}.plugin-settings-history>p{color:var(--muted-foreground);margin:.5rem 0 1rem}.plugin-settings-history>details{border-top:1px solid var(--border);padding:.75rem 0}.plugin-settings-history summary{cursor:pointer;overflow-wrap:anywhere;line-height:1.6}.plugin-settings-history ul{margin:.75rem 0 .75rem 1.25rem;list-style:outside}.plugin-settings-history li{overflow-wrap:anywhere;margin-bottom:.5rem}.plugin-settings-history-actions,.plugin-settings-history-pagination{flex-wrap:wrap;gap:.5rem;margin-top:1rem;display:flex}.plugin-settings-history-actions>details{width:100%}.plugin-settings-page [role=tabpanel]>button{margin-top:1rem}@media (width<=580px){.plugin-settings-defaults{flex-wrap:wrap;justify-content:flex-start}.plugin-settings-defaults>span{flex-basis:100%}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-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-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-family);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-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:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){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}*{border-color:var(--border)}body{min-width:320px;font-size:var(--body-size);margin:0;line-height:1.5}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:default}a{text-decoration:none}h1,h2,h3,p{margin:0}h2{letter-spacing:-.25px;font-size:16px;font-weight:600}svg{flex-shrink:0}:focus-visible{outline:2px solid var(--ring);outline-offset:3px}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.\@container\/field-group{container:field-group/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-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-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-dropdown-menu-content-available-height\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\[90dvh\]{max-height:90dvh}.min-h-4{min-height:calc(var(--spacing) * 4)}.w-48{width:calc(var(--spacing) * 48)}.w-\[28\%\]{width:28%}.w-\[45\%\]{width:45%}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-dropdown-menu-content-transform-origin\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-items-start{justify-items:start}.gap-1{gap:var(--spacing)}.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-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-\[Canvas\]{background-color:canvas}.bg-accent{background-color:var(--accent)}.bg-background{background-color:var(--background)}.bg-black\/15{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.bg-black\/15{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted,.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.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-sm\/relaxed{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.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))}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[CanvasText\]{color:canvastext}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--primary)}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-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-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.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-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}.group-has-\[\[data-orientation\=horizontal\]\]\/field\:text-balance:is(:where(.group\/field):has([data-orientation=horizontal]) *){text-wrap:balance}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *),.group-data-\[disabled\=true\]\/field\:opacity-50:is(:where(.group\/field)[data-disabled=true] *){opacity:.5}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-data-\[variant\=outline\]\/field-group\:-mb-2:is(:where(.group\/field-group)[data-variant=outline] *){margin-bottom:calc(var(--spacing) * -2)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:mt-0:last-child{margin-top:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.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(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[state\=checked\]\:border-primary:has([data-state=checked]){border-color:var(--primary)}.has-data-\[state\=checked\]\:bg-primary\/5:has([data-state=checked]){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.has-data-\[state\=checked\]\:bg-primary\/5:has([data-state=checked]){background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.has-\[select\:disabled\]\:opacity-50:has(:is(select:disabled)){opacity:.5}.has-\[\>\[data-slot\=checkbox-group\]\]\:gap-3:has(>[data-slot=checkbox-group]){gap:calc(var(--spacing) * 3)}.has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}.has-\[\>\[data-slot\=field\]\]\:w-full:has(>[data-slot=field]){width:100%}.has-\[\>\[data-slot\=field\]\]\:flex-col:has(>[data-slot=field]){flex-direction:column}.has-\[\>\[data-slot\=field\]\]\:rounded-md:has(>[data-slot=field]){border-radius:var(--radius)}.has-\[\>\[data-slot\=field\]\]\:border:has(>[data-slot=field]){border-style:var(--tw-border-style);border-width:1px}.has-\[\>\[data-slot\=radio-group\]\]\:gap-3:has(>[data-slot=radio-group]){gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}.has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--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(--destructive) 20%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:var(--destructive)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:py-1[data-size=sm]{padding-block:var(--spacing)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.data-\[slot\=checkbox-group\]\:gap-3[data-slot=checkbox-group]{gap:calc(var(--spacing) * 3)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:duration-200[data-state=open]{--tw-duration:.2s;transition-duration:.2s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--destructive)}.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.data-\[variant\=destructive\]\:focus\:bg-destructive\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.data-\[variant\=destructive\]\:focus\:text-destructive[data-variant=destructive]:focus{color:var(--destructive)}.data-\[variant\=label\]\:text-sm[data-variant=label]{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.data-\[variant\=legend\]\:text-base[data-variant=legend]{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}.nth-last-2\:-mt-1:nth-last-child(2){margin-top:calc(var(--spacing) * -1)}@media (width>=40rem){.sm\:max-w-\[440px\]{max-width:440px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container field-group (width>=28rem){.\@md\/field-group\:flex-row{flex-direction:row}.\@md\/field-group\:items-center{align-items:center}.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}}.dark\:border-input:where([data-theme=dark],[data-theme=dark] *){border-color:var(--input)}.dark\:bg-destructive\/60:where([data-theme=dark],[data-theme=dark] *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/60:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\:hover\:bg-input\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:text-foreground:where([data-theme=dark],[data-theme=dark] *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:has-data-\[state\=checked\]\:bg-primary\/10:where([data-theme=dark],[data-theme=dark] *):has([data-state=checked]){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:has-data-\[state\=checked\]\:bg-primary\/10:where([data-theme=dark],[data-theme=dark] *):has([data-state=checked]){background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where([data-theme=dark],[data-theme=dark] *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[state\=active\]\:bg-input\/30:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-\[state\=active\]\:text-foreground:where([data-theme=dark],[data-theme=dark] *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:where([data-theme=dark],[data-theme=dark] *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:where([data-theme=dark],[data-theme=dark] *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where([data-theme=dark],[data-theme=dark] *)[data-variant=destructive]:focus{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:where([data-theme=dark],[data-theme=dark] *)[data-variant=destructive]:focus{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_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)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6 svg:not([class*=size-]){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}:is(.data-\[variant\=destructive\]\:\*\:\[svg\]\:text-destructive\![data-variant=destructive]>*):is(svg){color:var(--destructive)!important}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>\*\]\:data-\[slot\=field\]\:p-4>[data-slot=field]{padding:calc(var(--spacing) * 4)}@container field-group (width>=28rem){.\@md\/field-group\:\[\&\>\*\]\:w-auto>*{width:auto}}.\[\&\>\.sr-only\]\:w-auto>.sr-only{width:auto}.\[\&\>\[data-slot\=field-group\]\]\:gap-4>[data-slot=field-group]{gap:calc(var(--spacing) * 4)}.\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}@container field-group (width>=28rem){.\@md\/field-group\:\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}@container field-group (width>=28rem){:is(.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}}.\[\&\>a\]\:underline>a{text-decoration-line:underline}.\[\&\>a\]\:underline-offset-4>a{text-underline-offset:4px}.\[\&\>a\:hover\]\:text-primary>a:hover{color:var(--primary)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-current>svg{color:currentColor}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}[data-variant=legend]+.\[\[data-variant\=legend\]\+\&\]\:-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab, var(--secondary) 90%, transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.backup-workspace,.backup-dialog{--backup-ink:var(--foreground);--backup-muted:var(--muted-foreground);--backup-border:var(--border);--backup-blue:var(--primary);color:var(--backup-ink);font-size:14px;line-height:1.5}.backup-workspace h1{letter-spacing:-.7px;margin:0;font-size:32px;line-height:1.2}.backup-workspace h2,.backup-dialog h2{letter-spacing:-.25px;margin:0 0 20px;font-size:18px;line-height:1.4}.backup-workspace h3,.backup-dialog h3{margin:0 0 12px;font-size:15px;line-height:1.5}.backup-workspace p,.backup-dialog p{line-height:1.6}.backup-workspace input,.backup-workspace select,.backup-dialog input,.backup-dialog select{font:inherit;color:inherit}.backup-workspace select,.backup-workspace input:not([type=checkbox]),.backup-dialog select,.backup-dialog input:not([type=checkbox]){border:1px solid var(--input);background:var(--background);border-radius:6px;max-width:100%;min-height:40px;padding:9px 12px;font-size:13px}.backup-workspace input[type=checkbox],.backup-dialog input[type=checkbox]{width:18px;height:18px;accent-color:var(--backup-blue);flex-shrink:0}.backup-header{justify-content:space-between;align-items:center;gap:20px;margin-bottom:24px;display:flex}.backup-actions{flex-wrap:wrap;align-items:center;gap:18px;display:flex}.backup-button{border:1px solid var(--backup-border);min-height:40px;font:600 13px/1.3 var(--font-family);cursor:pointer;background:var(--background);color:var(--backup-ink);border-radius:7px;justify-content:center;align-items:center;gap:9px;padding:10px 17px;text-decoration:none;transition:background .15s;display:inline-flex}.backup-button-primary{color:var(--primary-foreground);background:var(--backup-blue);border-color:var(--backup-blue)}.backup-button-primary:hover{background:var(--primary-hover)}.backup-button-secondary:hover{background:var(--accent)}.backup-button-warning{background:var(--warning-button);color:var(--warning-button-foreground);border-color:var(--warning-border)}.backup-button-warning:hover{background:var(--warning-button)}.backup-button-icon{background:0 0;border-color:#0000;min-width:36px;min-height:36px;padding:8px}.backup-workspace button:disabled,.backup-dialog button:disabled,.backup-dialog input:disabled{opacity:.5;cursor:not-allowed}.backup-link{color:var(--backup-blue);align-items:center;gap:8px;font-size:13px;font-weight:600;text-decoration:none;display:inline-flex}.backup-link:hover{text-decoration:underline}.backup-icon{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;flex:0 0 20px;width:20px;height:20px}.backup-tabs{border-bottom:1px solid var(--backup-border);gap:32px;margin-bottom:26px;display:flex;overflow-x:auto}.backup-tabs a{color:var(--foreground);white-space:nowrap;border-bottom:3px solid #0000;padding:0 4px 17px;font-size:14px}.backup-tabs a[aria-current=page]{border-color:var(--backup-blue);color:var(--backup-blue)}.backup-card{background:var(--background);border:1px solid var(--backup-border);border-radius:10px;min-width:0;padding:24px}.backup-card-title{align-items:center;gap:15px;display:flex}.backup-icon-tile{background:var(--selection);width:40px;height:40px;color:var(--primary);border-radius:11px;flex:0 0 40px;justify-content:center;align-items:center;display:inline-flex}.backup-icon-tile.warning{background:var(--warning-surface);color:var(--warning)}.backup-icon-tile.success{background:var(--success-surface);color:var(--success)}.backup-overview-grid{grid-template-columns:minmax(0,2.2fr) minmax(300px,1fr);align-items:start;gap:22px;margin-bottom:22px;display:grid}.backup-stack{gap:22px;min-width:0;display:grid}.backup-attention{border:1px solid var(--warning-border);background:var(--warning-surface);border-radius:10px;align-items:center;gap:20px;padding:24px;display:flex}.backup-attention .backup-icon-tile{border:1px solid var(--warning-border);flex-basis:64px;width:64px;height:64px}.backup-attention .backup-icon-tile svg{width:30px;height:30px}.backup-attention h2{margin:0 0 6px;font-size:17px}.backup-attention p{margin:0;font-size:13px}.backup-attention>div{flex:1}.backup-attention .backup-button{flex-shrink:0}.backup-pairs{margin:0 0 18px}.backup-pairs>div{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:18px;padding:14px 0;font-size:13px;display:flex}.backup-pairs dt{font-weight:500}.backup-pairs dd{text-align:right;overflow-wrap:anywhere;margin:0}.backup-muted{color:var(--backup-muted);font-size:13px}.backup-toolbar{flex-wrap:wrap;align-items:end;gap:16px;margin:0 0 22px;display:flex}.backup-search-wrap{align-items:center;width:320px;max-width:100%;display:flex;position:relative}.backup-search-wrap>svg{color:var(--muted-foreground);pointer-events:none;position:absolute;left:12px}.backup-search-wrap input{width:100%;padding-left:40px!important}.backup-search-wrap input::placeholder{color:var(--muted-foreground)}.backup-table-scroll{max-width:100%;overflow-x:auto}.backup-table{border-collapse:separate;border-spacing:0;text-align:left;width:100%;min-width:570px;margin:0}.backup-table th{text-transform:uppercase;letter-spacing:.04em;color:var(--foreground);background:var(--background);border:0;height:auto;padding:8px 12px 17px;font-size:11px;font-weight:600;line-height:1.4}.backup-table td{border-bottom:1px solid var(--border);background:var(--background);vertical-align:middle;height:auto;padding:17px 12px;font-size:13px;line-height:1.5}.backup-table td:first-child{padding-left:12px}.backup-table tbody tr:first-child td:first-child{border-top-left-radius:8px}.backup-table tbody tr:first-child td:last-child{border-top-right-radius:8px}.backup-table td:first-child{border-left:1px solid var(--border)}.backup-table td:last-child{border-right:1px solid var(--border);text-align:right}.backup-table tbody tr:last-child td:first-child{border-bottom-left-radius:8px}.backup-table tbody tr:last-child td:last-child{border-bottom-right-radius:8px}.backup-table tr:hover td{background:var(--accent)}.backup-dsp-name{color:var(--backup-ink);font-size:13px;font-weight:600}.backup-table .backup-dsp-name{white-space:nowrap}.backup-avatar{width:38px;height:42px;color:var(--primary);background:var(--selection);border-radius:10px;flex:0 0 38px;justify-content:center;align-items:center;font-size:15px;font-weight:600;display:inline-flex}.backup-avatar.tone-1{color:var(--success);background:var(--success-surface)}.backup-avatar.tone-2{color:var(--warning);background:var(--warning-surface)}.backup-avatar.tone-3{color:var(--violet);background:var(--violet-surface)}.backup-status{white-space:nowrap;color:var(--muted-foreground);align-items:center;gap:8px;font-size:13px;font-weight:500;display:inline-flex}.backup-status.verified,.backup-status.completed{color:var(--success)}.backup-status.failed{color:var(--warning)}.backup-status.running,.backup-status.pending,.backup-status.queued{color:var(--primary)}.backup-note{border:1px solid var(--border);background:var(--surface);border-radius:8px;align-items:center;gap:12px;margin:20px 0;padding:18px 20px;font-size:13px;line-height:1.6;display:flex}.backup-note>span{flex:1;min-width:0}.backup-note .backup-link{flex-shrink:0}.backup-note-warning{border-color:var(--warning-border);color:var(--warning);background:var(--warning-surface)}.backup-note-check,.backup-note-shield{color:var(--foreground)}.backup-card>.backup-note:last-child{background:0 0;border:0;margin:20px 0 0;padding:8px 0 0}.backup-core-note{margin:6px 0 0}.backup-activity{margin:0 0 22px;padding:0;list-style:none}.backup-activity li+li{border-top:1px solid var(--border)}.backup-activity-entry{grid-template-columns:36px minmax(0,1fr) minmax(72px,.6fr);align-items:center;gap:12px;padding:17px 0;display:grid}.backup-activity-entry:hover strong{color:var(--backup-blue)}.backup-activity-entry .backup-icon-tile{width:36px;height:36px}.backup-activity strong{font-size:13px;font-weight:600;display:block}.backup-activity small{color:var(--backup-muted);margin-top:3px;font-size:12px;display:block}.backup-activity time{color:var(--backup-muted);text-align:right;font-size:12px}.backup-breadcrumb{color:var(--backup-muted);flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 20px;font-size:13px;display:flex}.backup-breadcrumb svg{flex-basis:13px;width:13px;height:13px}.backup-page-title{justify-content:space-between;align-items:center;gap:18px;margin-bottom:24px;display:flex}.backup-page-title h2{margin:0;font-size:26px}.backup-page-title p{margin:6px 0 0}.backup-summary{border:1px solid var(--backup-border);background:var(--background);border-radius:8px;flex-wrap:wrap;align-items:center;gap:24px;margin-bottom:20px;padding:20px;font-size:13px;display:flex}.backup-workspace>.backup-card{margin-bottom:20px}.backup-pagination{color:var(--backup-muted);justify-content:space-between;align-items:center;gap:20px;padding-top:20px;font-size:12px;display:flex}.backup-pagination .backup-button{min-height:34px;padding:8px 10px}.backup-field{flex-direction:column;gap:8px;margin:0;font-size:13px;display:flex}.backup-field>span{font-weight:600}.backup-form-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;display:grid}.backup-field input:not([type=checkbox]),.backup-field select{width:100%}.backup-card-heading{justify-content:space-between;align-items:center;gap:20px;margin-bottom:22px;display:flex}.backup-card-heading h2,.backup-card-heading h3{margin:0}.backup-card-heading .backup-field{flex-direction:row;align-items:center}.backup-form-section{border-top:1px solid var(--backup-border);margin-top:26px;padding-top:24px}.backup-form-section .backup-field{max-width:560px}.backup-form-footer{border-top:1px solid var(--backup-border);justify-content:flex-end;align-items:center;gap:12px;margin-top:24px;padding-top:24px;display:flex}.backup-switch{appearance:none;background:var(--input);cursor:pointer;border-radius:20px;position:relative;width:42px!important;height:24px!important}.backup-switch:checked{background:var(--success)}.backup-switch:after{content:"";background:var(--background);border-radius:50%;width:18px;height:18px;transition:transform .15s;position:absolute;top:3px;left:3px}.backup-switch:checked:after{transform:translate(18px)}.backup-filter-tabs{gap:10px;margin-bottom:22px;display:flex}.backup-filter-tabs button[aria-pressed=true]{background:var(--selection);border-color:var(--primary);color:var(--backup-blue)}.backup-detail-pairs{grid-template-columns:repeat(3,minmax(0,1fr));gap:0 28px;margin-top:20px;display:grid}.backup-detail-pairs>div{flex-direction:column;align-items:flex-start;gap:5px}.backup-detail-pairs dd{text-align:left}.backup-empty{text-align:center;color:var(--backup-muted);padding:36px 20px}.backup-empty>svg{margin:0 auto 14px}.backup-empty h3{color:var(--backup-ink)}.backup-empty p{margin:8px 0 18px}.backup-notice{background:var(--selection);border:1px solid var(--selection);border-radius:8px;margin:0 0 20px;padding:14px 18px;font-size:13px}.backup-error{color:var(--destructive);font-size:13px;line-height:1.6}.backup-error:empty{display:none}.backup-progress{background:var(--selection);border-radius:8px;width:100%;height:7px;margin:24px 0;display:block;position:relative;overflow:hidden}.backup-progress:after{content:"";background:var(--backup-blue);border-radius:inherit;width:35%;animation:1.8s ease-in-out infinite alternate backup-progress;position:absolute;inset:0 auto 0 0}@keyframes backup-progress{to{transform:translate(185%)}}.backup-stages{margin:24px 0;padding:0;list-style:none}.backup-stages li{border-bottom:1px solid var(--border);grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:14px;padding:22px 0;display:grid}.backup-stages small{color:var(--backup-muted);font-size:12px}.backup-stages .done>svg{color:var(--success)}.backup-stages .active{color:var(--backup-blue)}.backup-stages .pending{color:var(--muted-foreground)}.backup-issue-card>h3{margin:20px 0 10px}.backup-technical{border-top:1px solid var(--backup-border);margin-top:26px;padding-top:22px}.backup-technical summary{cursor:pointer;font-weight:600}.backup-technical .backup-pairs{margin-top:12px}.backup-dialog{border:1px solid var(--border);background:var(--background);width:min(680px,100% - 32px);max-height:calc(100dvh - 32px);box-shadow:0 24px 80px var(--shadow-color);border-radius:12px;padding:28px;overflow-y:auto}.backup-dialog .backup-card-heading{margin-bottom:10px}.backup-dialog h2{font-size:23px}.backup-dialog .backup-pairs{margin-top:14px}.backup-dialog .backup-note{margin:18px 0;padding:14px}.backup-check-row{flex-direction:row-reverse;justify-content:flex-end;align-items:center;gap:12px;margin:20px 0}.backup-check-row span{font-weight:400}.backup-selection-list{border:1px solid var(--backup-border);border-radius:7px;max-height:360px;overflow-y:auto}.backup-selection-row{cursor:pointer;align-items:center;gap:14px;padding:13px;display:flex}.backup-selection-row+.backup-selection-row{border-top:1px solid var(--border)}.backup-selection-row strong{flex:1;font-size:13px;font-weight:600}.backup-selection-row .backup-status{font-size:12px}.backup-workspace :focus-visible,.backup-dialog :focus-visible{outline:3px solid var(--ring);outline-offset:3px}.backup-spin{animation:1.5s linear infinite backup-spin}@keyframes backup-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.backup-spin,.backup-progress:after{animation:none}}@media (width<=1250px){.backup-overview-grid{grid-template-columns:minmax(0,1.7fr) minmax(280px,1fr)}.backup-attention{flex-wrap:wrap}.backup-attention>div{min-width:200px}.backup-header .backup-actions{gap:14px}.backup-header .backup-status{font-size:12px}.backup-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=1050px){.backup-overview-grid{grid-template-columns:1fr}.backup-overview-grid>aside.backup-stack{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-page-title{flex-wrap:wrap}.backup-header{align-items:flex-start}.backup-header .backup-actions{justify-content:flex-end}}@media (width<=760px){.backup-table{display:table}.backup-table thead{display:table-header-group}.backup-table tbody{padding:0;display:table-row-group}.backup-table tr{border:0;padding:0;display:table-row}.backup-table td{display:table-cell}.backup-table td:before{display:none}.backup-detail-pairs{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-toolbar>.backup-field{flex:1;min-width:130px}.backup-overview-grid>aside.backup-stack{grid-template-columns:1fr}}@media (width<=600px){.backup-header{flex-direction:column;gap:20px}.backup-header .backup-actions{justify-content:flex-start;gap:16px}.backup-header h1{font-size:28px}.backup-tabs{gap:22px}.backup-tabs a{padding-bottom:13px;font-size:13px}.backup-card{padding:18px}.backup-attention{gap:14px;padding:18px}.backup-attention .backup-icon-tile{flex-basis:42px;width:42px;height:42px}.backup-attention>div{min-width:150px}.backup-attention h2{font-size:16px}.backup-attention .backup-button{margin-left:56px}.backup-note{flex-wrap:wrap;gap:10px;padding:14px}.backup-note>span{flex-basis:calc(100% - 40px)}.backup-core-note .backup-link{margin-left:30px}.backup-form-grid,.backup-detail-pairs{grid-template-columns:1fr}.backup-page-title h2{font-size:23px}.backup-page-title .backup-actions{gap:12px;width:100%}.backup-page-title select{width:100%}.backup-card-heading{flex-wrap:wrap;gap:12px}.backup-pagination{flex-wrap:wrap}.backup-dialog{padding:20px}.backup-dialog h2{font-size:20px}.backup-selection-row{flex-wrap:wrap;gap:10px}.backup-selection-row .backup-status{flex-basis:calc(100% - 28px);margin-left:28px}.backup-selection-row .backup-avatar{flex-basis:30px;width:30px;height:34px}.backup-selection-row strong{min-width:140px}.backup-stages li{grid-template-columns:24px minmax(0,1fr)}.backup-stages small{grid-column:2}.backup-summary{gap:14px}.backup-form-footer{flex-wrap:wrap}.backup-toolbar .backup-search-wrap{width:100%}}.backup-table td{padding-block:10px}.backup-attention{padding-block:20px}.backup-core-note>span{flex:0 auto}.backup-core-note>.backup-link{border:1px solid var(--border);background:var(--background);border-radius:6px;padding:6px 12px}.backup-attention .backup-icon-tile .backup-icon{flex-basis:30px;width:30px;height:30px}@media (width<=600px){.backup-dsp-table-wrap .backup-table{min-width:0;display:block}.backup-dsp-table-wrap .backup-table thead{clip-path:inset(50%);width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.backup-dsp-table-wrap .backup-table tbody{display:block}.backup-dsp-table-wrap .backup-table tr{border-bottom:1px solid var(--border);border-radius:0;grid-template-columns:minmax(0,1fr) 24px;gap:6px 8px;margin:0;padding:13px 0;display:grid}.backup-dsp-table-wrap .backup-table td{grid-column:1;display:block;border:0!important;padding:0!important}.backup-dsp-table-wrap .backup-table td:last-child{grid-area:1/2/4;align-self:center}.backup-dsp-table-wrap .backup-table td:nth-child(2),.backup-dsp-table-wrap .backup-table td:nth-child(3){padding-left:46px!important}.backup-dsp-table-wrap .backup-table td:nth-child(2){color:var(--backup-muted);font-size:12px}.backup-dsp-table-wrap .backup-table .backup-dsp-name{white-space:normal;gap:10px}.backup-dsp-table-wrap .backup-avatar{flex-basis:36px;width:36px;height:36px}}.backup-fleet-summary{border:1px solid var(--backup-border);background:var(--background);border-radius:10px;grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 30px;padding:30px 24px;display:grid}.backup-fleet-metric{align-items:center;gap:24px;padding:0 24px;display:flex}.backup-fleet-metric+.backup-fleet-metric{border-left:1px solid var(--backup-border)}.backup-fleet-metric .backup-icon-tile{border-radius:18px;flex-basis:68px;width:68px;height:68px}.backup-fleet-metric .backup-icon{flex-basis:30px;width:30px;height:30px;animation:none}.backup-fleet-metric dd{margin:0 0 2px;font-size:32px;font-weight:700;line-height:1.2}.backup-fleet-metric.success dd{color:var(--success)}.backup-fleet-metric.warning dd{color:var(--warning)}.backup-overview-issues{border-color:var(--warning-border);padding:22px}.backup-overview-issues h2{color:var(--warning);align-items:center;gap:12px;margin-bottom:18px;font-size:16px;display:flex}.backup-overview-issues h2 .backup-icon{flex-basis:25px;width:25px;height:25px}.backup-issue-row{align-items:center;gap:20px;display:flex}.backup-issue-row+.backup-issue-row{border-top:1px solid var(--warning-border);margin-top:18px;padding-top:18px}.backup-issue-row>div{flex:1;min-width:0}.backup-issue-row strong{font-size:15px}.backup-issue-row p{margin:6px 0 0}.backup-issue-row>.backup-link{flex-shrink:0}.backup-issue-row .backup-avatar{width:58px;height:58px;color:var(--warning);background:var(--warning-surface);border-radius:14px;flex-basis:58px;font-size:20px}.backup-overview-issues>.backup-link{margin-top:20px}.backup-dashboard-grid .backup-activity-entry{padding:14px 0}.backup-dashboard-grid .backup-activity{margin-bottom:20px}.backup-dashboard-grid .backup-card-title{margin-bottom:26px}.backup-next-layout{grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:24px;margin:38px 0;display:grid}.backup-next-when{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.backup-next-when strong{white-space:nowrap;font-size:30px;line-height:1.3}.backup-next-when .backup-muted{overflow-wrap:anywhere;font-size:13px}.backup-next-policy{border-left:1px solid var(--backup-border);align-content:start;gap:20px;padding-left:24px;font-size:13px;display:grid}.backup-next-policy>div{align-items:center;gap:14px;display:flex}.backup-next-policy .backup-icon{color:var(--backup-muted)}.backup-core-summary>.backup-status{margin:4px 0 0;font-size:15px;font-weight:600}.backup-core-summary>p{margin:10px 0 30px 28px}.backup-core-summary>.backup-link{margin-right:22px}.backup-inspector{border:1px solid var(--backup-border);background:var(--background);border-radius:10px;grid-template-columns:minmax(300px,1fr) minmax(0,2.05fr);min-height:640px;display:grid;overflow:hidden}.backup-dsp-navigator{border-right:1px solid var(--backup-border);min-width:0;padding:28px 16px}.backup-dsp-navigator .backup-toolbar{flex-wrap:nowrap;gap:16px;margin:0 10px 26px}.backup-dsp-navigator .backup-search-wrap{flex:1;min-width:0}.backup-dsp-navigator select{width:145px;min-width:0}.backup-dsp-list{max-height:550px;scroll-padding:8px;overflow-y:auto}.backup-dsp-option{border:1px solid #0000;border-bottom-color:var(--border);color:var(--backup-ink);border-radius:0;align-items:center;gap:16px;padding:20px 16px;text-decoration:none;display:flex}.backup-dsp-option strong{overflow-wrap:anywhere;flex:1;min-width:0;font-size:13px;line-height:1.5}.backup-dsp-option .backup-status{flex-shrink:0;font-size:12px}.backup-dsp-option .backup-avatar{flex-basis:42px;width:42px;height:42px}.backup-dsp-option:hover{background:var(--accent)}.backup-dsp-option[aria-current=page]{background:var(--selection);border-color:var(--border);border-radius:7px}.backup-dsp-inspector-detail{min-width:0;padding:36px 30px}.backup-inspector-heading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:25px;display:flex}.backup-inspector-heading>div{flex-wrap:wrap;align-items:center;gap:22px;display:flex}.backup-inspector-heading h2{margin:0;font-size:28px}.backup-inspector-heading .backup-button{flex-shrink:0}.backup-inspector-heading .backup-status{background:var(--muted);border-radius:6px;padding:7px 12px}.backup-inspector-heading .backup-status.verified{background:var(--success-surface)}.backup-inspector-heading .backup-status.failed{background:var(--warning-surface)}.backup-inspector-heading .backup-status.running,.backup-inspector-heading .backup-status.pending{background:var(--selection)}.backup-inspector-metadata{color:var(--backup-muted);border-bottom:1px solid var(--backup-border);flex-wrap:wrap;align-items:center;gap:22px;margin-bottom:30px;padding-bottom:30px;font-size:13px;display:flex}.backup-inspector-metadata>span{align-items:center;gap:10px;display:flex}.backup-inspector-metadata>span+span{border-left:1px solid var(--backup-border);padding-left:22px}.backup-dsp-inspector-detail>h3{margin-bottom:26px;font-size:17px}.backup-dsp-inspector-detail>.backup-note{margin-bottom:26px}.backup-dsp-inspector-detail>.backup-link{margin-top:26px}.backup-inspector-history .backup-table{min-width:550px}.backup-inspector-history .backup-table th{padding-left:12px}.backup-inspector-history .backup-table td{border-left:0;border-right:0;padding:19px 12px}.backup-inspector-history .backup-table tbody tr:first-child td{background:var(--surface)}.backup-inspector-history .backup-table td:last-child{white-space:nowrap}@media (width<=1500px){.backup-fleet-metric{gap:16px;padding-inline:16px}.backup-fleet-metric .backup-icon-tile{flex-basis:54px;width:54px;height:54px}.backup-dsp-navigator .backup-toolbar{flex-wrap:wrap}.backup-dsp-navigator .backup-search-wrap{flex-basis:100%}.backup-dsp-navigator select{width:100%}.backup-dsp-option{flex-wrap:wrap;gap:8px 12px}.backup-dsp-option .backup-status{flex-basis:calc(100% - 54px);margin-left:54px}.backup-inspector-heading{flex-wrap:wrap;align-items:flex-start}.backup-next-layout{grid-template-columns:1fr;margin:26px 0}.backup-next-policy{border-left:0;gap:12px;padding-left:0}}@media (width<=1100px){.backup-fleet-summary{padding:24px 12px}.backup-fleet-metric{gap:12px;padding-inline:12px}.backup-fleet-metric .backup-icon-tile{display:none}.backup-fleet-metric dd{font-size:28px}.backup-dashboard-grid{grid-template-columns:1fr}.backup-dashboard-grid>aside.backup-stack{grid-template-columns:repeat(2,minmax(0,1fr))}.backup-inspector{grid-template-columns:1fr}.backup-dsp-navigator{border-right:0;border-bottom:1px solid var(--backup-border);padding:20px}.backup-dsp-navigator .backup-toolbar{flex-wrap:nowrap;margin:0 0 16px}.backup-dsp-navigator select{width:180px}.backup-dsp-list{max-height:255px}.backup-dsp-option{flex-wrap:nowrap}.backup-dsp-option .backup-status{flex-basis:auto;margin-left:0}.backup-inspector-heading{flex-wrap:nowrap}}@media (width<=600px){.backup-fleet-summary{grid-template-columns:repeat(2,minmax(0,1fr));gap:0;padding:10px 18px}.backup-fleet-metric{padding:18px 12px}.backup-fleet-metric:nth-child(3){border-left:0}.backup-fleet-metric:nth-child(n+3){border-top:1px solid var(--backup-border)}.backup-fleet-metric dt{font-size:12px}.backup-dashboard-grid>aside.backup-stack{grid-template-columns:1fr}.backup-issue-row{flex-wrap:wrap;gap:12px}.backup-issue-row>.backup-link{margin-left:70px}.backup-next-layout{grid-template-columns:1fr}.backup-next-policy{border-left:0;padding-left:0}.backup-dsp-inspector-detail{padding:24px 18px}.backup-inspector-heading{flex-wrap:wrap}.backup-inspector-heading h2{font-size:23px}.backup-dsp-navigator .backup-toolbar{flex-wrap:wrap}.backup-dsp-navigator select{width:100%}.backup-dsp-option{gap:8px;padding:14px 10px}.backup-dsp-option strong{font-size:12px}.backup-dsp-option .backup-status{gap:5px;font-size:11px}.backup-dsp-option .backup-avatar{flex-basis:32px;width:32px;height:36px}.backup-inspector-metadata{gap:14px}.backup-inspector-metadata>span+span{border-left:0;padding-left:0}.backup-issue-row{grid-template-columns:58px minmax(0,1fr);align-items:start;display:grid}.backup-issue-row>.backup-link{grid-column:2;margin-left:0}.backup-inspector-history .backup-table{min-width:0;display:block}.backup-inspector-history .backup-table thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-inspector-history .backup-table tbody{display:block}.backup-inspector-history .backup-table tr{border-bottom:1px solid var(--backup-border);grid-template-columns:minmax(0,1fr) auto;gap:5px 10px;margin:0;padding:16px 0;display:grid}.backup-inspector-history .backup-table td{grid-column:1;padding:0;display:block;background:0 0!important;border:0!important}.backup-inspector-history .backup-table td:first-child{font-weight:600}.backup-inspector-history .backup-table td:last-child{grid-area:1/2/span 3;align-self:center}.backup-inspector-history .backup-table tbody tr:first-child{background:var(--surface)}}.backup-workspace.backup-streamlined{--backup-section-gap:36px;min-width:0;font-size:15px}.backup-streamlined .backup-header{align-items:center;margin-bottom:46px}.backup-workspace.backup-streamlined h1{letter-spacing:-1.2px;font-size:38px;font-weight:600}.backup-streamlined .backup-tabs{gap:36px;margin-bottom:0}.backup-streamlined .backup-tabs a{padding:0 6px 20px;font-size:15px;font-weight:450}.backup-streamlined .backup-header .backup-actions{gap:28px}.backup-streamlined .backup-button{min-height:44px;padding:11px 18px;font-size:15px}.backup-streamlined .backup-link{font-size:15px;font-weight:450}.backup-streamlined .backup-button-text{color:var(--primary);background:0 0;border:0;justify-content:flex-start;min-height:32px;padding:0;font-weight:450}.backup-streamlined .backup-button-text:hover{text-decoration:underline}.backup-streamlined .backup-split{grid-template-columns:minmax(0,2.2fr) minmax(250px,1fr);gap:0;min-height:550px;display:grid}.backup-streamlined .backup-split:has(>aside[hidden]){grid-template-columns:minmax(0,1fr)}.backup-streamlined .backup-main{min-width:0;padding:36px 42px 40px 0}.backup-streamlined .backup-rail{border-left:1px solid var(--border);min-width:0;padding:36px 0 40px 34px}.backup-streamlined .backup-rail[hidden]{display:none}.backup-streamlined .backup-section{min-width:0}.backup-streamlined .backup-section>h2,.backup-streamlined .backup-scope-heading h2{letter-spacing:-.35px;margin:0 0 24px;font-size:19px;font-weight:600}.backup-streamlined .backup-main>.backup-section+.backup-section{margin-top:var(--backup-section-gap);padding-top:var(--backup-section-gap);border-top:1px solid var(--border)}.backup-streamlined .backup-rail>.backup-section+.backup-section{border-top:1px solid var(--border);margin-top:32px;padding-top:32px}.backup-streamlined .backup-section p{margin:0 0 16px}.backup-streamlined .backup-rail p{overflow-wrap:anywhere;line-height:1.6}.backup-streamlined .backup-rail>p{border-top:1px solid var(--border);margin-top:28px;padding-top:28px}.backup-streamlined .backup-latest{flex-wrap:wrap;align-items:center;gap:16px;margin:26px 0 14px;display:flex}.backup-streamlined .backup-latest>p{letter-spacing:-.65px;margin:0;font-size:25px;line-height:1.4}.backup-streamlined .backup-latest+p{margin-bottom:26px}.backup-streamlined .backup-latest-label{margin-top:32px}.backup-streamlined .backup-latest-label+.backup-latest{margin-top:8px}.backup-streamlined .backup-status{white-space:nowrap;font-size:14px}.backup-streamlined .backup-status:before{flex-shrink:0;width:7px;height:7px}.backup-streamlined .backup-latest .backup-status:before,.backup-streamlined .backup-scope-heading .backup-status:before{display:none}.backup-streamlined .backup-latest .backup-status svg,.backup-streamlined .backup-scope-heading .backup-status svg{display:block}.backup-streamlined .backup-latest .backup-status.verified,.backup-streamlined .backup-scope-heading .backup-status.verified{color:var(--success)!important}.backup-streamlined .backup-off{color:var(--warning);margin-left:8px}.backup-streamlined .backup-table-scroll{border:0;border-radius:0;overflow-x:auto}.backup-streamlined .backup-table{table-layout:auto;width:100%;min-width:0;display:table}.backup-streamlined .backup-table thead{display:table-header-group}.backup-streamlined .backup-table tbody{display:table-row-group}.backup-streamlined .backup-table tr{border:0;display:table-row}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td{border:0;border-bottom:1px solid var(--border);text-align:left;white-space:normal;vertical-align:middle;padding:18px 12px;font-size:14px;display:table-cell}.backup-streamlined .backup-table th{padding-top:8px;padding-bottom:14px;font-weight:450}.backup-streamlined .backup-table td:before{display:none}.backup-streamlined .backup-table td:first-child,.backup-streamlined .backup-table th:first-child{padding-left:2px}.backup-streamlined .backup-table td:last-child,.backup-streamlined .backup-table th:last-child{text-align:right;padding-right:2px}.backup-streamlined .backup-table td{font-weight:400}.backup-streamlined .backup-table .backup-link{color:var(--primary);white-space:nowrap;font-size:14px}.backup-streamlined .backup-table .backup-dsp-name .backup-link{color:var(--foreground);white-space:normal}.backup-streamlined .backup-table td:last-child .backup-icon{display:none}.backup-streamlined .backup-dsp-picker{max-width:320px;margin-bottom:32px}.backup-streamlined select,.backup-streamlined input:not([type=checkbox]){min-height:42px;font-size:14px}.backup-streamlined .backup-scope-heading{flex-wrap:wrap;align-items:center;gap:24px;margin-bottom:18px;display:flex}.backup-streamlined .backup-scope-heading h2{margin:0;font-size:23px}.backup-streamlined .backup-toolbar{flex-wrap:wrap;align-items:center;gap:16px;margin:20px 0 24px;display:flex}.backup-streamlined .backup-toolbar .backup-search-wrap{flex:220px;min-width:0}.backup-streamlined .backup-toolbar .backup-field{flex:0 200px}.backup-streamlined .backup-toolbar .backup-field>span{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-streamlined .backup-toolbar select{width:100%}.backup-streamlined .backup-rail>.backup-field{margin-bottom:26px}.backup-streamlined .backup-rail>.backup-button-text{border-top:1px solid var(--border);width:100%;padding-top:24px}.backup-streamlined .backup-filter-tabs{border-bottom:1px solid var(--border);gap:20px;margin:0 0 24px;padding:0}.backup-streamlined .backup-filter-tabs button{min-height:36px;color:var(--foreground);background:0 0;border:0;border-bottom:2px solid #0000;border-radius:0;padding:0 8px 12px;font-weight:400}.backup-streamlined .backup-filter-tabs button[aria-pressed=true]{border-color:var(--foreground);background:0 0;font-weight:600}.backup-streamlined .backup-event-type{flex-direction:column;gap:4px;display:flex}.backup-streamlined .backup-event-type small{font-size:12px}.backup-streamlined .backup-event-count{margin-top:20px}.backup-streamlined .backup-storage-total{margin:0 0 10px;font-size:28px}.backup-streamlined .backup-disclosure{border-bottom:1px solid var(--border)}.backup-streamlined .backup-disclosure>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;padding:20px 2px;font-weight:500;list-style:none;display:flex}.backup-streamlined .backup-disclosure>summary::-webkit-details-marker{display:none}.backup-streamlined .backup-disclosure[open]>summary>svg{transform:rotate(90deg)}.backup-streamlined .backup-disclosure>p,.backup-streamlined .backup-disclosure>.backup-pairs{margin:16px 0}.backup-streamlined .backup-disclosure>.backup-button{margin:12px 12px 20px 0}.backup-streamlined .backup-settings-scope{max-width:460px;margin:28px 0 34px}.backup-streamlined .backup-form-grid{border:0;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px;min-width:0;margin:28px 0 36px;padding:0;display:grid}.backup-streamlined .backup-form-grid input,.backup-streamlined .backup-form-grid select{width:100%}.backup-streamlined input:disabled,.backup-streamlined select:disabled{opacity:.55;cursor:not-allowed}.backup-streamlined .backup-toggle-label{align-items:center;gap:10px;display:inline-flex}.backup-streamlined .backup-toggle-label .backup-switch{width:40px;height:24px}.backup-streamlined .backup-toggle-label .backup-switch:after{width:18px;height:18px;top:3px;left:3px}.backup-streamlined .backup-toggle-label .backup-switch:checked:after{transform:translate(16px)}.backup-streamlined .backup-form-section{padding-top:28px}.backup-streamlined .backup-form-section .backup-field{max-width:460px;margin:22px 0 16px}.backup-streamlined .backup-note{margin:24px 0}.backup-streamlined .backup-empty{text-align:left;padding:24px 0}.backup-streamlined .backup-empty>svg{display:none}.backup-streamlined>.backup-card,.backup-streamlined>.backup-page-title{margin-top:32px}@media (width<=1100px){.backup-streamlined .backup-split{grid-template-columns:minmax(0,1.8fr) minmax(220px,1fr)}.backup-streamlined .backup-main{padding-right:24px}.backup-streamlined .backup-rail{padding-left:24px}.backup-streamlined .backup-table{min-width:560px}.backup-streamlined .backup-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=800px){.backup-streamlined .backup-split{flex-direction:column;min-height:0;display:flex}.backup-streamlined .backup-main{padding:28px 0}.backup-streamlined .backup-rail{border-left:0;border-top:1px solid var(--border);padding:28px 0}.backup-streamlined .backup-header{flex-direction:column;align-items:flex-start;gap:20px;margin-bottom:30px}.backup-streamlined .backup-header .backup-actions{justify-content:flex-start;gap:20px}.backup-workspace.backup-streamlined h1{font-size:32px}.backup-streamlined .backup-tabs{gap:24px}.backup-streamlined .backup-tabs a{padding-bottom:16px;font-size:14px}.backup-streamlined .backup-latest>p{font-size:22px}.backup-streamlined .backup-form-grid{grid-template-columns:minmax(0,1fr)}.backup-streamlined .backup-settings-scope{max-width:none}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td{padding:16px 10px}.backup-streamlined .backup-table-scroll{max-width:100%}}.backup-streamlined .backup-header a[aria-current=page]{color:var(--foreground);font-weight:600}.backup-streamlined .backup-tabs a[aria-current=page]{border-bottom-color:var(--primary)}.backup-streamlined .backup-filter-tabs button[aria-pressed=true]{color:var(--foreground)}.backup-streamlined .backup-rail>.backup-button-text{border-radius:0}.backup-streamlined .backup-field>span{font-size:14px;font-weight:450}.backup-streamlined .backup-card-heading h3,.backup-streamlined .backup-form-section h3{font-size:18px;font-weight:600}@media (width<=800px){.backup-streamlined .backup-storage-table .backup-table{table-layout:fixed;min-width:0}.backup-streamlined .backup-storage-table .backup-table th:first-child{width:50%}.backup-streamlined .backup-storage-table .backup-table th:not(:first-child){width:auto}.backup-streamlined .backup-storage-table th,.backup-streamlined .backup-storage-table td{overflow-wrap:anywhere;padding:14px 6px;font-size:13px}.backup-streamlined .backup-storage-table .backup-link{white-space:normal}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) .backup-table{min-width:0}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) tbody{display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) tr{border-bottom:1px solid var(--border);grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 20px;padding:18px 0;display:grid}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td{text-align:left;overflow-wrap:anywhere;border:0;padding:0;display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td:first-child{grid-column:1/-1}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) td:not(:first-child):before{content:attr(data-label);color:var(--muted-foreground);margin-bottom:5px;font-size:12px;display:block}.backup-streamlined .backup-table-scroll:not(.backup-storage-table) .backup-status{white-space:normal}}.backup-workspace.backup-streamlined{container:backups/inline-size}.backup-streamlined .backup-muted{font-size:inherit}.backup-streamlined .backup-toolbar>select{flex:0 200px;width:200px}.backup-streamlined[data-view=dsps] .backup-main>.backup-section+.backup-section,.backup-streamlined[data-view=storage] .backup-main>.backup-section+.backup-section{border-top:0;padding-top:0}@container backups (width>=1300px){.backup-streamlined .backup-header{margin-bottom:60px;padding-top:24px}.backup-workspace.backup-streamlined h1{font-size:46px}.backup-streamlined .backup-tabs{gap:40px}.backup-streamlined .backup-tabs a{padding-bottom:24px;font-size:18px}.backup-streamlined .backup-main{padding:60px 56px 48px 0}.backup-streamlined .backup-rail{padding:54px 0 48px 42px}.backup-streamlined .backup-section>h2,.backup-streamlined .backup-scope-heading h2{font-size:22px}.backup-streamlined .backup-section p,.backup-streamlined .backup-rail p,.backup-streamlined .backup-link,.backup-streamlined .backup-button,.backup-streamlined .backup-tabs a{font-size:18px}.backup-streamlined .backup-button{min-height:50px}.backup-streamlined .backup-button-text{min-height:36px}.backup-streamlined .backup-latest{margin-top:36px}.backup-streamlined .backup-latest>p{font-size:30px}.backup-streamlined .backup-main>.backup-section+.backup-section{margin-top:48px;padding-top:48px}.backup-streamlined .backup-rail>.backup-section+.backup-section{margin-top:40px;padding-top:40px}.backup-streamlined .backup-table th,.backup-streamlined .backup-table td,.backup-streamlined .backup-table .backup-link,.backup-streamlined .backup-status,.backup-streamlined .backup-field>span,.backup-streamlined input:not([type=checkbox]),.backup-streamlined select{font-size:16px}.backup-streamlined .backup-section .backup-storage-total{font-size:32px}.backup-streamlined .backup-scope-heading h2{font-size:28px}}:root,.theme-preview-scope{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--font-family:Inter, ui-sans-serif, system-ui, sans-serif;--background:#fff;--foreground:#171b25;--card:#fff;--card-foreground:var(--foreground);--popover:#fff;--popover-foreground:var(--foreground);--sidebar:#f7f8fa;--surface:#f8f9fc;--primary:#2055ed;--primary-hover:#1745cd;--primary-foreground:#fff;--secondary:#f0f2f5;--secondary-foreground:var(--foreground);--muted:#edf0f4;--muted-foreground:#626b7a;--accent:#f0f3f8;--accent-foreground:var(--foreground);--selection:#edf1fd;--destructive:#b42332;--danger-button:#b42332;--border:#e3e7ee;--input:#ced5e0;--ring:#3765e8;--success:#16814b;--success-surface:#edf8f1;--warning:#956009;--warning-surface:#fff8eb;--warning-border:#eed5a7;--warning-button:#ffce60;--warning-button-foreground:#523711;--violet:#6553aa;--violet-surface:#f0edf9;--sage:#36765e;--sage-surface:#eaf4ee;--slate:#51647d;--slate-surface:#eaf0f7;--steel:#427380;--steel-surface:#e9f3f5;--overlay:#10182755;--shadow-color:#10182726;--radius:.5rem;--sidebar-width:240px;--page-gutter:36px;--heading-size:32px;--body-size:14px;--table-row-padding:15px;--control-height:40px;--motion-duration:.16s}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--background:#11151d;--foreground:#edf1f7;--card:#171c26;--popover:#1b2230;--sidebar:#171c26;--surface:#1b2230;--primary:#8eaaff;--primary-hover:#adc1ff;--primary-foreground:#111827;--secondary:#252e3d;--muted:#252e3d;--muted-foreground:#a6b1c2;--accent:#242d3d;--selection:#253251;--destructive:#f49aaa;--danger-button:#a72b41;--border:#303949;--input:#465269;--ring:#8eaaff;--success:#6ed39a;--success-surface:#19362a;--warning:#e9b963;--warning-surface:#32291c;--warning-border:#65512f;--violet:#b5a5ec;--violet-surface:#302a43;--sage:#94cdb3;--sage-surface:#24392f;--slate:#b2c4de;--slate-surface:#29374b;--steel:#9ecad4;--steel-surface:#243c44;--overlay:#0009;--shadow-color:#0006}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter.woff2)format("woff2")}:root{font-family:var(--font-family);font-synthesis:none;color:var(--foreground);background:var(--background)}.application{min-height:100dvh}.brand{letter-spacing:-.7px;color:var(--foreground);align-items:center;gap:12px;font-size:22px;font-weight:600;display:inline-flex}.brand svg{width:29px;height:29px;color:var(--primary)}.desktop-sidebar{width:var(--sidebar-width);background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;display:flex;position:fixed;inset:0 auto 0 0}.sidebar-brand{padding:27px 24px 26px}.sidebar-brand p{color:var(--muted-foreground);overflow-wrap:anywhere;margin-top:13px;font-size:13px}.nav-list{flex-direction:column;flex:1;gap:7px;padding:14px 12px;display:flex}.nav-item{border-radius:var(--radius);min-height:42px;color:var(--foreground);align-items:center;gap:12px;padding:10px 15px;font-size:14px;font-weight:450;display:flex;position:relative}.nav-item svg{stroke-width:1.65px;width:18px;height:18px}.nav-item:hover{background:var(--accent);color:var(--foreground)}.nav-item[aria-current=page]{color:var(--primary);background:var(--selection);font-weight:550}.nav-item[aria-current=page]:before{content:"";background:var(--primary);border-radius:2px;width:3px;position:absolute;top:11px;bottom:11px;left:0}.sidebar-account{border-top:1px solid var(--border);margin:0 12px;padding:16px 12px}.account-button{text-align:left;border-radius:var(--radius);align-items:center;gap:10px;width:100%;display:flex}.account-copy{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.account-copy strong{text-overflow:ellipsis;font-size:12px;font-weight:550;overflow:hidden}.account-copy>span{color:var(--muted-foreground);font-size:11px}.account-button>svg{width:14px;height:14px;color:var(--muted-foreground)}.avatar{background:var(--muted);width:34px;height:34px;color:var(--foreground);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:500;display:inline-flex}.main-area{margin-left:var(--sidebar-width);min-width:0}.topbar{height:65px;padding:0 var(--page-gutter);align-items:center;gap:12px;display:flex}.breadcrumb{color:var(--muted-foreground);align-items:center;gap:13px;min-width:0;font-size:13px;display:flex}.breadcrumb>span:first-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.breadcrumb strong{color:var(--foreground);white-space:nowrap;font-weight:450}.page-container{max-width:1600px;padding:15px var(--page-gutter) 48px;outline:none;margin:0 auto}.page-heading{justify-content:space-between;align-items:center;gap:24px;margin-bottom:35px;display:flex}.page-heading h1,.backup-workspace h1{font-size:var(--heading-size);letter-spacing:-1.1px;font-weight:600;line-height:1.3}.page-heading p{color:var(--muted-foreground);margin-top:8px;font-size:14px}.page-actions{align-items:center;gap:10px;display:flex}.inline-summary{color:var(--muted-foreground);grid-template-columns:repeat(3,minmax(0,1fr));margin:0 0 30px;padding:4px 0 12px;font-size:13px;display:grid}.inline-summary>span{border-left:1px solid var(--border);flex-direction:column;align-items:center;gap:5px;padding:0 24px;display:flex}.inline-summary>span:first-child{border:0}.inline-summary strong{color:var(--foreground);font-variant-numeric:tabular-nums;letter-spacing:-.8px;font-size:30px;font-weight:600;line-height:1.2}[data-slot=tabs-list].page-tabs{border-bottom:1px solid var(--border);border-radius:0;justify-content:flex-start;gap:30px;width:100%;height:43px;padding:0}.page-tabs [data-slot=tabs-trigger]{border:0;border-radius:0;flex:none;height:100%;padding:0 0 14px;font-size:13px;font-weight:450}.page-tabs [data-slot=tabs-trigger][data-state=active]{color:var(--primary);font-weight:550}.page-tabs [data-slot=tabs-trigger]:after{background:var(--primary);bottom:0}.tab-count{color:var(--muted-foreground);margin-left:4px;font-size:11px}.table-toolbar{justify-content:space-between;align-items:center;gap:14px;padding:19px 0 15px;display:flex}.search-input{width:330px;max-width:100%;display:block;position:relative}.search-input>svg{width:16px;height:16px;color:var(--muted-foreground);pointer-events:none;position:absolute;top:10px;left:11px}.search-input input{box-shadow:none;padding-left:34px;font-size:12px}[data-slot=table-container]{overflow-x:auto}[data-slot=table-head]{height:46px;padding:12px 8px;font-size:12px;font-weight:500}[data-slot=table-cell]{padding:var(--table-row-padding) 8px;font-size:var(--body-size);vertical-align:middle}[data-slot=table-row]:hover{background:var(--accent)}[data-slot=table-header] [data-slot=table-row]:hover{background:0 0}[data-slot=table-row]{border-color:var(--border)}.identity-button{text-align:left;align-items:center;gap:12px;display:flex}.identity-button strong,.member-identity strong{font-size:13px;font-weight:550}.dsp-identity-copy>span,.member-identity div>span{color:var(--muted-foreground);font-size:12px}.identity-button:hover strong{color:var(--primary)}.status{white-space:nowrap;text-transform:none;align-items:center;gap:8px;font-size:12px;display:inline-flex}.status>span{background:var(--muted-foreground);border-radius:50%;width:6px;height:6px}.status-ready>span,.status-active>span,.status-success>span,.status-verified>span,.status-completed>span{background:var(--success)}.status-pending>span,.status-provisioning>span,.status-verifying>span,.status-waiting-for-owner>span,.status-waiting-for-provider-auth>span{background:var(--warning)}.status-failed>span,.status-suspended>span{background:var(--destructive)}.table-count{color:var(--muted-foreground);margin-top:19px;font-size:12px}.member-identity{align-items:center;gap:12px;display:flex}.member-identity div{flex-direction:column;gap:4px;display:flex}.role-row{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:24px;padding:24px 0;display:flex}.role-row p{color:var(--muted-foreground);margin:6px 0 12px;font-size:13px}.role-row details{color:var(--muted-foreground);font-size:12px}.role-row details summary{cursor:pointer;color:var(--foreground)}.role-row details ul{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 24px;margin-top:12px;display:grid}.settings-section,.setup-section{border-bottom:1px solid var(--border);grid-template-columns:minmax(170px,1fr) minmax(300px,2fr);gap:48px;max-width:900px;padding:32px 0;display:grid}.settings-section>div>p,.setup-section>div>p{color:var(--muted-foreground);max-width:240px;margin-top:8px;font-size:13px}.detail-list{font-size:13px}.detail-list>div{border-bottom:1px solid var(--border);justify-content:space-between;gap:24px;padding:16px 0;display:flex}.detail-list>div:first-child{padding-top:0}.detail-list>div:last-child{border-bottom:0}.detail-list dt{color:var(--muted-foreground)}.detail-list dd{text-align:right;overflow-wrap:anywhere}.setup-section{margin-bottom:28px}.setup-section form{max-width:440px}.panel-form{flex-direction:column;flex:1;min-height:0;padding:12px 24px 24px;display:flex;overflow:auto}.panel-form>[data-slot=field-group]{padding-bottom:32px}.panel-body{padding:12px 24px 24px;overflow:auto}.panel-footer{border-top:1px solid var(--border);justify-content:flex-end;gap:10px;margin-top:auto;padding-top:22px;display:flex}[data-slot=sheet-header]{gap:10px;padding:30px 24px 20px}[data-slot=sheet-title]{letter-spacing:-.25px;font-size:17px}[data-slot=sheet-description]{line-height:1.6}[data-slot=field-group]{gap:24px}[data-slot=field]{gap:9px}[data-slot=field-label]{font-size:13px;font-weight:500}[data-slot=input],[data-slot=native-select]{box-shadow:none}[data-slot=native-select-wrapper]{width:100%}.permission-row{align-items:center;gap:10px;font-size:13px;display:flex}.permission-row input{width:16px;height:16px;accent-color:var(--primary)}.auth-layout{flex-direction:column;align-items:center;min-height:100dvh;padding:44px 24px;display:flex}.auth-brand{align-self:flex-start}.auth-panel{width:360px;max-width:100%;margin:auto 0;padding:56px 0}.auth-panel h1{letter-spacing:-.8px;font-size:26px;font-weight:600}.auth-description{color:var(--muted-foreground);margin:10px 0 28px;font-size:13px}.auth-footnote{color:var(--muted-foreground);font-size:12px}.initial-loading{width:360px;max-width:100%;margin:15vh auto;padding:24px}.mobile-menu{display:none}.mobile-sidebar{background:var(--sidebar);gap:0;padding:0;max-width:280px!important}.skip-link{z-index:100;background:var(--background);padding:12px;position:fixed;top:-100px;left:16px}.skip-link:focus{top:8px}@media (width<=980px){.desktop-sidebar{display:none}.main-area{margin-left:0}.mobile-menu{display:inline-flex}.topbar{padding:0 20px}.page-container{padding:16px 24px 40px}}@media (width<=600px){.page-container{padding:12px 18px 32px}.topbar{height:58px;padding:0 12px}.page-heading{flex-wrap:wrap;align-items:flex-start;gap:18px;margin-bottom:28px}.page-heading h1,.backup-workspace h1{font-size:28px}.page-heading p{font-size:13px}.page-tabs{overflow:auto}.inline-summary>span{padding:0 14px}.inline-summary{margin-bottom:26px;font-size:12px}.table-toolbar{gap:10px}.search-input{width:100%}.settings-section,.setup-section{grid-template-columns:1fr;gap:25px;padding:25px 0}.settings-section>div>p,.setup-section>div>p{max-width:100%}.detail-list>div{gap:15px}.role-row details ul{grid-template-columns:1fr}.auth-brand{align-self:center}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.backup-workspace,.backup-dialog{--backup-ink:var(--foreground);--backup-muted:var(--muted-foreground);--backup-border:var(--border);--backup-blue:var(--primary);font-family:var(--font-family)}.backup-workspace h1,.backup-workspace h2,.backup-dialog h2{font-weight:600}.backup-header{margin-bottom:32px}.backup-header>div:first-child>p{color:var(--muted-foreground);margin-top:8px;font-size:14px}.backup-button{border-radius:var(--radius);min-height:36px;padding:8px 13px;font-size:13px;font-weight:500}.backup-tabs{gap:30px;margin-bottom:30px}.backup-tabs a{color:var(--muted-foreground);border-bottom-width:2px;padding:0 0 14px;font-size:13px;font-weight:450}.backup-tabs a[aria-current=page]{color:var(--primary);border-color:var(--primary);font-weight:550}.backup-card{box-shadow:none;background:0 0;border:0;border-radius:0;padding:0}.backup-card-title{gap:10px;margin-bottom:20px!important;font-size:15px!important}.backup-card-title .backup-icon-tile{display:none}.backup-dashboard-grid{grid-template-columns:minmax(0,2fr) minmax(240px,1fr);gap:32px}.backup-dashboard-grid>aside{border-left:1px solid var(--border);padding-left:28px}.backup-dashboard-grid .backup-stack{gap:36px}.backup-fleet-summary{box-shadow:none;background:0 0;border:0;border-radius:0;flex-wrap:wrap;align-items:center;margin-bottom:34px;padding:0;display:flex}.backup-storage-metrics{grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:24px;margin:24px 0 36px;display:grid}.backup-storage-metrics dt{color:var(--muted-foreground);font-size:13px}.backup-storage-metrics dd,.backup-storage-total{margin:8px 0;font-size:28px;font-weight:600}.backup-storage-table .backup-table{table-layout:fixed;min-width:0}.backup-storage-table th:first-child{width:54%}.backup-storage-table th:not(:first-child){width:23%}.backup-storage-table .backup-table td{white-space:normal;overflow-wrap:anywhere}@media (width<=650px){.backup-storage-table .backup-table th,.backup-storage-table .backup-table td{padding:12px 6px;font-size:12px}}.backup-fleet-metric{border-left:1px solid var(--border);padding:0 20px;display:block}.backup-fleet-metric:first-child{border-left:0;padding-left:0}.backup-fleet-metric .backup-icon-tile{display:none}.backup-fleet-metric>div{align-items:baseline;gap:6px;display:flex}.backup-fleet-metric dd,.backup-fleet-metric dt{color:var(--foreground);font-size:13px;font-weight:450}.backup-fleet-metric dt{color:var(--muted-foreground)}.backup-overview-issues{background:0 0;border:0}.backup-overview-issues>h2>svg{width:17px;color:var(--warning)}.backup-issue-row{gap:12px;padding:16px 0}.backup-issue-row .backup-avatar{display:none}.backup-issue-row strong{font-size:13px;font-weight:500}.backup-issue-row .backup-link{font-size:12px;font-weight:450}.backup-next-layout{grid-template-columns:1fr;gap:18px}.backup-next-policy{border-left:0;padding-left:0}.backup-next-when strong{font-size:24px;font-weight:500}.backup-next-policy svg{width:16px;height:16px}.backup-core-summary{border-top:1px solid var(--border);padding-top:24px}.backup-activity-entry{gap:10px;padding:14px 0}.backup-activity-entry time{font-size:10px}.backup-activity-entry strong{font-size:12px;font-weight:500}.backup-activity-entry .backup-icon-tile{background:0 0;flex-basis:22px;width:22px;height:22px}.backup-activity-entry>div{min-width:0}.backup-status{border:0;padding:0;font-size:12px;font-weight:400;color:var(--foreground)!important;background:0 0!important}.backup-status svg{display:none}.backup-status:before{content:"";background:var(--muted-foreground);border-radius:50%;width:6px;height:6px}.backup-status.verified:before,.backup-status.completed:before{background:var(--success)}.backup-status.failed:before{background:var(--destructive)}.backup-status.empty:before,.backup-status.running:before,.backup-status.pending:before{background:var(--warning)}.backup-table th{color:var(--foreground);background:0 0;padding:12px 8px;font-size:12px;font-weight:500}.backup-table td{padding:16px 8px;font-size:12px}.backup-table tbody tr:first-child{background:0 0}.backup-table tbody tr:hover{background:var(--accent)}.backup-inspector{border:1px solid var(--border);border-radius:var(--radius);box-shadow:none}.backup-dsp-navigator{background:var(--sidebar)}.backup-dsp-option[aria-current=page]{background:var(--selection);box-shadow:none;border-color:#0000}.backup-avatar{border-radius:var(--radius);box-shadow:none;border:0!important}.backup-note{border-radius:var(--radius);box-shadow:none;background:var(--accent)}.backup-dialog{border:1px solid var(--border);box-shadow:0 16px 50px var(--overlay);border-radius:8px}.backup-dialog::backdrop{background:var(--overlay)}.backup-form-section{padding:24px 0}.backup-form-section h3{font-weight:550}.backup-form-footer{border-top:1px solid var(--border);padding-top:24px}.backup-page-title h2{font-size:20px}.backup-filter-tabs button[aria-pressed=true]{background:var(--selection);color:var(--primary)}.updates-workspace h2{letter-spacing:-.6px;font-size:22px;font-weight:550}.updates-workspace h3{font-size:14px;font-weight:550}.update-muted{color:var(--muted-foreground);font-size:13px;line-height:1.7}.update-release-card{border-top:1px solid var(--border);padding-top:28px}.update-eyebrow{display:none}.update-release-heading{justify-content:space-between;align-items:center;gap:20px;display:flex}.primary-button,.secondary-button{border:1px solid var(--border);border-radius:var(--radius);min-height:36px;font:500 13px/1.4 var(--font-family);background:var(--background);cursor:pointer;justify-content:center;align-items:center;gap:8px;padding:8px 14px;display:inline-flex}.primary-button{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}.primary-button:disabled,.secondary-button:disabled{opacity:.5;cursor:default}.secondary-button:hover{background:var(--accent)}.update-changelog{border-top:1px solid var(--border);margin-top:30px;padding-top:26px}.update-changes{margin-top:12px;padding:0;list-style:none}.update-changes li{border-bottom:1px solid var(--border);align-items:baseline;gap:24px;padding:20px 0;display:flex}.update-change-kind{min-width:66px;color:var(--muted-foreground);font-size:12px}.update-changes strong{font-size:14px;font-weight:500}.update-changes p{margin-top:5px}.update-rollout-summary{border-top:1px solid var(--border);justify-content:space-between;align-items:center;gap:24px;padding:24px 0;display:flex}.update-rollout-title{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.update-rollout-icon{display:none}.update-status{color:var(--muted-foreground);font-size:12px}.update-status.paused{color:var(--warning)}.update-status.completed{color:var(--success)}.update-progress-grid{grid-template-columns:1fr 1.4fr;gap:36px;margin:22px 0 36px;display:grid}.update-progress-card{min-width:0}.update-stage-list{margin-top:20px;padding:0;list-style:none}.update-stage-list li{gap:16px;min-height:78px;padding:14px 12px 26px;display:flex;position:relative}.update-stage-list li:last-child{min-height:60px;padding-bottom:14px}.update-stage-list li:not(:last-child):after{content:"";background:var(--border);transform-origin:top;width:2px;position:absolute;top:46px;bottom:-10px;left:26px}.update-stage-list li.done:after{background:var(--primary)}.update-stage-list li.current:before,.update-stage-list li.paused:before{content:"";background:var(--primary);border-radius:12px;position:absolute;inset:0 0 12px}@supports (color:color-mix(in lab, red, red)){.update-stage-list li.current:before,.update-stage-list li.paused:before{background:color-mix(in srgb, var(--primary) 6%, transparent)}}.update-stage-list li.paused:before{background:var(--warning)}@supports (color:color-mix(in lab, red, red)){.update-stage-list li.paused:before{background:color-mix(in srgb, var(--warning) 7%, transparent)}}.update-stage-list li>div{min-width:0;padding-top:3px;position:relative}.update-stage-marker{z-index:1;border:1px solid var(--border);background:var(--background);width:30px;height:30px;color:var(--muted-foreground);border-radius:50%;flex:0 0 30px;justify-content:center;align-items:center;font-size:12px;transition:background-color .25s,border-color .25s,color .25s;display:flex;position:relative}.done .update-stage-marker{color:var(--success);border-color:var(--success)}@supports (color:color-mix(in lab, red, red)){.done .update-stage-marker{border-color:color-mix(in srgb, var(--success) 30%, transparent)}}.done .update-stage-marker{background:var(--success)}@supports (color:color-mix(in lab, red, red)){.done .update-stage-marker{background:color-mix(in srgb, var(--success) 8%, var(--background))}}.current .update-stage-marker{color:var(--primary);background:var(--background);border-color:#0000}.current .update-stage-marker:after{content:"";border:2px solid var(--primary);position:absolute;inset:-3px}@supports (color:color-mix(in lab, red, red)){.current .update-stage-marker:after{border:2px solid color-mix(in srgb, var(--primary) 16%, transparent)}}.current .update-stage-marker:after{border-top-color:var(--primary);border-radius:50%;animation:1.8s linear infinite update-spin}.paused .update-stage-marker{color:var(--warning);border-color:var(--warning)}.update-stage-list strong{font-size:13px;font-weight:500}.update-stage-detail{color:var(--muted-foreground);margin:5px 0 0;font-size:12px;line-height:1.6}.update-current-activity{color:var(--muted-foreground);margin:-8px 0 26px;font-size:13px}.update-message-enter{animation:.25s ease-out update-fade}.update-check{border-bottom:2px solid;border-right:2px solid;width:7px;height:12px;margin-top:-3px;display:inline-block;transform:rotate(45deg)}.update-step-enter .update-check,.update-completion-enter .update-check{animation:.4s ease-out both update-check-draw}.update-stage-list .update-step-enter:after{animation:.35s ease-out both update-connect}.update-rollout-icon.completed{width:36px;height:36px;color:var(--success);background:var(--success);border-radius:50%;flex:0 0 36px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.update-rollout-icon.completed{background:color-mix(in srgb, var(--success) 10%, transparent)}}.update-completion-enter{animation:.35s ease-out both update-fade}.update-progress{background:var(--primary);border-radius:999px;width:100%;height:8px;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.update-progress{background:color-mix(in srgb, var(--primary) 9%, var(--background))}}.update-progress{margin:22px 0}.update-progress-fill{border-radius:inherit;background:var(--primary);height:100%;animation:.4s ease-out both update-fill;display:block;position:relative;overflow:hidden}.update-progress.is-active .update-progress-fill:after{content:"";background:linear-gradient(100deg,#0000 20%,#fff5 50%,#0000 80%);animation:2.2s ease-in-out infinite update-sheen;position:absolute;inset:0}.update-empty-fleet{border:1px solid var(--border);border-radius:12px;margin-top:20px;padding:22px}.update-empty-fleet strong{font-size:14px;font-weight:500}.update-empty-fleet p{margin:8px 0 0;font-size:13px;line-height:1.6}.update-reconnecting{background:var(--primary);border-radius:8px;margin:0 0 18px;padding:12px 16px}@supports (color:color-mix(in lab, red, red)){.update-reconnecting{background:color-mix(in srgb, var(--primary) 6%, transparent)}}.update-reconnecting{color:var(--muted-foreground);font-size:13px}#platform-updates-content[data-connection=reconnecting] *,#platform-updates-content[data-connection=reconnecting] :before,#platform-updates-content[data-connection=reconnecting] :after,#platform-updates-content[data-rollout-status=paused] *,#platform-updates-content[data-rollout-status=paused] :before,#platform-updates-content[data-rollout-status=paused] :after{animation:none!important}@keyframes update-spin{to{transform:rotate(360deg)}}@keyframes update-fade{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}@keyframes update-check-draw{0%{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0)}}@keyframes update-connect{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes update-fill{0%{width:var(--update-progress-from)}}@keyframes update-sheen{0%{transform:translate(-100%)}to{transform:translate(100%)}}@media (prefers-reduced-motion:reduce){#platform-updates-content *,#platform-updates-content :before,#platform-updates-content :after{transition:none!important;animation:none!important}}.update-dsp-list{padding:0;list-style:none}.update-dsp-list li{border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:16px 0;display:flex}.update-dsp-list strong{font-size:13px;font-weight:500}.update-dsp-status{color:var(--muted-foreground);margin-left:auto;font-size:12px}.update-dsp-marker{width:16px;font-size:12px}.updated .update-dsp-marker{color:var(--success)}.blocked .update-dsp-marker{color:var(--destructive)}.update-activity{border-top:1px solid var(--border);padding-top:26px}.update-activity ul{margin-top:12px;padding:0;list-style:none}.update-activity li{justify-content:space-between;gap:24px;padding:12px 0;display:flex}.update-activity strong{font-size:13px;font-weight:450}.update-attention,.update-status-unavailable{border:1px solid var(--border);border-radius:var(--radius);color:var(--destructive);margin:20px 0;padding:14px;font-size:13px}@media (width<=1100px){.backup-dashboard-grid{grid-template-columns:1fr}.backup-dashboard-grid>aside{border-left:0;border-top:1px solid var(--border);grid-template-columns:1fr 1fr;gap:28px;padding:26px 0 0;display:grid}}@media (width<=600px){.backup-header{flex-direction:column;align-items:flex-start}.backup-actions{gap:12px}.backup-dashboard-grid>aside{grid-template-columns:1fr}.backup-fleet-summary{row-gap:16px}.backup-fleet-metric{border-top:0!important;padding:0 12px!important}.backup-fleet-metric:first-child{padding-left:0!important}.backup-fleet-metric dd,.backup-fleet-metric dt{font-size:12px}.backup-issue-row{flex-wrap:wrap;display:flex}.backup-issue-row>.backup-link{margin-left:0}.update-progress-grid{grid-template-columns:1fr}.update-release-heading,.update-rollout-summary{flex-wrap:wrap}.update-changes li{gap:12px}.update-activity li{flex-direction:column;gap:3px}}.backup-table-scroll{border:0;border-radius:0}.backup-table th{text-transform:none;letter-spacing:0}.backup-table tbody tr:first-child td{border-top:1px solid var(--border)}.backup-table tbody tr:last-child td{border-bottom:1px solid var(--border)}.backup-table .backup-link{color:var(--foreground);font-weight:500}.backup-fleet-metric.warning dd,.backup-fleet-metric.success dd{color:var(--foreground)}@media (width<=600px){.fleet-table th:nth-child(2),.fleet-table td:nth-child(2),.fleet-table th:nth-child(4),.fleet-table td:nth-child(4){display:none}.fleet-table .identity-button{max-width:170px}.fleet-table .identity-button strong{text-overflow:ellipsis;max-width:170px;overflow:hidden}.fleet-table [data-slot=table-cell]{padding:14px 4px}[data-slot=button][data-size=default]{min-height:44px}}.backup-table{border-collapse:collapse;border-spacing:0}.backup-table tbody{border:0;border-radius:0}.backup-table td:first-child,.backup-table td:last-child{border-left:0;border-right:0;border-radius:0!important}.backup-fleet-metric:last-child dd{color:var(--foreground)}.dsp-view-banner{z-index:30;background:var(--muted);border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:14px 24px;display:flex;position:sticky;top:0}.dsp-view-banner>svg{flex-shrink:0;width:20px;height:20px}.dsp-view-banner>div{flex:1;min-width:0}.dsp-view-banner strong,.dsp-view-banner span{overflow-wrap:anywhere;font-size:13px;display:block}.dsp-view-banner span{color:var(--muted-foreground);margin-top:3px}.dsp-view-banner>button{flex-shrink:0}@media (width<=640px){.dsp-view-banner{gap:8px;padding:12px 16px}.dsp-view-banner>svg{display:none}}.updates-workspace{max-width:none}.update-notes-panel{min-width:0}.update-notes-title{justify-content:space-between;align-items:center;gap:12px;display:flex}.update-notes-title>h2{letter-spacing:-1px;font-size:26px;font-weight:600;line-height:1.3}.update-release-summary{color:var(--muted-foreground);margin:6px 0 22px;font-size:14px;line-height:1.6}.update-feature-group{--group-color:var(--primary);--group-background:var(--selection);border:1px solid var(--border);border-radius:var(--radius);margin-top:16px;padding:20px}.update-feature-heading{align-items:center;gap:14px;min-height:38px;display:flex}.update-feature-heading h3{letter-spacing:-.4px;font-size:18px;font-weight:600;line-height:1.3}.update-group-icon{width:38px;height:38px;color:var(--group-color);background:var(--group-background);border-radius:50%;flex:0 0 38px;justify-content:center;align-items:center;display:flex}.update-note-icon{flex:0 0 24px;width:24px;height:24px;display:block}.update-group-count{white-space:nowrap;background:var(--selection);color:var(--primary);border-radius:4px;padding:4px 8px;font-size:12px;line-height:1.3}.update-feature-changes{margin:12px 0 0 52px;padding:0;list-style:none}.update-feature-changes li{align-items:flex-start;gap:12px;padding:10px 0;display:flex}.update-feature-changes .update-note-icon{color:var(--muted-foreground);margin-top:2px}.update-feature-changes strong{font-size:13px;font-weight:500;line-height:1.45;display:block}.update-feature-changes p{color:var(--muted-foreground);margin:1px 0 0;font-size:13px;line-height:1.5}.update-feature-changes>li>div{overflow-wrap:anywhere;min-width:0}.update-details-toggle{min-height:24px;color:var(--primary);font:500 13px/1.4 var(--font-family);background:0 0;border:0;align-items:center;gap:6px;margin:8px 0 0 52px;padding:0;display:flex}.update-details-toggle .update-note-icon{flex-basis:16px;width:16px;height:16px;transition:transform .15s}.update-details-toggle[aria-expanded=true] .update-note-icon{transform:rotate(90deg)}.update-expanded-details{border-top:1px solid var(--border);margin:12px 0 0 52px}.update-expanded-details>div{margin:16px 0}.update-expanded-details h4{font-size:13px;font-weight:550}.update-expanded-details p{color:var(--muted-foreground);white-space:pre-line;overflow-wrap:anywhere;margin-top:5px;font-size:13px;line-height:1.7}.update-release-state{background:var(--muted);color:var(--muted-foreground);white-space:nowrap;border-radius:5px;padding:5px 8px;font-size:12px}.update-after-section{border-top:1px solid var(--border);margin-top:32px;padding-top:24px}.update-after-notice{border:1px solid var(--warning-border);border-radius:var(--radius);background:var(--warning-surface);color:var(--warning);align-items:flex-start;gap:16px;padding:18px;display:flex}.update-after-notice>.update-note-icon{color:var(--warning);margin-top:2px}.update-after-notice h3{margin:0 0 8px;font-size:14px;font-weight:550}.update-after-notice strong{font-size:13px;font-weight:500;display:block}.update-after-notice p{margin:5px 0 0;font-size:13px;line-height:1.65}.update-after-notice+.update-after-notice{margin-top:12px}.paycom-page{max-width:1056px}.paycom-connection{border:1px solid var(--border);background:var(--card);color:var(--card-foreground);border-radius:12px}.paycom-connection-header{border-bottom:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:20px;padding:28px 32px;display:flex}.paycom-connection-identity{align-items:center;gap:20px;display:flex}.paycom-connection-icon{width:56px;height:56px;color:var(--primary);background:var(--selection);border-radius:10px;flex-shrink:0;place-items:center;display:grid}.paycom-connection-icon svg{stroke-width:1.6px;width:28px;height:28px}.paycom-connection-identity h2{letter-spacing:-.4px;font-size:20px;font-weight:600;line-height:1.4}.paycom-connection-identity p,.paycom-connection-message p{color:var(--muted-foreground);margin-top:6px;font-size:14px;line-height:1.7}.paycom-status-dot{background:currentColor;border-radius:50%;width:6px;height:6px;margin-right:3px}.paycom-connection-body{padding:32px}.paycom-connection-message h3{letter-spacing:-.5px;font-size:24px;font-weight:600;line-height:1.4}.paycom-connection-actions{flex-wrap:wrap;align-items:center;gap:12px;margin-top:24px;display:flex}.paycom-connection-hint,.paycom-security-help{color:var(--muted-foreground);font-size:13px;line-height:1.7}.paycom-connection-hint{margin-top:12px}.paycom-connection-footer{border-top:1px solid var(--border);background:var(--surface);color:var(--muted-foreground);border-radius:0 0 12px 12px;align-items:flex-start;gap:12px;padding:18px 32px;font-size:13px;line-height:1.6;display:flex}.paycom-connection-footer svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.paycom-credentials{border-top:1px solid var(--border);margin-top:28px;padding-top:28px}.paycom-credentials fieldset{gap:16px;min-width:0}.paycom-credentials legend{margin-bottom:16px}.paycom-login-fields,.paycom-security-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.paycom-login-fields>:first-child{grid-column:1/-1}.paycom-credentials .paycom-connection-actions{margin-top:0}@media (width<=640px){.paycom-connection-header,.paycom-connection-body{padding:24px 20px}.paycom-connection-identity{align-items:flex-start;gap:14px}.paycom-connection-icon{width:44px;height:44px}.paycom-connection-identity h2{font-size:18px}.paycom-connection-message h3{font-size:21px}.paycom-connection-footer{padding:18px 20px}.paycom-login-fields,.paycom-security-fields{grid-template-columns:minmax(0,1fr)}.paycom-connection-actions>button{white-space:normal;height:auto;min-height:var(--control-height);max-width:100%}}.release-popup{border-radius:16px;flex-direction:column;gap:0;width:min(640px,100vw - 32px);max-width:640px;max-height:calc(100dvh - 48px);padding:0;display:flex;overflow:hidden}.release-popup-header{border-bottom:1px solid var(--border);padding:32px 36px 24px;position:relative}.release-popup-eyebrow{letter-spacing:.1em;text-transform:uppercase;color:var(--primary);margin:0 0 12px;font-size:11px;font-weight:650}.release-popup-title{letter-spacing:-.03em;outline:none;margin:0 32px 12px 0;font-size:28px;line-height:1.25}.release-popup-intro{margin-top:16px;display:block}.release-popup-close{position:absolute;top:20px;right:20px}.release-popup-body{overscroll-behavior:contain;flex-direction:column;gap:26px;min-height:0;padding:28px 36px;display:flex;overflow-y:auto}.release-popup-body h3{margin:0 0 12px;font-size:16px;font-weight:650}.release-popup-body ul{flex-direction:column;gap:16px;margin:0;padding-left:18px;list-style:outside;display:flex}.release-popup-body li{overflow-wrap:anywhere;padding-left:4px;font-size:14px;line-height:1.65}.release-popup-body strong{font-weight:550}.release-popup-body p{color:var(--muted-foreground);margin:3px 0 0}.release-popup-footer{border-top:1px solid var(--border);justify-content:flex-end;align-items:center;gap:16px;padding:20px 36px;display:flex}.release-popup-footer>button{flex-shrink:0;min-width:100px}.release-popup-footer [role=alert]{color:var(--destructive);margin:0;font-size:13px}@media (width<=600px){.release-popup{max-height:calc(100dvh - 24px)}.release-popup-header{padding:24px 24px 20px}.release-popup-title{font-size:24px}.release-popup-body{padding:24px}.release-popup-footer{padding:16px 24px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}body{background:var(--background);color:var(--foreground)}button,input,select,textarea{font-family:var(--font-family)}[data-slot=button][data-size=default],[data-slot=button][data-size=icon]{min-height:var(--control-height)}[data-slot=button][data-variant=destructive]{background:var(--danger-button);color:#fff}[data-slot=dialog-overlay],[data-slot=sheet-overlay]{background:var(--overlay)}[data-slot=input],[data-slot=native-select]{background:var(--background);color:var(--foreground);min-height:var(--control-height)}[data-slot=table-row][data-state=selected]{background:var(--selection)}.nav-item,.identity-button,.theme-option{transition:background-color var(--motion-duration), border-color var(--motion-duration), color var(--motion-duration)}.nav-item:last-child{margin-top:40px}.nav-item:last-child:after{content:"";background:var(--border);height:1px;position:absolute;top:-20px;left:12px;right:12px}.dsp-avatar{--identity-ink:var(--slate);--identity-surface:var(--slate-surface);border-radius:var(--radius);width:36px;height:36px;color:var(--identity-ink);background:var(--identity-surface);letter-spacing:-.2px;flex:0 0 36px;justify-content:center;align-items:center;font-size:12px;font-weight:550;display:inline-flex}.dsp-avatar.tone-1{--identity-ink:var(--sage);--identity-surface:var(--sage-surface)}.dsp-avatar.tone-2{--identity-ink:var(--violet);--identity-surface:var(--violet-surface)}.dsp-avatar.tone-3{--identity-ink:var(--slate);--identity-surface:var(--slate-surface)}.dsp-avatar.tone-4{--identity-ink:var(--steel);--identity-surface:var(--steel-surface)}.backup-avatar.dsp-avatar{color:var(--identity-ink);background:var(--identity-surface)}.dsp-identity-copy{flex-direction:column;gap:3px;min-width:0;display:flex}.dsp-panel-identity,.backup-dsp-identity{align-items:center;gap:12px;display:inline-flex}.dsp-panel-identity .dsp-avatar{flex-basis:40px;width:40px;height:40px}.backup-dsp-identity{white-space:normal}.backup-dsp-identity .dsp-avatar{flex-basis:30px;width:30px;height:30px;font-size:11px}.backup-fleet-summary{grid-template-columns:repeat(4,minmax(0,1fr));padding-block:12px;display:grid}.backup-fleet-metric{padding-inline:24px}.backup-fleet-metric>div{flex-direction:column;gap:5px}.backup-fleet-metric dd{font-variant-numeric:tabular-nums;letter-spacing:-.8px;margin:0;font-size:30px;font-weight:600;line-height:1.2}.backup-fleet-metric dt{font-size:13px}.backup-storage-metrics dd,.backup-storage-total{font-variant-numeric:tabular-nums;letter-spacing:-.6px}.backup-button,.primary-button,.secondary-button{min-height:var(--control-height);border-radius:var(--radius)}.primary-button,.backup-button-primary{color:var(--primary-foreground)}.backup-inspector-heading>div{gap:12px}.backup-workspace .backup-tabs a[aria-current=page]{color:var(--primary);border-color:var(--primary)}.update-notes-panel{padding:0}.update-group-count{background:var(--muted);color:var(--muted-foreground)}.update-feature-changes .update-note-icon{flex-basis:18px;width:18px;height:18px}.update-feature-changes strong{font-size:14px}.update-feature-changes p{margin-top:4px}.update-count-icon .update-note-icon{flex-basis:20px;width:20px;height:20px}.update-feature-group{background:var(--card)}.theme-section{max-width:960px;padding:32px 0}.theme-section fieldset{min-width:0}.theme-section legend{letter-spacing:-.3px;font-size:18px;font-weight:600}.theme-section p{color:var(--muted-foreground);margin-top:8px;font-size:13px;line-height:1.6}.theme-pack-field{border-bottom:1px solid var(--border);grid-template-columns:minmax(140px,1fr) minmax(200px,2fr);gap:8px 32px;max-width:700px;margin-bottom:28px;padding-bottom:28px;display:grid}.theme-pack-field>label{align-self:center;font-weight:600}.theme-pack-field>select{border:1px solid var(--input);border-radius:var(--radius);background:var(--background);min-width:0;max-width:100%;color:var(--foreground);min-height:var(--control-height);padding:8px 12px}.theme-pack-field>p{grid-column:2;margin-top:0}.theme-options{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:22px;display:grid}.theme-option{border:1px solid var(--border);border-radius:var(--radius);background:var(--card);cursor:pointer;grid-template-columns:18px minmax(0,1fr);align-content:start;gap:6px 10px;padding:16px;display:grid}.theme-option:hover{border-color:var(--input)}.theme-option:has(input:checked){border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}.theme-option:has(input:focus-visible){outline:2px solid var(--ring);outline-offset:4px}.theme-option>input{width:16px;height:16px;accent-color:var(--primary);grid-area:2/1;margin-top:3px}.theme-option-label{grid-area:2/2;font-weight:550}.theme-option-description{color:var(--muted-foreground);grid-area:3/2;font-size:12px;line-height:1.6}.theme-preview{aspect-ratio:1.65;border:1px solid var(--border);border-radius:5px;grid-area:1/1/auto/-1;margin-bottom:14px;display:block;position:relative;overflow:hidden}.theme-preview-ui{background:var(--background);height:100%;display:flex}.theme-preview-system>.theme-preview-ui:last-child{clip-path:inset(0 0 0 50%);position:absolute;inset:0}.theme-preview-sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;gap:9px;width:24%;padding:15px 10px;display:flex}.theme-preview-sidebar i{background:var(--muted-foreground);opacity:.45;border-radius:2px;height:4px;display:block}.theme-preview-sidebar i:first-child{background:var(--primary);opacity:1;width:12px;height:12px;margin-bottom:6px}.theme-preview-content{flex:1;padding:20px 12px;display:block}.theme-preview-heading,.theme-preview-subheading{background:var(--muted-foreground);border-radius:2px;width:48%;height:4px;display:block}.theme-preview-subheading{opacity:.45;width:70%;height:3px;margin-top:6px}.theme-preview-table{border:1px solid var(--border);border-radius:3px;margin-top:16px;display:block}.theme-preview-table>span{border-bottom:1px solid var(--border);align-items:center;gap:8px;height:23px;padding:5px;display:flex}.theme-preview-table>span:last-child{border:0}.theme-preview-table i{background:var(--muted-foreground);opacity:.45;border-radius:2px;flex:1;height:3px}.theme-preview-table i:first-child{flex:0 0 8px;height:9px}.theme-section .theme-persistence{margin-top:24px}.theme-section .theme-storage-notice{color:var(--warning)}@media (width<=1100px){.update-feature-changes,.update-details-toggle,.update-expanded-details{margin-left:0}}@media (width<=700px){.theme-options{grid-template-columns:1fr}.theme-option{grid-template-columns:110px 18px minmax(0,1fr);align-content:center;gap:5px 12px}.theme-preview{grid-area:1/1/4;align-self:center;margin:0}.theme-option>input{grid-area:1/2}.theme-option-label{grid-area:1/3}.theme-option-description{grid-area:2/3/4}.theme-preview-content{padding:8px 6px}.theme-preview-heading{height:2px}.theme-preview-subheading{height:2px;margin-top:3px}.theme-preview-sidebar{gap:5px;padding:10px 5px}.theme-preview-sidebar i:first-child{width:8px;height:8px;margin-bottom:0}.theme-preview-table{margin-top:4px}.theme-preview-table>span{gap:4px;height:7px;padding:2px}.theme-preview-table i:first-child{flex-basis:5px;height:5px}.theme-pack-field{grid-template-columns:1fr;gap:10px}.theme-pack-field>p{grid-column:1}}@media (width<=600px){.page-heading{margin-bottom:24px}.inline-summary{margin-bottom:20px}.inline-summary>span{padding-inline:10px}.inline-summary strong,.backup-fleet-metric dd{font-size:26px}.backup-fleet-summary{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:20px}.backup-fleet-metric:nth-child(odd){border-left:0;padding-left:0!important}.backup-fleet-metric dt{font-size:12px}.fleet-table .identity-button{gap:8px;max-width:none}.fleet-table .dsp-identity-copy strong{max-width:120px}.fleet-table .dsp-avatar{flex-basis:28px;width:28px;height:28px;font-size:10px}.theme-option{grid-template-columns:86px 16px minmax(0,1fr);gap:6px 9px;padding:12px}}.update-empty-state{padding:40px 0}.update-empty-state h2{margin-bottom:8px;font-size:20px}.update-browser-columns{grid-template-columns:230px minmax(0,1fr);gap:36px;min-height:calc(100dvh - 260px);display:grid}.update-release-navigation{border-right:1px solid var(--border);min-width:0;padding:24px 24px 32px 0}.update-release-navigation h2{margin:0 12px 18px;font-size:16px;font-weight:600}.update-release-search{border:1px solid var(--border);border-radius:var(--radius);background:var(--background);width:calc(100% - 24px);color:var(--foreground);font:400 14px/1.4 var(--font-family);margin:0 12px 20px;padding:10px 12px;display:block}.update-release-list{margin:0;padding:0;list-style:none}.update-release-list li+li{border-top:1px solid var(--border)}.update-release-link{width:100%;min-height:84px;color:var(--foreground);text-align:left;font:500 14px/1.5 var(--font-family);overflow-wrap:anywhere;border-left:3px solid #0000;flex-wrap:wrap;align-items:center;gap:6px 8px;padding:16px 12px;display:flex}.update-release-link:hover{background:var(--accent)}.update-release-link[aria-current=page]{background:var(--selection);border-left-color:var(--primary)}.update-release-version{width:100%}.update-release-date{color:var(--muted-foreground);font-size:13px;font-weight:400}.update-release-link .update-release-state{color:var(--primary);margin-left:auto}.update-release-state{background:0 0;padding:0;font-size:13px;font-weight:400}.update-browser-content{min-width:0;padding-top:24px}.update-release-meta{flex-wrap:wrap;gap:8px 16px;margin-top:10px;display:flex}.update-release-summary{border-block:1px solid var(--border);margin:24px 0 0;padding:16px 0}.update-feature-group{border:0;border-bottom:1px solid var(--border);border-radius:0;margin:0;padding:24px 0}.update-group-icon{width:28px;height:28px;color:var(--foreground);background:0 0;flex-basis:28px}.update-group-icon .update-note-icon{width:26px;height:26px}.update-group-count{color:var(--muted-foreground);background:0 0;margin-left:auto;padding:0}.update-feature-changes{margin:16px 0 0}.update-feature-changes li{grid-template-columns:88px minmax(0,1fr);gap:16px;padding:14px 0;display:grid}.update-feature-changes li+li{border-top:1px solid var(--border)}.update-change-kind{font-size:13px;font-weight:400}.update-change-kind.added,.update-change-kind.improved{color:var(--primary)}.update-feature-changes strong{font-size:14px;font-weight:550}.update-feature-changes p{margin-top:5px;font-size:14px}.update-details-toggle{min-height:32px;margin:8px 0 0;font-size:14px}.update-expanded-details{margin-left:0}.update-release-navigation>.update-muted{padding:0 12px;font-size:14px}@media (width<=1100px){.update-browser-columns{grid-template-columns:200px minmax(0,1fr);gap:24px}.update-feature-heading{flex-wrap:wrap;gap:8px 12px}}@media (width<=850px){.update-browser-columns{min-height:0;display:block}.update-release-navigation{border-right:0;border-bottom:1px solid var(--border);padding:12px 0 20px}.update-release-navigation h2{margin-left:0}.update-release-search{width:100%;margin-left:0;margin-right:0}.update-release-list{max-height:240px;overflow-y:auto}.update-release-link{min-height:76px}.update-feature-changes li{grid-template-columns:68px minmax(0,1fr);gap:12px}.update-feature-heading h3{font-size:17px}} /*$vite$:1*/ \ No newline at end of file diff --git a/dashboard/tests/browser/independent-updates.spec.cjs b/dashboard/tests/browser/independent-updates.spec.cjs new file mode 100644 index 0000000..974f818 --- /dev/null +++ b/dashboard/tests/browser/independent-updates.spec.cjs @@ -0,0 +1,60 @@ +const { test, expect } = require('@playwright/test'); +const { spawn } = require('node:child_process'); +const path = require('node:path'); +let processHandle, url; +test.beforeAll(async () => { + processHandle = spawn(process.execPath, [path.resolve(__dirname, '../../examples/independent-updates-preview.js')], { + env: { ...process.env, DISPATCH_INDEPENDENT_UPDATES_FIXTURE: '1' }, stdio: ['ignore', 'pipe', 'pipe'], + }); + url = await new Promise((resolve, reject) => { + let output = '', errors = ''; + const timer = setTimeout(() => reject(Error(`Preview timed out: ${errors}`)), 15000); + processHandle.stderr.on('data', chunk => { errors += chunk; }); + processHandle.once('error', error => { clearTimeout(timer); reject(error); }); + processHandle.once('exit', code => { clearTimeout(timer); reject(Error(`Preview exited ${code}: ${errors}`)); }); + processHandle.stdout.on('data', chunk => { output += chunk; const match = /Synthetic updates preview: (http:\/\/127\.0\.0\.1:\d+)/.exec(output); + if (match) { clearTimeout(timer); resolve(match[1]); } }); + }); +}); +test.afterAll(async () => { + if (processHandle?.exitCode !== null || processHandle?.signalCode !== null) return; + await new Promise(resolve => { const timer = setTimeout(() => processHandle.kill('SIGKILL'), 5000); + processHandle.once('exit', () => { clearTimeout(timer); resolve(); }); processHandle.kill('SIGTERM'); }); +}); +test('independent Core update, new release Dev gate, failure pause and sequential resume', async ({ page }, info) => { + const errors = []; page.on('pageerror', error => errors.push(error.message)); + page.on('console', event => { if (event.type() === 'error') errors.push(`${event.text()} (${event.location().url})`); }); + await page.goto(`${url}/#/updates`); + await page.getByLabel('Email address').fill('platform@example.test'); + await page.getByLabel('Password', { exact: true }).fill('synthetic preview password'); + await page.getByRole('button', { name: 'Sign in', exact: true }).click(); + await page.locator('.desktop-sidebar').getByRole('link', { name: 'Updates', exact: true }).click(); + await expect(page.getByRole('heading', { name: 'Dispatch Core', exact: true })).toBeVisible(); + await expect(page.getByText('Installed: 0.0.1', { exact: true })).toBeVisible(); + await page.screenshot({ path: info.outputPath('core.png'), fullPage: true }); + await page.getByRole('button', { name: 'Update Core', exact: true }).click(); + await expect(page.getByText('Installed: 0.0.2', { exact: true })).toBeVisible({ timeout: 10000 }); + await page.getByRole('tab', { name: 'DSPs', exact: true }).click(); + await expect(page.getByText('Installed on Dev DSP: 0.0.1', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Update Dev', exact: true }).click(); + await expect(page.getByRole('button', { name: 'Rollout Update', exact: true })).toBeEnabled({ timeout: 10000 }); + await page.screenshot({ path: info.outputPath('dev-tested.png'), fullPage: true }); + await page.request.post(`${url}/__fixture/publish`); + await expect(page.getByRole('button', { name: 'Update Dev', exact: true })).toBeEnabled({ timeout: 10000 }); + await expect(page.getByRole('heading', { name: 'Version 0.0.3', exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Update Dev', exact: true }).click(); + await expect(page.getByRole('button', { name: 'Rollout Update', exact: true })).toBeEnabled({ timeout: 10000 }); + await page.request.post(`${url}/__fixture/fail`); + await page.getByRole('button', { name: 'Rollout Update', exact: true }).click(); + await expect(page.getByRole('button', { name: 'Resume rollout', exact: true })).toBeEnabled({ timeout: 10000 }); + await expect(page.getByText('0 of 2 DSPs updated · paused', { exact: true })).toBeVisible(); + await page.screenshot({ path: info.outputPath('rollout-paused.png'), fullPage: true }); + await page.getByRole('button', { name: 'Resume rollout', exact: true }).click(); + await expect(page.getByText('2 of 2 DSPs updated · completed', { exact: true })).toBeVisible({ timeout: 10000 }); + await page.setViewportSize({ width: 390, height: 844 }); + await expect.poll(() => page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true); + await page.screenshot({ path: info.outputPath('mobile.png'), fullPage: true }); + await page.getByRole('tab', { name: 'Core', exact: true }).click(); + await expect(page.getByText('Installed: 0.0.2', { exact: true })).toBeVisible(); + expect(errors).toEqual([]); +}); diff --git a/dashboard/tests/directory-platform.test.js b/dashboard/tests/directory-platform.test.js index 2066284..2d8494b 100644 --- a/dashboard/tests/directory-platform.test.js +++ b/dashboard/tests/directory-platform.test.js @@ -528,10 +528,12 @@ test('local release history is readable without enabling remote downloads or leg const response = await fetch(endpoint, { headers: c.headers }); assert.equal(response.status, 200); const view = (await response.json()).data; - assert.equal(view.enabled, false); assert.deepEqual(view.releases, []); + assert.equal(view.enabled, false); assert.equal(view.mode, 'independent'); + assert.deepEqual(view.tracks.core.history, []); assert.deepEqual(view.tracks.dsp.history, []); const update = await fetch(endpoint, { method: 'POST', headers: c.headers, body: JSON.stringify({ action: 'start', releaseId: 'synthetic_release', idempotencyKey: 'directory:unconfigured:release' }) }); - assert.equal(update.status, 409); + assert.equal(update.status, 503); + assert.equal((await update.json()).error.code, 'release_worker_unavailable'); assert.equal(c.app.store.db.prepare('SELECT count(*) n FROM platform_backup_requests').get().n, 0); }); diff --git a/host/controller/deletion.js b/host/controller/deletion.js index 2cdcd7f..55070e0 100644 --- a/host/controller/deletion.js +++ b/host/controller/deletion.js @@ -27,6 +27,7 @@ class DirectoryDeletion { request({ organizationId, actorUserId, expectedRevision, requestId }) { idempotencyKey(requestId); const old = this.get(organizationId), control = this.store.installationControl(organizationId); + if (control?.runtimeKey === require('../../core/updates/configuration').loadConfiguration(this.paths)?.devDspId) throw new AccessError('directory_dev_protected', 409); if (old) { if (old.requestHash !== state.hash(requestId) || old.actorUserId !== actorUserId || old.expectedRevision !== expectedRevision) { if (old.status !== 'failed' || old.actorUserId !== actorUserId || expectedRevision !== control?.revision) throw new AccessError('installation_operation_in_progress', 409); diff --git a/host/controller/execution.js b/host/controller/execution.js index 8b91aaa..68a6596 100644 --- a/host/controller/execution.js +++ b/host/controller/execution.js @@ -38,6 +38,7 @@ class DirectoryExecution { eligible(id) { return this.configuration.enabled && (this.configuration.runtimeKeys === null || this.configuration.runtimeKeys.includes(id)); } context(id) { validateDspId(id); + require('../releases/guard').assertAvailable(this.paths, id); const row = this.access.db.prepare('SELECT i.organization_id,i.status,i.revision,i.backend,o.status organization_status FROM installations i JOIN organizations o ON o.id=i.organization_id WHERE i.runtime_key=?').get(id); if (!row || row.backend !== BACKEND || !ACTIVE_STATES.includes(row.status) || !['pending_owner', 'setup_required', 'active'].includes(row.organization_status) @@ -215,7 +216,7 @@ class DirectoryExecution { try { this.context(id); if (row.state === 'draining' && this.manager.journal.record(id)?.desiredState === 'stopped') { - row = this.store.update(id, { state: 'sleeping', operation_id: null }, this.clock()); + row = this.store.update(id, { state: 'sleeping' }, this.clock()); } if (['adopting', 'starting'].includes(row.state)) row = await this.start(id); const job = this.store.job(id, this.clock()); @@ -250,7 +251,7 @@ class DirectoryExecution { const operation = `sleep_${crypto.randomBytes(16).toString('hex')}`; this.store.update(id, { state: 'draining', operation_id: operation, next_wake_at: final.nextWakeAt }, this.clock()); await this.manager.apply('stop', operation, id); - this.store.update(id, { state: 'sleeping', operation_id: null, check_at: minimum([final.nextWakeAt, this.store.nextJob(id)]), failure_code: null }, this.clock()); + this.store.update(id, { state: 'sleeping', operation_id: operation, check_at: minimum([final.nextWakeAt, this.store.nextJob(id)]), failure_code: null }, this.clock()); } catch (error) { const code = /^execution_|^directory_/.test(error.message) ? error.message : 'execution_unavailable'; this.store.update(id, { failure_code: code, check_at: this.clock() + (code === 'execution_not_permitted' ? 60000 : this.configuration.pollMs) }, this.clock()); diff --git a/host/controller/manager.js b/host/controller/manager.js index 53d6659..2e2ed95 100644 --- a/host/controller/manager.js +++ b/host/controller/manager.js @@ -96,8 +96,10 @@ class DirectoryManager { } async apply(action, requestId, dspId) { - return withLock(this.paths, async lockFd => { + return require('../releases/provisioning').withCreation(this.paths, action, assignRelease => withLock(this.paths, async lockFd => { if (require('../storage/manual-backups').interruptedRestore(this.paths)) fail('directory_restore_incomplete'); + require('../releases/guard').assertAvailable(this.paths, dspId); + if (action === 'retire' && require('../../core/updates/configuration').loadConfiguration(this.paths)?.devDspId === dspId) fail('directory_dev_protected'); const job = this.journal.request(action, requestId, dspId); if (job.status === 'complete') return this.view(job); const checkpoint = phase => { job.phase = phase; job.status = 'pending'; job.error = null; this.journal.save(job); }; @@ -117,6 +119,7 @@ class DirectoryManager { this.journal.saveRecord(record); checkpoint('storage'); ensureDsp(this.paths, record.id, record.creationId); + if (assignRelease) await assignRelease(record.id, lockFd); checkpoint('prepare'); await this.host.prepare(record.id, lockFd); this.checkedDsp(record); @@ -146,7 +149,7 @@ class DirectoryManager { this.journal.save(job); throw Object.assign(new Error(job.error, { cause: error }), { code: job.error }); } - }); + })); } // Reconnect retained services after a controller restart. Stopped or retired @@ -155,7 +158,7 @@ class DirectoryManager { if (this.assistanceConfiguration && !this.pluginBackend) await require('../browser-assistance/runner').reapSessions(this.assistanceConfiguration); return withLock(this.paths, async lockFd => { if (require('../storage/manual-backups').interruptedRestore(this.paths)) fail('directory_restore_incomplete'); - const records = this.journal.all().filter(record => select(record) && record.tokenHash); + const records = this.journal.all().filter(record => select(record) && record.tokenHash && !require('../releases/guard').dspUpdating(this.paths, record.id)); const results = await require('../../shared/async/bounded-map').boundedMap(records, 2, async record => { await this.host.prepare(record.id, lockFd); this.checkedDsp(record); diff --git a/host/plugins/directory-lifecycle.js b/host/plugins/directory-lifecycle.js index 9bdf0ee..3d5b7af 100644 --- a/host/plugins/directory-lifecycle.js +++ b/host/plugins/directory-lifecycle.js @@ -14,15 +14,18 @@ const { success } = require('../../shared/contracts/src/result'); const { snapshot } = require('./snapshot'); const { validateSpec } = require('dispatch-runtime-kit/collection-manager/src/validation'); -function createDirectoryInstallation({ paths, manager, execution, store, backend = manager.pluginBackend }) { +function createDirectoryInstallation({ paths, manager, execution, store, backend = manager.pluginBackend, lifecycleLock = null }) { if (!backend) throw new Error('plugin_backend_unavailable'); const locks = new Map(); const rootFor = id => manager.checkedDsp(manager.journal.record(id)).root; const host = new PluginLifecycle({ - withLifecycle: (id, work) => execution.locked(id, () => withLock(paths, async lockFd => { + withLifecycle: (id, work) => { + const locked = async lockFd => { locks.set(id, lockFd); try { return await work(rootFor(id)); } finally { locks.delete(id); } - })), + }; + return lifecycleLock ? lifecycleLock(id, locked) : execution.locked(id, () => withLock(paths, locked)); + }, drain: async ({ runtimeKey, request }) => { await backend.request(runtimeKey, 'plugin.revoke', { pluginId: request.pluginId }); await manager.host.stop(runtimeKey, locks.get(runtimeKey)); diff --git a/host/plugins/distribution.js b/host/plugins/distribution.js index 2817af8..db6dadd 100644 --- a/host/plugins/distribution.js +++ b/host/plugins/distribution.js @@ -10,9 +10,9 @@ const { packageCatalog, normalizeCatalog } = require('../../core/plugins/package // Called by the reviewed release/operator delivery step, never an HTTP install // request. Staging never changes any DSP's approved version. -async function distributePackage(paths, { directory, digest }) { +async function distributePackage(paths, { directory, digest }, { lockFd } = {}) { const manifest = verifyPackage(directory, digest); - return withLock(paths, async () => { + const work = async () => { const file = path.join(privateDirectory(path.join(paths.local, 'config')), 'plugin-packages.json'); packageCatalog(paths); // Validate any existing catalog before extending it. const catalog = normalizeCatalog(privateJson(file, process.geteuid(), true) || { schemaVersion: 2, items: [], approved: { production: {}, dsps: {} } }); @@ -36,13 +36,14 @@ async function distributePackage(paths, { directory, digest }) { } atomic(file, normalizeCatalog(catalog)); return { pluginId, version, digest, distributed: true, activated: false }; - }); + }; + return lockFd === undefined ? withLock(paths, work) : work(); } // Internal lifecycle port. The release coordinator calls this only for the // selected DSP after validating its release. No HTTP-supplied paths are accepted. -async function approvePackages(paths, { runtimeKey, packages }) { +async function approvePackages(paths, { runtimeKey, packages }, { lockFd } = {}) { if (!/^[a-zA-Z0-9_-]{1,128}$/.test(runtimeKey) || !Array.isArray(packages) || !packages.length) throw new Error('plugin_approval_invalid'); - return withLock(paths, async () => { + const work = async () => { const file = path.join(paths.local, 'config/plugin-packages.json'); const catalog = normalizeCatalog(privateJson(file, process.geteuid())); const verified = packageCatalog(paths); @@ -55,6 +56,7 @@ async function approvePackages(paths, { runtimeKey, packages }) { catalog.approved.dsps[runtimeKey] = selected; atomic(file, normalizeCatalog(catalog)); return { runtimeKey, approved: selected }; - }); + }; + return lockFd === undefined ? withLock(paths, work) : work(); } module.exports = { distributePackage, approvePackages }; diff --git a/host/releases/core-state.js b/host/releases/core-state.js new file mode 100644 index 0000000..77637f3 --- /dev/null +++ b/host/releases/core-state.js @@ -0,0 +1,57 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'); +const files = require('../storage/backup-files'); +const { privateDirectory, syncDirectory } = require('../controller/operations'); +const valid = name => name === 'config' || name === 'secrets' || /^state\/(?!updates$)[A-Za-z0-9_.-]{1,128}$/.test(name) && !['state/.', 'state/..'].includes(name); +const labels = paths => ['config', 'secrets', ...fs.readdirSync(path.join(paths.local, 'state')).filter(name => name !== 'updates').map(name => `state/${name}`)]; +function copyFile(source, destination) { + const before = files.digest(source); + fs.copyFileSync(source, destination, fs.constants.COPYFILE_EXCL); fs.chmodSync(destination, 0o600); + const fd = fs.openSync(destination, 'r'); try { fs.fsyncSync(fd); } finally { fs.closeSync(fd); } + if (files.digest(source).sha256 !== before.sha256 || files.digest(destination).sha256 !== before.sha256) throw new Error('release_snapshot_changed'); + syncDirectory(path.dirname(destination)); return before.sha256; +} +function capture(paths, target) { + privateDirectory(path.join(target, 'state')); + return labels(paths).filter(name => fs.existsSync(path.join(paths.local, name))).map(name => { + if (!valid(name)) throw new Error('release_state_layout_invalid'); + const source = path.join(paths.local, name), destination = path.join(target, name); + const type = fs.lstatSync(source).isDirectory() ? 'directory' : 'file'; + const digest = type === 'directory' ? files.clone(source, destination).treeDigest : copyFile(source, destination); + return { name, type, digest }; + }); +} +function restore(paths, target, roots) { + if (!Array.isArray(roots) || roots.some(item => !valid(item.name) || !['file', 'directory'].includes(item.type)) + || new Set(roots.map(item => item.name)).size !== roots.length) throw new Error('release_snapshot_invalid'); + for (const item of roots) { + const source = path.join(target, item.name); + if ((item.type === 'directory' ? files.scan(source).treeDigest : files.digest(source).sha256) !== item.digest) throw new Error('release_snapshot_changed'); + } + // Keep the updater's bootstrap identity readable throughout recovery, even + // if the process is interrupted after clearing other configuration files. + const config = roots.find(item => item.name === 'config'); + if (config?.type !== 'directory') throw new Error('release_snapshot_invalid'); + const preserve = ['platform.json', 'updates.json'].filter(name => fs.existsSync(path.join(target, 'config', name))); + if (!preserve.includes('platform.json')) throw new Error('release_snapshot_invalid'); + for (const name of preserve) { + if (files.digest(path.join(target, 'config', name)).sha256 !== files.digest(path.join(paths.local, 'config', name)).sha256) throw new Error('release_configuration_changed'); + } + // Drop state introduced by a failed migration, while retaining the updater's + // own journal, command history and rollback receipts outside this snapshot. + for (const name of labels(paths)) { + const current = path.join(paths.local, name); + if (!fs.existsSync(current)) continue; + if (!valid(name)) throw new Error('release_state_layout_invalid'); + if (name === 'config') { files.clear(current, { preserve }); continue; } + if (fs.lstatSync(current).isDirectory()) { files.clear(current); fs.rmdirSync(current); } + else { files.checked(current, false); fs.unlinkSync(current); } + syncDirectory(path.dirname(current)); + } + for (const item of roots) { + const source = path.join(target, item.name), destination = path.join(paths.local, item.name); + if (item.type === 'directory') { privateDirectory(destination); files.copyContents(source, destination, { preserve: item.name === 'config' ? preserve : [] }); } + else copyFile(source, destination); + } +} +module.exports = { capture, restore }; diff --git a/host/releases/core.js b/host/releases/core.js new file mode 100644 index 0000000..4f579a2 --- /dev/null +++ b/host/releases/core.js @@ -0,0 +1,125 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'), crypto = require('node:crypto'); +const { DatabaseSync } = require('node:sqlite'); +const { inventory, verifyRelease, secureCopy } = require('../../shared/releases/package'); +const { atomic, privateJson } = require('../../core/installations/src/release-delivery-files'); +const { privateDirectory, privileged, syncDirectory, acquireLock } = require('../controller/operations'); +const { DirectoryJournal } = require('../controller/journal'); +const { runtimeSource, fileFor } = require('./runtime'); +const { unitFor } = require('../services/plugin-backend'); +const receiptFile = paths => path.join(paths.local, 'state/updates/installed-core.json'); +function verifyLive(paths, manifest) { + const expected = manifest.files.filter(item => item.path.startsWith('code/')).map(item => ({ ...item, path: item.path.slice(5) })); + if (JSON.stringify(inventory(paths.live)) !== JSON.stringify(expected)) throw new Error('release_core_baseline_changed'); +} +function coreHooks({ paths, configuration, releases, systemctl = async args => privileged(['/usr/bin/systemctl', ...args], { timeout: 300000 }), fetchImpl = fetch, healthTimeoutMs = 90000 }) { + const root = privateDirectory(path.join(paths.local, 'backups/updates/core')); + let controllerLock, operationLock; + const unlock = () => { + if (operationLock !== undefined) { fs.closeSync(operationLock); operationLock = undefined; } + if (controllerLock !== undefined) { fs.closeSync(controllerLock); controllerLock = undefined; } + }; + const lock = () => { controllerLock = acquireLock(paths, 'controller'); operationLock = acquireLock(paths); }; + const baseline = () => { + for (const dsp of new DirectoryJournal(paths).all().filter(item => item.desiredState !== 'retired')) { + const selected = releases().active.dsps[dsp.id]; + if (!selected || privateJson(fileFor(paths, dsp.id), process.geteuid(), true)?.digest !== selected || runtimeSource(paths, dsp.id) === paths.live) throw new Error('release_dsp_baseline_required'); + } + }; + const units = ['dispatch-platform-local.service', 'dispatch-api.service', unitFor(paths)]; + const targetFor = token => { + if (!token || !/^[a-f0-9]{32}$/.test(token.id)) throw new Error('release_snapshot_invalid'); + return path.join(root, token.id); + }; + const stop = async () => { + for (const unit of units) await systemctl(['stop', unit]); + for (const unit of units) { + const status = await systemctl(['show', unit, '-p', 'ActiveState', '-p', 'MainPID', '-p', 'ControlPID']); + const fields = Object.fromEntries(status.trim().split('\n').map(line => line.split('='))); + if (!['inactive', 'failed'].includes(fields.ActiveState) || fields.MainPID !== '0' || fields.ControlPID !== '0') throw new Error('release_core_not_drained'); + } + }; + const start = async () => { + await systemctl(['start', 'dispatch-api.service']); + await systemctl(['start', 'dispatch-platform-local.service']); + }; + const health = async (digest, version, nonce) => { + const deadline = Date.now() + healthTimeoutMs; + while (Date.now() < deadline) { + try { + const origin = require('../controller/dashboard-settings').loadDashboardSettings(paths)?.publicOrigin; + const headers = { ...(nonce ? { 'X-Dispatch-Recovery-Probe': nonce } : {}), ...(origin ? { Host: new URL(origin).host, 'CF-Visitor': '{"scheme":"https"}' } : {}) }; + const response = await fetchImpl(`http://127.0.0.1:${configuration.apiPort}/api/platform/core-health`, { signal: AbortSignal.timeout(3000), headers, redirect: 'error' }); + const body = await response.json(); + if (response.ok && body.ok && body.data?.digest === digest && body.data.version === version && (!nonce || body.data.recoveryProbe === 'passed')) return true; + } catch {} + await new Promise(resolve => setTimeout(resolve, Math.max(1, Math.min(500, deadline - Date.now())))); + } + return false; + }; + return { + async withActivation(_c, work) { try { return await work(); } finally { unlock(); } }, + async prepare(c) { + if (c.product !== 'core' || !c.previousDigest) throw new Error('release_baseline_required'); + const prior = releases().releases.core[c.previousDigest]; + if (!prior) throw new Error('release_baseline_required'); + verifyLive(paths, verifyRelease(prior.directory, prior.digest)); + // A Core-only tree cannot supply a missing DSP runtime. This gate is + // deliberately strict during the initial monolithic-to-split cutover. + baseline(); + const token = { id: crypto.randomBytes(16).toString('hex'), nonce: crypto.randomBytes(32).toString('hex'), previousDigest: c.previousDigest }; + const target = privateDirectory(targetFor(token)); + if (fs.statSync(target).dev !== fs.statSync(paths.live).dev) throw new Error('release_filesystem_mismatch'); + secureCopy(path.join(c.directory, 'code'), path.join(target, 'next')); + return token; + }, + async drain() { await stop(); lock(); }, + async snapshot(c) { + baseline(); + const prior = releases().releases.core[c.previousDigest]; + verifyLive(paths, verifyRelease(prior.directory, prior.digest)); + const target = targetFor(c.preparation); + const roots = require('./core-state').capture(paths, target); + // Check the database while the API is stopped. Sidecars are included in + // the stopped state snapshot; no running connection is copied on rollback. + const db = new DatabaseSync(path.join(paths.local, 'state/access-control/access-control.sqlite3'), { readOnly: true }); + try { if (db.prepare('PRAGMA quick_check').get().quick_check !== 'ok') throw new Error('release_database_invalid'); } + finally { db.close(); } + atomic(path.join(target, 'snapshot.json'), { roots, digest: c.digest, previousDigest: c.previousDigest }); + return { id: c.preparation.id }; + }, + async start(c) { + const target = targetFor(c.preparation); + fs.renameSync(paths.live, path.join(target, 'previous')); syncDirectory(paths.platformRoot); syncDirectory(target); + fs.renameSync(path.join(target, 'next'), paths.live); syncDirectory(paths.platformRoot); syncDirectory(target); + verifyLive(paths, c.manifest); + atomic(receiptFile(paths), { digest: c.digest, version: c.manifest.version }); + unlock(); await start(); + }, + verify: c => health(c.digest, c.manifest.version, c.preparation?.nonce), + async restore(c) { + if (!c.preparation) return; + unlock(); await stop(); lock(); + const target = targetFor(c.preparation), saved = privateJson(path.join(target, 'snapshot.json'), process.geteuid(), true); + const previous = path.join(target, 'previous'); + if (fs.existsSync(previous)) { + if (!saved || saved.digest !== c.digest || saved.previousDigest !== c.previousDigest) throw new Error('release_snapshot_invalid'); + if (fs.existsSync(paths.live)) { + const failed = path.join(target, 'failed'); + if (fs.existsSync(failed)) throw new Error('release_restore_conflict'); + fs.renameSync(paths.live, failed); + } + fs.renameSync(previous, paths.live); syncDirectory(paths.platformRoot); syncDirectory(target); + } + if (saved) { + require('./core-state').restore(paths, target, saved.roots); + } else if (c.snapshot) throw new Error('release_snapshot_missing'); + const prior = releases().releases.core[c.previousDigest]; + verifyLive(paths, verifyRelease(prior.directory, prior.digest)); + atomic(receiptFile(paths), { digest: prior.digest, version: prior.version }); + unlock(); await start(); + if (!await health(prior.digest, prior.version, c.preparation.nonce)) throw new Error('release_rollback_health_failed'); + }, + }; +} +module.exports = { coreHooks, verifyLive, receiptFile }; diff --git a/host/releases/dsp.js b/host/releases/dsp.js new file mode 100644 index 0000000..f0ffd31 --- /dev/null +++ b/host/releases/dsp.js @@ -0,0 +1,164 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'), crypto = require('node:crypto'); +const { privateDirectory, withLock } = require('../controller/operations'); +const { atomic, privateJson } = require('../../core/installations/src/release-delivery-files'); +const { prepareDspRelease, selectDspRelease, fileFor } = require('./runtime'); +const files = require('../storage/backup-files'); +const pluginBackup = require('../plugins/backup-state'); +const { normalizeCatalog } = require('../../core/plugins/package-catalog'); +const { distributePackage, approvePackages } = require('../plugins/distribution'); +const { createDirectoryInstallation } = require('../plugins/directory-lifecycle'); +const DURABLE = ['config', 'data', 'secrets', 'state', 'staging', 'browser', 'plugins']; +function dspHooks({ paths, store, manager, execution }) { + let lockFd; + const root = privateDirectory(path.join(paths.local, 'backups/updates/dsp')); + const approvalsFile = path.join(paths.local, 'config/plugin-packages.json'); + const coordinator = manager.pluginBackend && createDirectoryInstallation({ paths, store, manager, execution, + lifecycleLock: (_id, work) => work(lockFd) }); + const record = c => manager.journal.record(c.dspId); + const directory = c => manager.checkedDsp(record(c)).root; + const installation = c => store.db.prepare('SELECT * FROM installations WHERE runtime_key=?').get(c.dspId); + const sleeping = c => { + if (!execution.eligible?.(c.dspId)) return null; + const row = execution.store.get(c.dspId), current = record(c); + return current?.desiredState === 'stopped' && row?.mode === 'on_demand' && row.state === 'sleeping' + && /^sleep_[a-f0-9]{32}$/.test(row.operation_id || '') + && crypto.createHash('sha256').update(row.operation_id).digest('hex') === current.latestRequest ? row : null; + }; + const unchanged = c => { + const before = c.preparation, current = record(c), row = installation(c); + if (!before || current?.creationId !== before.creationId || current.latestRequest !== before.latestRequest + || !(current.desiredState === before.desiredState || before.sleeping && current.desiredState === 'running') || row?.revision !== before.installationRevision + || row.organization_id !== before.organizationId || row.status !== 'ready') throw new Error('release_dsp_changed'); + return row; + }; + const tokenDirectory = token => { + if (!token || !/^[a-f0-9]{32}$/.test(token.id)) throw new Error('release_snapshot_invalid'); + return path.join(root, token.id); + }; + const captureApprovals = id => { + const value = privateJson(approvalsFile, process.geteuid(), true); + if (!value) return {}; + const catalog = normalizeCatalog(value); + return { ...catalog.approved.production, ...catalog.approved.dsps[id] }; + }; + const stop = async c => { + await manager.pluginBackend?.request(c.dspId, 'plugin.revoke', { pluginId: null }); + await manager.host.stop(c.dspId, lockFd); + }; + const start = async c => { + unchanged(c); + if (c.preparation.sleeping && record(c).desiredState === 'stopped') manager.journal.saveRecord({ ...record(c), desiredState: 'running' }); + await manager.host.prepare(c.dspId, lockFd); + manager.credentials(record(c)); await manager.bridge(record(c)); + await manager.host.start(c.dspId, lockFd); await manager.ready(c.dspId); + if (c.preparation.sleeping) { + // Resume scheduled/plugin work only after the activation journal clears. + // The scheduler sees the live runtime and checkpoints it on its next pass. + execution.store.update(c.dspId, { state: 'starting', operation_id: null, + check_at: Date.now(), last_activity: Date.now(), failure_code: null }, Date.now()); + } + }; + return { + withActivation: (c, work) => execution.locked(c.dspId, () => withLock(paths, async fd => { + lockFd = fd; try { return await work(); } finally { lockFd = undefined; } + })), + requiresActivation: c => Boolean(sleeping(c)), + async prepare(c) { + if (c.product !== 'dsp') throw new Error('release_product_invalid'); + const current = record(c), row = installation(c), sleeper = sleeping(c); + if (!row || row.backend !== 'directory_service_v1' || row.status !== 'ready' || current?.desiredState !== 'running' && !sleeper + || store.db.prepare("SELECT 1 FROM directory_lifecycle_requests WHERE organization_id=? AND status IN ('queued','running')").get(row.organization_id) + || store.db.prepare("SELECT 1 FROM installation_onboarding_requests WHERE organization_id=? AND status IN ('queued','running','enrolling')").get(row.organization_id)) throw new Error('release_dsp_not_ready'); + if (store.db.prepare('SELECT 1 FROM dsp_plugins WHERE organization_id=? AND revision<>applied_revision').get(row.organization_id)) throw new Error('release_plugin_busy'); + const prior = privateJson(fileFor(paths, c.dspId), process.geteuid(), true)?.digest || null; + if (prior !== c.previousDigest) throw new Error('release_baseline_changed'); + const plugins = pluginBackup.capture(store, c.dspId, directory(c)); + if (plugins.some(item => item.state !== 'uninstalled' && !c.manifest.plugins.some(next => next.pluginId === item.id))) throw new Error('release_installed_plugin_missing'); + const preparation = { id: crypto.randomBytes(16).toString('hex'), creationId: current.creationId, + latestRequest: current.latestRequest, desiredState: current.desiredState, organizationId: row.organization_id, + installationRevision: row.revision, sleeping: sleeper ? { state: sleeper.state, operation_id: sleeper.operation_id, + next_wake_at: sleeper.next_wake_at, check_at: sleeper.check_at, last_activity: sleeper.last_activity, snapshot_ready: sleeper.snapshot_ready, failure_code: sleeper.failure_code } : null }; + privateDirectory(tokenDirectory(preparation)); + return preparation; + }, + async drain(c) { unchanged(c); await stop(c); }, + async snapshot(c) { + unchanged(c); + const target = tokenDirectory(c.preparation), dspRoot = directory(c), roots = []; + for (const name of DURABLE) { + const source = path.join(dspRoot, name); + if (!fs.existsSync(source)) continue; + const saved = files.clone(source, path.join(target, name)); + roots.push({ name, digest: saved.treeDigest }); + } + const manifest = { preparation: c.preparation, roots, plugins: pluginBackup.capture(store, c.dspId, dspRoot), + approvals: captureApprovals(c.dspId), digest: c.digest, previousDigest: c.previousDigest, dspId: c.dspId }; + atomic(path.join(target, 'snapshot.json'), manifest); + return { id: c.preparation.id }; + }, + async start(c) { + const row = unchanged(c); + prepareDspRelease(paths, c.dspId, c.directory, c.digest); + for (const item of c.manifest.plugins) await distributePackage(paths, + { directory: path.join(c.directory, 'plugins', item.pluginId), digest: item.digest }, { lockFd }); + if (c.manifest.plugins.length) await approvePackages(paths, { runtimeKey: c.dspId, packages: c.manifest.plugins }, { lockFd }); + selectDspRelease(paths, c.dspId, c.digest, c.previousDigest); + for (const plugin of store.db.prepare("SELECT * FROM dsp_plugins WHERE organization_id=? AND desired_state<>'uninstalled'").all(row.organization_id)) { + const selected = c.manifest.plugins.find(item => item.pluginId === plugin.plugin_id); + if (selected.version === plugin.version) continue; + if (!coordinator) throw new Error('release_plugin_backend_required'); + const revision = plugin.revision + 1; + store.db.prepare('UPDATE dsp_plugins SET version=?,revision=?,failure_code=NULL WHERE organization_id=? AND plugin_id=? AND revision=?') + .run(selected.version, revision, row.organization_id, plugin.plugin_id, plugin.revision); + const result = await coordinator.apply({ runtimeKey: c.dspId, + request: { command: 'apply', pluginId: plugin.plugin_id, version: selected.version, revision, state: plugin.desired_state }, + authorize: () => { unchanged(c); return true; } }); + if (!result?.ok) throw new Error('release_plugin_health_failed'); + store.db.prepare('UPDATE dsp_plugins SET applied_revision=?,applied_state=?,updated_at=? WHERE organization_id=? AND plugin_id=? AND revision=?') + .run(revision, plugin.desired_state, Date.now(), row.organization_id, plugin.plugin_id, revision); + } + await start(c); + }, + async verify(c) { + // Even an already-selected Dev version needs a fresh live health check. + const selected = privateJson(fileFor(paths, c.dspId), process.geteuid(), true); + if (selected?.digest !== c.digest || record(c)?.desiredState !== 'running') return false; + await manager.ready(c.dspId); + const row = installation(c); + return row?.status === 'ready' && !store.db.prepare('SELECT 1 FROM dsp_plugins WHERE organization_id=? AND (revision<>applied_revision OR failure_code IS NOT NULL)').get(row.organization_id); + }, + async restore(c) { + if (!c.preparation) return; + unchanged(c); await stop(c); + const target = tokenDirectory(c.preparation); + const saved = privateJson(path.join(target, 'snapshot.json'), process.geteuid(), true); + if (saved) { + if (saved.dspId !== c.dspId || saved.digest !== c.digest || saved.previousDigest !== c.previousDigest) throw new Error('release_snapshot_invalid'); + const dspRoot = directory(c); + for (const item of saved.roots) { + if (!DURABLE.includes(item.name) || files.scan(path.join(target, item.name)).treeDigest !== item.digest) throw new Error('release_snapshot_changed'); + } + const plan = pluginBackup.plan(store, saved.preparation.organizationId, saved.plugins); + for (const item of saved.roots) { + const destination = path.join(dspRoot, item.name); + files.clear(destination); files.copyContents(path.join(target, item.name), destination); + } + const catalog = privateJson(approvalsFile, process.geteuid(), true); + if (catalog) { const value = normalizeCatalog(catalog); value.approved.dsps[c.dspId] = saved.approvals; atomic(approvalsFile, normalizeCatalog(value)); } + if (plan.length) pluginBackup.restore(store, saved.preparation.organizationId, dspRoot, plan); + const selected = privateJson(fileFor(paths, c.dspId), process.geteuid(), true)?.digest || null; + if (![c.digest, c.previousDigest].includes(selected)) throw new Error('release_baseline_changed'); + if (selected !== c.previousDigest) selectDspRelease(paths, c.dspId, c.previousDigest, selected); + } else if (c.snapshot) throw new Error('release_snapshot_missing'); + await start(c); + if (c.preparation.sleeping) { + await stop(c); + for (const resources of [manager.assistance, manager.egress, manager.bridges]) { await resources?.get(c.dspId)?.close(); resources?.delete(c.dspId); } + manager.journal.saveRecord({ ...record(c), desiredState: 'stopped' }); + execution.store.update(c.dspId, c.preparation.sleeping, Date.now()); + } + }, + }; +} +module.exports = { dspHooks, DURABLE }; diff --git a/host/releases/guard.js b/host/releases/guard.js new file mode 100644 index 0000000..5dad699 --- /dev/null +++ b/host/releases/guard.js @@ -0,0 +1,16 @@ +'use strict'; +const path = require('node:path'); +const { privateJson } = require('../../core/installations/src/release-delivery-files'); +function operation(paths) { + return privateJson(path.join(paths.local, 'state/updates/releases.json'), process.geteuid(), true)?.operation; +} +function dspUpdating(paths, dspId) { return operation(paths)?.dspId === dspId; } +function updating(paths, dspId) { + const selected = operation(paths); + return Boolean(selected && (selected.product === 'core' || selected.dspId === dspId)); +} +function assertAvailable(paths, dspId) { + if (updating(paths, dspId)) throw Object.assign(new Error('directory_update_in_progress'), { code: 'directory_update_in_progress' }); +} +function healthAllowed(paths) { const selected = operation(paths); return !selected || ['starting', 'restoring'].includes(selected.phase); } +module.exports = { updating, dspUpdating, assertAvailable, healthAllowed }; diff --git a/host/releases/provisioning.js b/host/releases/provisioning.js new file mode 100644 index 0000000..0c6ec84 --- /dev/null +++ b/host/releases/provisioning.js @@ -0,0 +1,37 @@ +'use strict'; +const path = require('node:path'); +const { LocalReleases } = require('../../core/updates/local-releases'); +const { loadConfiguration, rootFor } = require('../../core/updates/configuration'); +const { privateJson } = require('../../core/installations/src/release-delivery-files'); +const { prepareDspRelease, selectDspRelease, fileFor } = require('./runtime'); +const { verifyRelease } = require('../../shared/releases/package'); +const { distributePackage, approvePackages } = require('../plugins/distribution'); +const inert = Object.fromEntries(['drain', 'snapshot', 'start', 'verify', 'restore'].map(name => [name, async () => { throw new Error('release_activation_unavailable'); }])); +// Use the same lock order as updates: release state, then host lifecycle. New +// DSPs receive only the last completely rolled-out release, never a Dev candidate. +async function withCreation(paths, action, work) { + const config = loadConfiguration(paths); + if (action !== 'create' || !config) return work(null); + const releases = new LocalReleases({ directory: rootFor(paths), devDspId: config.devDspId, hooks: inert }); + return releases.locked(async state => { + if (state.operation) throw new Error('release_busy'); + const assign = async (id, lockFd) => { + const existing = privateJson(fileFor(paths, id), process.geteuid(), true); + const digest = existing?.digest || state.defaultDsp; + const release = state.releases.dsp[digest], core = state.releases.core[state.active.core]; + if (!release || !core || release.protocol !== core.protocol) throw new Error('release_baseline_required'); + if (state.active.dsps[id] && state.active.dsps[id] !== digest) throw new Error('release_baseline_changed'); + const manifest = verifyRelease(release.directory, digest); + prepareDspRelease(paths, id, release.directory, digest); + for (const item of manifest.plugins) await distributePackage(paths, + { directory: path.join(release.directory, 'plugins', item.pluginId), digest: item.digest }, { lockFd }); + if (manifest.plugins.length) await approvePackages(paths, { runtimeKey: id, packages: manifest.plugins }, { lockFd }); + if (!existing) selectDspRelease(paths, id, digest, null); + state.active.dsps[id] = digest; + if (state.rollout && state.rollout.status !== 'completed' && id !== config.devDspId && !state.rollout.targets.includes(id)) state.rollout.targets.push(id); + releases.save(state); + }; + return work(assign); + }); +} +module.exports = { withCreation }; diff --git a/host/releases/runtime.js b/host/releases/runtime.js index bc57d81..13fd12c 100644 --- a/host/releases/runtime.js +++ b/host/releases/runtime.js @@ -3,7 +3,7 @@ const fs=require('node:fs'),path=require('node:path'); const {verifyRelease,secureCopy}=require('../../shared/releases/package'); const {validateDspId}=require('../../shared/paths/platform-paths'); const {privateJson,atomic}=require('../../core/installations/src/release-delivery-files'); -const {privateDirectory}=require('../controller/operations'); +const {privateDirectory,syncDirectory}=require('../controller/operations'); const fileFor=(paths,id)=>path.join(paths.local,'state/dsp-releases',validateDspId(id)+'.json'); function runtimeSource(paths,id) { const current=privateJson(fileFor(paths,id),process.geteuid(),true); @@ -18,7 +18,11 @@ function prepareDspRelease(paths,id,directory,digest) { validateDspId(id); if(verifyRelease(directory,digest).product!=='dsp')throw new Error('dsp_release_invalid'); const parent=privateDirectory(path.join(paths.dsps,id,'runtime/releases')),target=path.join(parent,digest); - if(!fs.existsSync(target))secureCopy(directory,target); + if(!fs.existsSync(target)){ + const temporary=target+'.stage-'+require('node:crypto').randomBytes(12).toString('hex'); + try{secureCopy(directory,temporary);verifyRelease(temporary,digest);fs.renameSync(temporary,target);syncDirectory(parent);} + finally{fs.rmSync(temporary,{recursive:true,force:true});} + } verifyRelease(target,digest);return {dspId:id,digest,directory:target}; } // Lifecycle callers hold their DSP lock and drain old processes before selecting @@ -32,4 +36,4 @@ function selectDspRelease(paths,id,digest,expectedDigest) { }else if(prior)fs.unlinkSync(file); return {previousDigest:prior?.digest||null,digest}; } -module.exports={runtimeSource,prepareDspRelease,selectDspRelease}; +module.exports={runtimeSource,prepareDspRelease,selectDspRelease,fileFor}; diff --git a/host/releases/setup.js b/host/releases/setup.js new file mode 100644 index 0000000..51df199 --- /dev/null +++ b/host/releases/setup.js @@ -0,0 +1,89 @@ +'use strict'; +const fs = require('node:fs'), path = require('node:path'); +const { DatabaseSync } = require('node:sqlite'); +const { privateDirectory, acquireLock } = require('../controller/operations'); +const { atomic, privateJson } = require('../../core/installations/src/release-delivery-files'); +const { validateDspId, directory } = require('../../shared/paths/platform-paths'); +const { LocalReleases } = require('../../core/updates/local-releases'); +const { loadConfiguration, rootFor } = require('../../core/updates/configuration'); +const { verifyLive, receiptFile } = require('./core'); +const { verifyRelease, secureCopy, hash, inventory } = require('../../shared/releases/package'); +const { DirectoryJournal } = require('../controller/journal'); +const { fileFor, runtimeSource } = require('./runtime'); +const inert = Object.fromEntries(['drain', 'snapshot', 'start', 'verify', 'restore'].map(name => [name, async () => { throw new Error('release_activation_unavailable'); }])); +function configure(paths, devDspId, apiPort) { + validateDspId(devDspId); + if (!Number.isInteger(apiPort) || apiPort < 1024 || apiPort > 65535) throw new Error('release_configuration_invalid'); + const file = path.join(paths.local, 'config/updates.json'); + const prior = loadConfiguration(paths); + const state = privateJson(path.join(rootFor(paths), 'releases.json'), process.geteuid(), true); + if (prior && prior.devDspId !== devDspId || state && state.devDspId !== devDspId) throw new Error('release_dev_identity_changed'); + const db = new DatabaseSync(path.join(paths.local, 'state/access-control/access-control.sqlite3'), { readOnly: true }); + try { + const row = db.prepare("SELECT status FROM installations WHERE runtime_key=? AND backend='directory_service_v1'").get(devDspId); + if (!row || row.status !== 'ready' || !new DirectoryJournal(paths).record(devDspId)) throw new Error('release_dev_unavailable'); + } finally { db.close(); } + atomic(file, { schemaVersion: 1, devDspId, apiPort }); + return { configured: true, activation: false }; +} +async function adopt(paths, coreDigest) { + const configuration = loadConfiguration(paths); + if (!configuration || !/^[a-f0-9]{64}$/.test(coreDigest)) throw new Error('release_configuration_required'); + const controller = acquireLock(paths, 'controller'); + try { + const releases = new LocalReleases({ directory: rootFor(paths), devDspId: configuration.devDspId, hooks: inert }); + return await releases.locked(state => { + if (state.operation || state.active.core) throw new Error('release_baseline_already_registered'); + const core = state.releases.core[coreDigest]; + if (!core) throw new Error('release_unavailable'); + const manifest = verifyRelease(core.directory, coreDigest); verifyLive(paths, manifest); + if (manifest.channel !== 'release' || !fs.existsSync(path.join(paths.live, 'bin/dispatch-updates'))) throw new Error('release_worker_code_missing'); + const dsps = {}; + for (const dsp of new DirectoryJournal(paths).all().filter(item => item.desiredState !== 'retired')) { + const receipt = privateJson(fileFor(paths, dsp.id), process.geteuid(), true); + const release = receipt && state.releases.dsp[receipt.digest]; + if (!release || runtimeSource(paths, dsp.id) === paths.live || release.protocol !== core.protocol) throw new Error('release_dsp_baseline_required'); + dsps[dsp.id] = release.digest; + } + if (!dsps[configuration.devDspId]) throw new Error('release_dev_unavailable'); + const defaults = [...new Set(Object.values(dsps))]; + if (defaults.length !== 1) throw new Error('release_baseline_mixed'); + state.active = { core: coreDigest, dsps }; state.defaultDsp = defaults[0]; state.tested = null; + releases.save(state); atomic(receiptFile(paths), { digest: coreDigest, version: core.version }); + return { registered: true, activation: false, coreVersion: core.version, dspCount: Object.keys(dsps).length }; + }); + } finally { fs.closeSync(controller); } +} +function workerUnit({ paths, node, uid, gid }) { + const sourceDigest = hash(JSON.stringify(inventory(paths.live))); + const parent = privateDirectory(path.join(paths.local, 'tools/update-worker')); + const source = path.join(parent, sourceDigest); + if (!fs.existsSync(source)) secureCopy(paths.live, source); + if (hash(JSON.stringify(inventory(source))) !== sourceDigest) throw new Error('release_worker_source_changed'); + const config = path.join(paths.local, 'config/platform.json'); + for (const value of [source, node, config]) if (!/^\/[A-Za-z0-9_./-]+$/.test(value)) throw new Error('release_unit_invalid'); + return `[Unit]\nDescription=Dispatch independent update worker\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=exec\nUser=${uid}\nGroup=${gid}\nUMask=0077\nWorkingDirectory=${source}\nEnvironment=DISPATCH_PLATFORM_CONFIG=${config}\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\nExecStart=${node} --no-warnings ${source}/bin/dispatch-updates worker\nRestart=always\nRestartSec=5\nTimeoutStopSec=1800\nKillMode=mixed\n\n[Install]\nWantedBy=multi-user.target\n`; +} +// The updater must be able to recover the brief gap between the two directory +// renames, when ordinary platformPaths correctly refuses a missing live tree. +function loadWorkerPaths(file = process.env.DISPATCH_PLATFORM_CONFIG) { + if (!file || !path.isAbsolute(file)) throw new Error('release_configuration_required'); + const value = privateJson(file, process.geteuid()); + if (value?.version !== 1 || Object.keys(value).sort().join(',') !== 'platformRoot,version') throw new Error('release_configuration_invalid'); + const platformRoot = directory(value.platformRoot), paths = { platformRoot, live: path.join(platformRoot, 'live') }; + for (const name of ['local', 'dsps', 'dev', 'worktrees']) paths[name] = directory(path.join(platformRoot, name)); + if (file !== path.join(paths.local, 'config/platform.json') || fs.statSync(paths.local).mode & 0o077 || fs.statSync(paths.dsps).mode & 0o077) throw new Error('release_configuration_invalid'); + return paths; +} +function workerEntrypoint(paths, current) { + const state = privateJson(path.join(rootFor(paths), 'releases.json'), process.geteuid(), true); + const digest = state?.active.core; + if (!digest) return null; + if (!/^[a-f0-9]{64}$/.test(digest)) throw new Error('release_baseline_changed'); + const folder = path.join(rootFor(paths), 'packages/core', digest); + const manifest = verifyRelease(folder, digest); + const entry = path.join(folder, 'code/bin/dispatch-updates'); + if (manifest.channel !== 'release' || manifest.product !== 'core' || !fs.existsSync(entry)) throw new Error('release_worker_code_missing'); + return path.resolve(current) === entry ? null : entry; +} +module.exports = { configure, adopt, workerUnit, loadWorkerPaths, workerEntrypoint }; diff --git a/host/services/startup.js b/host/services/startup.js index cfbd5eb..6158793 100644 --- a/host/services/startup.js +++ b/host/services/startup.js @@ -57,6 +57,7 @@ async function prepareStartup(paths, { port, apiPort } = {}) { unitValue(path.join(source, 'bin/dispatch-dashboard')); const units = require('./api-units').renderApiUnits({ source, node, config, uid: process.geteuid(), gid: process.getegid(), port, apiPort, publicOrigin: settings?.publicOrigin ?? null }); + if (require('../../core/updates/configuration').loadConfiguration(paths)) units['dispatch-updates.service'] = require('../releases/setup').workerUnit({ paths, node, uid: process.geteuid(), gid: process.getegid() }); const root = privateDirectory(path.join(paths.local, 'systemd')); const unitFiles = Object.entries(units).map(([name, content]) => { const file = path.join(root, name); atomic(file, content); return file; diff --git a/tests/architecture/release-update.acceptance.js b/tests/architecture/release-update.acceptance.js new file mode 100644 index 0000000..b7e9b38 --- /dev/null +++ b/tests/architecture/release-update.acceptance.js @@ -0,0 +1,177 @@ +'use strict'; +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const paycomVersion = require('../fixtures/paycom-plugin.json').version; +const crypto = require('node:crypto'); +const { platformPaths } = require('../../shared/paths/platform-paths'); +const { privateDirectory, privileged, withLock } = require('../../host/controller/operations'); +const { atomic } = require('../../core/installations/src/release-delivery-files'); +const { AccessStore, AccessControlService } = require('../../core/accounts/src'); +const { DirectoryJournal } = require('../../host/controller/journal'); +const { directoryAccessAuthority } = require('../../host/controller/access-authority'); +const { ensureDsp } = require('../../host/storage/storage'); +const { openDirectoryRuntime } = require('../../host/controller/runtime'); +const { DirectoryExecution } = require('../../host/controller/execution'); +const { createDirectoryInstallation } = require('../../host/plugins/directory-lifecycle'); +const { createPluginService } = require('../../core/accounts/src/plugins'); +const { loadInstallation } = require('../../host/services/installation'); +const { ensurePluginBackend, unitFor } = require('../../host/services/plugin-backend'); + +test('independent DSP updates switch a real runtime and restore its private state after failed health', { timeout: 180000 }, async t => { + if (!process.env.DISPATCH_WORKER_TEST_TOOLS || !process.env.DISPATCH_WORKER_TEST_BROWSER) throw new Error('explicit_test_tools_required'); + if (!process.env.DISPATCH_UPDATE_TEST_CORE || !process.env.DISPATCH_UPDATE_TEST_DSP) throw new Error('explicit_release_fixtures_required'); + const { LocalReleases } = require('../../core/updates/local-releases'); + const { dspHooks } = require('../../host/releases/dsp'); + const { hash, inventory, secureCopy, verifyRelease } = require('../../shared/releases/package'); + const { prepareDspRelease, selectDspRelease, fileFor } = require('../../host/releases/runtime'); + const beforeUmask = process.umask(0o077); + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'dpd-')); + for (const name of ['live', 'local', 'dsps', 'dev', 'worktrees']) privateDirectory(path.join(root, name)); + const paths = platformPaths(root); + let runtime, store, id, execution; + t.after(async () => { + if (id) await privileged(['/usr/bin/systemctl', 'stop', `dispatch-directory-${id.slice(4)}.service`]).catch(() => {}); + await execution?.close(); + await runtime?.close(); + await privileged(['/usr/bin/systemctl', 'stop', unitFor(paths)]).catch(() => {}); + store?.close(); + await privileged(['/usr/bin/rm', '-rf', '--', root]); + process.umask(beforeUmask); + }); + const corePackage = process.env.DISPATCH_UPDATE_TEST_CORE, dspPackage = path.join(paths.dev, 'sealed-dsp-release'); + secureCopy(process.env.DISPATCH_UPDATE_TEST_DSP, dspPackage); + const coreManifest = JSON.parse(fs.readFileSync(path.join(corePackage, 'release.json'))); + const dspManifest = JSON.parse(fs.readFileSync(path.join(dspPackage, 'release.json'))); + const coreDigest = hash(JSON.stringify(coreManifest)), dspDigest = hash(JSON.stringify(dspManifest)); + verifyRelease(corePackage, coreDigest); verifyRelease(dspPackage, dspDigest); + fs.rmdirSync(paths.live); secureCopy(path.join(corePackage, 'code'), paths.live); + const nodeRoot = privateDirectory(path.join(paths.local, 'tools/directory-runtime')); + for (const name of ['node', 'tini']) { + fs.copyFileSync(path.join(process.env.DISPATCH_WORKER_TEST_TOOLS, name), path.join(nodeRoot, name)); + fs.chmodSync(path.join(nodeRoot, name), 0o755); + } + const browserParent = privateDirectory(path.join(paths.local, 'tools/directory-browser')); + await privileged(['/usr/bin/cp', '-a', '--', process.env.DISPATCH_WORKER_TEST_BROWSER, browserParent]); + const browserRoot = path.join(browserParent, path.basename(process.env.DISPATCH_WORKER_TEST_BROWSER)); + privateDirectory(path.join(paths.local, 'config')); + atomic(path.join(paths.local, 'config/directory-service.json'), { nodeRoot, browserRoot }); + atomic(path.join(paths.local, 'config/directory-network.json'), { version: 1, hosts: [] }); + const databaseRoot = privateDirectory(path.join(paths.local, 'state/access-control')); + store = new AccessStore({ databaseRoot, database: path.join(databaseRoot, 'access-control.sqlite3') }); + const access = new AccessControlService(store, { installationBackend: 'directory_service_v1', installationOperatorEnabled: true }); + const password = 'synthetic daemon fixture password'; + const bootstrap = access.createPlatformBootstrap({ email: 'platform@example.test' }); + const platform = await access.acceptNewUser({ token: bootstrap.token, firstName: 'Platform', lastName: 'Fixture', password, confirmPassword: password }); + const created = access.createOrganization(platform.session, { idempotencyKey: 'daemon:fixture:create', name: 'Synthetic daemon DSP', + abbreviation: 'SYN', stationCode: 'TST1', timezone: 'America/Chicago', ownerEmail: 'owner@example.test' }); + const owner = await access.acceptNewUser({ token: created.token, firstName: 'DSP', lastName: 'Fixture', password, confirmPassword: password }); + const org = created.organization.id; + store.db.prepare("UPDATE installations SET status='ready' WHERE organization_id=?").run(org); + store.updateOrganizationStatus(org, 'active', Date.now()); + id = store.installation(org).runtimeKey; + const creationId = 'create_' + crypto.randomBytes(16).toString('hex'), dsp = ensureDsp(paths, id, creationId); + // This fixture represents retained directory storage; volume creation has its own real mount acceptance. + atomic(path.join(dsp.root, 'config/installation.json'), { version: 1, organizationId: org, runtimeKey: id }); + const journal = new DirectoryJournal(paths); + journal.saveRecord({ version: 1, id, creationId, latestRequest: crypto.randomBytes(32).toString('hex'), desiredState: 'running', tokenHash: null }); + const authority = directoryAccessAuthority({ paths, store, journal }); + const built = { digest: dspManifest.plugins[0].digest }; + await require('../../host/plugins/distribution').distributePackage(paths, { directory: path.join(dspPackage, 'plugins/paycom'), digest: built.digest }); + await require('../../host/plugins/distribution').approvePackages(paths, { runtimeKey: id, packages: dspManifest.plugins }); + const definitions = () => require('../../core/plugins/package-catalog').packageCatalog(paths).definitions(); + require('../../shared/plugin-sdk/catalog').configureCatalog(definitions); + require('dispatch-protocol/plugin-sdk/catalog').configureCatalog(definitions); + prepareDspRelease(paths, id, dspPackage, dspDigest); selectDspRelease(paths, id, dspDigest, null); + const installation = loadInstallation(paths); + const open = () => openDirectoryRuntime({ paths, installation, journal, authorityCatalog: authority.authorityCatalog, + publishAuthority: authority.publishAuthority, networkPermitted: () => false, select: () => false }); + try { + runtime = await open(); + await withLock(paths, fd => runtime.manager.host.prepare(id, fd)); + execution = new DirectoryExecution({ paths, accessStore: store, manager: runtime.manager, hub: runtime.hub }); + const coordinator = createDirectoryInstallation({ paths, manager: runtime.manager, execution, store }); + const plugins = createPluginService({ store, access, installationCoordinator: { ...coordinator, async apply(input) { try { return await coordinator.apply(input); } catch (error) { process.stderr.write('Fixture plugin activation: ' + error.stack + '\n'); throw error; } } }, + invoke: (runtimeKey, action, input) => execution.invoke(runtimeKey, action, input) }); + const session = access.session(owner.token); + plugins.change(session, 'paycom', { action: 'install', expectedRevision: 0, idempotencyKey: 'daemon:fixture:install' }); + await plugins.runPending(); + assert.equal(plugins.list(session).items[0].available, true, JSON.stringify(plugins.list(session).items.map(item => ({ id: item.id, state: item.state, failureCode: item.failureCode })))); + assert.equal(runtime.hub.connected(id), true, 'Install resumes an always-on DSP after acknowledging the package'); + const result = await runtime.hub.invoke(id, 'plugins.invoke', { pluginId: 'paycom', action: 'sync.status', input: { id: 'paycom-main-workforce' } }); + assert.equal(result.ok, true, JSON.stringify(result)); + const connections = await runtime.hub.invoke(id, 'connections.manage', { command: 'list' }); + assert.equal(connections.ok, true, JSON.stringify(connections)); + await execution.close(); + execution = new DirectoryExecution({ paths, accessStore: store, manager: runtime.manager, hub: runtime.hub, + configuration: { version: 1, enabled: true } }); + execution.wake = () => {}; + await execution.enroll(id); + const sleep = async () => { + const operation = 'sleep_' + crypto.randomBytes(16).toString('hex'); + await runtime.manager.apply('stop', operation, id); + execution.store.update(id, { state: 'sleeping', operation_id: operation, snapshot_ready: 1 }, Date.now()); + }; + const hooks = dspHooks({ paths, store, manager: runtime.manager, execution }); + for (const name of ['start', 'restore']) { + const original = hooks[name]; + hooks[name] = async context => { try { return await original(context); } catch (error) { + process.stderr.write(`Fixture ${name}: ${error.stack}\n`); throw error; + } }; + } + const updates = new LocalReleases({ directory: path.join(paths.local, 'state/updates'), devDspId: id, hooks, allowDevelopment: true }); + await updates.stage(corePackage, coreDigest); await updates.stage(dspPackage, dspDigest); + const baseline = updates.state(); baseline.active = { core: coreDigest, dsps: { [id]: dspDigest } }; baseline.defaultDsp = dspDigest; updates.save(baseline); + atomic(path.join(paths.local, 'config/updates.json'), { schemaVersion: 1, devDspId: id, apiPort: 4999 }); + const nextPackage = path.join(paths.dev, 'next-release'); secureCopy(dspPackage, nextPackage); + const nextManifest = { ...dspManifest, version: '0.0.2', channel: 'development' }; + fs.chmodSync(path.join(nextPackage, 'release.json'), 0o600); + fs.unlinkSync(path.join(nextPackage, 'release.json')); + nextManifest.files = inventory(nextPackage); + fs.writeFileSync(path.join(nextPackage, 'release.json'), JSON.stringify(nextManifest), { mode: 0o600 }); + const nextDigest = hash(JSON.stringify(nextManifest)); + await updates.stage(nextPackage, nextDigest); + await sleep(); + await updates.updateDev(nextDigest); + assert.equal(updates.state().tested, nextDigest); + await execution.runPending(); + assert.equal(execution.store.get(id).state, 'running'); + assert.equal(execution.store.get(id).failure_code, null); + assert.equal(JSON.parse(fs.readFileSync(fileFor(paths, id))).digest, nextDigest); + assert.equal(runtime.hub.connected(id), true); + assert.equal((await runtime.hub.invoke(id, 'health', {})).ok, true); + const privateFile = path.join(dsp.root, 'data/release-sentinel'); fs.writeFileSync(privateFile, 'before failed migration', { mode: 0o600 }); + const failedPackage = path.join(paths.dev, 'failed-release'); secureCopy(nextPackage, failedPackage); + const failedManifest = { ...nextManifest, version: '0.0.3' }; + fs.chmodSync(path.join(failedPackage, 'release.json'), 0o600); + fs.writeFileSync(path.join(failedPackage, 'release.json'), JSON.stringify(failedManifest)); + const failedDigest = hash(JSON.stringify(failedManifest)); await updates.stage(failedPackage, failedDigest); + await sleep(); + const originalStart = hooks.start, originalVerify = hooks.verify; + hooks.start = async context => { await originalStart(context); fs.writeFileSync(privateFile, 'failed migration', { mode: 0o600 }); }; + hooks.verify = async context => context.digest !== failedDigest && originalVerify(context); + await assert.rejects(updates.updateDev(failedDigest), /release_health_failed/); + assert.equal(fs.readFileSync(privateFile, 'utf8'), 'before failed migration'); + assert.equal(JSON.parse(fs.readFileSync(fileFor(paths, id))).digest, nextDigest); + assert.equal(runtime.manager.journal.record(id).desiredState, 'stopped'); + assert.equal(execution.store.get(id).state, 'sleeping'); + assert.equal(updates.state().operation, null); + await runtime.manager.apply('stop', 'daemon_fixture_stop', id); + const before = await privileged(['/usr/bin/systemctl', 'show', unitFor(paths), '-p', 'MainPID']); + await runtime.close(); runtime = await open(); + assert.equal(await privileged(['/usr/bin/systemctl', 'show', unitFor(paths), '-p', 'MainPID']), before); + assert.equal((await runtime.manager.pluginBackend.request(id, 'auth.request', { action: 'health' })).ok, true); + await runtime.close(); runtime = null; + await privileged(['/usr/bin/systemctl', 'stop', unitFor(paths)]); + const restarted = await ensurePluginBackend(paths, installation); + assert.equal((await restarted.request(id, 'auth.request', { action: 'health' })).ok, true); + assert.equal(fs.existsSync(path.join(dsp.root, 'plugins/paycom/versions', paycomVersion, 'backend/runtime.js')), true); + assert.equal(fs.existsSync(path.join(paths.local, 'data/auth-broker/credentials.sqlite3')), false); + } catch (error) { + if (error.cause) process.stderr.write(String(error.cause.stack) + '\n'); + process.stderr.write(await privileged(['/usr/bin/journalctl', '--no-pager', '-n', '60', '-u', unitFor(paths), '-u', `dispatch-directory-${id.slice(4)}.service`])); + throw error; + } +}); diff --git a/tooling/tests.json b/tooling/tests.json index f783b78..d2c23cf 100644 --- a/tooling/tests.json +++ b/tooling/tests.json @@ -14,7 +14,8 @@ "host/plugins/tests/lifecycle.test.js", "host/plugins/tests/sdk-socket.test.js", "host/plugins/tests/worker-layout.test.js", - "core/accounts/tests/plugins.test.js" + "core/accounts/tests/plugins.test.js", + "core/agents/tests/execution.test.js" ], "integration": [ "core/plugins/tests/manual-auth-retry.test.js",