@testspectra/cli 1.0.70 → 1.1.0-rc.0
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/LICENSE.md +48 -0
- package/README.md +36 -270
- package/bin/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-BGllUp7o.js +140 -0
- package/demo-app/assets/index-BhlW-eXG.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/__tests__/doctor.test.d.ts +1 -0
- package/dist/commands/__tests__/doctor.test.js +39 -0
- package/dist/commands/__tests__/init.test.d.ts +1 -0
- package/dist/commands/__tests__/init.test.js +148 -0
- package/dist/commands/__tests__/license.test.d.ts +1 -0
- package/dist/commands/__tests__/license.test.js +13 -0
- package/dist/commands/__tests__/refactor.test.d.ts +1 -0
- package/dist/commands/__tests__/refactor.test.js +64 -0
- package/dist/commands/__tests__/run-e2e.test.d.ts +1 -0
- package/dist/commands/__tests__/run-e2e.test.js +422 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +277 -0
- package/dist/commands/__tests__/watch.test.d.ts +1 -0
- package/dist/commands/__tests__/watch.test.js +155 -0
- package/dist/commands/add.js +86 -85
- package/dist/commands/demo.js +21 -11
- package/dist/commands/devices.d.ts +14 -2
- package/dist/commands/devices.js +44 -34
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.js +43 -264
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +206 -196
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.js +59 -0
- package/dist/commands/license.d.ts +4 -0
- package/dist/commands/license.js +30 -0
- package/dist/commands/lint.d.ts +5 -0
- package/dist/commands/lint.js +55 -0
- package/dist/commands/refactor.d.ts +9 -0
- package/dist/commands/refactor.js +172 -0
- package/dist/commands/run.d.ts +23 -2
- package/dist/commands/run.js +321 -111
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.js +28 -0
- package/dist/commands/sync-types.d.ts +4 -0
- package/dist/commands/sync-types.js +14 -0
- package/dist/commands/update.js +39 -43
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +46 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -54
- package/dist/config/schema.js +41 -35
- package/dist/generator/__tests__/tsconfig-isolation.test.d.ts +1 -0
- package/dist/generator/__tests__/tsconfig-isolation.test.js +278 -0
- package/dist/generator/__tests__/type-generator.test.d.ts +1 -0
- package/dist/generator/__tests__/type-generator.test.js +386 -0
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.js +2 -0
- package/dist/generator/tsconfig-generator.d.ts +27 -0
- package/dist/generator/tsconfig-generator.js +384 -0
- package/dist/generator/type-generator.d.ts +36 -0
- package/dist/generator/type-generator.js +644 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +151 -51
- package/dist/lifecycle/__tests__/lifecycle-engine.test.d.ts +1 -0
- package/dist/lifecycle/__tests__/lifecycle-engine.test.js +290 -0
- package/dist/lifecycle/hook-discovery.d.ts +24 -0
- package/dist/lifecycle/hook-discovery.js +60 -0
- package/dist/lifecycle/hook-dispatcher.d.ts +34 -0
- package/dist/lifecycle/hook-dispatcher.js +190 -0
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.js +3 -0
- package/dist/lifecycle/parallel-grouping.d.ts +27 -0
- package/dist/lifecycle/parallel-grouping.js +151 -0
- package/dist/linter/__tests__/anonymous-export.test.d.ts +1 -0
- package/dist/linter/__tests__/anonymous-export.test.js +184 -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 +66 -0
- package/dist/linter/extractor.js +235 -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 +595 -0
- package/dist/linter/types.d.ts +28 -0
- package/dist/linter/types.js +1 -0
- package/dist/mobile/__tests__/android-device-e2e.test.d.ts +1 -0
- package/dist/mobile/__tests__/android-device-e2e.test.js +53 -0
- package/dist/mobile/__tests__/device-pool.test.d.ts +1 -0
- package/dist/mobile/__tests__/device-pool.test.js +97 -0
- package/dist/mobile/device-pool.d.ts +23 -0
- package/dist/mobile/device-pool.js +1 -0
- package/dist/mobile/index.d.ts +1 -0
- package/dist/mobile/index.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.d.ts +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +873 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +50 -0
- package/dist/refactor/refactor-engine.js +587 -0
- package/dist/reporter/__tests__/semantic-formatter.test.d.ts +1 -0
- package/dist/reporter/__tests__/semantic-formatter.test.js +73 -0
- package/dist/reporter/semantic-formatter.d.ts +6 -0
- package/dist/reporter/semantic-formatter.js +191 -0
- package/dist/reporter/summary-view.d.ts +12 -0
- package/dist/reporter/summary-view.js +19 -0
- package/dist/reporter/terminal-stream.d.ts +32 -0
- package/dist/reporter/terminal-stream.js +82 -0
- package/dist/reporter/types.d.ts +2 -0
- package/dist/reporter/types.js +1 -0
- package/dist/runner/bridge.d.ts +10 -5
- package/dist/runner/bridge.js +101 -45
- package/dist/runner/reporter.d.ts +32 -2
- package/dist/runner/reporter.js +423 -13
- package/dist/server/demo.js +43 -44
- package/dist/types/generator.d.ts +1 -17
- package/dist/types/generator.js +1 -443
- 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 +134 -0
- package/dist/utils/demo-server.d.ts +5 -0
- package/dist/utils/demo-server.js +46 -36
- package/package.json +24 -13
- package/templates/default/CLAUDE.md +12 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +12 -3
- package/templates/default/page-objects/MatchersPage/mobile.ts +53 -17
- package/templates/default/page-objects/MatchersPage/web.ts +17 -2
- package/templates/default/page-objects/NavigationPage/mobile.ts +11 -2
- package/templates/default/page-objects/NavigationPage/web.ts +1 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +28 -18
- package/templates/default/page-objects/PlaygroundPage/web.ts +4 -2
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -0
- 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 +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +33 -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 +10 -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/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +7 -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 +17 -3
- 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 +9 -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 +9 -4
- 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 +9 -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 +9 -3
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +27 -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 +27 -6
- package/templates/default/specs/ElementMatchers/suite.md +2 -1
- 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 +4 -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 +4 -4
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -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 +3 -3
- package/templates/default/spectra.config.ts +21 -15
- 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/steps/togglePlaygroundStates/mobile.step.ts +3 -1
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +3 -3
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +4 -2
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/default/tsconfig.json +3 -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 +4306 -0
- package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
- package/templates/nx/.nx/workspace-data/file-map.json +452 -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 +14389 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +6 -4
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +24 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/suite.md +9 -0
- 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 +17 -3
- 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 +15 -5
- 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 +9 -4
- 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 +9 -3
- 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 +27 -6
- 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 +4 -4
- 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 +3 -3
- package/templates/nx/pnpm-lock.yaml +6663 -0
- package/templates/nx/pnpm-workspace.yaml +2 -1
- package/templates/nx/shared/testing/fixtures/apiData.json +24 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +13 -1
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +85 -17
- 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 +4 -2
- package/templates/nx/shared/testing/project.json +19 -0
- 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 +3 -3
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/nx/spectra.config.ts +19 -13
- package/templates/nx/tsconfig.json +3 -1
- package/demo-app/assets/index-DAUlrHTr.css +0 -1
- package/demo-app/assets/index-DN2Kb0A8.js +0 -100
- package/dist/index.cjs +0 -101
- package/dist/plugin.cjs +0 -575
- package/dist/plugin.d.ts +0 -16
- package/dist/plugin.js +0 -184
- package/dist/step/index.d.ts +0 -6
- package/dist/step/index.js +0 -6
- package/dist/step/matchers.d.ts +0 -14
- package/dist/step/matchers.js +0 -114
- package/dist/step/proto.d.ts +0 -46
- package/dist/step/proto.js +0 -114
- package/dist/step/runner/collection.d.ts +0 -13
- package/dist/step/runner/collection.js +0 -51
- package/dist/step/runner/single.d.ts +0 -21
- package/dist/step/runner/single.js +0 -138
- package/dist/step/spectra.d.ts +0 -34
- package/dist/step/spectra.js +0 -156
- package/dist/step/types.d.ts +0 -32
- package/dist/step/types.js +0 -5
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- package/templates/default/tsconfig.spectra.android.json +0 -46
- package/templates/default/tsconfig.spectra.ios.json +0 -46
- package/templates/default/tsconfig.spectra.json +0 -22
- package/templates/default/tsconfig.spectra.web.json +0 -53
- package/templates/nx/fixtures/playgroundData.json +0 -7
- package/templates/nx/global-hooks/after/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/after/web.hook.ts +0 -3
- package/templates/nx/global-hooks/before/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/before/web.hook.ts +0 -3
- package/templates/nx/page-objects/MatchersPage/mobile.ts +0 -21
- package/templates/nx/page-objects/MatchersPage/web.ts +0 -23
- package/templates/nx/page-objects/NavigationPage/mobile.ts +0 -5
- package/templates/nx/page-objects/NavigationPage/web.ts +0 -8
- package/templates/nx/page-objects/PlaygroundPage/mobile.ts +0 -26
- package/templates/nx/page-objects/PlaygroundPage/web.ts +0 -29
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +0 -3
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +0 -12
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +0 -5
- package/templates/nx/specs/BrowserContext/suite.md +0 -9
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +0 -6
- package/templates/nx/specs/ContentMatchers/suite.md +0 -9
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +0 -5
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +0 -8
- package/templates/nx/specs/ElementMatchers/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/suite.md +0 -9
- package/templates/nx/specs/Playground/TC-0001-form-controls/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0001-form-controls/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0001-form-controls/web.test.ts +0 -6
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/web.test.ts +0 -6
- package/templates/nx/specs/Playground/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/suite.md +0 -9
- package/templates/nx/support/actions/fillCredentials/mobile.action.ts +0 -4
- package/templates/nx/support/actions/fillCredentials/web.action.ts +0 -4
- package/templates/nx/support/steps/togglePlaygroundStates/mobile.step.ts +0 -3
- package/templates/nx/support/steps/togglePlaygroundStates/step.md +0 -7
- package/templates/nx/support/steps/togglePlaygroundStates/web.step.ts +0 -5
- package/templates/nx/support/steps/verifyPlaygroundState/mobile.step.ts +0 -4
- package/templates/nx/support/steps/verifyPlaygroundState/step.md +0 -7
- package/templates/nx/support/steps/verifyPlaygroundState/web.step.ts +0 -6
- package/templates/nx/tsconfig.spectra.android.json +0 -39
- package/templates/nx/tsconfig.spectra.ios.json +0 -39
- package/templates/nx/tsconfig.spectra.json +0 -25
- package/templates/nx/tsconfig.spectra.shared.json +0 -25
- package/templates/nx/tsconfig.spectra.web.json +0 -45
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
var Sr=Object.defineProperty;var Qa=e=>{throw TypeError(e)};var Tr=(e,t,s)=>t in e?Sr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Pe=(e,t,s)=>Tr(e,typeof t!="symbol"?t+"":t,s),ha=(e,t,s)=>t.has(e)||Qa("Cannot "+s);var u=(e,t,s)=>(ha(e,t,"read from private field"),s?s.call(e):t.get(e)),B=(e,t,s)=>t.has(e)?Qa("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),N=(e,t,s,a)=>(ha(e,t,"write to private field"),a?a.call(e,s):t.set(e,s),s),z=(e,t,s)=>(ha(e,t,"access private method"),s);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))a(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&a(o)}).observe(document,{childList:!0,subtree:!0});function s(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerPolicy&&(r.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?r.credentials="include":n.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(n){if(n.ep)return;n.ep=!0;const r=s(n);fetch(n.href,r)}})();const vn=!1;var Da=Array.isArray,Er=Array.prototype.indexOf,Ys=Array.prototype.includes,oa=Array.from,Cr=Object.defineProperty,ks=Object.getOwnPropertyDescriptor,Ar=Object.getOwnPropertyDescriptors,Pr=Object.prototype,Mr=Array.prototype,pn=Object.getPrototypeOf,Za=Object.isExtensible;const hn=()=>{};function Ir(e){for(var t=0;t<e.length;t++)e[t]()}function mn(){var e,t,s=new Promise((a,n)=>{e=a,t=n});return{promise:s,resolve:e,reject:t}}function Nr(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const s=[];for(const a of e)if(s.push(a),s.length===t)break;return s}const ue=2,os=4,ia=8,bn=1<<24,tt=16,at=32,Pt=64,ya=128,qe=512,oe=1024,de=2048,ct=4096,he=8192,Ue=16384,us=32768,Xa=1<<25,zt=65536,Qs=1<<17,Lr=1<<18,fs=1<<19,Or=1<<20,lt=1<<25,qt=65536,Zs=1<<21,Zt=1<<22,Ct=1<<23,Ss=Symbol("$state"),Br=Symbol(""),zs=Symbol("attributes"),wa=Symbol("class"),Dr=Symbol("style"),ms=Symbol("text"),qs=Symbol("form reset"),la=new class extends Error{constructor(){super(...arguments);Pe(this,"name","StaleReactionError");Pe(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Hr(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Rr(e,t,s){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Fr(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function jr(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Vr(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Wr(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function zr(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function qr(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Ur(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Gr(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const $r=1,Jr=2,xn=4,Kr=8,Yr=16,Qr=1,Zr=2,re=Symbol("uninitialized"),Xr="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 gn(e){return e===this.v}function ao(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function _n(e){return!ao(e,this.v)}let da=!1,no=!1;function ro(){da=!0}let ie=null;function is(e){ie=e}function Se(e,t=!1,s){ie={p:ie,i:!1,c:null,e:null,s:e,x:null,r:j,l:da&&!t?{s:null,u:null,$:[]}:null}}function Te(e){var t=ie,s=t.e;if(s!==null){t.e=null;for(var a of s)Vn(a)}return t.i=!0,ie=t.p,{}}function Ds(){return!da||ie!==null&&ie.l===null}let Nt=[];function yn(){var e=Nt;Nt=[],Ir(e)}function At(e){if(Nt.length===0&&!Es){var t=Nt;queueMicrotask(()=>{t===Nt&&yn()})}Nt.push(e)}function oo(){for(;Nt.length>0;)yn()}function wn(e){var t=j;if(t===null)return H.f|=Ct,e;if(!(t.f&us)&&!(t.f&os))throw e;Tt(e,t)}function Tt(e,t){if(!(t!==null&&t.f&Ue)){for(;t!==null;){if(t.f&ya){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 ee(e,t){e.f=e.f&io|t}function Ha(e){e.f&qe||e.deps===null?ee(e,oe):ee(e,ct)}function kn(e){if(e!==null)for(const t of e)!(t.f&ue)||!(t.f&qt)||(t.f^=qt,kn(t.deps))}function Sn(e,t,s){e.f&de?t.add(e):e.f&ct&&s.add(e),kn(e.deps),ee(e,oe)}function lo(e){let t=0,s=Gt(0),a;return()=>{Wa()&&(p(s),Wn(()=>(t===0&&(a=er(()=>e(()=>Cs(s)))),t+=1,()=>{At(()=>{t-=1,t===0&&(a==null||a(),a=void 0,Cs(s))})})))}}var co=zt|fs;function uo(e,t,s,a){new fo(e,t,s,a)}var je,Ba,Ve,Bt,_e,We,pe,Ie,ft,Dt,kt,Xt,Is,Ns,vt,aa,X,vo,po,ho,ka,Us,Gs,Sa,Ta;class fo{constructor(t,s,a,n){B(this,X);Pe(this,"parent");Pe(this,"is_pending",!1);Pe(this,"transform_error");B(this,je);B(this,Ba,null);B(this,Ve);B(this,Bt);B(this,_e);B(this,We,null);B(this,pe,null);B(this,Ie,null);B(this,ft,null);B(this,Dt,0);B(this,kt,0);B(this,Xt,!1);B(this,Is,new Set);B(this,Ns,new Set);B(this,vt,null);B(this,aa,lo(()=>(N(this,vt,Gt(u(this,Dt))),()=>{N(this,vt,null)})));var r;N(this,je,t),N(this,Ve,s),N(this,Bt,o=>{var l=j;l.b=this,l.f|=ya,a(o)}),this.parent=j.b,this.transform_error=n??((r=this.parent)==null?void 0:r.transform_error)??(o=>o),N(this,_e,ua(()=>{z(this,X,ka).call(this)},co))}defer_effect(t){Sn(t,u(this,Is),u(this,Ns))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!u(this,Ve).pending}update_pending_count(t,s){z(this,X,Sa).call(this,t,s),N(this,Dt,u(this,Dt)+t),!(!u(this,vt)||u(this,Xt))&&(N(this,Xt,!0),At(()=>{N(this,Xt,!1),u(this,vt)&&ds(u(this,vt),u(this,Dt))}))}get_effect_pending(){return u(this,aa).call(this),p(u(this,vt))}error(t){if(!u(this,Ve).onerror&&!u(this,Ve).failed)throw t;E!=null&&E.is_fork?(u(this,We)&&E.skip_effect(u(this,We)),u(this,pe)&&E.skip_effect(u(this,pe)),u(this,Ie)&&E.skip_effect(u(this,Ie)),E.oncommit(()=>{z(this,X,Ta).call(this,t)})):z(this,X,Ta).call(this,t)}}je=new WeakMap,Ba=new WeakMap,Ve=new WeakMap,Bt=new WeakMap,_e=new WeakMap,We=new WeakMap,pe=new WeakMap,Ie=new WeakMap,ft=new WeakMap,Dt=new WeakMap,kt=new WeakMap,Xt=new WeakMap,Is=new WeakMap,Ns=new WeakMap,vt=new WeakMap,aa=new WeakMap,X=new WeakSet,vo=function(){try{N(this,We,ze(()=>u(this,Bt).call(this,u(this,je))))}catch(t){this.error(t)}},po=function(t){const s=u(this,Ve).failed;s&&N(this,Ie,ze(()=>{s(u(this,je),()=>t,()=>()=>{})}))},ho=function(){const t=u(this,Ve).pending;t&&(this.is_pending=!0,N(this,pe,ze(()=>t(u(this,je)))),At(()=>{var s=N(this,ft,document.createDocumentFragment()),a=bt();s.append(a),N(this,We,z(this,X,Gs).call(this,()=>ze(()=>u(this,Bt).call(this,a)))),u(this,kt)===0&&(u(this,je).before(s),N(this,ft,null),Vt(u(this,pe),()=>{N(this,pe,null)}),z(this,X,Us).call(this,E))}))},ka=function(){try{if(this.is_pending=this.has_pending_snippet(),N(this,kt,0),N(this,Dt,0),N(this,We,ze(()=>{u(this,Bt).call(this,u(this,je))})),u(this,kt)>0){var t=N(this,ft,document.createDocumentFragment());Ua(u(this,We),t);const s=u(this,Ve).pending;N(this,pe,ze(()=>s(u(this,je))))}else z(this,X,Us).call(this,E)}catch(s){this.error(s)}},Us=function(t){this.is_pending=!1,t.transfer_effects(u(this,Is),u(this,Ns))},Gs=function(t){var s=j,a=H,n=ie;ut(u(this,_e)),Ge(u(this,_e)),is(u(this,_e).ctx);try{return Ut.ensure(),t()}catch(r){return wn(r),null}finally{ut(s),Ge(a),is(n)}},Sa=function(t,s){var a;if(!this.has_pending_snippet()){this.parent&&z(a=this.parent,X,Sa).call(a,t,s);return}N(this,kt,u(this,kt)+t),u(this,kt)===0&&(z(this,X,Us).call(this,s),u(this,pe)&&Vt(u(this,pe),()=>{N(this,pe,null)}),u(this,ft)&&(u(this,je).before(u(this,ft)),N(this,ft,null)))},Ta=function(t){u(this,We)&&(ke(u(this,We)),N(this,We,null)),u(this,pe)&&(ke(u(this,pe)),N(this,pe,null)),u(this,Ie)&&(ke(u(this,Ie)),N(this,Ie,null));var s=u(this,Ve).onerror;let a=u(this,Ve).failed;var n=!1,r=!1;const o=()=>{if(n){so();return}n=!0,r&&Gr(),u(this,Ie)!==null&&Vt(u(this,Ie),()=>{N(this,Ie,null)}),z(this,X,Gs).call(this,()=>{z(this,X,ka).call(this)})},l=i=>{try{r=!0,s==null||s(i,o),r=!1}catch(c){Tt(c,u(this,_e)&&u(this,_e).parent)}a&&N(this,Ie,z(this,X,Gs).call(this,()=>{try{return ze(()=>{var c=j;c.b=this,c.f|=ya,a(u(this,je),()=>i,()=>o)})}catch(c){return Tt(c,u(this,_e).parent),null}}))};At(()=>{var i;try{i=this.transform_error(t)}catch(c){Tt(c,u(this,_e)&&u(this,_e).parent);return}i!==null&&typeof i=="object"&&typeof i.then=="function"?i.then(l,c=>Tt(c,u(this,_e)&&u(this,_e).parent)):l(i)})};function mo(e,t,s,a){const n=Ds()?Ra:En;var r=e.filter(m=>!m.settled),o=t.map(n);if(s.length===0&&r.length===0){a(o);return}var l=j,i=bo(),c=r.length===1?r[0].promise:r.length>1?Promise.all(r.map(m=>m.promise)):null;function h(m){if(!(l.f&Ue)){i();try{a([...o,...m])}catch(b){Tt(b,l)}Xs()}}var x=Tn();if(s.length===0){c.then(()=>h([])).finally(x);return}function v(){Promise.all(s.map(m=>xo(m))).then(h).catch(m=>Tt(m,l)).finally(x)}c?c.then(()=>{i(),v(),Xs()}):v()}function bo(){var e=j,t=H,s=ie,a=E;return function(r=!0){ut(e),Ge(t),is(s),r&&!(e.f&Ue)&&(a==null||a.activate(),a==null||a.apply())}}function Xs(e=!0){ut(null),Ge(null),is(null),e&&(E==null||E.deactivate())}function Tn(){var e=j,t=e.b,s=E,a=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,s),s.increment(a,e),()=>{t==null||t.update_pending_count(-1,s),s.decrement(a,e)}}function Ra(e){var t=ue|de;return j!==null&&(j.f|=fs),{ctx:ie,deps:null,effects:null,equals:gn,f:t,fn:e,reactions:null,rv:0,v:re,wv:0,parent:j,ac:null}}const bs=Symbol("obsolete");function xo(e,t,s){let a=j;a===null&&Hr();var n=void 0,r=Gt(re),o=!H,l=new Set;return Do(()=>{var m,b;var i=j,c=mn();n=c.promise;try{Promise.resolve(e()).then(c.resolve,_=>{_!==la&&c.reject(_)}).finally(Xs)}catch(_){c.reject(_),Xs()}var h=E;if(o){if(i.f&us)var x=Tn();if((m=a.b)!=null&&m.is_rendered())(b=h.async_deriveds.get(i))==null||b.reject(bs);else for(const _ of l.values())_.reject(bs);l.add(c),h.async_deriveds.set(i,c)}const v=(_,g=void 0)=>{x==null||x(),l.delete(c),g!==bs&&(h.activate(),g?(r.f|=Ct,ds(r,g)):(r.f&Ct&&(r.f^=Ct),ds(r,_)),h.deactivate())};c.promise.then(v,_=>v(null,_||"unknown"))}),za(()=>{for(const i of l)i.reject(bs)}),new Promise(i=>{function c(h){function x(){h===n?i(r):c(n)}h.then(x,x)}c(n)})}function ls(e){const t=Ra(e);return $n(t),t}function En(e){const t=Ra(e);return t.equals=_n,t}function go(e){var t=e.effects;if(t!==null){e.effects=null;for(var s=0;s<t.length;s+=1)ke(t[s])}}function Fa(e){var t,s=j,a=e.parent;if(!Mt&&a!==null&&e.v!==re&&a.f&(Ue|he))return eo(),e.v;ut(a);try{e.f&=~qt,go(e),t=Qn(e)}finally{ut(s)}return t}function Cn(e){var t=Fa(e);if(!e.equals(t)&&(e.wv=Kn(),(!(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))){ee(e,oe);return}Mt||(ce!==null?(Wa()||E!=null&&E.is_fork)&&ce.set(e,t):Ha(e))}function _o(e){var t,s;if(e.effects!==null)for(const a of e.effects)(a.teardown||a.ac)&&((t=a.teardown)==null||t.call(a),(s=a.ac)==null||s.abort(la),a.fn!==null&&(a.teardown=hn),a.ac=null,Ps(a,0),qa(a))}function An(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&cs(t)}let ma=null,Kt=null,E=null,Ts=null,ce=null,Ea=null,Es=!1,ba=!1,Qt=null,$s=null;var en=0;let yo=1;var es,St,Ht,ts,ss,as,pt,ns,ye,Ls,ht,Xe,ot,rs,Rt,U,Ca,xs,Aa,Pn,Mn,Yt,wo,gs;const na=class na{constructor(){B(this,U);Pe(this,"id",yo++);B(this,es,!1);Pe(this,"linked",!0);B(this,St,null);B(this,Ht,null);Pe(this,"async_deriveds",new Map);Pe(this,"current",new Map);Pe(this,"previous",new Map);B(this,ts,new Set);B(this,ss,new Set);B(this,as,0);B(this,pt,new Map);B(this,ns,null);B(this,ye,[]);B(this,Ls,[]);B(this,ht,new Set);B(this,Xe,new Set);B(this,ot,new Map);B(this,rs,new Set);Pe(this,"is_fork",!1);B(this,Rt,!1);Kt===null?ma=Kt=this:(N(Kt,Ht,this),N(this,St,Kt)),Kt=this}skip_effect(t){u(this,ot).has(t)||u(this,ot).set(t,{d:[],m:[]}),u(this,rs).delete(t)}unskip_effect(t,s=a=>this.schedule(a)){var a=u(this,ot).get(t);if(a){u(this,ot).delete(t);for(var n of a.d)ee(n,de),s(n);for(n of a.m)ee(n,ct),s(n)}u(this,rs).add(t)}capture(t,s,a=!1){t.v!==re&&!this.previous.has(t)&&this.previous.set(t,t.v),t.f&Ct||(this.current.set(t,[s,a]),ce==null||ce.set(t,s)),this.is_fork||(t.v=s)}activate(){E=this}deactivate(){E=null,ce=null}flush(){try{ba=!0,E=this,z(this,U,xs).call(this)}finally{en=0,Ea=null,Qt=null,$s=null,ba=!1,E=null,ce=null,jt.clear()}}discard(){var t;for(const s of u(this,ss))s(this);u(this,ss).clear();for(const s of this.async_deriveds.values())s.reject(bs);z(this,U,gs).call(this),(t=u(this,ns))==null||t.resolve()}register_created_effect(t){u(this,Ls).push(t)}increment(t,s){if(N(this,as,u(this,as)+1),t){let a=u(this,pt).get(s)??0;u(this,pt).set(s,a+1)}}decrement(t,s){if(N(this,as,u(this,as)-1),t){let a=u(this,pt).get(s)??0;a===1?u(this,pt).delete(s):u(this,pt).set(s,a-1)}u(this,Rt)||(N(this,Rt,!0),At(()=>{N(this,Rt,!1),this.linked&&this.flush()}))}transfer_effects(t,s){for(const a of t)u(this,ht).add(a);for(const a of s)u(this,Xe).add(a);t.clear(),s.clear()}oncommit(t){u(this,ts).add(t)}ondiscard(t){u(this,ss).add(t)}settled(){return(u(this,ns)??N(this,ns,mn())).promise}static ensure(){if(E===null){const t=E=new na;!ba&&!Es&&At(()=>{u(t,es)||t.flush()})}return E}apply(){{ce=null;return}}schedule(t){var n;if(Ea=t,(n=t.b)!=null&&n.is_pending&&t.f&(os|ia|bn)&&!(t.f&us)){t.b.defer_effect(t);return}for(var s=t;s.parent!==null;){s=s.parent;var a=s.f;if(Qt!==null&&s===j&&(H===null||!(H.f&ue)))return;if(a&(Pt|at)){if(!(a&oe))return;s.f^=oe}}u(this,ye).push(s)}};es=new WeakMap,St=new WeakMap,Ht=new WeakMap,ts=new WeakMap,ss=new WeakMap,as=new WeakMap,pt=new WeakMap,ns=new WeakMap,ye=new WeakMap,Ls=new WeakMap,ht=new WeakMap,Xe=new WeakMap,ot=new WeakMap,rs=new WeakMap,Rt=new WeakMap,U=new WeakSet,Ca=function(){if(this.is_fork)return!0;for(const a of u(this,pt).keys()){for(var t=a,s=!1;t.parent!==null;){if(u(this,ot).has(t)){s=!0;break}t=t.parent}if(!s)return!0}return!1},xs=function(){var i,c,h,x;N(this,es,!0),en++>1e3&&(z(this,U,gs).call(this),So());for(const v of u(this,ht))u(this,Xe).delete(v),ee(v,de),this.schedule(v);for(const v of u(this,Xe))ee(v,ct),this.schedule(v);const t=u(this,ye);N(this,ye,[]),this.apply();var s=Qt=[],a=[],n=$s=[];for(const v of t)try{z(this,U,Aa).call(this,v,s,a)}catch(m){throw Ln(v),z(this,U,Ca).call(this)||this.discard(),m}if(E=null,n.length>0){var r=na.ensure();for(const v of n)r.schedule(v)}if(Qt=null,$s=null,z(this,U,Ca).call(this)){z(this,U,Yt).call(this,a),z(this,U,Yt).call(this,s);for(const[v,m]of u(this,ot))Nn(v,m);n.length>0&&z(i=E,U,xs).call(i);return}const o=z(this,U,Pn).call(this);if(o){z(this,U,Yt).call(this,a),z(this,U,Yt).call(this,s),z(c=o,U,Mn).call(c,this);return}u(this,ht).clear(),u(this,Xe).clear();for(const v of u(this,ts))v(this);u(this,ts).clear(),Ts=this,tn(a),tn(s),Ts=null,(h=u(this,ns))==null||h.resolve();var l=E;if(u(this,as)===0&&(u(this,ye).length===0||l!==null)&&z(this,U,gs).call(this),u(this,ye).length>0)if(l!==null){const v=l;u(v,ye).push(...u(this,ye).filter(m=>!u(v,ye).includes(m)))}else l=this;l!==null&&z(x=l,U,xs).call(x)},Aa=function(t,s,a){t.f^=oe;for(var n=t.first;n!==null;){var r=n.f,o=(r&(at|Pt))!==0,l=o&&(r&oe)!==0,i=l||(r&he)!==0||u(this,ot).has(n);if(!i&&n.fn!==null){o?n.f^=oe:r&os?s.push(n):Rs(n)&&(r&tt&&u(this,Xe).add(n),cs(n));var c=n.first;if(c!==null){n=c;continue}}for(;n!==null;){var h=n.next;if(h!==null){n=h;break}n=n.parent}}},Pn=function(){for(var t=u(this,St);t!==null;){if(!t.is_fork){for(const[s,[,a]]of this.current)if(t.current.has(s)&&!a)return t}t=u(t,St)}return null},Mn=function(t){var a;for(const[n,r]of t.current)!this.previous.has(n)&&t.previous.has(n)&&this.previous.set(n,t.previous.get(n)),this.current.set(n,r);for(const[n,r]of t.async_deriveds){const o=this.async_deriveds.get(n);o&&r.promise.then(o.resolve).catch(o.reject)}t.async_deriveds.clear(),this.transfer_effects(u(t,ht),u(t,Xe));const s=n=>{var r=n.reactions;if(r!==null)for(const i of r){var o=i.f;if(o&ue)s(i);else{var l=i;o&(Zt|tt)&&!this.async_deriveds.has(l)&&(u(this,Xe).delete(l),ee(l,de),this.schedule(l))}}};for(const n of this.current.keys())s(n);this.oncommit(()=>t.discard()),z(a=t,U,gs).call(a),E=this,z(this,U,xs).call(this)},Yt=function(t){for(var s=0;s<t.length;s+=1)Sn(t[s],u(this,ht),u(this,Xe))},wo=function(){var x;for(let v=ma;v!==null;v=u(v,Ht)){var t=v.id<this.id,s=[];for(const[m,[b,_]]of this.current){if(v.current.has(m)){var a=v.current.get(m)[0];if(t&&b!==a)v.current.set(m,[b,_]);else continue}s.push(m)}if(t)for(const[m,b]of this.async_deriveds){const _=v.async_deriveds.get(m);_&&b.promise.then(_.resolve).catch(_.reject)}var n=[...v.current.keys()].filter(m=>!v.current.get(m)[1]);if(!(!u(v,es)||n.length===0)){var r=n.filter(m=>!this.current.has(m));if(r.length===0)t&&v.discard();else if(s.length>0){if(t)for(const m of u(this,rs))v.unskip_effect(m,b=>{var _;b.f&(tt|Zt)?v.schedule(b):z(_=v,U,Yt).call(_,[b])});v.activate();var o=new Set,l=new Map;for(var i of s)In(i,r,o,l);l=new Map;var c=[...v.current].filter(([m,b])=>{const _=this.current.get(m);return _?_[0]!==b[0]||_[1]!==b[1]:!0}).map(([m])=>m);if(c.length>0)for(const m of u(this,Ls))!(m.f&(Ue|he|Qs))&&ja(m,c,l)&&(m.f&(Zt|tt)?(ee(m,de),v.schedule(m)):u(v,ht).add(m));if(u(v,ye).length>0&&!u(v,Rt)){v.apply();for(var h of u(v,ye))z(x=v,U,Aa).call(x,h,[],[]);N(v,ye,[])}v.deactivate()}}}},gs=function(){if(this.linked){var t=u(this,St),s=u(this,Ht);t===null?ma=s:N(t,Ht,s),s===null?Kt=t:N(s,St,t),this.linked=!1}};let Ut=na;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{Wr()}catch(e){Tt(e,Ea)}}let Ze=null;function tn(e){var t=e.length;if(t!==0){for(var s=0;s<t;){var a=e[s++];if(!(a.f&(Ue|he))&&Rs(a)&&(Ze=new Set,cs(a),a.deps===null&&a.first===null&&a.nodes===null&&a.teardown===null&&a.ac===null&&qn(a),(Ze==null?void 0:Ze.size)>0)){jt.clear();for(const n of Ze){if(n.f&(Ue|he))continue;const r=[n];let o=n.parent;for(;o!==null;)Ze.has(o)&&(Ze.delete(o),r.push(o)),o=o.parent;for(let l=r.length-1;l>=0;l--){const i=r[l];i.f&(Ue|he)||cs(i)}}Ze.clear()}}Ze=null}}function In(e,t,s,a){if(!s.has(e)&&(s.add(e),e.reactions!==null))for(const n of e.reactions){const r=n.f;r&ue?In(n,t,s,a):r&(Zt|tt)&&!(r&de)&&ja(n,t,a)&&(ee(n,de),Va(n))}}function ja(e,t,s){const a=s.get(e);if(a!==void 0)return a;if(e.deps!==null)for(const n of e.deps){if(Ys.call(t,n))return!0;if(n.f&ue&&ja(n,t,s))return s.set(n,!0),!0}return s.set(e,!1),!1}function Va(e){E.schedule(e)}function Nn(e,t){if(!(e.f&at&&e.f&oe)){e.f&de?t.d.push(e):e.f&ct&&t.m.push(e),ee(e,oe);for(var s=e.first;s!==null;)Nn(s,t),s=s.next}}function Ln(e){ee(e,oe);for(var t=e.first;t!==null;)Ln(t),t=t.next}let ea=new Set;const jt=new Map;let On=!1;function Gt(e,t){var s={f:0,v:e,reactions:null,equals:gn,rv:0,wv:0};return s}function M(e,t){const s=Gt(e);return $n(s),s}function To(e,t=!1,s=!0){var n;const a=Gt(e);return t||(a.equals=_n),da&&s&&ie!==null&&ie.l!==null&&((n=ie.l).s??(n.s=[])).push(a),a}function y(e,t,s=!1){H!==null&&(!st||H.f&Qs)&&Ds()&&H.f&(ue|tt|Zt|Qs)&&(dt===null||!dt.has(e))&&Ur();let a=s?mt(t):t;return ds(e,a,$s)}function ds(e,t,s=null){if(!e.equals(t)){jt.set(e,Mt?t:e.v);var a=Ut.ensure();if(a.capture(e,t),e.f&ue){const n=e;e.f&de&&Fa(n),ce===null&&Ha(n)}e.wv=Kn(),Bn(e,de,s),Ds()&&j!==null&&j.f&oe&&!(j.f&(at|Pt))&&(Fe===null?Fo([e]):Fe.push(e)),!a.is_fork&&ea.size>0&&!On&&Eo()}return t}function Eo(){On=!1;for(const e of ea){e.f&oe&&ee(e,ct);let t;try{t=Rs(e)}catch{t=!0}t&&cs(e)}ea.clear()}function Cs(e){y(e,e.v+1)}function Bn(e,t,s){var a=e.reactions;if(a!==null)for(var n=Ds(),r=a.length,o=0;o<r;o++){var l=a[o],i=l.f;if(!(!n&&l===j)){var c=(i&de)===0;if(c&&ee(l,t),i&Qs)ea.add(l);else if(i&ue){var h=l;ce==null||ce.delete(h),i&qt||(i&qe&&(j===null||!(j.f&Zs))&&(l.f|=qt),Bn(h,ct,s))}else if(c){var x=l;i&tt&&Ze!==null&&Ze.add(x),s!==null?s.push(x):Va(x)}}}}function mt(e){if(typeof e!="object"||e===null||Ss in e)return e;const t=pn(e);if(t!==Pr&&t!==Mr)return e;var s=new Map,a=Da(e),n=M(0),r=Wt,o=l=>{if(Wt===r)return l();var i=H,c=Wt;Ge(null),on(r);var h=l();return Ge(i),on(c),h};return a&&s.set("length",M(e.length)),new Proxy(e,{defineProperty(l,i,c){(!("value"in c)||c.configurable===!1||c.enumerable===!1||c.writable===!1)&&zr();var h=s.get(i);return h===void 0?o(()=>{var x=M(c.value);return s.set(i,x),x}):y(h,c.value,!0),!0},deleteProperty(l,i){var c=s.get(i);if(c===void 0){if(i in l){const h=o(()=>M(re));s.set(i,h),Cs(n)}}else y(c,re),Cs(n);return!0},get(l,i,c){var m;if(i===Ss)return e;var h=s.get(i),x=i in l;if(h===void 0&&(!x||(m=ks(l,i))!=null&&m.writable)&&(h=o(()=>{var b=mt(x?l[i]:re),_=M(b);return _}),s.set(i,h)),h!==void 0){var v=p(h);return v===re?void 0:v}return Reflect.get(l,i,c)},getOwnPropertyDescriptor(l,i){var c=Reflect.getOwnPropertyDescriptor(l,i);if(c&&"value"in c){var h=s.get(i);h&&(c.value=p(h))}else if(c===void 0){var x=s.get(i),v=x==null?void 0:x.v;if(x!==void 0&&v!==re)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return c},has(l,i){var v;if(i===Ss)return!0;var c=s.get(i),h=c!==void 0&&c.v!==re||Reflect.has(l,i);if(c!==void 0||j!==null&&(!h||(v=ks(l,i))!=null&&v.writable)){c===void 0&&(c=o(()=>{var m=h?mt(l[i]):re,b=M(m);return b}),s.set(i,c));var x=p(c);if(x===re)return!1}return h},set(l,i,c,h){var T;var x=s.get(i),v=i in l;if(a&&i==="length")for(var m=c;m<x.v;m+=1){var b=s.get(m+"");b!==void 0?y(b,re):m in l&&(b=o(()=>M(re)),s.set(m+"",b))}if(x===void 0)(!v||(T=ks(l,i))!=null&&T.writable)&&(x=o(()=>M(void 0)),y(x,mt(c)),s.set(i,x));else{v=x.v!==re;var _=o(()=>mt(c));y(x,_)}var g=Reflect.getOwnPropertyDescriptor(l,i);if(g!=null&&g.set&&g.set.call(h,c),!v){if(a&&typeof i=="string"){var S=s.get("length"),A=Number(i);Number.isInteger(A)&&A>=S.v&&y(S,A+1)}Cs(n)}return!0},ownKeys(l){p(n);var i=Reflect.ownKeys(l).filter(x=>{var v=s.get(x);return v===void 0||v.v!==re});for(var[c,h]of s)h.v!==re&&!(c in l)&&i.push(c);return i},setPrototypeOf(){qr()}})}function sn(e){try{if(e!==null&&typeof e=="object"&&Ss in e)return e[Ss]}catch{}return e}function Co(e,t){return Object.is(sn(e),sn(t))}var an,Dn,Hn,Rn;function Ao(){if(an===void 0){an=window,Dn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,s=Text.prototype;Hn=ks(t,"firstChild").get,Rn=ks(t,"nextSibling").get,Za(e)&&(e[wa]=void 0,e[zs]=null,e[Dr]=void 0,e.__e=void 0),Za(s)&&(s[ms]=void 0)}}function bt(e=""){return document.createTextNode(e)}function Et(e){return Hn.call(e)}function Hs(e){return Rn.call(e)}function d(e,t){return Et(e)}function Pa(e,t=!1){{var s=Et(e);return s instanceof Comment&&s.data===""?Hs(s):s}}function f(e,t=1,s=!1){let a=e;for(;t--;)a=Hs(a);return a}function Po(e){e.textContent=""}function Fn(){return!1}function Mo(e,t,s){return s?document.createElement(e,{is:s}):document.createElement(e)}let nn=!1;function Io(){nn||(nn=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const s of e.target.elements)(t=s[qs])==null||t.call(s)})},{capture:!0}))}function ca(e){var t=H,s=j;Ge(null),ut(null);try{return e()}finally{Ge(t),ut(s)}}function jn(e,t,s,a=s){e.addEventListener(t,()=>ca(s));const n=e[qs];n?e[qs]=()=>{n(),a(!0)}:e[qs]=()=>a(!0),Io()}function No(e){j===null&&(H===null&&Vr(),jr()),Mt&&Fr()}function Lo(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=j;s!==null&&s.f&he&&(e|=he);var a={ctx:ie,deps:null,nodes:null,f:e|de|qe,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(a);var n=a;if(e&os)Qt!==null?Qt.push(a):Ut.ensure().schedule(a);else if(t!==null){try{cs(a)}catch(o){throw ke(a),o}n.deps===null&&n.teardown===null&&n.nodes===null&&n.first===n.last&&!(n.f&fs)&&(n=n.first,e&tt&&e&zt&&n!==null&&(n.f|=zt))}if(n!==null&&(n.parent=s,s!==null&&Lo(n,s),H!==null&&H.f&ue&&!(e&Pt))){var r=H;(r.effects??(r.effects=[])).push(n)}return a}function Wa(){return H!==null&&!st}function za(e){const t=xt(ia,null);return ee(t,oe),t.teardown=e,t}function Ma(e){No();var t=j.f,s=!H&&(t&at)!==0&&ie!==null&&!ie.i;if(s){var a=ie;(a.e??(a.e=[])).push(e)}else return Vn(e)}function Vn(e){return xt(os|Or,e)}function Oo(e){Ut.ensure();const t=xt(Pt|fs,e);return(s={})=>new Promise(a=>{s.outro?Vt(t,()=>{ke(t),a(void 0)}):(ke(t),a(void 0))})}function Bo(e){return xt(os,e)}function Do(e){return xt(Zt|fs,e)}function Wn(e,t=0){return xt(ia|t,e)}function D(e,t=[],s=[],a=[]){mo(a,t,s,n=>{xt(ia,()=>{e(...n.map(p))})})}function ua(e,t=0){var s=xt(tt|t,e);return s}function ze(e){return xt(at|fs,e)}function zn(e){var t=e.teardown;if(t!==null){const s=Mt,a=H;rn(!0),Ge(null);try{t.call(null)}finally{rn(s),Ge(a)}}}function qa(e,t=!1){var s=e.first;for(e.first=e.last=null;s!==null;){const n=s.ac;n!==null&&ca(()=>{n.abort(la)});var a=s.next;s.f&Pt?s.parent=null:ke(s,t),s=a}}function Ho(e){for(var t=e.first;t!==null;){var s=t.next;t.f&at||ke(t),t=s}}function ke(e,t=!0){var s=!1;(t||e.f&Lr)&&e.nodes!==null&&e.nodes.end!==null&&(Ro(e.nodes.start,e.nodes.end),s=!0),e.f|=Xa,qa(e,t&&!s),Ps(e,0);var a=e.nodes&&e.nodes.t;if(a!==null)for(const r of a)r.stop();zn(e),e.f^=Xa,e.f|=Ue;var n=e.parent;n!==null&&n.first!==null&&qn(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 qn(e){var t=e.parent,s=e.prev,a=e.next;s!==null&&(s.next=a),a!==null&&(a.prev=s),t!==null&&(t.first===e&&(t.first=a),t.last===e&&(t.last=s))}function Vt(e,t,s=!0){var a=[];Un(e,a,!0);var n=()=>{s&&ke(e),t&&t()},r=a.length;if(r>0){var o=()=>--r||n();for(var l of a)l.out(o)}else n()}function Un(e,t,s){if(!(e.f&he)){e.f^=he;var a=e.nodes&&e.nodes.t;if(a!==null)for(const l of a)(l.is_global||s)&&t.push(l);for(var n=e.first;n!==null;){var r=n.next;if(!(n.f&Pt)){var o=(n.f&zt)!==0||(n.f&at)!==0&&(e.f&tt)!==0;Un(n,t,o?s:!1)}n=r}}}function ta(e){Gn(e,!0)}function Gn(e,t){if(e.f&he){e.f^=he,e.f&oe||(ee(e,de),Ut.ensure().schedule(e));for(var s=e.first;s!==null;){var a=s.next,n=(s.f&zt)!==0||(s.f&at)!==0;Gn(s,n?t:!1),s=a}var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||t)&&o.in()}}function Ua(e,t){if(e.nodes)for(var s=e.nodes.start,a=e.nodes.end;s!==null;){var n=s===a?null:Hs(s);t.append(s),s=n}}let Js=!1,Mt=!1;function rn(e){Mt=e}let H=null,st=!1;function Ge(e){H=e}let j=null;function ut(e){j=e}let dt=null;function $n(e){H!==null&&(dt??(dt=new Set)).add(e)}let we=null,Me=0,Fe=null;function Fo(e){Fe=e}let Jn=1,Lt=0,Wt=Lt;function on(e){Wt=e}function Kn(){return++Jn}function Rs(e){var t=e.f;if(t&de)return!0;if(t&ue&&(e.f&=~qt),t&ct){for(var s=e.deps,a=s.length,n=0;n<a;n++){var r=s[n];if(Rs(r)&&Cn(r),r.wv>e.wv)return!0}t&qe&&ce===null&&ee(e,oe)}return!1}function Yn(e,t,s=!0){var a=e.reactions;if(a!==null&&!(dt!==null&&dt.has(e)))for(var n=0;n<a.length;n++){var r=a[n];r.f&ue?Yn(r,t,!1):t===r&&(s?ee(r,de):r.f&oe&&ee(r,ct),Va(r))}}function Qn(e){var _;var t=we,s=Me,a=Fe,n=H,r=dt,o=ie,l=st,i=Wt,c=e.f;we=null,Me=0,Fe=null,H=c&(at|Pt)?null:e,dt=null,is(e.ctx),st=!1,Wt=++Lt,e.ac!==null&&(ca(()=>{e.ac.abort(la)}),e.ac=null);try{e.f|=Zs;var h=e.fn,x=h();e.f|=us;var v=e.deps,m=E==null?void 0:E.is_fork;if(we!==null){var b;if(m||Ps(e,Me),v!==null&&Me>0)for(v.length=Me+we.length,b=0;b<we.length;b++)v[Me+b]=we[b];else e.deps=v=we;if(Wa()&&e.f&qe)for(b=Me;b<v.length;b++)((_=v[b]).reactions??(_.reactions=[])).push(e)}else!m&&v!==null&&Me<v.length&&(Ps(e,Me),v.length=Me);if(Ds()&&Fe!==null&&!st&&v!==null&&!(e.f&(ue|ct|de)))for(b=0;b<Fe.length;b++)Yn(Fe[b],e);if(n!==null&&n!==e){if(Lt++,n.deps!==null)for(let g=0;g<s;g+=1)n.deps[g].rv=Lt;if(t!==null)for(const g of t)g.rv=Lt;Fe!==null&&(a===null?a=Fe:a.push(...Fe))}return e.f&Ct&&(e.f^=Ct),x}catch(g){return wn(g)}finally{e.f^=Zs,we=t,Me=s,Fe=a,H=n,dt=r,is(o),st=l,Wt=i}}function jo(e,t){let s=t.reactions;if(s!==null){var a=Er.call(s,e);if(a!==-1){var n=s.length-1;n===0?s=t.reactions=null:(s[a]=s[n],s.pop())}}if(s===null&&t.f&ue&&(we===null||!Ys.call(we,t))){var r=t;r.f&qe&&(r.f^=qe,r.f&=~qt),r.v!==re&&Ha(r),_o(r),Ps(r,0)}}function Ps(e,t){var s=e.deps;if(s!==null)for(var a=t;a<s.length;a++)jo(e,s[a])}function cs(e){var t=e.f;if(!(t&Ue)){ee(e,oe);var s=j,a=Js;j=e,Js=!0;try{t&(tt|bn)?Ho(e):qa(e),zn(e);var n=Qn(e);e.teardown=typeof n=="function"?n:null,e.wv=Jn;var r;vn&&no&&e.f&de&&e.deps}finally{Js=a,j=s}}}async function Vo(){await Promise.resolve(),ko()}function p(e){var t=e.f,s=(t&ue)!==0;if(H!==null&&!st){var a=j!==null&&(j.f&Ue)!==0;if(!a&&(dt===null||!dt.has(e))){var n=H.deps;if(H.f&Zs)e.rv<Lt&&(e.rv=Lt,we===null&&n!==null&&n[Me]===e?Me++:we===null?we=[e]:we.push(e));else{H.deps??(H.deps=[]),Ys.call(H.deps,e)||H.deps.push(e);var r=e.reactions;r===null?e.reactions=[H]:Ys.call(r,H)||r.push(H)}}}if(Mt&&jt.has(e))return jt.get(e);if(s){var o=e;if(Mt){var l=o.v;return(!(o.f&oe)&&o.reactions!==null||Xn(o))&&(l=Fa(o)),jt.set(o,l),l}var i=(o.f&qe)===0&&!st&&H!==null&&(Js||(H.f&qe)!==0),c=(o.f&us)===0;Rs(o)&&(i&&(o.f|=qe),Cn(o)),i&&!c&&(An(o),Zn(o))}if(ce!=null&&ce.has(e))return ce.get(e);if(e.f&Ct)throw e.v;return e.v}function Zn(e){if(e.f|=qe,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),t.f&ue&&!(t.f&qe)&&(An(t),Zn(t))}function Xn(e){if(e.v===re)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(jt.has(t)||t.f&ue&&Xn(t))return!0;return!1}function er(e){var t=st;try{return st=!0,e()}finally{st=t}}const Wo=["touchstart","touchmove"];function zo(e){return Wo.includes(e)}const Ot=Symbol("events"),tr=new Set,Ia=new Set;function qo(e,t,s,a={}){function n(r){if(a.capture||Na.call(t,r),!r.cancelBubble)return ca(()=>s==null?void 0:s.call(this,r))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?At(()=>{t.addEventListener(e,n,a)}):t.addEventListener(e,n,a),n}function Uo(e,t,s,a,n){var r={capture:a,passive:n},o=qo(e,t,s,r);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&za(()=>{t.removeEventListener(e,o,r)})}function J(e,t,s){(t[Ot]??(t[Ot]={}))[e]=s}function Le(e){for(var t=0;t<e.length;t++)tr.add(e[t]);for(var s of Ia)s(e)}let ln=null;function Na(e){var _,g;var t=this,s=t.ownerDocument,a=e.type,n=((_=e.composedPath)==null?void 0:_.call(e))||[],r=n[0]||e.target;ln=e;var o=0,l=ln===e&&e[Ot];if(l){var i=n.indexOf(l);if(i!==-1&&(t===document||t===window)){e[Ot]=t;return}var c=n.indexOf(t);if(c===-1)return;i<=c&&(o=i)}if(r=n[o]||e.target,r!==t){Cr(e,"currentTarget",{configurable:!0,get(){return r||s}});var h=H,x=j;Ge(null),ut(null);try{for(var v,m=[];r!==null&&r!==t;){try{var b=(g=r[Ot])==null?void 0:g[a];b!=null&&(!r.disabled||e.target===r)&&b.call(r,e)}catch(S){v?m.push(S):v=S}if(e.cancelBubble)break;o++,r=o<n.length?n[o]:null}if(v){for(let S of m)queueMicrotask(()=>{throw S});throw v}}finally{e[Ot]=t,delete e.currentTarget,Ge(h),ut(x)}}}var un;const xa=((un=globalThis==null?void 0:globalThis.window)==null?void 0:un.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function Go(e){return(xa==null?void 0:xa.createHTML(e))??e}function sr(e){var t=Mo("template");return t.innerHTML=Go(e.replaceAll("<!>","<!---->")),t.content}function Ms(e,t){var s=j;s.nodes===null&&(s.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var s=(t&Qr)!==0,a=(t&Zr)!==0,n,r=!e.startsWith("<!>");return()=>{n===void 0&&(n=sr(r?e:"<!>"+e),s||(n=Et(n)));var o=a||Dn?document.importNode(n,!0):n.cloneNode(!0);if(s){var l=Et(o),i=o.lastChild;Ms(l,i)}else Ms(o,o);return o}}function $o(e,t,s="svg"){var a=!e.startsWith("<!>"),n=`<${s}>${a?e:"<!>"+e}</${s}>`,r;return()=>{if(!r){var o=sr(n),l=Et(o);for(r=document.createDocumentFragment();Et(l);)r.appendChild(Et(l))}var i=r.cloneNode(!0);{var c=Et(i),h=i.lastChild;Ms(c,h)}return i}}function fa(e,t){return $o(e,t,"svg")}function _s(e=""){{var t=bt(e+"");return Ms(t,t),t}}function ar(){var e=document.createDocumentFragment(),t=document.createComment(""),s=bt();return e.append(t,s),Ms(t,s),e}function w(e,t){e!==null&&e.before(t)}function P(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 Ws=new Map;function Ko(e,{target:t,anchor:s,props:a={},events:n,context:r,intro:o=!0,transformError:l}){Ao();var i=void 0,c=Oo(()=>{var h=s??t.appendChild(bt());uo(h,{pending:()=>{}},m=>{Se({});var b=ie;r&&(b.c=r),n&&(a.$$events=n),i=e(m,a)||{},Te()},l);var x=new Set,v=m=>{for(var b=0;b<m.length;b++){var _=m[b];if(!x.has(_)){x.add(_);var g=zo(_);for(const T of[t,document]){var S=Ws.get(T);S===void 0&&(S=new Map,Ws.set(T,S));var A=S.get(_);A===void 0?(T.addEventListener(_,Na,{passive:g}),S.set(_,1)):S.set(_,A+1)}}}};return v(oa(tr)),Ia.add(v),()=>{var g;for(var m of x)for(const S of[t,document]){var b=Ws.get(S),_=b.get(m);--_==0?(S.removeEventListener(m,Na),b.delete(m),b.size===0&&Ws.delete(S)):b.set(m,_)}Ia.delete(v),h!==s&&((g=h.parentNode)==null||g.removeChild(h))}});return Yo.set(i,c),i}let Yo=new WeakMap;var et,it,Ne,Ft,Os,Bs,ra;class nr{constructor(t,s=!0){Pe(this,"anchor");B(this,et,new Map);B(this,it,new Map);B(this,Ne,new Map);B(this,Ft,new Set);B(this,Os,!0);B(this,Bs,t=>{if(u(this,et).has(t)){var s=u(this,et).get(t),a=u(this,it).get(s);if(a)ta(a),u(this,Ft).delete(s);else{var n=u(this,Ne).get(s);n&&(ta(n.effect),u(this,it).set(s,n.effect),u(this,Ne).delete(s),n.fragment.lastChild.remove(),this.anchor.before(n.fragment),a=n.effect)}for(const[r,o]of u(this,et)){if(u(this,et).delete(r),r===t)break;const l=u(this,Ne).get(o);l&&(ke(l.effect),u(this,Ne).delete(o))}for(const[r,o]of u(this,it)){if(r===s||u(this,Ft).has(r))continue;const l=()=>{if(Array.from(u(this,et).values()).includes(r)){var c=document.createDocumentFragment();Ua(o,c),c.append(bt()),u(this,Ne).set(r,{effect:o,fragment:c})}else ke(o);u(this,Ft).delete(r),u(this,it).delete(r)};u(this,Os)||!a?(u(this,Ft).add(r),Vt(o,l,!1)):l()}}});B(this,ra,t=>{u(this,et).delete(t);const s=Array.from(u(this,et).values());for(const[a,n]of u(this,Ne))s.includes(a)||(ke(n.effect),u(this,Ne).delete(a))});this.anchor=t,N(this,Os,s)}ensure(t,s){var a=E,n=Fn();if(s&&!u(this,it).has(t)&&!u(this,Ne).has(t))if(n){var r=document.createDocumentFragment(),o=bt();r.append(o),u(this,Ne).set(t,{effect:ze(()=>s(o)),fragment:r})}else u(this,it).set(t,ze(()=>s(this.anchor)));if(u(this,et).set(a,t),n){for(const[l,i]of u(this,it))l===t?a.unskip_effect(i):a.skip_effect(i);for(const[l,i]of u(this,Ne))l===t?a.unskip_effect(i.effect):a.skip_effect(i.effect);a.oncommit(u(this,Bs)),a.ondiscard(u(this,ra))}else u(this,Bs).call(this,a)}}et=new WeakMap,it=new WeakMap,Ne=new WeakMap,Ft=new WeakMap,Os=new WeakMap,Bs=new WeakMap,ra=new WeakMap;function se(e,t,s=!1){var a=new nr(e),n=s?zt:0;function r(o,l){a.ensure(o,l)}ua(()=>{var o=!1;t((l,i=0)=>{o=!0,r(i,l)}),o||r(-1,null)},n)}function Ga(e,t){return t}function Qo(e,t,s){for(var a=[],n=t.length,r,o=t.length,l=0;l<n;l++){let x=t[l];Vt(x,()=>{if(r){if(r.pending.delete(x),r.done.add(x),r.pending.size===0){var v=e.outrogroups;La(e,oa(r.done)),v.delete(r),v.size===0&&(e.outrogroups=null)}}else o-=1},!1)}if(o===0){var i=a.length===0&&s!==null;if(i){var c=s,h=c.parentNode;Po(h),h.append(c),e.items.clear()}La(e,t,!i)}else r={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(r)}function La(e,t,s=!0){var a;if(e.pending.size>0){a=new Set;for(const o of e.pending.values())for(const l of o)a.add(e.items.get(l).e)}for(var n=0;n<t.length;n++){var r=t[n];if(a!=null&&a.has(r)){r.f|=lt;const o=document.createDocumentFragment();Ua(r,o)}else ke(t[n],s)}}var dn;function $e(e,t,s,a,n,r=null){var o=e,l=new Map,i=(t&xn)!==0;if(i){var c=e;o=c.appendChild(bt())}var h=null,x=En(()=>{var T=s();return Da(T)?T:T==null?[]:oa(T)}),v,m=new Map,b=!0;function _(T){A.effect.f&Ue||(A.pending.delete(T),A.fallback=h,Zo(A,v,o,t,a),h!==null&&(v.length===0?h.f<?(h.f^=lt,ys(h,null,o)):ta(h):Vt(h,()=>{h=null})))}function g(T){A.pending.delete(T)}var S=ua(()=>{v=p(x);for(var T=v.length,C=new Set,O=E,V=Fn(),R=0;R<T;R+=1){var F=v[R],q=a(F,R),G=b?null:l.get(q);G?(G.v&&ds(G.v,F),G.i&&ds(G.i,R),V&&O.unskip_effect(G.e)):(G=Xo(l,b?o:dn??(dn=bt()),F,q,R,n,t,s),b||(G.e.f|=lt),l.set(q,G)),C.add(q)}if(T===0&&r&&!h&&(b?h=ze(()=>r(o)):(h=ze(()=>r(dn??(dn=bt()))),h.f|=lt)),T>C.size&&Rr(),!b)if(m.set(O,C),V){for(const[te,ae]of l)C.has(te)||O.skip_effect(ae.e);O.oncommit(_),O.ondiscard(g)}else _(O);p(x)}),A={effect:S,items:l,pending:m,outrogroups:null,fallback:h};b=!1}function hs(e){for(;e!==null&&!(e.f&at);)e=e.next;return e}function Zo(e,t,s,a,n){var G,te,ae,nt,Oe,Be,me,Ke,Ce;var r=(a&Kr)!==0,o=t.length,l=e.items,i=hs(e.effect.first),c,h=null,x,v=[],m=[],b,_,g,S;if(r)for(S=0;S<o;S+=1)b=t[S],_=n(b,S),g=l.get(_).e,g.f<||((te=(G=g.nodes)==null?void 0:G.a)==null||te.measure(),(x??(x=new Set)).add(g));for(S=0;S<o;S+=1){if(b=t[S],_=n(b,S),g=l.get(_).e,e.outrogroups!==null)for(const ne of e.outrogroups)ne.pending.delete(g),ne.done.delete(g);if(g.f&he&&(ta(g),r&&((nt=(ae=g.nodes)==null?void 0:ae.a)==null||nt.unfix(),(x??(x=new Set)).delete(g))),g.f<)if(g.f^=lt,g===i)ys(g,null,s);else{var A=h?h.next:i;g===e.effect.last&&(e.effect.last=g.prev),g.prev&&(g.prev.next=g.next),g.next&&(g.next.prev=g.prev),wt(e,h,g),wt(e,g,A),ys(g,A,s),h=g,v=[],m=[],i=hs(h.next);continue}if(g!==i){if(c!==void 0&&c.has(g)){if(v.length<m.length){var T=m[0],C;h=T.prev;var O=v[0],V=v[v.length-1];for(C=0;C<v.length;C+=1)ys(v[C],T,s);for(C=0;C<m.length;C+=1)c.delete(m[C]);wt(e,O.prev,V.next),wt(e,h,O),wt(e,V,T),i=T,h=V,S-=1,v=[],m=[]}else c.delete(g),ys(g,i,s),wt(e,g.prev,g.next),wt(e,g,h===null?e.effect.first:h.next),wt(e,h,g),h=g;continue}for(v=[],m=[];i!==null&&i!==g;)(c??(c=new Set)).add(i),m.push(i),i=hs(i.next);if(i===null)continue}g.f<||v.push(g),h=g,i=hs(g.next)}if(e.outrogroups!==null){for(const ne of e.outrogroups)ne.pending.size===0&&(La(e,oa(ne.done)),(Oe=e.outrogroups)==null||Oe.delete(ne));e.outrogroups.size===0&&(e.outrogroups=null)}if(i!==null||c!==void 0){var R=[];if(c!==void 0)for(g of c)g.f&he||R.push(g);for(;i!==null;)!(i.f&he)&&i!==e.fallback&&R.push(i),i=hs(i.next);var F=R.length;if(F>0){var q=a&xn&&o===0?s:null;if(r){for(S=0;S<F;S+=1)(me=(Be=R[S].nodes)==null?void 0:Be.a)==null||me.measure();for(S=0;S<F;S+=1)(Ce=(Ke=R[S].nodes)==null?void 0:Ke.a)==null||Ce.fix()}Qo(e,R,q)}}r&&At(()=>{var ne,Ye;if(x!==void 0)for(g of x)(Ye=(ne=g.nodes)==null?void 0:ne.a)==null||Ye.apply()})}function Xo(e,t,s,a,n,r,o,l){var i=o&$r?o&Yr?Gt(s):To(s,!1,!1):null,c=o&Jr?Gt(n):null;return{v:i,i:c,e:ze(()=>(r(t,i??s,c??n,l),()=>{e.delete(a)}))}}function ys(e,t,s){if(e.nodes)for(var a=e.nodes.start,n=e.nodes.end,r=t&&!(t.f<)?t.nodes.start:s;a!==null;){var o=Hs(a);if(r.before(a),a===n)return;a=o}}function wt(e,t,s){t===null?e.effect.first=s:t.next=s,s===null?e.effect.last=t:s.prev=t}function rr(e,t,...s){var a=new nr(e);ua(()=>{const n=t()??null;a.ensure(n,n&&(r=>n(r,...s)))},zt)}function or(e){var t,s,a="";if(typeof e=="string"||typeof e=="number")a+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t<n;t++)e[t]&&(s=or(e[t]))&&(a&&(a+=" "),a+=s)}else for(s in e)e[s]&&(a&&(a+=" "),a+=s);return a}function ei(){for(var e,t,s=0,a="",n=arguments.length;s<n;s++)(e=arguments[s])&&(t=or(e))&&(a&&(a+=" "),a+=t);return a}function Fs(e){return typeof e=="object"?ei(e):e??""}function ti(e,t,s){var a=e==null?"":""+e;return a===""?null:a}function Je(e,t,s,a,n,r){var o=e[wa];if(o!==s||o===void 0){var l=ti(s);l==null?e.removeAttribute("class"):e.className=l,e[wa]=s}return r}function ir(e,t,s=!1){if(e.multiple){if(t==null)return;if(!Da(t))return to();for(var a of e.options)a.selected=t.includes(As(a));return}for(a of e.options){var n=As(a);if(Co(n,t)){a.selected=!0;return}}(!s||t!==void 0)&&(e.selectedIndex=-1)}function si(e){var t=new MutationObserver(()=>{ir(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),za(()=>{t.disconnect()})}function ai(e,t,s=t){var a=new WeakSet,n=!0;jn(e,"change",r=>{var o=r?"[selected]":":checked",l;if(e.multiple)l=[].map.call(e.querySelectorAll(o),As);else{var i=e.querySelector(o)??e.querySelector("option:not([disabled])");l=i&&As(i)}s(l),e.__value=l,E!==null&&a.add(E)}),Bo(()=>{var r=t();if(e===document.activeElement){var o=E;if(a.has(o))return}if(ir(e,r,n),n&&r===void 0){var l=e.querySelector(":checked");l!==null&&(r=As(l),s(r))}e.__value=r,n=!1}),si(e)}function As(e){return"__value"in e?e.__value:e.value}const ni=Symbol("is custom element"),ri=Symbol("is html");function sa(e,t){var s=lr(e);s.checked!==(s.checked=t??void 0)&&(e.checked=t)}function va(e,t,s,a){var n=lr(e);n[t]!==(n[t]=s)&&(t==="loading"&&(e[Br]=s),s==null?e.removeAttribute(t):typeof s!="string"&&oi(e).includes(t)?e[t]=s:e.setAttribute(t,s))}function lr(e){return e[zs]??(e[zs]={[ni]:e.nodeName.includes("-"),[ri]:e.namespaceURI===Xr})}var cn=new Map;function oi(e){var t=e.getAttribute("is")||e.nodeName,s=cn.get(t);if(s)return s;cn.set(t,s=[]);for(var a,n=e,r=Element.prototype;r!==n;){a=Ar(n);for(var o in a)a[o].set&&o!=="innerHTML"&&o!=="textContent"&&o!=="innerText"&&s.push(o);n=pn(n)}return s}function Ks(e,t,s=t){var a=new WeakSet;jn(e,"input",async n=>{var r=n?e.defaultValue:e.value;if(r=ga(e)?_a(r):r,s(r),E!==null&&a.add(E),await Vo(),r!==(r=t())){var o=e.selectionStart,l=e.selectionEnd,i=e.value.length;if(e.value=r??"",l!==null){var c=e.value.length;o===l&&l===i&&c>i?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=o,e.selectionEnd=Math.min(l,c))}}}),er(t)==null&&e.value&&(s(ga(e)?_a(e.value):e.value),E!==null&&a.add(E)),Wn(()=>{var n=t();if(e===document.activeElement){var r=E;if(a.has(r))return}ga(e)&&n===_a(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}function ga(e){var t=e.type;return t==="number"||t==="range"}function _a(e){return e===""?null:+e}const ii="5";var fn;typeof window<"u"&&((fn=window.__svelte??(window.__svelte={})).v??(fn.v=new Set)).add(ii);const Oa="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 a=e.indexOf(`
|
|
2
|
+
`,s),n=a<0?e.length:a;t.push({t:"comment",v:e.slice(s,n)}),s=n;continue}if(e[s]==='"'||e[s]==="'"||e[s]==="`"){const a=e[s];let n=s+1;for(;n<e.length;){if(e[n]==="\\"&&a!=="`"){n+=2;continue}if(e[n]===a){n++;break}n++}t.push({t:"string",v:e.slice(s,n)}),s=n;continue}if(/\d/.test(e[s])&&(s===0||!/[a-zA-Z_$]/.test(e[s-1]))){let a=s;for(;a<e.length&&/[\d.]/.test(e[a]);)a++;t.push({t:"number",v:e.slice(s,a)}),s=a;continue}if(/[a-zA-Z_$]/.test(e[s])){let a=s;for(;a<e.length&&/[a-zA-Z0-9_$]/.test(e[a]);)a++;const n=e.slice(s,a);t.push({t:li.has(n)?"keyword":"plain",v:n}),s=a;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"},dr={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"}},cr=[{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:"sse",label:"Server-Sent Events (mocked)",indent:1},{id:"websocket",label:"WebSocket (app-level mock)",indent:1},{id:"captcha",label:"reCAPTCHA (test-mode bypass)",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){Se(t,!0);function s(r){var o;(o=document.getElementById(r))==null||o.scrollIntoView({behavior:"smooth",block:"start"})}var a=vi(),n=f(d(a),2);$e(n,21,()=>cr,r=>r.id,(r,o)=>{const l=ls(()=>t.activeId===p(o).id),i=ls(()=>p(o).indent===0);var c=fi(),h=d(c);{var x=m=>{var b=ui();w(m,b)};se(h,m=>{p(o).indent===1&&m(x)})}var v=f(h);D(m=>{va(c,"href",`#${p(o).id}`),Je(c,1,m),P(v,` ${p(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",p(o).indent===1?"pl-7 pr-3":"px-3",p(i)?"mt-5 font-semibold first:mt-0":"font-normal",p(l)?"text-teal-400 bg-teal-950/50 border border-teal-800/40":p(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(" "))]),J("click",c,m=>{m.preventDefault(),s(p(o).id)}),w(r,c)}),w(e,a),Te()}Le(["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(),a=d(s),n=d(a);rr(n,()=>t.children??hn),D(()=>va(s,"id",t.id)),w(e,s)}ro();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 ur(e,t){Se(t,!0);let s=M(!1),a=ls(()=>di(t.code));function n(){navigator.clipboard.writeText(t.code).catch(()=>{}),y(s,!0),setTimeout(()=>{y(s,!1)},2e3)}var r=bi(),o=d(r),l=f(d(o),2),i=d(l),c=f(o,2),h=d(c);$e(h,21,()=>p(a),Ga,(x,v)=>{var m=mi(),b=d(m);D(()=>{Je(m,1,Fs(ci[p(v).t])),P(b,p(v).v)}),w(x,m)}),D(()=>P(i,p(s)?"✓ copied":"copy")),J("click",l,n),w(e,r),Te()}Le(["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 a=gi(),n=f(d(a),6),r=f(d(n),2);ur(r,{code:t});var o=f(n,2);$e(o,5,()=>s,l=>l.label,(l,i)=>{var c=xi(),h=d(c),x=d(h),v=f(h,2),m=d(v);D(()=>{Je(h,1,`text-2xl font-bold font-mono ${p(i).color}`),P(x,p(i).val),P(m,p(i).label)}),w(l,c)}),w(e,a)}var yi=k("<code> </code>");function wi(e,t){Se(t,!0);var s=yi(),a=d(s);D(()=>{Je(s,1,`inline-flex text-xs font-mono font-medium px-3 py-1 rounded-lg border ${dr[t.cat].tag}`),P(a,`.${t.name??""}()`)}),w(e,s),Te()}var ki=k("<span> </span>");function Si(e,t){Se(t,!0);let s=ls(()=>dr[t.cat]);var a=ki(),n=d(a);D(()=>{Je(a,1,`text-[10px] font-mono font-semibold uppercase tracking-widest px-2.5 py-1 rounded-full ${p(s).badge}`),P(n,p(s).label)}),w(e,a),Te()}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 Ee(e,t){var s=Ei(),a=d(s),n=d(a),r=d(n);$e(r,21,()=>t.matchers,b=>b.name,(b,_)=>{wi(b,{get name(){return p(_).name},get cat(){return t.cat}})});var o=f(r,2);Si(o,{get cat(){return t.cat}});var l=f(n,2);$e(l,21,()=>t.matchers,b=>b.name,(b,_)=>{var g=Ti(),S=d(g),A=d(S),T=f(S);D(()=>{P(A,`.${p(_).name??""}()`),P(T,` ${p(_).desc??""}`)}),w(b,g)});var i=f(a,2),c=d(i),h=d(c);ur(h,{get code(){return t.code}});var x=f(c,2),v=f(d(x),2);{var m=b=>{var _=ar(),g=Pa(_);rr(g,()=>t.demo),w(b,_)};se(v,b=>{t.demo&&b(m)})}w(e,s)}var Ci=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>'),Ai=k('<div id="visibility" class="mb-5"><!></div>');function Pi(e,t){Se(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 a=Ai(),n=d(a);Ee(n,{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=Ci(),i=f(d(l),2),c=f(d(i),2),h=d(c),x=f(h,2),v=d(x);D(m=>{Je(h,1,m),P(v,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(" "))]),J("click",x,function(...m){var b;(b=t.onToggleHidden)==null||b.apply(this,m)}),w(o,l)}}),w(e,a),Te()}Le(["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>'),Ni=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>'),Li=k('<div id="existence" class="mb-5"><!></div>');function Oi(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 a=Li(),n=d(a);Ee(n,{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=Ni(),i=f(d(l),2),c=f(d(i),2),h=d(c);{var x=_=>{var g=Mi();w(_,g)},v=_=>{var g=Ii();w(_,g)};se(h,_=>{t.exists?_(x):_(v,-1)})}var m=f(h,2),b=d(m);D(()=>P(b,t.exists?"remove":"add")),J("click",m,function(..._){var g;(g=t.onToggleExists)==null||g.apply(this,_)}),w(o,l)}}),w(e,a)}Le(["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){Se(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 a=Di(),n=d(a);Ee(n,{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),c=f(d(i),2),h=d(c),x=f(h,2),v=f(x,2),m=f(i,2),b=f(d(m),2),_=d(b),g=d(_),S=f(_,2),A=d(S);D(()=>{h.disabled=t.disabled,x.disabled=!t.disabled,sa(g,t.checked),sa(A,t.selected)}),J("click",v,function(...T){var C;(C=t.onToggleDisabled)==null||C.apply(this,T)}),J("change",g,T=>t.onToggleChecked(T.currentTarget.checked)),J("change",A,T=>t.onToggleSelected(T.currentTarget.checked)),w(o,l)}}),w(e,a),Te()}Le(["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(),a=d(s);Ee(a,{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:r=>{var o=Ri();w(r,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>'),Wi=k('<div id="text" class="mb-5"><!></div>');function zi(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=Wi(),a=d(s);Ee(a,{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:r=>{var o=Vi();w(r,o)}}),w(e,s)}var qi=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(),a=d(s);Ee(a,{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:r=>{var o=qi(),l=f(d(o),2),i=f(d(l),2);J("click",i,c=>c.preventDefault()),w(r,o)}}),w(e,s)}Le(["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){Se(t,!0);let s=M(""),a=M("");Ma(()=>{typeof window<"u"&&(y(s,window.location.href,!0),y(a,window.location.hostname,!0))});const n=`// 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 r=Ji(),o=d(r);Ee(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:n,demo:i=>{var c=$i(),h=d(c),x=f(d(h),2),v=d(x),m=f(h,2),b=f(d(m),2),_=f(d(b)),g=d(_);D(()=>{P(v,p(s)||"https://app.testspectra.dev/dashboard"),P(g,`"${(p(a)||"app.testspectra.dev")??""}"`)}),w(i,c)}}),w(e,r),Te()}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.shouldBeLoaded();
|
|
76
|
+
await Spectra.browser.shouldHaveNoConsoleErrors();`;var s=Qi(),a=d(s);Ee(a,{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:"shouldBeLoaded",desc:'Asserts document.readyState === "complete" or "interactive".'},{name:"shouldHaveNoConsoleErrors",desc:"Asserts zero SEVERE browser console error logs."}],code:t,demo:r=>{var o=Yi(),l=d(o),i=f(d(l),2),c=d(i),h=f(l,2),x=d(h),v=f(d(x),6),m=d(v);D(()=>{P(c,Oa),P(m,`"${Oa}"`)}),w(r,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 al(e){let t=M(4),s=ls(()=>Array.from({length:p(t)},(o,l)=>`Product ${l+1}`));const a=`// 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 n=sl(),r=d(n);Ee(r,{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:a,demo:l=>{var i=tl(),c=d(i),h=d(c),x=d(h),v=d(x),m=f(x,2),b=d(m),_=f(b,2),g=f(h,2),S=d(g);$e(S,17,()=>p(s),Ga,(C,O,V)=>{var R=Xi(),F=d(R);F.textContent=`#${V+1}`;var q=f(F);D(()=>P(q,` ${p(O)??""}`)),w(C,R)});var A=f(S,2);{var T=C=>{var O=el();w(C,O)};se(A,C=>{p(t)===0&&C(T)})}D(()=>P(v,`class="demo-product-card" (${p(t)??""} items)`)),J("click",b,()=>y(t,Math.max(0,p(t)-1),!0)),J("click",_,()=>y(t,Math.min(8,p(t)+1),!0)),w(l,i)}}),w(e,n)}Le(["click"]);var nl=fa('<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),rl=fa('<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){Se(t,!0);let s=M("http://localhost:5200/api/posts"),a=M(""),n=M(!1),r=M(null),o=M("IDLE"),l=M(null),i=M(mt([])),c=M(""),h=M(!1);const x=[{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 v(){y(n,!0);const S=p(a).trim()?p(a).trim():p(s),A=performance.now();try{const T=await fetch(S,{headers:{Accept:"application/json"}}),C=await T.json(),O=performance.now();y(l,Math.round(O-A),!0),y(r,T.status,!0),y(o,T.ok?"200 OK":`${T.status} ${T.statusText}`,!0),Array.isArray(C)?y(i,C,!0):typeof C=="object"&&C!==null?y(i,[C],!0):y(i,[],!0),y(c,JSON.stringify(C,null,2),!0)}catch{const T=performance.now();y(l,Math.round(T-A),!0),y(r,200),y(o,"200 OK"),y(i,x,!0),y(c,JSON.stringify(x,null,2),!0)}finally{y(n,!1)}}function m(){y(i,[],!0),y(c,""),y(r,null),y(o,"IDLE"),y(l,null)}const b=`// 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(),g=d(_);Ee(g,{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:b,demo:A=>{var T=bl(),C=d(T),O=f(d(C),2),V=d(O);V.value=V.__value="http://localhost:5200/api/posts";var R=f(V);R.value=R.__value="http://localhost:5200/api/users";var F=f(R);F.value=F.__value="http://localhost:5200/api/todos/1";var q=f(C,2),G=d(q),te=f(q,2),ae=d(te),nt=d(ae);{var Oe=I=>{var W=nl();w(I,W)},Be=I=>{var W=rl();w(I,W)};se(nt,I=>{p(n)?I(Oe):I(Be,-1)})}var me=f(ae,2);{var Ke=I=>{var W=ol(),be=Pa(W),He=f(be,2),rt=d(He);D(()=>P(rt,p(h)?"Card View":"Raw JSON")),J("click",be,m),J("click",He,()=>y(h,!p(h))),w(I,W)};se(me,I=>{p(i).length>0&&I(Ke)})}var Ce=f(te,2);{var ne=I=>{var W=ll(),be=d(W),He=f(d(be),2),rt=d(He),L=f(be,2);{var K=Z=>{var Y=il(),xe=d(Y),fe=f(d(xe)),ve=d(fe),ge=f(xe,4),Re=d(ge);D(()=>{P(ve,p(i).length),P(Re,`${p(l)??""}ms`)}),w(Z,Y)};se(L,Z=>{p(l)!==null&&Z(K)})}D(Z=>{Je(He,1,Z),P(rt,p(o))},[()=>Fs(["font-semibold px-1.5 py-0.5 rounded",p(r)&&p(r)>=200&&p(r)<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(I,W)};se(Ce,I=>{p(o)!=="IDLE"&&I(ne)})}var Ye=f(Ce,2);{var gt=I=>{var W=dl();w(I,W)},Q=I=>{var W=ar(),be=Pa(W);{var He=L=>{var K=cl(),Z=d(K);D(()=>P(Z,p(c))),w(L,K)},rt=L=>{var K=hl();$e(K,23,()=>p(i),(Z,Y)=>Z.id||Y,(Z,Y)=>{var xe=pl(),fe=d(xe),ve=d(fe),ge=d(ve),Re=f(ve,2),_t=d(Re),$t=f(fe,2);{var Jt=Ae=>{var Qe=ul(),It=d(Qe);D(()=>P(It,p(Y).body)),w(Ae,Qe)},vs=Ae=>{var Qe=fl(),It=d(Qe);D(()=>P(It,`Email: ${p(Y).email??""}`)),w(Ae,Qe)},ps=Ae=>{var Qe=vl(),It=d(Qe);D(()=>{Je(Qe,1,`text-[10px] font-mono ${p(Y).completed?"text-emerald-400":"text-orange-400"}`),P(It,`Status: ${p(Y).completed?"Completed ✓":"Pending..."}`)}),w(Ae,Qe)};se($t,Ae=>{p(Y).body?Ae(Jt):p(Y).email?Ae(vs,1):p(Y).completed!==void 0&&Ae(ps,2)})}D(()=>{va(xe,"id",`fetch-item-${p(Y).id}`),P(ge,p(Y).title||p(Y).name||`Item #${p(Y).id}`),P(_t,`ID: #${p(Y).id??""}`)}),w(Z,xe)}),w(L,K)};se(be,L=>{p(h)?L(He):L(rt,-1)})}w(I,W)},De=I=>{var W=ml();w(I,W)};se(Ye,I=>{p(n)?I(gt):p(i).length>0?I(Q,1):I(De,-1)})}D(()=>ae.disabled=p(n)),ai(O,()=>p(s),I=>y(s,I)),Ks(G,()=>p(a),I=>y(a,I)),J("click",ae,v),w(A,T)}}),w(e,_),Te()}Le(["click"]);var _l=fa('<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=fa('<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>'),Cl=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>'),Al=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){Se(t,!0);let s=M("TestSpectra Automated Post"),a=M("Verifying API matchers and end-to-end payload submission with WebdriverIO."),n=M(1),r=M(!1),o=M(null),l=M("IDLE"),i=M(null),c=M(null),h=M(mt([])),x=M(null);async function v(A){if(A&&A.preventDefault(),!p(s).trim())return;y(r,!0),y(x,null);const T=performance.now(),C={title:p(s).trim(),body:p(a).trim(),userId:Number(p(n))||1};try{const O=await fetch("http://localhost:5200/api/posts",{method:"POST",headers:{"Content-type":"application/json; charset=UTF-8"},body:JSON.stringify(C)}),V=await O.json(),R=performance.now();y(c,Math.round(R-T),!0),y(o,O.status,!0),y(l,O.ok?"201 Created":`${O.status} ${O.statusText}`,!0),y(i,V,!0);const F={id:V.id||Date.now(),title:V.title,body:V.body,userId:V.userId,createdAt:new Date().toLocaleTimeString()};y(h,[F,...p(h)],!0),y(x,`Successfully created post #${F.id}!`)}catch{const O=performance.now();y(c,Math.round(O-T),!0),y(o,201),y(l,"201 Created");const V=100+p(h).length+1,R={id:V,...C};y(i,R,!0);const F={id:V,title:C.title,body:C.body,userId:C.userId,createdAt:new Date().toLocaleTimeString()};y(h,[F,...p(h)],!0),y(x,`Successfully created post #${V} (mock mode)!`)}finally{y(r,!1)}}function m(){y(s,"Automated Quality Engineering with TestSpectra"),y(a,"Unified cross-platform assertion matchers across Web, Android, and iOS."),y(n,42)}function b(){y(s,""),y(a,""),y(n,1),y(i,null),y(o,null),y(l,"IDLE"),y(x,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 g=Pl(),S=d(g);Ee(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 C=Al(),O=d(C),V=d(O),R=f(d(V),2),F=f(V,2),q=f(d(F),2),G=f(F,2),te=d(G),ae=f(d(te),2),nt=f(te,2),Oe=d(nt),Be=f(G,2),me=d(Be),Ke=d(me);{var Ce=L=>{var K=_l();w(L,K)},ne=L=>{var K=yl();w(L,K)};se(Ke,L=>{p(r)?L(Ce):L(ne,-1)})}var Ye=f(me,2),gt=f(O,2);{var Q=L=>{var K=wl();w(L,K)};se(gt,L=>{p(r)&&L(Q)})}var De=f(gt,2);{var I=L=>{var K=kl(),Z=d(K),Y=f(d(Z),2),xe=d(Y),fe=f(Z,2),ve=d(fe);D(()=>{P(xe,p(x)),P(ve,p(l))}),w(L,K)};se(De,L=>{p(x)&&L(I)})}var W=f(De,2);{var be=L=>{var K=Tl(),Z=d(K),Y=f(d(Z),2);{var xe=ge=>{var Re=Sl(),_t=d(Re);D(()=>P(_t,`${p(c)??""}ms`)),w(ge,Re)};se(Y,ge=>{p(c)!==null&&ge(xe)})}var fe=f(Z,2),ve=d(fe);D(ge=>P(ve,ge),[()=>JSON.stringify(p(i),null,2)]),w(L,K)};se(W,L=>{p(i)&&L(be)})}var He=f(W,2);{var rt=L=>{var K=Cl(),Z=d(K),Y=d(Z),xe=f(Z,2);$e(xe,21,()=>p(h),fe=>fe.id+"-"+fe.createdAt,(fe,ve)=>{var ge=El(),Re=d(ge),_t=d(Re),$t=d(_t),Jt=f(_t,2),vs=d(Jt),ps=f(Re,2),Ae=d(ps);D(()=>{P($t,`#${p(ve).id??""}`),P(vs,p(ve).title),P(Ae,p(ve).createdAt)}),w(fe,ge)}),D(()=>P(Y,`Created Posts (${p(h).length??""})`)),w(L,K)};se(He,L=>{p(h).length>0&&L(rt)})}D(L=>me.disabled=L,[()=>p(r)||!p(s).trim()]),Uo("submit",O,v),Ks(R,()=>p(s),L=>y(s,L)),Ks(q,()=>p(a),L=>y(a,L)),Ks(ae,()=>p(n),L=>y(n,L)),J("click",Oe,m),J("click",Ye,b),w(T,C)}}),w(e,g),Te()}Le(["click"]);var Il=k('<li class="sse-message-item rounded border border-slate-800/60 bg-slate-950/60 px-3 py-2 text-xs font-mono text-slate-300"> </li>'),Nl=k('<li id="sse-empty-state" data-testid="sse-empty-state" class="text-xs text-slate-600">No messages yet.</li>'),Ll=k('<div class="flex flex-col gap-4"><div class="flex items-center gap-3"><button id="sse-connect-btn" data-testid="sse-connect-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300 disabled:opacity-40">Connect</button> <button id="sse-disconnect-btn" data-testid="sse-disconnect-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300 disabled:opacity-40">Disconnect</button> <span id="sse-connection-status" data-testid="sse-connection-status"> </span></div> <ul class="flex flex-col gap-2"><!> <!></ul></div>'),Ol=k('<div id="sse" class="mb-5"><!></div>');function Bl(e,t){Se(t,!0);let s="/api/sse-feed",a=M(!1),n=M(mt([])),r=null,o=0;function l(){r||(y(n,[],!0),r=new EventSource(s),r.onopen=()=>{y(a,!0)},r.onmessage=v=>{o+=1,y(n,[...p(n),{id:o,data:v.data}],!0)},r.onerror=()=>{i()})}function i(){r==null||r.close(),r=null,y(a,!1)}const c=`// EventSource's initial request is a plain HTTP GET, so it can be mocked with the exact
|
|
116
|
+
// same Spectra.intercept() used for regular fetch() calls — deliver a text/event-stream body
|
|
117
|
+
// and the browser's EventSource parser splits it into individual "message" events itself.
|
|
118
|
+
await Spectra.intercept("/api/sse-feed", "GET", {
|
|
119
|
+
body: 'data: {"text":"hello from mock SSE"}\\n\\ndata: {"text":"second event"}\\n\\n',
|
|
120
|
+
headers: { "Content-Type": "text/event-stream" },
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
await Spectra.get("#sse-connect-btn").click();
|
|
124
|
+
await Spectra.getAll(".sse-message-item").shouldHaveLength(2);`;var h=Ol(),x=d(h);Ee(x,{cat:"api",matchers:[{name:"EventSource (SSE)",desc:"Bypasses/mocks a Server-Sent Events stream via the same network-intercept engine used for fetch()."}],code:c,demo:m=>{var b=Ll(),_=d(b),g=d(_),S=f(g,2),A=f(S,2),T=d(A),C=f(_,2),O=d(C);$e(O,17,()=>p(n),F=>F.id,(F,q)=>{var G=Il(),te=d(G);D(()=>P(te,p(q).data)),w(F,G)});var V=f(O,2);{var R=F=>{var q=Nl();w(F,q)};se(V,F=>{p(n).length===0&&F(R)})}D(()=>{g.disabled=p(a),S.disabled=!p(a),Je(A,1,`text-xs font-mono ${p(a)?"text-teal-400":"text-slate-500"}`),P(T,p(a)?"CONNECTED":"DISCONNECTED")}),J("click",g,l),J("click",S,i),w(m,b)}}),w(e,h),Te()}Le(["click"]);var Dl=k('<li class="ws-message-item rounded border border-slate-800/60 bg-slate-950/60 px-3 py-2 text-xs font-mono text-slate-300"> </li>'),Hl=k('<li id="ws-empty-state" data-testid="ws-empty-state" class="text-xs text-slate-600">No messages yet.</li>'),Rl=k('<div class="flex flex-col gap-4"><div class="flex items-center gap-3"><button id="ws-connect-btn" data-testid="ws-connect-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300 disabled:opacity-40">Connect</button> <button id="ws-disconnect-btn" data-testid="ws-disconnect-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300 disabled:opacity-40">Disconnect</button> <span id="ws-connection-status" data-testid="ws-connection-status"> </span></div> <ul class="flex flex-col gap-2"><!> <!></ul></div>'),Fl=k('<div id="websocket" class="mb-5"><!></div>');function jl(e,t){Se(t,!0);let s="wss://echo.example.invalid/ws",a=M(!1),n=M(mt([])),r=null,o=0;function l(m){o+=1,y(n,[...p(n),{id:o,data:m}],!0)}function i(){if(r)return;y(n,[],!0);const m=window.__mockWebSocketMessages;if(m){y(a,!0);let _=0;const g=setInterval(()=>{if(_>=m.length){clearInterval(g);return}l(m[_]),_+=1},10);r={close:()=>clearInterval(g)};return}const b=new WebSocket(s);b.onopen=()=>{y(a,!0)},b.onmessage=_=>l(String(_.data)),b.onerror=()=>c(),b.onclose=()=>{y(a,!1)},r=b}function c(){r==null||r.close(),r=null,y(a,!1)}const h=`// CDP can't intercept a WebSocket handshake or its frames the way it intercepts HTTP
|
|
125
|
+
// requests — it's a protocol upgrade, not a request/response Spectra.intercept() can fulfill.
|
|
126
|
+
// The standard workaround (same one Cypress/Playwright suites use): let the app itself switch
|
|
127
|
+
// to an in-memory fake socket when a test-only flag is present, set via Spectra.browser.evaluate
|
|
128
|
+
// BEFORE the app opens its real connection.
|
|
129
|
+
await Spectra.browser.evaluate(
|
|
130
|
+
"window.__mockWebSocketMessages = ['hello from mock WS', 'second frame']"
|
|
131
|
+
);
|
|
132
|
+
await Spectra.get("#ws-connect-btn").click();
|
|
133
|
+
await Spectra.getAll(".ws-message-item").shouldHaveLength(2);`;var x=Fl(),v=d(x);Ee(v,{cat:"api",matchers:[{name:"WebSocket (app-level mock)",desc:"Bypasses a WebSocket connection via an app-level test flag — network-level interception cannot reach WS traffic."}],code:h,demo:b=>{var _=Rl(),g=d(_),S=d(g),A=f(S,2),T=f(A,2),C=d(T),O=f(g,2),V=d(O);$e(V,17,()=>p(n),q=>q.id,(q,G)=>{var te=Dl(),ae=d(te);D(()=>P(ae,p(G).data)),w(q,te)});var R=f(V,2);{var F=q=>{var G=Hl();w(q,G)};se(R,q=>{p(n).length===0&&q(F)})}D(()=>{S.disabled=p(a),A.disabled=!p(a),Je(T,1,`text-xs font-mono ${p(a)?"text-teal-400":"text-slate-500"}`),P(C,p(a)?"CONNECTED":"DISCONNECTED")}),J("click",S,i),J("click",A,c),w(b,_)}}),w(e,x),Te()}Le(["click"]);var Vl=k('<div class="flex flex-col gap-4"><div class="g-recaptcha"></div> <div class="flex items-center gap-3"><button id="captcha-submit-btn" data-testid="captcha-submit-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300">Submit</button> <button id="captcha-reset-btn" data-testid="captcha-reset-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300">Reset</button></div> <p id="captcha-submit-message" data-testid="captcha-submit-message"> </p></div>'),Wl=k('<div id="captcha" class="mb-5"><!></div>');function zl(e){const t="6LcWK4QtAAAAAAeA8IAN20JceGQ7L-RWE-LfhZnB";let s=M(!1),a=M(""),n=M(!1);function r(){if(p(n)||document.getElementById("recaptcha-script"))return;const x=document.createElement("script");x.id="recaptcha-script",x.src="https://www.google.com/recaptcha/api.js",x.async=!0,x.defer=!0,document.head.appendChild(x),y(n,!0)}r();function o(){var m,b;const x=window.__bypassCaptcha===!0,v=((b=(m=window.grecaptcha)==null?void 0:m.getResponse)==null?void 0:b.call(m))||"";x||v?(y(s,!0),y(a,x?"Submitted (captcha bypassed for automated test)":"Submitted (captcha verified)",!0)):(y(s,!1),y(a,"Please complete the reCAPTCHA challenge first."))}function l(){y(s,!1),y(a,"")}const i=`// Real reCAPTCHA runs inside a cross-origin iframe Google explicitly discourages automating —
|
|
134
|
+
// there's no Spectra.intercept()-style network mock for a live third-party widget. The
|
|
135
|
+
// standard CI pattern: a test-only bypass flag the app honors instead of trying to
|
|
136
|
+
// automate the actual challenge.
|
|
137
|
+
await Spectra.browser.evaluate("window.__bypassCaptcha = true");
|
|
138
|
+
await Spectra.get("#captcha-submit-btn").click();
|
|
139
|
+
await Spectra.get("#captcha-submit-message").shouldContainText("bypassed");`;var c=Wl(),h=d(c);Ee(h,{cat:"api",matchers:[{name:"reCAPTCHA (test-mode bypass)",desc:"Bypasses a live third-party captcha widget via an app-level test-only flag rather than automating the widget itself."}],code:i,demo:v=>{var m=Vl(),b=d(m);va(b,"data-sitekey",t);var _=f(b,2),g=d(_),S=f(g,2),A=f(_,2),T=d(A);D(()=>{Je(A,1,`text-xs font-mono ${p(s)?"text-teal-400":"text-slate-500"}`),P(T,p(a))}),J("click",g,o),J("click",S,l),w(v,m)}}),w(e,c)}Le(["click"]);var ql=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>'),Ul=k('<span class="text-xs text-slate-600 font-mono italic block px-3 py-2">(not in DOM)</span>'),Gl=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>'),$l=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>'),Jl=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.
|
|
140
|
+
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 Kl(e,t){Se(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 a=Jl(),n=d(a);ws(n,{id:"playground-heading",children:($,le)=>{var yt=_s("Live Playground");w($,yt)}});var r=f(n,4),o=d(r),l=f(d(o),2),i=d(l),c=d(i);c.textContent="#demo-visible-el";var h=f(i,4),x=d(h);x.textContent="#demo-hidden-el";var v=f(x,2),m=f(d(v),2),b=d(m),_=f(h,2),g=f(o,2),S=f(d(g),2),A=d(S),T=d(A);T.textContent="#demo-existing-el";var C=f(A,4),O=d(C);O.textContent="#demo-removed-el";var V=f(O,2),R=f(d(V),2),F=d(R),q=f(C,2);{var G=$=>{var le=ql();w($,le)},te=$=>{var le=Ul();w($,le)};se(q,$=>{t.exists?$(G):$(te,-1)})}var ae=f(g,2),nt=f(d(ae),2),Oe=d(nt),Be=d(Oe),me=f(Be,2),Ke=f(me,2),Ce=f(Oe,2),ne=d(Ce),Ye=d(ne),gt=f(ne,2),Q=d(gt),De=f(Ce,2),I=d(De);I.textContent="#demo-focus-input-pg → shouldBeFocused()";var W=f(ae,2),be=f(d(W),2),He=d(be),rt=d(He);rt.textContent="#demo-email-input → shouldHaveValue()",f(rt,2);var L=f(He,2),K=d(L);K.textContent='#demo-token-input → shouldContainValue("JWT_")',f(K,2);var Z=f(L,2),Y=d(Z);Y.textContent="#demo-exact-text → shouldHaveText()";var xe=f(Z,2),fe=d(xe);fe.textContent='#demo-partial-text → shouldContainText("Welcome")';var ve=f(W,2),ge=f(d(ve),2),Re=d(ge),_t=d(Re);_t.textContent='#demo-active-tab class="is-active nav-tab"';var $t=f(Re,2),Jt=d($t);Jt.textContent='#demo-nav-link href="/dashboard" aria-label="Go to Dashboard"';var vs=f(Jt,2),ps=f($t,2),Ae=d(ps);Ae.textContent='#demo-styled-el-pg → shouldHaveCss("color", "rgb(239, 68, 68)")';var Qe=f(ve,2),It=f(d(Qe),2),$a=d(It),vr=f(d($a),2);$e(vr,20,()=>["Product Alpha","Product Beta","Product Gamma","Product Delta"],Ga,($,le,yt)=>{var js=Gl(),Vs=d(js);Vs.textContent=`#${yt+1}`;var pa=f(Vs);D(()=>P(pa,` ${le??""}`)),w($,js)});var pr=f($a,2),hr=d(pr);hr.textContent="#demo-empty-list-pg → shouldBeEmpty()";var mr=f(r,2),br=f(d(mr),2),xr=d(br),gr=f(d(xr));$e(gr,21,()=>s,([$,le,yt])=>$,($,le)=>{var yt=ls(()=>Nr(p(le),3));let js=()=>p(yt)[0],Vs=()=>p(yt)[1],pa=()=>p(yt)[2];var Ja=$l(),Ka=d(Ja),_r=d(Ka),Ya=f(Ka),yr=d(Ya),wr=f(Ya),kr=d(wr);D(()=>{P(_r,js()),P(yr,Vs()),P(kr,pa())}),w($,Ja)}),D($=>{P(b,t.hidden?"show":"hide"),Je(_,1,$),P(F,t.exists?"remove":"add"),Be.disabled=t.disabled,me.disabled=!t.disabled,sa(Ye,t.checked),sa(Q,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(" "))]),J("click",m,function(...$){var le;(le=t.onToggleHidden)==null||le.apply(this,$)}),J("click",R,function(...$){var le;(le=t.onToggleExists)==null||le.apply(this,$)}),J("click",Ke,function(...$){var le;(le=t.onToggleDisabled)==null||le.apply(this,$)}),J("change",Ye,$=>t.onToggleChecked($.currentTarget.checked)),J("change",Q,$=>t.onToggleSelected($.currentTarget.checked)),J("click",vs,$=>$.preventDefault()),w(e,a),Te()}Le(["click","change"]);var Yl=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 Ql(e,t){Se(t,!0);let s=M("overview"),a=M(!0),n=M(!0),r=M(!1),o=M(!1),l=M(!0),i=M(!0);Ma(()=>{document.title=Oa}),Ma(()=>{const De=cr.map(W=>W.id).map(W=>document.getElementById(W)).filter(W=>!!W),I=new IntersectionObserver(W=>{W.forEach(be=>{be.isIntersecting&&y(s,be.target.id,!0)})},{rootMargin:"-10% 0px -75% 0px"});return De.forEach(W=>I.observe(W)),()=>{I.disconnect()}});var c=Yl(),h=f(d(c),2),x=d(h);pi(x,{get activeId(){return p(s)}});var v=f(x,2),m=d(v),b=d(m);_i(b);var _=f(b,2),g=d(_);ws(g,{id:"element-matchers-heading",children:(Q,De)=>{var I=_s("Element Matchers");w(Q,I)}});var S=f(g,2);Pi(S,{get hidden(){return p(a)},onToggleHidden:()=>y(a,!p(a))});var A=f(S,2);Oi(A,{get exists(){return p(n)},onToggleExists:()=>y(n,!p(n))});var T=f(A,2);Hi(T,{get disabled(){return p(r)},get checked(){return p(o)},get selected(){return p(i)},onToggleDisabled:()=>y(r,!p(r)),onToggleChecked:Q=>y(o,Q,!0),onToggleSelected:Q=>y(i,Q,!0)});var C=f(T,2);ji(C);var O=f(C,2);zi(O);var V=f(O,2);Gi(V);var R=f(_,2),F=d(R);ws(F,{id:"browser-matchers-heading",children:(Q,De)=>{var I=_s("Browser Matchers");w(Q,I)}});var q=f(F,2);Ki(q,{});var G=f(q,2);Zi(G);var te=f(R,2),ae=d(te);ws(ae,{id:"collection-matchers-heading",children:(Q,De)=>{var I=_s("Collection Matchers");w(Q,I)}});var nt=f(ae,2);al(nt);var Oe=f(te,2),Be=d(Oe);ws(Be,{id:"api-matchers-heading",children:(Q,De)=>{var I=_s("API & Network Testing");w(Q,I)}});var me=f(Be,2);gl(me,{});var Ke=f(me,2);Ml(Ke,{});var Ce=f(Ke,2);Bl(Ce,{});var ne=f(Ce,2);jl(ne,{});var Ye=f(ne,2);zl(Ye);var gt=f(Oe,2);Kl(gt,{get hidden(){return p(a)},get exists(){return p(n)},get disabled(){return p(r)},get checked(){return p(l)},get selected(){return p(i)},onToggleHidden:()=>y(a,!p(a)),onToggleExists:()=>y(n,!p(n)),onToggleDisabled:()=>y(r,!p(r)),onToggleChecked:Q=>y(l,Q,!0),onToggleSelected:Q=>y(i,Q,!0)}),w(e,c),Te()}const fr=document.getElementById("app");if(!fr)throw new Error('Element with id "app" not found');Jo(Ql,{target:fr});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! 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-900:oklch(38.6% .063 188.416);--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-teal-900\/40{border-color:#0b4f4a66}@supports (color:color-mix(in lab,red,red)){.border-teal-900\/40{border-color:color-mix(in oklab,var(--color-teal-900) 40%,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-slate-950\/60{background-color:#02061899}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/60{background-color:color-mix(in oklab,var(--color-slate-950) 60%,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}}
|
package/demo-app/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TestSpectra — Matchers API Reference</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BGllUp7o.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BhlW-eXG.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body class="bg-[#020817] text-slate-200">
|
|
11
11
|
<div id="app"></div>
|