@testspectra/cli 1.1.11-rc.3 → 1.1.12
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/demo-app/assets/index-DDYS5fLp.css +1 -0
- package/demo-app/assets/index-euCENPMy.js +154 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/__tests__/run-e2e.test.js +24 -6
- package/dist/commands/__tests__/run.test.js +27 -0
- package/dist/commands/demo.d.ts +1 -0
- package/dist/commands/demo.js +26 -4
- package/dist/commands/doctor.js +23 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.js +51 -5
- package/dist/commands/test.d.ts +9 -9
- package/dist/commands/test.js +40 -75
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.js +109 -0
- package/dist/config/loader.js +31 -4
- package/dist/config/schema.d.ts +60 -2
- package/dist/config/schema.js +4 -1
- package/dist/generator/__tests__/tsconfig-isolation.test.js +21 -0
- package/dist/generator/__tests__/type-generator.test.js +15 -1
- package/dist/generator/tsconfig-generator.js +1 -0
- package/dist/generator/type-generator.js +2 -0
- package/dist/index.js +11 -4
- package/dist/lifecycle/__tests__/lifecycle-engine.test.js +290 -0
- package/dist/lifecycle/hook-discovery.d.ts +24 -0
- package/dist/lifecycle/hook-discovery.js +60 -0
- package/dist/lifecycle/hook-dispatcher.d.ts +34 -0
- package/dist/lifecycle/hook-dispatcher.js +190 -0
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.js +3 -0
- package/dist/lifecycle/parallel-grouping.d.ts +27 -0
- package/dist/lifecycle/parallel-grouping.js +151 -0
- package/dist/reporter/semantic-formatter.js +2 -0
- package/dist/reporter/types.d.ts +1 -1
- package/dist/runner/bridge.d.ts +2 -0
- package/dist/runner/bridge.js +4 -1
- package/dist/runner/reporter.d.ts +5 -43
- package/dist/runner/reporter.js +46 -179
- package/dist/utils/__tests__/demo-state.test.d.ts +1 -0
- package/dist/utils/__tests__/demo-state.test.js +96 -0
- package/dist/utils/api-server.d.ts +1 -1
- package/dist/utils/api-server.js +7 -3
- package/dist/utils/demo-server.d.ts +2 -0
- package/dist/utils/demo-server.js +18 -5
- package/dist/utils/demo-state.d.ts +40 -0
- package/dist/utils/demo-state.js +157 -0
- package/package.json +9 -8
- package/templates/default/fixtures/sampleDocument.pdf +14 -0
- package/templates/default/fixtures/sampleImage.png +0 -0
- package/templates/default/package.json +2 -2
- package/templates/default/page-objects/MatchersPage/common.ts +41 -0
- package/templates/default/page-objects/MatchersPage/mobile.ts +8 -3
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +6 -0
- package/templates/default/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/mobile.test.ts +3 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +3 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +1 -1
- package/templates/default/specs/Playground/TC-0003-file-upload/web.test.ts +11 -0
- package/templates/default/spectra.config.ts +5 -1
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db +0 -0
- package/templates/nx/.nx/workspace-data/d/daemon.log +7063 -1012
- package/templates/nx/.nx/workspace-data/file-map.json +181 -169
- package/templates/nx/.nx/workspace-data/lockfile.hash +1 -1
- package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
- package/templates/nx/.nx/workspace-data/parsed-lock-file.json +81 -130
- package/templates/nx/.nx/workspace-data/project-graph.json +83 -138
- package/templates/nx/package.json +2 -2
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0003-file-upload/web.test.ts +11 -0
- package/templates/nx/shared/testing/fixtures/sampleDocument.pdf +14 -0
- package/templates/nx/shared/testing/fixtures/sampleImage.png +0 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +68 -26
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +39 -17
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/nx/spectra.config.ts +3 -3
- package/templates/react-component/fixtures/sampleDocument.pdf +14 -0
- package/templates/react-component/fixtures/sampleImage.png +0 -0
- package/templates/react-component/package.json +3 -3
- package/templates/react-component/page-objects/FileUploadComponent/web.ts +15 -0
- package/templates/react-component/specs/FileUploadComponent/TC-0001-upload-fixtures/web.test.tsx +18 -0
- package/templates/react-component/specs/UserListComponent/TC-0001-intercepted-user-list/spec.md +20 -0
- package/templates/react-component/specs/UserListComponent/TC-0001-intercepted-user-list/web.test.tsx +15 -0
- package/templates/react-component/specs/UserListComponent/suite.md +12 -0
- package/templates/react-component/src/components/FileUpload/FileUpload.tsx +44 -0
- package/templates/react-component/src/components/UserList/UserList.tsx +48 -0
- package/bin/.testspectra-runner.hash +0 -1
- package/demo-app/assets/index-BhlW-eXG.css +0 -1
- package/demo-app/assets/index-DOtRypCa.js +0 -154
- package/dist/commands/__tests__/doctor-scope.test.js +0 -24
- /package/dist/{commands/__tests__/doctor-scope.test.d.ts → lifecycle/__tests__/lifecycle-engine.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-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}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-800:oklch(44.4% .177 26.899);--color-red-950:oklch(25.8% .092 26.042);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-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-800:oklch(42.4% .199 265.638);--color-blue-950:oklch(28.2% .091 267.935);--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-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-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.relative{position:relative}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.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-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.h-14{height:calc(var(--spacing) * 14)}.h-full{height:100%}.h-px{height:1px}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-56{max-height:calc(var(--spacing) * 56)}.min-h-8{min-height:calc(var(--spacing) * 8)}.w-56{width:calc(var(--spacing) * 56)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.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\/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-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-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-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-800\/60{border-color:#953d0099}@supports (color:color-mix(in lab,red,red)){.border-amber-800\/60{border-color:color-mix(in oklab,var(--color-amber-800) 60%,transparent)}}.border-blue-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-emerald-800\/50{border-color:#005f4680}@supports (color:color-mix(in lab,red,red)){.border-emerald-800\/50{border-color:color-mix(in oklab,var(--color-emerald-800) 50%,transparent)}}.border-emerald-800\/60{border-color:#005f4699}@supports (color:color-mix(in lab,red,red)){.border-emerald-800\/60{border-color:color-mix(in oklab,var(--color-emerald-800) 60%,transparent)}}.border-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-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-slate-700{border-color:var(--color-slate-700)}.border-slate-700\/40{border-color:#31415866}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/40{border-color:color-mix(in oklab,var(--color-slate-700) 40%,transparent)}}.border-slate-700\/50{border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/50{border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.border-slate-700\/60{border-color:#31415899}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/60{border-color:color-mix(in oklab,var(--color-slate-700) 60%,transparent)}}.border-slate-700\/70{border-color:#314158b3}@supports (color:color-mix(in lab,red,red)){.border-slate-700\/70{border-color:color-mix(in oklab,var(--color-slate-700) 70%,transparent)}}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-800\/50{border-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/50{border-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.border-slate-800\/60{border-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/60{border-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.border-teal-800\/40{border-color:#005f5a66}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/40{border-color:color-mix(in oklab,var(--color-teal-800) 40%,transparent)}}.border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/50{border-color:color-mix(in oklab,var(--color-teal-800) 50%,transparent)}}.border-teal-800\/60{border-color:#005f5a99}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/60{border-color:color-mix(in oklab,var(--color-teal-800) 60%,transparent)}}.border-teal-900\/40{border-color:#0b4f4a66}@supports (color:color-mix(in lab,red,red)){.border-teal-900\/40{border-color:color-mix(in oklab,var(--color-teal-900) 40%,transparent)}}.border-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-t-amber-400{border-top-color:var(--color-amber-400)}.bg-\[\#030a14\]{background-color:#030a14}.bg-\[\#020817\]{background-color:#020817}.bg-\[\#020817\]\/95{background-color:#020817f2}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-950\/40{background-color:#46190166}@supports (color:color-mix(in lab,red,red)){.bg-amber-950\/40{background-color:color-mix(in oklab,var(--color-amber-950) 40%,transparent)}}.bg-amber-950\/60{background-color:#46190199}@supports (color:color-mix(in lab,red,red)){.bg-amber-950\/60{background-color:color-mix(in oklab,var(--color-amber-950) 60%,transparent)}}.bg-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-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-emerald-900\/80{background-color:#004e3bcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-900\/80{background-color:color-mix(in oklab,var(--color-emerald-900) 80%,transparent)}}.bg-emerald-950{background-color:var(--color-emerald-950)}.bg-emerald-950\/40{background-color:#002c2266}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/40{background-color:color-mix(in oklab,var(--color-emerald-950) 40%,transparent)}}.bg-emerald-950\/60{background-color:#002c2299}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/60{background-color:color-mix(in oklab,var(--color-emerald-950) 60%,transparent)}}.bg-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-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-slate-700{background-color:var(--color-slate-700)}.bg-slate-800\/40{background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/40{background-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.bg-slate-800\/50{background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/50{background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.bg-slate-800\/60{background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/60{background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.bg-slate-800\/80{background-color:#1d293dcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/80{background-color:color-mix(in oklab,var(--color-slate-800) 80%,transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/20{background-color:#0f172b33}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/20{background-color:color-mix(in oklab,var(--color-slate-900) 20%,transparent)}}.bg-slate-900\/50{background-color:#0f172b80}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/50{background-color:color-mix(in oklab,var(--color-slate-900) 50%,transparent)}}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/60{background-color:color-mix(in oklab,var(--color-slate-900) 60%,transparent)}}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/20{background-color:#02061833}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/20{background-color:color-mix(in oklab,var(--color-slate-950) 20%,transparent)}}.bg-slate-950\/60{background-color:#02061899}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/60{background-color:color-mix(in oklab,var(--color-slate-950) 60%,transparent)}}.bg-teal-500\/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\/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-violet-400{background-color:var(--color-violet-400)}.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)}}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-5{padding:calc(var(--spacing) * 5)}.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\.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)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-7{padding-left:calc(var(--spacing) * 7)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-pre{white-space:pre}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/90{color:#ffd236e6}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/90{color:color-mix(in oklab,var(--color-amber-300) 90%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-950{color:var(--color-slate-950)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-teal-500{color:var(--color-teal-500)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline{text-decoration-line:none}.accent-teal-400{accent-color:var(--color-teal-400)}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.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-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))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.file\:mr-3::file-selector-button{margin-right:calc(var(--spacing) * 3)}.file\:rounded-lg::file-selector-button{border-radius:var(--radius-lg)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-teal-950\/60::file-selector-button{background-color:#022f2e99}@supports (color:color-mix(in lab,red,red)){.file\:bg-teal-950\/60::file-selector-button{background-color:color-mix(in oklab,var(--color-teal-950) 60%,transparent)}}.file\:px-3::file-selector-button{padding-inline:calc(var(--spacing) * 3)}.file\:py-1\.5::file-selector-button{padding-block:calc(var(--spacing) * 1.5)}.file\:font-mono::file-selector-button{font-family:var(--font-mono)}.file\:text-xs::file-selector-button{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.file\:text-teal-300::file-selector-button{color:var(--color-teal-300)}.placeholder\:text-slate-600::placeholder{color:var(--color-slate-600)}.first\:mt-0:first-child{margin-top:0}@media (hover:hover){.hover\:border-slate-600:hover{border-color:var(--color-slate-600)}.hover\:border-slate-600\/60:hover{border-color:#45556c99}@supports (color:color-mix(in lab,red,red)){.hover\:border-slate-600\/60:hover{border-color:color-mix(in oklab,var(--color-slate-600) 60%,transparent)}}.hover\:border-teal-800\/50:hover{border-color:#005f5a80}@supports (color:color-mix(in lab,red,red)){.hover\:border-teal-800\/50:hover{border-color:color-mix(in oklab,var(--color-teal-800) 50%,transparent)}}.hover\:border-teal-800\/60:hover{border-color:#005f5a99}@supports (color:color-mix(in lab,red,red)){.hover\:border-teal-800\/60:hover{border-color:color-mix(in oklab,var(--color-teal-800) 60%,transparent)}}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-slate-800\/20:hover{background-color:#1d293d33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/20:hover{background-color:color-mix(in oklab,var(--color-slate-800) 20%,transparent)}}.hover\:bg-slate-800\/30:hover{background-color:#1d293d4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/30:hover{background-color:color-mix(in oklab,var(--color-slate-800) 30%,transparent)}}.hover\:bg-slate-800\/40:hover{background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-800\/40:hover{background-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.hover\:bg-teal-500:hover{background-color:var(--color-teal-500)}.hover\:bg-teal-950\/40:hover{background-color:#022f2e66}@supports (color:color-mix(in lab,red,red)){.hover\:bg-teal-950\/40:hover{background-color:color-mix(in oklab,var(--color-teal-950) 40%,transparent)}}.hover\:text-slate-100:hover{color:var(--color-slate-100)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-slate-300:hover{color:var(--color-slate-300)}.hover\:text-teal-300:hover{color:var(--color-teal-300)}.hover\:text-teal-400:hover{color:var(--color-teal-400)}.hover\:file\:bg-teal-900\/60:hover::file-selector-button{background-color:#0b4f4a99}@supports (color:color-mix(in lab,red,red)){.hover\:file\:bg-teal-900\/60:hover::file-selector-button{background-color:color-mix(in oklab,var(--color-teal-900) 60%,transparent)}}}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.focus\:border-teal-500:focus{border-color:var(--color-teal-500)}.focus\:border-teal-700:focus{border-color:var(--color-teal-700)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-teal-500:focus{--tw-ring-color:var(--color-teal-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-slate-700:disabled{background-color:var(--color-slate-700)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.xl\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}}html,body,#app{height:100%}body{background-color:#020817;font-family:Inter,ui-sans-serif,system-ui,sans-serif}code,pre,.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#1e293b;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#334155}html{scroll-behavior:smooth}section[id]{scroll-margin-top:56px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-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}@keyframes spin{to{transform:rotate(360deg)}}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
var On=Object.defineProperty;var Xs=e=>{throw TypeError(e)};var Ln=(e,t,a)=>t in e?On(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var Ie=(e,t,a)=>Ln(e,typeof t!="symbol"?t+"":t,a),hs=(e,t,a)=>t.has(e)||Xs("Cannot "+a);var u=(e,t,a)=>(hs(e,t,"read from private field"),a?a.call(e):t.get(e)),L=(e,t,a)=>t.has(e)?Xs("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),M=(e,t,a,s)=>(hs(e,t,"write to private field"),s?s.call(e,a):t.set(e,a),a),z=(e,t,a)=>(hs(e,t,"access private method"),a);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const n of r)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function a(r){const n={};return r.integrity&&(n.integrity=r.integrity),r.referrerPolicy&&(n.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?n.credentials="include":r.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function s(r){if(r.ep)return;r.ep=!0;const n=a(r);fetch(r.href,n)}})();const pr=!1;var Ds=Array.isArray,Bn=Array.prototype.indexOf,Ya=Array.prototype.includes,os=Array.from,Dn=Object.defineProperty,Sa=Object.getOwnPropertyDescriptor,Hn=Object.getOwnPropertyDescriptors,Rn=Object.prototype,Fn=Array.prototype,hr=Object.getPrototypeOf,er=Object.isExtensible;const mr=()=>{};function jn(e){for(var t=0;t<e.length;t++)e[t]()}function br(){var e,t,a=new Promise((s,r)=>{e=s,t=r});return{promise:a,resolve:e,reject:t}}function Vn(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const a=[];for(const s of e)if(a.push(s),a.length===t)break;return a}const fe=2,oa=4,is=8,xr=1<<24,tt=16,st=32,Pt=64,ys=128,qe=512,ie=1024,ce=2048,dt=4096,me=8192,Ue=16384,ua=32768,tr=1<<25,zt=65536,Qa=1<<17,Wn=1<<18,fa=1<<19,zn=1<<20,it=1<<25,qt=65536,Za=1<<21,Zt=1<<22,Ct=1<<23,Ta=Symbol("$state"),qn=Symbol(""),za=Symbol("attributes"),ws=Symbol("class"),Un=Symbol("style"),ba=Symbol("text"),qa=Symbol("form reset"),ls=new class extends Error{constructor(){super(...arguments);Ie(this,"name","StaleReactionError");Ie(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function $n(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Gn(e,t,a){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Jn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Kn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Yn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Qn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Zn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Xn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function eo(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function to(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const ao=1,so=2,gr=4,ro=8,no=16,oo=1,io=2,oe=Symbol("uninitialized"),lo="http://www.w3.org/1999/xhtml";function co(){console.warn("https://svelte.dev/e/derived_inert")}function uo(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function fo(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function _r(e){return e===this.v}function vo(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function yr(e){return!vo(e,this.v)}let ds=!1,po=!1;function ho(){ds=!0}let le=null;function ia(e){le=e}function be(e,t=!1,a){le={p:le,i:!1,c:null,e:null,s:e,x:null,r:V,l:ds&&!t?{s:null,u:null,$:[]}:null}}function xe(e){var t=le,a=t.e;if(a!==null){t.e=null;for(var s of a)Wr(s)}return t.i=!0,le=t.p,{}}function Ha(){return!ds||le!==null&&le.l===null}let Nt=[];function wr(){var e=Nt;Nt=[],jn(e)}function At(e){if(Nt.length===0&&!Ca){var t=Nt;queueMicrotask(()=>{t===Nt&&wr()})}Nt.push(e)}function mo(){for(;Nt.length>0;)wr()}function kr(e){var t=V;if(t===null)return R.f|=Ct,e;if(!(t.f&ua)&&!(t.f&oa))throw e;Tt(e,t)}function Tt(e,t){if(!(t!==null&&t.f&Ue)){for(;t!==null;){if(t.f&ys){if(!(t.f&ua))throw e;try{t.b.error(e);return}catch(a){e=a}}t=t.parent}throw e}}const bo=-7169;function se(e,t){e.f=e.f&bo|t}function Hs(e){e.f&qe||e.deps===null?se(e,ie):se(e,dt)}function Sr(e){if(e!==null)for(const t of e)!(t.f&fe)||!(t.f&qt)||(t.f^=qt,Sr(t.deps))}function Tr(e,t,a){e.f&ce?t.add(e):e.f&dt&&a.add(e),Sr(e.deps),se(e,ie)}function xo(e){let t=0,a=$t(0),s;return()=>{Ws()&&(p(a),zr(()=>(t===0&&(s=tn(()=>e(()=>Aa(a)))),t+=1,()=>{At(()=>{t-=1,t===0&&(s==null||s(),s=void 0,Aa(a))})})))}}var go=zt|fa;function _o(e,t,a,s){new yo(e,t,a,s)}var je,Bs,Ve,Bt,Se,We,he,Ne,vt,Dt,kt,Xt,Na,Oa,pt,ss,te,wo,ko,So,ks,Ua,$a,Ss,Ts;class yo{constructor(t,a,s,r){L(this,te);Ie(this,"parent");Ie(this,"is_pending",!1);Ie(this,"transform_error");L(this,je);L(this,Bs,null);L(this,Ve);L(this,Bt);L(this,Se);L(this,We,null);L(this,he,null);L(this,Ne,null);L(this,vt,null);L(this,Dt,0);L(this,kt,0);L(this,Xt,!1);L(this,Na,new Set);L(this,Oa,new Set);L(this,pt,null);L(this,ss,xo(()=>(M(this,pt,$t(u(this,Dt))),()=>{M(this,pt,null)})));var n;M(this,je,t),M(this,Ve,a),M(this,Bt,o=>{var d=V;d.b=this,d.f|=ys,s(o)}),this.parent=V.b,this.transform_error=r??((n=this.parent)==null?void 0:n.transform_error)??(o=>o),M(this,Se,us(()=>{z(this,te,ks).call(this)},go))}defer_effect(t){Tr(t,u(this,Na),u(this,Oa))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!u(this,Ve).pending}update_pending_count(t,a){z(this,te,Ss).call(this,t,a),M(this,Dt,u(this,Dt)+t),!(!u(this,pt)||u(this,Xt))&&(M(this,Xt,!0),At(()=>{M(this,Xt,!1),u(this,pt)&&da(u(this,pt),u(this,Dt))}))}get_effect_pending(){return u(this,ss).call(this),p(u(this,pt))}error(t){if(!u(this,Ve).onerror&&!u(this,Ve).failed)throw t;E!=null&&E.is_fork?(u(this,We)&&E.skip_effect(u(this,We)),u(this,he)&&E.skip_effect(u(this,he)),u(this,Ne)&&E.skip_effect(u(this,Ne)),E.oncommit(()=>{z(this,te,Ts).call(this,t)})):z(this,te,Ts).call(this,t)}}je=new WeakMap,Bs=new WeakMap,Ve=new WeakMap,Bt=new WeakMap,Se=new WeakMap,We=new WeakMap,he=new WeakMap,Ne=new WeakMap,vt=new WeakMap,Dt=new WeakMap,kt=new WeakMap,Xt=new WeakMap,Na=new WeakMap,Oa=new WeakMap,pt=new WeakMap,ss=new WeakMap,te=new WeakSet,wo=function(){try{M(this,We,ze(()=>u(this,Bt).call(this,u(this,je))))}catch(t){this.error(t)}},ko=function(t){const a=u(this,Ve).failed;a&&M(this,Ne,ze(()=>{a(u(this,je),()=>t,()=>()=>{})}))},So=function(){const t=u(this,Ve).pending;t&&(this.is_pending=!0,M(this,he,ze(()=>t(u(this,je)))),At(()=>{var a=M(this,vt,document.createDocumentFragment()),s=xt();a.append(s),M(this,We,z(this,te,$a).call(this,()=>ze(()=>u(this,Bt).call(this,s)))),u(this,kt)===0&&(u(this,je).before(a),M(this,vt,null),Vt(u(this,he),()=>{M(this,he,null)}),z(this,te,Ua).call(this,E))}))},ks=function(){try{if(this.is_pending=this.has_pending_snippet(),M(this,kt,0),M(this,Dt,0),M(this,We,ze(()=>{u(this,Bt).call(this,u(this,je))})),u(this,kt)>0){var t=M(this,vt,document.createDocumentFragment());Us(u(this,We),t);const a=u(this,Ve).pending;M(this,he,ze(()=>a(u(this,je))))}else z(this,te,Ua).call(this,E)}catch(a){this.error(a)}},Ua=function(t){this.is_pending=!1,t.transfer_effects(u(this,Na),u(this,Oa))},$a=function(t){var a=V,s=R,r=le;ct(u(this,Se)),$e(u(this,Se)),ia(u(this,Se).ctx);try{return Ut.ensure(),t()}catch(n){return kr(n),null}finally{ct(a),$e(s),ia(r)}},Ss=function(t,a){var s;if(!this.has_pending_snippet()){this.parent&&z(s=this.parent,te,Ss).call(s,t,a);return}M(this,kt,u(this,kt)+t),u(this,kt)===0&&(z(this,te,Ua).call(this,a),u(this,he)&&Vt(u(this,he),()=>{M(this,he,null)}),u(this,vt)&&(u(this,je).before(u(this,vt)),M(this,vt,null)))},Ts=function(t){u(this,We)&&(Ce(u(this,We)),M(this,We,null)),u(this,he)&&(Ce(u(this,he)),M(this,he,null)),u(this,Ne)&&(Ce(u(this,Ne)),M(this,Ne,null));var a=u(this,Ve).onerror;let s=u(this,Ve).failed;var r=!1,n=!1;const o=()=>{if(r){fo();return}r=!0,n&&to(),u(this,Ne)!==null&&Vt(u(this,Ne),()=>{M(this,Ne,null)}),z(this,te,$a).call(this,()=>{z(this,te,ks).call(this)})},d=i=>{try{n=!0,a==null||a(i,o),n=!1}catch(c){Tt(c,u(this,Se)&&u(this,Se).parent)}s&&M(this,Ne,z(this,te,$a).call(this,()=>{try{return ze(()=>{var c=V;c.b=this,c.f|=ys,s(u(this,je),()=>i,()=>o)})}catch(c){return Tt(c,u(this,Se).parent),null}}))};At(()=>{var i;try{i=this.transform_error(t)}catch(c){Tt(c,u(this,Se)&&u(this,Se).parent);return}i!==null&&typeof i=="object"&&typeof i.then=="function"?i.then(d,c=>Tt(c,u(this,Se)&&u(this,Se).parent)):d(i)})};function To(e,t,a,s){const r=Ha()?Rs:Cr;var n=e.filter(m=>!m.settled),o=t.map(r);if(a.length===0&&n.length===0){s(o);return}var d=V,i=Eo(),c=n.length===1?n[0].promise:n.length>1?Promise.all(n.map(m=>m.promise)):null;function h(m){if(!(d.f&Ue)){i();try{s([...o,...m])}catch(x){Tt(x,d)}Xa()}}var b=Er();if(a.length===0){c.then(()=>h([])).finally(b);return}function v(){Promise.all(a.map(m=>Co(m))).then(h).catch(m=>Tt(m,d)).finally(b)}c?c.then(()=>{i(),v(),Xa()}):v()}function Eo(){var e=V,t=R,a=le,s=E;return function(n=!0){ct(e),$e(t),ia(a),n&&!(e.f&Ue)&&(s==null||s.activate(),s==null||s.apply())}}function Xa(e=!0){ct(null),$e(null),ia(null),e&&(E==null||E.deactivate())}function Er(){var e=V,t=e.b,a=E,s=!!(t!=null&&t.is_rendered());return t==null||t.update_pending_count(1,a),a.increment(s,e),()=>{t==null||t.update_pending_count(-1,a),a.decrement(s,e)}}function Rs(e){var t=fe|ce;return V!==null&&(V.f|=fa),{ctx:le,deps:null,effects:null,equals:_r,f:t,fn:e,reactions:null,rv:0,v:oe,wv:0,parent:V,ac:null}}const xa=Symbol("obsolete");function Co(e,t,a){let s=V;s===null&&$n();var r=void 0,n=$t(oe),o=!R,d=new Set;return Uo(()=>{var m,x;var i=V,c=br();r=c.promise;try{Promise.resolve(e()).then(c.resolve,_=>{_!==ls&&c.reject(_)}).finally(Xa)}catch(_){c.reject(_),Xa()}var h=E;if(o){if(i.f&ua)var b=Er();if((m=s.b)!=null&&m.is_rendered())(x=h.async_deriveds.get(i))==null||x.reject(xa);else for(const _ of d.values())_.reject(xa);d.add(c),h.async_deriveds.set(i,c)}const v=(_,g=void 0)=>{b==null||b(),d.delete(c),g!==xa&&(h.activate(),g?(n.f|=Ct,da(n,g)):(n.f&Ct&&(n.f^=Ct),da(n,_)),h.deactivate())};c.promise.then(v,_=>v(null,_||"unknown"))}),zs(()=>{for(const i of d)i.reject(xa)}),new Promise(i=>{function c(h){function b(){h===r?i(n):c(r)}h.then(b,b)}c(r)})}function la(e){const t=Rs(e);return Jr(t),t}function Cr(e){const t=Rs(e);return t.equals=yr,t}function Ao(e){var t=e.effects;if(t!==null){e.effects=null;for(var a=0;a<t.length;a+=1)Ce(t[a])}}function Fs(e){var t,a=V,s=e.parent;if(!It&&s!==null&&e.v!==oe&&s.f&(Ue|me))return co(),e.v;ct(s);try{e.f&=~qt,Ao(e),t=Zr(e)}finally{ct(a)}return t}function Ar(e){var t=Fs(e);if(!e.equals(t)&&(e.wv=Yr(),(!(E!=null&&E.is_fork)||e.deps===null)&&(E!==null?(E.capture(e,t,!0),Ea==null||Ea.capture(e,t,!0)):e.v=t,e.deps===null))){se(e,ie);return}It||(ue!==null?(Ws()||E!=null&&E.is_fork)&&ue.set(e,t):Hs(e))}function Po(e){var t,a;if(e.effects!==null)for(const s of e.effects)(s.teardown||s.ac)&&((t=s.teardown)==null||t.call(s),(a=s.ac)==null||a.abort(ls),s.fn!==null&&(s.teardown=mr),s.ac=null,Ia(s,0),qs(s))}function Pr(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&t.fn!==null&&ca(t)}let ms=null,Kt=null,E=null,Ea=null,ue=null,Es=null,Ca=!1,bs=!1,Qt=null,Ga=null;var ar=0;let Io=1;var ea,St,Ht,ta,aa,sa,ht,ra,Te,La,mt,Xe,nt,na,Rt,G,Cs,ga,As,Ir,Mr,Yt,Mo,_a;const rs=class rs{constructor(){L(this,G);Ie(this,"id",Io++);L(this,ea,!1);Ie(this,"linked",!0);L(this,St,null);L(this,Ht,null);Ie(this,"async_deriveds",new Map);Ie(this,"current",new Map);Ie(this,"previous",new Map);L(this,ta,new Set);L(this,aa,new Set);L(this,sa,0);L(this,ht,new Map);L(this,ra,null);L(this,Te,[]);L(this,La,[]);L(this,mt,new Set);L(this,Xe,new Set);L(this,nt,new Map);L(this,na,new Set);Ie(this,"is_fork",!1);L(this,Rt,!1);Kt===null?ms=Kt=this:(M(Kt,Ht,this),M(this,St,Kt)),Kt=this}skip_effect(t){u(this,nt).has(t)||u(this,nt).set(t,{d:[],m:[]}),u(this,na).delete(t)}unskip_effect(t,a=s=>this.schedule(s)){var s=u(this,nt).get(t);if(s){u(this,nt).delete(t);for(var r of s.d)se(r,ce),a(r);for(r of s.m)se(r,dt),a(r)}u(this,na).add(t)}capture(t,a,s=!1){t.v!==oe&&!this.previous.has(t)&&this.previous.set(t,t.v),t.f&Ct||(this.current.set(t,[a,s]),ue==null||ue.set(t,a)),this.is_fork||(t.v=a)}activate(){E=this}deactivate(){E=null,ue=null}flush(){try{bs=!0,E=this,z(this,G,ga).call(this)}finally{ar=0,Es=null,Qt=null,Ga=null,bs=!1,E=null,ue=null,jt.clear()}}discard(){var t;for(const a of u(this,aa))a(this);u(this,aa).clear();for(const a of this.async_deriveds.values())a.reject(xa);z(this,G,_a).call(this),(t=u(this,ra))==null||t.resolve()}register_created_effect(t){u(this,La).push(t)}increment(t,a){if(M(this,sa,u(this,sa)+1),t){let s=u(this,ht).get(a)??0;u(this,ht).set(a,s+1)}}decrement(t,a){if(M(this,sa,u(this,sa)-1),t){let s=u(this,ht).get(a)??0;s===1?u(this,ht).delete(a):u(this,ht).set(a,s-1)}u(this,Rt)||(M(this,Rt,!0),At(()=>{M(this,Rt,!1),this.linked&&this.flush()}))}transfer_effects(t,a){for(const s of t)u(this,mt).add(s);for(const s of a)u(this,Xe).add(s);t.clear(),a.clear()}oncommit(t){u(this,ta).add(t)}ondiscard(t){u(this,aa).add(t)}settled(){return(u(this,ra)??M(this,ra,br())).promise}static ensure(){if(E===null){const t=E=new rs;!bs&&!Ca&&At(()=>{u(t,ea)||t.flush()})}return E}apply(){{ue=null;return}}schedule(t){var r;if(Es=t,(r=t.b)!=null&&r.is_pending&&t.f&(oa|is|xr)&&!(t.f&ua)){t.b.defer_effect(t);return}for(var a=t;a.parent!==null;){a=a.parent;var s=a.f;if(Qt!==null&&a===V&&(R===null||!(R.f&fe)))return;if(s&(Pt|st)){if(!(s&ie))return;a.f^=ie}}u(this,Te).push(a)}};ea=new WeakMap,St=new WeakMap,Ht=new WeakMap,ta=new WeakMap,aa=new WeakMap,sa=new WeakMap,ht=new WeakMap,ra=new WeakMap,Te=new WeakMap,La=new WeakMap,mt=new WeakMap,Xe=new WeakMap,nt=new WeakMap,na=new WeakMap,Rt=new WeakMap,G=new WeakSet,Cs=function(){if(this.is_fork)return!0;for(const s of u(this,ht).keys()){for(var t=s,a=!1;t.parent!==null;){if(u(this,nt).has(t)){a=!0;break}t=t.parent}if(!a)return!0}return!1},ga=function(){var i,c,h,b;M(this,ea,!0),ar++>1e3&&(z(this,G,_a).call(this),Oo());for(const v of u(this,mt))u(this,Xe).delete(v),se(v,ce),this.schedule(v);for(const v of u(this,Xe))se(v,dt),this.schedule(v);const t=u(this,Te);M(this,Te,[]),this.apply();var a=Qt=[],s=[],r=Ga=[];for(const v of t)try{z(this,G,As).call(this,v,a,s)}catch(m){throw Lr(v),z(this,G,Cs).call(this)||this.discard(),m}if(E=null,r.length>0){var n=rs.ensure();for(const v of r)n.schedule(v)}if(Qt=null,Ga=null,z(this,G,Cs).call(this)){z(this,G,Yt).call(this,s),z(this,G,Yt).call(this,a);for(const[v,m]of u(this,nt))Or(v,m);r.length>0&&z(i=E,G,ga).call(i);return}const o=z(this,G,Ir).call(this);if(o){z(this,G,Yt).call(this,s),z(this,G,Yt).call(this,a),z(c=o,G,Mr).call(c,this);return}u(this,mt).clear(),u(this,Xe).clear();for(const v of u(this,ta))v(this);u(this,ta).clear(),Ea=this,sr(s),sr(a),Ea=null,(h=u(this,ra))==null||h.resolve();var d=E;if(u(this,sa)===0&&(u(this,Te).length===0||d!==null)&&z(this,G,_a).call(this),u(this,Te).length>0)if(d!==null){const v=d;u(v,Te).push(...u(this,Te).filter(m=>!u(v,Te).includes(m)))}else d=this;d!==null&&z(b=d,G,ga).call(b)},As=function(t,a,s){t.f^=ie;for(var r=t.first;r!==null;){var n=r.f,o=(n&(st|Pt))!==0,d=o&&(n&ie)!==0,i=d||(n&me)!==0||u(this,nt).has(r);if(!i&&r.fn!==null){o?r.f^=ie:n&oa?a.push(r):Fa(r)&&(n&tt&&u(this,Xe).add(r),ca(r));var c=r.first;if(c!==null){r=c;continue}}for(;r!==null;){var h=r.next;if(h!==null){r=h;break}r=r.parent}}},Ir=function(){for(var t=u(this,St);t!==null;){if(!t.is_fork){for(const[a,[,s]]of this.current)if(t.current.has(a)&&!s)return t}t=u(t,St)}return null},Mr=function(t){var s;for(const[r,n]of t.current)!this.previous.has(r)&&t.previous.has(r)&&this.previous.set(r,t.previous.get(r)),this.current.set(r,n);for(const[r,n]of t.async_deriveds){const o=this.async_deriveds.get(r);o&&n.promise.then(o.resolve).catch(o.reject)}t.async_deriveds.clear(),this.transfer_effects(u(t,mt),u(t,Xe));const a=r=>{var n=r.reactions;if(n!==null)for(const i of n){var o=i.f;if(o&fe)a(i);else{var d=i;o&(Zt|tt)&&!this.async_deriveds.has(d)&&(u(this,Xe).delete(d),se(d,ce),this.schedule(d))}}};for(const r of this.current.keys())a(r);this.oncommit(()=>t.discard()),z(s=t,G,_a).call(s),E=this,z(this,G,ga).call(this)},Yt=function(t){for(var a=0;a<t.length;a+=1)Tr(t[a],u(this,mt),u(this,Xe))},Mo=function(){var b;for(let v=ms;v!==null;v=u(v,Ht)){var t=v.id<this.id,a=[];for(const[m,[x,_]]of this.current){if(v.current.has(m)){var s=v.current.get(m)[0];if(t&&x!==s)v.current.set(m,[x,_]);else continue}a.push(m)}if(t)for(const[m,x]of this.async_deriveds){const _=v.async_deriveds.get(m);_&&x.promise.then(_.resolve).catch(_.reject)}var r=[...v.current.keys()].filter(m=>!v.current.get(m)[1]);if(!(!u(v,ea)||r.length===0)){var n=r.filter(m=>!this.current.has(m));if(n.length===0)t&&v.discard();else if(a.length>0){if(t)for(const m of u(this,na))v.unskip_effect(m,x=>{var _;x.f&(tt|Zt)?v.schedule(x):z(_=v,G,Yt).call(_,[x])});v.activate();var o=new Set,d=new Map;for(var i of a)Nr(i,n,o,d);d=new Map;var c=[...v.current].filter(([m,x])=>{const _=this.current.get(m);return _?_[0]!==x[0]||_[1]!==x[1]:!0}).map(([m])=>m);if(c.length>0)for(const m of u(this,La))!(m.f&(Ue|me|Qa))&&js(m,c,d)&&(m.f&(Zt|tt)?(se(m,ce),v.schedule(m)):u(v,mt).add(m));if(u(v,Te).length>0&&!u(v,Rt)){v.apply();for(var h of u(v,Te))z(b=v,G,As).call(b,h,[],[]);M(v,Te,[])}v.deactivate()}}}},_a=function(){if(this.linked){var t=u(this,St),a=u(this,Ht);t===null?ms=a:M(t,Ht,a),a===null?Kt=t:M(a,St,t),this.linked=!1}};let Ut=rs;function No(e){var t=Ca;Ca=!0;try{for(var a;;){if(mo(),E===null)return a;E.flush()}}finally{Ca=t}}function Oo(){try{Qn()}catch(e){Tt(e,Es)}}let Ze=null;function sr(e){var t=e.length;if(t!==0){for(var a=0;a<t;){var s=e[a++];if(!(s.f&(Ue|me))&&Fa(s)&&(Ze=new Set,ca(s),s.deps===null&&s.first===null&&s.nodes===null&&s.teardown===null&&s.ac===null&&Ur(s),(Ze==null?void 0:Ze.size)>0)){jt.clear();for(const r of Ze){if(r.f&(Ue|me))continue;const n=[r];let o=r.parent;for(;o!==null;)Ze.has(o)&&(Ze.delete(o),n.push(o)),o=o.parent;for(let d=n.length-1;d>=0;d--){const i=n[d];i.f&(Ue|me)||ca(i)}}Ze.clear()}}Ze=null}}function Nr(e,t,a,s){if(!a.has(e)&&(a.add(e),e.reactions!==null))for(const r of e.reactions){const n=r.f;n&fe?Nr(r,t,a,s):n&(Zt|tt)&&!(n&ce)&&js(r,t,s)&&(se(r,ce),Vs(r))}}function js(e,t,a){const s=a.get(e);if(s!==void 0)return s;if(e.deps!==null)for(const r of e.deps){if(Ya.call(t,r))return!0;if(r.f&fe&&js(r,t,a))return a.set(r,!0),!0}return a.set(e,!1),!1}function Vs(e){E.schedule(e)}function Or(e,t){if(!(e.f&st&&e.f&ie)){e.f&ce?t.d.push(e):e.f&dt&&t.m.push(e),se(e,ie);for(var a=e.first;a!==null;)Or(a,t),a=a.next}}function Lr(e){se(e,ie);for(var t=e.first;t!==null;)Lr(t),t=t.next}let es=new Set;const jt=new Map;let Br=!1;function $t(e,t){var a={f:0,v:e,reactions:null,equals:_r,rv:0,wv:0};return a}function P(e,t){const a=$t(e);return Jr(a),a}function Lo(e,t=!1,a=!0){var r;const s=$t(e);return t||(s.equals=yr),ds&&a&&le!==null&&le.l!==null&&((r=le.l).s??(r.s=[])).push(s),s}function y(e,t,a=!1){R!==null&&(!at||R.f&Qa)&&Ha()&&R.f&(fe|tt|Zt|Qa)&&(lt===null||!lt.has(e))&&eo();let s=a?bt(t):t;return da(e,s,Ga)}function da(e,t,a=null){if(!e.equals(t)){jt.set(e,It?t:e.v);var s=Ut.ensure();if(s.capture(e,t),e.f&fe){const r=e;e.f&ce&&Fs(r),ue===null&&Hs(r)}e.wv=Yr(),Dr(e,ce,a),Ha()&&V!==null&&V.f&ie&&!(V.f&(st|Pt))&&(Fe===null?Jo([e]):Fe.push(e)),!s.is_fork&&es.size>0&&!Br&&Bo()}return t}function Bo(){Br=!1;for(const e of es){e.f&ie&&se(e,dt);let t;try{t=Fa(e)}catch{t=!0}t&&ca(e)}es.clear()}function Aa(e){y(e,e.v+1)}function Dr(e,t,a){var s=e.reactions;if(s!==null)for(var r=Ha(),n=s.length,o=0;o<n;o++){var d=s[o],i=d.f;if(!(!r&&d===V)){var c=(i&ce)===0;if(c&&se(d,t),i&Qa)es.add(d);else if(i&fe){var h=d;ue==null||ue.delete(h),i&qt||(i&qe&&(V===null||!(V.f&Za))&&(d.f|=qt),Dr(h,dt,a))}else if(c){var b=d;i&tt&&Ze!==null&&Ze.add(b),a!==null?a.push(b):Vs(b)}}}}function bt(e){if(typeof e!="object"||e===null||Ta in e)return e;const t=hr(e);if(t!==Rn&&t!==Fn)return e;var a=new Map,s=Ds(e),r=P(0),n=Wt,o=d=>{if(Wt===n)return d();var i=R,c=Wt;$e(null),lr(n);var h=d();return $e(i),lr(c),h};return s&&a.set("length",P(e.length)),new Proxy(e,{defineProperty(d,i,c){(!("value"in c)||c.configurable===!1||c.enumerable===!1||c.writable===!1)&&Zn();var h=a.get(i);return h===void 0?o(()=>{var b=P(c.value);return a.set(i,b),b}):y(h,c.value,!0),!0},deleteProperty(d,i){var c=a.get(i);if(c===void 0){if(i in d){const h=o(()=>P(oe));a.set(i,h),Aa(r)}}else y(c,oe),Aa(r);return!0},get(d,i,c){var m;if(i===Ta)return e;var h=a.get(i),b=i in d;if(h===void 0&&(!b||(m=Sa(d,i))!=null&&m.writable)&&(h=o(()=>{var x=bt(b?d[i]:oe),_=P(x);return _}),a.set(i,h)),h!==void 0){var v=p(h);return v===oe?void 0:v}return Reflect.get(d,i,c)},getOwnPropertyDescriptor(d,i){var c=Reflect.getOwnPropertyDescriptor(d,i);if(c&&"value"in c){var h=a.get(i);h&&(c.value=p(h))}else if(c===void 0){var b=a.get(i),v=b==null?void 0:b.v;if(b!==void 0&&v!==oe)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return c},has(d,i){var v;if(i===Ta)return!0;var c=a.get(i),h=c!==void 0&&c.v!==oe||Reflect.has(d,i);if(c!==void 0||V!==null&&(!h||(v=Sa(d,i))!=null&&v.writable)){c===void 0&&(c=o(()=>{var m=h?bt(d[i]):oe,x=P(m);return x}),a.set(i,c));var b=p(c);if(b===oe)return!1}return h},set(d,i,c,h){var T;var b=a.get(i),v=i in d;if(s&&i==="length")for(var m=c;m<b.v;m+=1){var x=a.get(m+"");x!==void 0?y(x,oe):m in d&&(x=o(()=>P(oe)),a.set(m+"",x))}if(b===void 0)(!v||(T=Sa(d,i))!=null&&T.writable)&&(b=o(()=>P(void 0)),y(b,bt(c)),a.set(i,b));else{v=b.v!==oe;var _=o(()=>bt(c));y(b,_)}var g=Reflect.getOwnPropertyDescriptor(d,i);if(g!=null&&g.set&&g.set.call(h,c),!v){if(s&&typeof i=="string"){var S=a.get("length"),A=Number(i);Number.isInteger(A)&&A>=S.v&&y(S,A+1)}Aa(r)}return!0},ownKeys(d){p(r);var i=Reflect.ownKeys(d).filter(b=>{var v=a.get(b);return v===void 0||v.v!==oe});for(var[c,h]of a)h.v!==oe&&!(c in d)&&i.push(c);return i},setPrototypeOf(){Xn()}})}function rr(e){try{if(e!==null&&typeof e=="object"&&Ta in e)return e[Ta]}catch{}return e}function Do(e,t){return Object.is(rr(e),rr(t))}var nr,Hr,Rr,Fr;function Ho(){if(nr===void 0){nr=window,Hr=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,a=Text.prototype;Rr=Sa(t,"firstChild").get,Fr=Sa(t,"nextSibling").get,er(e)&&(e[ws]=void 0,e[za]=null,e[Un]=void 0,e.__e=void 0),er(a)&&(a[ba]=void 0)}}function xt(e=""){return document.createTextNode(e)}function Et(e){return Rr.call(e)}function Ra(e){return Fr.call(e)}function l(e,t){return Et(e)}function Ps(e,t=!1){{var a=Et(e);return a instanceof Comment&&a.data===""?Ra(a):a}}function f(e,t=1,a=!1){let s=e;for(;t--;)s=Ra(s);return s}function Ro(e){e.textContent=""}function jr(){return!1}function Fo(e,t,a){return a?document.createElement(e,{is:a}):document.createElement(e)}let or=!1;function jo(){or||(or=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const a of e.target.elements)(t=a[qa])==null||t.call(a)})},{capture:!0}))}function cs(e){var t=R,a=V;$e(null),ct(null);try{return e()}finally{$e(t),ct(a)}}function Vr(e,t,a,s=a){e.addEventListener(t,()=>cs(a));const r=e[qa];r?e[qa]=()=>{r(),s(!0)}:e[qa]=()=>s(!0),jo()}function Vo(e){V===null&&(R===null&&Yn(),Kn()),It&&Jn()}function Wo(e,t){var a=t.last;a===null?t.last=t.first=e:(a.next=e,e.prev=a,t.last=e)}function gt(e,t){var a=V;a!==null&&a.f&me&&(e|=me);var s={ctx:le,deps:null,nodes:null,f:e|ce|qe,first:null,fn:t,last:null,next:null,parent:a,b:a&&a.b,prev:null,teardown:null,wv:0,ac:null};E==null||E.register_created_effect(s);var r=s;if(e&oa)Qt!==null?Qt.push(s):Ut.ensure().schedule(s);else if(t!==null){try{ca(s)}catch(o){throw Ce(s),o}r.deps===null&&r.teardown===null&&r.nodes===null&&r.first===r.last&&!(r.f&fa)&&(r=r.first,e&tt&&e&zt&&r!==null&&(r.f|=zt))}if(r!==null&&(r.parent=a,a!==null&&Wo(r,a),R!==null&&R.f&fe&&!(e&Pt))){var n=R;(n.effects??(n.effects=[])).push(r)}return s}function Ws(){return R!==null&&!at}function zs(e){const t=gt(is,null);return se(t,ie),t.teardown=e,t}function Is(e){Vo();var t=V.f,a=!R&&(t&st)!==0&&le!==null&&!le.i;if(a){var s=le;(s.e??(s.e=[])).push(e)}else return Wr(e)}function Wr(e){return gt(oa|zn,e)}function zo(e){Ut.ensure();const t=gt(Pt|fa,e);return(a={})=>new Promise(s=>{a.outro?Vt(t,()=>{Ce(t),s(void 0)}):(Ce(t),s(void 0))})}function qo(e){return gt(oa,e)}function Uo(e){return gt(Zt|fa,e)}function zr(e,t=0){return gt(is|t,e)}function B(e,t=[],a=[],s=[]){To(s,t,a,r=>{gt(is,()=>{e(...r.map(p))})})}function us(e,t=0){var a=gt(tt|t,e);return a}function ze(e){return gt(st|fa,e)}function qr(e){var t=e.teardown;if(t!==null){const a=It,s=R;ir(!0),$e(null);try{t.call(null)}finally{ir(a),$e(s)}}}function qs(e,t=!1){var a=e.first;for(e.first=e.last=null;a!==null;){const r=a.ac;r!==null&&cs(()=>{r.abort(ls)});var s=a.next;a.f&Pt?a.parent=null:Ce(a,t),a=s}}function $o(e){for(var t=e.first;t!==null;){var a=t.next;t.f&st||Ce(t),t=a}}function Ce(e,t=!0){var a=!1;(t||e.f&Wn)&&e.nodes!==null&&e.nodes.end!==null&&(Go(e.nodes.start,e.nodes.end),a=!0),e.f|=tr,qs(e,t&&!a),Ia(e,0);var s=e.nodes&&e.nodes.t;if(s!==null)for(const n of s)n.stop();qr(e),e.f^=tr,e.f|=Ue;var r=e.parent;r!==null&&r.first!==null&&Ur(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Go(e,t){for(;e!==null;){var a=e===t?null:Ra(e);e.remove(),e=a}}function Ur(e){var t=e.parent,a=e.prev,s=e.next;a!==null&&(a.next=s),s!==null&&(s.prev=a),t!==null&&(t.first===e&&(t.first=s),t.last===e&&(t.last=a))}function Vt(e,t,a=!0){var s=[];$r(e,s,!0);var r=()=>{a&&Ce(e),t&&t()},n=s.length;if(n>0){var o=()=>--n||r();for(var d of s)d.out(o)}else r()}function $r(e,t,a){if(!(e.f&me)){e.f^=me;var s=e.nodes&&e.nodes.t;if(s!==null)for(const d of s)(d.is_global||a)&&t.push(d);for(var r=e.first;r!==null;){var n=r.next;if(!(r.f&Pt)){var o=(r.f&zt)!==0||(r.f&st)!==0&&(e.f&tt)!==0;$r(r,t,o?a:!1)}r=n}}}function ts(e){Gr(e,!0)}function Gr(e,t){if(e.f&me){e.f^=me,e.f&ie||(se(e,ce),Ut.ensure().schedule(e));for(var a=e.first;a!==null;){var s=a.next,r=(a.f&zt)!==0||(a.f&st)!==0;Gr(a,r?t:!1),a=s}var n=e.nodes&&e.nodes.t;if(n!==null)for(const o of n)(o.is_global||t)&&o.in()}}function Us(e,t){if(e.nodes)for(var a=e.nodes.start,s=e.nodes.end;a!==null;){var r=a===s?null:Ra(a);t.append(a),a=r}}let Ja=!1,It=!1;function ir(e){It=e}let R=null,at=!1;function $e(e){R=e}let V=null;function ct(e){V=e}let lt=null;function Jr(e){R!==null&&(lt??(lt=new Set)).add(e)}let Ee=null,Me=0,Fe=null;function Jo(e){Fe=e}let Kr=1,Ot=0,Wt=Ot;function lr(e){Wt=e}function Yr(){return++Kr}function Fa(e){var t=e.f;if(t&ce)return!0;if(t&fe&&(e.f&=~qt),t&dt){for(var a=e.deps,s=a.length,r=0;r<s;r++){var n=a[r];if(Fa(n)&&Ar(n),n.wv>e.wv)return!0}t&qe&&ue===null&&se(e,ie)}return!1}function Qr(e,t,a=!0){var s=e.reactions;if(s!==null&&!(lt!==null&<.has(e)))for(var r=0;r<s.length;r++){var n=s[r];n.f&fe?Qr(n,t,!1):t===n&&(a?se(n,ce):n.f&ie&&se(n,dt),Vs(n))}}function Zr(e){var _;var t=Ee,a=Me,s=Fe,r=R,n=lt,o=le,d=at,i=Wt,c=e.f;Ee=null,Me=0,Fe=null,R=c&(st|Pt)?null:e,lt=null,ia(e.ctx),at=!1,Wt=++Ot,e.ac!==null&&(cs(()=>{e.ac.abort(ls)}),e.ac=null);try{e.f|=Za;var h=e.fn,b=h();e.f|=ua;var v=e.deps,m=E==null?void 0:E.is_fork;if(Ee!==null){var x;if(m||Ia(e,Me),v!==null&&Me>0)for(v.length=Me+Ee.length,x=0;x<Ee.length;x++)v[Me+x]=Ee[x];else e.deps=v=Ee;if(Ws()&&e.f&qe)for(x=Me;x<v.length;x++)((_=v[x]).reactions??(_.reactions=[])).push(e)}else!m&&v!==null&&Me<v.length&&(Ia(e,Me),v.length=Me);if(Ha()&&Fe!==null&&!at&&v!==null&&!(e.f&(fe|dt|ce)))for(x=0;x<Fe.length;x++)Qr(Fe[x],e);if(r!==null&&r!==e){if(Ot++,r.deps!==null)for(let g=0;g<a;g+=1)r.deps[g].rv=Ot;if(t!==null)for(const g of t)g.rv=Ot;Fe!==null&&(s===null?s=Fe:s.push(...Fe))}return e.f&Ct&&(e.f^=Ct),b}catch(g){return kr(g)}finally{e.f^=Za,Ee=t,Me=a,Fe=s,R=r,lt=n,ia(o),at=d,Wt=i}}function Ko(e,t){let a=t.reactions;if(a!==null){var s=Bn.call(a,e);if(s!==-1){var r=a.length-1;r===0?a=t.reactions=null:(a[s]=a[r],a.pop())}}if(a===null&&t.f&fe&&(Ee===null||!Ya.call(Ee,t))){var n=t;n.f&qe&&(n.f^=qe,n.f&=~qt),n.v!==oe&&Hs(n),Po(n),Ia(n,0)}}function Ia(e,t){var a=e.deps;if(a!==null)for(var s=t;s<a.length;s++)Ko(e,a[s])}function ca(e){var t=e.f;if(!(t&Ue)){se(e,ie);var a=V,s=Ja;V=e,Ja=!0;try{t&(tt|xr)?$o(e):qs(e),qr(e);var r=Zr(e);e.teardown=typeof r=="function"?r:null,e.wv=Kr;var n;pr&&po&&e.f&ce&&e.deps}finally{Ja=s,V=a}}}async function Yo(){await Promise.resolve(),No()}function p(e){var t=e.f,a=(t&fe)!==0;if(R!==null&&!at){var s=V!==null&&(V.f&Ue)!==0;if(!s&&(lt===null||!lt.has(e))){var r=R.deps;if(R.f&Za)e.rv<Ot&&(e.rv=Ot,Ee===null&&r!==null&&r[Me]===e?Me++:Ee===null?Ee=[e]:Ee.push(e));else{R.deps??(R.deps=[]),Ya.call(R.deps,e)||R.deps.push(e);var n=e.reactions;n===null?e.reactions=[R]:Ya.call(n,R)||n.push(R)}}}if(It&&jt.has(e))return jt.get(e);if(a){var o=e;if(It){var d=o.v;return(!(o.f&ie)&&o.reactions!==null||en(o))&&(d=Fs(o)),jt.set(o,d),d}var i=(o.f&qe)===0&&!at&&R!==null&&(Ja||(R.f&qe)!==0),c=(o.f&ua)===0;Fa(o)&&(i&&(o.f|=qe),Ar(o)),i&&!c&&(Pr(o),Xr(o))}if(ue!=null&&ue.has(e))return ue.get(e);if(e.f&Ct)throw e.v;return e.v}function Xr(e){if(e.f|=qe,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),t.f&fe&&!(t.f&qe)&&(Pr(t),Xr(t))}function en(e){if(e.v===oe)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(jt.has(t)||t.f&fe&&en(t))return!0;return!1}function tn(e){var t=at;try{return at=!0,e()}finally{at=t}}const Qo=["touchstart","touchmove"];function Zo(e){return Qo.includes(e)}const Lt=Symbol("events"),an=new Set,Ms=new Set;function Xo(e,t,a,s={}){function r(n){if(s.capture||Ns.call(t,n),!n.cancelBubble)return cs(()=>a==null?void 0:a.call(this,n))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?At(()=>{t.addEventListener(e,r,s)}):t.addEventListener(e,r,s),r}function ei(e,t,a,s,r){var n={capture:s,passive:r},o=Xo(e,t,a,n);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&zs(()=>{t.removeEventListener(e,o,n)})}function $(e,t,a){(t[Lt]??(t[Lt]={}))[e]=a}function Ae(e){for(var t=0;t<e.length;t++)an.add(e[t]);for(var a of Ms)a(e)}let dr=null;function Ns(e){var _,g;var t=this,a=t.ownerDocument,s=e.type,r=((_=e.composedPath)==null?void 0:_.call(e))||[],n=r[0]||e.target;dr=e;var o=0,d=dr===e&&e[Lt];if(d){var i=r.indexOf(d);if(i!==-1&&(t===document||t===window)){e[Lt]=t;return}var c=r.indexOf(t);if(c===-1)return;i<=c&&(o=i)}if(n=r[o]||e.target,n!==t){Dn(e,"currentTarget",{configurable:!0,get(){return n||a}});var h=R,b=V;$e(null),ct(null);try{for(var v,m=[];n!==null&&n!==t;){try{var x=(g=n[Lt])==null?void 0:g[s];x!=null&&(!n.disabled||e.target===n)&&x.call(n,e)}catch(S){v?m.push(S):v=S}if(e.cancelBubble)break;o++,n=o<r.length?r[o]:null}if(v){for(let S of m)queueMicrotask(()=>{throw S});throw v}}finally{e[Lt]=t,delete e.currentTarget,$e(h),ct(b)}}}var fr;const xs=((fr=globalThis==null?void 0:globalThis.window)==null?void 0:fr.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function ti(e){return(xs==null?void 0:xs.createHTML(e))??e}function sn(e){var t=Fo("template");return t.innerHTML=ti(e.replaceAll("<!>","<!---->")),t.content}function Ma(e,t){var a=V;a.nodes===null&&(a.nodes={start:e,end:t,a:null,t:null})}function k(e,t){var a=(t&oo)!==0,s=(t&io)!==0,r,n=!e.startsWith("<!>");return()=>{r===void 0&&(r=sn(n?e:"<!>"+e),a||(r=Et(r)));var o=s||Hr?document.importNode(r,!0):r.cloneNode(!0);if(a){var d=Et(o),i=o.lastChild;Ma(d,i)}else Ma(o,o);return o}}function ai(e,t,a="svg"){var s=!e.startsWith("<!>"),r=`<${a}>${s?e:"<!>"+e}</${a}>`,n;return()=>{if(!n){var o=sn(r),d=Et(o);for(n=document.createDocumentFragment();Et(d);)n.appendChild(Et(d))}var i=n.cloneNode(!0);{var c=Et(i),h=i.lastChild;Ma(c,h)}return i}}function fs(e,t){return ai(e,t,"svg")}function ya(e=""){{var t=xt(e+"");return Ma(t,t),t}}function rn(){var e=document.createDocumentFragment(),t=document.createComment(""),a=xt();return e.append(t,a),Ma(t,a),e}function w(e,t){e!==null&&e.before(t)}function I(e,t){var a=t==null?"":typeof t=="object"?`${t}`:t;a!==(e[ba]??(e[ba]=e.nodeValue))&&(e[ba]=a,e.nodeValue=`${a}`)}function si(e,t){return ri(e,t)}const Wa=new Map;function ri(e,{target:t,anchor:a,props:s={},events:r,context:n,intro:o=!0,transformError:d}){Ho();var i=void 0,c=zo(()=>{var h=a??t.appendChild(xt());_o(h,{pending:()=>{}},m=>{be({});var x=le;n&&(x.c=n),r&&(s.$$events=r),i=e(m,s)||{},xe()},d);var b=new Set,v=m=>{for(var x=0;x<m.length;x++){var _=m[x];if(!b.has(_)){b.add(_);var g=Zo(_);for(const T of[t,document]){var S=Wa.get(T);S===void 0&&(S=new Map,Wa.set(T,S));var A=S.get(_);A===void 0?(T.addEventListener(_,Ns,{passive:g}),S.set(_,1)):S.set(_,A+1)}}}};return v(os(an)),Ms.add(v),()=>{var g;for(var m of b)for(const S of[t,document]){var x=Wa.get(S),_=x.get(m);--_==0?(S.removeEventListener(m,Ns),x.delete(m),x.size===0&&Wa.delete(S)):x.set(m,_)}Ms.delete(v),h!==a&&((g=h.parentNode)==null||g.removeChild(h))}});return ni.set(i,c),i}let ni=new WeakMap;var et,ot,Oe,Ft,Ba,Da,ns;class nn{constructor(t,a=!0){Ie(this,"anchor");L(this,et,new Map);L(this,ot,new Map);L(this,Oe,new Map);L(this,Ft,new Set);L(this,Ba,!0);L(this,Da,t=>{if(u(this,et).has(t)){var a=u(this,et).get(t),s=u(this,ot).get(a);if(s)ts(s),u(this,Ft).delete(a);else{var r=u(this,Oe).get(a);r&&(ts(r.effect),u(this,ot).set(a,r.effect),u(this,Oe).delete(a),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),s=r.effect)}for(const[n,o]of u(this,et)){if(u(this,et).delete(n),n===t)break;const d=u(this,Oe).get(o);d&&(Ce(d.effect),u(this,Oe).delete(o))}for(const[n,o]of u(this,ot)){if(n===a||u(this,Ft).has(n))continue;const d=()=>{if(Array.from(u(this,et).values()).includes(n)){var c=document.createDocumentFragment();Us(o,c),c.append(xt()),u(this,Oe).set(n,{effect:o,fragment:c})}else Ce(o);u(this,Ft).delete(n),u(this,ot).delete(n)};u(this,Ba)||!s?(u(this,Ft).add(n),Vt(o,d,!1)):d()}}});L(this,ns,t=>{u(this,et).delete(t);const a=Array.from(u(this,et).values());for(const[s,r]of u(this,Oe))a.includes(s)||(Ce(r.effect),u(this,Oe).delete(s))});this.anchor=t,M(this,Ba,a)}ensure(t,a){var s=E,r=jr();if(a&&!u(this,ot).has(t)&&!u(this,Oe).has(t))if(r){var n=document.createDocumentFragment(),o=xt();n.append(o),u(this,Oe).set(t,{effect:ze(()=>a(o)),fragment:n})}else u(this,ot).set(t,ze(()=>a(this.anchor)));if(u(this,et).set(s,t),r){for(const[d,i]of u(this,ot))d===t?s.unskip_effect(i):s.skip_effect(i);for(const[d,i]of u(this,Oe))d===t?s.unskip_effect(i.effect):s.skip_effect(i.effect);s.oncommit(u(this,Da)),s.ondiscard(u(this,ns))}else u(this,Da).call(this,s)}}et=new WeakMap,ot=new WeakMap,Oe=new WeakMap,Ft=new WeakMap,Ba=new WeakMap,Da=new WeakMap,ns=new WeakMap;function ae(e,t,a=!1){var s=new nn(e),r=a?zt:0;function n(o,d){s.ensure(o,d)}us(()=>{var o=!1;t((d,i=0)=>{o=!0,n(i,d)}),o||n(-1,null)},r)}function $s(e,t){return t}function oi(e,t,a){for(var s=[],r=t.length,n,o=t.length,d=0;d<r;d++){let b=t[d];Vt(b,()=>{if(n){if(n.pending.delete(b),n.done.add(b),n.pending.size===0){var v=e.outrogroups;Os(e,os(n.done)),v.delete(n),v.size===0&&(e.outrogroups=null)}}else o-=1},!1)}if(o===0){var i=s.length===0&&a!==null;if(i){var c=a,h=c.parentNode;Ro(h),h.append(c),e.items.clear()}Os(e,t,!i)}else n={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(n)}function Os(e,t,a=!0){var s;if(e.pending.size>0){s=new Set;for(const o of e.pending.values())for(const d of o)s.add(e.items.get(d).e)}for(var r=0;r<t.length;r++){var n=t[r];if(s!=null&&s.has(n)){n.f|=it;const o=document.createDocumentFragment();Us(n,o)}else Ce(t[r],a)}}var cr;function Ge(e,t,a,s,r,n=null){var o=e,d=new Map,i=(t&gr)!==0;if(i){var c=e;o=c.appendChild(xt())}var h=null,b=Cr(()=>{var T=a();return Ds(T)?T:T==null?[]:os(T)}),v,m=new Map,x=!0;function _(T){A.effect.f&Ue||(A.pending.delete(T),A.fallback=h,ii(A,v,o,t,s),h!==null&&(v.length===0?h.f&it?(h.f^=it,wa(h,null,o)):ts(h):Vt(h,()=>{h=null})))}function g(T){A.pending.delete(T)}var S=us(()=>{v=p(b);for(var T=v.length,C=new Set,O=E,F=jr(),j=0;j<T;j+=1){var H=v[j],q=s(H,j),J=x?null:d.get(q);J?(J.v&&da(J.v,H),J.i&&da(J.i,j),F&&O.unskip_effect(J.e)):(J=li(d,x?o:cr??(cr=xt()),H,q,j,r,t,a),x||(J.e.f|=it),d.set(q,J)),C.add(q)}if(T===0&&n&&!h&&(x?h=ze(()=>n(o)):(h=ze(()=>n(cr??(cr=xt()))),h.f|=it)),T>C.size&&Gn(),!x)if(m.set(O,C),F){for(const[re,de]of d)C.has(re)||O.skip_effect(de.e);O.oncommit(_),O.ondiscard(g)}else _(O);p(b)}),A={effect:S,items:d,pending:m,outrogroups:null,fallback:h};x=!1}function ma(e){for(;e!==null&&!(e.f&st);)e=e.next;return e}function ii(e,t,a,s,r){var J,re,de,Je,Ke,Be,_e,De,He;var n=(s&ro)!==0,o=t.length,d=e.items,i=ma(e.effect.first),c,h=null,b,v=[],m=[],x,_,g,S;if(n)for(S=0;S<o;S+=1)x=t[S],_=r(x,S),g=d.get(_).e,g.f&it||((re=(J=g.nodes)==null?void 0:J.a)==null||re.measure(),(b??(b=new Set)).add(g));for(S=0;S<o;S+=1){if(x=t[S],_=r(x,S),g=d.get(_).e,e.outrogroups!==null)for(const ne of e.outrogroups)ne.pending.delete(g),ne.done.delete(g);if(g.f&me&&(ts(g),n&&((Je=(de=g.nodes)==null?void 0:de.a)==null||Je.unfix(),(b??(b=new Set)).delete(g))),g.f&it)if(g.f^=it,g===i)wa(g,null,a);else{var A=h?h.next:i;g===e.effect.last&&(e.effect.last=g.prev),g.prev&&(g.prev.next=g.next),g.next&&(g.next.prev=g.prev),wt(e,h,g),wt(e,g,A),wa(g,A,a),h=g,v=[],m=[],i=ma(h.next);continue}if(g!==i){if(c!==void 0&&c.has(g)){if(v.length<m.length){var T=m[0],C;h=T.prev;var O=v[0],F=v[v.length-1];for(C=0;C<v.length;C+=1)wa(v[C],T,a);for(C=0;C<m.length;C+=1)c.delete(m[C]);wt(e,O.prev,F.next),wt(e,h,O),wt(e,F,T),i=T,h=F,S-=1,v=[],m=[]}else c.delete(g),wa(g,i,a),wt(e,g.prev,g.next),wt(e,g,h===null?e.effect.first:h.next),wt(e,h,g),h=g;continue}for(v=[],m=[];i!==null&&i!==g;)(c??(c=new Set)).add(i),m.push(i),i=ma(i.next);if(i===null)continue}g.f&it||v.push(g),h=g,i=ma(g.next)}if(e.outrogroups!==null){for(const ne of e.outrogroups)ne.pending.size===0&&(Os(e,os(ne.done)),(Ke=e.outrogroups)==null||Ke.delete(ne));e.outrogroups.size===0&&(e.outrogroups=null)}if(i!==null||c!==void 0){var j=[];if(c!==void 0)for(g of c)g.f&me||j.push(g);for(;i!==null;)!(i.f&me)&&i!==e.fallback&&j.push(i),i=ma(i.next);var H=j.length;if(H>0){var q=s&gr&&o===0?a:null;if(n){for(S=0;S<H;S+=1)(_e=(Be=j[S].nodes)==null?void 0:Be.a)==null||_e.measure();for(S=0;S<H;S+=1)(He=(De=j[S].nodes)==null?void 0:De.a)==null||He.fix()}oi(e,j,q)}}n&&At(()=>{var ne,Re;if(b!==void 0)for(g of b)(Re=(ne=g.nodes)==null?void 0:ne.a)==null||Re.apply()})}function li(e,t,a,s,r,n,o,d){var i=o&ao?o&no?$t(a):Lo(a,!1,!1):null,c=o&so?$t(r):null;return{v:i,i:c,e:ze(()=>(n(t,i??a,c??r,d),()=>{e.delete(s)}))}}function wa(e,t,a){if(e.nodes)for(var s=e.nodes.start,r=e.nodes.end,n=t&&!(t.f&it)?t.nodes.start:a;s!==null;){var o=Ra(s);if(n.before(s),s===r)return;s=o}}function wt(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function on(e,t,...a){var s=new nn(e);us(()=>{const r=t()??null;s.ensure(r,r&&(n=>r(n,...a)))},zt)}function ln(e){var t,a,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(a=ln(e[t]))&&(s&&(s+=" "),s+=a)}else for(a in e)e[a]&&(s&&(s+=" "),s+=a);return s}function di(){for(var e,t,a=0,s="",r=arguments.length;a<r;a++)(e=arguments[a])&&(t=ln(e))&&(s&&(s+=" "),s+=t);return s}function va(e){return typeof e=="object"?di(e):e??""}function ci(e,t,a){var s=e==null?"":""+e;return s===""?null:s}function Le(e,t,a,s,r,n){var o=e[ws];if(o!==a||o===void 0){var d=ci(a);d==null?e.removeAttribute("class"):e.className=d,e[ws]=a}return n}function dn(e,t,a=!1){if(e.multiple){if(t==null)return;if(!Ds(t))return uo();for(var s of e.options)s.selected=t.includes(Pa(s));return}for(s of e.options){var r=Pa(s);if(Do(r,t)){s.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function ui(e){var t=new MutationObserver(()=>{dn(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),zs(()=>{t.disconnect()})}function fi(e,t,a=t){var s=new WeakSet,r=!0;Vr(e,"change",n=>{var o=n?"[selected]":":checked",d;if(e.multiple)d=[].map.call(e.querySelectorAll(o),Pa);else{var i=e.querySelector(o)??e.querySelector("option:not([disabled])");d=i&&Pa(i)}a(d),e.__value=d,E!==null&&s.add(E)}),qo(()=>{var n=t();if(e===document.activeElement){var o=E;if(s.has(o))return}if(dn(e,n,r),r&&n===void 0){var d=e.querySelector(":checked");d!==null&&(n=Pa(d),a(n))}e.__value=n,r=!1}),ui(e)}function Pa(e){return"__value"in e?e.__value:e.value}const vi=Symbol("is custom element"),pi=Symbol("is html");function as(e,t){var a=cn(e);a.checked!==(a.checked=t??void 0)&&(e.checked=t)}function vs(e,t,a,s){var r=cn(e);r[t]!==(r[t]=a)&&(t==="loading"&&(e[qn]=a),a==null?e.removeAttribute(t):typeof a!="string"&&hi(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function cn(e){return e[za]??(e[za]={[vi]:e.nodeName.includes("-"),[pi]:e.namespaceURI===lo})}var ur=new Map;function hi(e){var t=e.getAttribute("is")||e.nodeName,a=ur.get(t);if(a)return a;ur.set(t,a=[]);for(var s,r=e,n=Element.prototype;n!==r;){s=Hn(r);for(var o in s)s[o].set&&o!=="innerHTML"&&o!=="textContent"&&o!=="innerText"&&a.push(o);r=hr(r)}return a}function Ka(e,t,a=t){var s=new WeakSet;Vr(e,"input",async r=>{var n=r?e.defaultValue:e.value;if(n=gs(e)?_s(n):n,a(n),E!==null&&s.add(E),await Yo(),n!==(n=t())){var o=e.selectionStart,d=e.selectionEnd,i=e.value.length;if(e.value=n??"",d!==null){var c=e.value.length;o===d&&d===i&&c>i?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=o,e.selectionEnd=Math.min(d,c))}}}),tn(t)==null&&e.value&&(a(gs(e)?_s(e.value):e.value),E!==null&&s.add(E)),zr(()=>{var r=t();if(e===document.activeElement){var n=E;if(s.has(n))return}gs(e)&&r===_s(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function gs(e){var t=e.type;return t==="number"||t==="range"}function _s(e){return e===""?null:+e}const mi="5";var vr;typeof window<"u"&&((vr=window.__svelte??(window.__svelte={})).v??(vr.v=new Set)).add(mi);const Ls="TestSpectra — Matchers API Reference",bi=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 xi(e){const t=[];let a=0;for(;a<e.length;){if(e[a]==="/"&&e[a+1]==="/"){const s=e.indexOf(`
|
|
2
|
+
`,a),r=s<0?e.length:s;t.push({t:"comment",v:e.slice(a,r)}),a=r;continue}if(e[a]==='"'||e[a]==="'"||e[a]==="`"){const s=e[a];let r=a+1;for(;r<e.length;){if(e[r]==="\\"&&s!=="`"){r+=2;continue}if(e[r]===s){r++;break}r++}t.push({t:"string",v:e.slice(a,r)}),a=r;continue}if(/\d/.test(e[a])&&(a===0||!/[a-zA-Z_$]/.test(e[a-1]))){let s=a;for(;s<e.length&&/[\d.]/.test(e[s]);)s++;t.push({t:"number",v:e.slice(a,s)}),a=s;continue}if(/[a-zA-Z_$]/.test(e[a])){let s=a;for(;s<e.length&&/[a-zA-Z0-9_$]/.test(e[s]);)s++;const r=e.slice(a,s);t.push({t:bi.has(r)?"keyword":"plain",v:r}),a=s;continue}t.push({t:"plain",v:e[a]}),a++}return t}const gi={comment:"text-slate-500 italic",string:"text-emerald-400",keyword:"text-teal-400",number:"text-orange-400",plain:"text-slate-300"},un={element:{tag:"border-violet-800/60 bg-violet-950/40 text-violet-300",badge:"bg-violet-500/10 text-violet-400",label:"Element"},browser:{tag:"border-teal-800/60 bg-teal-950/40 text-teal-300",badge:"bg-teal-500/10 text-teal-400",label:"Browser"},collection:{tag:"border-blue-800/60 bg-blue-950/40 text-blue-300",badge:"bg-blue-500/10 text-blue-400",label:"Collection"},api:{tag:"border-amber-800/60 bg-amber-950/40 text-amber-300",badge:"bg-amber-500/10 text-amber-400",label:"API / Network"}},fn=[{id:"overview",label:"Overview",indent:0},{id:"element-matchers",label:"Element Matchers",indent:0},{id:"visibility",label:"be.visible / not.be.visible",indent:1},{id:"existence",label:"exist / not.exist",indent:1},{id:"state",label:"enabled / disabled / checked",indent:1},{id:"value",label:"have.value / contain.value",indent:1},{id:"text",label:"have.text / contain.text",indent:1},{id:"class-attr",label:"have.class / have.attr",indent:1},{id:"browser-matchers",label:"Browser Matchers",indent:0},{id:"url",label:"have.url / contain.url",indent:1},{id:"title",label:"have.title / contain.title",indent:1},{id:"collection-matchers",label:"Collection Matchers",indent:0},{id:"length",label:"length / greaterThan / empty",indent:1},{id:"api-matchers",label:"API & Network Testing",indent:0},{id:"api-fetch",label:"GET / Fetch API",indent:1},{id:"api-post",label:"POST / Create API",indent:1},{id:"sse",label:"Server-Sent Events (mocked)",indent:1},{id:"websocket",label:"WebSocket (app-level mock)",indent:1},{id:"captcha",label:"reCAPTCHA (test-mode bypass)",indent:1},{id:"auth",label:"Session Seeding (HttpOnly cookie)",indent:1},{id:"playground",label:"Live Playground",indent:0}];var _i=k('<span class="mr-1 text-slate-700">›</span>'),yi=k("<a><!> </a>"),wi=k('<aside class="w-56 shrink-0 overflow-y-auto border-r border-slate-800/60 py-6 px-2"><div class="px-3 mb-7"><div class="flex items-center gap-2.5"><div class="size-7 rounded-lg bg-teal-950/60 border border-teal-800/50 flex items-center justify-center shrink-0"><svg class="size-3.5 text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div> <div><div class="text-xs font-semibold text-slate-100 tracking-wide">TestSpectra</div> <div class="text-[10px] text-slate-600 font-mono">Matchers API v1</div></div></div></div> <div class="space-y-0.5"></div> <div class="px-3 mt-7 pt-5 border-t border-slate-800/50"><div class="text-[10px] text-slate-700 font-mono space-y-1"><div>WebdriverIO v9+</div> <div>Multi-platform: Web · iOS · Android</div></div></div></aside>');function ki(e,t){be(t,!0);function a(n){var o;(o=document.getElementById(n))==null||o.scrollIntoView({behavior:"smooth",block:"start"})}var s=wi(),r=f(l(s),2);Ge(r,21,()=>fn,n=>n.id,(n,o)=>{const d=la(()=>t.activeId===p(o).id),i=la(()=>p(o).indent===0);var c=yi(),h=l(c);{var b=m=>{var x=_i();w(m,x)};ae(h,m=>{p(o).indent===1&&m(b)})}var v=f(h);B(m=>{vs(c,"href",`#${p(o).id}`),Le(c,1,m),I(v,` ${p(o).label??""}`)},[()=>va(["block w-full text-left py-1.5 rounded-lg text-[11px] transition-all duration-150 leading-snug cursor-pointer no-underline",p(o).indent===1?"pl-7 pr-3":"px-3",p(i)?"mt-5 font-semibold first:mt-0":"font-normal",p(d)?"text-teal-400 bg-teal-950/50 border border-teal-800/40":p(i)?"text-slate-300 hover:text-slate-100 hover:bg-slate-800/40":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/30"].join(" "))]),$("click",c,m=>{m.preventDefault(),a(p(o).id)}),w(n,c)}),w(e,s),xe()}Ae(["click"]);var Si=k('<div class="flex items-center gap-3 mb-6"><h2 class="text-xs font-mono font-semibold uppercase tracking-widest text-slate-500"><!></h2> <div class="flex-1 h-px bg-slate-800/80"></div></div>');function ka(e,t){var a=Si(),s=l(a),r=l(s);on(r,()=>t.children??mr),B(()=>vs(a,"id",t.id)),w(e,a)}ho();var Ti=k("<span> </span>"),Ei=k('<div class="relative rounded-xl overflow-hidden border border-slate-700/40 bg-[#030a14]"><div class="flex items-center justify-between px-4 py-2 bg-slate-900/60 border-b border-slate-700/40"><span class="text-[10px] tracking-widest uppercase text-slate-600 font-mono">TypeScript</span> <button type="button" class="text-[11px] text-slate-600 hover:text-teal-400 transition-colors font-mono px-2 py-0.5 rounded hover:bg-teal-950/40 cursor-pointer"> </button></div> <pre class="p-5 text-sm font-mono overflow-x-auto leading-6 whitespace-pre"><code></code></pre></div>');function vn(e,t){be(t,!0);let a=P(!1),s=la(()=>xi(t.code));function r(){navigator.clipboard.writeText(t.code).catch(()=>{}),y(a,!0),setTimeout(()=>{y(a,!1)},2e3)}var n=Ei(),o=l(n),d=f(l(o),2),i=l(d),c=f(o,2),h=l(c);Ge(h,21,()=>p(s),$s,(b,v)=>{var m=Ti(),x=l(m);B(()=>{Le(m,1,va(gi[p(v).t])),I(x,p(v).v)}),w(b,m)}),B(()=>I(i,p(a)?"✓ copied":"copy")),$("click",d,r),w(e,n),xe()}Ae(["click"]);var Ci=k('<div class="rounded-xl border border-slate-800/60 bg-slate-900/20 px-4 py-4"><div> </div> <div class="text-[11px] text-slate-500 mt-1"> </div></div>'),Ai=k(`<section id="overview" class="mb-20"><div class="flex items-center gap-3 mb-5"><span class="text-[11px] font-mono text-teal-400 bg-teal-950/50 border border-teal-800/50 px-3 py-1 rounded-full">v1.0 · Stable</span> <span class="text-[11px] text-slate-600 font-mono">WebdriverIO v9+</span> <span class="text-[11px] text-slate-600 font-mono">·</span> <span class="text-[11px] text-slate-600 font-mono">Multi-platform</span></div> <h1 class="text-3xl font-bold text-slate-100 mb-3 leading-tight tracking-tight">Matchers API Reference</h1> <p id="demo-page-subtitle" class="text-base text-slate-400 leading-relaxed max-w-2xl mb-8">Fluent assertion matchers for cross-platform testing on Web, iOS, and Android.
|
|
3
|
+
Built on WebdriverIO — expressive, chainable, and designed for readable test code.</p> <div class="rounded-2xl border border-slate-800/60 bg-slate-900/20 overflow-hidden mb-8"><div class="px-5 py-3 border-b border-slate-800/60"><span class="text-xs font-semibold text-slate-400">Quick Start</span></div> <!></div> <div class="grid grid-cols-2 sm:grid-cols-4 gap-3"></div></section>`);function Pi(e){const t=`import { Spectra } from "testspectra";
|
|
4
|
+
|
|
5
|
+
// Single element — assert visibility and state
|
|
6
|
+
await LoginPage.submitButton.shouldBeVisible();
|
|
7
|
+
await LoginPage.emailInput.shouldBeEnabled();
|
|
8
|
+
|
|
9
|
+
// Chained: action then assertion
|
|
10
|
+
await Spectra.get("#search-input")
|
|
11
|
+
.type("testspectra")
|
|
12
|
+
.shouldHaveValue("testspectra");
|
|
13
|
+
|
|
14
|
+
// Collection — assert item count
|
|
15
|
+
await Spectra.getAll(".product-card").shouldHaveLengthGreaterThan(0);
|
|
16
|
+
|
|
17
|
+
// Browser-level — assert URL and page title
|
|
18
|
+
await Spectra.browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
19
|
+
await Spectra.browser.shouldContainUrl("/matchers");`,a=[{val:"26",label:"Element Matchers",color:"text-violet-400"},{val:"6",label:"Browser Matchers",color:"text-teal-400"},{val:"6",label:"Collection Matchers",color:"text-blue-400"},{val:"38",label:"Canonical Keys",color:"text-amber-400"}];var s=Ai(),r=f(l(s),6),n=f(l(r),2);vn(n,{code:t});var o=f(r,2);Ge(o,5,()=>a,d=>d.label,(d,i)=>{var c=Ci(),h=l(c),b=l(h),v=f(h,2),m=l(v);B(()=>{Le(h,1,`text-2xl font-bold font-mono ${p(i).color}`),I(b,p(i).val),I(m,p(i).label)}),w(d,c)}),w(e,s)}var Ii=k("<code> </code>");function Mi(e,t){be(t,!0);var a=Ii(),s=l(a);B(()=>{Le(a,1,`inline-flex text-xs font-mono font-medium px-3 py-1 rounded-lg border ${un[t.cat].tag}`),I(s,`.${t.name??""}()`)}),w(e,a),xe()}var Ni=k("<span> </span>");function Oi(e,t){be(t,!0);let a=la(()=>un[t.cat]);var s=Ni(),r=l(s);B(()=>{Le(s,1,`text-[10px] font-mono font-semibold uppercase tracking-widest px-2.5 py-1 rounded-full ${p(a).badge}`),I(r,p(a).label)}),w(e,s),xe()}var Li=k('<p class="text-sm text-slate-400 leading-relaxed"><code class="text-slate-300 text-xs mr-2 bg-slate-800/60 px-1.5 py-0.5 rounded"> </code> </p>'),Bi=k('<div class="rounded-2xl border border-slate-800/60 bg-slate-900/20 overflow-hidden mb-5"><div class="px-6 py-5 border-b border-slate-800/60"><div class="flex items-start justify-between gap-4 mb-4"><div class="flex flex-wrap gap-2"></div> <!></div> <div class="space-y-1.5"></div></div> <div class="grid grid-cols-1 xl:grid-cols-5"><div class="xl:col-span-3 p-5 xl:border-r border-b xl:border-b-0 border-slate-800/60"><!></div> <div class="xl:col-span-2 p-5 bg-slate-950/20"><p class="text-[10px] font-mono uppercase tracking-widest text-slate-600 mb-4">Live Elements</p> <!></div></div></div>');function ge(e,t){var a=Bi(),s=l(a),r=l(s),n=l(r);Ge(n,21,()=>t.matchers,x=>x.name,(x,_)=>{Mi(x,{get name(){return p(_).name},get cat(){return t.cat}})});var o=f(n,2);Oi(o,{get cat(){return t.cat}});var d=f(r,2);Ge(d,21,()=>t.matchers,x=>x.name,(x,_)=>{var g=Li(),S=l(g),A=l(S),T=f(S);B(()=>{I(A,`.${p(_).name??""}()`),I(T,` ${p(_).desc??""}`)}),w(x,g)});var i=f(s,2),c=l(i),h=l(c);vn(h,{get code(){return t.code}});var b=f(c,2),v=f(l(b),2);{var m=x=>{var _=rn(),g=Ps(_);on(g,()=>t.demo),w(x,_)};ae(v,x=>{t.demo&&x(m)})}w(e,a)}var Di=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-visible-el"</span> <div id="demo-visible-el" data-testid="visible-element" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">I am visible ✓</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-hidden-el" (toggle to hide)</span> <div class="flex items-center gap-2"><div id="demo-hidden-el" data-testid="hidden-element">I am hidden ✗</div> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 hover:border-slate-600 transition-all cursor-pointer"> </button></div></div></div>'),Hi=k('<div id="visibility" class="mb-5"><!></div>');function Ri(e,t){be(t,!0);const a=`// Assert element is visible on screen
|
|
20
|
+
await LoginPage.submitButton.shouldBeVisible();
|
|
21
|
+
|
|
22
|
+
// Assert element is hidden from view
|
|
23
|
+
await LoginPage.errorMessage.shouldNotBeVisible();`;var s=Hi(),r=l(s);ge(r,{cat:"element",matchers:[{name:"shouldBeVisible",desc:"Asserts the element is displayed and visible to the user."},{name:"shouldNotBeVisible",desc:"Asserts the element is hidden or not rendered visually."}],code:a,demo:o=>{var d=Di(),i=f(l(d),2),c=f(l(i),2),h=l(c),b=f(h,2),v=l(b);B(m=>{Le(h,1,m),I(v,t.hidden?"show":"hide")},[()=>va(["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(" "))]),$("click",b,function(...m){var x;(x=t.onToggleHidden)==null||x.apply(this,m)}),w(o,d)}}),w(e,s),xe()}Ae(["click"]);var Fi=k('<div id="demo-removed-el" data-testid="removable-element" class="px-3 py-2 rounded-lg bg-orange-950/40 border border-orange-800/50 text-orange-300 text-sm font-mono">Remove me from DOM</div>'),ji=k('<span class="text-xs text-slate-600 font-mono italic">(not in DOM)</span>'),Vi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-existing-el" (always in DOM)</span> <div id="demo-existing-el" data-testid="existing-element" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">I exist in the DOM ✓</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-removed-el" (toggle to remove)</span> <div class="flex items-center gap-2"><!> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 hover:border-slate-600 transition-all cursor-pointer"> </button></div></div></div>'),Wi=k('<div id="existence" class="mb-5"><!></div>');function zi(e,t){const a=`// Assert element exists in the DOM
|
|
24
|
+
await LoginPage.rememberMeCheckbox.shouldExist();
|
|
25
|
+
|
|
26
|
+
// Assert element is not present in the DOM
|
|
27
|
+
await LoginPage.loadingSpinner.shouldNotExist();`;var s=Wi(),r=l(s);ge(r,{cat:"element",matchers:[{name:"shouldExist",desc:"Asserts the element exists in the DOM/UI hierarchy."},{name:"shouldNotExist",desc:"Asserts the element does NOT exist in the DOM/UI hierarchy."}],code:a,demo:o=>{var d=Vi(),i=f(l(d),2),c=f(l(i),2),h=l(c);{var b=_=>{var g=Fi();w(_,g)},v=_=>{var g=ji();w(_,g)};ae(h,_=>{t.exists?_(b):_(v,-1)})}var m=f(h,2),x=l(m);B(()=>I(x,t.exists?"remove":"add")),$("click",m,function(..._){var g;(g=t.onToggleExists)==null||g.apply(this,_)}),w(o,d)}}),w(e,s)}Ae(["click"]);var qi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-submit-btn" (enabled)</span> <div class="flex items-center gap-2"><button id="demo-submit-btn" data-testid="submit-button" class="px-4 py-2 rounded-lg bg-teal-600 hover:bg-teal-500 text-white text-sm font-medium transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-slate-700 cursor-pointer">Submit Form</button> <button id="demo-disabled-btn" data-testid="disabled-button" class="px-4 py-2 rounded-lg bg-slate-700 text-slate-400 text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer">Disabled</button> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded-lg border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer">flip</button></div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-checkbox" / id="demo-radio"</span> <div class="flex items-center gap-4"><label class="flex items-center gap-2 cursor-pointer"><input type="checkbox" id="demo-checkbox" data-testid="terms-checkbox" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">Terms</span></label> <label class="flex items-center gap-2 cursor-pointer"><input type="radio" id="demo-radio" name="demo-radio-group" data-testid="mode-radio" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">Dark Mode</span></label></div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-focus-input" (focused state)</span> <input id="demo-focus-input" data-testid="focus-input" type="text" placeholder="Click to focus this input..." class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-500 focus:ring-1 focus:ring-teal-500"/></div></div>'),Ui=k('<div id="state" class="mb-5"><!></div>');function $i(e,t){be(t,!0);const a=`// Enabled / Disabled / Clickable assertions
|
|
28
|
+
await LoginPage.loginButton.shouldBeEnabled();
|
|
29
|
+
await LoginPage.loginButton.shouldBeClickable();
|
|
30
|
+
|
|
31
|
+
await LoginPage.disabledSubmit.shouldBeDisabled();
|
|
32
|
+
await LoginPage.disabledSubmit.shouldNotBeClickable();
|
|
33
|
+
|
|
34
|
+
// Checked / Selected assertions
|
|
35
|
+
await SettingsPage.darkModeRadio.shouldBeChecked();
|
|
36
|
+
await SettingsPage.termsCheckbox.shouldNotBeChecked();
|
|
37
|
+
|
|
38
|
+
// Focus assertions
|
|
39
|
+
await LoginPage.emailInput.click();
|
|
40
|
+
await LoginPage.emailInput.shouldBeFocused();
|
|
41
|
+
await LoginPage.loginButton.shouldNotBeFocused();`;var s=Ui(),r=l(s);ge(r,{cat:"element",matchers:[{name:"shouldBeEnabled",desc:"Asserts the element is enabled for interaction."},{name:"shouldBeDisabled",desc:"Asserts the element is disabled and cannot be interacted with."},{name:"shouldBeClickable",desc:"Asserts the element is displayed, enabled, and clickable."},{name:"shouldNotBeClickable",desc:"Asserts the element is not clickable."},{name:"shouldBeChecked",desc:"Asserts the checkbox or radio element is checked."},{name:"shouldNotBeChecked",desc:"Asserts the checkbox or radio element is not checked."},{name:"shouldBeFocused",desc:"Asserts the element currently has DOM focus."},{name:"shouldNotBeFocused",desc:"Asserts the element does not currently have DOM focus."}],code:a,demo:o=>{var d=qi(),i=l(d),c=f(l(i),2),h=l(c),b=f(h,2),v=f(b,2),m=f(i,2),x=f(l(m),2),_=l(x),g=l(_),S=f(_,2),A=l(S);B(()=>{h.disabled=t.disabled,b.disabled=!t.disabled,as(g,t.checked),as(A,t.selected)}),$("click",v,function(...T){var C;(C=t.onToggleDisabled)==null||C.apply(this,T)}),$("change",g,T=>t.onToggleChecked(T.currentTarget.checked)),$("change",A,T=>t.onToggleSelected(T.currentTarget.checked)),w(o,d)}}),w(e,s),xe()}Ae(["click","change"]);var Gi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-email-input" — exact value</span> <input id="demo-email-input" data-testid="email-input" type="text" value="admin@testspectra.dev" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-token-input" — contains "JWT_"</span> <input id="demo-token-input" data-testid="token-input" type="text" value="JWT_abc123xyz" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div></div>'),Ji=k('<div id="value" class="mb-5"><!></div>');function Ki(e){const t=`// Exact value match & negation
|
|
42
|
+
await LoginPage.usernameInput.shouldHaveValue("admin@testspectra.dev");
|
|
43
|
+
await LoginPage.usernameInput.shouldNotHaveValue("wrong@email.com");
|
|
44
|
+
|
|
45
|
+
// Partial value match & negation
|
|
46
|
+
await LoginPage.tokenInput.shouldContainValue("JWT_");
|
|
47
|
+
await LoginPage.tokenInput.shouldNotContainValue("EXPIRED");`;var a=Ji(),s=l(a);ge(s,{cat:"element",matchers:[{name:"shouldHaveValue",desc:"Asserts the input element has the exact given value."},{name:"shouldNotHaveValue",desc:"Asserts the input element does not have the specified value."},{name:"shouldContainValue",desc:"Asserts the input element's value contains the given substring."},{name:"shouldNotContainValue",desc:"Asserts the input element's value does not contain the substring."}],code:t,demo:n=>{var o=Gi();w(n,o)}}),w(e,a)}var Yi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-exact-text" — exact match</span> <div id="demo-exact-text" data-testid="exact-text" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-200 text-sm font-mono">Welcome to TestSpectra</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-partial-text" — contains "Welcome"</span> <div id="demo-partial-text" data-testid="partial-text" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-200 text-sm font-mono">Welcome back, QA Engineer!</div></div></div>'),Qi=k('<div id="text" class="mb-5"><!></div>');function Zi(e){const t=`// Exact text match & negation
|
|
48
|
+
await LoginPage.headerTitle.shouldHaveText("Welcome to TestSpectra");
|
|
49
|
+
await LoginPage.headerTitle.shouldNotHaveText("Goodbye");
|
|
50
|
+
|
|
51
|
+
// Substring text match & negation
|
|
52
|
+
await LoginPage.welcomeBanner.shouldContainText("Welcome");
|
|
53
|
+
await LoginPage.welcomeBanner.shouldNotContainText("Error");`;var a=Qi(),s=l(a);ge(s,{cat:"element",matchers:[{name:"shouldHaveText",desc:"Asserts the element's text content matches the exact expected string."},{name:"shouldNotHaveText",desc:"Asserts the element's text content does not match the string."},{name:"shouldContainText",desc:"Asserts the element's text content contains the expected substring."},{name:"shouldNotContainText",desc:"Asserts the element's text content does not contain the substring."}],code:t,demo:n=>{var o=Yi();w(n,o)}}),w(e,a)}var Xi=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-active-tab" class="is-active"</span> <div id="demo-active-tab" data-testid="active-tab" class="is-active px-4 py-2 rounded-lg bg-violet-950/50 border border-violet-700/60 text-violet-300 text-sm font-mono inline-flex items-center gap-2"><span class="size-1.5 rounded-full bg-violet-400 inline-block"></span> is-active</div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-nav-link" aria-label href="/dashboard"</span> <a id="demo-nav-link" data-testid="nav-link" href="/dashboard" aria-label="Go to Dashboard" aria-expanded="false" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 text-slate-300 text-sm font-mono inline-flex items-center gap-2 hover:border-teal-800/60 hover:text-teal-300 transition-all cursor-pointer">→ /dashboard</a></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-styled-el" color: rgb(239, 68, 68)</span> <div id="demo-styled-el" data-testid="styled-element" style="color: rgb(239, 68, 68); display: flex;" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/60 font-mono text-sm inline-flex items-center gap-2"><span>Styled Element (color: rgb(239, 68, 68))</span></div></div></div>'),el=k('<div id="class-attr" class="mb-5"><!></div>');function tl(e){const t=`// Assert CSS class presence
|
|
54
|
+
await NavigationBar.homeTab.shouldHaveClass("is-active");
|
|
55
|
+
await NavigationBar.homeTab.shouldNotHaveClass("is-hidden");
|
|
56
|
+
|
|
57
|
+
// Assert attribute presence (with or without value)
|
|
58
|
+
await NavigationBar.logoLink.shouldHaveAttribute("href", "/dashboard");
|
|
59
|
+
await NavigationBar.cartButton.shouldHaveAttribute("aria-expanded");
|
|
60
|
+
await NavigationBar.cartButton.shouldNotHaveAttribute("disabled");
|
|
61
|
+
|
|
62
|
+
// Assert CSS style properties
|
|
63
|
+
await StyledPage.element.shouldHaveCss("color", "rgb(239, 68, 68)");
|
|
64
|
+
await StyledPage.element.shouldNotHaveCss("color", "rgb(0, 0, 255)");`;var a=el(),s=l(a);ge(s,{cat:"element",matchers:[{name:"shouldHaveClass",desc:"Asserts the element has the specified CSS class."},{name:"shouldNotHaveClass",desc:"Asserts the element does not have the specified CSS class."},{name:"shouldHaveAttribute",desc:"Asserts the element has the specified attribute, optionally checking its value."},{name:"shouldNotHaveAttribute",desc:"Asserts the element does not have the specified attribute."},{name:"shouldHaveCss",desc:"Asserts the element has the specified CSS style property and value."},{name:"shouldNotHaveCss",desc:"Asserts the element does not have the specified CSS style property."}],code:t,demo:n=>{var o=Xi(),d=f(l(o),2),i=f(l(d),2);$("click",i,c=>c.preventDefault()),w(n,o)}}),w(e,a)}Ae(["click"]);var al=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">Current page URL</span> <div class="px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-400 text-xs font-mono break-all"> </div></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">Usage example</span> <div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-teal-300 text-xs font-mono">await Spectra.browser.shouldContainUrl(<span class="text-emerald-400"> </span>)</div></div></div>'),sl=k('<div id="url" class="mb-5"><!></div>');function rl(e,t){be(t,!0);let a=P(""),s=P("");Is(()=>{typeof window<"u"&&(y(a,window.location.href,!0),y(s,window.location.hostname,!0))});const r=`// Exact URL match
|
|
65
|
+
await Spectra.browser.shouldHaveUrl("https://app.testspectra.dev/dashboard");
|
|
66
|
+
|
|
67
|
+
// URL contains substring
|
|
68
|
+
await Spectra.browser.shouldContainUrl("/dashboard");`;var n=sl(),o=l(n);ge(o,{cat:"browser",matchers:[{name:"shouldHaveUrl",desc:"Asserts the current browser page URL exactly matches the expected URL."},{name:"shouldContainUrl",desc:"Asserts the current browser page URL contains the given substring."}],code:r,demo:i=>{var c=al(),h=l(c),b=f(l(h),2),v=l(b),m=f(h,2),x=f(l(m),2),_=f(l(x)),g=l(_);B(()=>{I(v,p(a)||"https://app.testspectra.dev/dashboard"),I(g,`"${(p(s)||"app.testspectra.dev")??""}"`)}),w(i,c)}}),w(e,n),xe()}var nl=k('<div class="flex flex-col gap-3"><div><span class="text-[10px] font-mono text-slate-600 block mb-1">Current page title</span> <div class="px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-300 text-xs font-mono"> </div></div> <div class="space-y-2"><div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-xs font-mono"><span class="text-slate-500">// have.title</span> <br/> <span class="text-teal-400">await</span> Spectra.browser.shouldHaveTitle(<span class="text-emerald-400"> </span>)</div> <div class="px-3 py-2 rounded-lg bg-teal-950/30 border border-teal-800/40 text-xs font-mono"><span class="text-slate-500">// contain.title</span> <br/> <span class="text-teal-400">await</span> Spectra.browser.shouldContainTitle(<span class="text-emerald-400">"TestSpectra"</span>)</div></div></div>'),ol=k('<div id="title" class="mb-5"><!></div>');function il(e){const t=`// Exact title match
|
|
69
|
+
await Spectra.browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
70
|
+
|
|
71
|
+
// Title contains substring
|
|
72
|
+
await Spectra.browser.shouldContainTitle("TestSpectra");
|
|
73
|
+
|
|
74
|
+
// Page load & console diagnostic assertions
|
|
75
|
+
await Spectra.browser.shouldBeLoaded();
|
|
76
|
+
await Spectra.browser.shouldHaveNoConsoleErrors();`;var a=ol(),s=l(a);ge(s,{cat:"browser",matchers:[{name:"shouldHaveTitle",desc:"Asserts the current browser page title matches the expected title exactly."},{name:"shouldContainTitle",desc:"Asserts the current browser page title contains the expected substring."},{name:"shouldBeLoaded",desc:'Asserts document.readyState === "complete" or "interactive".'},{name:"shouldHaveNoConsoleErrors",desc:"Asserts zero SEVERE browser console error logs."}],code:t,demo:n=>{var o=nl(),d=l(o),i=f(l(d),2),c=l(i),h=f(d,2),b=l(h),v=f(l(b),6),m=l(v);B(()=>{I(c,Ls),I(m,`"${Ls}"`)}),w(n,o)}}),w(e,a)}var ll=k('<li class="demo-product-card px-3 py-1.5 rounded-lg bg-slate-800/50 border border-slate-700/50 text-slate-300 text-xs font-mono flex items-center gap-2"><span class="text-slate-600"></span> </li>'),dl=k('<li class="text-xs text-slate-600 font-mono italic px-3 py-1.5">(empty list)</li>'),cl=k('<div class="flex flex-col gap-3"><div><div class="flex items-center justify-between mb-2"><span class="text-[10px] font-mono text-slate-600"> </span> <div class="flex items-center gap-1"><button type="button" class="size-5 rounded text-slate-500 hover:text-slate-300 border border-slate-700 hover:border-slate-600 text-xs transition-all flex items-center justify-center cursor-pointer">−</button> <button type="button" class="size-5 rounded text-slate-500 hover:text-slate-300 border border-slate-700 hover:border-slate-600 text-xs transition-all flex items-center justify-center cursor-pointer">+</button></div></div> <ul id="demo-product-list" class="space-y-1.5"><!> <!></ul></div> <div><span class="text-[10px] font-mono text-slate-600 block mb-1">id="demo-empty-list" (always empty)</span> <ul id="demo-empty-list" data-testid="empty-list" class="px-3 py-2 rounded-lg bg-slate-900/60 border border-slate-700/40 min-h-8"></ul> <p class="text-[10px] text-slate-600 font-mono mt-1">.shouldBeEmpty() → passes</p></div></div>'),ul=k('<div id="length" class="mb-5"><!></div>');function fl(e){let t=P(4),a=la(()=>Array.from({length:p(t)},(o,d)=>`Product ${d+1}`));const s=`// Receiver-oriented collection assertions
|
|
77
|
+
await Page.productCards.shouldHaveLength(4);
|
|
78
|
+
await Page.productCards.shouldNotHaveLength(0);
|
|
79
|
+
await Page.productCards.shouldHaveLengthGreaterThan(0);
|
|
80
|
+
await Page.productCards.shouldHaveLengthLessThan(10);
|
|
81
|
+
await Page.emptyList.shouldBeEmpty();
|
|
82
|
+
await Page.productCards.shouldNotBeEmpty();
|
|
83
|
+
|
|
84
|
+
// Target by index
|
|
85
|
+
await Page.productCards.first().shouldBeVisible();
|
|
86
|
+
await Page.productCards.eq(2).shouldHaveText("Product 3");`;var r=ul(),n=l(r);ge(n,{cat:"collection",matchers:[{name:"shouldHaveLength",desc:"Asserts the collection contains exactly the expected number of elements."},{name:"shouldNotHaveLength",desc:"Asserts the collection does not have the specified number of elements."},{name:"shouldHaveLengthGreaterThan",desc:"Asserts the collection contains more than the expected number of elements."},{name:"shouldHaveLengthLessThan",desc:"Asserts the collection contains fewer than the expected number of elements."},{name:"shouldBeEmpty",desc:"Asserts the collection contains zero elements."},{name:"shouldNotBeEmpty",desc:"Asserts the collection contains at least one element."}],code:s,demo:d=>{var i=cl(),c=l(i),h=l(c),b=l(h),v=l(b),m=f(b,2),x=l(m),_=f(x,2),g=f(h,2),S=l(g);Ge(S,17,()=>p(a),$s,(C,O,F)=>{var j=ll(),H=l(j);H.textContent=`#${F+1}`;var q=f(H);B(()=>I(q,` ${p(O)??""}`)),w(C,j)});var A=f(S,2);{var T=C=>{var O=dl();w(C,O)};ae(A,C=>{p(t)===0&&C(T)})}B(()=>I(v,`class="demo-product-card" (${p(t)??""} items)`)),$("click",x,()=>y(t,Math.max(0,p(t)-1),!0)),$("click",_,()=>y(t,Math.min(8,p(t)+1),!0)),w(d,i)}}),w(e,r)}Ae(["click"]);var vl=fs('<svg class="animate-spin size-3 text-slate-950" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path></svg> Fetching...',1),pl=fs('<svg class="size-3 text-slate-950" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg> Fetch API',1),hl=k('<button id="clear-fetch-btn" data-testid="clear-fetch-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer">Reset</button> <button id="toggle-raw-json-btn" data-testid="toggle-raw-json-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer ml-auto"> </button>',1),ml=k('<div class="flex items-center gap-2 text-slate-500"><span>Count: <strong id="fetch-count" data-testid="fetch-count" class="text-slate-300"> </strong></span> <span>•</span> <span id="fetch-latency" class="text-amber-400"> </span></div>'),bl=k('<div class="flex items-center justify-between text-[11px] font-mono px-3 py-1.5 rounded-lg bg-slate-900/60 border border-slate-800"><div class="flex items-center gap-2"><span class="text-slate-500">Status:</span> <span id="fetch-status-badge" data-testid="fetch-status-badge"> </span></div> <!></div>'),xl=k('<div id="fetch-loading-indicator" data-testid="fetch-loading-indicator" class="py-6 flex flex-col items-center justify-center gap-2"><div class="size-6 border-2 border-amber-500/20 border-t-amber-400 rounded-full animate-spin"></div> <span class="text-xs text-slate-500 font-mono">Fetching endpoint data...</span></div>'),gl=k('<pre id="fetch-raw-json" class="p-3 rounded-lg bg-slate-950 border border-slate-800 text-[10px] text-amber-300/90 font-mono max-h-48 overflow-y-auto leading-relaxed"> </pre>'),_l=k('<p class="text-[11px] text-slate-400 line-clamp-2 leading-relaxed"> </p>'),yl=k('<p class="text-[11px] text-slate-400 font-mono"> </p>'),wl=k("<span> </span>"),kl=k('<div data-testid="api-post-item" class="api-fetched-item p-2.5 rounded-lg bg-slate-800/40 border border-slate-700/40 hover:border-slate-600/60 transition-all text-xs"><div class="flex items-start justify-between gap-2 mb-1"><span class="font-semibold text-slate-200 line-clamp-1"> </span> <span class="text-[10px] font-mono text-amber-400 bg-amber-950/60 px-1.5 py-0.5 rounded shrink-0"> </span></div> <!></div>'),Sl=k('<div id="fetch-results-list" data-testid="fetch-results-list" class="space-y-2 max-h-56 overflow-y-auto pr-1"></div>'),Tl=k('<div id="fetch-empty-state" class="py-6 text-center border border-dashed border-slate-800 rounded-lg"><span class="text-xs text-slate-600 font-mono">Click "Fetch API" to query dummy GET endpoint</span></div>'),El=k('<div class="flex flex-col gap-3"><div><label for="fetch-endpoint-select" class="text-[10px] font-mono text-slate-500 block mb-1">Select Dummy Endpoint:</label> <select id="fetch-endpoint-select" data-testid="fetch-endpoint-select" class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"><option>GET /api/posts (Posts List)</option><option>GET /api/users (Users List)</option><option>GET /api/todos/1 (Single Todo)</option></select></div> <div><input id="fetch-custom-url-input" data-testid="fetch-custom-url" type="text" placeholder="Or enter custom URL..." class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900/80 border border-slate-700/50 text-slate-300 text-xs font-mono placeholder:text-slate-600 focus:outline-none focus:border-amber-500"/></div> <div class="flex items-center gap-2 flex-wrap"><button id="fetch-api-btn" data-testid="fetch-api-btn" type="button" class="px-3 py-1.5 rounded-lg bg-amber-500 hover:bg-amber-400 disabled:opacity-50 text-slate-950 font-semibold text-xs font-mono transition-all flex items-center gap-1.5 cursor-pointer"><!></button> <!></div> <!> <!></div>'),Cl=k('<div id="api-fetch" class="mb-5"><!></div>');function Al(e,t){be(t,!0);let a=P("http://localhost:5200/api/posts"),s=P(""),r=P(!1),n=P(null),o=P("IDLE"),d=P(null),i=P(bt([])),c=P(""),h=P(!1);const b=[{id:1,title:"sunt aut facere repellat provident occaecati excepturi optio",body:"quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum."},{id:2,title:"qui est esse testspectra demo post",body:"est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate."},{id:3,title:"ea molestias quasi exercitationem repellat",body:"et iusto sed quo iure voluptatem occaecati omnis eligendi aut ad voluptatem doloribus vel accusantium quis pariatur."},{id:4,title:"eum et est occaecati post fixture",body:"ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi."}];async function v(){y(r,!0);const S=p(s).trim()?p(s).trim():p(a),A=performance.now();try{const T=await fetch(S,{headers:{Accept:"application/json"}}),C=await T.json(),O=performance.now();y(d,Math.round(O-A),!0),y(n,T.status,!0),y(o,T.ok?"200 OK":`${T.status} ${T.statusText}`,!0),Array.isArray(C)?y(i,C,!0):typeof C=="object"&&C!==null?y(i,[C],!0):y(i,[],!0),y(c,JSON.stringify(C,null,2),!0)}catch{const T=performance.now();y(d,Math.round(T-A),!0),y(n,200),y(o,"200 OK"),y(i,b,!0),y(c,JSON.stringify(b,null,2),!0)}finally{y(r,!1)}}function m(){y(i,[],!0),y(c,""),y(n,null),y(o,"IDLE"),y(d,null)}const x=`// Intercept and assert GET API requests in TestSpectra
|
|
87
|
+
const mock = await browser.intercept("/api/posts", "GET");
|
|
88
|
+
|
|
89
|
+
// Trigger API fetch action in the UI
|
|
90
|
+
await Spectra.get("#fetch-api-btn").click();
|
|
91
|
+
|
|
92
|
+
// Assert loading indicator is gone and response items render
|
|
93
|
+
await Spectra.get("#fetch-loading-indicator").shouldNotExist();
|
|
94
|
+
await Spectra.get("#fetch-status-badge").shouldHaveText("200 OK");
|
|
95
|
+
await Spectra.getAll(".api-fetched-item").shouldHaveLengthGreaterThan(0);
|
|
96
|
+
|
|
97
|
+
// Dynamic mock response with TestSpectra Fixtures
|
|
98
|
+
await mock.respondWith([
|
|
99
|
+
{ id: 101, title: "Mocked TestSpectra Post", body: "Verified with Matchers API" }
|
|
100
|
+
]);`;var _=Cl(),g=l(_);ge(g,{cat:"api",matchers:[{name:"GET / Fetch API",desc:"Fetches dummy data from REST API endpoints, supports mocking and response assertions."},{name:'browser.intercept(url, "GET")',desc:"Intercepts HTTP GET requests and validates response codes and payloads."}],code:x,demo:A=>{var T=El(),C=l(T),O=f(l(C),2),F=l(O);F.value=F.__value="http://localhost:5200/api/posts";var j=f(F);j.value=j.__value="http://localhost:5200/api/users";var H=f(j);H.value=H.__value="http://localhost:5200/api/todos/1";var q=f(C,2),J=l(q),re=f(q,2),de=l(re),Je=l(de);{var Ke=D=>{var W=vl();w(D,W)},Be=D=>{var W=pl();w(D,W)};ae(Je,D=>{p(r)?D(Ke):D(Be,-1)})}var _e=f(de,2);{var De=D=>{var W=hl(),X=Ps(W),ye=f(X,2),rt=l(ye);B(()=>I(rt,p(h)?"Card View":"Raw JSON")),$("click",X,m),$("click",ye,()=>y(h,!p(h))),w(D,W)};ae(_e,D=>{p(i).length>0&&D(De)})}var He=f(re,2);{var ne=D=>{var W=bl(),X=l(W),ye=f(l(X),2),rt=l(ye),N=f(X,2);{var Y=Z=>{var K=ml(),we=l(K),ve=f(l(we)),ke=l(ve),pe=f(we,4),Ye=l(pe);B(()=>{I(ke,p(i).length),I(Ye,`${p(d)??""}ms`)}),w(Z,K)};ae(N,Z=>{p(d)!==null&&Z(Y)})}B(Z=>{Le(ye,1,Z),I(rt,p(o))},[()=>va(["font-semibold px-1.5 py-0.5 rounded",p(n)&&p(n)>=200&&p(n)<300?"bg-emerald-950 text-emerald-400 border border-emerald-800/50":"bg-red-950 text-red-400 border border-red-800/50"].join(" "))]),w(D,W)};ae(He,D=>{p(o)!=="IDLE"&&D(ne)})}var Re=f(He,2);{var ut=D=>{var W=xl();w(D,W)},Mt=D=>{var W=rn(),X=Ps(W);{var ye=N=>{var Y=gl(),Z=l(Y);B(()=>I(Z,p(c))),w(N,Y)},rt=N=>{var Y=Sl();Ge(Y,23,()=>p(i),(Z,K)=>Z.id||K,(Z,K)=>{var we=kl(),ve=l(we),ke=l(ve),pe=l(ke),Ye=f(ke,2),ft=l(Ye),pa=f(ve,2);{var Gt=Pe=>{var Qe=_l(),_t=l(Qe);B(()=>I(_t,p(K).body)),w(Pe,Qe)},Jt=Pe=>{var Qe=yl(),_t=l(Qe);B(()=>I(_t,`Email: ${p(K).email??""}`)),w(Pe,Qe)},ha=Pe=>{var Qe=wl(),_t=l(Qe);B(()=>{Le(Qe,1,`text-[10px] font-mono ${p(K).completed?"text-emerald-400":"text-orange-400"}`),I(_t,`Status: ${p(K).completed?"Completed ✓":"Pending..."}`)}),w(Pe,Qe)};ae(pa,Pe=>{p(K).body?Pe(Gt):p(K).email?Pe(Jt,1):p(K).completed!==void 0&&Pe(ha,2)})}B(()=>{vs(we,"id",`fetch-item-${p(K).id}`),I(pe,p(K).title||p(K).name||`Item #${p(K).id}`),I(ft,`ID: #${p(K).id??""}`)}),w(Z,we)}),w(N,Y)};ae(X,N=>{p(h)?N(ye):N(rt,-1)})}w(D,W)},Q=D=>{var W=Tl();w(D,W)};ae(Re,D=>{p(r)?D(ut):p(i).length>0?D(Mt,1):D(Q,-1)})}B(()=>de.disabled=p(r)),fi(O,()=>p(a),D=>y(a,D)),Ka(J,()=>p(s),D=>y(s,D)),$("click",de,v),w(A,T)}}),w(e,_),xe()}Ae(["click"]);var Pl=fs('<svg class="animate-spin size-3 text-slate-950" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path></svg> Posting...',1),Il=fs('<svg class="size-3 text-slate-950" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"></path></svg> Send POST Request',1),Ml=k('<div id="post-loading-indicator" data-testid="post-loading-indicator" class="py-3 flex items-center gap-2 text-xs text-slate-400 font-mono"><div class="size-4 border-2 border-amber-500/20 border-t-amber-400 rounded-full animate-spin"></div> <span>Dispatching HTTP POST request...</span></div>'),Nl=k('<div id="post-success-banner" data-testid="post-success-banner" class="px-3 py-2 rounded-lg bg-emerald-950/60 border border-emerald-800/60 text-emerald-300 text-xs font-mono flex items-center justify-between gap-2 animate-fadeIn"><div class="flex items-center gap-2"><svg class="size-4 text-emerald-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg> <span> </span></div> <span id="post-status-badge" data-testid="post-status-badge" class="font-bold text-[10px] bg-emerald-900/80 px-1.5 py-0.5 rounded text-emerald-200"> </span></div>'),Ol=k('<span class="text-amber-400"> </span>'),Ll=k('<div><div class="flex items-center justify-between text-[10px] font-mono text-slate-500 mb-1"><span>Response Payload:</span> <!></div> <pre id="post-response-json" data-testid="post-response-json" class="p-2.5 rounded-lg bg-slate-950 border border-slate-800 text-[10px] text-amber-300/90 font-mono max-h-36 overflow-y-auto leading-relaxed"> </pre></div>'),Bl=k('<div class="api-created-item p-2 rounded bg-slate-900/50 border border-slate-800 text-[11px] flex items-center justify-between"><div class="flex items-center gap-2 min-w-0"><span class="text-amber-400 font-mono font-semibold shrink-0"> </span> <span class="text-slate-300 truncate font-mono"> </span></div> <span class="text-[9px] text-slate-500 font-mono shrink-0 ml-2"> </span></div>'),Dl=k('<div class="mt-1 pt-2 border-t border-slate-800/60"><span class="text-[10px] font-mono uppercase tracking-wider text-slate-500 block mb-2"> </span> <div id="post-history-list" data-testid="post-history-list" class="space-y-1.5 max-h-32 overflow-y-auto pr-1"></div></div>'),Hl=k('<div class="flex flex-col gap-3"><form class="space-y-2.5"><div><label for="post-input-title" class="text-[10px] font-mono text-slate-500 block mb-1">Title <span class="text-amber-400">*</span></label> <input id="post-input-title" data-testid="post-title-input" type="text" required="" placeholder="e.g. TestSpectra Release Announcement" class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"/></div> <div><label for="post-input-body" class="text-[10px] font-mono text-slate-500 block mb-1">Body / Content</label> <textarea id="post-input-body" data-testid="post-body-input" rows="2" placeholder="e.g. Fast, reliable end-to-end assertions..." class="w-full px-2.5 py-1.5 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono resize-none focus:outline-none focus:border-amber-500"></textarea></div> <div class="flex items-center gap-3"><div class="flex-1"><label for="post-input-author" class="text-[10px] font-mono text-slate-500 block mb-1">User ID:</label> <input id="post-input-author" data-testid="post-author-input" type="number" min="1" max="100" class="w-full px-2.5 py-1 rounded-lg bg-slate-900 border border-slate-700/70 text-slate-200 text-xs font-mono focus:outline-none focus:border-amber-500"/></div> <div class="pt-4"><button id="fill-sample-post-btn" type="button" class="text-[10px] font-mono px-2 py-1 rounded border border-slate-700 text-slate-400 hover:text-slate-200 hover:border-slate-600 transition-all cursor-pointer">Sample Data</button></div></div> <div class="flex items-center gap-2 pt-1 flex-wrap"><button id="submit-post-btn" data-testid="submit-post-btn" type="submit" class="px-3 py-1.5 rounded-lg bg-amber-500 hover:bg-amber-400 disabled:opacity-50 text-slate-950 font-semibold text-xs font-mono transition-all flex items-center gap-1.5 cursor-pointer"><!></button> <button id="clear-post-btn" data-testid="clear-post-btn" type="button" class="px-2.5 py-1.5 rounded-lg border border-slate-700 text-slate-400 hover:text-slate-200 text-xs font-mono transition-all cursor-pointer">Clear</button></div></form> <!> <!> <!> <!></div>'),Rl=k('<div id="api-post" class="mb-5"><!></div>');function Fl(e,t){be(t,!0);let a=P("TestSpectra Automated Post"),s=P("Verifying API matchers and end-to-end payload submission with WebdriverIO."),r=P(1),n=P(!1),o=P(null),d=P("IDLE"),i=P(null),c=P(null),h=P(bt([])),b=P(null);async function v(A){if(A&&A.preventDefault(),!p(a).trim())return;y(n,!0),y(b,null);const T=performance.now(),C={title:p(a).trim(),body:p(s).trim(),userId:Number(p(r))||1};try{const O=await fetch("http://localhost:5200/api/posts",{method:"POST",headers:{"Content-type":"application/json; charset=UTF-8"},body:JSON.stringify(C)}),F=await O.json(),j=performance.now();y(c,Math.round(j-T),!0),y(o,O.status,!0),y(d,O.ok?"201 Created":`${O.status} ${O.statusText}`,!0),y(i,F,!0);const H={id:F.id||Date.now(),title:F.title,body:F.body,userId:F.userId,createdAt:new Date().toLocaleTimeString()};y(h,[H,...p(h)],!0),y(b,`Successfully created post #${H.id}!`)}catch{const O=performance.now();y(c,Math.round(O-T),!0),y(o,201),y(d,"201 Created");const F=100+p(h).length+1,j={id:F,...C};y(i,j,!0);const H={id:F,title:C.title,body:C.body,userId:C.userId,createdAt:new Date().toLocaleTimeString()};y(h,[H,...p(h)],!0),y(b,`Successfully created post #${F} (mock mode)!`)}finally{y(n,!1)}}function m(){y(a,"Automated Quality Engineering with TestSpectra"),y(s,"Unified cross-platform assertion matchers across Web, Android, and iOS."),y(r,42)}function x(){y(a,""),y(s,""),y(r,1),y(i,null),y(o,null),y(d,"IDLE"),y(b,null)}const _=`// Intercept and assert POST requests in TestSpectra
|
|
101
|
+
const postMock = await browser.intercept("/api/posts", "POST");
|
|
102
|
+
|
|
103
|
+
// Fill form and submit
|
|
104
|
+
await Spectra.get("#post-input-title").type("TestSpectra Automated Post");
|
|
105
|
+
await Spectra.get("#post-input-body").type("Verifying API matchers...");
|
|
106
|
+
await Spectra.get("#submit-post-btn").click();
|
|
107
|
+
|
|
108
|
+
// Assert loading finished and success response displayed
|
|
109
|
+
await Spectra.get("#post-loading-indicator").shouldNotExist();
|
|
110
|
+
await Spectra.get("#post-status-badge").shouldHaveText("201 Created");
|
|
111
|
+
await Spectra.get("#post-success-banner").shouldBeVisible();
|
|
112
|
+
await Spectra.get("#post-response-json").shouldContainText("TestSpectra Automated Post");
|
|
113
|
+
|
|
114
|
+
// Assert intercepted payload
|
|
115
|
+
await postMock.respondWith({ id: 201, status: "created" }, { statusCode: 201 });`;var g=Rl(),S=l(g);ge(S,{cat:"api",matchers:[{name:"POST / Create API",desc:"Submits JSON payloads to dummy REST endpoints, validating request bodies and creation status."},{name:'browser.intercept(url, "POST")',desc:"Intercepts HTTP POST submissions and verifies payload schema and status code."}],code:_,demo:T=>{var C=Hl(),O=l(C),F=l(O),j=f(l(F),2),H=f(F,2),q=f(l(H),2),J=f(H,2),re=l(J),de=f(l(re),2),Je=f(re,2),Ke=l(Je),Be=f(J,2),_e=l(Be),De=l(_e);{var He=N=>{var Y=Pl();w(N,Y)},ne=N=>{var Y=Il();w(N,Y)};ae(De,N=>{p(n)?N(He):N(ne,-1)})}var Re=f(_e,2),ut=f(O,2);{var Mt=N=>{var Y=Ml();w(N,Y)};ae(ut,N=>{p(n)&&N(Mt)})}var Q=f(ut,2);{var D=N=>{var Y=Nl(),Z=l(Y),K=f(l(Z),2),we=l(K),ve=f(Z,2),ke=l(ve);B(()=>{I(we,p(b)),I(ke,p(d))}),w(N,Y)};ae(Q,N=>{p(b)&&N(D)})}var W=f(Q,2);{var X=N=>{var Y=Ll(),Z=l(Y),K=f(l(Z),2);{var we=pe=>{var Ye=Ol(),ft=l(Ye);B(()=>I(ft,`${p(c)??""}ms`)),w(pe,Ye)};ae(K,pe=>{p(c)!==null&&pe(we)})}var ve=f(Z,2),ke=l(ve);B(pe=>I(ke,pe),[()=>JSON.stringify(p(i),null,2)]),w(N,Y)};ae(W,N=>{p(i)&&N(X)})}var ye=f(W,2);{var rt=N=>{var Y=Dl(),Z=l(Y),K=l(Z),we=f(Z,2);Ge(we,21,()=>p(h),ve=>ve.id+"-"+ve.createdAt,(ve,ke)=>{var pe=Bl(),Ye=l(pe),ft=l(Ye),pa=l(ft),Gt=f(ft,2),Jt=l(Gt),ha=f(Ye,2),Pe=l(ha);B(()=>{I(pa,`#${p(ke).id??""}`),I(Jt,p(ke).title),I(Pe,p(ke).createdAt)}),w(ve,pe)}),B(()=>I(K,`Created Posts (${p(h).length??""})`)),w(N,Y)};ae(ye,N=>{p(h).length>0&&N(rt)})}B(N=>_e.disabled=N,[()=>p(n)||!p(a).trim()]),ei("submit",O,v),Ka(j,()=>p(a),N=>y(a,N)),Ka(q,()=>p(s),N=>y(s,N)),Ka(de,()=>p(r),N=>y(r,N)),$("click",Ke,m),$("click",Re,x),w(T,C)}}),w(e,g),xe()}Ae(["click"]);var jl=k('<li class="sse-message-item rounded border border-slate-800/60 bg-slate-950/60 px-3 py-2 text-xs font-mono text-slate-300"> </li>'),Vl=k('<li id="sse-empty-state" data-testid="sse-empty-state" class="text-xs text-slate-600">No messages yet.</li>'),Wl=k('<div class="flex flex-col gap-4"><div class="flex items-center gap-3"><button id="sse-connect-btn" data-testid="sse-connect-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300 disabled:opacity-40">Connect</button> <button id="sse-disconnect-btn" data-testid="sse-disconnect-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300 disabled:opacity-40">Disconnect</button> <span id="sse-connection-status" data-testid="sse-connection-status"> </span></div> <ul class="flex flex-col gap-2"><!> <!></ul></div>'),zl=k('<div id="sse" class="mb-5"><!></div>');function ql(e,t){be(t,!0);let a="/api/sse-feed",s=P(!1),r=P(bt([])),n=null,o=0;function d(){n||(y(r,[],!0),n=new EventSource(a),n.onopen=()=>{y(s,!0)},n.onmessage=v=>{o+=1,y(r,[...p(r),{id:o,data:v.data}],!0)},n.onerror=()=>{i()})}function i(){n==null||n.close(),n=null,y(s,!1)}const c=`// EventSource's initial request is a plain HTTP GET, so it can be mocked with the exact
|
|
116
|
+
// same Spectra.intercept() used for regular fetch() calls — deliver a text/event-stream body
|
|
117
|
+
// and the browser's EventSource parser splits it into individual "message" events itself.
|
|
118
|
+
await Spectra.intercept("/api/sse-feed", "GET", {
|
|
119
|
+
body: 'data: {"text":"hello from mock SSE"}\\n\\ndata: {"text":"second event"}\\n\\n',
|
|
120
|
+
headers: { "Content-Type": "text/event-stream" },
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
await Spectra.get("#sse-connect-btn").click();
|
|
124
|
+
await Spectra.getAll(".sse-message-item").shouldHaveLength(2);`;var h=zl(),b=l(h);ge(b,{cat:"api",matchers:[{name:"EventSource (SSE)",desc:"Bypasses/mocks a Server-Sent Events stream via the same network-intercept engine used for fetch()."}],code:c,demo:m=>{var x=Wl(),_=l(x),g=l(_),S=f(g,2),A=f(S,2),T=l(A),C=f(_,2),O=l(C);Ge(O,17,()=>p(r),H=>H.id,(H,q)=>{var J=jl(),re=l(J);B(()=>I(re,p(q).data)),w(H,J)});var F=f(O,2);{var j=H=>{var q=Vl();w(H,q)};ae(F,H=>{p(r).length===0&&H(j)})}B(()=>{g.disabled=p(s),S.disabled=!p(s),Le(A,1,`text-xs font-mono ${p(s)?"text-teal-400":"text-slate-500"}`),I(T,p(s)?"CONNECTED":"DISCONNECTED")}),$("click",g,d),$("click",S,i),w(m,x)}}),w(e,h),xe()}Ae(["click"]);var Ul=k('<li class="ws-message-item rounded border border-slate-800/60 bg-slate-950/60 px-3 py-2 text-xs font-mono text-slate-300"> </li>'),$l=k('<li id="ws-empty-state" data-testid="ws-empty-state" class="text-xs text-slate-600">No messages yet.</li>'),Gl=k('<div class="flex flex-col gap-4"><div class="flex items-center gap-3"><button id="ws-connect-btn" data-testid="ws-connect-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300 disabled:opacity-40">Connect</button> <button id="ws-disconnect-btn" data-testid="ws-disconnect-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300 disabled:opacity-40">Disconnect</button> <span id="ws-connection-status" data-testid="ws-connection-status"> </span></div> <ul class="flex flex-col gap-2"><!> <!></ul></div>'),Jl=k('<div id="websocket" class="mb-5"><!></div>');function Kl(e,t){be(t,!0);let a="wss://echo.example.invalid/ws",s=P(!1),r=P(bt([])),n=null,o=0;function d(m){o+=1,y(r,[...p(r),{id:o,data:m}],!0)}function i(){if(n)return;y(r,[],!0);const m=window.__mockWebSocketMessages;if(m){y(s,!0);let _=0;const g=setInterval(()=>{if(_>=m.length){clearInterval(g);return}d(m[_]),_+=1},10);n={close:()=>clearInterval(g)};return}const x=new WebSocket(a);x.onopen=()=>{y(s,!0)},x.onmessage=_=>d(String(_.data)),x.onerror=()=>c(),x.onclose=()=>{y(s,!1)},n=x}function c(){n==null||n.close(),n=null,y(s,!1)}const h=`// CDP can't intercept a WebSocket handshake or its frames the way it intercepts HTTP
|
|
125
|
+
// requests — it's a protocol upgrade, not a request/response Spectra.intercept() can fulfill.
|
|
126
|
+
// The standard workaround (same one Cypress/Playwright suites use): let the app itself switch
|
|
127
|
+
// to an in-memory fake socket when a test-only flag is present, set via Spectra.browser.evaluate
|
|
128
|
+
// BEFORE the app opens its real connection.
|
|
129
|
+
await Spectra.browser.evaluate(
|
|
130
|
+
"window.__mockWebSocketMessages = ['hello from mock WS', 'second frame']"
|
|
131
|
+
);
|
|
132
|
+
await Spectra.get("#ws-connect-btn").click();
|
|
133
|
+
await Spectra.getAll(".ws-message-item").shouldHaveLength(2);`;var b=Jl(),v=l(b);ge(v,{cat:"api",matchers:[{name:"WebSocket (app-level mock)",desc:"Bypasses a WebSocket connection via an app-level test flag — network-level interception cannot reach WS traffic."}],code:h,demo:x=>{var _=Gl(),g=l(_),S=l(g),A=f(S,2),T=f(A,2),C=l(T),O=f(g,2),F=l(O);Ge(F,17,()=>p(r),q=>q.id,(q,J)=>{var re=Ul(),de=l(re);B(()=>I(de,p(J).data)),w(q,re)});var j=f(F,2);{var H=q=>{var J=$l();w(q,J)};ae(j,q=>{p(r).length===0&&q(H)})}B(()=>{S.disabled=p(s),A.disabled=!p(s),Le(T,1,`text-xs font-mono ${p(s)?"text-teal-400":"text-slate-500"}`),I(C,p(s)?"CONNECTED":"DISCONNECTED")}),$("click",S,i),$("click",A,c),w(x,_)}}),w(e,b),xe()}Ae(["click"]);var Yl=k('<div class="flex flex-col gap-4"><div class="g-recaptcha"></div> <div class="flex items-center gap-3"><button id="captcha-submit-btn" data-testid="captcha-submit-btn" class="rounded-md border border-teal-900/40 bg-teal-950/60 px-4 py-2 text-xs font-semibold text-teal-300">Submit</button> <button id="captcha-reset-btn" data-testid="captcha-reset-btn" class="rounded-md border border-slate-800/60 bg-slate-900/60 px-4 py-2 text-xs font-semibold text-slate-300">Reset</button></div> <p id="captcha-submit-message" data-testid="captcha-submit-message"> </p></div>'),Ql=k('<div id="captcha" class="mb-5"><!></div>');function Zl(e){const t="6LcWK4QtAAAAAAeA8IAN20JceGQ7L-RWE-LfhZnB";let a=P(!1),s=P(""),r=P(!1);function n(){if(p(r)||document.getElementById("recaptcha-script"))return;const b=document.createElement("script");b.id="recaptcha-script",b.src="https://www.google.com/recaptcha/api.js",b.async=!0,b.defer=!0,document.head.appendChild(b),y(r,!0)}n();function o(){var m,x;const b=window.__bypassCaptcha===!0,v=((x=(m=window.grecaptcha)==null?void 0:m.getResponse)==null?void 0:x.call(m))||"";b||v?(y(a,!0),y(s,b?"Submitted (captcha bypassed for automated test)":"Submitted (captcha verified)",!0)):(y(a,!1),y(s,"Please complete the reCAPTCHA challenge first."))}function d(){y(a,!1),y(s,"")}const i=`// Real reCAPTCHA runs inside a cross-origin iframe Google explicitly discourages automating —
|
|
134
|
+
// there's no Spectra.intercept()-style network mock for a live third-party widget. The
|
|
135
|
+
// standard CI pattern: a test-only bypass flag the app honors instead of trying to
|
|
136
|
+
// automate the actual challenge.
|
|
137
|
+
await Spectra.browser.evaluate("window.__bypassCaptcha = true");
|
|
138
|
+
await Spectra.get("#captcha-submit-btn").click();
|
|
139
|
+
await Spectra.get("#captcha-submit-message").shouldContainText("bypassed");`;var c=Ql(),h=l(c);ge(h,{cat:"api",matchers:[{name:"reCAPTCHA (test-mode bypass)",desc:"Bypasses a live third-party captcha widget via an app-level test-only flag rather than automating the widget itself."}],code:i,demo:v=>{var m=Yl(),x=l(m);vs(x,"data-sitekey",t);var _=f(x,2),g=l(_),S=f(g,2),A=f(_,2),T=l(A);B(()=>{Le(A,1,`text-xs font-mono ${p(a)?"text-teal-400":"text-slate-500"}`),I(T,p(s))}),$("click",g,o),$("click",S,d),w(v,m)}}),w(e,c)}Ae(["click"]);var Xl=k('<div class="flex items-center gap-2 text-[11px] font-mono px-3 py-1.5 rounded-lg bg-slate-900/60 border border-slate-800"><span class="text-slate-500">Status:</span> <span id="auth-status-badge" data-testid="auth-status-badge"> </span></div>'),ed=k(`<div class="flex flex-col gap-3"><p class="text-[11px] text-slate-500 leading-relaxed">This page never calls <code class="text-amber-400">/api/login</code> itself — a real login
|
|
140
|
+
only happens if a test seeds the session first (e.g. via a support action calling <code class="text-amber-400">Spectra.browser.setCookies()</code>). Clicking the button below
|
|
141
|
+
just asks the server "am I authenticated right now?" using whatever cookie the browser
|
|
142
|
+
already has.</p> <div><button id="check-auth-status-btn" data-testid="check-auth-status-btn" type="button" class="px-3 py-1.5 rounded-lg bg-amber-500 hover:bg-amber-400 text-slate-950 font-semibold text-xs font-mono transition-all cursor-pointer">Check Auth Status</button></div> <!></div>`),td=k('<div id="auth" class="mb-5"><!></div>');function ad(e,t){be(t,!0);let a=P(!1),s=P(!1),r=P("");async function n(){var c;try{const b=await(await fetch("http://localhost:5200/api/me",{credentials:"include"})).json();y(s,b.authenticated,!0),y(r,((c=b.user)==null?void 0:c.email)??"",!0)}catch{y(s,!1),y(r,"")}finally{y(a,!0)}}const o=`// Seed a real session by calling the login API directly (host-side, e.g. from a
|
|
143
|
+
// support/actions/*.action.ts) instead of driving the real login form, then apply the
|
|
144
|
+
// resulting HttpOnly cookie straight to the browser's own cookie jar:
|
|
145
|
+
const res = await fetch('http://localhost:5200/api/login', {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
body: JSON.stringify({ email: 'demo@testspectra.dev', password: 'demo-password' }),
|
|
148
|
+
});
|
|
149
|
+
await Spectra.browser.setCookies(res.headers.getSetCookie(), res.url);
|
|
150
|
+
|
|
151
|
+
// The page's own client-side fetch now automatically carries the seeded cookie.
|
|
152
|
+
await Spectra.get('#check-auth-status-btn').click();
|
|
153
|
+
await Spectra.get('#auth-status-badge').shouldHaveText('Authenticated as demo@testspectra.dev');`;var d=td(),i=l(d);ge(i,{cat:"api",matchers:[{name:"Spectra.browser.setCookies()",desc:"Applies raw Set-Cookie header(s) to the browser cookie jar via CDP — HttpOnly-safe, no login UI needed."}],code:o,demo:h=>{var b=ed(),v=f(l(b),2),m=l(v),x=f(v,2);{var _=g=>{var S=Xl(),A=f(l(S),2),T=l(A);B(C=>{Le(A,1,C),I(T,p(s)?`Authenticated as ${p(r)}`:"Not authenticated")},[()=>va(["font-semibold px-1.5 py-0.5 rounded",p(s)?"bg-emerald-950 text-emerald-400 border border-emerald-800/50":"bg-red-950 text-red-400 border border-red-800/50"].join(" "))]),w(g,S)};ae(x,g=>{p(a)&&g(_)})}$("click",m,n),w(h,b)}}),w(e,d),xe()}Ae(["click"]);var sd=k('<div id="demo-removed-el-pg" data-testid="playground-removable" class="px-3 py-2 rounded-lg bg-orange-950/40 border border-orange-800/50 text-orange-300 text-sm font-mono">In DOM (remove me)</div>'),rd=k('<span class="text-xs text-slate-600 font-mono italic block px-3 py-2">(not in DOM)</span>'),nd=k('<li class="demo-product-item px-3 py-1.5 rounded-lg bg-slate-800/50 border border-slate-700/40 text-slate-300 text-xs font-mono flex items-center gap-2"><span class="text-slate-600"></span> </li>'),od=k('<tr class="hover:bg-slate-800/20 transition-colors"><td class="px-5 py-2.5 text-violet-300"> </td><td class="px-5 py-2.5 text-teal-400"> </td><td class="px-5 py-2.5 text-slate-500"> </td></tr>'),id=k(`<section id="playground" class="mb-20"><!> <p class="text-sm text-slate-500 mb-8 leading-relaxed">All demo elements are available below with their exact IDs and expected states.
|
|
154
|
+
Use these selectors in your TestSpectra test suite to verify matchers against this page.</p> <div class="grid grid-cols-1 md:grid-cols-2 gap-5"><div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Visibility Matchers</h3> <div class="space-y-3"><div class="flex items-center justify-between"><code class="text-[10px] text-slate-500"></code> <span class="text-[10px] text-emerald-400 font-mono">shouldBeVisible</span></div> <div id="demo-visible-el-pg" data-testid="playground-visible" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">Visible Element</div> <div class="flex items-center justify-between mt-3"><code class="text-[10px] text-slate-500"></code> <div class="flex items-center gap-2"><span class="text-[10px] text-red-400 font-mono">shouldNotBeVisible</span> <button type="button" class="text-[10px] font-mono px-2 py-0.5 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer"> </button></div></div> <div id="demo-hidden-el-pg" data-testid="playground-hidden">Hidden Element</div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Existence Matchers</h3> <div class="space-y-3"><div class="flex items-center justify-between"><code class="text-[10px] text-slate-500"></code> <span class="text-[10px] text-emerald-400 font-mono">shouldExist</span></div> <div id="demo-existing-el-pg" data-testid="playground-existing" class="px-3 py-2 rounded-lg bg-emerald-950/40 border border-emerald-800/50 text-emerald-300 text-sm font-mono">Exists in DOM ✓</div> <div class="flex items-center justify-between mt-3"><code class="text-[10px] text-slate-500"></code> <div class="flex items-center gap-2"><span class="text-[10px] text-orange-400 font-mono">shouldNotExist</span> <button type="button" class="text-[10px] font-mono px-2 py-0.5 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all cursor-pointer"> </button></div></div> <!></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">State Matchers</h3> <div class="space-y-3"><div class="flex items-center gap-3 flex-wrap"><button id="demo-enabled-btn" data-testid="enabled-button" class="px-4 py-2 rounded-lg bg-teal-600 hover:bg-teal-500 text-white text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-slate-700 transition-all cursor-pointer">Enabled Button</button> <button id="demo-disabled-btn-pg" data-testid="disabled-button" class="px-4 py-2 rounded-lg bg-slate-700 text-slate-400 text-sm font-medium disabled:opacity-40 disabled:cursor-not-allowed transition-all cursor-pointer">Disabled Button</button> <button type="button" class="text-[10px] font-mono px-2 py-1 rounded border border-slate-700 text-slate-500 hover:text-slate-300 transition-all ml-auto cursor-pointer">flip states</button></div> <div class="flex items-center gap-4 pt-1"><label class="flex items-center gap-2 cursor-pointer"><input type="checkbox" id="demo-terms-checkbox" data-testid="terms-checkbox" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">shouldBeChecked</span></label> <label class="flex items-center gap-2 cursor-pointer"><input type="radio" id="demo-mode-radio" name="pg-radio" data-testid="mode-radio" class="size-4 accent-teal-400 cursor-pointer"/> <span class="text-xs text-slate-400 font-mono">shouldBeChecked</span></label></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-focus-input-pg" data-testid="playground-focus-input" type="text" placeholder="Click to focus this input..." class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-500 focus:ring-1 focus:ring-teal-500"/></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Value & Text Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-email-input-pg" data-testid="email-input" type="text" value="admin@testspectra.dev" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-token-input-pg" data-testid="token-input" type="text" value="JWT_abc123xyz" class="w-full px-3 py-2 rounded-lg bg-slate-900 border border-slate-700/60 text-slate-200 text-sm font-mono focus:outline-none focus:border-teal-700"/></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-exact-text-pg" data-testid="exact-text-el" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-200 text-sm font-mono">Welcome to TestSpectra</div></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-partial-text-pg" data-testid="partial-text-el" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-200 text-sm font-mono">Welcome back, QA Engineer!</div></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Class & Attribute Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-active-tab-pg" data-testid="active-tab-el" class="is-active nav-tab px-4 py-2 rounded-lg bg-violet-950/40 border border-violet-700/50 text-violet-300 text-sm font-mono inline-flex items-center gap-2"><span class="size-1.5 rounded-full bg-violet-400"></span> Active Tab</div></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <a id="demo-nav-link-pg" data-testid="nav-link-el" href="/dashboard" aria-label="Go to Dashboard" aria-expanded="false" data-role="navigation" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-300 text-sm font-mono inline-flex items-center gap-2 hover:text-teal-300 hover:border-teal-800/50 transition-all cursor-pointer">→ /dashboard</a></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <div id="demo-styled-el-pg" data-testid="playground-styled-element" style="color: rgb(239, 68, 68); display: flex;" class="px-4 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 font-mono text-sm inline-flex items-center gap-2"><span>Styled Element (color: rgb(239, 68, 68))</span></div></div></div></div> <div class="rounded-xl border border-slate-800/60 bg-slate-900/20 p-5"><h3 class="text-xs font-mono font-semibold text-slate-400 mb-4">Collection Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1">class="demo-product-item" (4 items) → shouldHaveLength(4)</code> <ul id="demo-product-list-pg" class="space-y-1"></ul></div> <div><code class="text-[10px] text-slate-500 block mb-1"></code> <ul id="demo-empty-list-pg" data-testid="empty-list-el" class="px-3 py-2 rounded-lg bg-slate-900/60 border border-slate-700/40 min-h-8 flex items-center"><span class="text-[10px] text-slate-700 font-mono italic">empty</span></ul></div></div></div> <div 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">File Upload Matchers</h3> <div class="space-y-3"><div><code class="text-[10px] text-slate-500 block mb-1"></code> <input id="demo-file-input-pg" data-testid="file-upload-input" type="file" class="w-full text-xs text-slate-400 file:mr-3 file:py-1.5 file:px-3 file:rounded-lg file:border-0 file:text-xs file:font-mono file:bg-teal-950/60 file:text-teal-300 hover:file:bg-teal-900/60 cursor-pointer"/></div> <div><span class="text-[10px] text-slate-500 block mb-1">Uploaded Filename:</span> <div id="demo-uploaded-filename" data-testid="uploaded-filename" class="px-3 py-2 rounded-lg bg-slate-800/60 border border-slate-700/50 text-slate-200 text-sm font-mono"> </div></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 ld(e,t){be(t,!0);let a=P("");const s=[["#demo-file-input-pg","upload(Fixture.*)","input[type=file] attachment"],["#demo-uploaded-filename","shouldContainText()","filename of uploaded fixture"],["#demo-visible-el","shouldBeVisible()","display: block, opacity: 1"],["#demo-hidden-el","shouldNotBeVisible()","display: none (toggle)"],["#demo-existing-el","shouldExist()","present in DOM"],["#demo-removed-el","shouldNotExist()","removed from DOM (toggle)"],["#demo-enabled-btn","shouldBeEnabled()","no disabled attribute"],["#demo-disabled-btn-pg","shouldBeDisabled()","disabled attribute set"],["#demo-terms-checkbox","shouldBeChecked()","checked: true"],["#demo-mode-radio","shouldBeChecked()","checked: true"],["#demo-focus-input-pg","shouldBeFocused()","focused state via click"],["#demo-styled-el-pg","shouldHaveCss()","color: rgb(239, 68, 68)"],["#demo-email-input-pg","shouldHaveValue()","admin@testspectra.dev"],["#demo-token-input-pg","shouldContainValue()","contains JWT_"],["#demo-exact-text-pg","shouldHaveText()",'"Welcome to TestSpectra"'],["#demo-partial-text-pg","shouldContainText()",'contains "Welcome"'],[".demo-product-item","shouldHaveLength()","4 items"],["#demo-empty-list-pg","shouldBeEmpty()","0 items"],["#fetch-api-btn","click (GET)","fetch dummy posts / items"],["#fetch-status-badge","shouldHaveText()","200 OK"],[".api-fetched-item","shouldHaveLengthGreaterThan()",">= 1 item"],["#submit-post-btn","click (POST)","submit dummy post payload"],["#post-status-badge","shouldHaveText()","201 Created"],["#post-success-banner","shouldBeVisible()","display creation banner"]];var r=id(),n=l(r);ka(n,{id:"playground-heading",children:(U,ee)=>{var yt=ya("Live Playground");w(U,yt)}});var o=f(n,4),d=l(o),i=f(l(d),2),c=l(i),h=l(c);h.textContent="#demo-visible-el";var b=f(c,4),v=l(b);v.textContent="#demo-hidden-el";var m=f(v,2),x=f(l(m),2),_=l(x),g=f(b,2),S=f(d,2),A=f(l(S),2),T=l(A),C=l(T);C.textContent="#demo-existing-el";var O=f(T,4),F=l(O);F.textContent="#demo-removed-el";var j=f(F,2),H=f(l(j),2),q=l(H),J=f(O,2);{var re=U=>{var ee=sd();w(U,ee)},de=U=>{var ee=rd();w(U,ee)};ae(J,U=>{t.exists?U(re):U(de,-1)})}var Je=f(S,2),Ke=f(l(Je),2),Be=l(Ke),_e=l(Be),De=f(_e,2),He=f(De,2),ne=f(Be,2),Re=l(ne),ut=l(Re),Mt=f(Re,2),Q=l(Mt),D=f(ne,2),W=l(D);W.textContent="#demo-focus-input-pg → shouldBeFocused()";var X=f(Je,2),ye=f(l(X),2),rt=l(ye),N=l(rt);N.textContent="#demo-email-input → shouldHaveValue()",f(N,2);var Y=f(rt,2),Z=l(Y);Z.textContent='#demo-token-input → shouldContainValue("JWT_")',f(Z,2);var K=f(Y,2),we=l(K);we.textContent="#demo-exact-text → shouldHaveText()";var ve=f(K,2),ke=l(ve);ke.textContent='#demo-partial-text → shouldContainText("Welcome")';var pe=f(X,2),Ye=f(l(pe),2),ft=l(Ye),pa=l(ft);pa.textContent='#demo-active-tab class="is-active nav-tab"';var Gt=f(ft,2),Jt=l(Gt);Jt.textContent='#demo-nav-link href="/dashboard" aria-label="Go to Dashboard"';var ha=f(Jt,2),Pe=f(Gt,2),Qe=l(Pe);Qe.textContent='#demo-styled-el-pg → shouldHaveCss("color", "rgb(239, 68, 68)")';var _t=f(pe,2),hn=f(l(_t),2),Gs=l(hn),mn=f(l(Gs),2);Ge(mn,20,()=>["Product Alpha","Product Beta","Product Gamma","Product Delta"],$s,(U,ee,yt)=>{var ja=nd(),Va=l(ja);Va.textContent=`#${yt+1}`;var ps=f(Va);B(()=>I(ps,` ${ee??""}`)),w(U,ja)});var bn=f(Gs,2),xn=l(bn);xn.textContent="#demo-empty-list-pg → shouldBeEmpty()";var gn=f(_t,2),_n=f(l(gn),2),Js=l(_n),Ks=l(Js);Ks.textContent="#demo-file-input-pg → upload(Fixture.*)";var yn=f(Ks,2),wn=f(Js,2),kn=f(l(wn),2),Sn=l(kn),Tn=f(o,2),En=f(l(Tn),2),Cn=l(En),An=f(l(Cn));Ge(An,21,()=>s,([U,ee,yt])=>U,(U,ee)=>{var yt=la(()=>Vn(p(ee),3));let ja=()=>p(yt)[0],Va=()=>p(yt)[1],ps=()=>p(yt)[2];var Ys=od(),Qs=l(Ys),Pn=l(Qs),Zs=f(Qs),In=l(Zs),Mn=f(Zs),Nn=l(Mn);B(()=>{I(Pn,ja()),I(In,Va()),I(Nn,ps())}),w(U,Ys)}),B(U=>{I(_,t.hidden?"show":"hide"),Le(g,1,U),I(q,t.exists?"remove":"add"),_e.disabled=t.disabled,De.disabled=!t.disabled,as(ut,t.checked),as(Q,t.selected),I(Sn,p(a)||"No file chosen")},[()=>va(["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(" "))]),$("click",x,function(...U){var ee;(ee=t.onToggleHidden)==null||ee.apply(this,U)}),$("click",H,function(...U){var ee;(ee=t.onToggleExists)==null||ee.apply(this,U)}),$("click",He,function(...U){var ee;(ee=t.onToggleDisabled)==null||ee.apply(this,U)}),$("change",ut,U=>t.onToggleChecked(U.currentTarget.checked)),$("change",Q,U=>t.onToggleSelected(U.currentTarget.checked)),$("click",ha,U=>U.preventDefault()),$("change",yn,U=>{const ee=U.currentTarget.files;ee&&ee.length>0&&y(a,ee[0].name,!0)}),w(e,r),xe()}Ae(["click","change"]);var dd=k('<div class="flex flex-col h-full bg-[#020817] text-slate-200"><header class="h-14 shrink-0 border-b border-slate-800/60 bg-[#020817]/95 backdrop-blur-sm flex items-center px-6 z-50"><div class="flex items-center gap-3"><div class="size-7 rounded-lg bg-teal-950/60 border border-teal-800/40 flex items-center justify-center"><svg class="size-3.5 text-teal-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div> <span class="text-sm font-semibold text-slate-100 tracking-wide">TestSpectra</span> <span class="text-slate-700">/</span> <span class="text-sm text-slate-500 font-mono">Matchers API</span></div> <div class="ml-auto flex items-center gap-3"><span class="text-[10px] font-mono text-slate-600 bg-slate-900/60 border border-slate-800 px-2.5 py-1 rounded-full">WebdriverIO v9+</span> <span class="text-[10px] font-mono text-teal-500 bg-teal-950/40 border border-teal-800/40 px-2.5 py-1 rounded-full">Web · iOS · Android</span></div></header> <div class="flex flex-1 overflow-hidden"><!> <main class="flex-1 overflow-y-auto"><div class="max-w-5xl mx-auto px-8 py-10"><!> <section id="element-matchers" class="mb-20"><!> <!> <!> <!> <!> <!> <!></section> <section id="browser-matchers" class="mb-20"><!> <!> <!></section> <section id="collection-matchers" class="mb-20"><!> <!></section> <section id="api-matchers" class="mb-20"><!> <!> <!> <!> <!> <!> <!></section> <!> <footer class="border-t border-slate-800/60 pt-8 pb-12 text-center"><p class="text-xs text-slate-600 font-mono">TestSpectra Matchers API · Built on WebdriverIO · Multi-platform: Web, iOS, Android</p></footer></div></main></div></div>');function cd(e,t){be(t,!0);let a=P("overview"),s=P(!0),r=P(!0),n=P(!1),o=P(!1),d=P(!0),i=P(!0);Is(()=>{document.title=Ls}),Is(()=>{const D=fn.map(X=>X.id).map(X=>document.getElementById(X)).filter(X=>!!X),W=new IntersectionObserver(X=>{X.forEach(ye=>{ye.isIntersecting&&y(a,ye.target.id,!0)})},{rootMargin:"-10% 0px -75% 0px"});return D.forEach(X=>W.observe(X)),()=>{W.disconnect()}});var c=dd(),h=f(l(c),2),b=l(h);ki(b,{get activeId(){return p(a)}});var v=f(b,2),m=l(v),x=l(m);Pi(x);var _=f(x,2),g=l(_);ka(g,{id:"element-matchers-heading",children:(Q,D)=>{var W=ya("Element Matchers");w(Q,W)}});var S=f(g,2);Ri(S,{get hidden(){return p(s)},onToggleHidden:()=>y(s,!p(s))});var A=f(S,2);zi(A,{get exists(){return p(r)},onToggleExists:()=>y(r,!p(r))});var T=f(A,2);$i(T,{get disabled(){return p(n)},get checked(){return p(o)},get selected(){return p(i)},onToggleDisabled:()=>y(n,!p(n)),onToggleChecked:Q=>y(o,Q,!0),onToggleSelected:Q=>y(i,Q,!0)});var C=f(T,2);Ki(C);var O=f(C,2);Zi(O);var F=f(O,2);tl(F);var j=f(_,2),H=l(j);ka(H,{id:"browser-matchers-heading",children:(Q,D)=>{var W=ya("Browser Matchers");w(Q,W)}});var q=f(H,2);rl(q,{});var J=f(q,2);il(J);var re=f(j,2),de=l(re);ka(de,{id:"collection-matchers-heading",children:(Q,D)=>{var W=ya("Collection Matchers");w(Q,W)}});var Je=f(de,2);fl(Je);var Ke=f(re,2),Be=l(Ke);ka(Be,{id:"api-matchers-heading",children:(Q,D)=>{var W=ya("API & Network Testing");w(Q,W)}});var _e=f(Be,2);Al(_e,{});var De=f(_e,2);Fl(De,{});var He=f(De,2);ql(He,{});var ne=f(He,2);Kl(ne,{});var Re=f(ne,2);Zl(Re);var ut=f(Re,2);ad(ut,{});var Mt=f(Ke,2);ld(Mt,{get hidden(){return p(s)},get exists(){return p(r)},get disabled(){return p(n)},get checked(){return p(d)},get selected(){return p(i)},onToggleHidden:()=>y(s,!p(s)),onToggleExists:()=>y(r,!p(r)),onToggleDisabled:()=>y(n,!p(n)),onToggleChecked:Q=>y(d,Q,!0),onToggleSelected:Q=>y(i,Q,!0)}),w(e,c),xe()}const pn=document.getElementById("app");if(!pn)throw new Error('Element with id "app" not found');si(cd,{target:pn});
|
package/demo-app/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TestSpectra — Matchers API Reference</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-euCENPMy.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DDYS5fLp.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body class="bg-[#020817] text-slate-200">
|
|
11
11
|
<div id="app"></div>
|