@testspectra/cli 1.0.62 → 1.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -32
- package/demo-app/assets/index-DAUlrHTr.css +1 -0
- package/demo-app/assets/index-DN2Kb0A8.js +100 -0
- package/demo-app/index.html +13 -0
- package/dist/commands/add.js +4 -4
- package/dist/commands/demo.d.ts +3 -0
- package/dist/commands/demo.js +28 -0
- package/dist/commands/init.js +8 -8
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.js +18 -1
- package/dist/index.js +7 -0
- package/dist/utils/demo-server.d.ts +11 -0
- package/dist/utils/demo-server.js +97 -0
- package/package.json +4 -3
- package/templates/default/CLAUDE.md +2 -3
- package/templates/default/package.json +1 -1
- package/templates/nx/CLAUDE.md +4 -4
- package/templates/nx/package.json +5 -1
- package/templates/nx/packages/matchers/e2e/project.json +37 -0
- package/templates/nx/packages/playground/e2e/project.json +37 -0
package/README.md
CHANGED
|
@@ -179,35 +179,36 @@ export default defineConfig({
|
|
|
179
179
|
├── tsconfig.android.json # Android platform TypeScript scope
|
|
180
180
|
├── tsconfig.ios.json # iOS platform TypeScript scope
|
|
181
181
|
├── page-objects/ # Page Object Model folders
|
|
182
|
-
│ └──
|
|
182
|
+
│ └── PlaygroundPage/
|
|
183
183
|
│ ├── web.ts
|
|
184
184
|
│ └── mobile.ts
|
|
185
|
-
├──
|
|
186
|
-
│
|
|
187
|
-
│
|
|
188
|
-
│
|
|
189
|
-
|
|
190
|
-
│ └──
|
|
191
|
-
│
|
|
192
|
-
│
|
|
185
|
+
├── support/
|
|
186
|
+
│ ├── actions/ # Reusable atomic actions
|
|
187
|
+
│ │ └── fillCredentials/
|
|
188
|
+
│ │ ├── web.action.ts
|
|
189
|
+
│ │ └── mobile.action.ts
|
|
190
|
+
│ └── steps/ # High-level business flows
|
|
191
|
+
│ └── verifyPlaygroundState/
|
|
192
|
+
│ ├── web.step.ts
|
|
193
|
+
│ └── mobile.step.ts
|
|
193
194
|
├── global-hooks/ # Global lifecycle hooks
|
|
194
|
-
│ └── before
|
|
195
|
+
│ └── before/
|
|
196
|
+
│ └── web.hook.ts
|
|
195
197
|
├── specs/ # Layered zero-import test cases
|
|
196
|
-
│ └──
|
|
197
|
-
│ └── TC-
|
|
198
|
+
│ └── Playground/
|
|
199
|
+
│ └── TC-0001-form-controls/
|
|
198
200
|
│ ├── web.test.ts
|
|
199
|
-
│
|
|
200
|
-
│ └── ios.test.ts
|
|
201
|
+
│ └── mobile.test.ts
|
|
201
202
|
├── fixtures/ # Platform-agnostic test data
|
|
202
|
-
│ └──
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
203
|
+
│ └── playgroundData.json
|
|
204
|
+
├── .testspectra/ # Auto-generated ambient typings & cache
|
|
205
|
+
│ └── types/
|
|
206
|
+
│ ├── fixtures.d.ts
|
|
207
|
+
│ ├── web.d.ts
|
|
208
|
+
│ ├── android.d.ts
|
|
209
|
+
│ ├── ios.d.ts
|
|
210
|
+
│ ├── mobile.d.ts
|
|
211
|
+
│ └── common.d.ts
|
|
211
212
|
```
|
|
212
213
|
|
|
213
214
|
---
|
|
@@ -230,19 +231,19 @@ TestSpectra features an enterprise-grade architecture for large monorepos: **"Ce
|
|
|
230
231
|
┌──────────────────────────────┴──────────────────────────────┐
|
|
231
232
|
▼ ▼
|
|
232
233
|
┌───────────────────────────────┐ ┌───────────────────────────────┐
|
|
233
|
-
│ shared/testing/ (Library) │ │
|
|
234
|
+
│ shared/testing/ (Library) │ │ packages/playground/e2e/ │
|
|
234
235
|
├───────────────────────────────┤ ├───────────────────────────────┤
|
|
235
236
|
│ - Shared Page Objects │ ◄─── Auto-Scanned Globals ──│ - Feature Specs (specs/) │
|
|
236
|
-
│ - Shared Steps (
|
|
237
|
-
│ - Shared Actions (
|
|
238
|
-
│ - Shared Fixtures (
|
|
237
|
+
│ - Shared Steps (verifyState) │ (100% Zero-Import!) │ - Feature Page Objects (POMs) │
|
|
238
|
+
│ - Shared Actions (fillCreds) │ │ - project.json (Nx Target) │
|
|
239
|
+
│ - Shared Fixtures (playData) │ │ - tsconfig.web/android/ios │
|
|
239
240
|
└───────────────────────────────┘ └───────────────────────────────┘
|
|
240
241
|
```
|
|
241
242
|
|
|
242
243
|
### Key Pillars of Monorepo Integration:
|
|
243
244
|
|
|
244
245
|
1. **Interactive Workspace Auto-Discovery (`spectra init`)**:
|
|
245
|
-
- Parses `pnpm-workspace.yaml` (e.g. `packages
|
|
246
|
+
- Parses `pnpm-workspace.yaml` (e.g. `packages/*`, `modules/**`).
|
|
246
247
|
- Scans sub-directories for existing `project.json` or `package.json`.
|
|
247
248
|
- Prompts the user with an interactive multi-select checkbox to choose which features will receive E2E testing.
|
|
248
249
|
- Prompts for customizable E2E folder names (e.g. `e2e`, `test/e2e`) and the shared testing library path (`shared/testing`).
|
|
@@ -253,18 +254,18 @@ TestSpectra features an enterprise-grade architecture for large monorepos: **"Ce
|
|
|
253
254
|
- Driver caches, binaries, and logs reside in `<root>/.testspectra/`, preventing repository clutter across individual feature folders.
|
|
254
255
|
|
|
255
256
|
3. **Global Zero-Import Consumption of Shared Library**:
|
|
256
|
-
- Entities placed inside `shared/testing/page-objects/`, `shared/testing/steps/`, `shared/testing/actions/`, and `shared/testing/fixtures/` are automatically aggregated into ambient declarations.
|
|
257
|
-
- Feature test specs consume shared Page Objects (`
|
|
257
|
+
- Entities placed inside `shared/testing/page-objects/`, `shared/testing/support/steps/`, `shared/testing/support/actions/`, and `shared/testing/fixtures/` are automatically aggregated into ambient declarations.
|
|
258
|
+
- Feature test specs consume shared Page Objects (`PlaygroundPage.open()`), steps (`Step.verifyPlaygroundState()`), actions (`Spectra.fillCredentials()`), and fixtures (`Fixture.playgroundData`) **without a single line of `import` statement**.
|
|
258
259
|
|
|
259
260
|
4. **Nx Target Execution & Affected Caching**:
|
|
260
261
|
- Each feature E2E folder includes an Nx `project.json`:
|
|
261
262
|
```json
|
|
262
263
|
{
|
|
263
|
-
"name": "
|
|
264
|
+
"name": "playground-e2e",
|
|
264
265
|
"targets": {
|
|
265
266
|
"e2e": {
|
|
266
267
|
"executor": "nx:run-commands",
|
|
267
|
-
"options": { "command": "spectra run", "cwd": "
|
|
268
|
+
"options": { "command": "spectra run", "cwd": "packages/playground/e2e" },
|
|
268
269
|
"configurations": {
|
|
269
270
|
"android": { "command": "spectra run --target android" },
|
|
270
271
|
"ios": { "command": "spectra run --target ios" },
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@import "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap";@layer components;@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:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-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-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--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-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-950:oklch(26.2% .051 172.552);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-md:28rem;--container-2xl:42rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--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:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--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%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset: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}.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\.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-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-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-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-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-amber-500{border-color:var(--color-amber-500)}.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-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-800{border-color:var(--color-slate-800)}.border-slate-800\/50{border-color:#1d293d80}@supports (color:color-mix(in lab, red, red)){.border-slate-800\/50{border-color:color-mix(in oklab, var(--color-slate-800) 50%, transparent)}}.border-slate-800\/60{border-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.border-slate-800\/60{border-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-800\/40{border-color:#005f5a66}@supports (color:color-mix(in lab, red, red)){.border-teal-800\/40{border-color:color-mix(in oklab, var(--color-teal-800) 40%, transparent)}}.border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab, red, red)){.border-teal-800\/50{border-color:color-mix(in oklab, var(--color-teal-800) 50%, transparent)}}.border-teal-800\/60{border-color:#005f5a99}@supports (color:color-mix(in lab, red, red)){.border-teal-800\/60{border-color:color-mix(in oklab, var(--color-teal-800) 60%, transparent)}}.border-transparent{border-color:#0000}.border-violet-500{border-color:var(--color-violet-500)}.border-violet-700\/50{border-color:#7008e780}@supports (color:color-mix(in lab, red, red)){.border-violet-700\/50{border-color:color-mix(in oklab, var(--color-violet-700) 50%, transparent)}}.border-violet-700\/60{border-color:#7008e799}@supports (color:color-mix(in lab, red, red)){.border-violet-700\/60{border-color:color-mix(in oklab, var(--color-violet-700) 60%, transparent)}}.border-violet-800\/60{border-color:#5d0ec099}@supports (color:color-mix(in lab, red, red)){.border-violet-800\/60{border-color:color-mix(in oklab, var(--color-violet-800) 60%, transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.bg-\[\#030a14\]{background-color:#030a14}.bg-\[\#020817\]{background-color:#020817}.bg-\[\#020817\]\/95{background-color:oklab(13.6274% -.00682116 -.0357611/.95)}.bg-amber-500{background-color:var(--color-amber-500)}.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-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-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\/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\/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-950{background-color:var(--color-slate-950)}.bg-slate-950\/20{background-color:#02061833}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/20{background-color:color-mix(in oklab, var(--color-slate-950) 20%, transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/10{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-950{background-color:var(--color-teal-950)}.bg-teal-950\/30{background-color:#022f2e4d}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/30{background-color:color-mix(in oklab, var(--color-teal-950) 30%, transparent)}}.bg-teal-950\/40{background-color:#022f2e66}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/40{background-color:color-mix(in oklab, var(--color-teal-950) 40%, transparent)}}.bg-teal-950\/50{background-color:#022f2e80}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/50{background-color:color-mix(in oklab, var(--color-teal-950) 50%, transparent)}}.bg-teal-950\/60{background-color:#022f2e99}@supports (color:color-mix(in lab, red, red)){.bg-teal-950\/60{background-color:color-mix(in oklab, var(--color-teal-950) 60%, transparent)}}.bg-transparent{background-color:#0000}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/10{background-color:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.bg-violet-950\/40{background-color:#2f0d6866}@supports (color:color-mix(in lab, red, red)){.bg-violet-950\/40{background-color:color-mix(in oklab, var(--color-violet-950) 40%, transparent)}}.bg-violet-950\/50{background-color:#2f0d6880}@supports (color:color-mix(in lab, red, red)){.bg-violet-950\/50{background-color:color-mix(in oklab, var(--color-violet-950) 50%, transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-600{--tw-gradient-from:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500{--tw-gradient-from:var(--color-teal-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600{--tw-gradient-to:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-500{--tw-gradient-to:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-500{--tw-gradient-to:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600{--tw-gradient-to:var(--color-teal-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-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-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-\[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-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-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-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-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}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-teal-400{accent-color:var(--color-teal-400)}.opacity-50{opacity:.5}.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}.first\:mt-0:first-child{margin-top:0}@media (hover:hover){.hover\:border-slate-600:hover{border-color:var(--color-slate-600)}.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-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-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-teal-700:focus{border-color:var(--color-teal-700)}.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}@media (width>=40rem){.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (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}}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible,d=()=>{};function f(e){for(var t=0;t<e.length;t++)e[t]()}function p(){var e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}function m(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var h=1024,g=2048,_=4096,v=8192,y=16384,b=32768,x=1<<25,S=65536,C=1<<19,w=1<<20,ee=1<<25,te=65536,ne=1<<21,re=1<<22,ie=1<<23,ae=Symbol(`$state`),oe=Symbol(``),se=Symbol(`attributes`),ce=Symbol(`class`),le=Symbol(`style`),ue=Symbol(`text`),de=Symbol(`form reset`),fe=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},pe=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function me(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function he(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function ge(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function _e(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function ve(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function ye(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function be(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function xe(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Se(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ce(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var we={},T=Symbol(`uninitialized`),Te=`http://www.w3.org/1999/xhtml`;function Ee(){console.warn(`https://svelte.dev/e/derived_inert`)}function De(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Oe(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var E=!1;function ke(e){E=e}var D;function O(e){if(e===null)throw De(),we;return D=e}function Ae(){return O(Qt(D))}function k(e){if(E){if(Qt(D)!==null)throw De(),we;D=e}}function A(e=1){if(E){for(var t=e,n=D;t--;)n=Qt(n);D=n}}function je(e=!0){for(var t=0,n=D;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=Qt(n);e&&n.remove(),n=i}}function Me(e){if(!e||e.nodeType!==8)throw De(),we;return e.data}function Ne(e){return e===this.v}function Pe(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Fe(e){return!Pe(e,this.v)}var Ie=!1,Le=!1;function Re(){Le=!0}var j=null;function ze(e){j=e}function Be(e,t=!1,n){j={p:j,i:!1,c:null,e:null,s:e,x:null,r:G,l:Le&&!t?{s:null,u:null,$:[]}:null}}function Ve(e){var t=j,n=t.e;if(n!==null){t.e=null;for(var r of n)mn(r)}return e!==void 0&&(t.x=e),t.i=!0,j=t.p,e??{}}function He(){return!Le||j!==null&&j.l===null}var Ue=[];function We(){var e=Ue;Ue=[],f(e)}function Ge(e){if(Ue.length===0&&!xt){var t=Ue;queueMicrotask(()=>{t===Ue&&We()})}Ue.push(e)}function Ke(e){var t=G;if(t===null)return U.f|=ie,e;if(!(t.f&32768)&&!(t.f&4))throw e;qe(e,t)}function qe(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}var Je=~(g|_|h);function M(e,t){e.f=e.f&Je|t}function Ye(e){e.f&512||e.deps===null?M(e,h):M(e,_)}function Xe(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=te,Xe(t.deps))}function Ze(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),Xe(e.deps),M(e,h)}var Qe=!1;function $e(e){let t=0,n=zt(0),r;return()=>{dn()&&(Y(n),_n(()=>(t===0&&(r=Zn(()=>e(()=>Ut(n)))),t+=1,()=>{Ge(()=>{--t,t===0&&(r?.(),r=void 0,Ut(n))})})))}}var et=S|C;function tt(e,t,n,r){new nt(e,t,n,r)}var nt=class{parent;is_pending=!1;transform_error;#e;#t=E?D:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=$e(()=>(this.#m=zt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=G;t.b=this,t.f|=128,n(e)},this.parent=G.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=vn(()=>{if(E){let e=this.#t;Ae();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},et),E&&(this.#e=D)}#g(){try{this.#a=V(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=V(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=V(()=>e(this.#e)),Ge(()=>{var e=this.#c=document.createDocumentFragment(),t=L();e.append(t),this.#a=this.#x(()=>V(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,wn(this.#o,()=>{this.#o=null}),this.#b(N))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=V(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();On(this.#a,e);let t=this.#n.pending;this.#o=V(()=>t(this.#e))}else this.#b(N)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){Ze(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=G,n=U,r=j;Pn(this.#i),W(this.#i),ze(this.#i.ctx);try{return Dt.ensure(),e()}catch(e){return Ke(e),null}finally{Pn(t),W(n),ze(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&wn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,Ge(()=>{this.#d=!1,this.#m&&Vt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),Y(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;N?.is_fork?(this.#a&&N.skip_effect(this.#a),this.#o&&N.skip_effect(this.#o),this.#s&&N.skip_effect(this.#s),N.oncommit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(H(this.#a),null),this.#o&&=(H(this.#o),null),this.#s&&=(H(this.#s),null),E&&(O(this.#t),A(),O(je()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){Oe();return}r=!0,i&&Ce(),this.#s!==null&&wn(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){qe(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return V(()=>{var t=G;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return qe(e,this.#i.parent),null}}))};Ge(()=>{var t;try{t=this.transform_error(e)}catch(e){qe(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>qe(e,this.#i&&this.#i.parent)):o(t)})}};function rt(e,t,n,r){let i=He()?st:dt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=G,c=it(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){qe(e,s)}at()}}var d=ot();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>lt(e))).then(u).catch(e=>qe(e,s)).finally(d)}l?l.then(()=>{c(),f(),at()}):f()}function it(){var e=G,t=U,n=j,r=N;return function(i=!0){Pn(e),W(t),ze(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function at(e=!0){Pn(null),W(null),ze(null),e&&N?.deactivate()}function ot(){var e=G,t=e.b,n=N,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function st(e){var t=2|g;return G!==null&&(G.f|=C),{ctx:j,deps:null,effects:null,equals:Ne,f:t,fn:e,reactions:null,rv:0,v:T,wv:0,parent:G,ac:null}}var ct=Symbol(`obsolete`);function lt(e,t,n){let r=G;r===null&&me();var i=void 0,a=zt(T),o=!U,s=new Set;return gn(()=>{var t=G,n=p();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==fe&&n.reject(e)}).finally(at)}catch(e){n.reject(e),at()}var c=N;if(o){if(t.f&32768)var l=ot();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(ct);else for(let e of s.values())e.reject(ct);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==ct&&(c.activate(),t?(a.f|=ie,Vt(a,t)):(a.f&8388608&&(a.f^=ie),Vt(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),fn(()=>{for(let e of s)e.reject(ct)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function ut(e){let t=st(e);return Ie||In(t),t}function dt(e){let t=st(e);return t.equals=Fe,t}function ft(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)H(t[n])}}function pt(e){var t,n=G,r=e.parent;if(!jn&&r!==null&&e.v!==T&&r.f&24576)return Ee(),e.v;Pn(r);try{e.f&=~te,ft(e),t=Gn(e)}finally{Pn(n)}return t}function mt(e){var t=pt(e);if(!e.equals(t)&&(e.wv=Hn(),(!N?.is_fork||e.deps===null)&&(N===null?e.v=t:(N.capture(e,t,!0),yt?.capture(e,t,!0)),e.deps===null))){M(e,h);return}jn||(P===null?Ye(e):(dn()||N?.is_fork)&&P.set(e,t))}function ht(e){if(e.effects!==null)for(let t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(fe),t.fn!==null&&(t.teardown=d),t.ac=null,qn(t,0),bn(t))}function gt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&Jn(t)}var _t=null,vt=null,N=null,yt=null,P=null,bt=null,xt=!1,St=!1,Ct=null,wt=null,Tt=0,Et=1,Dt=class e{id=Et++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){vt===null?_t=vt=this:(vt.#n=this,this.#t=vt),vt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)M(r,g),t(r);for(r of n.m)M(r,_),t(r)}this.#p.add(e)}#g(){this.#e=!0,Tt++>1e3&&(this.#S(),Ot());for(let e of this.#u)this.#d.delete(e),M(e,g),this.schedule(e);for(let e of this.#d)M(e,_),this.schedule(e);let t=this.#c;this.#c=[],this.apply();var n=Ct=[],r=[],i=wt=[];for(let e of t)try{this.#_(e,n,r)}catch(t){throw Ft(e),this.#h()||this.discard(),t}if(N=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Ct=null,wt=null,this.#h()){this.#b(r),this.#b(n);for(let[e,t]of this.#f)Pt(e,t);i.length>0&&N.#g();return}let o=this.#v();if(o){this.#b(r),this.#b(n),o.#y(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),yt=this,At(r),At(n),yt=null,this.#s?.resolve();var s=N;if(this.#a===0&&(this.#c.length===0||s!==null)&&(this.#S(),Ie&&(this.#x(),N=s)),this.#c.length>0)if(s!==null){let e=s;e.#c.push(...this.#c.filter(t=>!e.#c.includes(t)))}else s=this;s!==null&&s.#g()}#_(e,t,n){e.f^=h;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=h:i&4?t.push(r):Ie&&i&16777224?n.push(r):Un(r)&&(i&16&&this.#d.add(r),Jn(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#v(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#y(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),M(i,g),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),N=this,this.#g()}#b(e){for(var t=0;t<e.length;t+=1)Ze(e[t],this.#u,this.#d)}capture(e,t,n=!1){e.v!==T&&!this.previous.has(e)&&this.previous.set(e,e.v),e.f&8388608||(this.current.set(e,[t,n]),P?.set(e,t)),this.is_fork||(e.v=t)}activate(){N=this}deactivate(){N=null,P=null}flush(){try{St=!0,N=this,this.#g()}finally{Tt=0,bt=null,Ct=null,wt=null,St=!1,N=null,P=null,Lt.clear()}}discard(){for(let e of this.#i)e(this);this.#i.clear();for(let e of this.async_deriveds.values())e.reject(ct);this.#S(),this.#s?.resolve()}register_created_effect(e){this.#l.push(e)}#x(){for(let u=_t;u!==null;u=u.#n){var e=u.id<this.id,t=[];for(let[r,[i,a]]of this.current){if(u.current.has(r)){var n=u.current.get(r)[0];if(e&&i!==n)u.current.set(r,[i,a]);else continue}t.push(r)}if(e)for(let[e,t]of this.async_deriveds){let n=u.async_deriveds.get(e);n&&t.promise.then(n.resolve).catch(n.reject)}var r=[...u.current.keys()].filter(e=>!u.current.get(e)[1]);if(!(!u.#e||r.length===0)){var i=r.filter(e=>!this.current.has(e));if(i.length===0)e&&u.discard();else if(t.length>0){if(e)for(let e of this.#p)u.unskip_effect(e,e=>{e.f&4194320?u.schedule(e):u.#b([e])});u.activate();var a=new Set,o=new Map;for(var s of t)jt(s,i,a,o);o=new Map;var c=[...u.current].filter(([e,t])=>{let n=this.current.get(e);return n?n[0]!==t[0]||n[1]!==t[1]:!0}).map(([e])=>e);if(c.length>0)for(let e of this.#l)!(e.f&155648)&&Mt(e,c,o)&&(e.f&4194320?(M(e,g),u.schedule(e)):u.#u.add(e));if(u.#c.length>0&&!u.#m){u.apply();for(var l of u.#c)u.#_(l,[],[]);u.#c=[]}u.deactivate()}}}}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,Ge(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=p()).promise}static ensure(){if(N===null){let t=N=new e;!St&&!xt&&Ge(()=>{t.#e||t.flush()})}return N}apply(){if(!Ie||!this.is_fork&&this.#t===null&&this.#n===null){P=null;return}P=new Map;for(let[e,[t]]of this.current)P.set(e,t);for(let t=_t;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id<this.id){for(let[n,[,r]]of t.current)if(!r&&this.current.has(n)){e=!0;break}}if(!e)for(let[e,n]of t.previous)P.has(e)||P.set(e,n)}}schedule(e){if(bt=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}for(var t=e;t.parent!==null;){t=t.parent;var n=t.f;if(Ct!==null&&t===G&&(Ie||(U===null||!(U.f&2))&&!Qe))return;if(n&96){if(!(n&1024))return;t.f^=h}}this.#c.push(t)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null?_t=t:e.#n=t,t===null?vt=e:t.#t=e,this.linked=!1}}};function Ot(){try{ye()}catch(e){qe(e,bt)}}var kt=null;function At(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if(!(r.f&24576)&&Un(r)&&(kt=new Set,Jn(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&Cn(r),kt?.size>0)){Lt.clear();for(let e of kt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)kt.has(n)&&(kt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||Jn(n)}}kt.clear()}}kt=null}}function jt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?jt(i,t,n,r):e&4194320&&!(e&2048)&&Mt(i,t,r)&&(M(i,g),Nt(i))}}function Mt(e,t,r){let i=r.get(e);if(i!==void 0)return i;if(e.deps!==null)for(let i of e.deps){if(n.call(t,i))return!0;if(i.f&2&&Mt(i,t,r))return r.set(i,!0),!0}return r.set(e,!1),!1}function Nt(e){N.schedule(e)}function Pt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),M(e,h);for(var n=e.first;n!==null;)Pt(n,t),n=n.next}}function Ft(e){M(e,h);for(var t=e.first;t!==null;)Ft(t),t=t.next}var It=new Set,Lt=new Map,Rt=!1;function zt(e,t){return{f:0,v:e,reactions:null,equals:Ne,rv:0,wv:0}}function F(e,t){let n=zt(e,t);return In(n),n}function Bt(e,t=!1,n=!0){let r=zt(e);return t||(r.equals=Fe),Le&&n&&j!==null&&j.l!==null&&(j.l.s??=[]).push(r),r}function I(e,t,n=!1){return U!==null&&(!Nn||U.f&131072)&&He()&&U.f&4325394&&(Fn===null||!Fn.has(e))&&Se(),Vt(e,n?Gt(t):t,wt)}function Vt(e,t,n=null){if(!e.equals(t)){Lt.set(e,jn?t:e.v);var r=Dt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&pt(t),P===null&&Ye(t)}e.wv=Hn(),Wt(e,g,n),He()&&G!==null&&G.f&1024&&!(G.f&96)&&(J===null?Ln([e]):J.push(e)),!r.is_fork&&It.size>0&&!Rt&&Ht()}return t}function Ht(){Rt=!1;for(let e of It){e.f&1024&&M(e,_);let t;try{t=Un(e)}catch{t=!0}t&&Jn(e)}It.clear()}function Ut(e){I(e,e.v+1)}function Wt(e,t,n){var r=e.reactions;if(r!==null)for(var i=He(),a=r.length,o=0;o<a;o++){var s=r[o],c=s.f;if(!(!i&&s===G)){var l=(c&g)===0;if(l&&M(s,t),c&131072)It.add(s);else if(c&2){var u=s;P?.delete(u),c&65536||(c&512&&(G===null||!(G.f&2097152))&&(s.f|=te),Wt(u,_,n))}else if(l){var d=s;c&16&&kt!==null&&kt.add(d),n===null?Nt(d):n.push(d)}}}}function Gt(t){if(typeof t!=`object`||!t||ae in t)return t;let n=l(t);if(n!==s&&n!==c)return t;var r=new Map,i=e(t),o=F(0),u=null,d=Bn,f=e=>{if(Bn===d)return e();var t=U,n=Bn;W(null),Vn(d);var r=e();return W(t),Vn(n),r};return i&&r.set(`length`,F(t.length,u)),new Proxy(t,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&be();var i=r.get(t);return i===void 0?f(()=>{var e=F(n.value,u);return r.set(t,e),e}):I(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>F(T,u));r.set(t,e),Ut(o)}}else I(n,T),Ut(o);return!0},get(e,n,i){if(n===ae)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>F(Gt(s?e[n]:T),u)),r.set(n,o)),o!==void 0){var c=Y(o);return c===T?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=Y(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==T)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===ae)return!0;var n=r.get(t),i=n!==void 0&&n.v!==T||Reflect.has(e,t);return(n!==void 0||G!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>F(i?Gt(e[t]):T,u)),r.set(t,n)),Y(n)===T)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;d<c.v;d+=1){var p=r.get(d+``);p===void 0?d in e&&(p=f(()=>F(T,u)),r.set(d+``,p)):I(p,T)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>F(void 0,u)),I(c,Gt(n)),r.set(t,c));else{l=c.v!==T;var m=f(()=>Gt(n));I(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&I(g,_+1)}Ut(o)}return!0},ownKeys(e){Y(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==T});for(var[n,i]of r)i.v!==T&&!(n in e)&&t.push(n);return t},setPrototypeOf(){xe()}})}var Kt,qt,Jt,Yt;function Xt(){if(Kt===void 0){Kt=window,qt=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Jt=a(t,`firstChild`).get,Yt=a(t,`nextSibling`).get,u(e)&&(e[ce]=void 0,e[se]=null,e[le]=void 0,e.__e=void 0),u(n)&&(n[ue]=void 0)}}function L(e=``){return document.createTextNode(e)}function Zt(e){return Jt.call(e)}function Qt(e){return Yt.call(e)}function R(e,t){if(!E)return Zt(e);var n=Zt(D);if(n===null)n=D.appendChild(L());else if(t&&n.nodeType!==3){var r=L();return n?.before(r),O(r),r}return t&&rn(n),O(n),n}function $t(e,t=!1){if(!E){var n=Zt(e);return n instanceof Comment&&n.data===``?Qt(n):n}if(t){if(D?.nodeType!==3){var r=L();return D?.before(r),O(r),r}rn(D)}return D}function z(e,t=1,n=!1){let r=E?D:e;for(var i;t--;)i=r,r=Qt(r);if(!E)return r;if(n){if(r?.nodeType!==3){var a=L();return r===null?i?.after(a):r.before(a),O(a),a}rn(r)}return O(r),r}function en(e){e.textContent=``}function tn(){return!Ie||kt!==null?!1:(G.f&b)!==0}function nn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function rn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}var an=!1;function on(){an||(an=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[de]?.()})},{capture:!0}))}function sn(e){var t=U,n=G;W(null),Pn(null);try{return e()}finally{W(t),Pn(n)}}function cn(e){G===null&&(U===null&&ve(e),_e()),jn&&ge(e)}function ln(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function un(e,t){var n=G;n!==null&&n.f&8192&&(e|=v);var r={ctx:j,deps:null,nodes:null,f:e|g|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};N?.register_created_effect(r);var i=r;if(e&4)Ct===null?Dt.ensure().schedule(r):Ct.push(r);else if(t!==null){try{Jn(r)}catch(e){throw H(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=S))}if(i!==null&&(i.parent=n,n!==null&&ln(i,n),U!==null&&U.f&2&&!(e&64))){var a=U;(a.effects??=[]).push(i)}return r}function dn(){return U!==null&&!Nn}function fn(e){let t=un(8,null);return M(t,h),t.teardown=e,t}function pn(e){cn(`$effect`);var t=G.f;if(!U&&t&32&&j!==null&&!j.i){var n=j;(n.e??=[]).push(e)}else return mn(e)}function mn(e){return un(4|w,e)}function hn(e){Dt.ensure();let t=un(64|C,e);return(e={})=>new Promise(n=>{e.outro?wn(t,()=>{H(t),n(void 0)}):(H(t),n(void 0))})}function gn(e){return un(re|C,e)}function _n(e,t=0){return un(8|t,e)}function B(e,t=[],n=[],r=[]){rt(r,t,n,t=>{un(8,()=>{e(...t.map(Y))})})}function vn(e,t=0){return un(16|t,e)}function V(e){return un(32|C,e)}function yn(e){var t=e.teardown;if(t!==null){let e=jn,n=U;Mn(!0),W(null);try{t.call(null)}finally{Mn(e),W(n)}}}function bn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&sn(()=>{e.abort(fe)});var r=n.next;n.f&64?n.parent=null:H(n,t),n=r}}function xn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||H(t),t=n}}function H(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Sn(e.nodes.start,e.nodes.end),n=!0),e.f|=x,bn(e,t&&!n),qn(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();yn(e),e.f^=x,e.f|=y;var i=e.parent;i!==null&&i.first!==null&&Cn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Sn(e,t){for(;e!==null;){var n=e===t?null:Qt(e);e.remove(),e=n}}function Cn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function wn(e,t,n=!0){var r=[];Tn(e,r,!0);var i=()=>{n&&H(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Tn(e,t,n){if(!(e.f&8192)){e.f^=v;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;Tn(i,t,o?n:!1)}i=a}}}function En(e){Dn(e,!0)}function Dn(e,t){if(e.f&8192){e.f^=v,e.f&1024||(M(e,g),Dt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;Dn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function On(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:Qt(n);t.append(n),n=i}}var kn=null,An=!1,jn=!1;function Mn(e){jn=e}var U=null,Nn=!1;function W(e){U=e}var G=null;function Pn(e){G=e}var Fn=null;function In(e){U!==null&&(!Ie||U.f&2)&&(Fn??=new Set).add(e)}var K=null,q=0,J=null;function Ln(e){J=e}var Rn=1,zn=0,Bn=zn;function Vn(e){Bn=e}function Hn(){return++Rn}function Un(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~te),t&4096){for(var n=e.deps,r=n.length,i=0;i<r;i++){var a=n[i];if(Un(a)&&mt(a),a.wv>e.wv)return!0}t&512&&P===null&&M(e,h)}return!1}function Wn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!Ie&&Fn!==null&&Fn.has(e)))for(var i=0;i<r.length;i++){var a=r[i];a.f&2?Wn(a,t,!1):t===a&&(n?M(a,g):a.f&1024&&M(a,_),Nt(a))}}function Gn(e){var t=K,n=q,r=J,i=U,a=Fn,o=j,s=Nn,c=Bn,l=e.f;K=null,q=0,J=null,U=l&96?null:e,Fn=null,ze(e.ctx),Nn=!1,Bn=++zn,e.ac!==null&&(sn(()=>{e.ac.abort(fe)}),e.ac=null);try{e.f|=ne;var u=e.fn,d=u();e.f|=b;var f=e.deps,p=N?.is_fork;if(K!==null){var m;if(p||qn(e,q),f!==null&&q>0)for(f.length=q+K.length,m=0;m<K.length;m++)f[q+m]=K[m];else e.deps=f=K;if(dn()&&e.f&512)for(m=q;m<f.length;m++)(f[m].reactions??=[]).push(e)}else!p&&f!==null&&q<f.length&&(qn(e,q),f.length=q);if(He()&&J!==null&&!Nn&&f!==null&&!(e.f&6146))for(m=0;m<J.length;m++)Wn(J[m],e);if(i!==null&&i!==e){if(zn++,i.deps!==null)for(let e=0;e<n;e+=1)i.deps[e].rv=zn;if(t!==null)for(let e of t)e.rv=zn;J!==null&&(r===null?r=J:r.push(...J))}return e.f&8388608&&(e.f^=ie),d}catch(e){return Ke(e)}finally{e.f^=ne,K=t,q=n,J=r,U=i,Fn=a,ze(o),Nn=s,Bn=c}}function Kn(e,r){let i=r.reactions;if(i!==null){var a=t.call(i,e);if(a!==-1){var o=i.length-1;o===0?i=r.reactions=null:(i[a]=i[o],i.pop())}}if(i===null&&r.f&2&&(K===null||!n.call(K,r))){var s=r;s.f&512&&(s.f^=512,s.f&=~te),s.v!==T&&Ye(s),ht(s),qn(s,0)}}function qn(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)Kn(e,n[r])}function Jn(e){var t=e.f;if(!(t&16384)){M(e,h);var n=G,r=An;G=e,An=!0;try{t&16777232?xn(e):bn(e),yn(e);var i=Gn(e);e.teardown=typeof i==`function`?i:null,e.wv=Rn}finally{An=r,G=n}}}function Y(e){var t=(e.f&2)!=0;if(kn?.add(e),U!==null&&!Nn&&!(G!==null&&G.f&16384)&&(Fn===null||!Fn.has(e))){var r=U.deps;if(U.f&2097152)e.rv<zn&&(e.rv=zn,K===null&&r!==null&&r[q]===e?q++:K===null?K=[e]:K.push(e));else{U.deps??=[],n.call(U.deps,e)||U.deps.push(e);var i=e.reactions;i===null?e.reactions=[U]:n.call(i,U)||i.push(U)}}if(jn&&Lt.has(e))return Lt.get(e);if(t){var a=e;if(jn){var o=a.v;return(!(a.f&1024)&&a.reactions!==null||Xn(a))&&(o=pt(a)),Lt.set(a,o),o}var s=(a.f&512)==0&&!Nn&&U!==null&&(An||(U.f&512)!=0),c=(a.f&b)===0;Un(a)&&(s&&(a.f|=512),mt(a)),s&&!c&&(gt(a),Yn(a))}if(P?.has(e))return P.get(e);if(e.f&8388608)throw e.v;return e.v}function Yn(e){if(e.f|=512,e.deps!==null)for(let t of e.deps)(t.reactions??=[]).push(e),t.f&2&&!(t.f&512)&&(gt(t),Yn(t))}function Xn(e){if(e.v===T)return!0;if(e.deps===null)return!1;for(let t of e.deps)if(Lt.has(t)||t.f&2&&Xn(t))return!0;return!1}function Zn(e){var t=Nn;try{return Nn=!0,e()}finally{Nn=t}}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var Qn=[`touchstart`,`touchmove`];function $n(e){return Qn.includes(e)}var er=Symbol(`events`),tr=new Set,nr=new Set;function X(e,t,n){(t[er]??={})[e]=n}function rr(e){for(var t=0;t<e.length;t++)tr.add(e[t]);for(var n of nr)n(e)}var ir=null;function ar(e){var t=this,n=t.ownerDocument,r=e.type,a=e.composedPath?.()||[],o=a[0]||e.target;ir=e;var s=0,c=ir===e&&e[er];if(c){var l=a.indexOf(c);if(l!==-1&&(t===document||t===window)){e[er]=t;return}var u=a.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(o=a[s]||e.target,o!==t){i(e,`currentTarget`,{configurable:!0,get(){return o||n}});var d=U,f=G;W(null),Pn(null);try{for(var p,m=[];o!==null&&o!==t;){try{var h=o[er]?.[r];h!=null&&(!o.disabled||e.target===o)&&h.call(o,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;s++,o=s<a.length?a[s]:null}if(p){for(let e of m)queueMicrotask(()=>{throw e});throw p}}finally{e[er]=t,delete e.currentTarget,W(d),Pn(f)}}}var or=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function sr(e){return or?.createHTML(e)??e}function cr(e){var t=nn(`template`);return t.innerHTML=sr(e.replaceAll(`<!>`,`<!---->`)),t.content}function lr(e,t){var n=G;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Z(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(`<!>`);return()=>{if(E)return lr(D,null),D;i===void 0&&(i=cr(a?e:`<!>`+e),n||(i=Zt(i)));var t=r||qt?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=Zt(t),s=t.lastChild;lr(o,s)}else lr(t,t);return t}}function ur(e=``){if(!E){var t=L(e+``);return lr(t,t),t}var n=D;return n.nodeType===3?rn(n):(n.before(n=L()),O(n)),lr(n,n),n}function dr(){if(E)return lr(D,null),D;var e=document.createDocumentFragment(),t=document.createComment(``),n=L();return e.append(t,n),lr(t,n),e}function Q(e,t){if(E){var n=G;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=D),Ae();return}e!==null&&e.before(t)}function $(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ue]??=e.nodeValue)&&(e[ue]=n,e.nodeValue=`${n}`)}function fr(e,t){return mr(e,t)}var pr=new Map;function mr(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){Xt();var l=void 0,u=hn(()=>{var s=n??t.appendChild(L());tt(s,{pending:()=>{}},t=>{Be({});var n=j;if(o&&(n.c=o),a&&(i.$$events=a),E&&lr(t,null),l=e(t,i)||{},E&&(G.nodes.end=D,D===null||D.nodeType!==8||D.data!==`]`))throw De(),we;Ve()},c);var u=new Set,d=e=>{for(var n=0;n<e.length;n++){var r=e[n];if(!u.has(r)){u.add(r);var i=$n(r);for(let e of[t,document]){var a=pr.get(e);a===void 0&&(a=new Map,pr.set(e,a));var o=a.get(r);o===void 0?(e.addEventListener(r,ar,{passive:i}),a.set(r,1)):a.set(r,o+1)}}}};return d(r(tr)),nr.add(d),()=>{for(var e of u)for(let n of[t,document]){var r=pr.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,ar),r.delete(e),r.size===0&&pr.delete(n)):r.set(e,i)}nr.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return hr.set(l,u),l}var hr=new WeakMap,gr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)En(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(En(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(H(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();On(r,t),t.append(L()),this.#n.set(e,{effect:r,fragment:t})}else H(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),wn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(H(n.effect),this.#n.delete(e))};ensure(e,t){var n=N,r=tn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=L();i.append(a),this.#n.set(e,{effect:V(()=>t(a)),fragment:i})}else this.#t.set(e,V(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else E&&(this.anchor=D),this.#a(n)}};function _r(e,t,n=!1){var r;E&&(r=D,Ae());var i=new gr(e),a=n?S:0;function o(e,t){if(E){var n=Me(r);if(e!==parseInt(n.substring(1))){var a=je();O(a),i.anchor=a,ke(!1),i.ensure(e,t),ke(!0);return}}i.ensure(e,t)}vn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function vr(e,t){return t}function yr(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c<a;c++){let n=t[c];wn(n,()=>{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;br(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null;if(l){var u=n,d=u.parentNode;en(d),d.append(u),e.items.clear()}br(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function br(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i<t.length;i++){var a=t[i];r?.has(a)?(a.f|=ee,On(a,document.createDocumentFragment())):H(t[i],n)}}var xr;function Sr(t,n,i,a,o,s=null){var c=t,l=new Map;if(n&4){var u=t;c=E?O(Zt(u)):u.appendChild(L())}E&&Ae();var d=null,f=dt(()=>{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,wr(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=ee,Er(d,null,c)):En(d):wn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:vn(()=>{p=Y(f);var e=p.length;let t=!1;E&&Me(c)===`[!`!=(e===0)&&(c=je(),O(c),ke(!1),t=!0);for(var r=new Set,u=N,v=tn(),y=0;y<e;y+=1){E&&D.nodeType===8&&D.data===`]`&&(c=D,t=!0,ke(!1));var b=p[y],x=a(b,y),S=h?null:l.get(x);S?(S.v&&Vt(S.v,b),S.i&&Vt(S.i,y),v&&u.unskip_effect(S.e)):(S=Tr(l,h?c:xr??=L(),b,x,y,o,n,i),h||(S.e.f|=ee),l.set(x,S)),r.add(x)}if(e===0&&s&&!d&&(h?d=V(()=>s(c)):(d=V(()=>s(xr??=L())),d.f|=ee)),e>r.size&&he(``,``,``),E&&e>0&&O(je()),!h)if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);t&&ke(!0),Y(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,E&&(c=D)}function Cr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function wr(e,t,n,i,a){var o=(i&8)!=0,s=t.length,c=e.items,l=Cr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v<s;v+=1)h=t[v],g=a(h,v),_=c.get(g).e,_.f&33554432||(_.nodes?.a?.measure(),(f??=new Set).add(_));for(v=0;v<s;v+=1){if(h=t[v],g=a(h,v),_=c.get(g).e,e.outrogroups!==null)for(let t of e.outrogroups)t.pending.delete(_),t.done.delete(_);if(_.f&8192&&(En(_),o&&(_.nodes?.a?.unfix(),(f??=new Set).delete(_))),_.f&33554432)if(_.f^=ee,_===l)Er(_,null,n);else{var y=d?d.next:l;_===e.effect.last&&(e.effect.last=_.prev),_.prev&&(_.prev.next=_.next),_.next&&(_.next.prev=_.prev),Dr(e,d,_),Dr(e,_,y),Er(_,y,n),d=_,p=[],m=[],l=Cr(d.next);continue}if(_!==l){if(u!==void 0&&u.has(_)){if(p.length<m.length){var b=m[0],x;d=b.prev;var S=p[0],C=p[p.length-1];for(x=0;x<p.length;x+=1)Er(p[x],b,n);for(x=0;x<m.length;x+=1)u.delete(m[x]);Dr(e,S.prev,C.next),Dr(e,d,S),Dr(e,C,b),l=b,d=C,--v,p=[],m=[]}else u.delete(_),Er(_,l,n),Dr(e,_.prev,_.next),Dr(e,_,d===null?e.effect.first:d.next),Dr(e,d,_),d=_;continue}for(p=[],m=[];l!==null&&l!==_;)(u??=new Set).add(l),m.push(l),l=Cr(l.next);if(l===null)continue}_.f&33554432||p.push(_),d=_,l=Cr(_.next)}if(e.outrogroups!==null){for(let t of e.outrogroups)t.pending.size===0&&(br(e,r(t.done)),e.outrogroups?.delete(t));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||u!==void 0){var w=[];if(u!==void 0)for(_ of u)_.f&8192||w.push(_);for(;l!==null;)!(l.f&8192)&&l!==e.fallback&&w.push(l),l=Cr(l.next);var te=w.length;if(te>0){var ne=i&4&&s===0?n:null;if(o){for(v=0;v<te;v+=1)w[v].nodes?.a?.measure();for(v=0;v<te;v+=1)w[v].nodes?.a?.fix()}yr(e,w,ne)}}o&&Ge(()=>{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Tr(e,t,n,r,i,a,o,s){var c=o&1?o&16?zt(n):Bt(n,!1,!1):null,l=o&2?zt(i):null;return{v:c,i:l,e:V(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Er(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=Qt(r);if(a.before(r),r===i)return;r=o}}function Dr(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Or(e,t,...n){var r=new gr(e);vn(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},S)}function kr(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=kr(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n);return r}function Ar(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=kr(e))&&(r&&(r+=` `),r+=t);return r}function jr(e){return typeof e==`object`?Ar(e):e??``}var Mr=[...`
|
|
2
|
+
\r\f\xA0\v`];function Nr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Mr.includes(r[o-1]))&&(s===r.length||Mr.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Pr(e,t,n,r,i,a){var o=e[ce];if(E||o!==n||o===void 0){var s=Nr(n,r,a);(!E||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[ce]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}var Fr=Symbol(`is custom element`),Ir=Symbol(`is html`),Lr=pe?`link`:`LINK`;function Rr(e){if(E){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Br(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Br(e,`checked`,null),e.checked=r}}};e[de]=n,Ge(n),on()}}function zr(e,t){var n=Vr(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Br(e,t,n,r){var i=Vr(e);E&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Lr)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[oe]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Ur(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function Vr(e){return e[se]??={[Fr]:e.nodeName.includes(`-`),[Ir]:e.namespaceURI===Te}}var Hr=new Map;function Ur(e){var t=e.getAttribute(`is`)||e.nodeName,n=Hr.get(t);if(n)return n;Hr.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.push(s);i=l(i)}return n}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var Wr=`TestSpectra — Matchers API Reference`,Gr=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 Kr(e){let t=[],n=0;for(;n<e.length;){if(e[n]===`/`&&e[n+1]===`/`){let r=e.indexOf(`
|
|
3
|
+
`,n),i=r<0?e.length:r;t.push({t:`comment`,v:e.slice(n,i)}),n=i;continue}if(e[n]===`"`||e[n]===`'`||e[n]==="`"){let r=e[n],i=n+1;for(;i<e.length;){if(e[i]===`\\`&&r!=="`"){i+=2;continue}if(e[i]===r){i++;break}i++}t.push({t:`string`,v:e.slice(n,i)}),n=i;continue}if(/\d/.test(e[n])&&(n===0||!/[a-zA-Z_$]/.test(e[n-1]))){let r=n;for(;r<e.length&&/[\d.]/.test(e[r]);)r++;t.push({t:`number`,v:e.slice(n,r)}),n=r;continue}if(/[a-zA-Z_$]/.test(e[n])){let r=n;for(;r<e.length&&/[a-zA-Z0-9_$]/.test(e[r]);)r++;let i=e.slice(n,r);t.push({t:Gr.has(i)?`keyword`:`plain`,v:i}),n=r;continue}t.push({t:`plain`,v:e[n]}),n++}return t}var qr={comment:`text-slate-500 italic`,string:`text-emerald-400`,keyword:`text-teal-400`,number:`text-orange-400`,plain:`text-slate-300`},Jr={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`}},Yr=[{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:`playground`,label:`Live Playground`,indent:0}],Xr=Z(`<span class="mr-1 text-slate-700">›</span>`),Zr=Z(`<button type="button"><!> </button>`),Qr=Z(`<nav 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></nav>`);function $r(e,t){Be(t,!0);function n(e){document.getElementById(e)?.scrollIntoView({behavior:`smooth`,block:`start`})}var r=Qr(),i=z(R(r),2);Sr(i,21,()=>Yr,e=>e.id,(e,r)=>{let i=ut(()=>t.activeId===Y(r).id),a=ut(()=>Y(r).indent===0);var o=Zr(),s=R(o),c=e=>{Q(e,Xr())};_r(s,e=>{Y(r).indent===1&&e(c)});var l=z(s);k(o),B(e=>{Pr(o,1,e),$(l,` ${Y(r).label??``}`)},[()=>jr([`w-full text-left py-1.5 rounded-lg text-[11px] transition-all duration-150 leading-snug cursor-pointer`,Y(r).indent===1?`pl-7 pr-3`:`px-3`,Y(a)?`mt-5 font-semibold first:mt-0`:`font-normal`,Y(i)?`text-teal-400 bg-teal-950/50 border border-teal-800/40`:Y(a)?`text-slate-300 hover:text-slate-100 hover:bg-slate-800/40`:`text-slate-500 hover:text-slate-300 hover:bg-slate-800/30`].join(` `))]),X(`click`,o,()=>n(Y(r).id)),Q(e,o)}),k(i),A(2),k(r),Q(e,r),Ve()}rr([`click`]);var ei=Z(`<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 ti(e,t){var n=ei(),r=R(n);Or(R(r),()=>t.children??d),k(r),A(2),k(n),B(()=>Br(n,`id`,t.id)),Q(e,n)}Re();var ni=Z(`<span> </span>`),ri=Z(`<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 ii(e,t){Be(t,!0);let n=F(!1),r=ut(()=>Kr(t.code));function i(){navigator.clipboard.writeText(t.code).catch(()=>{}),I(n,!0),setTimeout(()=>{I(n,!1)},2e3)}var a=ri(),o=R(a),s=z(R(o),2),c=R(s,!0);k(s),k(o);var l=z(o,2),u=R(l);Sr(u,21,()=>Y(r),vr,(e,t)=>{var n=ni(),r=R(n,!0);k(n),B(()=>{Pr(n,1,jr(qr[Y(t).t])),$(r,Y(t).v)}),Q(e,n)}),k(u),k(l),k(a),B(()=>$(c,Y(n)?`✓ copied`:`copy`)),X(`click`,s,i),Q(e,a),Ve()}rr([`click`]);var ai=Z(`<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>`),oi=Z(`<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.
|
|
4
|
+
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 si(e){let t=[{val:`14`,label:`Element Matchers`,color:`text-violet-400`},{val:`4`,label:`Browser Matchers`,color:`text-teal-400`},{val:`4`,label:`Collection Matchers`,color:`text-blue-400`},{val:`3`,label:`Platforms`,color:`text-amber-400`}];var n=oi(),r=z(R(n),6);ii(z(R(r),2),{code:`import { Spectra } from "testspectra";
|
|
5
|
+
|
|
6
|
+
// Single element — assert visibility and state
|
|
7
|
+
await Spectra.get("#submit-btn").should("be.visible");
|
|
8
|
+
await Spectra.get("#email-input").should("be.enabled");
|
|
9
|
+
|
|
10
|
+
// Chained: action then assertion
|
|
11
|
+
await Spectra.get("#search-input")
|
|
12
|
+
.type("testspectra")
|
|
13
|
+
.should("have.value", "testspectra");
|
|
14
|
+
|
|
15
|
+
// Collection — assert item count
|
|
16
|
+
await Spectra.getAll(".product-card").should("have.length.greaterThan", 0);
|
|
17
|
+
|
|
18
|
+
// Browser-level — assert URL and page title
|
|
19
|
+
await browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
20
|
+
await browser.shouldContainUrl("/matchers");`}),k(r);var i=z(r,2);Sr(i,5,()=>t,e=>e.label,(e,t)=>{var n=ai(),r=R(n),i=R(r,!0);k(r);var a=z(r,2),o=R(a,!0);k(a),k(n),B(()=>{Pr(r,1,`text-2xl font-bold font-mono ${Y(t).color}`),$(i,Y(t).val),$(o,Y(t).label)}),Q(e,n)}),k(i),k(n),Q(e,n)}var ci=Z(`<code>.should(<span class="text-emerald-400"> </span>)</code>`);function li(e,t){Be(t,!0);var n=ci(),r=z(R(n)),i=R(r);k(r),A(),k(n),B(()=>{Pr(n,1,`inline-flex text-xs font-mono font-medium px-3 py-1 rounded-lg border ${Jr[t.cat].tag}`),$(i,`"${t.name??``}"`)}),Q(e,n),Ve()}var ui=Z(`<span> </span>`);function di(e,t){Be(t,!0);let n=ut(()=>Jr[t.cat]);var r=ui(),i=R(r,!0);k(r),B(()=>{Pr(r,1,`text-[10px] font-mono font-semibold uppercase tracking-widest px-2.5 py-1 rounded-full ${Y(n).badge}`),$(i,Y(n).label)}),Q(e,r),Ve()}var fi=Z(`<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>`),pi=Z(`<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 mi(e,t){var n=pi(),r=R(n),i=R(r),a=R(i);Sr(a,21,()=>t.matchers,e=>e.name,(e,n)=>{li(e,{get name(){return Y(n).name},get cat(){return t.cat}})}),k(a),di(z(a,2),{get cat(){return t.cat}}),k(i);var o=z(i,2);Sr(o,21,()=>t.matchers,e=>e.name,(e,t)=>{var n=fi(),r=R(n),i=R(r,!0);k(r);var a=z(r);k(n),B(()=>{$(i,Y(t).name),$(a,` ${Y(t).desc??``}`)}),Q(e,n)}),k(o),k(r);var s=z(r,2),c=R(s);ii(R(c),{get code(){return t.code}}),k(c);var l=z(c,2),u=z(R(l),2),d=e=>{var n=dr();Or($t(n),()=>t.demo),Q(e,n)};_r(u,e=>{t.demo&&e(d)}),k(l),k(s),k(n),Q(e,n)}var hi=Z(`<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>`),gi=Z(`<div id="visibility" class="mb-5"><!></div>`);function _i(e,t){Be(t,!0);var n=gi();mi(R(n),{cat:`element`,matchers:[{name:`be.visible`,desc:`Asserts the element is displayed and visible to the user.`},{name:`not.be.visible`,desc:`Asserts the element is hidden or not rendered visually.`}],code:`// Assert element is visible on screen
|
|
21
|
+
await Spectra.get("#hero-title").should("be.visible");
|
|
22
|
+
await LoginPage.submitButton.shouldBeVisible();
|
|
23
|
+
|
|
24
|
+
// Assert element is hidden from view
|
|
25
|
+
await Spectra.get("#loading-spinner").should("not.be.visible");
|
|
26
|
+
await LoginPage.errorMessage.shouldNotBeVisible();`,demo:e=>{var n=hi(),r=z(R(n),2),i=z(R(r),2),a=R(i),o=z(a,2),s=R(o,!0);k(o),k(i),k(r),k(n),B(e=>{Pr(a,1,e),$(s,t.hidden?`show`:`hide`)},[()=>jr([`px-3 py-2 rounded-lg bg-red-950/40 border border-red-800/50 text-red-300 text-sm font-mono transition-all`,t.hidden?`hidden`:``].join(` `))]),X(`click`,o,function(...e){t.onToggleHidden?.apply(this,e)}),Q(e,n)},$$slots:{demo:!0}}),k(n),Q(e,n),Ve()}rr([`click`]);var vi=Z(`<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>`),yi=Z(`<span class="text-xs text-slate-600 font-mono italic">(not in DOM)</span>`),bi=Z(`<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>`),xi=Z(`<div id="existence" class="mb-5"><!></div>`);function Si(e,t){var n=xi();mi(R(n),{cat:`element`,matchers:[{name:`exist`,desc:`Asserts the element exists in the DOM/UI hierarchy.`},{name:`not.exist`,desc:`Asserts the element does NOT exist in the DOM/UI hierarchy.`}],code:`// Assert element exists in the DOM
|
|
27
|
+
await Spectra.get("#remember-me").should("exist");
|
|
28
|
+
await LoginPage.rememberMeCheckbox.shouldExist();
|
|
29
|
+
|
|
30
|
+
// Assert element is not present in the DOM
|
|
31
|
+
await Spectra.get("#loading-spinner").should("not.exist");
|
|
32
|
+
await LoginPage.loadingSpinner.shouldNotExist();`,demo:e=>{var n=bi(),r=z(R(n),2),i=z(R(r),2),a=R(i),o=e=>{Q(e,vi())},s=e=>{Q(e,yi())};_r(a,e=>{t.exists?e(o):e(s,-1)});var c=z(a,2),l=R(c,!0);k(c),k(i),k(r),k(n),B(()=>$(l,t.exists?`remove`:`add`)),X(`click`,c,function(...e){t.onToggleExists?.apply(this,e)}),Q(e,n)},$$slots:{demo:!0}}),k(n),Q(e,n)}rr([`click`]);var Ci=Z(`<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>`),wi=Z(`<div id="state" class="mb-5"><!></div>`);function Ti(e,t){Be(t,!0);var n=wi();mi(R(n),{cat:`element`,matchers:[{name:`be.enabled`,desc:`Asserts the element is enabled for interaction.`},{name:`be.disabled`,desc:`Asserts the element is disabled and cannot be interacted with.`},{name:`be.checked`,desc:`Asserts the checkbox or radio element is checked.`},{name:`be.selected`,desc:`Asserts a form element (radio, option) is selected.`}],code:`// Enabled / Disabled assertions
|
|
33
|
+
await Spectra.get("#login-btn").should("be.enabled");
|
|
34
|
+
await LoginPage.loginButton.shouldBeEnabled();
|
|
35
|
+
|
|
36
|
+
await Spectra.get("#disabled-submit").should("be.disabled");
|
|
37
|
+
await LoginPage.disabledSubmit.shouldBeDisabled();
|
|
38
|
+
|
|
39
|
+
// Checked / Selected assertions
|
|
40
|
+
await Spectra.get("#terms-checkbox").should("be.checked");
|
|
41
|
+
await SettingsPage.termsCheckbox.shouldBeChecked();
|
|
42
|
+
|
|
43
|
+
await Spectra.get("#dark-mode-radio").should("be.selected");
|
|
44
|
+
await SettingsPage.darkModeRadio.shouldBeSelected();`,demo:e=>{var n=Ci(),r=R(n),i=z(R(r),2),a=R(i),o=z(a,2),s=z(o,2);k(i),k(r);var c=z(r,2),l=z(R(c),2),u=R(l),d=R(u);Rr(d),A(2),k(u);var f=z(u,2),p=R(f);Rr(p),A(2),k(f),k(l),k(c),k(n),B(()=>{a.disabled=t.disabled,o.disabled=!t.disabled,zr(d,t.checked),zr(p,t.selected)}),X(`click`,s,function(...e){t.onToggleDisabled?.apply(this,e)}),X(`change`,d,e=>t.onToggleChecked(e.currentTarget.checked)),X(`change`,p,e=>t.onToggleSelected(e.currentTarget.checked)),Q(e,n)},$$slots:{demo:!0}}),k(n),Q(e,n),Ve()}rr([`click`,`change`]);var Ei=Z(`<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>`),Di=Z(`<div id="value" class="mb-5"><!></div>`);function Oi(e){var t=Di();mi(R(t),{cat:`element`,matchers:[{name:`have.value`,desc:`Asserts the input element has the exact given value.`},{name:`contain.value`,desc:`Asserts the input element's value contains the given substring.`}],code:`// Exact value match
|
|
45
|
+
await Spectra.get("#username-input").should("have.value", "admin@testspectra.dev");
|
|
46
|
+
await LoginPage.usernameInput.shouldHaveValue("admin@testspectra.dev");
|
|
47
|
+
|
|
48
|
+
// Partial value match
|
|
49
|
+
await Spectra.get("#token-input").should("contain.value", "JWT_");
|
|
50
|
+
await LoginPage.tokenInput.shouldContainValue("JWT_");`,demo:e=>{Q(e,Ei())},$$slots:{demo:!0}}),k(t),Q(e,t)}var ki=Z(`<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>`),Ai=Z(`<div id="text" class="mb-5"><!></div>`);function ji(e){var t=Ai();mi(R(t),{cat:`element`,matchers:[{name:`have.text`,desc:`Asserts the element's text content matches the exact expected string.`},{name:`contain.text`,desc:`Asserts the element's text content contains the expected substring.`}],code:`// Exact text match
|
|
51
|
+
await Spectra.get("#header-title").should("have.text", "Welcome to TestSpectra");
|
|
52
|
+
await LoginPage.headerTitle.shouldHaveText("Welcome to TestSpectra");
|
|
53
|
+
|
|
54
|
+
// Substring text match
|
|
55
|
+
await Spectra.get("#welcome-banner").should("contain.text", "Welcome");
|
|
56
|
+
await LoginPage.welcomeBanner.shouldContainText("Welcome");`,demo:e=>{Q(e,ki())},$$slots:{demo:!0}}),k(t),Q(e,t)}var Mi=Z(`<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>`),Ni=Z(`<div id="class-attr" class="mb-5"><!></div>`);function Pi(e){var t=Ni();mi(R(t),{cat:`element`,matchers:[{name:`have.class`,desc:`Asserts the element has the specified CSS class.`},{name:`have.attr`,desc:`Asserts the element has the specified attribute, optionally checking its value.`}],code:`// Assert CSS class presence
|
|
57
|
+
await Spectra.get("#home-tab").should("have.class", "is-active");
|
|
58
|
+
await NavigationBar.homeTab.shouldHaveClass("is-active");
|
|
59
|
+
|
|
60
|
+
// Assert attribute presence (with or without value)
|
|
61
|
+
await Spectra.get("#logo-link").should("have.attr", "href", "/dashboard");
|
|
62
|
+
await NavigationBar.logoLink.shouldHaveAttribute("href", "/dashboard");
|
|
63
|
+
|
|
64
|
+
await Spectra.get("#cart-btn").should("have.attr", "aria-expanded");
|
|
65
|
+
await NavigationBar.cartButton.shouldHaveAttribute("aria-expanded");`,demo:e=>{var t=Mi(),n=z(R(t),2),r=z(R(n),2);k(n),k(t),X(`click`,r,e=>e.preventDefault()),Q(e,t)},$$slots:{demo:!0}}),k(t),Q(e,t)}rr([`click`]);var Fi=Z(`<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 browser.shouldContainUrl(<span class="text-emerald-400"> </span>)</div></div></div>`),Ii=Z(`<div id="url" class="mb-5"><!></div>`);function Li(e,t){Be(t,!0);let n=F(``),r=F(``);pn(()=>{typeof window<`u`&&(I(n,window.location.href,!0),I(r,window.location.hostname,!0))});var i=Ii();mi(R(i),{cat:`browser`,matchers:[{name:`have.url`,desc:`Asserts the current browser page URL exactly matches the expected URL.`},{name:`contain.url`,desc:`Asserts the current browser page URL contains the given substring.`}],code:`// Exact URL match
|
|
66
|
+
await expect(browser).toHaveUrl("https://app.testspectra.dev/dashboard");
|
|
67
|
+
await browser.shouldHaveUrl("https://app.testspectra.dev/dashboard");
|
|
68
|
+
|
|
69
|
+
// URL contains substring
|
|
70
|
+
await expect(browser).toHaveUrl(expect.stringContaining("/dashboard"));
|
|
71
|
+
await browser.shouldContainUrl("/dashboard");
|
|
72
|
+
|
|
73
|
+
// Via Spectra fluent API
|
|
74
|
+
await Spectra.get(browser).should("have.url", "https://app.testspectra.dev/dashboard");
|
|
75
|
+
await Spectra.get(browser).should("contain.url", "/dashboard");`,demo:e=>{var t=Fi(),i=R(t),a=z(R(i),2),o=R(a,!0);k(a),k(i);var s=z(i,2),c=z(R(s),2),l=z(R(c)),u=R(l);k(l),A(),k(c),k(s),k(t),B(()=>{$(o,Y(n)||`https://app.testspectra.dev/dashboard`),$(u,`"${(Y(r)||`app.testspectra.dev`)??``}"`)}),Q(e,t)},$$slots:{demo:!0}}),k(i),Q(e,i),Ve()}var Ri=Z(`<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> 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> browser.shouldContainTitle(<span class="text-emerald-400">"TestSpectra"</span>)</div></div></div>`),zi=Z(`<div id="title" class="mb-5"><!></div>`);function Bi(e){var t=zi();mi(R(t),{cat:`browser`,matchers:[{name:`have.title`,desc:`Asserts the current browser page title matches the expected title exactly.`},{name:`contain.title`,desc:`Asserts the current browser page title contains the expected substring.`}],code:`// Exact title match
|
|
76
|
+
await expect(browser).toHaveTitle("TestSpectra — Matchers API Reference");
|
|
77
|
+
await browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
78
|
+
|
|
79
|
+
// Title contains substring
|
|
80
|
+
await expect(browser).toHaveTitle(expect.stringContaining("TestSpectra"));
|
|
81
|
+
await browser.shouldContainTitle("TestSpectra");
|
|
82
|
+
|
|
83
|
+
// Via Spectra fluent API
|
|
84
|
+
await Spectra.get(browser).should("have.title", "TestSpectra — Matchers API Reference");
|
|
85
|
+
await Spectra.get(browser).should("contain.title", "Matchers");`,demo:e=>{var t=Ri(),n=R(t),r=z(R(n),2),i=R(r,!0);k(r),k(n);var a=z(n,2),o=R(a),s=z(R(o),6),c=R(s);k(s),A(),k(o),A(2),k(a),k(t),B(()=>{$(i,Wr),$(c,`"TestSpectra — Matchers API Reference"`)}),Q(e,t)},$$slots:{demo:!0}}),k(t),Q(e,t)}var Vi=Z(`<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>`),Hi=Z(`<li class="text-xs text-slate-600 font-mono italic px-3 py-1.5">(empty list)</li>`),Ui=Z(`<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">.should("be.empty") → passes</p></div></div>`),Wi=Z(`<div id="length" class="mb-5"><!></div>`);function Gi(e){let t=F(4),n=ut(()=>Array.from({length:Y(t)},(e,t)=>`Product ${t+1}`));var r=Wi();mi(R(r),{cat:`collection`,matchers:[{name:`have.length`,desc:`Asserts the collection contains exactly the expected number of elements.`},{name:`have.length.greaterThan`,desc:`Asserts the collection contains more than the expected number of elements.`},{name:`be.empty`,desc:`Asserts the collection contains zero elements.`},{name:`exist`,desc:`Asserts the collection contains at least one element.`}],code:`// Exact count
|
|
86
|
+
await Spectra.getAll(".product-card").should("have.length", 4);
|
|
87
|
+
|
|
88
|
+
// Greater than
|
|
89
|
+
await Spectra.getAll(".product-card").should("have.length.greaterThan", 0);
|
|
90
|
+
|
|
91
|
+
// Empty collection
|
|
92
|
+
await Spectra.getAll(".error-badge").should("be.empty");
|
|
93
|
+
|
|
94
|
+
// At least one element exists
|
|
95
|
+
await Spectra.getAll(".nav-link").should("exist");
|
|
96
|
+
|
|
97
|
+
// Target by index
|
|
98
|
+
await Spectra.getAll(".product-card").first().should("be.visible");
|
|
99
|
+
await Spectra.getAll(".product-card").eq(2).should("have.text", "Product 3");`,demo:e=>{var r=Ui(),i=R(r),a=R(i),o=R(a),s=R(o);k(o);var c=z(o,2),l=R(c),u=z(l,2);k(c),k(a);var d=z(a,2),f=R(d);Sr(f,17,()=>Y(n),vr,(e,t,n)=>{var r=Vi(),i=R(r);i.textContent=`#${n+1}`;var a=z(i);k(r),B(()=>$(a,` ${Y(t)??``}`)),Q(e,r)});var p=z(f,2),m=e=>{Q(e,Hi())};_r(p,e=>{Y(t)===0&&e(m)}),k(d),k(i),A(2),k(r),B(()=>$(s,`class="demo-product-card" (${Y(t)??``} items)`)),X(`click`,l,()=>I(t,Math.max(0,Y(t)-1),!0)),X(`click`,u,()=>I(t,Math.min(8,Y(t)+1),!0)),Q(e,r)},$$slots:{demo:!0}}),k(r),Q(e,r)}rr([`click`]);var Ki=Z(`<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>`),qi=Z(`<span class="text-xs text-slate-600 font-mono italic block px-3 py-2">(not in DOM)</span>`),Ji=Z(`<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>`),Yi=Z(`<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>`),Xi=Z(`<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.
|
|
100
|
+
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">be.visible</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">not.be.visible</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">exist</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">not.exist</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">be.checked</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">be.selected</span></label></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></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) → have.length</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 Zi(e,t){Be(t,!0);let n=[[`#demo-visible-el`,`be.visible`,`display: block, opacity: 1`],[`#demo-hidden-el`,`not.be.visible`,`display: none (toggle)`],[`#demo-existing-el`,`exist`,`present in DOM`],[`#demo-removed-el`,`not.exist`,`removed from DOM (toggle)`],[`#demo-enabled-btn`,`be.enabled`,`no disabled attribute`],[`#demo-disabled-btn-pg`,`be.disabled`,`disabled attribute set`],[`#demo-terms-checkbox`,`be.checked`,`checked: true`],[`#demo-mode-radio`,`be.selected`,`checked: true`],[`#demo-email-input-pg`,`have.value`,`admin@testspectra.dev`],[`#demo-token-input-pg`,`contain.value`,`contains JWT_`],[`#demo-exact-text-pg`,`have.text`,`"Welcome to TestSpectra"`],[`#demo-partial-text-pg`,`contain.text`,`contains "Welcome"`],[`.demo-product-item`,`have.length`,`4 items`],[`#demo-empty-list-pg`,`be.empty`,`0 items`]];var r=Xi(),i=R(r);ti(i,{id:`playground-heading`,children:(e,t)=>{A(),Q(e,ur(`Live Playground`))},$$slots:{default:!0}});var a=z(i,4),o=R(a),s=z(R(o),2),c=R(s),l=R(c);l.textContent=`#demo-visible-el`,A(2),k(c);var u=z(c,4),d=R(u);d.textContent=`#demo-hidden-el`;var f=z(d,2),p=z(R(f),2),h=R(p,!0);k(p),k(f),k(u);var g=z(u,2);k(s),k(o);var _=z(o,2),v=z(R(_),2),y=R(v),b=R(y);b.textContent=`#demo-existing-el`,A(2),k(y);var x=z(y,4),S=R(x);S.textContent=`#demo-removed-el`;var C=z(S,2),w=z(R(C),2),ee=R(w,!0);k(w),k(C),k(x);var te=z(x,2),ne=e=>{Q(e,Ki())},re=e=>{Q(e,qi())};_r(te,e=>{t.exists?e(ne):e(re,-1)}),k(v),k(_);var ie=z(_,2),ae=z(R(ie),2),oe=R(ae),se=R(oe),ce=z(se,2),le=z(ce,2);k(oe);var ue=z(oe,2),de=R(ue),fe=R(de);Rr(fe),A(2),k(de);var pe=z(de,2),me=R(pe);Rr(me),A(2),k(pe),k(ue),k(ae),k(ie);var he=z(ie,2),ge=z(R(he),2),_e=R(ge),ve=R(_e);ve.textContent=`#demo-email-input → have.value`,z(ve,2),k(_e);var ye=z(_e,2),be=R(ye);be.textContent=`#demo-token-input → contain.value "JWT_"`,z(be,2),k(ye);var xe=z(ye,2),Se=R(xe);Se.textContent=`#demo-exact-text → have.text`,A(2),k(xe);var Ce=z(xe,2),we=R(Ce);we.textContent=`#demo-partial-text → contain.text "Welcome"`,A(2),k(Ce),k(ge),k(he);var T=z(he,2),Te=z(R(T),2),Ee=R(Te),De=R(Ee);De.textContent=`#demo-active-tab class="is-active nav-tab"`,A(2),k(Ee);var Oe=z(Ee,2),E=R(Oe);E.textContent=`#demo-nav-link href="/dashboard" aria-label="Go to Dashboard"`;var ke=z(E,2);k(Oe),k(Te),k(T);var D=z(T,2),O=z(R(D),2),Ae=R(O),je=z(R(Ae),2);Sr(je,20,()=>[`Product Alpha`,`Product Beta`,`Product Gamma`,`Product Delta`],vr,(e,t,n)=>{var r=Ji(),i=R(r);i.textContent=`#${n+1}`;var a=z(i);k(r),B(()=>$(a,` ${t??``}`)),Q(e,r)}),k(je),k(Ae);var Me=z(Ae,2),Ne=R(Me);Ne.textContent=`#demo-empty-list-pg → be.empty`,A(2),k(Me),k(O),k(D),k(a);var Pe=z(a,2),Fe=z(R(Pe),2),Ie=R(Fe),Le=z(R(Ie));Sr(Le,21,()=>n,([e,t,n])=>e,(e,t)=>{var n=ut(()=>m(Y(t),3));let r=()=>Y(n)[0],i=()=>Y(n)[1],a=()=>Y(n)[2];var o=Yi(),s=R(o),c=R(s,!0);k(s);var l=z(s),u=R(l,!0);k(l);var d=z(l),f=R(d,!0);k(d),k(o),B(()=>{$(c,r()),$(u,i()),$(f,a())}),Q(e,o)}),k(Le),k(Ie),k(Fe),k(Pe),k(r),B(e=>{$(h,t.hidden?`show`:`hide`),Pr(g,1,e),$(ee,t.exists?`remove`:`add`),se.disabled=t.disabled,ce.disabled=!t.disabled,zr(fe,t.checked),zr(me,t.selected)},[()=>jr([`px-3 py-2 rounded-lg bg-red-950/40 border border-red-800/50 text-red-300 text-sm font-mono transition-all`,t.hidden?`hidden`:``].join(` `))]),X(`click`,p,function(...e){t.onToggleHidden?.apply(this,e)}),X(`click`,w,function(...e){t.onToggleExists?.apply(this,e)}),X(`click`,le,function(...e){t.onToggleDisabled?.apply(this,e)}),X(`change`,fe,e=>t.onToggleChecked(e.currentTarget.checked)),X(`change`,me,e=>t.onToggleSelected(e.currentTarget.checked)),X(`click`,ke,e=>e.preventDefault()),Q(e,r),Ve()}rr([`click`,`change`]);var Qi=Z(`<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> <!> <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 $i(e,t){Be(t,!0);let n=F(`overview`),r=F(!0),i=F(!0),a=F(!1),o=F(!0),s=F(!0);pn(()=>{document.title=Wr}),pn(()=>{let e=Yr.map(e=>e.id).map(e=>document.getElementById(e)).filter(e=>!!e),t=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&I(n,e.target.id,!0)})},{rootMargin:`-10% 0px -75% 0px`});return e.forEach(e=>t.observe(e)),()=>{t.disconnect()}});var c=Qi(),l=z(R(c),2),u=R(l);$r(u,{get activeId(){return Y(n)}});var d=z(u,2),f=R(d),p=R(f);si(p,{});var m=z(p,2),h=R(m);ti(h,{id:`element-matchers-heading`,children:(e,t)=>{A(),Q(e,ur(`Element Matchers`))},$$slots:{default:!0}});var g=z(h,2);_i(g,{get hidden(){return Y(r)},onToggleHidden:()=>I(r,!Y(r))});var _=z(g,2);Si(_,{get exists(){return Y(i)},onToggleExists:()=>I(i,!Y(i))});var v=z(_,2);Ti(v,{get disabled(){return Y(a)},get checked(){return Y(o)},get selected(){return Y(s)},onToggleDisabled:()=>I(a,!Y(a)),onToggleChecked:e=>I(o,e,!0),onToggleSelected:e=>I(s,e,!0)});var y=z(v,2);Oi(y,{});var b=z(y,2);ji(b,{}),Pi(z(b,2),{}),k(m);var x=z(m,2),S=R(x);ti(S,{id:`browser-matchers-heading`,children:(e,t)=>{A(),Q(e,ur(`Browser Matchers`))},$$slots:{default:!0}});var C=z(S,2);Li(C,{}),Bi(z(C,2),{}),k(x);var w=z(x,2),ee=R(w);ti(ee,{id:`collection-matchers-heading`,children:(e,t)=>{A(),Q(e,ur(`Collection Matchers`))},$$slots:{default:!0}}),Gi(z(ee,2),{}),k(w),Zi(z(w,2),{get hidden(){return Y(r)},get exists(){return Y(i)},get disabled(){return Y(a)},get checked(){return Y(o)},get selected(){return Y(s)},onToggleHidden:()=>I(r,!Y(r)),onToggleExists:()=>I(i,!Y(i)),onToggleDisabled:()=>I(a,!Y(a)),onToggleChecked:e=>I(o,e,!0),onToggleSelected:e=>I(s,e,!0)}),A(2),k(f),k(d),k(l),k(c),Q(e,c),Ve()}var ea=document.getElementById(`app`);if(!ea)throw Error(`Element with id "app" not found`);fr($i,{target:ea});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>TestSpectra — Matchers API Reference</title>
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DN2Kb0A8.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DAUlrHTr.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body class="bg-[#020817] text-slate-200">
|
|
11
|
+
<div id="app"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
package/dist/commands/add.js
CHANGED
|
@@ -130,7 +130,7 @@ export async function addCommand(moduleNameArg, options = {}) {
|
|
|
130
130
|
if (!fs.existsSync(templateDir)) {
|
|
131
131
|
templateDir = path.resolve(__dirname, "../../../templates/nx");
|
|
132
132
|
}
|
|
133
|
-
const sampleE2eSrc = path.join(templateDir, "
|
|
133
|
+
const sampleE2eSrc = path.join(templateDir, "packages/playground/e2e");
|
|
134
134
|
if (!fs.existsSync(sampleE2eSrc)) {
|
|
135
135
|
p.cancel(chalk.red(`Template directory not found at: ${sampleE2eSrc}`));
|
|
136
136
|
return;
|
|
@@ -283,9 +283,9 @@ export async function addCommand(moduleNameArg, options = {}) {
|
|
|
283
283
|
const s = p.spinner();
|
|
284
284
|
s.start(`Scaffolding ${e2eProjectName} in ./${path.relative(rootDir, targetE2eDir)}...`);
|
|
285
285
|
copyRecursive(sampleE2eSrc, targetE2eDir, {
|
|
286
|
-
"
|
|
287
|
-
"
|
|
288
|
-
"scope:
|
|
286
|
+
"playground-e2e": e2eProjectName,
|
|
287
|
+
"packages/playground/e2e": path.relative(rootDir, targetE2eDir).replace(/\\/g, "/"),
|
|
288
|
+
"scope:playground": `scope:${featureName}`,
|
|
289
289
|
});
|
|
290
290
|
// Adjust project.json
|
|
291
291
|
const projJsonPath = path.join(targetE2eDir, "project.json");
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { DemoServer } from "../utils/demo-server.js";
|
|
4
|
+
export async function demoCommand(options) {
|
|
5
|
+
const port = options.port ? parseInt(options.port, 10) : 5173;
|
|
6
|
+
p.intro(chalk.bold.cyan("🌐 TestSpectra Demo Web App"));
|
|
7
|
+
const server = new DemoServer(port);
|
|
8
|
+
try {
|
|
9
|
+
const { url } = await server.start();
|
|
10
|
+
p.log.success(chalk.green(`Demo web app is live at: ${chalk.bold.underline(url)}`));
|
|
11
|
+
p.log.info(chalk.dim("You can now run tests against this server in another terminal (e.g. 'spectra run -t web')."));
|
|
12
|
+
p.log.info(chalk.dim("Press Ctrl+C to stop the server."));
|
|
13
|
+
// Handle termination gracefully
|
|
14
|
+
process.on("SIGINT", async () => {
|
|
15
|
+
await server.stop();
|
|
16
|
+
process.exit(0);
|
|
17
|
+
});
|
|
18
|
+
process.on("SIGTERM", async () => {
|
|
19
|
+
await server.stop();
|
|
20
|
+
process.exit(0);
|
|
21
|
+
});
|
|
22
|
+
await new Promise(() => { });
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
p.log.error(chalk.red(`Failed to start demo web app: ${err.message}`));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
package/dist/commands/init.js
CHANGED
|
@@ -338,7 +338,7 @@ export async function initCommand(options = {}) {
|
|
|
338
338
|
p.log.warn(chalk.yellow("No feature packages found in workspace. You can enter feature names to scaffold."));
|
|
339
339
|
const featureNamesInput = await p.text({
|
|
340
340
|
message: "Enter feature module names (comma-separated), or leave blank to skip:",
|
|
341
|
-
placeholder: "
|
|
341
|
+
placeholder: "playground, matchers, navigation",
|
|
342
342
|
defaultValue: "",
|
|
343
343
|
});
|
|
344
344
|
if (p.isCancel(featureNamesInput)) {
|
|
@@ -350,14 +350,14 @@ export async function initCommand(options = {}) {
|
|
|
350
350
|
// Build relPaths from feature names using a sensible default location
|
|
351
351
|
const featureBaseInput = await p.text({
|
|
352
352
|
message: "Enter base directory for feature modules:",
|
|
353
|
-
placeholder: "packages
|
|
354
|
-
defaultValue: "packages
|
|
353
|
+
placeholder: "packages",
|
|
354
|
+
defaultValue: "packages",
|
|
355
355
|
});
|
|
356
356
|
if (p.isCancel(featureBaseInput)) {
|
|
357
357
|
p.cancel("Setup cancelled.");
|
|
358
358
|
return;
|
|
359
359
|
}
|
|
360
|
-
const featureBase = featureBaseInput.trim() || "packages
|
|
360
|
+
const featureBase = featureBaseInput.trim() || "packages";
|
|
361
361
|
chosenProjects = raw.split(",").map((n) => `${featureBase}/${n.trim()}`).filter(Boolean);
|
|
362
362
|
}
|
|
363
363
|
}
|
|
@@ -467,16 +467,16 @@ export async function initCommand(options = {}) {
|
|
|
467
467
|
copyRecursive(sharedTestingSrc, sharedTestingAbsPath);
|
|
468
468
|
}
|
|
469
469
|
// 4. Distribute E2E Folders to Selected Feature Modules
|
|
470
|
-
const sampleE2eSrc = path.join(templateDir, "
|
|
470
|
+
const sampleE2eSrc = path.join(templateDir, "packages/playground/e2e");
|
|
471
471
|
const featureE2eDirs = [];
|
|
472
472
|
for (const projRel of chosenProjects) {
|
|
473
473
|
const targetE2eDir = path.join(cwd, projRel, e2eFolderName);
|
|
474
474
|
const featureName = path.basename(projRel);
|
|
475
475
|
const e2eProjectName = `${featureName}-${e2eFolderName}`;
|
|
476
476
|
copyRecursive(sampleE2eSrc, targetE2eDir, {
|
|
477
|
-
"
|
|
478
|
-
"
|
|
479
|
-
"scope:
|
|
477
|
+
"playground-e2e": e2eProjectName,
|
|
478
|
+
"packages/playground/e2e": path.relative(cwd, targetE2eDir).replace(/\\/g, "/"),
|
|
479
|
+
"scope:playground": `scope:${featureName}`,
|
|
480
480
|
});
|
|
481
481
|
// Adjust project.json
|
|
482
482
|
const projJsonPath = path.join(targetE2eDir, "project.json");
|
package/dist/commands/run.d.ts
CHANGED
package/dist/commands/run.js
CHANGED
|
@@ -4,12 +4,25 @@ import { ConfigLoader } from "../config/loader.js";
|
|
|
4
4
|
import { RustCoreBridge } from "../runner/bridge.js";
|
|
5
5
|
import { Reporter } from "../runner/reporter.js";
|
|
6
6
|
import { TypeGenerator } from "../types/generator.js";
|
|
7
|
+
import { DemoServer } from "../utils/demo-server.js";
|
|
7
8
|
export async function runCommand(specPath, options = {}) {
|
|
8
9
|
const cwd = process.cwd();
|
|
9
10
|
const effectiveSpecPath = specPath || options.spec;
|
|
10
11
|
// Ensure latest ambient types are up-to-date
|
|
11
12
|
TypeGenerator.writeDeclarationFiles(cwd);
|
|
12
13
|
const config = await ConfigLoader.loadConfig(cwd);
|
|
14
|
+
let demoServer = null;
|
|
15
|
+
if (options.demo) {
|
|
16
|
+
demoServer = new DemoServer(5173);
|
|
17
|
+
try {
|
|
18
|
+
const { url } = await demoServer.start();
|
|
19
|
+
config.webConfig.baseUrl = url;
|
|
20
|
+
console.log(`\x1b[36m[TestSpectra]\x1b[0m 🌐 Demo Web App automatically started at: \x1b[33m${url}\x1b[0m`);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.warn(`\x1b[33m[TestSpectra] Warning: Could not start built-in demo server: ${err.message}\x1b[0m`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
13
26
|
if (options.headless !== undefined) {
|
|
14
27
|
config.webConfig.headlessMode = options.headless;
|
|
15
28
|
}
|
|
@@ -116,10 +129,14 @@ export async function runCommand(specPath, options = {}) {
|
|
|
116
129
|
outputJsonPath,
|
|
117
130
|
}, reporter);
|
|
118
131
|
console.log(`\n\x1b[36m[TestSpectra]\x1b[0m Run finished: \x1b[1m${result.status.toUpperCase()}\x1b[0m in ${result.duration}`);
|
|
119
|
-
console.log(`\x1b[36m[TestSpectra]\x1b[0m Report saved to: ${outputJsonPath}`);
|
|
120
132
|
}
|
|
121
133
|
catch (e) {
|
|
122
134
|
console.error(`\x1b[31m[TestSpectra] Execution error:\x1b[0m`, e);
|
|
123
135
|
process.exit(1);
|
|
124
136
|
}
|
|
137
|
+
finally {
|
|
138
|
+
if (demoServer) {
|
|
139
|
+
await demoServer.stop();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
125
142
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { addCommand } from "./commands/add.js";
|
|
3
|
+
import { demoCommand } from "./commands/demo.js";
|
|
3
4
|
import { devicesCommand } from "./commands/devices.js";
|
|
4
5
|
import { doctorCommand } from "./commands/doctor.js";
|
|
5
6
|
import { initCommand } from "./commands/init.js";
|
|
@@ -27,6 +28,11 @@ export function createCliProgram() {
|
|
|
27
28
|
.option("-e, --e2e-folder <name>", "Name of E2E sub-folder (default: e2e)")
|
|
28
29
|
.option("-f, --force", "Overwrite existing module files if present")
|
|
29
30
|
.action(addCommand);
|
|
31
|
+
program
|
|
32
|
+
.command("demo")
|
|
33
|
+
.description("Launch the built-in TestSpectra Demo Web App server on localhost:5173")
|
|
34
|
+
.option("-p, --port <port>", "Port to bind server (default: 5173)")
|
|
35
|
+
.action(demoCommand);
|
|
30
36
|
program
|
|
31
37
|
.command("watch")
|
|
32
38
|
.description("Watch workspace and continuously auto-generate TestSpectra ambient declarations")
|
|
@@ -48,6 +54,7 @@ export function createCliProgram() {
|
|
|
48
54
|
.option("-s, --spec <path>", "Spec file path to execute")
|
|
49
55
|
.option("-t, --target <target>", "Target platform: web, android, ios, common", "web")
|
|
50
56
|
.option("-d, --device <device>", "Target device name or UDID")
|
|
57
|
+
.option("--demo", "Automatically launch built-in demo web app server during test execution")
|
|
51
58
|
.option("--headless", "Run in headless mode")
|
|
52
59
|
.option("--no-headless", "Run in headed mode")
|
|
53
60
|
.option("-w, --workdir <dir>", "Custom app data / temp workdir")
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import http from "http";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const MIME_TYPES = {
|
|
6
|
+
".html": "text/html",
|
|
7
|
+
".js": "application/javascript",
|
|
8
|
+
".css": "text/css",
|
|
9
|
+
".json": "application/json",
|
|
10
|
+
".png": "image/png",
|
|
11
|
+
".jpg": "image/jpeg",
|
|
12
|
+
".gif": "image/gif",
|
|
13
|
+
".svg": "image/svg+xml",
|
|
14
|
+
".ico": "image/x-icon",
|
|
15
|
+
".woff": "font/woff",
|
|
16
|
+
".woff2": "font/woff2",
|
|
17
|
+
".ttf": "font/ttf",
|
|
18
|
+
};
|
|
19
|
+
export class DemoServer {
|
|
20
|
+
server = null;
|
|
21
|
+
port;
|
|
22
|
+
constructor(port = 5173) {
|
|
23
|
+
this.port = port;
|
|
24
|
+
}
|
|
25
|
+
static resolveDemoDist() {
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = path.dirname(__filename);
|
|
28
|
+
const candidates = [
|
|
29
|
+
path.resolve(__dirname, "../../demo-app"),
|
|
30
|
+
path.resolve(__dirname, "../demo-app"),
|
|
31
|
+
path.resolve(__dirname, "../../../demo-app"),
|
|
32
|
+
path.resolve(__dirname, "../../../apps/demo-web-app/dist"),
|
|
33
|
+
path.resolve(__dirname, "../../../../apps/demo-web-app/dist"),
|
|
34
|
+
];
|
|
35
|
+
for (const cand of candidates) {
|
|
36
|
+
if (fs.existsSync(cand) && fs.existsSync(path.join(cand, "index.html"))) {
|
|
37
|
+
return cand;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
async start() {
|
|
43
|
+
const demoDir = DemoServer.resolveDemoDist();
|
|
44
|
+
if (!demoDir) {
|
|
45
|
+
throw new Error("Demo web app bundle not found. Please ensure '@testspectra/cli' is built with bundled demo app.");
|
|
46
|
+
}
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
this.server = http.createServer((req, res) => {
|
|
49
|
+
const reqUrl = req.url ? req.url.split("?")[0] : "/";
|
|
50
|
+
let safePath = path.normalize(reqUrl).replace(/^(\.\.[\/\\])+/, "");
|
|
51
|
+
if (safePath === "/" || safePath === "\\")
|
|
52
|
+
safePath = "/index.html";
|
|
53
|
+
let filePath = path.join(demoDir, safePath);
|
|
54
|
+
// Fallback to index.html for SPA routes
|
|
55
|
+
if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) {
|
|
56
|
+
filePath = path.join(demoDir, "index.html");
|
|
57
|
+
}
|
|
58
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
59
|
+
const contentType = MIME_TYPES[ext] || "application/octet-stream";
|
|
60
|
+
try {
|
|
61
|
+
const content = fs.readFileSync(filePath);
|
|
62
|
+
res.writeHead(200, {
|
|
63
|
+
"Content-Type": contentType,
|
|
64
|
+
"Access-Control-Allow-Origin": "*",
|
|
65
|
+
});
|
|
66
|
+
res.end(content);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
70
|
+
res.end("Not Found");
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
this.server.on("error", (err) => {
|
|
74
|
+
if (err.code === "EADDRINUSE") {
|
|
75
|
+
// Port already in use (e.g. user already running server)
|
|
76
|
+
resolve({ url: `http://localhost:${this.port}`, port: this.port });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
reject(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
this.server.listen(this.port, "0.0.0.0", () => {
|
|
83
|
+
resolve({ url: `http://localhost:${this.port}`, port: this.port });
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async stop() {
|
|
88
|
+
if (this.server) {
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
this.server?.close(() => {
|
|
91
|
+
this.server = null;
|
|
92
|
+
resolve();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testspectra/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.64",
|
|
4
4
|
"description": "TestSpectra Zero-Config Cross-Platform Test Runner CLI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"testspectra": "./bin/spectra.js"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"build": "tsc",
|
|
20
|
+
"build": "tsc && node scripts/copy-demo.js",
|
|
21
21
|
"watch": "tsc -w",
|
|
22
22
|
"prepublishOnly": "npm run build"
|
|
23
23
|
},
|
|
@@ -25,11 +25,12 @@
|
|
|
25
25
|
"dist",
|
|
26
26
|
"bin",
|
|
27
27
|
"templates",
|
|
28
|
+
"demo-app",
|
|
28
29
|
"README.md"
|
|
29
30
|
],
|
|
30
31
|
"dependencies": {
|
|
31
32
|
"@clack/prompts": "^1.7.0",
|
|
32
|
-
"@testspectra/matchers": "^1.0.
|
|
33
|
+
"@testspectra/matchers": "^1.0.64",
|
|
33
34
|
"chalk": "^5.3.0",
|
|
34
35
|
"commander": "^12.1.0",
|
|
35
36
|
"dotenv": "^16.4.5",
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
# CLAUDE.md - TestSpectra Framework Conventions
|
|
2
2
|
|
|
3
3
|
## Commands
|
|
4
|
-
- Run all Web tests
|
|
5
|
-
- Run specific spec
|
|
6
|
-
- Run Web tests: `pnpm test`
|
|
4
|
+
- Run all Web tests: `pnpm spectra run -t web`
|
|
5
|
+
- Run specific spec: `pnpm spectra run "specs/Playground/TC-0001-form-controls/web.test.ts" -t web`
|
|
7
6
|
- Run Mobile tests: `pnpm spectra run --target android` or `pnpm spectra run --target ios`
|
|
8
7
|
- Type checking: `pnpm type-check` (or `tsc -b`)
|
|
9
8
|
- Preflight doctor: `pnpm spectra doctor`
|
package/templates/nx/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# CLAUDE.md - TestSpectra Framework Conventions
|
|
2
2
|
|
|
3
3
|
## Commands
|
|
4
|
-
- Run all Web tests
|
|
5
|
-
- Run specific spec
|
|
6
|
-
- Run
|
|
4
|
+
- Run all Web tests: `pnpm spectra run -t web`
|
|
5
|
+
- Run specific spec: `pnpm spectra run "specs/Playground/TC-0001-form-controls/web.test.ts" -t web`
|
|
6
|
+
- Run Nx monorepo E2E targets: `pnpm nx run-many -t e2e`
|
|
7
7
|
- Run Mobile tests: `pnpm spectra run --target android` or `pnpm spectra run --target ios`
|
|
8
|
-
- Type checking: `pnpm type-check` (or `tsc -b`)
|
|
8
|
+
- Type checking: `pnpm type-check` (or `tsc -b tsconfig.spectra.json`)
|
|
9
9
|
- Preflight doctor: `pnpm spectra doctor`
|
|
10
10
|
- List devices: `pnpm spectra devices`
|
|
@@ -11,8 +11,12 @@
|
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
13
13
|
"@testspectra/cli": "workspace:*",
|
|
14
|
-
"@testspectra/matchers": "^1.0.
|
|
14
|
+
"@testspectra/matchers": "^1.0.64",
|
|
15
15
|
"@types/node": "^20.14.0",
|
|
16
|
+
"@wdio/cli": "^9.2.8",
|
|
17
|
+
"@wdio/local-runner": "^9.2.8",
|
|
18
|
+
"@wdio/spec-reporter": "^9.2.8",
|
|
19
|
+
"@wdio/devtools-service": "^8.46.0",
|
|
16
20
|
"@wdio/globals": "^9.2.8",
|
|
17
21
|
"@wdio/mocha-framework": "^9.2.8",
|
|
18
22
|
"nx": "19.8.4",
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "matchers-e2e",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"projectType": "application",
|
|
5
|
+
"sourceRoot": "packages/matchers/e2e",
|
|
6
|
+
"targets": {
|
|
7
|
+
"e2e": {
|
|
8
|
+
"executor": "nx:run-commands",
|
|
9
|
+
"options": {
|
|
10
|
+
"command": "spectra run",
|
|
11
|
+
"cwd": "packages/matchers/e2e"
|
|
12
|
+
},
|
|
13
|
+
"configurations": {
|
|
14
|
+
"android": {
|
|
15
|
+
"command": "spectra run --target android"
|
|
16
|
+
},
|
|
17
|
+
"ios": {
|
|
18
|
+
"command": "spectra run --target ios"
|
|
19
|
+
},
|
|
20
|
+
"headless": {
|
|
21
|
+
"command": "spectra run --headless"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"type-check": {
|
|
26
|
+
"executor": "nx:run-commands",
|
|
27
|
+
"options": {
|
|
28
|
+
"command": "tsc -b",
|
|
29
|
+
"cwd": "."
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"tags": [
|
|
34
|
+
"scope:matchers",
|
|
35
|
+
"type:e2e"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "playground-e2e",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"projectType": "application",
|
|
5
|
+
"sourceRoot": "packages/playground/e2e",
|
|
6
|
+
"targets": {
|
|
7
|
+
"e2e": {
|
|
8
|
+
"executor": "nx:run-commands",
|
|
9
|
+
"options": {
|
|
10
|
+
"command": "spectra run",
|
|
11
|
+
"cwd": "packages/playground/e2e"
|
|
12
|
+
},
|
|
13
|
+
"configurations": {
|
|
14
|
+
"android": {
|
|
15
|
+
"command": "spectra run --target android"
|
|
16
|
+
},
|
|
17
|
+
"ios": {
|
|
18
|
+
"command": "spectra run --target ios"
|
|
19
|
+
},
|
|
20
|
+
"headless": {
|
|
21
|
+
"command": "spectra run --headless"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"type-check": {
|
|
26
|
+
"executor": "nx:run-commands",
|
|
27
|
+
"options": {
|
|
28
|
+
"command": "tsc -b",
|
|
29
|
+
"cwd": "."
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"tags": [
|
|
34
|
+
"scope:playground",
|
|
35
|
+
"type:e2e"
|
|
36
|
+
]
|
|
37
|
+
}
|