@testspectra/cli 1.1.7 → 1.1.8-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/demo-app/assets/index-BhlW-eXG.css +1 -0
- package/demo-app/assets/index-DOtRypCa.js +154 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/__tests__/run-e2e.test.js +254 -13
- package/dist/commands/__tests__/run.test.js +92 -16
- package/dist/commands/add.js +2 -1
- package/dist/commands/demo.js +17 -7
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +8 -2
- package/dist/commands/lint.d.ts +5 -0
- package/dist/commands/lint.js +55 -0
- package/dist/commands/refactor.d.ts +2 -1
- package/dist/commands/refactor.js +129 -35
- package/dist/commands/run.d.ts +2 -3
- package/dist/commands/run.js +93 -28
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.js +28 -0
- package/dist/commands/sync-types.js +1 -0
- package/dist/commands/test.d.ts +17 -0
- package/dist/commands/test.js +104 -0
- package/dist/commands/watch.js +9 -3
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +5 -114
- package/dist/config/schema.js +1 -17
- package/dist/generator/__tests__/tsconfig-isolation.test.js +6 -2
- package/dist/generator/__tests__/type-generator.test.js +39 -1
- package/dist/generator/tsconfig-generator.js +44 -16
- package/dist/generator/type-generator.d.ts +29 -3
- package/dist/generator/type-generator.js +115 -22
- package/dist/index.d.ts +1 -1
- package/dist/index.js +65 -29
- package/dist/linter/__tests__/anonymous-export.test.js +184 -0
- package/dist/linter/__tests__/component-test-imports.test.d.ts +1 -0
- package/dist/linter/__tests__/component-test-imports.test.js +115 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.d.ts +1 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.js +270 -0
- package/dist/linter/__tests__/spec-schema.test.d.ts +1 -0
- package/dist/linter/__tests__/spec-schema.test.js +369 -0
- package/dist/linter/__tests__/step-parity.test.d.ts +1 -0
- package/dist/linter/__tests__/step-parity.test.js +372 -0
- package/dist/linter/discovery.d.ts +30 -0
- package/dist/linter/discovery.js +249 -0
- package/dist/linter/extractor.d.ts +67 -0
- package/dist/linter/extractor.js +245 -0
- package/dist/linter/index.d.ts +7 -0
- package/dist/linter/index.js +7 -0
- package/dist/linter/parser.d.ts +24 -0
- package/dist/linter/parser.js +219 -0
- package/dist/linter/schemas/spec.schema.d.ts +83 -0
- package/dist/linter/schemas/spec.schema.js +150 -0
- package/dist/linter/schemas/suite.schema.d.ts +59 -0
- package/dist/linter/schemas/suite.schema.js +83 -0
- package/dist/linter/spec-linter.d.ts +23 -0
- package/dist/linter/spec-linter.js +630 -0
- package/dist/linter/types.d.ts +28 -0
- package/dist/linter/types.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +698 -0
- package/dist/refactor/refactor-engine.d.ts +25 -0
- package/dist/refactor/refactor-engine.js +374 -42
- package/dist/reporter/semantic-formatter.js +22 -2
- package/dist/reporter/types.d.ts +1 -1
- package/dist/runner/bridge.d.ts +1 -1
- package/dist/runner/bridge.js +85 -24
- package/dist/runner/reporter.d.ts +2 -0
- package/dist/runner/reporter.js +11 -3
- package/dist/utils/__tests__/api-server.test.d.ts +1 -0
- package/dist/utils/__tests__/api-server.test.js +62 -0
- package/dist/utils/__tests__/demo-server.test.d.ts +1 -0
- package/dist/utils/__tests__/demo-server.test.js +35 -0
- package/dist/utils/api-server.d.ts +19 -0
- package/dist/utils/api-server.js +179 -0
- package/dist/utils/demo-server.d.ts +5 -0
- package/dist/utils/demo-server.js +8 -1
- package/package.json +13 -4
- package/templates/default/CLAUDE.md +5 -0
- package/templates/default/package.json +3 -3
- package/templates/default/page-objects/AuthPage/mobile.ts +5 -0
- package/templates/default/page-objects/AuthPage/web.ts +10 -0
- package/templates/default/page-objects/MatchersPage/mobile.ts +26 -2
- package/templates/default/page-objects/MatchersPage/web.ts +8 -2
- package/templates/default/page-objects/NavigationPage/mobile.ts +1 -1
- package/templates/default/page-objects/NavigationPage/web.ts +1 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +12 -6
- package/templates/default/page-objects/PlaygroundPage/web.ts +2 -2
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +45 -3
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +7 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +8 -4
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +13 -2
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +7 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +6 -4
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +30 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -0
- package/templates/default/specs/ApiInterception/suite.md +1 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -0
- package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -0
- package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -0
- package/templates/default/specs/ApiSeeding/suite.md +9 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/mobile.test.ts +7 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/spec.md +19 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/web.test.ts +9 -0
- package/templates/default/specs/Authentication/suite.md +9 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +1 -1
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +5 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +1 -1
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/mobile.test.ts +17 -0
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/spec.md +28 -0
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/web.test.ts +26 -0
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/common.test.ts +26 -0
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +7 -0
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +1 -1
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +5 -0
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +1 -1
- package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/common.test.ts +14 -0
- package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/spec.md +21 -0
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -0
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -0
- package/templates/default/specs/DeepLink/suite.md +9 -0
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +1 -1
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +5 -0
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +1 -1
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +1 -1
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +7 -0
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +1 -1
- package/templates/default/specs/ElementMatchers/suite.md +2 -1
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -0
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -0
- package/templates/default/specs/EnvironmentConfig/suite.md +9 -0
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -0
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -0
- package/templates/default/specs/PermissionRationale/suite.md +9 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +1 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +1 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +1 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +1 -1
- package/templates/default/spectra.config.ts +1 -17
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +3 -3
- package/templates/default/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/default/support/actions/seedSession/mobile.action.ts +9 -0
- package/templates/default/support/actions/seedSession/web.action.ts +13 -0
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +1 -1
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +1 -1
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +1 -1
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +1 -1
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-shm +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-wal +0 -0
- package/templates/nx/.nx/workspace-data/d/daemon.log +5803 -168
- package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
- package/templates/nx/.nx/workspace-data/file-map.json +464 -0
- package/templates/nx/.nx/workspace-data/lockfile.hash +1 -0
- package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
- package/templates/nx/.nx/workspace-data/parsed-lock-file.json +13485 -0
- package/templates/nx/.nx/workspace-data/project-graph.json +14388 -0
- package/templates/nx/package.json +3 -3
- package/templates/nx/packages/matchers/e2e/project.json +2 -2
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +25 -1
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +2 -2
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +22 -1
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +2 -2
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -0
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -0
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/suite.md +9 -0
- package/templates/nx/packages/playground/e2e/project.json +2 -2
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +1 -1
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +83 -29
- package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +2 -2
- package/templates/nx/shared/testing/project.json +1 -2
- package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +1 -1
- package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +1 -1
- package/templates/nx/spectra.config.ts +1 -17
- package/templates/react-component/.cursorrules +17 -0
- package/templates/react-component/.vscode/extensions.json +5 -0
- package/templates/react-component/CLAUDE.md +14 -0
- package/templates/react-component/README.md +69 -0
- package/templates/react-component/fixtures/component-mock.json +12 -0
- package/templates/react-component/global-hooks/after/web.hook.ts +3 -0
- package/templates/react-component/global-hooks/before/web.hook.ts +3 -0
- package/templates/react-component/package.json +27 -0
- package/templates/react-component/page-objects/BadgeComponent/web.ts +23 -0
- package/templates/react-component/page-objects/ButtonComponent/web.ts +23 -0
- package/templates/react-component/page-objects/InputComponent/web.ts +13 -0
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/web.test.tsx +11 -0
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/web.test.tsx +10 -0
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/web.test.tsx +16 -0
- package/templates/react-component/specs/BadgeComponent/suite.md +12 -0
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/spec.md +19 -0
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/web.test.tsx +28 -0
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/spec.md +19 -0
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/web.test.tsx +22 -0
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/spec.md +18 -0
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/web.test.tsx +8 -0
- package/templates/react-component/specs/ButtonComponent/suite.md +12 -0
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/spec.md +20 -0
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/web.test.tsx +28 -0
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/spec.md +18 -0
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/web.test.tsx +9 -0
- package/templates/react-component/specs/InputComponent/suite.md +12 -0
- package/templates/react-component/spectra.config.ts +27 -0
- package/templates/react-component/src/components/Badge/Badge.tsx +60 -0
- package/templates/react-component/src/components/Button/Button.tsx +57 -0
- package/templates/react-component/src/components/Input/Input.tsx +41 -0
- package/templates/react-component/src/test-utils.tsx +23 -0
- package/templates/react-component/support/actions/fillInputField/web.action.ts +9 -0
- package/templates/react-component/support/steps/verifyButtonState/web.step.ts +12 -0
- package/templates/react-component/tsconfig.json +8 -0
- package/bin/.testspectra-runner.hash +0 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-DPfv5_EF.js +0 -116
- package/demo-app/assets/index-gIwu2EMV.css +0 -1
- package/dist/commands/__tests__/cloud-run.test.js +0 -93
- package/dist/commands/cloud-run.d.ts +0 -13
- package/dist/commands/cloud-run.js +0 -120
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -17
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -17
- /package/dist/{commands/__tests__/cloud-run.test.d.ts → linter/__tests__/anonymous-export.test.d.ts} +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface TestProviderProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Common test provider wrapper for components (theme, context, locale). Compose it directly in
|
|
9
|
+
* the test file around whatever you pass to `Spectra.mount()` — see
|
|
10
|
+
* docs/v2/features/component-testing/react/mount-convention.md §8.
|
|
11
|
+
*/
|
|
12
|
+
export function TestProvider({ children }: TestProviderProps) {
|
|
13
|
+
return (
|
|
14
|
+
<div className="testspectra-test-root" style={{ padding: '16px', fontFamily: 'system-ui, sans-serif' }}>
|
|
15
|
+
{children}
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Convenience wrapper for `Spectra.mount(withProviders(<Component />))`. */
|
|
21
|
+
export function withProviders(children: ReactElement): ReactElement {
|
|
22
|
+
return <TestProvider>{children}</TestProvider>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable step to verify button presence and enabled/disabled state.
|
|
3
|
+
*/
|
|
4
|
+
export default async function (label: string, isEnabled = true) {
|
|
5
|
+
const btn = Spectra.get(`button*=${label}`);
|
|
6
|
+
await btn.shouldBeVisible();
|
|
7
|
+
if (isEnabled) {
|
|
8
|
+
await btn.shouldBeEnabled();
|
|
9
|
+
} else {
|
|
10
|
+
await btn.shouldBeDisabled();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0c453049994f6a1e36715e78b8ad5a6d464fe0659bde15ac50f97f787348b014
|
package/bin/testspectra-runner
DELETED
|
Binary file
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
var Sn=Object.defineProperty;var Qr=e=>{throw TypeError(e)};var Tn=(e,t,s)=>t in e?Sn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Ee=(e,t,s)=>Tn(e,typeof t!="symbol"?t+"":t,s),pr=(e,t,s)=>t.has(e)||Qr("Cannot "+s);var c=(e,t,s)=>(pr(e,t,"read from private field"),s?s.call(e):t.get(e)),M=(e,t,s)=>t.has(e)?Qr("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),C=(e,t,s,r)=>(pr(e,t,"write to private field"),r?r.call(e,s):t.set(e,s),s),V=(e,t,s)=>(pr(e,t,"access private method"),s);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const n of a)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function s(a){const n={};return a.integrity&&(n.integrity=a.integrity),a.referrerPolicy&&(n.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?n.credentials="include":a.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(a){if(a.ep)return;a.ep=!0;const n=s(a);fetch(a.href,n)}})();const fa=!1;var Br=Array.isArray,En=Array.prototype.indexOf,Ys=Array.prototype.includes,or=Array.from,An=Object.defineProperty,ks=Object.getOwnPropertyDescriptor,Cn=Object.getOwnPropertyDescriptors,Pn=Object.prototype,Mn=Array.prototype,va=Object.getPrototypeOf,Zr=Object.isExtensible;const pa=()=>{};function In(e){for(var t=0;t<e.length;t++)e[t]()}function ha(){var e,t,s=new Promise((r,a)=>{e=r,t=a});return{promise:s,resolve:e,reject:t}}function Ln(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const s=[];for(const r of e)if(s.push(r),s.length===t)break;return s}const ce=2,os=4,ir=8,ma=1<<24,Ye=16,Ze=32,Ct=64,_r=128,je=512,te=1024,oe=2048,it=4096,be=8192,Ve=16384,us=32768,Xr=1<<25,qt=65536,Qs=1<<17,On=1<<18,fs=1<<19,Nn=1<<20,nt=1<<25,Wt=65536,Zs=1<<21,Zt=1<<22,Et=1<<23,Ss=Symbol("$state"),Bn=Symbol(""),qs=Symbol("attributes"),yr=Symbol("class"),Dn=Symbol("style"),ms=Symbol("text"),Ws=Symbol("form reset"),lr=new class extends Error{constructor(){super(...arguments);Ee(this,"name","StaleReactionError");Ee(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Hn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Rn(e,t,s){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Fn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function jn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Vn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function zn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function qn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Wn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Un(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Gn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const $n=1,Jn=2,ba=4,Kn=8,Yn=16,Qn=1,Zn=2,ee=Symbol("uninitialized"),Xn="http://www.w3.org/1999/xhtml";function eo(){console.warn("https://svelte.dev/e/derived_inert")}function to(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function so(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function xa(e){return e===this.v}function ro(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function ga(e){return!ro(e,this.v)}let dr=!1,ao=!1;function no(){dr=!0}let se=null;function is(e){se=e}function qe(e,t=!1,s){se={p:se,i:!1,c:null,e:null,s:e,x:null,r:D,l:dr&&!t?{s:null,u:null,$:[]}:null}}function We(e){var t=se,s=t.e;if(s!==null){t.e=null;for(var r of s)ja(r)}return t.i=!0,se=t.p,{}}function Ds(){return!dr||se!==null&&se.l===null}let It=[];function _a(){var e=It;It=[],In(e)}function At(e){if(It.length===0&&!Es){var t=It;queueMicrotask(()=>{t===It&&_a()})}It.push(e)}function oo(){for(;It.length>0;)_a()}function ya(e){var t=D;if(t===null)return N.f|=Et,e;if(!(t.f&us)&&!(t.f&os))throw e;St(e,t)}function St(e,t){if(!(t!==null&&t.f&Ve)){for(;t!==null;){if(t.f&_r){if(!(t.f&us))throw e;try{t.b.error(e);return}catch(s){e=s}}t=t.parent}throw e}}const io=-7169;function Z(e,t){e.f=e.f&io|t}function Dr(e){e.f&je||e.deps===null?Z(e,te):Z(e,it)}function wa(e){if(e!==null)for(const t of e)!(t.f&ce)||!(t.f&Wt)||(t.f^=Wt,wa(t.deps))}function ka(e,t,s){e.f&oe?t.add(e):e.f&it&&s.add(e),wa(e.deps),Z(e,te)}function lo(e){let t=0,s=Gt(0),r;return()=>{Vr()&&(h(s),Va(()=>(t===0&&(r=Xa(()=>e(()=>As(s)))),t+=1,()=>{At(()=>{t-=1,t===0&&(r==null||r(),r=void 0,As(s))})})))}}var co=qt|fs;function uo(e,t,s,r){new fo(e,t,s,r)}var De,Nr,He,Bt,ye,Re,me,Ce,ft,Dt,wt,Xt,Is,Ls,vt,rr,Y,vo,po,ho,wr,Us,Gs,kr,Sr;class fo{constructor(t,s,r,a){M(this,Y);Ee(this,"parent");Ee(this,"is_pending",!1);Ee(this,"transform_error");M(this,De);M(this,Nr,null);M(this,He);M(this,Bt);M(this,ye);M(this,Re,null);M(this,me,null);M(this,Ce,null);M(this,ft,null);M(this,Dt,0);M(this,wt,0);M(this,Xt,!1);M(this,Is,new Set);M(this,Ls,new Set);M(this,vt,null);M(this,rr,lo(()=>(C(this,vt,Gt(c(this,Dt))),()=>{C(this,vt,null)})));var n;C(this,De,t),C(this,He,s),C(this,Bt,o=>{var l=D;l.b=this,l.f|=_r,r(o)}),this.parent=D.b,this.transform_error=a??((n=this.parent)==null?void 0:n.transform_error)??(o=>o),C(this,ye,ur(()=>{V(this,Y,wr).call(this)},co))}defer_effect(t){ka(t,c(this,Is),c(this,Ls))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!c(this,He).pending}update_pending_count(t,s){V(this,Y,kr).call(this,t,s),C(this,Dt,c(this,Dt)+t),!(!c(this,vt)||c(this,Xt))&&(C(this,Xt,!0),At(()=>{C(this,Xt,!1),c(this,vt)&&ds(c(this,vt),c(this,Dt))}))}get_effect_pending(){return c(this,rr).call(this),h(c(this,vt))}error(t){if(!c(this,He).onerror&&!c(this,He).failed)throw t;E!=null&&E.is_fork?(c(this,Re)&&E.skip_effect(c(this,Re)),c(this,me)&&E.skip_effect(c(this,me)),c(this,Ce)&&E.skip_effect(c(this,Ce)),E.oncommit(()=>{V(this,Y,Sr).call(this,t)})):V(this,Y,Sr).call(this,t)}}De=new WeakMap,Nr=new WeakMap,He=new WeakMap,Bt=new WeakMap,ye=new WeakMap,Re=new WeakMap,me=new WeakMap,Ce=new WeakMap,ft=new WeakMap,Dt=new WeakMap,wt=new WeakMap,Xt=new WeakMap,Is=new WeakMap,Ls=new WeakMap,vt=new WeakMap,rr=new WeakMap,Y=new WeakSet,vo=function(){try{C(this,Re,Fe(()=>c(this,Bt).call(this,c(this,De))))}catch(t){this.error(t)}},po=function(t){const s=c(this,He).failed;s&&C(this,Ce,Fe(()=>{s(c(this,De),()=>t,()=>()=>{})}))},ho=function(){const t=c(this,He).pending;t&&(this.is_pending=!0,C(this,me,Fe(()=>t(c(this,De)))),At(()=>{var s=C(this,ft,document.createDocumentFragment()),r=mt();s.append(r),C(this,Re,V(this,Y,Gs).call(this,()=>Fe(()=>c(this,Bt).call(this,r)))),c(this,wt)===0&&(c(this,De).before(s),C(this,ft,null),Vt(c(this,me),()=>{C(this,me,null)}),V(this,Y,Us).call(this,E))}))},wr=function(){try{if(this.is_pending=this.has_pending_snippet(),C(this,wt,0),C(this,Dt,0),C(this,Re,Fe(()=>{c(this,Bt).call(this,c(this,De))})),c(this,wt)>0){var t=C(this,ft,document.createDocumentFragment());Wr(c(this,Re),t);const s=c(this,He).pending;C(this,me,Fe(()=>s(c(this,De))))}else V(this,Y,Us).call(this,E)}catch(s){this.error(s)}},Us=function(t){this.is_pending=!1,t.transfer_effects(c(this,Is),c(this,Ls))},Gs=function(t){var s=D,r=N,a=se;lt(c(this,ye)),ze(c(this,ye)),is(c(this,ye).ctx);try{return Ut.ensure(),t()}catch(n){return ya(n),null}finally{lt(s),ze(r),is(a)}},kr=function(t,s){var r;if(!this.has_pending_snippet()){this.parent&&V(r=this.parent,Y,kr).call(r,t,s);return}C(this,wt,c(this,wt)+t),c(this,wt)===0&&(V(this,Y,Us).call(this,s),c(this,me)&&Vt(c(this,me),()=>{C(this,me,null)}),c(this,ft)&&(c(this,De).before(c(this,ft)),C(this,ft,null)))},Sr=function(t){c(this,Re)&&(Se(c(this,Re)),C(this,Re,null)),c(this,me)&&(Se(c(this,me)),C(this,me,null)),c(this,Ce)&&(Se(c(this,Ce)),C(this,Ce,null));var s=c(this,He).onerror;let r=c(this,He).failed;var a=!1,n=!1;const o=()=>{if(a){so();return}a=!0,n&&Gn(),c(this,Ce)!==null&&Vt(c(this,Ce),()=>{C(this,Ce,null)}),V(this,Y,Gs).call(this,()=>{V(this,Y,wr).call(this)})},l=i=>{try{n=!0,s==null||s(i,o),n=!1}catch(u){St(u,c(this,ye)&&c(this,ye).parent)}r&&C(this,Ce,V(this,Y,Gs).call(this,()=>{try{return Fe(()=>{var u=D;u.b=this,u.f|=_r,r(c(this,De),()=>i,()=>o)})}catch(u){return St(u,c(this,ye).parent),null}}))};At(()=>{var i;try{i=this.transform_error(t)}catch(u){St(u,c(this,ye)&&c(this,ye).parent);return}i!==null&&typeof i=="object"&&typeof i.then=="function"?i.then(l,u=>St(u,c(this,ye)&&c(this,ye).parent)):l(i)})};function mo(e,t,s,r){const a=Ds()?Hr:Ta;var n=e.filter(m=>!m.settled),o=t.map(a);if(s.length===0&&n.length===0){r(o);return}var l=D,i=bo(),u=n.length===1?n[0].promise:n.length>1?Promise.all(n.map(m=>m.promise)):null;function v(m){if(!(l.f&Ve)){i();try{r([...o,...m])}catch(x){St(x,l)}Xs()}}var g=Sa();if(s.length===0){u.then(()=>v([])).finally(g);return}function f(){Promise.all(s.map(m=>xo(m))).then(v).catch(m=>St(m,l)).finally(g)}u?u.then(()=>{i(),f(),Xs()}):f()}function bo(){var e=D,t=N,s=se,r=E;return function(n=!0){lt(e),ze(t),is(s),n&&!(e.f&Ve)&&(r==null||r.activate(),r==null||r.apply())}}function Xs(e=!0){lt(null),ze(null),is(null),e&&(E==null||E.deactivate())}function Sa(){var e=D,t=e.b,s=E,r=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,s),s.increment(r,e),()=>{t==null||t.update_pending_count(-1,s),s.decrement(r,e)}}function Hr(e){var t=ce|oe;return D!==null&&(D.f|=fs),{ctx:se,deps:null,effects:null,equals:xa,f:t,fn:e,reactions:null,rv:0,v:ee,wv:0,parent:D,ac:null}}const bs=Symbol("obsolete");function xo(e,t,s){let r=D;r===null&&Hn();var a=void 0,n=Gt(ee),o=!N,l=new Set;return Do(()=>{var m,x;var i=D,u=ha();a=u.promise;try{Promise.resolve(e()).then(u.resolve,_=>{_!==lr&&u.reject(_)}).finally(Xs)}catch(_){u.reject(_),Xs()}var v=E;if(o){if(i.f&us)var g=Sa();if((m=r.b)!=null&&m.is_rendered())(x=v.async_deriveds.get(i))==null||x.reject(bs);else for(const _ of l.values())_.reject(bs);l.add(u),v.async_deriveds.set(i,u)}const f=(_,b=void 0)=>{g==null||g(),l.delete(u),b!==bs&&(v.activate(),b?(n.f|=Et,ds(n,b)):(n.f&Et&&(n.f^=Et),ds(n,_)),v.deactivate())};u.promise.then(f,_=>f(null,_||"unknown"))}),zr(()=>{for(const i of l)i.reject(bs)}),new Promise(i=>{function u(v){function g(){v===a?i(n):u(a)}v.then(g,g)}u(a)})}function ls(e){const t=Hr(e);return Ga(t),t}function Ta(e){const t=Hr(e);return t.equals=ga,t}function go(e){var t=e.effects;if(t!==null){e.effects=null;for(var s=0;s<t.length;s+=1)Se(t[s])}}function Rr(e){var t,s=D,r=e.parent;if(!Pt&&r!==null&&e.v!==ee&&r.f&(Ve|be))return eo(),e.v;lt(r);try{e.f&=~Wt,go(e),t=Ya(e)}finally{lt(s)}return t}function Ea(e){var t=Rr(e);if(!e.equals(t)&&(e.wv=Ja(),(!(E!=null&&E.is_fork)||e.deps===null)&&(E!==null?(E.capture(e,t,!0),Ts==null||Ts.capture(e,t,!0)):e.v=t,e.deps===null))){Z(e,te);return}Pt||(de!==null?(Vr()||E!=null&&E.is_fork)&&de.set(e,t):Dr(e))}function _o(e){var t,s;if(e.effects!==null)for(const r of e.effects)(r.teardown||r.ac)&&((t=r.teardown)==null||t.call(r),(s=r.ac)==null||s.abort(lr),r.fn!==null&&(r.teardown=pa),r.ac=null,Ps(r,0),qr(r))}function Aa(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&cs(t)}let hr=null,Kt=null,E=null,Ts=null,de=null,Tr=null,Es=!1,mr=!1,Qt=null,$s=null;var ea=0;let yo=1;var es,kt,Ht,ts,ss,rs,pt,as,we,Os,ht,Je,rt,ns,Rt,q,Er,xs,Ar,Ca,Pa,Yt,wo,gs;const ar=class ar{constructor(){M(this,q);Ee(this,"id",yo++);M(this,es,!1);Ee(this,"linked",!0);M(this,kt,null);M(this,Ht,null);Ee(this,"async_deriveds",new Map);Ee(this,"current",new Map);Ee(this,"previous",new Map);M(this,ts,new Set);M(this,ss,new Set);M(this,rs,0);M(this,pt,new Map);M(this,as,null);M(this,we,[]);M(this,Os,[]);M(this,ht,new Set);M(this,Je,new Set);M(this,rt,new Map);M(this,ns,new Set);Ee(this,"is_fork",!1);M(this,Rt,!1);Kt===null?hr=Kt=this:(C(Kt,Ht,this),C(this,kt,Kt)),Kt=this}skip_effect(t){c(this,rt).has(t)||c(this,rt).set(t,{d:[],m:[]}),c(this,ns).delete(t)}unskip_effect(t,s=r=>this.schedule(r)){var r=c(this,rt).get(t);if(r){c(this,rt).delete(t);for(var a of r.d)Z(a,oe),s(a);for(a of r.m)Z(a,it),s(a)}c(this,ns).add(t)}capture(t,s,r=!1){t.v!==ee&&!this.previous.has(t)&&this.previous.set(t,t.v),t.f&Et||(this.current.set(t,[s,r]),de==null||de.set(t,s)),this.is_fork||(t.v=s)}activate(){E=this}deactivate(){E=null,de=null}flush(){try{mr=!0,E=this,V(this,q,xs).call(this)}finally{ea=0,Tr=null,Qt=null,$s=null,mr=!1,E=null,de=null,jt.clear()}}discard(){var t;for(const s of c(this,ss))s(this);c(this,ss).clear();for(const s of this.async_deriveds.values())s.reject(bs);V(this,q,gs).call(this),(t=c(this,as))==null||t.resolve()}register_created_effect(t){c(this,Os).push(t)}increment(t,s){if(C(this,rs,c(this,rs)+1),t){let r=c(this,pt).get(s)??0;c(this,pt).set(s,r+1)}}decrement(t,s){if(C(this,rs,c(this,rs)-1),t){let r=c(this,pt).get(s)??0;r===1?c(this,pt).delete(s):c(this,pt).set(s,r-1)}c(this,Rt)||(C(this,Rt,!0),At(()=>{C(this,Rt,!1),this.linked&&this.flush()}))}transfer_effects(t,s){for(const r of t)c(this,ht).add(r);for(const r of s)c(this,Je).add(r);t.clear(),s.clear()}oncommit(t){c(this,ts).add(t)}ondiscard(t){c(this,ss).add(t)}settled(){return(c(this,as)??C(this,as,ha())).promise}static ensure(){if(E===null){const t=E=new ar;!mr&&!Es&&At(()=>{c(t,es)||t.flush()})}return E}apply(){{de=null;return}}schedule(t){var a;if(Tr=t,(a=t.b)!=null&&a.is_pending&&t.f&(os|ir|ma)&&!(t.f&us)){t.b.defer_effect(t);return}for(var s=t;s.parent!==null;){s=s.parent;var r=s.f;if(Qt!==null&&s===D&&(N===null||!(N.f&ce)))return;if(r&(Ct|Ze)){if(!(r&te))return;s.f^=te}}c(this,we).push(s)}};es=new WeakMap,kt=new WeakMap,Ht=new WeakMap,ts=new WeakMap,ss=new WeakMap,rs=new WeakMap,pt=new WeakMap,as=new WeakMap,we=new WeakMap,Os=new WeakMap,ht=new WeakMap,Je=new WeakMap,rt=new WeakMap,ns=new WeakMap,Rt=new WeakMap,q=new WeakSet,Er=function(){if(this.is_fork)return!0;for(const r of c(this,pt).keys()){for(var t=r,s=!1;t.parent!==null;){if(c(this,rt).has(t)){s=!0;break}t=t.parent}if(!s)return!0}return!1},xs=function(){var i,u,v,g;C(this,es,!0),ea++>1e3&&(V(this,q,gs).call(this),So());for(const f of c(this,ht))c(this,Je).delete(f),Z(f,oe),this.schedule(f);for(const f of c(this,Je))Z(f,it),this.schedule(f);const t=c(this,we);C(this,we,[]),this.apply();var s=Qt=[],r=[],a=$s=[];for(const f of t)try{V(this,q,Ar).call(this,f,s,r)}catch(m){throw La(f),V(this,q,Er).call(this)||this.discard(),m}if(E=null,a.length>0){var n=ar.ensure();for(const f of a)n.schedule(f)}if(Qt=null,$s=null,V(this,q,Er).call(this)){V(this,q,Yt).call(this,r),V(this,q,Yt).call(this,s);for(const[f,m]of c(this,rt))Ia(f,m);a.length>0&&V(i=E,q,xs).call(i);return}const o=V(this,q,Ca).call(this);if(o){V(this,q,Yt).call(this,r),V(this,q,Yt).call(this,s),V(u=o,q,Pa).call(u,this);return}c(this,ht).clear(),c(this,Je).clear();for(const f of c(this,ts))f(this);c(this,ts).clear(),Ts=this,ta(r),ta(s),Ts=null,(v=c(this,as))==null||v.resolve();var l=E;if(c(this,rs)===0&&(c(this,we).length===0||l!==null)&&V(this,q,gs).call(this),c(this,we).length>0)if(l!==null){const f=l;c(f,we).push(...c(this,we).filter(m=>!c(f,we).includes(m)))}else l=this;l!==null&&V(g=l,q,xs).call(g)},Ar=function(t,s,r){t.f^=te;for(var a=t.first;a!==null;){var n=a.f,o=(n&(Ze|Ct))!==0,l=o&&(n&te)!==0,i=l||(n&be)!==0||c(this,rt).has(a);if(!i&&a.fn!==null){o?a.f^=te:n&os?s.push(a):Rs(a)&&(n&Ye&&c(this,Je).add(a),cs(a));var u=a.first;if(u!==null){a=u;continue}}for(;a!==null;){var v=a.next;if(v!==null){a=v;break}a=a.parent}}},Ca=function(){for(var t=c(this,kt);t!==null;){if(!t.is_fork){for(const[s,[,r]]of this.current)if(t.current.has(s)&&!r)return t}t=c(t,kt)}return null},Pa=function(t){var r;for(const[a,n]of t.current)!this.previous.has(a)&&t.previous.has(a)&&this.previous.set(a,t.previous.get(a)),this.current.set(a,n);for(const[a,n]of t.async_deriveds){const o=this.async_deriveds.get(a);o&&n.promise.then(o.resolve).catch(o.reject)}t.async_deriveds.clear(),this.transfer_effects(c(t,ht),c(t,Je));const s=a=>{var n=a.reactions;if(n!==null)for(const i of n){var o=i.f;if(o&ce)s(i);else{var l=i;o&(Zt|Ye)&&!this.async_deriveds.has(l)&&(c(this,Je).delete(l),Z(l,oe),this.schedule(l))}}};for(const a of this.current.keys())s(a);this.oncommit(()=>t.discard()),V(r=t,q,gs).call(r),E=this,V(this,q,xs).call(this)},Yt=function(t){for(var s=0;s<t.length;s+=1)ka(t[s],c(this,ht),c(this,Je))},wo=function(){var g;for(let f=hr;f!==null;f=c(f,Ht)){var t=f.id<this.id,s=[];for(const[m,[x,_]]of this.current){if(f.current.has(m)){var r=f.current.get(m)[0];if(t&&x!==r)f.current.set(m,[x,_]);else continue}s.push(m)}if(t)for(const[m,x]of this.async_deriveds){const _=f.async_deriveds.get(m);_&&x.promise.then(_.resolve).catch(_.reject)}var a=[...f.current.keys()].filter(m=>!f.current.get(m)[1]);if(!(!c(f,es)||a.length===0)){var n=a.filter(m=>!this.current.has(m));if(n.length===0)t&&f.discard();else if(s.length>0){if(t)for(const m of c(this,ns))f.unskip_effect(m,x=>{var _;x.f&(Ye|Zt)?f.schedule(x):V(_=f,q,Yt).call(_,[x])});f.activate();var o=new Set,l=new Map;for(var i of s)Ma(i,n,o,l);l=new Map;var u=[...f.current].filter(([m,x])=>{const _=this.current.get(m);return _?_[0]!==x[0]||_[1]!==x[1]:!0}).map(([m])=>m);if(u.length>0)for(const m of c(this,Os))!(m.f&(Ve|be|Qs))&&Fr(m,u,l)&&(m.f&(Zt|Ye)?(Z(m,oe),f.schedule(m)):c(f,ht).add(m));if(c(f,we).length>0&&!c(f,Rt)){f.apply();for(var v of c(f,we))V(g=f,q,Ar).call(g,v,[],[]);C(f,we,[])}f.deactivate()}}}},gs=function(){if(this.linked){var t=c(this,kt),s=c(this,Ht);t===null?hr=s:C(t,Ht,s),s===null?Kt=t:C(s,kt,t),this.linked=!1}};let Ut=ar;function ko(e){var t=Es;Es=!0;try{for(var s;;){if(oo(),E===null)return s;E.flush()}}finally{Es=t}}function So(){try{zn()}catch(e){St(e,Tr)}}let $e=null;function ta(e){var t=e.length;if(t!==0){for(var s=0;s<t;){var r=e[s++];if(!(r.f&(Ve|be))&&Rs(r)&&($e=new Set,cs(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&qa(r),($e==null?void 0:$e.size)>0)){jt.clear();for(const a of $e){if(a.f&(Ve|be))continue;const n=[a];let o=a.parent;for(;o!==null;)$e.has(o)&&($e.delete(o),n.push(o)),o=o.parent;for(let l=n.length-1;l>=0;l--){const i=n[l];i.f&(Ve|be)||cs(i)}}$e.clear()}}$e=null}}function Ma(e,t,s,r){if(!s.has(e)&&(s.add(e),e.reactions!==null))for(const a of e.reactions){const n=a.f;n&ce?Ma(a,t,s,r):n&(Zt|Ye)&&!(n&oe)&&Fr(a,t,r)&&(Z(a,oe),jr(a))}}function Fr(e,t,s){const r=s.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const a of e.deps){if(Ys.call(t,a))return!0;if(a.f&ce&&Fr(a,t,s))return s.set(a,!0),!0}return s.set(e,!1),!1}function jr(e){E.schedule(e)}function Ia(e,t){if(!(e.f&Ze&&e.f&te)){e.f&oe?t.d.push(e):e.f&it&&t.m.push(e),Z(e,te);for(var s=e.first;s!==null;)Ia(s,t),s=s.next}}function La(e){Z(e,te);for(var t=e.first;t!==null;)La(t),t=t.next}let er=new Set;const jt=new Map;let Oa=!1;function Gt(e,t){var s={f:0,v:e,reactions:null,equals:xa,rv:0,wv:0};return s}function L(e,t){const s=Gt(e);return Ga(s),s}function To(e,t=!1,s=!0){var a;const r=Gt(e);return t||(r.equals=ga),dr&&s&&se!==null&&se.l!==null&&((a=se.l).s??(a.s=[])).push(r),r}function y(e,t,s=!1){N!==null&&(!Qe||N.f&Qs)&&Ds()&&N.f&(ce|Ye|Zt|Qs)&&(ot===null||!ot.has(e))&&Un();let r=s?Lt(t):t;return ds(e,r,$s)}function ds(e,t,s=null){if(!e.equals(t)){jt.set(e,Pt?t:e.v);var r=Ut.ensure();if(r.capture(e,t),e.f&ce){const a=e;e.f&oe&&Rr(a),de===null&&Dr(a)}e.wv=Ja(),Na(e,oe,s),Ds()&&D!==null&&D.f&te&&!(D.f&(Ze|Ct))&&(Be===null?Fo([e]):Be.push(e)),!r.is_fork&&er.size>0&&!Oa&&Eo()}return t}function Eo(){Oa=!1;for(const e of er){e.f&te&&Z(e,it);let t;try{t=Rs(e)}catch{t=!0}t&&cs(e)}er.clear()}function As(e){y(e,e.v+1)}function Na(e,t,s){var r=e.reactions;if(r!==null)for(var a=Ds(),n=r.length,o=0;o<n;o++){var l=r[o],i=l.f;if(!(!a&&l===D)){var u=(i&oe)===0;if(u&&Z(l,t),i&Qs)er.add(l);else if(i&ce){var v=l;de==null||de.delete(v),i&Wt||(i&je&&(D===null||!(D.f&Zs))&&(l.f|=Wt),Na(v,it,s))}else if(u){var g=l;i&Ye&&$e!==null&&$e.add(g),s!==null?s.push(g):jr(g)}}}}function Lt(e){if(typeof e!="object"||e===null||Ss in e)return e;const t=va(e);if(t!==Pn&&t!==Mn)return e;var s=new Map,r=Br(e),a=L(0),n=zt,o=l=>{if(zt===n)return l();var i=N,u=zt;ze(null),oa(n);var v=l();return ze(i),oa(u),v};return r&&s.set("length",L(e.length)),new Proxy(e,{defineProperty(l,i,u){(!("value"in u)||u.configurable===!1||u.enumerable===!1||u.writable===!1)&&qn();var v=s.get(i);return v===void 0?o(()=>{var g=L(u.value);return s.set(i,g),g}):y(v,u.value,!0),!0},deleteProperty(l,i){var u=s.get(i);if(u===void 0){if(i in l){const v=o(()=>L(ee));s.set(i,v),As(a)}}else y(u,ee),As(a);return!0},get(l,i,u){var m;if(i===Ss)return e;var v=s.get(i),g=i in l;if(v===void 0&&(!g||(m=ks(l,i))!=null&&m.writable)&&(v=o(()=>{var x=Lt(g?l[i]:ee),_=L(x);return _}),s.set(i,v)),v!==void 0){var f=h(v);return f===ee?void 0:f}return Reflect.get(l,i,u)},getOwnPropertyDescriptor(l,i){var u=Reflect.getOwnPropertyDescriptor(l,i);if(u&&"value"in u){var v=s.get(i);v&&(u.value=h(v))}else if(u===void 0){var g=s.get(i),f=g==null?void 0:g.v;if(g!==void 0&&f!==ee)return{enumerable:!0,configurable:!0,value:f,writable:!0}}return u},has(l,i){var f;if(i===Ss)return!0;var u=s.get(i),v=u!==void 0&&u.v!==ee||Reflect.has(l,i);if(u!==void 0||D!==null&&(!v||(f=ks(l,i))!=null&&f.writable)){u===void 0&&(u=o(()=>{var m=v?Lt(l[i]):ee,x=L(m);return x}),s.set(i,u));var g=h(u);if(g===ee)return!1}return v},set(l,i,u,v){var T;var g=s.get(i),f=i in l;if(r&&i==="length")for(var m=u;m<g.v;m+=1){var x=s.get(m+"");x!==void 0?y(x,ee):m in l&&(x=o(()=>L(ee)),s.set(m+"",x))}if(g===void 0)(!f||(T=ks(l,i))!=null&&T.writable)&&(g=o(()=>L(void 0)),y(g,Lt(u)),s.set(i,g));else{f=g.v!==ee;var _=o(()=>Lt(u));y(g,_)}var b=Reflect.getOwnPropertyDescriptor(l,i);if(b!=null&&b.set&&b.set.call(v,u),!f){if(r&&typeof i=="string"){var S=s.get("length"),O=Number(i);Number.isInteger(O)&&O>=S.v&&y(S,O+1)}As(a)}return!0},ownKeys(l){h(a);var i=Reflect.ownKeys(l).filter(g=>{var f=s.get(g);return f===void 0||f.v!==ee});for(var[u,v]of s)v.v!==ee&&!(u in l)&&i.push(u);return i},setPrototypeOf(){Wn()}})}function sa(e){try{if(e!==null&&typeof e=="object"&&Ss in e)return e[Ss]}catch{}return e}function Ao(e,t){return Object.is(sa(e),sa(t))}var ra,Ba,Da,Ha;function Co(){if(ra===void 0){ra=window,Ba=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,s=Text.prototype;Da=ks(t,"firstChild").get,Ha=ks(t,"nextSibling").get,Zr(e)&&(e[yr]=void 0,e[qs]=null,e[Dn]=void 0,e.__e=void 0),Zr(s)&&(s[ms]=void 0)}}function mt(e=""){return document.createTextNode(e)}function Tt(e){return Da.call(e)}function Hs(e){return Ha.call(e)}function d(e,t){return Tt(e)}function Cr(e,t=!1){{var s=Tt(e);return s instanceof Comment&&s.data===""?Hs(s):s}}function p(e,t=1,s=!1){let r=e;for(;t--;)r=Hs(r);return r}function Po(e){e.textContent=""}function Ra(){return!1}function Mo(e,t,s){return s?document.createElement(e,{is:s}):document.createElement(e)}let aa=!1;function Io(){aa||(aa=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const s of e.target.elements)(t=s[Ws])==null||t.call(s)})},{capture:!0}))}function cr(e){var t=N,s=D;ze(null),lt(null);try{return e()}finally{ze(t),lt(s)}}function Fa(e,t,s,r=s){e.addEventListener(t,()=>cr(s));const a=e[Ws];a?e[Ws]=()=>{a(),r(!0)}:e[Ws]=()=>r(!0),Io()}function Lo(e){D===null&&(N===null&&Vn(),jn()),Pt&&Fn()}function Oo(e,t){var s=t.last;s===null?t.last=t.first=e:(s.next=e,e.prev=s,t.last=e)}function xt(e,t){var s=D;s!==null&&s.f&be&&(e|=be);var r={ctx:se,deps:null,nodes:null,f:e|oe|je,first:null,fn:t,last:null,next:null,parent:s,b:s&&s.b,prev:null,teardown:null,wv:0,ac:null};E==null||E.register_created_effect(r);var a=r;if(e&os)Qt!==null?Qt.push(r):Ut.ensure().schedule(r);else if(t!==null){try{cs(r)}catch(o){throw Se(r),o}a.deps===null&&a.teardown===null&&a.nodes===null&&a.first===a.last&&!(a.f&fs)&&(a=a.first,e&Ye&&e&qt&&a!==null&&(a.f|=qt))}if(a!==null&&(a.parent=s,s!==null&&Oo(a,s),N!==null&&N.f&ce&&!(e&Ct))){var n=N;(n.effects??(n.effects=[])).push(a)}return r}function Vr(){return N!==null&&!Qe}function zr(e){const t=xt(ir,null);return Z(t,te),t.teardown=e,t}function Pr(e){Lo();var t=D.f,s=!N&&(t&Ze)!==0&&se!==null&&!se.i;if(s){var r=se;(r.e??(r.e=[])).push(e)}else return ja(e)}function ja(e){return xt(os|Nn,e)}function No(e){Ut.ensure();const t=xt(Ct|fs,e);return(s={})=>new Promise(r=>{s.outro?Vt(t,()=>{Se(t),r(void 0)}):(Se(t),r(void 0))})}function Bo(e){return xt(os,e)}function Do(e){return xt(Zt|fs,e)}function Va(e,t=0){return xt(ir|t,e)}function R(e,t=[],s=[],r=[]){mo(r,t,s,a=>{xt(ir,()=>{e(...a.map(h))})})}function ur(e,t=0){var s=xt(Ye|t,e);return s}function Fe(e){return xt(Ze|fs,e)}function za(e){var t=e.teardown;if(t!==null){const s=Pt,r=N;na(!0),ze(null);try{t.call(null)}finally{na(s),ze(r)}}}function qr(e,t=!1){var s=e.first;for(e.first=e.last=null;s!==null;){const a=s.ac;a!==null&&cr(()=>{a.abort(lr)});var r=s.next;s.f&Ct?s.parent=null:Se(s,t),s=r}}function Ho(e){for(var t=e.first;t!==null;){var s=t.next;t.f&Ze||Se(t),t=s}}function Se(e,t=!0){var s=!1;(t||e.f&On)&&e.nodes!==null&&e.nodes.end!==null&&(Ro(e.nodes.start,e.nodes.end),s=!0),e.f|=Xr,qr(e,t&&!s),Ps(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const n of r)n.stop();za(e),e.f^=Xr,e.f|=Ve;var a=e.parent;a!==null&&a.first!==null&&qa(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Ro(e,t){for(;e!==null;){var s=e===t?null:Hs(e);e.remove(),e=s}}function qa(e){var t=e.parent,s=e.prev,r=e.next;s!==null&&(s.next=r),r!==null&&(r.prev=s),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=s))}function Vt(e,t,s=!0){var r=[];Wa(e,r,!0);var a=()=>{s&&Se(e),t&&t()},n=r.length;if(n>0){var o=()=>--n||a();for(var l of r)l.out(o)}else a()}function Wa(e,t,s){if(!(e.f&be)){e.f^=be;var r=e.nodes&&e.nodes.t;if(r!==null)for(const l of r)(l.is_global||s)&&t.push(l);for(var a=e.first;a!==null;){var n=a.next;if(!(a.f&Ct)){var o=(a.f&qt)!==0||(a.f&Ze)!==0&&(e.f&Ye)!==0;Wa(a,t,o?s:!1)}a=n}}}function tr(e){Ua(e,!0)}function Ua(e,t){if(e.f&be){e.f^=be,e.f&te||(Z(e,oe),Ut.ensure().schedule(e));for(var s=e.first;s!==null;){var r=s.next,a=(s.f&qt)!==0||(s.f&Ze)!==0;Ua(s,a?t:!1),s=r}var n=e.nodes&&e.nodes.t;if(n!==null)for(const o of n)(o.is_global||t)&&o.in()}}function Wr(e,t){if(e.nodes)for(var s=e.nodes.start,r=e.nodes.end;s!==null;){var a=s===r?null:Hs(s);t.append(s),s=a}}let Js=!1,Pt=!1;function na(e){Pt=e}let N=null,Qe=!1;function ze(e){N=e}let D=null;function lt(e){D=e}let ot=null;function Ga(e){N!==null&&(ot??(ot=new Set)).add(e)}let ke=null,Ae=0,Be=null;function Fo(e){Be=e}let $a=1,Ot=0,zt=Ot;function oa(e){zt=e}function Ja(){return++$a}function Rs(e){var t=e.f;if(t&oe)return!0;if(t&ce&&(e.f&=~Wt),t&it){for(var s=e.deps,r=s.length,a=0;a<r;a++){var n=s[a];if(Rs(n)&&Ea(n),n.wv>e.wv)return!0}t&je&&de===null&&Z(e,te)}return!1}function Ka(e,t,s=!0){var r=e.reactions;if(r!==null&&!(ot!==null&&ot.has(e)))for(var a=0;a<r.length;a++){var n=r[a];n.f&ce?Ka(n,t,!1):t===n&&(s?Z(n,oe):n.f&te&&Z(n,it),jr(n))}}function Ya(e){var _;var t=ke,s=Ae,r=Be,a=N,n=ot,o=se,l=Qe,i=zt,u=e.f;ke=null,Ae=0,Be=null,N=u&(Ze|Ct)?null:e,ot=null,is(e.ctx),Qe=!1,zt=++Ot,e.ac!==null&&(cr(()=>{e.ac.abort(lr)}),e.ac=null);try{e.f|=Zs;var v=e.fn,g=v();e.f|=us;var f=e.deps,m=E==null?void 0:E.is_fork;if(ke!==null){var x;if(m||Ps(e,Ae),f!==null&&Ae>0)for(f.length=Ae+ke.length,x=0;x<ke.length;x++)f[Ae+x]=ke[x];else e.deps=f=ke;if(Vr()&&e.f&je)for(x=Ae;x<f.length;x++)((_=f[x]).reactions??(_.reactions=[])).push(e)}else!m&&f!==null&&Ae<f.length&&(Ps(e,Ae),f.length=Ae);if(Ds()&&Be!==null&&!Qe&&f!==null&&!(e.f&(ce|it|oe)))for(x=0;x<Be.length;x++)Ka(Be[x],e);if(a!==null&&a!==e){if(Ot++,a.deps!==null)for(let b=0;b<s;b+=1)a.deps[b].rv=Ot;if(t!==null)for(const b of t)b.rv=Ot;Be!==null&&(r===null?r=Be:r.push(...Be))}return e.f&Et&&(e.f^=Et),g}catch(b){return ya(b)}finally{e.f^=Zs,ke=t,Ae=s,Be=r,N=a,ot=n,is(o),Qe=l,zt=i}}function jo(e,t){let s=t.reactions;if(s!==null){var r=En.call(s,e);if(r!==-1){var a=s.length-1;a===0?s=t.reactions=null:(s[r]=s[a],s.pop())}}if(s===null&&t.f&ce&&(ke===null||!Ys.call(ke,t))){var n=t;n.f&je&&(n.f^=je,n.f&=~Wt),n.v!==ee&&Dr(n),_o(n),Ps(n,0)}}function Ps(e,t){var s=e.deps;if(s!==null)for(var r=t;r<s.length;r++)jo(e,s[r])}function cs(e){var t=e.f;if(!(t&Ve)){Z(e,te);var s=D,r=Js;D=e,Js=!0;try{t&(Ye|ma)?Ho(e):qr(e),za(e);var a=Ya(e);e.teardown=typeof a=="function"?a:null,e.wv=$a;var n;fa&&ao&&e.f&oe&&e.deps}finally{Js=r,D=s}}}async function Vo(){await Promise.resolve(),ko()}function h(e){var t=e.f,s=(t&ce)!==0;if(N!==null&&!Qe){var r=D!==null&&(D.f&Ve)!==0;if(!r&&(ot===null||!ot.has(e))){var a=N.deps;if(N.f&Zs)e.rv<Ot&&(e.rv=Ot,ke===null&&a!==null&&a[Ae]===e?Ae++:ke===null?ke=[e]:ke.push(e));else{N.deps??(N.deps=[]),Ys.call(N.deps,e)||N.deps.push(e);var n=e.reactions;n===null?e.reactions=[N]:Ys.call(n,N)||n.push(N)}}}if(Pt&&jt.has(e))return jt.get(e);if(s){var o=e;if(Pt){var l=o.v;return(!(o.f&te)&&o.reactions!==null||Za(o))&&(l=Rr(o)),jt.set(o,l),l}var i=(o.f&je)===0&&!Qe&&N!==null&&(Js||(N.f&je)!==0),u=(o.f&us)===0;Rs(o)&&(i&&(o.f|=je),Ea(o)),i&&!u&&(Aa(o),Qa(o))}if(de!=null&&de.has(e))return de.get(e);if(e.f&Et)throw e.v;return e.v}function Qa(e){if(e.f|=je,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),t.f&ce&&!(t.f&je)&&(Aa(t),Qa(t))}function Za(e){if(e.v===ee)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(jt.has(t)||t.f&ce&&Za(t))return!0;return!1}function Xa(e){var t=Qe;try{return Qe=!0,e()}finally{Qe=t}}const zo=["touchstart","touchmove"];function qo(e){return zo.includes(e)}const Nt=Symbol("events"),en=new Set,Mr=new Set;function Wo(e,t,s,r={}){function a(n){if(r.capture||Ir.call(t,n),!n.cancelBubble)return cr(()=>s==null?void 0:s.call(this,n))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?At(()=>{t.addEventListener(e,a,r)}):t.addEventListener(e,a,r),a}function Uo(e,t,s,r,a){var n={capture:r,passive:a},o=Wo(e,t,s,n);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&zr(()=>{t.removeEventListener(e,o,n)})}function X(e,t,s){(t[Nt]??(t[Nt]={}))[e]=s}function ct(e){for(var t=0;t<e.length;t++)en.add(e[t]);for(var s of Mr)s(e)}let ia=null;function Ir(e){var _,b;var t=this,s=t.ownerDocument,r=e.type,a=((_=e.composedPath)==null?void 0:_.call(e))||[],n=a[0]||e.target;ia=e;var o=0,l=ia===e&&e[Nt];if(l){var i=a.indexOf(l);if(i!==-1&&(t===document||t===window)){e[Nt]=t;return}var u=a.indexOf(t);if(u===-1)return;i<=u&&(o=i)}if(n=a[o]||e.target,n!==t){An(e,"currentTarget",{configurable:!0,get(){return n||s}});var v=N,g=D;ze(null),lt(null);try{for(var f,m=[];n!==null&&n!==t;){try{var x=(b=n[Nt])==null?void 0:b[r];x!=null&&(!n.disabled||e.target===n)&&x.call(n,e)}catch(S){f?m.push(S):f=S}if(e.cancelBubble)break;o++,n=o<a.length?a[o]:null}if(f){for(let S of m)queueMicrotask(()=>{throw S});throw f}}finally{e[Nt]=t,delete e.currentTarget,ze(v),lt(g)}}}var ca;const br=((ca=globalThis==null?void 0:globalThis.window)==null?void 0:ca.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function Go(e){return(br==null?void 0:br.createHTML(e))??e}function tn(e){var t=Mo("template");return t.innerHTML=Go(e.replaceAll("<!>","<!---->")),t.content}function Ms(e,t){var s=D;s.nodes===null&&(s.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var s=(t&Qn)!==0,r=(t&Zn)!==0,a,n=!e.startsWith("<!>");return()=>{a===void 0&&(a=tn(n?e:"<!>"+e),s||(a=Tt(a)));var o=r||Ba?document.importNode(a,!0):a.cloneNode(!0);if(s){var l=Tt(o),i=o.lastChild;Ms(l,i)}else Ms(o,o);return o}}function $o(e,t,s="svg"){var r=!e.startsWith("<!>"),a=`<${s}>${r?e:"<!>"+e}</${s}>`,n;return()=>{if(!n){var o=tn(a),l=Tt(o);for(n=document.createDocumentFragment();Tt(l);)n.appendChild(Tt(l))}var i=n.cloneNode(!0);{var u=Tt(i),v=i.lastChild;Ms(u,v)}return i}}function fr(e,t){return $o(e,t,"svg")}function _s(e=""){{var t=mt(e+"");return Ms(t,t),t}}function sn(){var e=document.createDocumentFragment(),t=document.createComment(""),s=mt();return e.append(t,s),Ms(t,s),e}function w(e,t){e!==null&&e.before(t)}function I(e,t){var s=t==null?"":typeof t=="object"?`${t}`:t;s!==(e[ms]??(e[ms]=e.nodeValue))&&(e[ms]=s,e.nodeValue=`${s}`)}function Jo(e,t){return Ko(e,t)}const zs=new Map;function Ko(e,{target:t,anchor:s,props:r={},events:a,context:n,intro:o=!0,transformError:l}){Co();var i=void 0,u=No(()=>{var v=s??t.appendChild(mt());uo(v,{pending:()=>{}},m=>{qe({});var x=se;n&&(x.c=n),a&&(r.$$events=a),i=e(m,r)||{},We()},l);var g=new Set,f=m=>{for(var x=0;x<m.length;x++){var _=m[x];if(!g.has(_)){g.add(_);var b=qo(_);for(const T of[t,document]){var S=zs.get(T);S===void 0&&(S=new Map,zs.set(T,S));var O=S.get(_);O===void 0?(T.addEventListener(_,Ir,{passive:b}),S.set(_,1)):S.set(_,O+1)}}}};return f(or(en)),Mr.add(f),()=>{var b;for(var m of g)for(const S of[t,document]){var x=zs.get(S),_=x.get(m);--_==0?(S.removeEventListener(m,Ir),x.delete(m),x.size===0&&zs.delete(S)):x.set(m,_)}Mr.delete(f),v!==s&&((b=v.parentNode)==null||b.removeChild(v))}});return Yo.set(i,u),i}let Yo=new WeakMap;var Ke,at,Pe,Ft,Ns,Bs,nr;class rn{constructor(t,s=!0){Ee(this,"anchor");M(this,Ke,new Map);M(this,at,new Map);M(this,Pe,new Map);M(this,Ft,new Set);M(this,Ns,!0);M(this,Bs,t=>{if(c(this,Ke).has(t)){var s=c(this,Ke).get(t),r=c(this,at).get(s);if(r)tr(r),c(this,Ft).delete(s);else{var a=c(this,Pe).get(s);a&&(tr(a.effect),c(this,at).set(s,a.effect),c(this,Pe).delete(s),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),r=a.effect)}for(const[n,o]of c(this,Ke)){if(c(this,Ke).delete(n),n===t)break;const l=c(this,Pe).get(o);l&&(Se(l.effect),c(this,Pe).delete(o))}for(const[n,o]of c(this,at)){if(n===s||c(this,Ft).has(n))continue;const l=()=>{if(Array.from(c(this,Ke).values()).includes(n)){var u=document.createDocumentFragment();Wr(o,u),u.append(mt()),c(this,Pe).set(n,{effect:o,fragment:u})}else Se(o);c(this,Ft).delete(n),c(this,at).delete(n)};c(this,Ns)||!r?(c(this,Ft).add(n),Vt(o,l,!1)):l()}}});M(this,nr,t=>{c(this,Ke).delete(t);const s=Array.from(c(this,Ke).values());for(const[r,a]of c(this,Pe))s.includes(r)||(Se(a.effect),c(this,Pe).delete(r))});this.anchor=t,C(this,Ns,s)}ensure(t,s){var r=E,a=Ra();if(s&&!c(this,at).has(t)&&!c(this,Pe).has(t))if(a){var n=document.createDocumentFragment(),o=mt();n.append(o),c(this,Pe).set(t,{effect:Fe(()=>s(o)),fragment:n})}else c(this,at).set(t,Fe(()=>s(this.anchor)));if(c(this,Ke).set(r,t),a){for(const[l,i]of c(this,at))l===t?r.unskip_effect(i):r.skip_effect(i);for(const[l,i]of c(this,Pe))l===t?r.unskip_effect(i.effect):r.skip_effect(i.effect);r.oncommit(c(this,Bs)),r.ondiscard(c(this,nr))}else c(this,Bs).call(this,r)}}Ke=new WeakMap,at=new WeakMap,Pe=new WeakMap,Ft=new WeakMap,Ns=new WeakMap,Bs=new WeakMap,nr=new WeakMap;function ne(e,t,s=!1){var r=new rn(e),a=s?qt:0;function n(o,l){r.ensure(o,l)}ur(()=>{var o=!1;t((l,i=0)=>{o=!0,n(i,l)}),o||n(-1,null)},a)}function Ur(e,t){return t}function Qo(e,t,s){for(var r=[],a=t.length,n,o=t.length,l=0;l<a;l++){let g=t[l];Vt(g,()=>{if(n){if(n.pending.delete(g),n.done.add(g),n.pending.size===0){var f=e.outrogroups;Lr(e,or(n.done)),f.delete(n),f.size===0&&(e.outrogroups=null)}}else o-=1},!1)}if(o===0){var i=r.length===0&&s!==null;if(i){var u=s,v=u.parentNode;Po(v),v.append(u),e.items.clear()}Lr(e,t,!i)}else n={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(n)}function Lr(e,t,s=!0){var r;if(e.pending.size>0){r=new Set;for(const o of e.pending.values())for(const l of o)r.add(e.items.get(l).e)}for(var a=0;a<t.length;a++){var n=t[a];if(r!=null&&r.has(n)){n.f|=nt;const o=document.createDocumentFragment();Wr(n,o)}else Se(t[a],s)}}var la;function dt(e,t,s,r,a,n=null){var o=e,l=new Map,i=(t&ba)!==0;if(i){var u=e;o=u.appendChild(mt())}var v=null,g=Ta(()=>{var T=s();return Br(T)?T:T==null?[]:or(T)}),f,m=new Map,x=!0;function _(T){O.effect.f&Ve||(O.pending.delete(T),O.fallback=v,Zo(O,f,o,t,r),v!==null&&(f.length===0?v.f&nt?(v.f^=nt,ys(v,null,o)):tr(v):Vt(v,()=>{v=null})))}function b(T){O.pending.delete(T)}var S=ur(()=>{f=h(g);for(var T=f.length,A=new Set,B=E,z=Ra(),F=0;F<T;F+=1){var U=f[F],re=r(U,F),Q=x?null:l.get(re);Q?(Q.v&&ds(Q.v,U),Q.i&&ds(Q.i,F),z&&B.unskip_effect(Q.e)):(Q=Xo(l,x?o:la??(la=mt()),U,re,F,a,t,s),x||(Q.e.f|=nt),l.set(re,Q)),A.add(re)}if(T===0&&n&&!v&&(x?v=Fe(()=>n(o)):(v=Fe(()=>n(la??(la=mt()))),v.f|=nt)),T>A.size&&Rn(),!x)if(m.set(B,A),z){for(const[fe,ie]of l)A.has(fe)||B.skip_effect(ie.e);B.oncommit(_),B.ondiscard(b)}else _(B);h(g)}),O={effect:S,items:l,pending:m,outrogroups:null,fallback:v};x=!1}function hs(e){for(;e!==null&&!(e.f&Ze);)e=e.next;return e}function Zo(e,t,s,r,a){var Q,fe,ie,et,Me,Ie,xe,tt,Le;var n=(r&Kn)!==0,o=t.length,l=e.items,i=hs(e.effect.first),u,v=null,g,f=[],m=[],x,_,b,S;if(n)for(S=0;S<o;S+=1)x=t[S],_=a(x,S),b=l.get(_).e,b.f&nt||((fe=(Q=b.nodes)==null?void 0:Q.a)==null||fe.measure(),(g??(g=new Set)).add(b));for(S=0;S<o;S+=1){if(x=t[S],_=a(x,S),b=l.get(_).e,e.outrogroups!==null)for(const H of e.outrogroups)H.pending.delete(b),H.done.delete(b);if(b.f&be&&(tr(b),n&&((et=(ie=b.nodes)==null?void 0:ie.a)==null||et.unfix(),(g??(g=new Set)).delete(b))),b.f&nt)if(b.f^=nt,b===i)ys(b,null,s);else{var O=v?v.next:i;b===e.effect.last&&(e.effect.last=b.prev),b.prev&&(b.prev.next=b.next),b.next&&(b.next.prev=b.prev),yt(e,v,b),yt(e,b,O),ys(b,O,s),v=b,f=[],m=[],i=hs(v.next);continue}if(b!==i){if(u!==void 0&&u.has(b)){if(f.length<m.length){var T=m[0],A;v=T.prev;var B=f[0],z=f[f.length-1];for(A=0;A<f.length;A+=1)ys(f[A],T,s);for(A=0;A<m.length;A+=1)u.delete(m[A]);yt(e,B.prev,z.next),yt(e,v,B),yt(e,z,T),i=T,v=z,S-=1,f=[],m=[]}else u.delete(b),ys(b,i,s),yt(e,b.prev,b.next),yt(e,b,v===null?e.effect.first:v.next),yt(e,v,b),v=b;continue}for(f=[],m=[];i!==null&&i!==b;)(u??(u=new Set)).add(i),m.push(i),i=hs(i.next);if(i===null)continue}b.f&nt||f.push(b),v=b,i=hs(b.next)}if(e.outrogroups!==null){for(const H of e.outrogroups)H.pending.size===0&&(Lr(e,or(H.done)),(Me=e.outrogroups)==null||Me.delete(H));e.outrogroups.size===0&&(e.outrogroups=null)}if(i!==null||u!==void 0){var F=[];if(u!==void 0)for(b of u)b.f&be||F.push(b);for(;i!==null;)!(i.f&be)&&i!==e.fallback&&F.push(i),i=hs(i.next);var U=F.length;if(U>0){var re=r&ba&&o===0?s:null;if(n){for(S=0;S<U;S+=1)(xe=(Ie=F[S].nodes)==null?void 0:Ie.a)==null||xe.measure();for(S=0;S<U;S+=1)(Le=(tt=F[S].nodes)==null?void 0:tt.a)==null||Le.fix()}Qo(e,F,re)}}n&&At(()=>{var H,ve;if(g!==void 0)for(b of g)(ve=(H=b.nodes)==null?void 0:H.a)==null||ve.apply()})}function Xo(e,t,s,r,a,n,o,l){var i=o&$n?o&Yn?Gt(s):To(s,!1,!1):null,u=o&Jn?Gt(a):null;return{v:i,i:u,e:Fe(()=>(n(t,i??s,u??a,l),()=>{e.delete(r)}))}}function ys(e,t,s){if(e.nodes)for(var r=e.nodes.start,a=e.nodes.end,n=t&&!(t.f&nt)?t.nodes.start:s;r!==null;){var o=Hs(r);if(n.before(r),r===a)return;r=o}}function yt(e,t,s){t===null?e.effect.first=s:t.next=s,s===null?e.effect.last=t:s.prev=t}function an(e,t,...s){var r=new rn(e);ur(()=>{const a=t()??null;r.ensure(a,a&&(n=>a(n,...s)))},qt)}function nn(e){var t,s,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(s=nn(e[t]))&&(r&&(r+=" "),r+=s)}else for(s in e)e[s]&&(r&&(r+=" "),r+=s);return r}function ei(){for(var e,t,s=0,r="",a=arguments.length;s<a;s++)(e=arguments[s])&&(t=nn(e))&&(r&&(r+=" "),r+=t);return r}function Fs(e){return typeof e=="object"?ei(e):e??""}function ti(e,t,s){var r=e==null?"":""+e;return r===""?null:r}function bt(e,t,s,r,a,n){var o=e[yr];if(o!==s||o===void 0){var l=ti(s);l==null?e.removeAttribute("class"):e.className=l,e[yr]=s}return n}function on(e,t,s=!1){if(e.multiple){if(t==null)return;if(!Br(t))return to();for(var r of e.options)r.selected=t.includes(Cs(r));return}for(r of e.options){var a=Cs(r);if(Ao(a,t)){r.selected=!0;return}}(!s||t!==void 0)&&(e.selectedIndex=-1)}function si(e){var t=new MutationObserver(()=>{on(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),zr(()=>{t.disconnect()})}function ri(e,t,s=t){var r=new WeakSet,a=!0;Fa(e,"change",n=>{var o=n?"[selected]":":checked",l;if(e.multiple)l=[].map.call(e.querySelectorAll(o),Cs);else{var i=e.querySelector(o)??e.querySelector("option:not([disabled])");l=i&&Cs(i)}s(l),e.__value=l,E!==null&&r.add(E)}),Bo(()=>{var n=t();if(e===document.activeElement){var o=E;if(r.has(o))return}if(on(e,n,a),a&&n===void 0){var l=e.querySelector(":checked");l!==null&&(n=Cs(l),s(n))}e.__value=n,a=!1}),si(e)}function Cs(e){return"__value"in e?e.__value:e.value}const ai=Symbol("is custom element"),ni=Symbol("is html");function sr(e,t){var s=ln(e);s.checked!==(s.checked=t??void 0)&&(e.checked=t)}function Gr(e,t,s,r){var a=ln(e);a[t]!==(a[t]=s)&&(t==="loading"&&(e[Bn]=s),s==null?e.removeAttribute(t):typeof s!="string"&&oi(e).includes(t)?e[t]=s:e.setAttribute(t,s))}function ln(e){return e[qs]??(e[qs]={[ai]:e.nodeName.includes("-"),[ni]:e.namespaceURI===Xn})}var da=new Map;function oi(e){var t=e.getAttribute("is")||e.nodeName,s=da.get(t);if(s)return s;da.set(t,s=[]);for(var r,a=e,n=Element.prototype;n!==a;){r=Cn(a);for(var o in r)r[o].set&&o!=="innerHTML"&&o!=="textContent"&&o!=="innerText"&&s.push(o);a=va(a)}return s}function Ks(e,t,s=t){var r=new WeakSet;Fa(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=xr(e)?gr(n):n,s(n),E!==null&&r.add(E),await Vo(),n!==(n=t())){var o=e.selectionStart,l=e.selectionEnd,i=e.value.length;if(e.value=n??"",l!==null){var u=e.value.length;o===l&&l===i&&u>i?(e.selectionStart=u,e.selectionEnd=u):(e.selectionStart=o,e.selectionEnd=Math.min(l,u))}}}),Xa(t)==null&&e.value&&(s(xr(e)?gr(e.value):e.value),E!==null&&r.add(E)),Va(()=>{var a=t();if(e===document.activeElement){var n=E;if(r.has(n))return}xr(e)&&a===gr(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function xr(e){var t=e.type;return t==="number"||t==="range"}function gr(e){return e===""?null:+e}const ii="5";var ua;typeof window<"u"&&((ua=window.__svelte??(window.__svelte={})).v??(ua.v=new Set)).add(ii);const Or="TestSpectra — Matchers API Reference",li=new Set(["await","async","const","let","var","import","from","export","return","if","else","for","of","in","new","true","false","null","undefined","type","interface","class","extends","void"]);function di(e){const t=[];let s=0;for(;s<e.length;){if(e[s]==="/"&&e[s+1]==="/"){const r=e.indexOf(`
|
|
2
|
-
`,s),a=r<0?e.length:r;t.push({t:"comment",v:e.slice(s,a)}),s=a;continue}if(e[s]==='"'||e[s]==="'"||e[s]==="`"){const r=e[s];let a=s+1;for(;a<e.length;){if(e[a]==="\\"&&r!=="`"){a+=2;continue}if(e[a]===r){a++;break}a++}t.push({t:"string",v:e.slice(s,a)}),s=a;continue}if(/\d/.test(e[s])&&(s===0||!/[a-zA-Z_$]/.test(e[s-1]))){let r=s;for(;r<e.length&&/[\d.]/.test(e[r]);)r++;t.push({t:"number",v:e.slice(s,r)}),s=r;continue}if(/[a-zA-Z_$]/.test(e[s])){let r=s;for(;r<e.length&&/[a-zA-Z0-9_$]/.test(e[r]);)r++;const a=e.slice(s,r);t.push({t:li.has(a)?"keyword":"plain",v:a}),s=r;continue}t.push({t:"plain",v:e[s]}),s++}return t}const ci={comment:"text-slate-500 italic",string:"text-emerald-400",keyword:"text-teal-400",number:"text-orange-400",plain:"text-slate-300"},dn={element:{tag:"border-violet-800/60 bg-violet-950/40 text-violet-300",badge:"bg-violet-500/10 text-violet-400",label:"Element"},browser:{tag:"border-teal-800/60 bg-teal-950/40 text-teal-300",badge:"bg-teal-500/10 text-teal-400",label:"Browser"},collection:{tag:"border-blue-800/60 bg-blue-950/40 text-blue-300",badge:"bg-blue-500/10 text-blue-400",label:"Collection"},api:{tag:"border-amber-800/60 bg-amber-950/40 text-amber-300",badge:"bg-amber-500/10 text-amber-400",label:"API / Network"}},cn=[{id:"overview",label:"Overview",indent:0},{id:"element-matchers",label:"Element Matchers",indent:0},{id:"visibility",label:"be.visible / not.be.visible",indent:1},{id:"existence",label:"exist / not.exist",indent:1},{id:"state",label:"enabled / disabled / checked",indent:1},{id:"value",label:"have.value / contain.value",indent:1},{id:"text",label:"have.text / contain.text",indent:1},{id:"class-attr",label:"have.class / have.attr",indent:1},{id:"browser-matchers",label:"Browser Matchers",indent:0},{id:"url",label:"have.url / contain.url",indent:1},{id:"title",label:"have.title / contain.title",indent:1},{id:"collection-matchers",label:"Collection Matchers",indent:0},{id:"length",label:"length / greaterThan / empty",indent:1},{id:"api-matchers",label:"API & Network Testing",indent:0},{id:"api-fetch",label:"GET / Fetch API",indent:1},{id:"api-post",label:"POST / Create API",indent:1},{id:"playground",label:"Live Playground",indent:0}];var ui=k('<span class="mr-1 text-slate-700">›</span>'),fi=k("<a><!> </a>"),vi=k('<aside class="w-56 shrink-0 overflow-y-auto border-r border-slate-800/60 py-6 px-2"><div class="px-3 mb-7"><div class="flex items-center gap-2.5"><div class="size-7 rounded-lg bg-teal-950/60 border border-teal-800/50 flex items-center justify-center shrink-0"><svg class="size-3.5 text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div> <div><div class="text-xs font-semibold text-slate-100 tracking-wide">TestSpectra</div> <div class="text-[10px] text-slate-600 font-mono">Matchers API v1</div></div></div></div> <div class="space-y-0.5"></div> <div class="px-3 mt-7 pt-5 border-t border-slate-800/50"><div class="text-[10px] text-slate-700 font-mono space-y-1"><div>WebdriverIO v9+</div> <div>Multi-platform: Web · iOS · Android</div></div></div></aside>');function pi(e,t){qe(t,!0);function s(n){var o;(o=document.getElementById(n))==null||o.scrollIntoView({behavior:"smooth",block:"start"})}var r=vi(),a=p(d(r),2);dt(a,21,()=>cn,n=>n.id,(n,o)=>{const l=ls(()=>t.activeId===h(o).id),i=ls(()=>h(o).indent===0);var u=fi(),v=d(u);{var g=m=>{var x=ui();w(m,x)};ne(v,m=>{h(o).indent===1&&m(g)})}var f=p(v);R(m=>{Gr(u,"href",`#${h(o).id}`),bt(u,1,m),I(f,` ${h(o).label??""}`)},[()=>Fs(["block w-full text-left py-1.5 rounded-lg text-[11px] transition-all duration-150 leading-snug cursor-pointer no-underline",h(o).indent===1?"pl-7 pr-3":"px-3",h(i)?"mt-5 font-semibold first:mt-0":"font-normal",h(l)?"text-teal-400 bg-teal-950/50 border border-teal-800/40":h(i)?"text-slate-300 hover:text-slate-100 hover:bg-slate-800/40":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/30"].join(" "))]),X("click",u,m=>{m.preventDefault(),s(h(o).id)}),w(n,u)}),w(e,r),We()}ct(["click"]);var hi=k('<div class="flex items-center gap-3 mb-6"><h2 class="text-xs font-mono font-semibold uppercase tracking-widest text-slate-500"><!></h2> <div class="flex-1 h-px bg-slate-800/80"></div></div>');function ws(e,t){var s=hi(),r=d(s),a=d(r);an(a,()=>t.children??pa),R(()=>Gr(s,"id",t.id)),w(e,s)}no();var mi=k("<span> </span>"),bi=k('<div class="relative rounded-xl overflow-hidden border border-slate-700/40 bg-[#030a14]"><div class="flex items-center justify-between px-4 py-2 bg-slate-900/60 border-b border-slate-700/40"><span class="text-[10px] tracking-widest uppercase text-slate-600 font-mono">TypeScript</span> <button type="button" class="text-[11px] text-slate-600 hover:text-teal-400 transition-colors font-mono px-2 py-0.5 rounded hover:bg-teal-950/40 cursor-pointer"> </button></div> <pre class="p-5 text-sm font-mono overflow-x-auto leading-6 whitespace-pre"><code></code></pre></div>');function un(e,t){qe(t,!0);let s=L(!1),r=ls(()=>di(t.code));function a(){navigator.clipboard.writeText(t.code).catch(()=>{}),y(s,!0),setTimeout(()=>{y(s,!1)},2e3)}var n=bi(),o=d(n),l=p(d(o),2),i=d(l),u=p(o,2),v=d(u);dt(v,21,()=>h(r),Ur,(g,f)=>{var m=mi(),x=d(m);R(()=>{bt(m,1,Fs(ci[h(f).t])),I(x,h(f).v)}),w(g,m)}),R(()=>I(i,h(s)?"✓ copied":"copy")),X("click",l,a),w(e,n),We()}ct(["click"]);var xi=k('<div class="rounded-xl border border-slate-800/60 bg-slate-900/20 px-4 py-4"><div> </div> <div class="text-[11px] text-slate-500 mt-1"> </div></div>'),gi=k(`<section id="overview" class="mb-20"><div class="flex items-center gap-3 mb-5"><span class="text-[11px] font-mono text-teal-400 bg-teal-950/50 border border-teal-800/50 px-3 py-1 rounded-full">v1.0 · Stable</span> <span class="text-[11px] text-slate-600 font-mono">WebdriverIO v9+</span> <span class="text-[11px] text-slate-600 font-mono">·</span> <span class="text-[11px] text-slate-600 font-mono">Multi-platform</span></div> <h1 class="text-3xl font-bold text-slate-100 mb-3 leading-tight tracking-tight">Matchers API Reference</h1> <p id="demo-page-subtitle" class="text-base text-slate-400 leading-relaxed max-w-2xl mb-8">Fluent assertion matchers for cross-platform testing on Web, iOS, and Android.
|
|
3
|
-
Built on WebdriverIO — expressive, chainable, and designed for readable test code.</p> <div class="rounded-2xl border border-slate-800/60 bg-slate-900/20 overflow-hidden mb-8"><div class="px-5 py-3 border-b border-slate-800/60"><span class="text-xs font-semibold text-slate-400">Quick Start</span></div> <!></div> <div class="grid grid-cols-2 sm:grid-cols-4 gap-3"></div></section>`);function _i(e){const t=`import { Spectra } from "testspectra";
|
|
4
|
-
|
|
5
|
-
// Single element — assert visibility and state
|
|
6
|
-
await LoginPage.submitButton.shouldBeVisible();
|
|
7
|
-
await LoginPage.emailInput.shouldBeEnabled();
|
|
8
|
-
|
|
9
|
-
// Chained: action then assertion
|
|
10
|
-
await Spectra.get("#search-input")
|
|
11
|
-
.type("testspectra")
|
|
12
|
-
.shouldHaveValue("testspectra");
|
|
13
|
-
|
|
14
|
-
// Collection — assert item count
|
|
15
|
-
await Spectra.getAll(".product-card").shouldHaveLengthGreaterThan(0);
|
|
16
|
-
|
|
17
|
-
// Browser-level — assert URL and page title
|
|
18
|
-
await Spectra.browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
19
|
-
await Spectra.browser.shouldContainUrl("/matchers");`,s=[{val:"26",label:"Element Matchers",color:"text-violet-400"},{val:"6",label:"Browser Matchers",color:"text-teal-400"},{val:"6",label:"Collection Matchers",color:"text-blue-400"},{val:"38",label:"Canonical Keys",color:"text-amber-400"}];var r=gi(),a=p(d(r),6),n=p(d(a),2);un(n,{code:t});var o=p(a,2);dt(o,5,()=>s,l=>l.label,(l,i)=>{var u=xi(),v=d(u),g=d(v),f=p(v,2),m=d(f);R(()=>{bt(v,1,`text-2xl font-bold font-mono ${h(i).color}`),I(g,h(i).val),I(m,h(i).label)}),w(l,u)}),w(e,r)}var yi=k("<code> </code>");function wi(e,t){qe(t,!0);var s=yi(),r=d(s);R(()=>{bt(s,1,`inline-flex text-xs font-mono font-medium px-3 py-1 rounded-lg border ${dn[t.cat].tag}`),I(r,`.${t.name??""}()`)}),w(e,s),We()}var ki=k("<span> </span>");function Si(e,t){qe(t,!0);let s=ls(()=>dn[t.cat]);var r=ki(),a=d(r);R(()=>{bt(r,1,`text-[10px] font-mono font-semibold uppercase tracking-widest px-2.5 py-1 rounded-full ${h(s).badge}`),I(a,h(s).label)}),w(e,r),We()}var Ti=k('<p class="text-sm text-slate-400 leading-relaxed"><code class="text-slate-300 text-xs mr-2 bg-slate-800/60 px-1.5 py-0.5 rounded"> </code> </p>'),Ei=k('<div class="rounded-2xl border border-slate-800/60 bg-slate-900/20 overflow-hidden mb-5"><div class="px-6 py-5 border-b border-slate-800/60"><div class="flex items-start justify-between gap-4 mb-4"><div class="flex flex-wrap gap-2"></div> <!></div> <div class="space-y-1.5"></div></div> <div class="grid grid-cols-1 xl:grid-cols-5"><div class="xl:col-span-3 p-5 xl:border-r border-b xl:border-b-0 border-slate-800/60"><!></div> <div class="xl:col-span-2 p-5 bg-slate-950/20"><p class="text-[10px] font-mono uppercase tracking-widest text-slate-600 mb-4">Live Elements</p> <!></div></div></div>');function Xe(e,t){var s=Ei(),r=d(s),a=d(r),n=d(a);dt(n,21,()=>t.matchers,x=>x.name,(x,_)=>{wi(x,{get name(){return h(_).name},get cat(){return t.cat}})});var o=p(n,2);Si(o,{get cat(){return t.cat}});var l=p(a,2);dt(l,21,()=>t.matchers,x=>x.name,(x,_)=>{var b=Ti(),S=d(b),O=d(S),T=p(S);R(()=>{I(O,`.${h(_).name??""}()`),I(T,` ${h(_).desc??""}`)}),w(x,b)});var i=p(r,2),u=d(i),v=d(u);un(v,{get code(){return t.code}});var g=p(u,2),f=p(d(g),2);{var m=x=>{var _=sn(),b=Cr(_);an(b,()=>t.demo),w(x,_)};ne(f,x=>{t.demo&&x(m)})}w(e,s)}var Ai=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-visible-el"</span> <div id="demo-visible-el" data-testid="visible-element" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">I am visible ✓</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-hidden-el" (toggle to hide)</span> <div class="flex items-center gap-2"><div id="demo-hidden-el" data-testid="hidden-element">I am hidden ✗</div> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 hover:border-slate-600 transition-all cursor-pointer"> </button></div></div></div>'),Ci=k('<div id="visibility" class="mb-5"><!></div>');function Pi(e,t){qe(t,!0);const s=`// Assert element is visible on screen
|
|
20
|
-
await LoginPage.submitButton.shouldBeVisible();
|
|
21
|
-
|
|
22
|
-
// Assert element is hidden from view
|
|
23
|
-
await LoginPage.errorMessage.shouldNotBeVisible();`;var r=Ci(),a=d(r);Xe(a,{cat:"element",matchers:[{name:"shouldBeVisible",desc:"Asserts the element is displayed and visible to the user."},{name:"shouldNotBeVisible",desc:"Asserts the element is hidden or not rendered visually."}],code:s,demo:o=>{var l=Ai(),i=p(d(l),2),u=p(d(i),2),v=d(u),g=p(v,2),f=d(g);R(m=>{bt(v,1,m),I(f,t.hidden?"show":"hide")},[()=>Fs(["px-3 py-2 rounded-lg bg-red-950/40 border border-red-800/50 text-red-300 text-sm font-mono transition-all",t.hidden?"hidden":""].join(" "))]),X("click",g,function(...m){var x;(x=t.onToggleHidden)==null||x.apply(this,m)}),w(o,l)}}),w(e,r),We()}ct(["click"]);var Mi=k('<div id="demo-removed-el" data-testid="removable-element" class="px-3 py-2 rounded-lg bg-orange-950/40 border border-orange-800/50 text-orange-300 text-sm font-mono">Remove me from DOM</div>'),Ii=k('<span class="text-xs text-slate-600 font-mono italic">(not in DOM)</span>'),Li=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-existing-el" (always in DOM)</span> <div id="demo-existing-el" data-testid="existing-element" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">I exist in the DOM ✓</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-removed-el" (toggle to remove)</span> <div class="flex items-center gap-2"><!> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 hover:border-slate-600 transition-all cursor-pointer"> </button></div></div></div>'),Oi=k('<div id="existence" class="mb-5"><!></div>');function Ni(e,t){const s=`// Assert element exists in the DOM
|
|
24
|
-
await LoginPage.rememberMeCheckbox.shouldExist();
|
|
25
|
-
|
|
26
|
-
// Assert element is not present in the DOM
|
|
27
|
-
await LoginPage.loadingSpinner.shouldNotExist();`;var r=Oi(),a=d(r);Xe(a,{cat:"element",matchers:[{name:"shouldExist",desc:"Asserts the element exists in the DOM/UI hierarchy."},{name:"shouldNotExist",desc:"Asserts the element does NOT exist in the DOM/UI hierarchy."}],code:s,demo:o=>{var l=Li(),i=p(d(l),2),u=p(d(i),2),v=d(u);{var g=_=>{var b=Mi();w(_,b)},f=_=>{var b=Ii();w(_,b)};ne(v,_=>{t.exists?_(g):_(f,-1)})}var m=p(v,2),x=d(m);R(()=>I(x,t.exists?"remove":"add")),X("click",m,function(..._){var b;(b=t.onToggleExists)==null||b.apply(this,_)}),w(o,l)}}),w(e,r)}ct(["click"]);var Bi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-submit-btn" (enabled)</span> <div class="flex items-center gap-2"><button id="demo-submit-btn" data-testid="submit-button" class="px-4 py-2 rounded-lg bg-teal-600 hover:bg-teal-500 text-white text-sm font-medium transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-slate-700 cursor-pointer">Submit Form</button> <button id="demo-disabled-btn" data-testid="disabled-button" class="px-4 py-2 rounded-lg bg-slate-700 text-slate-400 text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer">Disabled</button> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer">flip</button></div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-checkbox" / id="demo-radio"</span> <div class="flex items-center gap-4"><label class="flex items-center gap-2 cursor-pointer"><input type="checkbox" id="demo-checkbox" data-testid="terms-checkbox" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">Terms</span></label> <label class="flex items-center gap-2 cursor-pointer"><input type="radio" id="demo-radio" name="demo-radio-group" data-testid="mode-radio" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">Dark Mode</span></label></div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-focus-input" (focused state)</span> <input id="demo-focus-input" data-testid="focus-input" type="text" placeholder="Click to focus this input..." class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-500 focus:ring-1 focus:ring-teal-500"/></div></div>'),Di=k('<div id="state" class="mb-5"><!></div>');function Hi(e,t){qe(t,!0);const s=`// Enabled / Disabled / Clickable assertions
|
|
28
|
-
await LoginPage.loginButton.shouldBeEnabled();
|
|
29
|
-
await LoginPage.loginButton.shouldBeClickable();
|
|
30
|
-
|
|
31
|
-
await LoginPage.disabledSubmit.shouldBeDisabled();
|
|
32
|
-
await LoginPage.disabledSubmit.shouldNotBeClickable();
|
|
33
|
-
|
|
34
|
-
// Checked / Selected assertions
|
|
35
|
-
await SettingsPage.darkModeRadio.shouldBeChecked();
|
|
36
|
-
await SettingsPage.termsCheckbox.shouldNotBeChecked();
|
|
37
|
-
|
|
38
|
-
// Focus assertions
|
|
39
|
-
await LoginPage.emailInput.click();
|
|
40
|
-
await LoginPage.emailInput.shouldBeFocused();
|
|
41
|
-
await LoginPage.loginButton.shouldNotBeFocused();`;var r=Di(),a=d(r);Xe(a,{cat:"element",matchers:[{name:"shouldBeEnabled",desc:"Asserts the element is enabled for interaction."},{name:"shouldBeDisabled",desc:"Asserts the element is disabled and cannot be interacted with."},{name:"shouldBeClickable",desc:"Asserts the element is displayed, enabled, and clickable."},{name:"shouldNotBeClickable",desc:"Asserts the element is not clickable."},{name:"shouldBeChecked",desc:"Asserts the checkbox or radio element is checked."},{name:"shouldNotBeChecked",desc:"Asserts the checkbox or radio element is not checked."},{name:"shouldBeFocused",desc:"Asserts the element currently has DOM focus."},{name:"shouldNotBeFocused",desc:"Asserts the element does not currently have DOM focus."}],code:s,demo:o=>{var l=Bi(),i=d(l),u=p(d(i),2),v=d(u),g=p(v,2),f=p(g,2),m=p(i,2),x=p(d(m),2),_=d(x),b=d(_),S=p(_,2),O=d(S);R(()=>{v.disabled=t.disabled,g.disabled=!t.disabled,sr(b,t.checked),sr(O,t.selected)}),X("click",f,function(...T){var A;(A=t.onToggleDisabled)==null||A.apply(this,T)}),X("change",b,T=>t.onToggleChecked(T.currentTarget.checked)),X("change",O,T=>t.onToggleSelected(T.currentTarget.checked)),w(o,l)}}),w(e,r),We()}ct(["click","change"]);var Ri=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-email-input" — exact value</span> <input id="demo-email-input" data-testid="email-input" type="text" value="admin@testspectra.dev" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-token-input" — contains "JWT_"</span> <input id="demo-token-input" data-testid="token-input" type="text" value="JWT_abc123xyz" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div></div>'),Fi=k('<div id="value" class="mb-5"><!></div>');function ji(e){const t=`// Exact value match & negation
|
|
42
|
-
await LoginPage.usernameInput.shouldHaveValue("admin@testspectra.dev");
|
|
43
|
-
await LoginPage.usernameInput.shouldNotHaveValue("wrong@email.com");
|
|
44
|
-
|
|
45
|
-
// Partial value match & negation
|
|
46
|
-
await LoginPage.tokenInput.shouldContainValue("JWT_");
|
|
47
|
-
await LoginPage.tokenInput.shouldNotContainValue("EXPIRED");`;var s=Fi(),r=d(s);Xe(r,{cat:"element",matchers:[{name:"shouldHaveValue",desc:"Asserts the input element has the exact given value."},{name:"shouldNotHaveValue",desc:"Asserts the input element does not have the specified value."},{name:"shouldContainValue",desc:"Asserts the input element's value contains the given substring."},{name:"shouldNotContainValue",desc:"Asserts the input element's value does not contain the substring."}],code:t,demo:n=>{var o=Ri();w(n,o)}}),w(e,s)}var Vi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-exact-text" — exact match</span> <div id="demo-exact-text" data-testid="exact-text" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-200 text-sm font-mono">Welcome to TestSpectra</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-partial-text" — contains "Welcome"</span> <div id="demo-partial-text" data-testid="partial-text" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-200 text-sm font-mono">Welcome back, QA Engineer!</div></div></div>'),zi=k('<div id="text" class="mb-5"><!></div>');function qi(e){const t=`// Exact text match & negation
|
|
48
|
-
await LoginPage.headerTitle.shouldHaveText("Welcome to TestSpectra");
|
|
49
|
-
await LoginPage.headerTitle.shouldNotHaveText("Goodbye");
|
|
50
|
-
|
|
51
|
-
// Substring text match & negation
|
|
52
|
-
await LoginPage.welcomeBanner.shouldContainText("Welcome");
|
|
53
|
-
await LoginPage.welcomeBanner.shouldNotContainText("Error");`;var s=zi(),r=d(s);Xe(r,{cat:"element",matchers:[{name:"shouldHaveText",desc:"Asserts the element's text content matches the exact expected string."},{name:"shouldNotHaveText",desc:"Asserts the element's text content does not match the string."},{name:"shouldContainText",desc:"Asserts the element's text content contains the expected substring."},{name:"shouldNotContainText",desc:"Asserts the element's text content does not contain the substring."}],code:t,demo:n=>{var o=Vi();w(n,o)}}),w(e,s)}var Wi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-active-tab" class="is-active"</span> <div id="demo-active-tab" data-testid="active-tab" class="is-active px-4 py-2 rounded-lg bg-violet-950/50 border border-violet-700/60 text-violet-300 text-sm font-mono inline-flex items-center gap-2"><span class="size-1.5 rounded-full bg-violet-400 inline-block"></span> is-active</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-nav-link" aria-label href="/dashboard"</span> <a id="demo-nav-link" data-testid="nav-link" href="/dashboard" aria-label="Go to Dashboard" aria-expanded="false" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-300 text-sm font-mono inline-flex items-center gap-2 hover:border-teal-800/60 hover:text-teal-300 transition-all cursor-pointer">→ /dashboard</a></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-styled-el" color: rgb(239, 68, 68)</span> <div id="demo-styled-el" data-testid="styled-element" style="color: rgb(239, 68, 68); display: flex;" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 font-mono text-sm inline-flex items-center gap-2"><span>Styled Element (color: rgb(239, 68, 68))</span></div></div></div>'),Ui=k('<div id="class-attr" class="mb-5"><!></div>');function Gi(e){const t=`// Assert CSS class presence
|
|
54
|
-
await NavigationBar.homeTab.shouldHaveClass("is-active");
|
|
55
|
-
await NavigationBar.homeTab.shouldNotHaveClass("is-hidden");
|
|
56
|
-
|
|
57
|
-
// Assert attribute presence (with or without value)
|
|
58
|
-
await NavigationBar.logoLink.shouldHaveAttribute("href", "/dashboard");
|
|
59
|
-
await NavigationBar.cartButton.shouldHaveAttribute("aria-expanded");
|
|
60
|
-
await NavigationBar.cartButton.shouldNotHaveAttribute("disabled");
|
|
61
|
-
|
|
62
|
-
// Assert CSS style properties
|
|
63
|
-
await StyledPage.element.shouldHaveCss("color", "rgb(239, 68, 68)");
|
|
64
|
-
await StyledPage.element.shouldNotHaveCss("color", "rgb(0, 0, 255)");`;var s=Ui(),r=d(s);Xe(r,{cat:"element",matchers:[{name:"shouldHaveClass",desc:"Asserts the element has the specified CSS class."},{name:"shouldNotHaveClass",desc:"Asserts the element does not have the specified CSS class."},{name:"shouldHaveAttribute",desc:"Asserts the element has the specified attribute, optionally checking its value."},{name:"shouldNotHaveAttribute",desc:"Asserts the element does not have the specified attribute."},{name:"shouldHaveCss",desc:"Asserts the element has the specified CSS style property and value."},{name:"shouldNotHaveCss",desc:"Asserts the element does not have the specified CSS style property."}],code:t,demo:n=>{var o=Wi(),l=p(d(o),2),i=p(d(l),2);X("click",i,u=>u.preventDefault()),w(n,o)}}),w(e,s)}ct(["click"]);var $i=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">Current page URL</span> <div class="px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-400 text-xs font-mono break-all"> </div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">Usage example</span> <div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-teal-300 text-xs font-mono">await Spectra.browser.shouldContainUrl(<span class="text-emerald-400"> </span>)</div></div></div>'),Ji=k('<div id="url" class="mb-5"><!></div>');function Ki(e,t){qe(t,!0);let s=L(""),r=L("");Pr(()=>{typeof window<"u"&&(y(s,window.location.href,!0),y(r,window.location.hostname,!0))});const a=`// Exact URL match
|
|
65
|
-
await Spectra.browser.shouldHaveUrl("https://app.testspectra.dev/dashboard");
|
|
66
|
-
|
|
67
|
-
// URL contains substring
|
|
68
|
-
await Spectra.browser.shouldContainUrl("/dashboard");`;var n=Ji(),o=d(n);Xe(o,{cat:"browser",matchers:[{name:"shouldHaveUrl",desc:"Asserts the current browser page URL exactly matches the expected URL."},{name:"shouldContainUrl",desc:"Asserts the current browser page URL contains the given substring."}],code:a,demo:i=>{var u=$i(),v=d(u),g=p(d(v),2),f=d(g),m=p(v,2),x=p(d(m),2),_=p(d(x)),b=d(_);R(()=>{I(f,h(s)||"https://app.testspectra.dev/dashboard"),I(b,`"${(h(r)||"app.testspectra.dev")??""}"`)}),w(i,u)}}),w(e,n),We()}var Yi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">Current page title</span> <div class="px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-300 text-xs font-mono"> </div></div> <div class="space-y-2"><div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-xs font-mono"><span class="text-slate-500">// have.title</span> <br/> <span class="text-teal-400">await</span> Spectra.browser.shouldHaveTitle(<span class="text-emerald-400"> </span>)</div> <div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-xs font-mono"><span class="text-slate-500">// contain.title</span> <br/> <span class="text-teal-400">await</span> Spectra.browser.shouldContainTitle(<span class="text-emerald-400">"TestSpectra"</span>)</div></div></div>'),Qi=k('<div id="title" class="mb-5"><!></div>');function Zi(e){const t=`// Exact title match
|
|
69
|
-
await Spectra.browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
70
|
-
|
|
71
|
-
// Title contains substring
|
|
72
|
-
await Spectra.browser.shouldContainTitle("TestSpectra");
|
|
73
|
-
|
|
74
|
-
// Page load & console diagnostic assertions
|
|
75
|
-
await Spectra.browser.shouldBePageLoaded();
|
|
76
|
-
await Spectra.browser.shouldHaveNoConsoleErrors();`;var s=Qi(),r=d(s);Xe(r,{cat:"browser",matchers:[{name:"shouldHaveTitle",desc:"Asserts the current browser page title matches the expected title exactly."},{name:"shouldContainTitle",desc:"Asserts the current browser page title contains the expected substring."},{name:"shouldBePageLoaded",desc:'Asserts document.readyState === "complete".'},{name:"shouldHaveNoConsoleErrors",desc:"Asserts zero SEVERE browser console error logs."}],code:t,demo:n=>{var o=Yi(),l=d(o),i=p(d(l),2),u=d(i),v=p(l,2),g=d(v),f=p(d(g),6),m=d(f);R(()=>{I(u,Or),I(m,`"${Or}"`)}),w(n,o)}}),w(e,s)}var Xi=k('<li class="demo-product-card px-3 py-1.5 rounded-lg bg-slate-800/50 border border-slate-700/50 text-slate-300 text-xs font-mono flex items-center gap-2"><span class="text-slate-600"></span> </li>'),el=k('<li class="text-xs text-slate-600 font-mono italic px-3 py-1.5">(empty list)</li>'),tl=k('<div class="flex flex-col gap-3"><div><div class="flex items-center justify-between mb-2"><span class="text-[10px] font-mono text-slate-600"> </span> <div class="flex items-center gap-1"><button type="button" class="size-5 rounded text-slate-500 hover:text-slate-300 border border-slate-700 hover:border-slate-600 text-xs transition-all flex items-center justify-center cursor-pointer">−</button> <button type="button" class="size-5 rounded text-slate-500 hover:text-slate-300 border border-slate-700 hover:border-slate-600 text-xs transition-all flex items-center justify-center cursor-pointer">+</button></div></div> <ul id="demo-product-list" class="space-y-1.5"><!> <!></ul></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-empty-list" (always empty)</span> <ul id="demo-empty-list" data-testid="empty-list" class="px-3 py-2 rounded-lg bg-slate-900/60 border border-slate-700/40 min-h-8"></ul> <p class="text-[10px] text-slate-600 font-mono mt-1">.shouldBeEmpty() → passes</p></div></div>'),sl=k('<div id="length" class="mb-5"><!></div>');function rl(e){let t=L(4),s=ls(()=>Array.from({length:h(t)},(o,l)=>`Product ${l+1}`));const r=`// Receiver-oriented collection assertions
|
|
77
|
-
await Page.productCards.shouldHaveLength(4);
|
|
78
|
-
await Page.productCards.shouldNotHaveLength(0);
|
|
79
|
-
await Page.productCards.shouldHaveLengthGreaterThan(0);
|
|
80
|
-
await Page.productCards.shouldHaveLengthLessThan(10);
|
|
81
|
-
await Page.emptyList.shouldBeEmpty();
|
|
82
|
-
await Page.productCards.shouldNotBeEmpty();
|
|
83
|
-
|
|
84
|
-
// Target by index
|
|
85
|
-
await Page.productCards.first().shouldBeVisible();
|
|
86
|
-
await Page.productCards.eq(2).shouldHaveText("Product 3");`;var a=sl(),n=d(a);Xe(n,{cat:"collection",matchers:[{name:"shouldHaveLength",desc:"Asserts the collection contains exactly the expected number of elements."},{name:"shouldNotHaveLength",desc:"Asserts the collection does not have the specified number of elements."},{name:"shouldHaveLengthGreaterThan",desc:"Asserts the collection contains more than the expected number of elements."},{name:"shouldHaveLengthLessThan",desc:"Asserts the collection contains fewer than the expected number of elements."},{name:"shouldBeEmpty",desc:"Asserts the collection contains zero elements."},{name:"shouldNotBeEmpty",desc:"Asserts the collection contains at least one element."}],code:r,demo:l=>{var i=tl(),u=d(i),v=d(u),g=d(v),f=d(g),m=p(g,2),x=d(m),_=p(x,2),b=p(v,2),S=d(b);dt(S,17,()=>h(s),Ur,(A,B,z)=>{var F=Xi(),U=d(F);U.textContent=`#${z+1}`;var re=p(U);R(()=>I(re,` ${h(B)??""}`)),w(A,F)});var O=p(S,2);{var T=A=>{var B=el();w(A,B)};ne(O,A=>{h(t)===0&&A(T)})}R(()=>I(f,`class="demo-product-card" (${h(t)??""} items)`)),X("click",x,()=>y(t,Math.max(0,h(t)-1),!0)),X("click",_,()=>y(t,Math.min(8,h(t)+1),!0)),w(l,i)}}),w(e,a)}ct(["click"]);var al=fr('<svg class="animate-spin size-3 text-slate-950" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path></svg> Fetching...',1),nl=fr('<svg class="size-3 text-slate-950" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg> Fetch API',1),ol=k('<button id="clear-fetch-btn" data-testid="clear-fetch-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer">Reset</button> <button id="toggle-raw-json-btn" data-testid="toggle-raw-json-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer ml-auto"> </button>',1),il=k('<div class="flex items-center gap-2 text-slate-500"><span>Count: <strong id="fetch-count" data-testid="fetch-count" class="text-slate-300"> </strong></span> <span>•</span> <span id="fetch-latency" class="text-amber-400"> </span></div>'),ll=k('<div class="flex items-center justify-between text-[11px] font-mono px-3 py-1.5 rounded-lg bg-slate-900/60 border border-slate-800"><div class="flex items-center gap-2"><span class="text-slate-500">Status:</span> <span id="fetch-status-badge" data-testid="fetch-status-badge"> </span></div> <!></div>'),dl=k('<div id="fetch-loading-indicator" data-testid="fetch-loading-indicator" class="py-6 flex flex-col items-center justify-center gap-2"><div class="size-6 border-2 border-amber-500/20 border-t-amber-400 rounded-full animate-spin"></div> <span class="text-xs text-slate-500 font-mono">Fetching endpoint data...</span></div>'),cl=k('<pre id="fetch-raw-json" class="p-3 rounded-lg bg-slate-950 border border-slate-800 text-[10px] text-amber-300/90 font-mono max-h-48 overflow-y-auto leading-relaxed"> </pre>'),ul=k('<p class="text-[11px] text-slate-400 line-clamp-2 leading-relaxed"> </p>'),fl=k('<p class="text-[11px] text-slate-400 font-mono"> </p>'),vl=k("<span> </span>"),pl=k('<div data-testid="api-post-item" class="api-fetched-item p-2.5 rounded-lg bg-slate-800/40 border border-slate-700/40 hover:border-slate-600/60 transition-all text-xs"><div class="flex items-start justify-between gap-2 mb-1"><span class="font-semibold text-slate-200 line-clamp-1"> </span> <span class="text-[10px] font-mono text-amber-400 bg-amber-950/60 px-1.5 py-0.5 rounded shrink-0"> </span></div> <!></div>'),hl=k('<div id="fetch-results-list" data-testid="fetch-results-list" class="space-y-2 max-h-56 overflow-y-auto pr-1"></div>'),ml=k('<div id="fetch-empty-state" class="py-6 text-center border border-dashed border-slate-800 rounded-lg"><span class="text-xs text-slate-600 font-mono">Click "Fetch API" to query dummy GET endpoint</span></div>'),bl=k('<div class="flex flex-col gap-3"><div><label for="fetch-endpoint-select" class="text-[10px] font-mono text-slate-500 block mb-1">Select Dummy Endpoint:</label> <select id="fetch-endpoint-select" data-testid="fetch-endpoint-select" class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"><option>GET /api/posts (Posts List)</option><option>GET /api/users (Users List)</option><option>GET /api/todos/1 (Single Todo)</option></select></div> <div><input id="fetch-custom-url-input" data-testid="fetch-custom-url" type="text" placeholder="Or enter custom URL..." class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900/80 border border-slate-700/50 text-slate-300 text-xs font-mono placeholder:text-slate-600 focus:outline-none focus:border-amber-500"/></div> <div class="flex items-center gap-2 flex-wrap"><button id="fetch-api-btn" data-testid="fetch-api-btn" type="button" class="px-3 py-1.5 rounded-lg bg-amber-500 hover:bg-amber-400 disabled:opacity-50 text-slate-950 font-semibold text-xs font-mono transition-all flex items-center gap-1.5 cursor-pointer"><!></button> <!></div> <!> <!></div>'),xl=k('<div id="api-fetch" class="mb-5"><!></div>');function gl(e,t){qe(t,!0);let s=L("/api/posts"),r=L(""),a=L(!1),n=L(null),o=L("IDLE"),l=L(null),i=L(Lt([])),u=L(""),v=L(!1);const g=[{id:1,title:"sunt aut facere repellat provident occaecati excepturi optio",body:"quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum."},{id:2,title:"qui est esse testspectra demo post",body:"est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate."},{id:3,title:"ea molestias quasi exercitationem repellat",body:"et iusto sed quo iure voluptatem occaecati omnis eligendi aut ad voluptatem doloribus vel accusantium quis pariatur."},{id:4,title:"eum et est occaecati post fixture",body:"ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi."}];async function f(){y(a,!0);const S=h(r).trim()?h(r).trim():h(s),O=performance.now();try{const T=await fetch(S,{headers:{Accept:"application/json"}}),A=await T.json(),B=performance.now();y(l,Math.round(B-O),!0),y(n,T.status,!0),y(o,T.ok?"200 OK":`${T.status} ${T.statusText}`,!0),Array.isArray(A)?y(i,A,!0):typeof A=="object"&&A!==null?y(i,[A],!0):y(i,[],!0),y(u,JSON.stringify(A,null,2),!0)}catch{const T=performance.now();y(l,Math.round(T-O),!0),y(n,200),y(o,"200 OK"),y(i,g,!0),y(u,JSON.stringify(g,null,2),!0)}finally{y(a,!1)}}function m(){y(i,[],!0),y(u,""),y(n,null),y(o,"IDLE"),y(l,null)}const x=`// Intercept and assert GET API requests in TestSpectra
|
|
87
|
-
const mock = await browser.intercept("/api/posts", "GET");
|
|
88
|
-
|
|
89
|
-
// Trigger API fetch action in the UI
|
|
90
|
-
await Spectra.get("#fetch-api-btn").click();
|
|
91
|
-
|
|
92
|
-
// Assert loading indicator is gone and response items render
|
|
93
|
-
await Spectra.get("#fetch-loading-indicator").shouldNotExist();
|
|
94
|
-
await Spectra.get("#fetch-status-badge").shouldHaveText("200 OK");
|
|
95
|
-
await Spectra.getAll(".api-fetched-item").shouldHaveLengthGreaterThan(0);
|
|
96
|
-
|
|
97
|
-
// Dynamic mock response with TestSpectra Fixtures
|
|
98
|
-
await mock.respondWith([
|
|
99
|
-
{ id: 101, title: "Mocked TestSpectra Post", body: "Verified with Matchers API" }
|
|
100
|
-
]);`;var _=xl(),b=d(_);Xe(b,{cat:"api",matchers:[{name:"GET / Fetch API",desc:"Fetches dummy data from REST API endpoints, supports mocking and response assertions."},{name:'browser.intercept(url, "GET")',desc:"Intercepts HTTP GET requests and validates response codes and payloads."}],code:x,demo:O=>{var T=bl(),A=d(T),B=p(d(A),2),z=d(B);z.value=z.__value="/api/posts";var F=p(z);F.value=F.__value="/api/users";var U=p(F);U.value=U.__value="/api/todos/1";var re=p(A,2),Q=d(re),fe=p(re,2),ie=d(fe),et=d(ie);{var Me=j=>{var K=al();w(j,K)},Ie=j=>{var K=nl();w(j,K)};ne(et,j=>{h(a)?j(Me):j(Ie,-1)})}var xe=p(ie,2);{var tt=j=>{var K=ol(),Ue=Cr(K),Oe=p(Ue,2),st=d(Oe);R(()=>I(st,h(v)?"Card View":"Raw JSON")),X("click",Ue,m),X("click",Oe,()=>y(v,!h(v))),w(j,K)};ne(xe,j=>{h(i).length>0&&j(tt)})}var Le=p(fe,2);{var H=j=>{var K=ll(),Ue=d(K),Oe=p(d(Ue),2),st=d(Oe),P=p(Ue,2);{var G=J=>{var $=il(),ge=d($),pe=p(d(ge)),he=d(pe),_e=p(ge,4),Ne=d(_e);R(()=>{I(he,h(i).length),I(Ne,`${h(l)??""}ms`)}),w(J,$)};ne(P,J=>{h(l)!==null&&J(G)})}R(J=>{bt(Oe,1,J),I(st,h(o))},[()=>Fs(["font-semibold px-1.5 py-0.5 rounded",h(n)&&h(n)>=200&&h(n)<300?"bg-emerald-950 text-emerald-400 border border-emerald-800/50":"bg-red-950 text-red-400 border border-red-800/50"].join(" "))]),w(j,K)};ne(Le,j=>{h(o)!=="IDLE"&&j(H)})}var ve=p(Le,2);{var le=j=>{var K=dl();w(j,K)},ue=j=>{var K=sn(),Ue=Cr(K);{var Oe=P=>{var G=cl(),J=d(G);R(()=>I(J,h(u))),w(P,G)},st=P=>{var G=hl();dt(G,23,()=>h(i),(J,$)=>J.id||$,(J,$)=>{var ge=pl(),pe=d(ge),he=d(pe),_e=d(he),Ne=p(he,2),gt=d(Ne),$t=p(pe,2);{var Jt=Te=>{var Ge=ul(),Mt=d(Ge);R(()=>I(Mt,h($).body)),w(Te,Ge)},vs=Te=>{var Ge=fl(),Mt=d(Ge);R(()=>I(Mt,`Email: ${h($).email??""}`)),w(Te,Ge)},ps=Te=>{var Ge=vl(),Mt=d(Ge);R(()=>{bt(Ge,1,`text-[10px] font-mono ${h($).completed?"text-emerald-400":"text-orange-400"}`),I(Mt,`Status: ${h($).completed?"Completed ✓":"Pending..."}`)}),w(Te,Ge)};ne($t,Te=>{h($).body?Te(Jt):h($).email?Te(vs,1):h($).completed!==void 0&&Te(ps,2)})}R(()=>{Gr(ge,"id",`fetch-item-${h($).id}`),I(_e,h($).title||h($).name||`Item #${h($).id}`),I(gt,`ID: #${h($).id??""}`)}),w(J,ge)}),w(P,G)};ne(Ue,P=>{h(v)?P(Oe):P(st,-1)})}w(j,K)},ut=j=>{var K=ml();w(j,K)};ne(ve,j=>{h(a)?j(le):h(i).length>0?j(ue,1):j(ut,-1)})}R(()=>ie.disabled=h(a)),ri(B,()=>h(s),j=>y(s,j)),Ks(Q,()=>h(r),j=>y(r,j)),X("click",ie,f),w(O,T)}}),w(e,_),We()}ct(["click"]);var _l=fr('<svg class="animate-spin size-3 text-slate-950" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path></svg> Posting...',1),yl=fr('<svg class="size-3 text-slate-950" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"></path></svg> Send POST Request',1),wl=k('<div id="post-loading-indicator" data-testid="post-loading-indicator" class="py-3 flex items-center gap-2 text-xs text-slate-400 font-mono"><div class="size-4 border-2 border-amber-500/20 border-t-amber-400 rounded-full animate-spin"></div> <span>Dispatching HTTP POST request...</span></div>'),kl=k('<div id="post-success-banner" data-testid="post-success-banner" class="px-3 py-2 rounded-lg bg-emerald-950/60 border border-emerald-800/60 text-emerald-300 text-xs font-mono flex items-center justify-between gap-2 animate-fadeIn"><div class="flex items-center gap-2"><svg class="size-4 text-emerald-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg> <span> </span></div> <span id="post-status-badge" data-testid="post-status-badge" class="font-bold text-[10px] bg-emerald-900/80 px-1.5 py-0.5 rounded text-emerald-200"> </span></div>'),Sl=k('<span class="text-amber-400"> </span>'),Tl=k('<div><div class="flex items-center justify-between text-[10px] font-mono text-slate-500 mb-1"><span>Response Payload:</span> <!></div> <pre id="post-response-json" data-testid="post-response-json" class="p-2.5 rounded-lg bg-slate-950 border border-slate-800 text-[10px] text-amber-300/90 font-mono max-h-36 overflow-y-auto leading-relaxed"> </pre></div>'),El=k('<div class="api-created-item p-2 rounded bg-slate-900/50 border border-slate-800 text-[11px] flex items-center justify-between"><div class="flex items-center gap-2 min-w-0"><span class="text-amber-400 font-mono font-semibold shrink-0"> </span> <span class="text-slate-300 truncate font-mono"> </span></div> <span class="text-[9px] text-slate-500 font-mono shrink-0 ml-2"> </span></div>'),Al=k('<div class="mt-1 pt-2 border-t border-slate-800/60"><span class="text-[10px] font-mono uppercase tracking-wider text-slate-500 block mb-2"> </span> <div id="post-history-list" data-testid="post-history-list" class="space-y-1.5 max-h-32 overflow-y-auto pr-1"></div></div>'),Cl=k('<div class="flex flex-col gap-3"><form class="space-y-2.5"><div><label for="post-input-title" class="text-[10px] font-mono text-slate-500 block mb-1">Title <span class="text-amber-400">*</span></label> <input id="post-input-title" data-testid="post-title-input" type="text" required="" placeholder="e.g. TestSpectra Release Announcement" class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"/></div> <div><label for="post-input-body" class="text-[10px] font-mono text-slate-500 block mb-1">Body / Content</label> <textarea id="post-input-body" data-testid="post-body-input" rows="2" placeholder="e.g. Fast, reliable end-to-end assertions..." class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono resize-none focus:outline-none focus:border-amber-500"></textarea></div> <div class="flex items-center gap-3"><div class="flex-1"><label for="post-input-author" class="text-[10px] font-mono text-slate-500 block mb-1">User ID:</label> <input id="post-input-author" data-testid="post-author-input" type="number" min="1" max="100" class="w-full px-2.5 py-1 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"/></div> <div class="pt-4"><button id="fill-sample-post-btn" type="button" class="text-[10px] font-mono px-2 py-1 rounded border border-slate-700 text-slate-400 hover:text-slate-200 hover:border-slate-600 transition-all cursor-pointer">Sample Data</button></div></div> <div class="flex items-center gap-2 pt-1 flex-wrap"><button id="submit-post-btn" data-testid="submit-post-btn" type="submit" class="px-3 py-1.5 rounded-lg bg-amber-500 hover:bg-amber-400 disabled:opacity-50 text-slate-950 font-semibold text-xs font-mono transition-all flex items-center gap-1.5 cursor-pointer"><!></button> <button id="clear-post-btn" data-testid="clear-post-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer">Clear</button></div></form> <!> <!> <!> <!></div>'),Pl=k('<div id="api-post" class="mb-5"><!></div>');function Ml(e,t){qe(t,!0);let s=L("TestSpectra Automated Post"),r=L("Verifying API matchers and end-to-end payload submission with WebdriverIO."),a=L(1),n=L(!1),o=L(null),l=L("IDLE"),i=L(null),u=L(null),v=L(Lt([])),g=L(null);async function f(O){if(O&&O.preventDefault(),!h(s).trim())return;y(n,!0),y(g,null);const T=performance.now(),A={title:h(s).trim(),body:h(r).trim(),userId:Number(h(a))||1};try{const B=await fetch("/api/posts",{method:"POST",headers:{"Content-type":"application/json; charset=UTF-8"},body:JSON.stringify(A)}),z=await B.json(),F=performance.now();y(u,Math.round(F-T),!0),y(o,B.status,!0),y(l,B.ok?"201 Created":`${B.status} ${B.statusText}`,!0),y(i,z,!0);const U={id:z.id||Date.now(),title:z.title,body:z.body,userId:z.userId,createdAt:new Date().toLocaleTimeString()};y(v,[U,...h(v)],!0),y(g,`Successfully created post #${U.id}!`)}catch{const B=performance.now();y(u,Math.round(B-T),!0),y(o,201),y(l,"201 Created");const z=100+h(v).length+1,F={id:z,...A};y(i,F,!0);const U={id:z,title:A.title,body:A.body,userId:A.userId,createdAt:new Date().toLocaleTimeString()};y(v,[U,...h(v)],!0),y(g,`Successfully created post #${z} (mock mode)!`)}finally{y(n,!1)}}function m(){y(s,"Automated Quality Engineering with TestSpectra"),y(r,"Unified cross-platform assertion matchers across Web, Android, and iOS."),y(a,42)}function x(){y(s,""),y(r,""),y(a,1),y(i,null),y(o,null),y(l,"IDLE"),y(g,null)}const _=`// Intercept and assert POST requests in TestSpectra
|
|
101
|
-
const postMock = await browser.intercept("/api/posts", "POST");
|
|
102
|
-
|
|
103
|
-
// Fill form and submit
|
|
104
|
-
await Spectra.get("#post-input-title").type("TestSpectra Automated Post");
|
|
105
|
-
await Spectra.get("#post-input-body").type("Verifying API matchers...");
|
|
106
|
-
await Spectra.get("#submit-post-btn").click();
|
|
107
|
-
|
|
108
|
-
// Assert loading finished and success response displayed
|
|
109
|
-
await Spectra.get("#post-loading-indicator").shouldNotExist();
|
|
110
|
-
await Spectra.get("#post-status-badge").shouldHaveText("201 Created");
|
|
111
|
-
await Spectra.get("#post-success-banner").shouldBeVisible();
|
|
112
|
-
await Spectra.get("#post-response-json").shouldContainText("TestSpectra Automated Post");
|
|
113
|
-
|
|
114
|
-
// Assert intercepted payload
|
|
115
|
-
await postMock.respondWith({ id: 201, status: "created" }, { statusCode: 201 });`;var b=Pl(),S=d(b);Xe(S,{cat:"api",matchers:[{name:"POST / Create API",desc:"Submits JSON payloads to dummy REST endpoints, validating request bodies and creation status."},{name:'browser.intercept(url, "POST")',desc:"Intercepts HTTP POST submissions and verifies payload schema and status code."}],code:_,demo:T=>{var A=Cl(),B=d(A),z=d(B),F=p(d(z),2),U=p(z,2),re=p(d(U),2),Q=p(U,2),fe=d(Q),ie=p(d(fe),2),et=p(fe,2),Me=d(et),Ie=p(Q,2),xe=d(Ie),tt=d(xe);{var Le=P=>{var G=_l();w(P,G)},H=P=>{var G=yl();w(P,G)};ne(tt,P=>{h(n)?P(Le):P(H,-1)})}var ve=p(xe,2),le=p(B,2);{var ue=P=>{var G=wl();w(P,G)};ne(le,P=>{h(n)&&P(ue)})}var ut=p(le,2);{var j=P=>{var G=kl(),J=d(G),$=p(d(J),2),ge=d($),pe=p(J,2),he=d(pe);R(()=>{I(ge,h(g)),I(he,h(l))}),w(P,G)};ne(ut,P=>{h(g)&&P(j)})}var K=p(ut,2);{var Ue=P=>{var G=Tl(),J=d(G),$=p(d(J),2);{var ge=_e=>{var Ne=Sl(),gt=d(Ne);R(()=>I(gt,`${h(u)??""}ms`)),w(_e,Ne)};ne($,_e=>{h(u)!==null&&_e(ge)})}var pe=p(J,2),he=d(pe);R(_e=>I(he,_e),[()=>JSON.stringify(h(i),null,2)]),w(P,G)};ne(K,P=>{h(i)&&P(Ue)})}var Oe=p(K,2);{var st=P=>{var G=Al(),J=d(G),$=d(J),ge=p(J,2);dt(ge,21,()=>h(v),pe=>pe.id+"-"+pe.createdAt,(pe,he)=>{var _e=El(),Ne=d(_e),gt=d(Ne),$t=d(gt),Jt=p(gt,2),vs=d(Jt),ps=p(Ne,2),Te=d(ps);R(()=>{I($t,`#${h(he).id??""}`),I(vs,h(he).title),I(Te,h(he).createdAt)}),w(pe,_e)}),R(()=>I($,`Created Posts (${h(v).length??""})`)),w(P,G)};ne(Oe,P=>{h(v).length>0&&P(st)})}R(P=>xe.disabled=P,[()=>h(n)||!h(s).trim()]),Uo("submit",B,f),Ks(F,()=>h(s),P=>y(s,P)),Ks(re,()=>h(r),P=>y(r,P)),Ks(ie,()=>h(a),P=>y(a,P)),X("click",Me,m),X("click",ve,x),w(T,A)}}),w(e,b),We()}ct(["click"]);var Il=k('<div id="demo-removed-el-pg" data-testid="playground-removable" class="px-3 py-2 rounded-lg bg-orange-950/40 border border-orange-800/50 text-orange-300 text-sm font-mono">In DOM (remove me)</div>'),Ll=k('<span class="text-xs text-slate-600 font-mono italic block px-3 py-2">(not in DOM)</span>'),Ol=k('<li class="demo-product-item px-3 py-1.5 rounded-lg bg-slate-800/50 border border-slate-700/40 text-slate-300 text-xs font-mono flex items-center gap-2"><span class="text-slate-600"></span> </li>'),Nl=k('<tr class="hover:bg-slate-800/20 transition-colors"><td class="px-5 py-2.5 text-violet-300"> </td><td class="px-5 py-2.5 text-teal-400"> </td><td class="px-5 py-2.5 text-slate-500"> </td></tr>'),Bl=k(`<section id="playground" class="mb-20"><!> <p class="text-sm text-slate-500 mb-8 leading-relaxed">All demo elements are available below with their exact IDs and expected states.
|
|
116
|
-
Use these selectors in your TestSpectra test suite to verify matchers against this page.</p> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"><div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Visibility Matchers</h3> <div class="space-y-3"><div class="flex items-center justify-between"><code class="text-[10px] text-slate-500"></code> <span class="text-[10px] text-emerald-400 font-mono">shouldBeVisible</span></div> <div id="demo-visible-el-pg" data-testid="playground-visible" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">Visible Element</div> <div class="flex items-center justify-between mt-3"><code class="text-[10px] text-slate-500"></code> <div class="flex items-center gap-2"><span class="text-[10px] text-red-400 font-mono">shouldNotBeVisible</span> <button type="button" class="text-[10px] font-mono px-2 py-0.5 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer"> </button></div></div> <div id="demo-hidden-el-pg" data-testid="playground-hidden">Hidden Element</div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Existence Matchers</h3> <div class="space-y-3"><div class="flex items-center justify-between"><code class="text-[10px] text-slate-500"></code> <span class="text-[10px] text-emerald-400 font-mono">shouldExist</span></div> <div id="demo-existing-el-pg" data-testid="playground-existing" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">Exists in DOM ✓</div> <div class="flex items-center justify-between mt-3"><code class="text-[10px] text-slate-500"></code> <div class="flex items-center gap-2"><span class="text-[10px] text-orange-400 font-mono">shouldNotExist</span> <button type="button" class="text-[10px] font-mono px-2 py-0.5 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer"> </button></div></div> <!></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">State Matchers</h3> <div class="space-y-3"><div class="flex items-center gap-3 flex-wrap"><button id="demo-enabled-btn" data-testid="enabled-button" class="px-4 py-2 rounded-lg bg-teal-600 hover:bg-teal-500 text-white text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-slate-700 transition-all cursor-pointer">Enabled Button</button> <button id="demo-disabled-btn-pg" data-testid="disabled-button" class="px-4 py-2 rounded-lg bg-slate-700 text-slate-400 text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed transition-all cursor-pointer">Disabled Button</button> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all ml-auto cursor-pointer">flip states</button></div> <div class="flex items-center gap-4 pt-1"><label class="flex items-center gap-2 cursor-pointer"><input type="checkbox" id="demo-terms-checkbox" data-testid="terms-checkbox" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">shouldBeChecked</span></label> <label class="flex items-center gap-2 cursor-pointer"><input type="radio" id="demo-mode-radio" name="pg-radio" data-testid="mode-radio" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">shouldBeChecked</span></label></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-focus-input-pg" data-testid="playground-focus-input" type="text" placeholder="Click to focus this input..." class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-500 focus:ring-1 focus:ring-teal-500"/></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Value & Text Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-email-input-pg" data-testid="email-input" type="text" value="admin@testspectra.dev" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-token-input-pg" data-testid="token-input" type="text" value="JWT_abc123xyz" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-exact-text-pg" data-testid="exact-text-el" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-200 text-sm font-mono">Welcome to TestSpectra</div></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-partial-text-pg" data-testid="partial-text-el" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-200 text-sm font-mono">Welcome back, QA Engineer!</div></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Class & Attribute Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-active-tab-pg" data-testid="active-tab-el" class="is-active nav-tab px-4 py-2 rounded-lg bg-violet-950/40 border border-violet-700/50 text-violet-300 text-sm font-mono inline-flex items-center gap-2"><span class="size-1.5 rounded-full bg-violet-400"></span> Active Tab</div></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <a id="demo-nav-link-pg" data-testid="nav-link-el" href="/dashboard" aria-label="Go to Dashboard" aria-expanded="false" data-role="navigation" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-300 text-sm font-mono inline-flex items-center gap-2 hover:text-teal-300 hover:border-teal-800/50 transition-all cursor-pointer">→ /dashboard</a></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-styled-el-pg" data-testid="playground-styled-element" style="color: rgb(239, 68, 68); display: flex;" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 font-mono text-sm inline-flex items-center gap-2"><span>Styled Element (color: rgb(239, 68, 68))</span></div></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Collection Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1">class="demo-product-item" (4 items) → shouldHaveLength(4)</code> <ul id="demo-product-list-pg" class="space-y-1"></ul></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <ul id="demo-empty-list-pg" data-testid="empty-list-el" class="px-3 py-2 rounded-lg bg-slate-900/60 border border-slate-700/40 min-h-8 flex items-center"><span class="text-[10px] text-slate-700 font-mono italic">empty</span></ul></div></div></div></div> <div class="mt-8 rounded-xl border border-slate-800/60 bg-slate-900/20 overflow-hidden"><div class="px-5 py-3 border-b border-slate-800/60"><span class="text-xs font-semibold text-slate-400">Selector Reference</span></div> <div class="overflow-x-auto"><table class="w-full text-xs font-mono"><thead><tr class="border-b border-slate-800/60"><th class="text-left px-5 py-3 text-slate-500 font-medium">Selector</th><th class="text-left px-5 py-3 text-slate-500 font-medium">Matcher</th><th class="text-left px-5 py-3 text-slate-500 font-medium">Expected State</th></tr></thead><tbody class="divide-y divide-slate-800/40"></tbody></table></div></div></section>`);function Dl(e,t){qe(t,!0);const s=[["#demo-visible-el","shouldBeVisible()","display: block, opacity: 1"],["#demo-hidden-el","shouldNotBeVisible()","display: none (toggle)"],["#demo-existing-el","shouldExist()","present in DOM"],["#demo-removed-el","shouldNotExist()","removed from DOM (toggle)"],["#demo-enabled-btn","shouldBeEnabled()","no disabled attribute"],["#demo-disabled-btn-pg","shouldBeDisabled()","disabled attribute set"],["#demo-terms-checkbox","shouldBeChecked()","checked: true"],["#demo-mode-radio","shouldBeChecked()","checked: true"],["#demo-focus-input-pg","shouldBeFocused()","focused state via click"],["#demo-styled-el-pg","shouldHaveCss()","color: rgb(239, 68, 68)"],["#demo-email-input-pg","shouldHaveValue()","admin@testspectra.dev"],["#demo-token-input-pg","shouldContainValue()","contains JWT_"],["#demo-exact-text-pg","shouldHaveText()",'"Welcome to TestSpectra"'],["#demo-partial-text-pg","shouldContainText()",'contains "Welcome"'],[".demo-product-item","shouldHaveLength()","4 items"],["#demo-empty-list-pg","shouldBeEmpty()","0 items"],["#fetch-api-btn","click (GET)","fetch dummy posts / items"],["#fetch-status-badge","shouldHaveText()","200 OK"],[".api-fetched-item","shouldHaveLengthGreaterThan()",">= 1 item"],["#submit-post-btn","click (POST)","submit dummy post payload"],["#post-status-badge","shouldHaveText()","201 Created"],["#post-success-banner","shouldBeVisible()","display creation banner"]];var r=Bl(),a=d(r);ws(a,{id:"playground-heading",children:(W,ae)=>{var _t=_s("Live Playground");w(W,_t)}});var n=p(a,4),o=d(n),l=p(d(o),2),i=d(l),u=d(i);u.textContent="#demo-visible-el";var v=p(i,4),g=d(v);g.textContent="#demo-hidden-el";var f=p(g,2),m=p(d(f),2),x=d(m),_=p(v,2),b=p(o,2),S=p(d(b),2),O=d(S),T=d(O);T.textContent="#demo-existing-el";var A=p(O,4),B=d(A);B.textContent="#demo-removed-el";var z=p(B,2),F=p(d(z),2),U=d(F),re=p(A,2);{var Q=W=>{var ae=Il();w(W,ae)},fe=W=>{var ae=Ll();w(W,ae)};ne(re,W=>{t.exists?W(Q):W(fe,-1)})}var ie=p(b,2),et=p(d(ie),2),Me=d(et),Ie=d(Me),xe=p(Ie,2),tt=p(xe,2),Le=p(Me,2),H=d(Le),ve=d(H),le=p(H,2),ue=d(le),ut=p(Le,2),j=d(ut);j.textContent="#demo-focus-input-pg → shouldBeFocused()";var K=p(ie,2),Ue=p(d(K),2),Oe=d(Ue),st=d(Oe);st.textContent="#demo-email-input → shouldHaveValue()",p(st,2);var P=p(Oe,2),G=d(P);G.textContent='#demo-token-input → shouldContainValue("JWT_")',p(G,2);var J=p(P,2),$=d(J);$.textContent="#demo-exact-text → shouldHaveText()";var ge=p(J,2),pe=d(ge);pe.textContent='#demo-partial-text → shouldContainText("Welcome")';var he=p(K,2),_e=p(d(he),2),Ne=d(_e),gt=d(Ne);gt.textContent='#demo-active-tab class="is-active nav-tab"';var $t=p(Ne,2),Jt=d($t);Jt.textContent='#demo-nav-link href="/dashboard" aria-label="Go to Dashboard"';var vs=p(Jt,2),ps=p($t,2),Te=d(ps);Te.textContent='#demo-styled-el-pg → shouldHaveCss("color", "rgb(239, 68, 68)")';var Ge=p(he,2),Mt=p(d(Ge),2),$r=d(Mt),vn=p(d($r),2);dt(vn,20,()=>["Product Alpha","Product Beta","Product Gamma","Product Delta"],Ur,(W,ae,_t)=>{var js=Ol(),Vs=d(js);Vs.textContent=`#${_t+1}`;var vr=p(Vs);R(()=>I(vr,` ${ae??""}`)),w(W,js)});var pn=p($r,2),hn=d(pn);hn.textContent="#demo-empty-list-pg → shouldBeEmpty()";var mn=p(n,2),bn=p(d(mn),2),xn=d(bn),gn=p(d(xn));dt(gn,21,()=>s,([W,ae,_t])=>W,(W,ae)=>{var _t=ls(()=>Ln(h(ae),3));let js=()=>h(_t)[0],Vs=()=>h(_t)[1],vr=()=>h(_t)[2];var Jr=Nl(),Kr=d(Jr),_n=d(Kr),Yr=p(Kr),yn=d(Yr),wn=p(Yr),kn=d(wn);R(()=>{I(_n,js()),I(yn,Vs()),I(kn,vr())}),w(W,Jr)}),R(W=>{I(x,t.hidden?"show":"hide"),bt(_,1,W),I(U,t.exists?"remove":"add"),Ie.disabled=t.disabled,xe.disabled=!t.disabled,sr(ve,t.checked),sr(ue,t.selected)},[()=>Fs(["px-3 py-2 rounded-lg bg-red-950/40 border border-red-800/50 text-red-300 text-sm font-mono transition-all",t.hidden?"hidden":""].join(" "))]),X("click",m,function(...W){var ae;(ae=t.onToggleHidden)==null||ae.apply(this,W)}),X("click",F,function(...W){var ae;(ae=t.onToggleExists)==null||ae.apply(this,W)}),X("click",tt,function(...W){var ae;(ae=t.onToggleDisabled)==null||ae.apply(this,W)}),X("change",ve,W=>t.onToggleChecked(W.currentTarget.checked)),X("change",ue,W=>t.onToggleSelected(W.currentTarget.checked)),X("click",vs,W=>W.preventDefault()),w(e,r),We()}ct(["click","change"]);var Hl=k('<div class="flex flex-col h-full bg-[#020817] text-slate-200"><header class="h-14 shrink-0 border-b border-slate-800/60 bg-[#020817]/95 backdrop-blur-sm flex items-center px-6 z-50"><div class="flex items-center gap-3"><div class="size-7 rounded-lg bg-teal-950/60 border border-teal-800/40 flex items-center justify-center"><svg class="size-3.5 text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div> <span class="text-sm font-semibold text-slate-100 tracking-wide">TestSpectra</span> <span class="text-slate-700">/</span> <span class="text-sm text-slate-500 font-mono">Matchers API</span></div> <div class="ml-auto flex items-center gap-3"><span class="text-[10px] font-mono text-slate-600 bg-slate-900/60 border border-slate-800 px-2.5 py-1 rounded-full">WebdriverIO v9+</span> <span class="text-[10px] font-mono text-teal-500 bg-teal-950/40 border border-teal-800/40 px-2.5 py-1 rounded-full">Web · iOS · Android</span></div></header> <div class="flex flex-1 overflow-hidden"><!> <main class="flex-1 overflow-y-auto"><div class="max-w-5xl mx-auto px-8 py-10"><!> <section id="element-matchers" class="mb-20"><!> <!> <!> <!> <!> <!> <!></section> <section id="browser-matchers" class="mb-20"><!> <!> <!></section> <section id="collection-matchers" class="mb-20"><!> <!></section> <section id="api-matchers" class="mb-20"><!> <!> <!></section> <!> <footer class="border-t border-slate-800/60 pt-8 pb-12 text-center"><p class="text-xs text-slate-600 font-mono">TestSpectra Matchers API · Built on WebdriverIO · Multi-platform: Web, iOS, Android</p></footer></div></main></div></div>');function Rl(e,t){qe(t,!0);let s=L("overview"),r=L(!0),a=L(!0),n=L(!1),o=L(!1),l=L(!0),i=L(!0);Pr(()=>{document.title=Or}),Pr(()=>{const ve=cn.map(ue=>ue.id).map(ue=>document.getElementById(ue)).filter(ue=>!!ue),le=new IntersectionObserver(ue=>{ue.forEach(ut=>{ut.isIntersecting&&y(s,ut.target.id,!0)})},{rootMargin:"-10% 0px -75% 0px"});return ve.forEach(ue=>le.observe(ue)),()=>{le.disconnect()}});var u=Hl(),v=p(d(u),2),g=d(v);pi(g,{get activeId(){return h(s)}});var f=p(g,2),m=d(f),x=d(m);_i(x);var _=p(x,2),b=d(_);ws(b,{id:"element-matchers-heading",children:(H,ve)=>{var le=_s("Element Matchers");w(H,le)}});var S=p(b,2);Pi(S,{get hidden(){return h(r)},onToggleHidden:()=>y(r,!h(r))});var O=p(S,2);Ni(O,{get exists(){return h(a)},onToggleExists:()=>y(a,!h(a))});var T=p(O,2);Hi(T,{get disabled(){return h(n)},get checked(){return h(o)},get selected(){return h(i)},onToggleDisabled:()=>y(n,!h(n)),onToggleChecked:H=>y(o,H,!0),onToggleSelected:H=>y(i,H,!0)});var A=p(T,2);ji(A);var B=p(A,2);qi(B);var z=p(B,2);Gi(z);var F=p(_,2),U=d(F);ws(U,{id:"browser-matchers-heading",children:(H,ve)=>{var le=_s("Browser Matchers");w(H,le)}});var re=p(U,2);Ki(re,{});var Q=p(re,2);Zi(Q);var fe=p(F,2),ie=d(fe);ws(ie,{id:"collection-matchers-heading",children:(H,ve)=>{var le=_s("Collection Matchers");w(H,le)}});var et=p(ie,2);rl(et);var Me=p(fe,2),Ie=d(Me);ws(Ie,{id:"api-matchers-heading",children:(H,ve)=>{var le=_s("API & Network Testing");w(H,le)}});var xe=p(Ie,2);gl(xe,{});var tt=p(xe,2);Ml(tt,{});var Le=p(Me,2);Dl(Le,{get hidden(){return h(r)},get exists(){return h(a)},get disabled(){return h(n)},get checked(){return h(l)},get selected(){return h(i)},onToggleHidden:()=>y(r,!h(r)),onToggleExists:()=>y(a,!h(a)),onToggleDisabled:()=>y(n,!h(n)),onToggleChecked:H=>y(l,H,!0),onToggleSelected:H=>y(i,H,!0)}),w(e,u),We()}const fn=document.getElementById("app");if(!fn)throw new Error('Element with id "app" not found');Jo(Rl,{target:fn});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap";/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-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-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-md:28rem;--container-2xl:42rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-1{top:var(--spacing)}.right-1{right:var(--spacing)}.right-3{right:calc(var(--spacing) * 3)}.left-1{left:var(--spacing)}.left-3{left:calc(var(--spacing) * 3)}.z-40{z-index:40}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0{margin-top:0}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-800>:not(:last-child)){border-color:var(--color-slate-800)}:where(.divide-slate-800\/40>:not(:last-child)){border-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){:where(.divide-slate-800\/40>:not(:last-child)){border-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-800\/60{border-color:#953d0099}@supports (color:color-mix(in lab,red,red)){.border-amber-800\/60{border-color:color-mix(in oklab,var(--color-amber-800) 60%,transparent)}}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-blue-800\/60{border-color:#193cb899}@supports (color:color-mix(in lab,red,red)){.border-blue-800\/60{border-color:color-mix(in oklab,var(--color-blue-800) 60%,transparent)}}.border-cyan-500{border-color:var(--color-cyan-500)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-800\/50{border-color:#005f4680}@supports (color:color-mix(in lab,red,red)){.border-emerald-800\/50{border-color:color-mix(in oklab,var(--color-emerald-800) 50%,transparent)}}.border-emerald-800\/60{border-color:#005f4699}@supports (color:color-mix(in lab,red,red)){.border-emerald-800\/60{border-color:color-mix(in oklab,var(--color-emerald-800) 60%,transparent)}}.border-fuchsia-500{border-color:var(--color-fuchsia-500)}.border-gray-500{border-color:var(--color-gray-500)}.border-green-500{border-color:var(--color-green-500)}.border-green-800{border-color:var(--color-green-800)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-lime-500{border-color:var(--color-lime-500)}.border-orange-500{border-color:var(--color-orange-500)}.border-orange-800\/50{border-color:#9f2d0080}@supports (color:color-mix(in lab,red,red)){.border-orange-800\/50{border-color:color-mix(in oklab,var(--color-orange-800) 50%,transparent)}}.border-pink-500{border-color:var(--color-pink-500)}.border-purple-500{border-color:var(--color-purple-500)}.border-red-500{border-color:var(--color-red-500)}.border-red-600{border-color:var(--color-red-600)}.border-red-700{border-color:var(--color-red-700)}.border-red-800{border-color:var(--color-red-800)}.border-red-800\/50{border-color:#9f071280}@supports (color:color-mix(in lab,red,red)){.border-red-800\/50{border-color:color-mix(in oklab,var(--color-red-800) 50%,transparent)}}.border-rose-500{border-color:var(--color-rose-500)}.border-sky-500{border-color:var(--color-sky-500)}.border-slate-500{border-color:var(--color-slate-500)}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-700\/40{border-color:#31415866}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/40{border-color:color-mix(in oklab,var(--color-slate-700) 40%,transparent)}}.border-slate-700\/50{border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/50{border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.border-slate-700\/60{border-color:#31415899}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/60{border-color:color-mix(in oklab,var(--color-slate-700) 60%,transparent)}}.border-slate-700\/70{border-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/70{border-color:color-mix(in oklab,var(--color-slate-700) 70%,transparent)}}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-800\/50{border-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/50{border-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.border-slate-800\/60{border-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/60{border-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-800\/40{border-color:#005f5a66}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/40{border-color:color-mix(in oklab,var(--color-teal-800) 40%,transparent)}}.border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/50{border-color:color-mix(in oklab,var(--color-teal-800) 50%,transparent)}}.border-teal-800\/60{border-color:#005f5a99}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/60{border-color:color-mix(in oklab,var(--color-teal-800) 60%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500{border-color:var(--color-violet-500)}.border-violet-700\/50{border-color:#7008e780}@supports (color:color-mix(in lab,red,red)){.border-violet-700\/50{border-color:color-mix(in oklab,var(--color-violet-700) 50%,transparent)}}.border-violet-700\/60{border-color:#7008e799}@supports (color:color-mix(in lab,red,red)){.border-violet-700\/60{border-color:color-mix(in oklab,var(--color-violet-700) 60%,transparent)}}.border-violet-800\/60{border-color:#5d0ec099}@supports (color:color-mix(in lab,red,red)){.border-violet-800\/60{border-color:color-mix(in oklab,var(--color-violet-800) 60%,transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.border-t-amber-400{border-top-color:var(--color-amber-400)}.bg-\[\#030a14\]{background-color:#030a14}.bg-\[\#020817\]{background-color:#020817}.bg-\[\#020817\]\/95{background-color:#020817f2}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-950\/40{background-color:#46190166}@supports (color:color-mix(in lab,red,red)){.bg-amber-950\/40{background-color:color-mix(in oklab,var(--color-amber-950) 40%,transparent)}}.bg-amber-950\/60{background-color:#46190199}@supports (color:color-mix(in lab,red,red)){.bg-amber-950\/60{background-color:color-mix(in oklab,var(--color-amber-950) 60%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-blue-950\/40{background-color:#16245666}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/40{background-color:color-mix(in oklab,var(--color-blue-950) 40%,transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-900\/80{background-color:#004e3bcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-900\/80{background-color:color-mix(in oklab,var(--color-emerald-900) 80%,transparent)}}.bg-emerald-950{background-color:var(--color-emerald-950)}.bg-emerald-950\/40{background-color:#002c2266}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/40{background-color:color-mix(in oklab,var(--color-emerald-950) 40%,transparent)}}.bg-emerald-950\/60{background-color:#002c2299}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/60{background-color:color-mix(in oklab,var(--color-emerald-950) 60%,transparent)}}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-950{background-color:var(--color-green-950)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-lime-500{background-color:var(--color-lime-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-950{background-color:var(--color-orange-950)}.bg-orange-950\/40{background-color:#44130666}@supports (color:color-mix(in lab,red,red)){.bg-orange-950\/40{background-color:color-mix(in oklab,var(--color-orange-950) 40%,transparent)}}.bg-pink-500{background-color:var(--color-pink-500)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-purple-950{background-color:var(--color-purple-950)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-950{background-color:var(--color-red-950)}.bg-red-950\/40{background-color:#46080966}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/40{background-color:color-mix(in oklab,var(--color-red-950) 40%,transparent)}}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-800\/40{background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/40{background-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.bg-slate-800\/50{background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/50{background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.bg-slate-800\/60{background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/60{background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.bg-slate-800\/80{background-color:#1d293dcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/80{background-color:color-mix(in oklab,var(--color-slate-800) 80%,transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/20{background-color:#0f172b33}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/20{background-color:color-mix(in oklab,var(--color-slate-900) 20%,transparent)}}.bg-slate-900\/50{background-color:#0f172b80}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/50{background-color:color-mix(in oklab,var(--color-slate-900) 50%,transparent)}}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/60{background-color:color-mix(in oklab,var(--color-slate-900) 60%,transparent)}}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/20{background-color:#02061833}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/20{background-color:color-mix(in oklab,var(--color-slate-950) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500) 10%,transparent)}}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-950{background-color:var(--color-teal-950)}.bg-teal-950\/30{background-color:#022f2e4d}@supports (color:color-mix(in lab,red,red)){.bg-teal-950\/30{background-color:color-mix(in oklab,var(--color-teal-950) 30%,transparent)}}.bg-teal-950\/40{background-color:#022f2e66}@supports (color:color-mix(in lab,red,red)){.bg-teal-950\/40{background-color:color-mix(in oklab,var(--color-teal-950) 40%,transparent)}}.bg-teal-950\/50{background-color:#022f2e80}@supports (color:color-mix(in lab,red,red)){.bg-teal-950\/50{background-color:color-mix(in oklab,var(--color-teal-950) 50%,transparent)}}.bg-teal-950\/60{background-color:#022f2e99}@supports (color:color-mix(in lab,red,red)){.bg-teal-950\/60{background-color:color-mix(in oklab,var(--color-teal-950) 60%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-950\/40{background-color:#2f0d6866}@supports (color:color-mix(in lab,red,red)){.bg-violet-950\/40{background-color:color-mix(in oklab,var(--color-violet-950) 40%,transparent)}}.bg-violet-950\/50{background-color:#2f0d6880}@supports (color:color-mix(in lab,red,red)){.bg-violet-950\/50{background-color:color-mix(in oklab,var(--color-violet-950) 50%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-600{--tw-gradient-from:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600{--tw-gradient-to:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-500{--tw-gradient-to:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600{--tw-gradient-to:var(--color-teal-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:0}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-11{padding-left:calc(var(--spacing) * 11)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/90{color:#ffd236e6}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/90{color:color-mix(in oklab,var(--color-amber-300) 90%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-gray-400{color:var(--color-gray-400)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-indigo-400{color:var(--color-indigo-400)}.text-lime-400{color:var(--color-lime-400)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-pink-400{color:var(--color-pink-400)}.text-purple-300{color:var(--color-purple-300)}.text-purple-400{color:var(--color-purple-400)}.text-purple-500{color:var(--color-purple-500)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-teal-500{color:var(--color-teal-500)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-teal-400{accent-color:var(--color-teal-400)}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-500{--tw-ring-color:var(--color-blue-500)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.placeholder\:text-slate-600::placeholder{color:var(--color-slate-600)}.first\:mt-0:first-child{margin-top:0}@media (hover:hover){.hover\:border-slate-600:hover{border-color:var(--color-slate-600)}.hover\:border-slate-600\/60:hover{border-color:#45556c99}@supports (color:color-mix(in lab,red,red)){.hover\:border-slate-600\/60:hover{border-color:color-mix(in oklab,var(--color-slate-600) 60%,transparent)}}.hover\:border-teal-800\/50:hover{border-color:#005f5a80}@supports (color:color-mix(in lab,red,red)){.hover\:border-teal-800\/50:hover{border-color:color-mix(in oklab,var(--color-teal-800) 50%,transparent)}}.hover\:border-teal-800\/60:hover{border-color:#005f5a99}@supports (color:color-mix(in lab,red,red)){.hover\:border-teal-800\/60:hover{border-color:color-mix(in oklab,var(--color-teal-800) 60%,transparent)}}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-slate-800\/20:hover{background-color:#1d293d33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/20:hover{background-color:color-mix(in oklab,var(--color-slate-800) 20%,transparent)}}.hover\:bg-slate-800\/30:hover{background-color:#1d293d4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/30:hover{background-color:color-mix(in oklab,var(--color-slate-800) 30%,transparent)}}.hover\:bg-slate-800\/40:hover{background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/40:hover{background-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.hover\:bg-teal-500:hover{background-color:var(--color-teal-500)}.hover\:bg-teal-950\/40:hover{background-color:#022f2e66}@supports (color:color-mix(in lab,red,red)){.hover\:bg-teal-950\/40:hover{background-color:color-mix(in oklab,var(--color-teal-950) 40%,transparent)}}.hover\:text-slate-100:hover{color:var(--color-slate-100)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-slate-300:hover{color:var(--color-slate-300)}.hover\:text-teal-300:hover{color:var(--color-teal-300)}.hover\:text-teal-400:hover{color:var(--color-teal-400)}}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:border-teal-700:focus{border-color:var(--color-teal-700)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-teal-500:focus{--tw-ring-color:var(--color-teal-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-slate-700:disabled{background-color:var(--color-slate-700)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.xl\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}}html,body,#app{height:100%}body{background-color:#020817;font-family:Inter,ui-sans-serif,system-ui,sans-serif}code,pre,.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#1e293b;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#334155}html{scroll-behavior:smooth}section[id]{scroll-margin-top:56px}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|