diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 4170e2c..2dce32b 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -61,3 +61,16 @@ jobs: - name: Build assets run: task coding-standards:shell:check + + check-widget-coding-standards: + name: Check widget coding standards + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Lint widget + run: task compose -- run --rm prettier 'widget/' --check diff --git a/.github/workflows/yaml.yaml b/.github/workflows/yaml.yaml index bd4b453..fa0d410 100644 --- a/.github/workflows/yaml.yaml +++ b/.github/workflows/yaml.yaml @@ -36,5 +36,14 @@ jobs: - run: | docker network create frontend + # https://github.com/mxschmitt/action-tmate?tab=readme-ov-file#manually-triggered-debug + # Enable tmate debugging if debug logging is enabled (cf. + # https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#runner-context) + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: false + if: 1 == runner.debug + - run: | docker compose run --rm prettier '**/*.{yml,yaml}' --check diff --git a/.prettierignore b/.prettierignore index ec593ae..f02f9e3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,5 @@ -# Ignore Svelte stuff -widget/ +build/ + +# Ignore some Svelte stuff +widget/.svelte-kit/ +widget/static/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dbc8d8..dfbbdf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.0.0] - 2025-07-10 +- [PR-33](https://github.com/itk-dev/tidy-feedback/pull/33) + - Fixed dynamic class in Svelte + - Cleaned up widget code - [PR-30](https://github.com/itk-dev/tidy-feedback/pull/30) 29: Replaced Bootstrap with CoreUI - [PR-28](https://github.com/itk-dev/tidy-feedback/pull/28) diff --git a/Taskfile.yml b/Taskfile.yml index bccf7c2..7adedf8 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -45,6 +45,8 @@ tasks: silent: true translations:extract: + deps: + - docker:pull cmds: - task compose -- run --rm symfony /app/task/scripts/translations-extract - task: coding-standards:yaml:apply @@ -55,23 +57,29 @@ tasks: coding-standards:apply: desc: "Apply coding standards" + deps: + - docker:pull cmds: - task: coding-standards:assets:apply - task: coding-standards:composer:apply - task: coding-standards:markdown:apply - task: coding-standards:php:apply - task: coding-standards:twig:apply + - task: coding-standards:widget:apply - task: coding-standards:yaml:apply silent: true coding-standards:check: desc: "Apply coding standards" + deps: + - docker:pull cmds: - task: coding-standards:assets:check - task: coding-standards:composer:check - task: coding-standards:markdown:check - task: coding-standards:php:check - task: coding-standards:twig:check + - task: coding-standards:widget:check - task: coding-standards:yaml:check silent: true @@ -86,6 +94,17 @@ tasks: - task: coding-standards:assets:apply - task compose -- run --rm prettier 'assets/' --check + coding-standards:widget:apply: + desc: "Apply coding standards for widget" + cmds: + - task compose -- run --rm prettier 'widget/' --write + + coding-standards:widget:check: + desc: "Apply and check coding standards for widget" + cmds: + - task: coding-standards:widget:apply + - task compose -- run --rm prettier 'widget/' --check + coding-standards:composer:apply: desc: "Apply coding standards for Composer" cmds: @@ -202,6 +221,12 @@ tasks: cmds: - "{{.APP_DOCKER_COMPOSE}} {{.CLI_ARGS}}" + docker:pull: + cmds: + - COMPOSE_PROFILES='*' task compose -- pull + - COMPOSE_PROFILES='*' task compose -- build + silent: true + default: cmds: - task --list-all diff --git a/build/standalone/assets/tidy_feedback.css b/build/standalone/assets/tidy_feedback.css index 007b221..4b34708 100644 --- a/build/standalone/assets/tidy_feedback.css +++ b/build/standalone/assets/tidy_feedback.css @@ -2,4 +2,4 @@ * CoreUI Bootstrap Theme v5.4.1 (https://coreui.io) * Copyright (c) 2025 creativeLabs Łukasz Holeczek * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#3634a3;--bs-secondary-text-emphasis:#212233;--bs-success-text-emphasis:#0f5722;--bs-info-text-emphasis:#184c77;--bs-warning-text-emphasis:#764705;--bs-danger-text-emphasis:#671414;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#343a40;--bs-primary-bg-subtle:#cfc7f3;--bs-secondary-bg-subtle:#ced2d8;--bs-success-bg-subtle:#cbedd6;--bs-info-bg-subtle:#c0e6ff;--bs-warning-bg-subtle:#feecc5;--bs-danger-bg-subtle:#f9d4d4;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9d92e6;--bs-secondary-border-subtle:#9da5b1;--bs-success-border-subtle:#96dbad;--bs-info-border-subtle:#80c6ff;--bs-warning-border-subtle:#fcd88a;--bs-danger-border-subtle:#f2a9a9;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33,37,41,.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(37,43,54,.38);--bs-tertiary-color-rgb:37,42.92,54.02;--bs-tertiary-bg:rgba(33,37,41,.75);--bs-tertiary-bg-rgb:33,37,41;--bs-body-color-dark:#dee2e6;--bs-body-color-rgb-dark:222,226,230;--bs-body-bg-dark:#212529;--bs-body-bg-rgb-dark:33,37,41;--bs-emphasis-color-dark:#fff;--bs-emphasis-color-rgb-dark:255,255,255;--bs-secondary-color-dark:rgba(222,226,230,.75);--bs-secondary-color-rgb-dark:222,226,230;--bs-secondary-bg-dark:#343a40;--bs-secondary-bg-rgb-dark:52,58,64;--bs-tertiary-color-dark:rgba(222,226,230,.5);--bs-tertiary-color-rgb-dark:222,226,230;--bs-tertiary-bg-dark:#2b3035;--bs-tertiary-bg-rgb-dark:42.5,47.5,52.5;--bs-high-emphasis:rgba(37,43,54,.95);--bs-medium-emphasis:rgba(37,43,54,.681);--bs-disabled:rgba(37,43,54,.38);--bs-high-emphasis-inverse:hsla(0,0%,100%,.87);--bs-medium-emphasis-inverse:hsla(0,0%,100%,.6);--bs-disabled-inverse:hsla(0,0%,100%,.38);--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10.4,88,202.4;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem rgba(0,0,0,.15);--bs-box-shadow-sm:0 .125rem .25rem rgba(0,0,0,.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0,0,0,.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0,0,0,.075);--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:rgba(13,110,253,.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}img{vertical-align:middle}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button{font-family:inherit;font-size:inherit;line-height:inherit;margin:0;text-transform:none}[role=button]{cursor:pointer}[type=button],[type=reset],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{-webkit-appearance:button;font:inherit}[hidden]{display:none!important}.container{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-left:auto;margin-right:auto;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}@media (min-width:1400px){.container{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px;--bs-mobile-breakpoint:lg}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media (min-width:768px){.col-md-6{flex:0 0 auto;width:50%}.offset-md-3{margin-inline-start:25%}}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 hsla(0,0%,100%,.15),0 1px 1px rgba(0,0,0,.075);--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);background-color:var(--bs-btn-bg);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);color:var(--bs-btn-color);cursor:pointer;display:inline-block;font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);color:var(--bs-btn-hover-color)}.btn:focus-visible{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);color:var(--bs-btn-hover-color);outline:0}.btn:first-child:active,:not(.btn-check)+.btn:active{background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color);color:var(--bs-btn-active-color)}.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled{background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);color:var(--bs-btn-disabled-color);opacity:var(--bs-btn-disabled-opacity);pointer-events:none}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);color:var(--bs-alert-color);margin-bottom:var(--bs-alert-margin-bottom);padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);position:relative}.alert-dismissible{padding-inline-end:3rem}.alert-dismissible .btn-close{inset-inline-end:0;padding:1.25rem 1rem;position:absolute;top:0;z-index:2}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3E%3C/svg%3E");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem rgba(13,110,253,.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;box-sizing:content-box;filter:var(--bs-btn-close-filter);height:1em;opacity:var(--bs-btn-close-opacity);padding:.25em;width:1em}.btn-close,.btn-close:hover{color:var(--bs-btn-close-color)}.btn-close:hover{opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close:disabled{opacity:var(--bs-btn-close-disabled-opacity);pointer-events:none;-webkit-user-select:none;user-select:none}:root{--bs-btn-close-filter: ;--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }@keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.placeholder{background-color:currentcolor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.placeholder.btn:before{content:"";display:inline-block}@keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.position-fixed{position:fixed!important}.mt-3{margin-top:1rem!important}button{border-radius:var(--radius-base);padding:var(--spacer-sm) var(--spacer-md)}button,button:hover{transition:var(--transform-colors-in)}button.btn-submit{background-color:var(--color-primary);border:1px solid var(--color-primary-700);color:var(--color-text-light)}button.btn-submit:hover{background-color:var(--color-primary-700);color:var(--color-text-light)}button.btn-cancel{background-color:var(--color-gray-100);border:1px solid var(--color-gray-300);color:var(--color-text-dark)}button.btn-cancel:hover{background-color:var(--color-gray-300)}.tidy-feedback-start{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;transform:rotate(-90deg);transform-origin:right bottom}.tidy-feedback-form,.tidy-feedback-start{position:fixed;right:0;top:var(--position-top);z-index:var(--z-index-form)}.tidy-feedback-form{background-color:#fff;border:1px solid var(--color-border);border-bottom-left-radius:var(--radius-base);border-right:0;border-top-left-radius:var(--radius-base);box-shadow:var(--shadow-lg);color:var(--color-text-dark);max-width:100%;overflow:hidden;padding:2em 1em 1em;width:var(--width-base)}.tidy-feedback-draggable-handle{background-color:var(--color-gray-100);border:none;border-top-left-radius:var(--radius-base);border-top-right-radius:var(--radius-base);cursor:move;display:flex;flex-direction:column;gap:1px;height:1em;left:0;place-content:center;place-items:center;position:absolute;top:0;width:100%}.tidy-feedback-draggable-handle span{border-bottom:1px solid var(--color-border);width:2em}.tidy-feedback-message-wrapper{z-index:var(--z-index-messages)}:root{--color-text-light:#fff;--color-text-dark:#000;--color-gray-100:#f2f2f3;--color-gray-200:#d8d7db;--color-gray-300:#bebcc2;--color-gray-400:#a4a1aa;--color-gray-500:#898792;--color-gray-600:#6f6d78;--color-gray-700:#57555e;--color-gray-800:#3e3d43;--color-gray-900:#252428;--color-border:var(--color-gray-300);--color-primary:#4f35b6;--color-primary-300:#3e298e;--color-primary-700:#6a51cd;--color-danger:#b63535;--color-danger-100:#3f1212;--color-danger-300:#8e2929;--color-danger-700:#e3a0a0;--color-danger-900:#faefef;--color-warning:#b68035;--color-warning-100:#3f2d12;--color-warning-300:#8e6429;--color-warning-700:#e3c7a0;--color-warning-900:#faf6ef;--color-info:#35a7b6;--color-info-100:#123a3f;--color-info-300:#29838e;--color-info-700:#a0dce3;--color-info-900:#eff9fa;--color-success:#35b660;--color-success-100:#123f21;--color-success-300:#298e4b;--color-success-700:#a0e3b7;--color-success-900:#effaf3;--font-size-sm:.9em;--font-size-md:1.1em;--font-size-lg:1.2em;--shadow-base:0 2px 4px rgba(0,0,0,.1);--shadow-lg:0 4px 8px rgba(0,0,0,.2);--position-top:5vh;--width-base:20em;--radius-base:4px;--spacer-xs:.25em;--spacer-sm:.5em;--spacer-md:1em;--spacer-lg:2em;--z-index-region:10000;--z-index-form:10001;--z-index-messages:10002;--transform-colors-out:color .2s ease-in,background-color .2s ease-in,border-color .2s ease-in;--transform-colors-in:color .4s ease-in-out,background-color .2s ease-in-out,border-color .2s ease-in-out}#tidy-feedback-region{position:fixed;z-index:var(--z-index-region)}#tidy-feedback-region .resizable{inset:0;position:absolute}#tidy-feedback-region .resizable .resizers{border:2px dashed var(--color-primary);box-sizing:border-box;cursor:move;height:100%;width:100%}#tidy-feedback-region .resizable .resizer{--resizer-offset:-4px;background:#fff;border:2px solid var(--color-primary);border-radius:50%;height:12px;position:absolute;width:12px}#tidy-feedback-region .resizable .resizer.top-left{cursor:nwse-resize;left:var(--resizer-offset);top:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.top-right{cursor:nesw-resize;right:var(--resizer-offset);top:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.bottom-left{bottom:var(--resizer-offset);cursor:nesw-resize;left:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.bottom-right{bottom:var(--resizer-offset);cursor:nwse-resize;right:var(--resizer-offset)}#tidy-feedback-region .overlays>div{background:var(--color-primary);color:transparent;opacity:.1;position:fixed}#tidy-feedback-region .overlays .top{left:0;right:0;top:0}#tidy-feedback-region .overlays .left{bottom:0;left:0;top:0}#tidy-feedback-region .overlays .right{bottom:0;right:0;top:0}#tidy-feedback-region .overlays .bottom{bottom:0;left:0;right:0} + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#3634a3;--bs-secondary-text-emphasis:#212233;--bs-success-text-emphasis:#0f5722;--bs-info-text-emphasis:#184c77;--bs-warning-text-emphasis:#764705;--bs-danger-text-emphasis:#671414;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#343a40;--bs-primary-bg-subtle:#cfc7f3;--bs-secondary-bg-subtle:#ced2d8;--bs-success-bg-subtle:#cbedd6;--bs-info-bg-subtle:#c0e6ff;--bs-warning-bg-subtle:#feecc5;--bs-danger-bg-subtle:#f9d4d4;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9d92e6;--bs-secondary-border-subtle:#9da5b1;--bs-success-border-subtle:#96dbad;--bs-info-border-subtle:#80c6ff;--bs-warning-border-subtle:#fcd88a;--bs-danger-border-subtle:#f2a9a9;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33,37,41,.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(37,43,54,.38);--bs-tertiary-color-rgb:37,42.92,54.02;--bs-tertiary-bg:rgba(33,37,41,.75);--bs-tertiary-bg-rgb:33,37,41;--bs-body-color-dark:#dee2e6;--bs-body-color-rgb-dark:222,226,230;--bs-body-bg-dark:#212529;--bs-body-bg-rgb-dark:33,37,41;--bs-emphasis-color-dark:#fff;--bs-emphasis-color-rgb-dark:255,255,255;--bs-secondary-color-dark:rgba(222,226,230,.75);--bs-secondary-color-rgb-dark:222,226,230;--bs-secondary-bg-dark:#343a40;--bs-secondary-bg-rgb-dark:52,58,64;--bs-tertiary-color-dark:rgba(222,226,230,.5);--bs-tertiary-color-rgb-dark:222,226,230;--bs-tertiary-bg-dark:#2b3035;--bs-tertiary-bg-rgb-dark:42.5,47.5,52.5;--bs-high-emphasis:rgba(37,43,54,.95);--bs-medium-emphasis:rgba(37,43,54,.681);--bs-disabled:rgba(37,43,54,.38);--bs-high-emphasis-inverse:hsla(0,0%,100%,.87);--bs-medium-emphasis-inverse:hsla(0,0%,100%,.6);--bs-disabled-inverse:hsla(0,0%,100%,.38);--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10.4,88,202.4;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem rgba(0,0,0,.15);--bs-box-shadow-sm:0 .125rem .25rem rgba(0,0,0,.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0,0,0,.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0,0,0,.075);--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:rgba(13,110,253,.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}img{vertical-align:middle}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button{font-family:inherit;font-size:inherit;line-height:inherit;margin:0;text-transform:none}[role=button]{cursor:pointer}[type=button],[type=reset],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{-webkit-appearance:button;font:inherit}[hidden]{display:none!important}.container{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-left:auto;margin-right:auto;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}@media (min-width:1400px){.container{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px;--bs-mobile-breakpoint:lg}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media (min-width:768px){.col-md-6{flex:0 0 auto;width:50%}.offset-md-3{margin-inline-start:25%}}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 hsla(0,0%,100%,.15),0 1px 1px rgba(0,0,0,.075);--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);background-color:var(--bs-btn-bg);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);color:var(--bs-btn-color);cursor:pointer;display:inline-block;font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);color:var(--bs-btn-hover-color)}.btn:focus-visible{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);color:var(--bs-btn-hover-color);outline:0}.btn:first-child:active,:not(.btn-check)+.btn:active{background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color);color:var(--bs-btn-active-color)}.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled{background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);color:var(--bs-btn-disabled-color);opacity:var(--bs-btn-disabled-opacity);pointer-events:none}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);color:var(--bs-alert-color);margin-bottom:var(--bs-alert-margin-bottom);padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);position:relative}.alert-dismissible{padding-inline-end:3rem}.alert-dismissible .btn-close{inset-inline-end:0;padding:1.25rem 1rem;position:absolute;top:0;z-index:2}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3E%3C/svg%3E");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem rgba(13,110,253,.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;box-sizing:content-box;filter:var(--bs-btn-close-filter);height:1em;opacity:var(--bs-btn-close-opacity);padding:.25em;width:1em}.btn-close,.btn-close:hover{color:var(--bs-btn-close-color)}.btn-close:hover{opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close:disabled{opacity:var(--bs-btn-close-disabled-opacity);pointer-events:none;-webkit-user-select:none;user-select:none}:root{--bs-btn-close-filter: ;--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }@keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.placeholder{background-color:currentcolor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.placeholder.btn:before{content:"";display:inline-block}@keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.position-fixed{position:fixed!important}.top-0{top:0!important}.mt-3{margin-top:1rem!important}button{border-radius:var(--radius-base);padding:var(--spacer-sm) var(--spacer-md)}button,button:hover{transition:var(--transform-colors-in)}button.btn-submit{background-color:var(--color-primary);border:1px solid var(--color-primary-700);color:var(--color-text-light)}button.btn-submit:hover{background-color:var(--color-primary-700);color:var(--color-text-light)}button.btn-cancel{background-color:var(--color-gray-100);border:1px solid var(--color-gray-300);color:var(--color-text-dark)}button.btn-cancel:hover{background-color:var(--color-gray-300)}.tidy-feedback-start{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;transform:rotate(-90deg);transform-origin:right bottom}.tidy-feedback-form,.tidy-feedback-start{position:fixed;right:0;top:var(--position-top);z-index:var(--z-index-form)}.tidy-feedback-form{background-color:#fff;border:1px solid var(--color-border);border-bottom-left-radius:var(--radius-base);border-right:0;border-top-left-radius:var(--radius-base);box-shadow:var(--shadow-lg);color:var(--color-text-dark);max-width:100%;overflow:hidden;padding:2em 1em 1em;width:var(--width-base)}.tidy-feedback-draggable-handle{background-color:var(--color-gray-100);border:none;border-top-left-radius:var(--radius-base);border-top-right-radius:var(--radius-base);cursor:move;display:flex;flex-direction:column;gap:1px;height:1em;left:0;place-content:center;place-items:center;position:absolute;top:0;width:100%}.tidy-feedback-draggable-handle span{border-bottom:1px solid var(--color-border);width:2em}.tidy-feedback-message-wrapper{z-index:var(--z-index-messages)}:root{--color-text-light:#fff;--color-text-dark:#000;--color-gray-100:#f2f2f3;--color-gray-200:#d8d7db;--color-gray-300:#bebcc2;--color-gray-400:#a4a1aa;--color-gray-500:#898792;--color-gray-600:#6f6d78;--color-gray-700:#57555e;--color-gray-800:#3e3d43;--color-gray-900:#252428;--color-border:var(--color-gray-300);--color-primary:#4f35b6;--color-primary-300:#3e298e;--color-primary-700:#6a51cd;--color-danger:#b63535;--color-danger-100:#3f1212;--color-danger-300:#8e2929;--color-danger-700:#e3a0a0;--color-danger-900:#faefef;--color-warning:#b68035;--color-warning-100:#3f2d12;--color-warning-300:#8e6429;--color-warning-700:#e3c7a0;--color-warning-900:#faf6ef;--color-info:#35a7b6;--color-info-100:#123a3f;--color-info-300:#29838e;--color-info-700:#a0dce3;--color-info-900:#eff9fa;--color-success:#35b660;--color-success-100:#123f21;--color-success-300:#298e4b;--color-success-700:#a0e3b7;--color-success-900:#effaf3;--font-size-sm:.9em;--font-size-md:1.1em;--font-size-lg:1.2em;--shadow-base:0 2px 4px rgba(0,0,0,.1);--shadow-lg:0 4px 8px rgba(0,0,0,.2);--position-top:5vh;--width-base:20em;--radius-base:4px;--spacer-xs:.25em;--spacer-sm:.5em;--spacer-md:1em;--spacer-lg:2em;--z-index-region:10000;--z-index-form:10001;--z-index-messages:10002;--transform-colors-out:color .2s ease-in,background-color .2s ease-in,border-color .2s ease-in;--transform-colors-in:color .4s ease-in-out,background-color .2s ease-in-out,border-color .2s ease-in-out}#tidy-feedback-region{position:fixed;z-index:var(--z-index-region)}#tidy-feedback-region .resizable{inset:0;position:absolute}#tidy-feedback-region .resizable .resizers{border:2px dashed var(--color-primary);box-sizing:border-box;cursor:move;height:100%;width:100%}#tidy-feedback-region .resizable .resizer{--resizer-offset:-4px;background:#fff;border:2px solid var(--color-primary);border-radius:50%;height:12px;position:absolute;width:12px}#tidy-feedback-region .resizable .resizer.top-left{cursor:nwse-resize;left:var(--resizer-offset);top:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.top-right{cursor:nesw-resize;right:var(--resizer-offset);top:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.bottom-left{bottom:var(--resizer-offset);cursor:nesw-resize;left:var(--resizer-offset)}#tidy-feedback-region .resizable .resizer.bottom-right{bottom:var(--resizer-offset);cursor:nwse-resize;right:var(--resizer-offset)}#tidy-feedback-region .overlays>div{background:var(--color-primary);color:transparent;opacity:.1;position:fixed}#tidy-feedback-region .overlays .top{left:0;right:0;top:0}#tidy-feedback-region .overlays .left{bottom:0;left:0;top:0}#tidy-feedback-region .overlays .right{bottom:0;right:0;top:0}#tidy-feedback-region .overlays .bottom{bottom:0;left:0;right:0} diff --git a/build/standalone/tidy_feedback.min.js b/build/standalone/tidy_feedback.min.js index e8cd40f..ee7cdf9 100644 --- a/build/standalone/tidy_feedback.min.js +++ b/build/standalone/tidy_feedback.min.js @@ -1,3 +1,3 @@ -(function(le){typeof define=="function"&&define.amd?define(le):le()})(function(){"use strict";var se=Array.isArray,Un=Array.prototype.indexOf,ce=Array.from,ue=Object.defineProperty,Dt=Object.getOwnPropertyDescriptor,Bn=Object.prototype,Vn=Array.prototype,zn=Object.getPrototypeOf,Ue=Object.isExtensible;const jt=32,fe=64,ot=256,de=512,z=1024,ft=2048,xt=4096,lt=8192,It=16384,pe=32768,he=65536,Hn=1<<17,Be=1<<19,Yn=1<<20,ge=1<<21,Xn=1<<22,St=1<<23,Kt=Symbol("$state"),me=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},U=Symbol();function Ve(t){return t===this.v}function ze(t){return e=t,n=this.v,!(e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function");var e,n}let it=null;function Gt(t){it=t}function He(t,e=!1,n){it={p:it,c:null,e:null,s:t,x:null,l:null}}function Ye(t){var e=it,n=e.e;if(n!==null)for(var i of(e.e=null,n))un(i);return it=e.p,{}}const Jn=new WeakMap;function ve(t,e){for(;e!==null;){if(128&e.f)try{return void e.b.error(t)}catch(n){t=n}e=e.parent}throw t instanceof Error&&Xe(t),t}function Xe(t){const e=Jn.get(t);e&&(ue(t,"message",{value:e.message}),ue(t,"stack",{value:e.stack}))}let Qt=[];function Kn(){var t=Qt;Qt=[],(function(e){for(var n=0;n{try{var s=t()}catch(f){s=Promise.reject(f)}var c=()=>s;l=o?.then(c,c)??Promise.resolve(s),o=l;var u=q,d=i.pending;a&&(i.update_pending_count(1),d||u.increment());const p=(f,y=void 0)=>{o=null,d||u.activate(),y?y!==me&&(r.f|=St,xe(r,y)):((r.f&St)!==0&&(r.f^=St),xe(r,f)),a&&(i.update_pending_count(-1),d||u.decrement()),Qe()};if(l.then(p,f=>p(null,f||"unknown")),u)return()=>{queueMicrotask(()=>u.neuter())}}),new Promise(s=>{(function c(u){function d(){u===l?s(r):c(l)}u.then(d,d)})(l)})}function Ke(t){var e=t.effects;if(e!==null){t.effects=null;for(var n=0;nQn(d))).then(d=>{a?.activate(),c();try{n([...t.map(i),...d])}catch(p){(s.f&It)===0&&ve(p,s)}a?.deactivate(),Qe()}).catch(d=>{u.error(d)})}else n(t.map(i))}function Qe(){mt(null),ct(null),Gt(null)}const Ot=new Set;let q=null,Mt=null,Ze=new Set,Zt=[];function tn(){const t=Zt.shift();Zt.length>0&&queueMicrotask(tn),t()}let Wt=[],we=null,be=!1;class At{current=new Map;#o=new Map;#i=new Set;#t=0;#c=null;#u=!1;#n=[];#a=[];#r=[];#e=[];#l=[];#f=[];#d=[];skipped_effects=new Set;process(e){Wt=[];var n=null;if(Ot.size>1){n=new Map,Mt=new Map;for(const[r,o]of this.current)n.set(r,{v:r.v,wv:r.wv}),r.v=o;for(const r of Ot)if(r!==this)for(const[o,a]of r.#o)n.has(o)||(n.set(o,{v:o.v,wv:o.wv}),o.v=a)}for(const r of e)this.#h(r);if(this.#n.length===0&&this.#t===0){this.#p();var i=this.#r,l=this.#e;this.#r=[],this.#e=[],this.#l=[],q=null,en(i),en(l),q===null?q=this:Ot.delete(this),this.#c?.resolve()}else this.#s(this.#r),this.#s(this.#e),this.#s(this.#l);if(n){for(const[r,{v:o,wv:a}]of n)r.wv<=a&&(r.v=o);Mt=null}for(const r of this.#n)zt(r);for(const r of this.#a)zt(r);this.#n=[],this.#a=[]}#h(e){e.f^=z;for(var n=e.first;n!==null;){var i=n.f,l=!!(96&i);if(!(l&&(i&z)!==0||(i<)!==0||this.skipped_effects.has(n))&&n.fn!==null){l?n.f^=z:(i&z)===0&&(4&i?this.#e.push(n):(i&Xn)!==0?(n.b?.pending?this.#a:this.#n).push(n):te(n)&&(16&n.f&&this.#l.push(n),zt(n)));var r=n.first;if(r!==null){n=r;continue}}var o=n.parent;for(n=n.next;n===null&&o!==null;)n=o.next,o=o.parent}}#s(e){for(const n of e)((n.f&ft)!==0?this.#f:this.#d).push(n),Z(n,z);e.length=0}capture(e,n){this.#o.has(e)||this.#o.set(e,n),this.current.set(e,e.v)}activate(){q=this}deactivate(){q=null;for(const e of Ze)if(Ze.delete(e),e(),q!==null)break}neuter(){this.#u=!0}flush(){Wt.length>0?(function(){var e=Pt;be=!0;try{var n=0;for(vn(!0);Wt.length>0;){var i=At.ensure();n++>1e3&&tr(),i.process(Wt),Ct.clear()}}finally{be=!1,vn(e),we=null}})():this.#p(),q===this&&(this.#t===0&&Ot.delete(this),this.deactivate())}#p(){if(!this.#u)for(const e of this.#i)e();this.#i.clear()}increment(){this.#t+=1}decrement(){if(this.#t-=1,this.#t===0){for(const e of this.#f)Z(e,ft),Et(e);for(const e of this.#d)Z(e,xt),Et(e);this.#r=[],this.#e=[],this.flush()}else this.deactivate()}add_callback(e){this.#i.add(e)}settled(){return(this.#c??={promise:new Promise((i,l)=>{e=i,n=l}),resolve:e,reject:n}).promise;var e,n}static ensure(){if(q===null){const e=q=new At;Ot.add(q),At.enqueue(()=>{q===e&&e.flush()})}return q}static enqueue(e){Zt.length===0&&queueMicrotask(tn),Zt.unshift(e)}}function tr(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(t){ve(t,we)}}function en(t){var e=t.length;if(e!==0){for(var n=0;nl&&(i.f&Yn)!==0)break}}for(;n{if(_t===r)return a();var s=L,c=_t;ct(null),bn(r);var u=a();return ct(s),bn(c),u};return i&&n.set("length",tt(t.length)),new Proxy(t,{defineProperty(a,s,c){"value"in c&&c.configurable!==!1&&c.enumerable!==!1&&c.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var u=n.get(s);return u===void 0?u=o(()=>{var d=tt(c.value);return n.set(s,d),d}):H(u,c.value,!0),!0},deleteProperty(a,s){var c=n.get(s);if(c===void 0){if(s in a){const u=o(()=>tt(U));n.set(s,u),Se(l)}}else H(c,U),Se(l);return!0},get(a,s,c){if(s===Kt)return t;var u=n.get(s),d=s in a;if(u!==void 0||d&&!Dt(a,s)?.writable||(u=o(()=>tt(qt(d?a[s]:U))),n.set(s,u)),u!==void 0){var p=Q(u);return p===U?void 0:p}return Reflect.get(a,s,c)},getOwnPropertyDescriptor(a,s){var c=Reflect.getOwnPropertyDescriptor(a,s);if(c&&"value"in c){var u=n.get(s);u&&(c.value=Q(u))}else if(c===void 0){var d=n.get(s),p=d?.v;if(d!==void 0&&p!==U)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return c},has(a,s){if(s===Kt)return!0;var c=n.get(s),u=c!==void 0&&c.v!==U||Reflect.has(a,s);return(c!==void 0||R!==null&&(!u||Dt(a,s)?.writable))&&(c===void 0&&(c=o(()=>tt(u?qt(a[s]):U)),n.set(s,c)),Q(c)===U)?!1:u},set(a,s,c,u){var d=n.get(s),p=s in a;if(i&&s==="length")for(var f=c;ftt(U)),n.set(f+"",y))}d===void 0?p&&!Dt(a,s)?.writable||(H(d=o(()=>tt(void 0)),qt(c)),n.set(s,d)):(p=d.v!==U,H(d,o(()=>qt(c))));var m=Reflect.getOwnPropertyDescriptor(a,s);if(m?.set&&m.set.call(u,c),!p){if(i&&typeof s=="string"){var b=n.get("length"),x=Number(s);Number.isInteger(x)&&x>=b.v&&H(b,x+1)}Se(l)}return!0},ownKeys(a){Q(l);var s=Reflect.ownKeys(a).filter(d=>{var p=n.get(d);return p===void 0||p.v!==U});for(var[c,u]of n)u.v===U||c in a||s.push(c);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}var rn,on,an,ln;function Ee(t=""){return document.createTextNode(t)}function sn(t){return an.call(t)}function Ce(t){return ln.call(t)}function at(t,e){return sn(t)}function kt(t,e=1,n=!1){let i=t;for(;e--;)i=Ce(i);return i}function cn(t){var e=L,n=R;ct(null),mt(null);try{return t()}finally{ct(e),mt(n)}}function er(t){R===null&&L===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),L!==null&&(L.f&ot)!==0&&R===null&&(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})(),Lt&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function gt(t,e,n,i=!0){var l=R;l!==null&&(l.f<)!==0&&(t|=lt);var r={ctx:it,deps:null,nodes_start:null,nodes_end:null,f:t|ft,first:null,fn:e,last:null,next:null,parent:l,b:l&&l.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(n)try{zt(r),r.f|=pe}catch(a){throw dt(r),a}else e!==null&&Et(r);if(!(n&&r.deps===null&&r.first===null&&r.nodes_start===null&&r.teardown===null&&(r.f&Be)===0)&&i&&(l!==null&&(function(a,s){var c=s.last;c===null?s.last=s.first=a:(c.next=a,a.prev=c,s.last=a)})(r,l),L!==null&&2&L.f&&(t&fe)===0)){var o=L;(o.effects??=[]).push(r)}return r}function un(t){return gt(1048580,t,!1)}function Ut(t,e=[],n=[]){Zn(e,n,i=>{gt(8,()=>t(...i.map(Q)),!0)})}function fn(t,e=0){return gt(16|e,t,!0)}function Bt(t,e=!0){return gt(jt,t,!0,e)}function dn(t){var e=t.teardown;if(e!==null){const n=Lt,i=L;yn(!0),ct(null);try{e.call(null)}finally{yn(n),ct(i)}}}function pn(t,e=!1){var n=t.first;for(t.first=t.last=null;n!==null;){const l=n.ac;l!==null&&cn(()=>{l.abort(me)});var i=n.next;(n.f&fe)!==0?n.parent=null:dt(n,e),n=i}}function dt(t,e=!0){var n=!1;(e||262144&t.f)&&t.nodes_start!==null&&t.nodes_end!==null&&((function(r,o){for(;r!==null;){var a=r===o?null:Ce(r);r.remove(),r=a}})(t.nodes_start,t.nodes_end),n=!0),pn(t,e&&!n),ee(t,0),Z(t,It);var i=t.transitions;if(i!==null)for(const r of i)r.stop();dn(t);var l=t.parent;l!==null&&l.first!==null&&hn(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes_start=t.nodes_end=t.ac=null}function hn(t){var e=t.parent,n=t.prev,i=t.next;n!==null&&(n.next=i),i!==null&&(i.prev=n),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=n))}function ke(t,e){var n=[];_e(t,n,!0),gn(n,()=>{dt(t),e&&e()})}function gn(t,e){var n=t.length;if(n>0){var i=()=>--n||e();for(var l of t)l.out(i)}else e()}function _e(t,e,n){if((t.f<)===0){if(t.f^=lt,t.transitions!==null)for(const r of t.transitions)(r.is_global||n)&&e.push(r);for(var i=t.first;i!==null;){var l=i.next;_e(i,e,((i.f&he)!==0||(i.f&jt)!==0)&&n),i=l}}}function Ne(t){mn(t,!0)}function mn(t,e){if((t.f<)!==0){t.f^=lt,(t.f&z)===0&&(Z(t,ft),Et(t));for(var n=t.first;n!==null;){var i=n.next;mn(n,((n.f&he)!==0||(n.f&jt)!==0)&&e),n=i}if(t.transitions!==null)for(const l of t.transitions)(l.is_global||e)&&l.in()}}let Pt=!1;function vn(t){Pt=t}let Lt=!1;function yn(t){Lt=t}let L=null,st=!1;function ct(t){L=t}let R=null;function mt(t){R=t}let pt=null,Y=null,G=0,et=null,wn=1,Vt=0,_t=Vt;function bn(t){_t=t}let vt=!1;function xn(){return++wn}function te(t){var e=t.f;if((e&ft)!==0)return!0;if((e&xt)!==0){var n=t.deps,i=(e&ot)!==0;if(n!==null){var l,r,o=(e&de)!==0,a=i&&R!==null&&!vt,s=n.length;if((o||a)&&(R===null||(R.f&It)===0)){var c=t,u=c.parent;for(l=0;lt.wv)return!0}i&&(R===null||vt)||Z(t,z)}return!1}function Sn(t,e,n=!0){var i=t.reactions;if(i!==null&&!pt?.includes(t))for(var l=0;l{t.ac.abort(me)}),t.ac=null);try{t.f|=ge;var d=(0,t.fn)(),p=t.deps;if(Y!==null){var f;if(ee(t,G),p!==null&&G>0)for(p.length=G+Y.length,f=0;fr||n});var u=L,d=R;ct(null),mt(null);try{for(var p,f=[];r!==null;){var y=r.assignedSlot||r.parentNode||r.host||null;try{var m=r["__"+i];if(m!=null&&(!r.disabled||t.target===r))if(se(m)){var[b,...x]=m;b.apply(r,[t,...x])}else m.call(r,t)}catch($){p?f.push($):p=$}if(t.cancelBubble||y===e||y===null)break;r=y}if(p){for(let $ of f)queueMicrotask(()=>{throw $});throw p}}finally{t.__root=e,delete t.currentTarget,ct(u),mt(d)}}}function Ht(t,e){var n,i=!!(2&e),l=!t.startsWith("");return()=>{var r,o;n===void 0&&(r=l?t:""+t,(o=document.createElement("template")).innerHTML=r.replaceAll("",""),n=sn(n=o.content));var a=i||on?document.importNode(n,!0):n.cloneNode(!0);return(function(s,c){var u=R;u.nodes_start===null&&(u.nodes_start=s,u.nodes_end=c)})(a,a),a}}function Yt(t,e){t!==null&&t.before(e)}function re(t,e){var n=e==null?"":typeof e=="object"?e+"":e;n!==(t.__t??=t.nodeValue)&&(t.__t=n,t.nodeValue=n+"")}function ar(t,e){return(function(n,{target:i,anchor:l,props:r={},events:o,context:a,intro:s=!0}){(function(){if(rn===void 0){rn=window,on=/Firefox/.test(navigator.userAgent);var f=Element.prototype,y=Node.prototype,m=Text.prototype;an=Dt(y,"firstChild").get,ln=Dt(y,"nextSibling").get,Ue(f)&&(f.__click=void 0,f.__className=void 0,f.__attributes=null,f.__style=void 0,f.__e=void 0),Ue(m)&&(m.__t=void 0)}})();var c=new Set,u=f=>{for(var y=0;ynew Promise(b=>{m.outro?ke(y,()=>{dt(y),b(void 0)}):(dt(y),b(void 0))})})(()=>{var f=l??i.appendChild(Ee());return Bt(()=>{a&&(He({}),it.c=a),o&&(r.$$events=o),d=n(f,r)||{},a&&Ye()}),()=>{for(var y of c){i.removeEventListener(y,ne);var m=Rt.get(y);--m===0?(document.removeEventListener(y,ne),Rt.delete(y)):Rt.set(y,m)}$e.delete(u),f!==l&&f.parentNode?.removeChild(f)}});return Me.set(d,p),d})(t,e)}const Rt=new Map;let Me=new WeakMap;function Nn(t,e,n=!1){var i=t,l=null,r=null,o=U,a=!1;const s=(p,f=!0)=>{a=!0,d(f,p)};var c=null;function u(){c!==null&&(c.lastChild.remove(),i.before(c),c=null);var p=o?l:r,f=o?r:l;p&&Ne(p),f&&ke(f,()=>{o?r=null:l=null})}const d=(p,f)=>{if(o!==(o=p)){var y=!1,m=i;o?l??=f&&Bt(()=>f(m)):r??=f&&Bt(()=>f(m)),u()}};fn(()=>{a=!1,e(s),a||d(null,null)},n?he:0)}function $n(t,e){return e}function Mn(t,e,n,i,l,r=null){var o,a={flags:e,items:new Map,first:null};o=t.appendChild(Ee());var s,c,u=null,d=!1,p=new Map,f=(function(m){const b=Je(m);return b.equals=ze,b})(()=>{var m=n();return se(m)?m:m==null?[]:ce(m)});function y(){(function(m,b,x,$,k,w,E,_,j){var P,I,T,N,h,M=b.length,A=x.items,v=x.first,S=v,C=null,D=[],O=[];for(h=0;h0&&(function($t,ht,bt){for(var Jt=$t.items,Tt=[],W=ht.length,X=0;X0&&Tt.length===0&&bt!==null;if(J){var qn=bt.parentNode;qn.textContent="",qn.append(bt),Jt.clear(),ut($t,ht[0].prev,ht[W-1].next)}gn(Tt,()=>{for(var qe=0;qer(o)):u!==null&&ke(u,()=>{u=null}))}fn(()=>{c??=R;var m=(s=Q(f)).length;d&&m===0||(d=m===0,y(),Q(f))})}function lr(t,e,n,i,l,r,o,a,s,c,u){var d=1&s?16&s?Ft(l):(function(y,m=!1){const b=Ft(y);return m||(b.equals=ze),b})(l,!1,!1):l,p=2&s?Ft(o):o,f={i:p,v:d,k:r,a:null,e:null,prev:n,next:i};try{return t===null&&document.createDocumentFragment().append(t=Ee()),f.e=Bt(()=>a(t,d,p,c),!1),f.e.prev=n&&n.e,f.e.next=i&&i.e,n===null?u||(e.first=f):(n.next=f,n.e.next=f.e),i!==null&&(i.prev=f,i.e.prev=f.e),f}finally{}}function Ae(t,e,n){for(var i=t.next?t.next.e.nodes_start:n,l=e?e.e.nodes_start:n,r=t.e.nodes_start;r!==null&&r!==i;){var o=Ce(r);l.before(r),r=o}}function ut(t,e,n){e===null?t.first=n:(e.next=n,e.e.next=n&&n.e),n!==null&&(n.prev=e,n.e.prev=e&&e.e)}function An(t){var e,n,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var l=t.length;for(e=0;e{var r,o;return(function(a,s=0){gt(8|s,a,!0)})(()=>{r=o,o=[],(function(a){var s=st;try{return st=!0,a()}finally{st=s}})(()=>{t!==n(...o)&&(e(t,...o),r&&Pn(n(...r),t)&&e(null,...r))})}),()=>{var a;a=()=>{o&&Pn(n(...o),t)&&e(null,...o)},Qt.length===0&&queueMicrotask(Kn),Qt.push(a)}},gt(4,l,!1),t}typeof window<"u"&&((window.__svelte??={}).v??=new Set).add("5");var g={image:new Map,background:new Map,resource:new Map,defaultStyle:new Map,baseStyle:new Map,computedStyle:new WeakMap,font:new Set,snapshot:new WeakMap,snapshotKey:new Map,preStyleMap:new Map,preStyle:new WeakMap,preNodeMap:new Map,reset:function(){g.computedStyle=new WeakMap,g.snapshot=new WeakMap,g.snapshotKey.clear(),g.preStyleMap.clear(),g.preStyle=new WeakMap,g.preNodeMap.clear()}},cr=new Set(["-webkit-locale"]);function Le(t,e,n=!1){const i=[],l=(function(r){if(g.defaultStyle.has(r))return g.defaultStyle.get(r);if(new Set(["script","style","meta","link","noscript","template","defs","symbol","title","metadata","desc"]).has(r)){const u={};return g.defaultStyle.set(r,u),u}let o=document.getElementById("snapdom-sandbox");o||(o=document.createElement("div"),o.id="snapdom-sandbox",o.style.position="absolute",o.style.left="-9999px",o.style.top="-9999px",o.style.width="0",o.style.height="0",o.style.overflow="hidden",document.body.appendChild(o));const a=document.createElement(r);a.style.all="initial",o.appendChild(a);const s=getComputedStyle(a),c={};for(let u of s)c[u]=s.getPropertyValue(u);return o.removeChild(a),g.defaultStyle.set(r,c),c})(e);for(let[r,o]of Object.entries(t))if(!cr.has(r))if(n){const a=l[r];o&&o!==a&&i.push(`${r}:${o}`)}else o&&i.push(`${r}:${o}`);return i.sort().join(";")}async function Rn(t,e={}){const n=Te(t);if(/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t),n){const i=je(n);if(g.background.has(i))return e.skipInline?void 0:`url(${g.background.get(i)})`;{const l=await De(i,{useProxy:e.useProxy});return g.background.set(i,l),e.skipInline?void 0:`url("${l}")`}}return t}function Xt(t,{fast:e=!1}={}){if(e)return t();"requestIdleCallback"in window?requestIdleCallback(t,{timeout:50}):setTimeout(t,1)}function Re(t,e=null){if(!(t instanceof Element))return window.getComputedStyle(t,e);let n=g.computedStyle.get(t);if(n||(n=new Map,g.computedStyle.set(t,n)),!n.has(e)){const i=window.getComputedStyle(t,e);n.set(e,i)}return n.get(e)}function ur(t){let e=t.replace(/^['"]|['"]$/g,"");if(e.startsWith("\\"))try{return String.fromCharCode(parseInt(e.replace("\\",""),16))}catch{return e}return e}function Te(t){const e=t.match(/url\((['"]?)(.*?)(\1)\)/);if(!e)return null;const n=e[2].trim();return n.startsWith("#")?null:n}function De(t,{timeout:e=3e3,useProxy:n=""}={}){function i(o){try{return new URL(o,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch{return"anonymous"}}async function l(o){const a=s=>fetch(s,{mode:"cors",credentials:i(s)==="use-credentials"?"include":"omit"}).then(c=>c.blob()).then(c=>new Promise((u,d)=>{const p=new FileReader;p.onloadend=()=>{const f=p.result;typeof f=="string"&&f.startsWith("data:image/")?u(f):d(new Error("Invalid image data URL"))},p.onerror=()=>d(new Error("FileReader error")),p.readAsDataURL(c)}));try{return await a(o)}catch{if(!n||typeof n!="string")throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided");{const c=n.replace(/\/$/,"")+je(o);try{return await a(c)}catch{throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}}}const r=i(t);return g.image.has(t)?Promise.resolve(g.image.get(t)):t.startsWith("data:image/")?(g.image.set(t,t),Promise.resolve(t)):/\.svg(\?.*)?$/i.test(t)?(async()=>{try{const o=await fetch(t,{mode:"cors",credentials:r==="use-credentials"?"include":"omit"}),a=await o.text(),s=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(a)}`;return g.image.set(t,s),s}catch{return l(t)}})():new Promise((o,a)=>{const s=setTimeout(()=>{a(new Error("[SnapDOM - fetchImage] Image load timed out"))},e),c=new Image;c.crossOrigin=r,c.onload=async()=>{clearTimeout(s);try{await c.decode();const u=document.createElement("canvas");u.width=c.width,u.height=c.height,u.getContext("2d").drawImage(c,0,0,u.width,u.height);const d=u.toDataURL("image/png");g.image.set(t,d),o(d)}catch{try{const u=await l(t);g.image.set(t,u),o(u)}catch(u){a(u)}}},c.onerror=async()=>{clearTimeout(s);try{const u=await l(t);g.image.set(t,u),o(u)}catch(u){a(u)}},c.src=t})}function Tn(t){const e={};for(let n of t)e[n]=t.getPropertyValue(n);return e}function je(t){if(/%[0-9A-Fa-f]{2}/.test(t))return t;try{return encodeURI(t)}catch{return t}}function Dn(t){const e=[];let n=0,i=0;for(let l=0;la.localeCompare(s)).map(([a,s])=>`${a}:${s}`).join(";");if(g.snapshotKey.has(r))return void g.preStyleMap.set(e,g.snapshotKey.get(r));const o=Le(l,t.tagName?.toLowerCase()||"div",n);g.snapshotKey.set(r,o),g.preStyleMap.set(e,o)}function oe(t,e,n={},i){if(!t)throw new Error("Invalid node");const l=new Set;let r,o=null;if(t.nodeType===Node.TEXT_NODE||t.nodeType!==Node.ELEMENT_NODE)return t.cloneNode(!0);if(t.getAttribute("data-capture")==="exclude"){const a=document.createElement("div"),s=t.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${s.width}px;height:${s.height}px;visibility:hidden;`,a}if(n.exclude&&Array.isArray(n.exclude))for(const a of n.exclude)try{if(t.matches?.(a)){const s=document.createElement("div"),c=t.getBoundingClientRect();return s.style.cssText=`display:inline-block;width:${c.width}px;height:${c.height}px;visibility:hidden;`,s}}catch{}if(typeof n.filter=="function")try{if(!n.filter(t,i||t)){const a=document.createElement("div"),s=t.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${s.width}px;height:${s.height}px;visibility:hidden;`,a}}catch{}if(t.tagName==="IFRAME"){const a=document.createElement("div");return a.style.cssText=`width:${t.offsetWidth}px;height:${t.offsetHeight}px;background-image:repeating-linear-gradient(45deg,#ddd,#ddd 5px,#f9f9f9 5px,#f9f9f9 10px);display:flex;align-items:center;justify-content:center;font-size:12px;color:#555;border:1px solid #aaa;`,a}if(t.getAttribute("data-capture")==="placeholder"){const a=t.cloneNode(!1);g.preNodeMap.set(a,t),Ie(t,a,e);const s=document.createElement("div");return s.textContent=t.getAttribute("data-placeholder-text")||"",s.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",a.appendChild(s),a}if(t.tagName==="CANVAS"){const a=t.toDataURL(),s=document.createElement("img");return s.src=a,s.width=t.width,s.height=t.height,g.preNodeMap.set(s,t),Ie(t,s,e),s}try{r=t.cloneNode(!1),g.preNodeMap.set(r,t)}catch(a){throw a}if(t instanceof HTMLTextAreaElement){r.textContent=t.value,r.value=t.value;const a=t.getBoundingClientRect();return r.style.width=`${a.width}px`,r.style.height=`${a.height}px`,r}if(t instanceof HTMLInputElement&&(r.value=t.value,r.setAttribute("value",t.value),t.checked!==void 0&&(r.checked=t.checked,t.checked&&r.setAttribute("checked",""),t.indeterminate&&(r.indeterminate=t.indeterminate))),t instanceof HTMLSelectElement&&(o=t.value),Ie(t,r,e),t.shadowRoot)if(Array.from(t.shadowRoot.querySelectorAll("slot")).length>0){for(const a of t.shadowRoot.childNodes)if(a.nodeType===Node.ELEMENT_NODE&&a.tagName==="STYLE"){const s=a.textContent||"";s.trim()&&e&&(g.preStyle||(g.preStyle=new WeakMap),g.preStyle.set(a,s))}}else{const a=document.createDocumentFragment();for(const s of t.shadowRoot.childNodes){if(s.nodeType===Node.ELEMENT_NODE&&s.tagName==="STYLE"){const u=s.textContent||"";u.trim()&&e&&(g.preStyle||(g.preStyle=new WeakMap),g.preStyle.set(s,u));continue}const c=oe(s,e,n,i||t);c&&a.appendChild(c)}r.appendChild(a)}if(t.tagName==="SLOT"){const a=t.assignedNodes?.({flatten:!0})||[],s=a.length>0?a:Array.from(t.childNodes),c=document.createDocumentFragment();for(const u of s){const d=oe(u,e,n,i||t);d&&c.appendChild(d)}return c}for(const a of t.childNodes){if(l.has(a))continue;const s=oe(a,e,n,i||t);s&&r.appendChild(s)}if(o!==null&&r instanceof HTMLSelectElement){r.value=o;for(const a of r.options)a.value===o?a.setAttribute("selected",""):a.removeAttribute("selected")}return r}var fr=[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/layui/i,/lucide/i],Oe=[];function yt(t){const e=typeof t=="string"?t:"",n=[...fr,...Oe];for(const i of n)if(i instanceof RegExp&&i.test(e))return!0;return!!(/icon/i.test(e)||/glyph/i.test(e)||/symbols/i.test(e)||/feather/i.test(e)||/fontawesome/i.test(e))}async function dr(t,e,n,i=32,l="#000"){e=e.replace(/^['"]+|['"]+$/g,"");const r=window.devicePixelRatio||1;await document.fonts.ready;const o=document.createElement("span");o.textContent=t,o.style.position="absolute",o.style.visibility="hidden",o.style.fontFamily=`"${e}"`,o.style.fontWeight=n||"normal",o.style.fontSize=`${i}px`,o.style.lineHeight="1",o.style.whiteSpace="nowrap",o.style.padding="0",o.style.margin="0",document.body.appendChild(o);const a=o.getBoundingClientRect(),s=Math.ceil(a.width),c=Math.ceil(a.height);document.body.removeChild(o);const u=document.createElement("canvas");u.width=s*r,u.height=c*r;const d=u.getContext("2d");return d.scale(r,r),d.font=n?`${n} ${i}px "${e}"`:`${i}px "${e}"`,d.textAlign="left",d.textBaseline="top",d.fillStyle=l,d.fillText(t,0,0),{dataUrl:u.toDataURL(),width:s,height:c}}function jn(t){return Array.from(document.styleSheets).some(e=>e.href===t)}function pr(t){return new Promise(e=>{if(jn(t))return e(null);const n=document.createElement("link");n.rel="stylesheet",n.href=t,n.setAttribute("data-snapdom","injected-import"),n.onload=()=>e(n),n.onerror=()=>e(null),document.head.appendChild(n)})}async function In(t,e,n){if(!(t instanceof Element&&e instanceof Element))return;for(const r of["::before","::after","::first-letter"])try{const o=Re(t,r);if(!o||typeof o[Symbol.iterator]!="function"||!(o.content!=="none"||o.backgroundImage!=="none"||o.backgroundColor!=="transparent"||o.borderStyle!=="none"&&parseFloat(o.borderWidth)!==0||o.transform&&o.transform!=="none"||o.display!=="inline"))continue;if(r==="::first-letter"){const v=getComputedStyle(t);if(!(o.color!==v.color||o.fontSize!==v.fontSize||o.fontWeight!==v.fontWeight))continue;const S=Array.from(e.childNodes).find(rt=>rt.nodeType===Node.TEXT_NODE&&rt.textContent?.trim().length>0);if(!S)continue;const C=S.textContent,D=C.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),O=D?.[0],V=C.slice(O?.length||0);if(!O||/[\uD800-\uDFFF]/.test(O))continue;const B=document.createElement("span");B.textContent=O,B.dataset.snapdomPseudo="::first-letter";const nt=Le(Tn(o),"span",n);g.preStyleMap.set(B,nt);const K=document.createTextNode(V);e.replaceChild(K,S),e.insertBefore(B,K);continue}const a=o.content,s=/counter\s*\(|counters\s*\(/.test(a)?"- ":ur(a),c=o.backgroundImage,u=o.backgroundColor,d=o.fontFamily,p=parseInt(o.fontSize)||32,f=parseInt(o.fontWeight)||!1,y=o.color||"#000",m=o.display,b=parseFloat(o.width),x=parseFloat(o.height),$=o.borderStyle,k=parseFloat(o.borderWidth),w=o.transform,E=yt(d),_=a!=="none"&&s!=="",j=c&&c!=="none",P=u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)",I=m!=="inline"&&(b>0||x>0),T=$&&$!=="none"&&k>0,N=w&&w!=="none";if(!(_||j||P||I||T||N))continue;const h=document.createElement("span");h.dataset.snapdomPseudo=r,h.style.verticalAlign="middle";const M=Le(Tn(o),"span",n);if(g.preStyleMap.set(h,M),E&&s.length===1){const{dataUrl:v,width:S,height:C}=await dr(s,d,f,p,y),D=document.createElement("img");D.src=v,D.style=`height:${p}px;width:${S/C*p}px;object-fit:contain;`,h.appendChild(D),e.dataset.snapdomHasIcon="true"}else if(s.startsWith("url(")){const v=Te(s);if(v?.trim())try{const S=document.createElement("img"),C=await De(je(v),n);S.src=C,S.style=`width:${p}px;height:auto;object-fit:contain;`,h.appendChild(S)}catch{}}else!E&&_&&(h.textContent=s);if(j)try{const v=Dn(c),S=await Promise.all(v.map(Rn));h.style.backgroundImage=S.join(", ")}catch{}if(P&&(h.style.backgroundColor=u),!(h.childNodes.length>0||h.textContent?.trim()!==""||j||P||I||T||N))continue;r==="::before"?e.insertBefore(h,e.firstChild):e.appendChild(h)}catch{}const i=Array.from(t.children),l=Array.from(e.children).filter(r=>!r.dataset.snapdomPseudo);for(let r=0;r0,f=u==="none"||parseFloat(d)===0;p&&f&&(o.style.border=`${c} solid transparent`)})(t);try{(function(o){if(!o)return;const a=new Set;if(o.querySelectorAll("use").forEach(f=>{const y=f.getAttribute("xlink:href")||f.getAttribute("href");y&&y.startsWith("#")&&a.add(y.slice(1))}),!a.size)return;const s=Array.from(document.querySelectorAll("svg > symbol, svg > defs")),c=s.filter(f=>f.tagName.toLowerCase()==="symbol"),u=s.filter(f=>f.tagName.toLowerCase()==="defs");let d=o.querySelector("svg.inline-defs-container");d||(d=document.createElementNS("http://www.w3.org/2000/svg","svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("style","position: absolute; width: 0; height: 0; overflow: hidden;"),d.classList.add("inline-defs-container"),o.insertBefore(d,o.firstChild));const p=new Set;o.querySelectorAll("symbol[id], defs > *[id]").forEach(f=>{p.add(f.id)}),a.forEach(f=>{if(p.has(f))return;const y=c.find(m=>m.id===f);if(y)return d.appendChild(y.cloneNode(!0)),void p.add(f);for(const m of u){const b=m.querySelector(`#${CSS.escape(f)}`);if(b){let x=d.querySelector("defs");x||(x=document.createElementNS("http://www.w3.org/2000/svg","defs"),d.appendChild(x)),x.appendChild(b.cloneNode(!0)),p.add(f);break}}})})(t)}catch{}try{l=oe(t,e,i,t)}catch(o){throw o}try{await In(t,l,e,i.useProxy)}catch{}if(e){const o=(function(){const a=new Set(g.preStyleMap.values()),s=new Map;let c=1;for(const u of a)u.trim()&&s.set(u,"c"+c++);return s})();r=Array.from(o.entries()).map(([a,s])=>`.${s}{${a}}`).join("");for(const[a,s]of g.preStyleMap.entries()){if(a.tagName==="STYLE")continue;if(a.getRootNode&&a.getRootNode()instanceof ShadowRoot){a.setAttribute("style",s.replace(/;/g,"; "));continue}const c=o.get(s);c&&a.classList.add(c);const u=a.style?.backgroundImage,d=a.dataset?.snapdomHasIcon;u&&u!=="none"&&(a.style.backgroundImage=u),d&&(a.style.verticalAlign="middle",a.style.display="inline")}}else for(const[o,a]of g.preStyleMap.entries())o.tagName!=="STYLE"&&o.setAttribute("style",a.replace(/;/g,"; "));for(const[o,a]of g.preNodeMap.entries()){const s=a.scrollLeft,c=a.scrollTop;if((s||c)&&o instanceof HTMLElement){o.style.overflow="hidden",o.style.scrollbarWidth="none",o.style.msOverflowStyle="none";const u=document.createElement("div");for(u.style.transform=`translate(${-s}px, ${-c}px)`,u.style.willChange="transform",u.style.display="inline-block",u.style.width="100%";o.firstChild;)u.appendChild(o.firstChild);o.appendChild(u)}}if(t===g.preNodeMap.get(l)){const o=g.preStyle.get(t)||window.getComputedStyle(t);g.preStyle.set(t,o);const a=(function(s){if(!s||s==="none")return"";let c=s.replace(/translate[XY]?\([^)]*\)/g,"");return c=c.replace(/matrix\(([^)]+)\)/g,(u,d)=>{const p=d.split(",").map(f=>f.trim());return p.length!==6?`matrix(${d})`:(p[4]="0",p[5]="0",`matrix(${p.join(", ")})`)}),c=c.replace(/matrix3d\(([^)]+)\)/g,(u,d)=>{const p=d.split(",").map(f=>f.trim());return p.length!==16?`matrix3d(${d})`:(p[12]="0",p[13]="0",`matrix3d(${p.join(", ")})`)}),c.trim().replace(/\s{2,}/g," ")})(o.transform);l.style.margin="0",l.style.position="static",l.style.top="auto",l.style.left="auto",l.style.right="auto",l.style.bottom="auto",l.style.zIndex="auto",l.style.float="none",l.style.clear="none",l.style.transform=a||""}for(const[o,a]of g.preNodeMap.entries())a.tagName==="PRE"&&(o.style.marginTop="0",o.style.marginBlockStart="0");return{clone:l,classCSS:r}}async function gr(t,e={}){if(!t)throw new Error("Element cannot be null or undefined");g.reset();const{compress:n=!0,embedFonts:i=!1,fast:l=!0,scale:r=1,useProxy:o=""}=e;let a,s,c,u,d="",p="";if({clone:a,classCSS:s}=await hr(t,n,i,e),await new Promise(y=>{Xt(async()=>{await(async function(m,b={}){const x=Array.from(m.querySelectorAll("img")),$=async k=>{const w=k.src;try{const E=await De(w,{useProxy:b.useProxy});k.src=E,k.width||(k.width=k.naturalWidth||100),k.height||(k.height=k.naturalHeight||100)}catch{const E=document.createElement("div");E.style=`width: ${k.width||100}px; height: ${k.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${k.height||100}px; color: #666; font-size: 12px;`,E.innerText="img",k.replaceWith(E)}};for(let k=0;k{Xt(async()=>{await(async function(m,b,x={}){const $=[[m,b]],k=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;$.length;){const[w,E]=$.shift(),_=g.preStyle.get(w)||Re(w);g.preStyle.has(w)||g.preStyle.set(w,_);const j=(()=>{const N=_.getPropertyValue("border-image"),h=_.getPropertyValue("border-image-source");return N&&N!=="none"||h&&h!=="none"})();for(const N of k){if(["border-image-slice","border-image-width","border-image-outset","border-image-repeat"].includes(N)&&!j)continue;const h=_.getPropertyValue(N);if(!h||h==="none")continue;const M=Dn(h),A=await Promise.all(M.map(v=>Rn(v,x)));A.some(v=>v&&v!=="none"&&!/^url\(undefined/.test(v))&&E.style.setProperty(N,A.join(", "))}const P=_.getPropertyValue("background-color");P&&P!=="transparent"&&P!=="rgba(0, 0, 0, 0)"&&(E.style.backgroundColor=P);const I=Array.from(w.children),T=Array.from(E.children);for(let N=0;N{Xt(async()=>{d=await(async function({preCached:m=!1}={}){if(g.resource.has("fonts-embed-css")){if(m){const w=document.createElement("style");w.setAttribute("data-snapdom","embedFonts"),w.textContent=g.resource.get("fonts-embed-css"),document.head.appendChild(w)}return g.resource.get("fonts-embed-css")}const b=/@import\s+url\(["']?([^"')]+)["']?\)/g,x=[];for(const w of document.querySelectorAll("style")){const E=w.textContent||"",_=Array.from(E.matchAll(b));for(const j of _){const P=j[1];yt(P)||jn(P)||x.push(P)}}await Promise.all(x.map(pr));const $=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(w=>w.href);let k="";for(const w of $)try{const E=await fetch(w.href),_=await E.text();if(yt(w.href)||yt(_))continue;const j=/url\((["']?)([^"')]+)\1\)/g,P=await Promise.all(Array.from(_.matchAll(j)).map(async T=>{let N=Te(T[0]);if(!N)return null;let h=N;if(h.startsWith("http")||h.startsWith("data:")||(h=new URL(h,w.href).href),yt(h))return null;if(g.resource.has(h))return g.font.add(h),{original:T[0],inlined:`url(${g.resource.get(h)})`};if(g.font.has(h))return null;try{const M=await fetch(h),A=await M.blob(),v=await new Promise(S=>{const C=new FileReader;C.onload=()=>S(C.result),C.readAsDataURL(A)});return g.resource.set(h,v),g.font.add(h),{original:T[0],inlined:`url(${v})`}}catch{return null}}));let I=_;for(const T of P)T&&(I=I.replace(T.original,T.inlined));k+=I+` -`}catch{}for(const w of document.styleSheets)try{if(!w.href||$.every(E=>E.href!==w.href)){for(const E of w.cssRules)if(E.type===CSSRule.FONT_FACE_RULE){const _=E.style.getPropertyValue("src"),j=E.style.getPropertyValue("font-family");if(!_||yt(j))continue;const P=/url\((["']?)([^"')]+)\1\)/g,I=/local\((["']?)[^)]+?\1\)/g,T=!!_.match(P),N=!!_.match(I);if(!T&&N){k+=`@font-face{font-family:${j};src:${_};font-style:${E.style.getPropertyValue("font-style")||"normal"};font-weight:${E.style.getPropertyValue("font-weight")||"normal"};}`;continue}let h=_;const M=Array.from(_.matchAll(P));for(const A of M){let v=A[2].trim();if(!v)continue;let S=v;if(S.startsWith("http")||S.startsWith("data:")||(S=new URL(S,w.href||location.href).href),!yt(S)){if(g.resource.has(S))g.font.add(S),h=h.replace(A[0],`url(${g.resource.get(S)})`);else if(!g.font.has(S))try{const C=await fetch(S),D=await C.blob(),O=await new Promise(V=>{const B=new FileReader;B.onload=()=>V(B.result),B.readAsDataURL(D)});g.resource.set(S,O),g.font.add(S),h=h.replace(A[0],`url(${O})`)}catch{}}}k+=`@font-face{font-family:${j};src:${h};font-style:${E.style.getPropertyValue("font-style")||"normal"};font-weight:${E.style.getPropertyValue("font-weight")||"normal"};}`}}}catch{}for(const w of document.fonts)if(w.family&&w.status==="loaded"&&w._snapdomSrc){if(yt(w.family))continue;let E=w._snapdomSrc;if(!E.startsWith("data:")){if(g.resource.has(w._snapdomSrc))E=g.resource.get(w._snapdomSrc),g.font.add(w._snapdomSrc);else if(!g.font.has(w._snapdomSrc))try{const _=await fetch(w._snapdomSrc),j=await _.blob();E=await new Promise(P=>{const I=new FileReader;I.onload=()=>P(I.result),I.readAsDataURL(j)}),g.resource.set(w._snapdomSrc,E),g.font.add(w._snapdomSrc)}catch{continue}}k+=`@font-face{font-family:'${w.family}';src:url(${E});font-style:${w.style||"normal"};font-weight:${w.weight||"normal"};}`}if(k&&(g.resource.set("fonts-embed-css",k),m)){const w=document.createElement("style");w.setAttribute("data-snapdom","embedFonts"),w.textContent=k,document.head.appendChild(w)}return k})(),y()},{fast:l})}),n){const y=(function(b){const x=new Set;return b.nodeType!==Node.ELEMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE?[]:(b.tagName&&x.add(b.tagName.toLowerCase()),typeof b.querySelectorAll=="function"&&b.querySelectorAll("*").forEach($=>x.add($.tagName.toLowerCase())),Array.from(x))})(a).sort(),m=y.join(",");g.baseStyle.has(m)?p=g.baseStyle.get(m):await new Promise(b=>{Xt(()=>{p=(function(x){const $=new Map;for(let w of x){const E=g.defaultStyle.get(w);if(!E)continue;const _=Object.entries(E).map(([j,P])=>`${j}:${P};`).sort().join("");$.has(_)||$.set(_,[]),$.get(_).push(w)}let k="";for(let[w,E]of $.entries())k+=`${E.join(",")} { ${w} } -`;return k})(y),g.baseStyle.set(m,p),b()},{fast:l})})}await new Promise(y=>{Xt(()=>{const m=t.getBoundingClientRect();let b=m.width,x=m.height;const $=Number.isFinite(e.width),k=Number.isFinite(e.height),w=typeof r=="number"&&r!==1;if(!w){const I=m.width/m.height;$&&k?(b=e.width,x=e.height):$?(b=e.width,x=b/I):k&&(x=e.height,b=x*I)}if(b=Math.ceil(b),x=Math.ceil(x),a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),a.style.transformOrigin="top left",!w&&($||k)){const I=b/m.width,T=x/m.height,N=a.style.transform||"",h=`scale(${I}, ${T})`;a.style.transform=`${h} ${N}`.trim()}const E="http://www.w3.org/2000/svg",_=document.createElementNS(E,"foreignObject");_.setAttribute("width","100%"),_.setAttribute("height","100%");const j=document.createElement("style");j.textContent=p+d+"svg{overflow:visible;}"+s,_.appendChild(j),_.appendChild(a);const P=new XMLSerializer().serializeToString(_);u=``+P+"",c=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(u)}`,y()},{fast:l})});const f=document.getElementById("snapdom-sandbox");return f&&f.style.position==="absolute"&&f.remove(),c}async function On(t,{dpr:e=1,scale:n=1}={}){const i=new Image;i.src=t,i.crossOrigin="anonymous",i.loading="eager",i.decoding="sync";const l=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);let r=!1;if(l&&(document.body.appendChild(i),r=!0),await i.decode(),l&&await new Promise(u=>setTimeout(u,100)),i.width===0||i.height===0)throw r&&i.remove(),new Error("Image failed to load or has no dimensions");const o=i.naturalWidth*n,a=i.naturalHeight*n,s=document.createElement("canvas");s.width=Math.ceil(o*e),s.height=Math.ceil(a*e),s.style.width=`${o}px`,s.style.height=`${a}px`;const c=s.getContext("2d");return c.scale(e,e),c.drawImage(i,0,0,o,a),r&&i.remove(),s}async function Wn(t,{type:e="svg",scale:n=1,backgroundColor:i="#fff",quality:l}={}){const r={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[e]||"image/png";if(e==="svg"){const a=decodeURIComponent(t.split(",")[1]);return new Blob([a],{type:"image/svg+xml"})}const o=await We(t,{dpr:1,scale:n},i);return new Promise(a=>{o.toBlob(s=>a(s),`${r}`,l)})}async function We(t,{dpr:e=1,scale:n=1},i){const l=await On(t,{dpr:e,scale:n});if(!i)return l;const r=document.createElement("canvas");r.width=l.width,r.height=l.height;const o=r.getContext("2d");return o.fillStyle=i,o.fillRect(0,0,r.width,r.height),o.drawImage(l,0,0),r}async function Fe(t,{dpr:e=1,scale:n=1,backgroundColor:i,quality:l},r="png"){const o=["jpg","jpeg","webp"].includes(r)?"#fff":void 0,a=i??o,s=await We(t,{dpr:e,scale:n},a),c=new Image;return c.src=s.toDataURL(`image/${r}`,l),await c.decode(),c.style.width=s.width/e+"px",c.style.height=s.height/e+"px",c}async function F(t,e={}){if(e={scale:1,...e},!t)throw new Error("Element cannot be null or undefined");return e.iconFonts&&(function(n){const i=Array.isArray(n)?n:[n];for(const l of i)l instanceof RegExp?Oe.push(l):typeof l=="string"&&Oe.push(new RegExp(l,"i"))})(e.iconFonts),await F.capture(t,e)}function Fn(t,e=null,n={}){const i={constrainToViewport:!0,onDragStart:null,onDrag:null,onDragEnd:null,...n};let l=!1,r=0,o=0,a=0,s=0;const c=e?typeof e=="string"?t.querySelector(e):e:t;if(c)return c.addEventListener("mousedown",u),getComputedStyle(t).position==="static"&&(t.style.position="fixed"),()=>{c.removeEventListener("mousedown",u),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p)};function u(f){f.preventDefault(),l=!0;const y=t.getBoundingClientRect();r=y.left,o=y.top,a=f.pageX,s=f.pageY,t.classList.add("dragging"),c.classList.add("dragging"),document.addEventListener("mousemove",d),document.addEventListener("mouseup",p),i.onDragStart&&i.onDragStart(f,t)}function d(f){if(!l)return;f.preventDefault();const y=r+(f.pageX-a),m=o+(f.pageY-s);if(i.constrainToViewport){const b=t.getBoundingClientRect(),x=window.innerWidth-b.width,$=window.innerHeight-b.height,k=Math.max(0,Math.min(y,x)),w=Math.max(0,Math.min(m,$));t.style.left=`${k}px`,t.style.top=`${w}px`}else t.style.left=`${y}px`,t.style.top=`${m}px`;i.onDrag&&i.onDrag(f,t)}function p(f){f.preventDefault(),l=!1,t.classList.remove("dragging"),c.classList.remove("dragging"),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p),i.onDragEnd&&i.onDragEnd(f,t)}}F.capture=async(t,e={})=>{const n=await gr(t,e),i=e.dpr??(window.devicePixelRatio||1),l=e.scale||1;return{url:n,options:e,toRaw:()=>n,toImg:(r={})=>(async function(o,{scale:a=1}={}){const s=new Image;return s.src=o,await s.decode(),a!==1&&(s.style.width=s.naturalWidth*a+"px",s.style.height=s.naturalHeight*a+"px"),s})(n,{scale:l,...r}),toCanvas:(r={})=>On(n,{dpr:i,scale:l,...r}),toBlob:(r={})=>Wn(n,{scale:l,...r}),toPng:(r={})=>Fe(n,{dpr:i,scale:l,...r},"png"),toJpg:(r={})=>Fe(n,{dpr:i,scale:l,...r},"jpeg"),toWebp:(r={})=>Fe(n,{dpr:i,scale:l,...r},"webp"),download:({format:r="png",filename:o="snapDOM",backgroundColor:a,...s}={})=>(async function(c,{dpr:u=1,scale:d=1,backgroundColor:p,format:f="png",filename:y="snapDOM"}={}){if(f==="svg"){const E=await Wn(c),_=URL.createObjectURL(E),j=document.createElement("a");return j.href=_,j.download=`${y}.svg`,j.click(),void URL.revokeObjectURL(_)}const m=["jpg","jpeg","webp"].includes(f)?"#fff":void 0,b=p??m,x=await We(c,{dpr:u,scale:d},b),$={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[f]||"image/png",k=x.toDataURL($),w=document.createElement("a");w.href=k,w.download=`${y}.${f}`,w.click()})(n,{dpr:i,scale:l,format:r,filename:o,backgroundColor:a,...s})}},F.toRaw=async(t,e)=>(await F.capture(t,e)).toRaw(),F.toImg=async(t,e)=>(await F.capture(t,e)).toImg(),F.toCanvas=async(t,e)=>(await F.capture(t,e)).toCanvas(),F.toBlob=async(t,e)=>(await F.capture(t,e)).toBlob(e),F.toPng=async(t,e)=>(await F.capture(t,e)).toPng(e),F.toJpg=async(t,e)=>(await F.capture(t,e)).toJpg(e),F.toWebp=async(t,e)=>(await F.capture(t,e)).toWebp(e),F.download=async(t,e={})=>{const{format:n="png",filename:i="capture",backgroundColor:l,...r}=e;return await(await F.capture(t,r)).download({format:n,filename:i,backgroundColor:l})};var mr=(t,e)=>H(e,null),vr=Ht('
'),yr=Ht(''),wr=Ht("
"),br=Ht("
"),xr=Ht('
');(function(t){for(var e=0;e(function(l,r){const o=Me.get(l);return o?(Me.delete(l),o(r)):Promise.resolve()})(i)}})(function(t,e){He(e,!0);const n=(()=>{const h=document.querySelector("[data-tidy-feedback-config]");if(h)try{return JSON.parse(h.dataset.tidyFeedbackConfig)}catch{}return{}})();let i,l,r,o=tt(!0),a=tt(!0),s=null,c=tt(""),u=tt("info");const d=n.messageHideDelay??0,p=h=>n.messages?.[h]??h+" (missing translation)",f=(h,M="info")=>{s&&clearTimeout(s),H(c,h,!0),H(u,M,!0),d>0&&(s=setTimeout(()=>H(c,""),d))},y=()=>{f(p("Highlight and fill")),H(o,!1),H(a,!1)},m=(h=!1)=>{h&&r.reset(),H(o,!0),H(a,!0)};(function(h){er();var M=R.f;if(L||(M&jt)===0||(M&pe)!==0)return un(h);var A=it;(A.e??=[]).push(h)})(()=>{if(r=document.getElementById("tidy_feedback_form").content?.firstElementChild,r){const h=i.querySelector(".form-placeholder");h.parentNode.replaceChild(r,h),Fn(i,".tidy-feedback-draggable-handle",{constrainToViewport:!0}),l.style.left="300px",l.style.top="300px",l.style.width="300px",l.style.height="200px",(function(v){const S=v.querySelectorAll(".resizer"),C=20;let D=0,O=0,V=0,B=0,nt=0,K=0;const rt=v.parentNode.querySelector(".overlays .top"),Nt=v.parentNode.querySelector(".overlays .left"),wt=v.parentNode.querySelector(".overlays .right"),ie=v.parentNode.querySelector(".overlays .bottom"),$t=()=>{rt&&(rt.style.height=v.style.top),Nt&&(Nt.style.top=v.style.top,Nt.style.height=v.style.height,Nt.style.width=v.style.left),wt&&(wt.style.top=v.style.top,wt.style.height=v.style.height,wt.style.left=parseInt(v.style.left,10)+parseInt(v.style.width,10)+"px"),ie&&(ie.style.top=parseInt(v.style.top,10)+parseInt(v.style.height,10)+"px")};for(let ht=0;htC&&(v.style.width=X+"px"),J>C&&(v.style.height=J+"px")}else if(bt.classList.contains("bottom-left")){const X=O+(W.pageY-K),J=D-(W.pageX-nt);X>C&&(v.style.height=X+"px"),J>C&&(v.style.width=J+"px",v.style.left=V+(W.pageX-nt)+"px")}else if(bt.classList.contains("top-right")){const X=D+(W.pageX-nt),J=O-(W.pageY-K);X>C&&(v.style.width=X+"px"),J>C&&(v.style.height=J+"px",v.style.top=B+(W.pageY-K)+"px")}else{const X=D-(W.pageX-nt),J=O-(W.pageY-K);X>C&&(v.style.width=X+"px",v.style.left=V+(W.pageX-nt)+"px"),J>C&&(v.style.height=J+"px",v.style.top=B+(W.pageY-K)+"px")}$t()},Tt=function(){window.removeEventListener("mousemove",Jt),window.removeEventListener("mouseup",Tt)};const bt=S[ht];bt.addEventListener("mousedown",function(W){W.preventDefault(),W.stopPropagation(),D=parseFloat(getComputedStyle(v,null).getPropertyValue("width").replace("px","")),O=parseFloat(getComputedStyle(v,null).getPropertyValue("height").replace("px","")),V=v.getBoundingClientRect().left,B=v.getBoundingClientRect().top,nt=W.pageX,K=W.pageY,window.addEventListener("mousemove",Jt),window.addEventListener("mouseup",Tt)})}Fn(v,".resizers",{onDrag:$t}),$t()})(l);const M=new URLSearchParams(document.location.search),A=/tidy-feedback\[(.+)\]/;for(const[v,S]of M.entries()){const C=A.exec(v);if(C){const D=r.elements[C[1]];D&&(D.value=S)}}M.get("tidy-feedback-show")==="form"&&y()}});var b=xr(),x=at(b),$=h=>{var M=vr(),A=at(M),v=at(A),S=at(v),C=at(S);kt(C).__click=[mr,c],Ut(()=>{Pe(S,0,`tidy-feedback-message alert alert-${Q(u)??""} alert-dismissible`),re(C,`${Q(c)??""} `)}),Yt(h,M)};Nn(x,h=>{Q(c)&&h($)});var k=kt(x,2),w=h=>{var M=yr();M.__click=y;var A=at(M);Ut(v=>re(A,v),[()=>p("Send feedback")]),Yt(h,M)};Nn(k,h=>{Q(o)&&h(w)});var E=kt(k,2),_=kt(at(E),4);_.__click=async h=>{if(r.reportValidity()){const M={};f("Taking screenshot …");try{const A=document.body,v=await F(A,{scale:1});let S=v.toRaw();for(const C of["toWebp","toPng","toJpg"]){const D=await v[C]();D.src.lengthM[v]=A),M.context={url:document.location.href,referrer:document.referrer,document:document.documentElement.outerHTML,navigator:{userAgent:navigator.userAgent},window:{innerWidth:window.innerWidth,innerHeight:window.innerHeight},region:{left:l.style.left,top:l.style.top,width:l.style.width,height:l.style.height}},f("Sending feedback …"),fetch(r.action,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(M)}).then(A=>{A.status===201?(m(!0),f(p("Feedback created"),"success")):A.json().then(v=>f("Error creating feedback: "+JSON.stringify(v),"danger")).catch(v=>f("Error creating feedback: "+v,"danger"))}).catch(A=>f(A,"error"))}};var j=at(_),P=kt(_,2);P.__click=()=>{((()=>{for(const h of r.elements)if(h.value||h.checked)return!1;return!0})()||confirm(p("Confirm cancellation")))&&(f(p("Cancelled")),m())};var I=at(P);Ln(E,h=>i=h,()=>i);var T=kt(E,2),N=at(T);Mn(N,20,()=>["top","left","right","bottom"],$n,(h,M)=>{var A=wr();Ut(()=>Pe(A,0,sr(M))),Yt(h,A)}),Mn(at(kt(N,2)),20,()=>["top-left","top-right","bottom-left","bottom-right"],$n,(h,M)=>{var A=br();Ut(()=>Pe(A,0,`resizer ${M??""}`)),Yt(h,A)}),Ln(T,h=>l=h,()=>l),Ut((h,M)=>{E.hidden=Q(o),re(j,h),re(I,M),T.hidden=Q(a)},[()=>p("Send feedback"),()=>p("Cancel")]),Yt(t,b),Ye()},"tidy_feedback")}); +(function(ue){typeof define=="function"&&define.amd?define(ue):ue()})(function(){"use strict";var fe=Array.isArray,Vn=Array.prototype.indexOf,de=Array.from,pe=Object.defineProperty,Wt=Object.getOwnPropertyDescriptor,zn=Object.prototype,Hn=Array.prototype,Yn=Object.getPrototypeOf,Ve=Object.isExtensible;const Ft=32,he=64,rt=256,ge=512,Y=1024,pt=2048,Ct=4096,st=8192,qt=16384,me=32768,ve=65536,Xn=1<<17,ze=1<<19,Jn=1<<20,ye=1<<21,Kn=1<<22,kt=1<<23,ee=Symbol("$state"),we=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},U=Symbol();function He(t){return t===this.v}function Ye(t){return e=t,n=this.v,!(e!=e?n==n:e!==n||e!==null&&typeof e=="object"||typeof e=="function");var e,n}let ot=null;function ne(t){ot=t}function Xe(t,e=!1,n){ot={p:ot,c:null,e:null,s:t,x:null,l:null}}function Je(t){var e=ot,n=e.e;if(n!==null)for(var i of(e.e=null,n))dn(i);return ot=e.p,{}}const Gn=new WeakMap;function be(t,e){for(;e!==null;){if(128&e.f)try{return void e.b.error(t)}catch(n){t=n}e=e.parent}throw t instanceof Error&&Ke(t),t}function Ke(t){const e=Gn.get(t);e&&(pe(t,"message",{value:e.message}),pe(t,"stack",{value:e.stack}))}let re=[];function Qn(){var t=re;re=[],(function(e){for(var n=0;n{try{var l=t()}catch(f){l=Promise.reject(f)}var c=()=>l;s=o?.then(c,c)??Promise.resolve(l),o=s;var u=q,d=i.pending;a&&(i.update_pending_count(1),d||u.increment());const p=(f,v=void 0)=>{o=null,d||u.activate(),v?v!==we&&(r.f|=kt,Ce(r,v)):((r.f&kt)!==0&&(r.f^=kt),Ce(r,f)),a&&(i.update_pending_count(-1),d||u.decrement()),tn()};if(s.then(p,f=>p(null,f||"unknown")),u)return()=>{queueMicrotask(()=>u.neuter())}}),new Promise(l=>{(function c(u){function d(){u===s?l(r):c(s)}u.then(d,d)})(s)})}function Qe(t){var e=t.effects;if(e!==null){t.effects=null;for(var n=0;ntr(d))).then(d=>{a?.activate(),c();try{n([...t.map(i),...d])}catch(p){(l.f&qt)===0&&be(p,l)}a?.deactivate(),tn()}).catch(d=>{u.error(d)})}else n(t.map(i))}function tn(){yt(null),ut(null),ne(null)}const Ut=new Set;let q=null,Pt=null,en=new Set,oe=[];function nn(){const t=oe.shift();oe.length>0&&queueMicrotask(nn),t()}let Bt=[],Se=null,Ee=!1;class Lt{current=new Map;#o=new Map;#i=new Set;#t=0;#c=null;#u=!1;#n=[];#a=[];#r=[];#e=[];#l=[];#f=[];#d=[];skipped_effects=new Set;process(e){Bt=[];var n=null;if(Ut.size>1){n=new Map,Pt=new Map;for(const[r,o]of this.current)n.set(r,{v:r.v,wv:r.wv}),r.v=o;for(const r of Ut)if(r!==this)for(const[o,a]of r.#o)n.has(o)||(n.set(o,{v:o.v,wv:o.wv}),o.v=a)}for(const r of e)this.#h(r);if(this.#n.length===0&&this.#t===0){this.#p();var i=this.#r,s=this.#e;this.#r=[],this.#e=[],this.#l=[],q=null,rn(i),rn(s),q===null?q=this:Ut.delete(this),this.#c?.resolve()}else this.#s(this.#r),this.#s(this.#e),this.#s(this.#l);if(n){for(const[r,{v:o,wv:a}]of n)r.wv<=a&&(r.v=o);Pt=null}for(const r of this.#n)Jt(r);for(const r of this.#a)Jt(r);this.#n=[],this.#a=[]}#h(e){e.f^=Y;for(var n=e.first;n!==null;){var i=n.f,s=!!(96&i);if(!(s&&(i&Y)!==0||(i&st)!==0||this.skipped_effects.has(n))&&n.fn!==null){s?n.f^=Y:(i&Y)===0&&(4&i?this.#e.push(n):(i&Kn)!==0?(n.b?.pending?this.#a:this.#n).push(n):ie(n)&&(16&n.f&&this.#l.push(n),Jt(n)));var r=n.first;if(r!==null){n=r;continue}}var o=n.parent;for(n=n.next;n===null&&o!==null;)n=o.next,o=o.parent}}#s(e){for(const n of e)((n.f&pt)!==0?this.#f:this.#d).push(n),G(n,Y);e.length=0}capture(e,n){this.#o.has(e)||this.#o.set(e,n),this.current.set(e,e.v)}activate(){q=this}deactivate(){q=null;for(const e of en)if(en.delete(e),e(),q!==null)break}neuter(){this.#u=!0}flush(){Bt.length>0?(function(){var e=Rt;Ee=!0;try{var n=0;for(wn(!0);Bt.length>0;){var i=Lt.ensure();n++>1e3&&nr(),i.process(Bt),Nt.clear()}}finally{Ee=!1,wn(e),Se=null}})():this.#p(),q===this&&(this.#t===0&&Ut.delete(this),this.deactivate())}#p(){if(!this.#u)for(const e of this.#i)e();this.#i.clear()}increment(){this.#t+=1}decrement(){if(this.#t-=1,this.#t===0){for(const e of this.#f)G(e,pt),_t(e);for(const e of this.#d)G(e,Ct),_t(e);this.#r=[],this.#e=[],this.flush()}else this.deactivate()}add_callback(e){this.#i.add(e)}settled(){return(this.#c??={promise:new Promise((i,s)=>{e=i,n=s}),resolve:e,reject:n}).promise;var e,n}static ensure(){if(q===null){const e=q=new Lt;Ut.add(q),Lt.enqueue(()=>{q===e&&e.flush()})}return q}static enqueue(e){oe.length===0&&queueMicrotask(nn),oe.unshift(e)}}function nr(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(t){be(t,Se)}}function rn(t){var e=t.length;if(e!==0){for(var n=0;ns&&(i.f&Jn)!==0)break}}for(;n{if(Mt===r)return a();var l=P,c=Mt;ut(null),Sn(r);var u=a();return ut(l),Sn(c),u};return i&&n.set("length",tt(t.length)),new Proxy(t,{defineProperty(a,l,c){"value"in c&&c.configurable!==!1&&c.enumerable!==!1&&c.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var u=n.get(l);return u===void 0?u=o(()=>{var d=tt(c.value);return n.set(l,d),d}):X(u,c.value,!0),!0},deleteProperty(a,l){var c=n.get(l);if(c===void 0){if(l in a){const u=o(()=>tt(U));n.set(l,u),ke(s)}}else X(c,U),ke(s);return!0},get(a,l,c){if(l===ee)return t;var u=n.get(l),d=l in a;if(u!==void 0||d&&!Wt(a,l)?.writable||(u=o(()=>tt(zt(d?a[l]:U))),n.set(l,u)),u!==void 0){var p=V(u);return p===U?void 0:p}return Reflect.get(a,l,c)},getOwnPropertyDescriptor(a,l){var c=Reflect.getOwnPropertyDescriptor(a,l);if(c&&"value"in c){var u=n.get(l);u&&(c.value=V(u))}else if(c===void 0){var d=n.get(l),p=d?.v;if(d!==void 0&&p!==U)return{enumerable:!0,configurable:!0,value:p,writable:!0}}return c},has(a,l){if(l===ee)return!0;var c=n.get(l),u=c!==void 0&&c.v!==U||Reflect.has(a,l);return(c!==void 0||L!==null&&(!u||Wt(a,l)?.writable))&&(c===void 0&&(c=o(()=>tt(u?zt(a[l]):U)),n.set(l,c)),V(c)===U)?!1:u},set(a,l,c,u){var d=n.get(l),p=l in a;if(i&&l==="length")for(var f=c;ftt(U)),n.set(f+"",v))}d===void 0?p&&!Wt(a,l)?.writable||(X(d=o(()=>tt(void 0)),zt(c)),n.set(l,d)):(p=d.v!==U,X(d,o(()=>zt(c))));var m=Reflect.getOwnPropertyDescriptor(a,l);if(m?.set&&m.set.call(u,c),!p){if(i&&typeof l=="string"){var w=n.get("length"),y=Number(l);Number.isInteger(y)&&y>=w.v&&X(w,y+1)}ke(s)}return!0},ownKeys(a){V(s);var l=Reflect.ownKeys(a).filter(d=>{var p=n.get(d);return p===void 0||p.v!==U});for(var[c,u]of n)u.v===U||c in a||l.push(c);return l},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}var an,ln,sn,cn;function _e(t=""){return document.createTextNode(t)}function un(t){return sn.call(t)}function Ne(t){return cn.call(t)}function it(t,e){return un(t)}function $t(t,e=1,n=!1){let i=t;for(;e--;)i=Ne(i);return i}function fn(t){var e=P,n=L;ut(null),yt(null);try{return t()}finally{ut(e),yt(n)}}function rr(t){L===null&&P===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),P!==null&&(P.f&rt)!==0&&L===null&&(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})(),Tt&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function vt(t,e,n,i=!0){var s=L;s!==null&&(s.f&st)!==0&&(t|=st);var r={ctx:ot,deps:null,nodes_start:null,nodes_end:null,f:t|pt,first:null,fn:e,last:null,next:null,parent:s,b:s&&s.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(n)try{Jt(r),r.f|=me}catch(a){throw ht(r),a}else e!==null&&_t(r);if(!(n&&r.deps===null&&r.first===null&&r.nodes_start===null&&r.teardown===null&&(r.f&ze)===0)&&i&&(s!==null&&(function(a,l){var c=l.last;c===null?l.last=l.first=a:(c.next=a,a.prev=c,l.last=a)})(r,s),P!==null&&2&P.f&&(t&he)===0)){var o=P;(o.effects??=[]).push(r)}return r}function dn(t){return vt(1048580,t,!1)}function Ht(t,e=[],n=[]){er(e,n,i=>{vt(8,()=>t(...i.map(V)),!0)})}function pn(t,e=0){return vt(16|e,t,!0)}function Yt(t,e=!0){return vt(Ft,t,!0,e)}function hn(t){var e=t.teardown;if(e!==null){const n=Tt,i=P;bn(!0),ut(null);try{e.call(null)}finally{bn(n),ut(i)}}}function gn(t,e=!1){var n=t.first;for(t.first=t.last=null;n!==null;){const s=n.ac;s!==null&&fn(()=>{s.abort(we)});var i=n.next;(n.f&he)!==0?n.parent=null:ht(n,e),n=i}}function ht(t,e=!0){var n=!1;(e||262144&t.f)&&t.nodes_start!==null&&t.nodes_end!==null&&((function(r,o){for(;r!==null;){var a=r===o?null:Ne(r);r.remove(),r=a}})(t.nodes_start,t.nodes_end),n=!0),gn(t,e&&!n),ae(t,0),G(t,qt);var i=t.transitions;if(i!==null)for(const r of i)r.stop();hn(t);var s=t.parent;s!==null&&s.first!==null&&mn(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes_start=t.nodes_end=t.ac=null}function mn(t){var e=t.parent,n=t.prev,i=t.next;n!==null&&(n.next=i),i!==null&&(i.prev=n),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=n))}function $e(t,e){var n=[];Me(t,n,!0),vn(n,()=>{ht(t),e&&e()})}function vn(t,e){var n=t.length;if(n>0){var i=()=>--n||e();for(var s of t)s.out(i)}else e()}function Me(t,e,n){if((t.f&st)===0){if(t.f^=st,t.transitions!==null)for(const r of t.transitions)(r.is_global||n)&&e.push(r);for(var i=t.first;i!==null;){var s=i.next;Me(i,e,((i.f&ve)!==0||(i.f&Ft)!==0)&&n),i=s}}}function Ae(t){yn(t,!0)}function yn(t,e){if((t.f&st)!==0){t.f^=st,(t.f&Y)===0&&(G(t,pt),_t(t));for(var n=t.first;n!==null;){var i=n.next;yn(n,((n.f&ve)!==0||(n.f&Ft)!==0)&&e),n=i}if(t.transitions!==null)for(const s of t.transitions)(s.is_global||e)&&s.in()}}let Rt=!1;function wn(t){Rt=t}let Tt=!1;function bn(t){Tt=t}let P=null,ct=!1;function ut(t){P=t}let L=null;function yt(t){L=t}let gt=null,J=null,K=0,et=null,xn=1,Xt=0,Mt=Xt;function Sn(t){Mt=t}let wt=!1;function En(){return++xn}function ie(t){var e=t.f;if((e&pt)!==0)return!0;if((e&Ct)!==0){var n=t.deps,i=(e&rt)!==0;if(n!==null){var s,r,o=(e&ge)!==0,a=i&&L!==null&&!wt,l=n.length;if((o||a)&&(L===null||(L.f&qt)===0)){var c=t,u=c.parent;for(s=0;st.wv)return!0}i&&(L===null||wt)||G(t,Y)}return!1}function Cn(t,e,n=!0){var i=t.reactions;if(i!==null&&!gt?.includes(t))for(var s=0;s{t.ac.abort(we)}),t.ac=null);try{t.f|=ye;var d=(0,t.fn)(),p=t.deps;if(J!==null){var f;if(ae(t,K),p!==null&&K>0)for(p.length=K+J.length,f=0;fr||n});var u=P,d=L;ut(null),yt(null);try{for(var p,f=[];r!==null;){var v=r.assignedSlot||r.parentNode||r.host||null;try{var m=r["__"+i];if(m!=null&&(!r.disabled||t.target===r))if(fe(m)){var[w,...y]=m;w.apply(r,[t,...y])}else m.call(r,t)}catch(M){p?f.push(M):p=M}if(t.cancelBubble||v===e||v===null)break;r=v}if(p){for(let M of f)queueMicrotask(()=>{throw M});throw p}}finally{t.__root=e,delete t.currentTarget,ut(u),yt(d)}}}function Kt(t,e){var n,i=!!(2&e),s=!t.startsWith("");return()=>{var r,o;n===void 0&&(r=s?t:""+t,(o=document.createElement("template")).innerHTML=r.replaceAll("",""),n=un(n=o.content));var a=i||ln?document.importNode(n,!0):n.cloneNode(!0);return(function(l,c){var u=L;u.nodes_start===null&&(u.nodes_start=l,u.nodes_end=c)})(a,a),a}}function Gt(t,e){t!==null&&t.before(e)}function se(t,e){var n=e==null?"":typeof e=="object"?e+"":e;n!==(t.__t??=t.nodeValue)&&(t.__t=n,t.nodeValue=n+"")}function sr(t,e){return(function(n,{target:i,anchor:s,props:r={},events:o,context:a,intro:l=!0}){(function(){if(an===void 0){an=window,ln=/Firefox/.test(navigator.userAgent);var f=Element.prototype,v=Node.prototype,m=Text.prototype;sn=Wt(v,"firstChild").get,cn=Wt(v,"nextSibling").get,Ve(f)&&(f.__click=void 0,f.__className=void 0,f.__attributes=null,f.__style=void 0,f.__e=void 0),Ve(m)&&(m.__t=void 0)}})();var c=new Set,u=f=>{for(var v=0;vnew Promise(w=>{m.outro?$e(v,()=>{ht(v),w(void 0)}):(ht(v),w(void 0))})})(()=>{var f=s??i.appendChild(_e());return Yt(()=>{a&&(Xe({}),ot.c=a),o&&(r.$$events=o),d=n(f,r)||{},a&&Je()}),()=>{for(var v of c){i.removeEventListener(v,le);var m=jt.get(v);--m===0?(document.removeEventListener(v,le),jt.delete(v)):jt.set(v,m)}Pe.delete(u),f!==s&&f.parentNode?.removeChild(f)}});return Le.set(d,p),d})(t,e)}const jt=new Map;let Le=new WeakMap;function Mn(t,e,n=!1){var i=t,s=null,r=null,o=U,a=!1;const l=(p,f=!0)=>{a=!0,d(f,p)};var c=null;function u(){c!==null&&(c.lastChild.remove(),i.before(c),c=null);var p=o?s:r,f=o?r:s;p&&Ae(p),f&&$e(f,()=>{o?r=null:s=null})}const d=(p,f)=>{if(o!==(o=p)){var v=!1,m=i;o?s??=f&&Yt(()=>f(m)):r??=f&&Yt(()=>f(m)),u()}};pn(()=>{a=!1,e(l),a||d(null,null)},n?ve:0)}function An(t,e){return e}function Pn(t,e,n,i,s,r=null){var o,a={flags:e,items:new Map,first:null};o=t.appendChild(_e());var l,c,u=null,d=!1,p=new Map,f=(function(m){const w=Ge(m);return w.equals=Ye,w})(()=>{var m=n();return fe(m)?m:m==null?[]:de(m)});function v(){(function(m,w,y,M,C,b,k,N,j){var A,D,R,$,E,Q=w.length,B=y.items,I=y.first,h=I,S=null,_=[],x=[];for(E=0;E0&&(function(It,dt,xt){for(var Zt=It.items,At=[],St=dt.length,Et=0;Et0&&At.length===0&&xt!==null;if(Ot){var te=xt.parentNode;te.textContent="",te.append(xt),Zt.clear(),ft(It,dt[0].prev,dt[St-1].next)}vn(At,()=>{for(var W=0;Wr(o)):u!==null&&$e(u,()=>{u=null}))}pn(()=>{c??=L;var m=(l=V(f)).length;d&&m===0||(d=m===0,v(),V(f))})}function cr(t,e,n,i,s,r,o,a,l,c,u){var d=1&l?16&l?Vt(s):(function(v,m=!1){const w=Vt(v);return m||(w.equals=Ye),w})(s,!1,!1):s,p=2&l?Vt(o):o,f={i:p,v:d,k:r,a:null,e:null,prev:n,next:i};try{return t===null&&document.createDocumentFragment().append(t=_e()),f.e=Yt(()=>a(t,d,p,c),!1),f.e.prev=n&&n.e,f.e.next=i&&i.e,n===null?u||(e.first=f):(n.next=f,n.e.next=f.e),i!==null&&(i.prev=f,i.e.prev=f.e),f}finally{}}function Re(t,e,n){for(var i=t.next?t.next.e.nodes_start:n,s=e?e.e.nodes_start:n,r=t.e.nodes_start;r!==null&&r!==i;){var o=Ne(r);s.before(r),r=o}}function ft(t,e,n){e===null?t.first=n:(e.next=n,e.e.next=n&&n.e),n!==null&&(n.prev=e,n.e.prev=e&&e.e)}function Ln(t){var e,n,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var s=t.length;for(e=0;e{var r,o;return(function(a,l=0){vt(8|l,a,!0)})(()=>{r=o,o=[],(function(a){var l=ct;try{return ct=!0,a()}finally{ct=l}})(()=>{t!==n(...o)&&(e(t,...o),r&&Tn(n(...r),t)&&e(null,...r))})}),()=>{var a;a=()=>{o&&Tn(n(...o),t)&&e(null,...o)},re.length===0&&queueMicrotask(Qn),re.push(a)}},vt(4,s,!1),t}typeof window<"u"&&((window.__svelte??={}).v??=new Set).add("5");var g={image:new Map,background:new Map,resource:new Map,defaultStyle:new Map,baseStyle:new Map,computedStyle:new WeakMap,font:new Set,snapshot:new WeakMap,snapshotKey:new Map,preStyleMap:new Map,preStyle:new WeakMap,preNodeMap:new Map,reset:function(){g.computedStyle=new WeakMap,g.snapshot=new WeakMap,g.snapshotKey.clear(),g.preStyleMap.clear(),g.preStyle=new WeakMap,g.preNodeMap.clear()}},ur=new Set(["-webkit-locale"]);function je(t,e,n=!1){const i=[],s=(function(r){if(g.defaultStyle.has(r))return g.defaultStyle.get(r);if(new Set(["script","style","meta","link","noscript","template","defs","symbol","title","metadata","desc"]).has(r)){const u={};return g.defaultStyle.set(r,u),u}let o=document.getElementById("snapdom-sandbox");o||(o=document.createElement("div"),o.id="snapdom-sandbox",o.style.position="absolute",o.style.left="-9999px",o.style.top="-9999px",o.style.width="0",o.style.height="0",o.style.overflow="hidden",document.body.appendChild(o));const a=document.createElement(r);a.style.all="initial",o.appendChild(a);const l=getComputedStyle(a),c={};for(let u of l)c[u]=l.getPropertyValue(u);return o.removeChild(a),g.defaultStyle.set(r,c),c})(e);for(let[r,o]of Object.entries(t))if(!ur.has(r))if(n){const a=s[r];o&&o!==a&&i.push(`${r}:${o}`)}else o&&i.push(`${r}:${o}`);return i.sort().join(";")}async function Dn(t,e={}){const n=Ie(t);if(/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t),n){const i=We(n);if(g.background.has(i))return e.skipInline?void 0:`url(${g.background.get(i)})`;{const s=await Oe(i,{useProxy:e.useProxy});return g.background.set(i,s),e.skipInline?void 0:`url("${s}")`}}return t}function Qt(t,{fast:e=!1}={}){if(e)return t();"requestIdleCallback"in window?requestIdleCallback(t,{timeout:50}):setTimeout(t,1)}function De(t,e=null){if(!(t instanceof Element))return window.getComputedStyle(t,e);let n=g.computedStyle.get(t);if(n||(n=new Map,g.computedStyle.set(t,n)),!n.has(e)){const i=window.getComputedStyle(t,e);n.set(e,i)}return n.get(e)}function fr(t){let e=t.replace(/^['"]|['"]$/g,"");if(e.startsWith("\\"))try{return String.fromCharCode(parseInt(e.replace("\\",""),16))}catch{return e}return e}function Ie(t){const e=t.match(/url\((['"]?)(.*?)(\1)\)/);if(!e)return null;const n=e[2].trim();return n.startsWith("#")?null:n}function Oe(t,{timeout:e=3e3,useProxy:n=""}={}){function i(o){try{return new URL(o,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch{return"anonymous"}}async function s(o){const a=l=>fetch(l,{mode:"cors",credentials:i(l)==="use-credentials"?"include":"omit"}).then(c=>c.blob()).then(c=>new Promise((u,d)=>{const p=new FileReader;p.onloadend=()=>{const f=p.result;typeof f=="string"&&f.startsWith("data:image/")?u(f):d(new Error("Invalid image data URL"))},p.onerror=()=>d(new Error("FileReader error")),p.readAsDataURL(c)}));try{return await a(o)}catch{if(!n||typeof n!="string")throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided");{const c=n.replace(/\/$/,"")+We(o);try{return await a(c)}catch{throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}}}const r=i(t);return g.image.has(t)?Promise.resolve(g.image.get(t)):t.startsWith("data:image/")?(g.image.set(t,t),Promise.resolve(t)):/\.svg(\?.*)?$/i.test(t)?(async()=>{try{const o=await fetch(t,{mode:"cors",credentials:r==="use-credentials"?"include":"omit"}),a=await o.text(),l=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(a)}`;return g.image.set(t,l),l}catch{return s(t)}})():new Promise((o,a)=>{const l=setTimeout(()=>{a(new Error("[SnapDOM - fetchImage] Image load timed out"))},e),c=new Image;c.crossOrigin=r,c.onload=async()=>{clearTimeout(l);try{await c.decode();const u=document.createElement("canvas");u.width=c.width,u.height=c.height,u.getContext("2d").drawImage(c,0,0,u.width,u.height);const d=u.toDataURL("image/png");g.image.set(t,d),o(d)}catch{try{const u=await s(t);g.image.set(t,u),o(u)}catch(u){a(u)}}},c.onerror=async()=>{clearTimeout(l);try{const u=await s(t);g.image.set(t,u),o(u)}catch(u){a(u)}},c.src=t})}function In(t){const e={};for(let n of t)e[n]=t.getPropertyValue(n);return e}function We(t){if(/%[0-9A-Fa-f]{2}/.test(t))return t;try{return encodeURI(t)}catch{return t}}function On(t){const e=[];let n=0,i=0;for(let s=0;sa.localeCompare(l)).map(([a,l])=>`${a}:${l}`).join(";");if(g.snapshotKey.has(r))return void g.preStyleMap.set(e,g.snapshotKey.get(r));const o=je(s,t.tagName?.toLowerCase()||"div",n);g.snapshotKey.set(r,o),g.preStyleMap.set(e,o)}function ce(t,e,n={},i){if(!t)throw new Error("Invalid node");const s=new Set;let r,o=null;if(t.nodeType===Node.TEXT_NODE||t.nodeType!==Node.ELEMENT_NODE)return t.cloneNode(!0);if(t.getAttribute("data-capture")==="exclude"){const a=document.createElement("div"),l=t.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${l.width}px;height:${l.height}px;visibility:hidden;`,a}if(n.exclude&&Array.isArray(n.exclude))for(const a of n.exclude)try{if(t.matches?.(a)){const l=document.createElement("div"),c=t.getBoundingClientRect();return l.style.cssText=`display:inline-block;width:${c.width}px;height:${c.height}px;visibility:hidden;`,l}}catch{}if(typeof n.filter=="function")try{if(!n.filter(t,i||t)){const a=document.createElement("div"),l=t.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${l.width}px;height:${l.height}px;visibility:hidden;`,a}}catch{}if(t.tagName==="IFRAME"){const a=document.createElement("div");return a.style.cssText=`width:${t.offsetWidth}px;height:${t.offsetHeight}px;background-image:repeating-linear-gradient(45deg,#ddd,#ddd 5px,#f9f9f9 5px,#f9f9f9 10px);display:flex;align-items:center;justify-content:center;font-size:12px;color:#555;border:1px solid #aaa;`,a}if(t.getAttribute("data-capture")==="placeholder"){const a=t.cloneNode(!1);g.preNodeMap.set(a,t),Fe(t,a,e);const l=document.createElement("div");return l.textContent=t.getAttribute("data-placeholder-text")||"",l.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",a.appendChild(l),a}if(t.tagName==="CANVAS"){const a=t.toDataURL(),l=document.createElement("img");return l.src=a,l.width=t.width,l.height=t.height,g.preNodeMap.set(l,t),Fe(t,l,e),l}try{r=t.cloneNode(!1),g.preNodeMap.set(r,t)}catch(a){throw a}if(t instanceof HTMLTextAreaElement){r.textContent=t.value,r.value=t.value;const a=t.getBoundingClientRect();return r.style.width=`${a.width}px`,r.style.height=`${a.height}px`,r}if(t instanceof HTMLInputElement&&(r.value=t.value,r.setAttribute("value",t.value),t.checked!==void 0&&(r.checked=t.checked,t.checked&&r.setAttribute("checked",""),t.indeterminate&&(r.indeterminate=t.indeterminate))),t instanceof HTMLSelectElement&&(o=t.value),Fe(t,r,e),t.shadowRoot)if(Array.from(t.shadowRoot.querySelectorAll("slot")).length>0){for(const a of t.shadowRoot.childNodes)if(a.nodeType===Node.ELEMENT_NODE&&a.tagName==="STYLE"){const l=a.textContent||"";l.trim()&&e&&(g.preStyle||(g.preStyle=new WeakMap),g.preStyle.set(a,l))}}else{const a=document.createDocumentFragment();for(const l of t.shadowRoot.childNodes){if(l.nodeType===Node.ELEMENT_NODE&&l.tagName==="STYLE"){const u=l.textContent||"";u.trim()&&e&&(g.preStyle||(g.preStyle=new WeakMap),g.preStyle.set(l,u));continue}const c=ce(l,e,n,i||t);c&&a.appendChild(c)}r.appendChild(a)}if(t.tagName==="SLOT"){const a=t.assignedNodes?.({flatten:!0})||[],l=a.length>0?a:Array.from(t.childNodes),c=document.createDocumentFragment();for(const u of l){const d=ce(u,e,n,i||t);d&&c.appendChild(d)}return c}for(const a of t.childNodes){if(s.has(a))continue;const l=ce(a,e,n,i||t);l&&r.appendChild(l)}if(o!==null&&r instanceof HTMLSelectElement){r.value=o;for(const a of r.options)a.value===o?a.setAttribute("selected",""):a.removeAttribute("selected")}return r}var dr=[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/layui/i,/lucide/i],qe=[];function bt(t){const e=typeof t=="string"?t:"",n=[...dr,...qe];for(const i of n)if(i instanceof RegExp&&i.test(e))return!0;return!!(/icon/i.test(e)||/glyph/i.test(e)||/symbols/i.test(e)||/feather/i.test(e)||/fontawesome/i.test(e))}async function pr(t,e,n,i=32,s="#000"){e=e.replace(/^['"]+|['"]+$/g,"");const r=window.devicePixelRatio||1;await document.fonts.ready;const o=document.createElement("span");o.textContent=t,o.style.position="absolute",o.style.visibility="hidden",o.style.fontFamily=`"${e}"`,o.style.fontWeight=n||"normal",o.style.fontSize=`${i}px`,o.style.lineHeight="1",o.style.whiteSpace="nowrap",o.style.padding="0",o.style.margin="0",document.body.appendChild(o);const a=o.getBoundingClientRect(),l=Math.ceil(a.width),c=Math.ceil(a.height);document.body.removeChild(o);const u=document.createElement("canvas");u.width=l*r,u.height=c*r;const d=u.getContext("2d");return d.scale(r,r),d.font=n?`${n} ${i}px "${e}"`:`${i}px "${e}"`,d.textAlign="left",d.textBaseline="top",d.fillStyle=s,d.fillText(t,0,0),{dataUrl:u.toDataURL(),width:l,height:c}}function Wn(t){return Array.from(document.styleSheets).some(e=>e.href===t)}function hr(t){return new Promise(e=>{if(Wn(t))return e(null);const n=document.createElement("link");n.rel="stylesheet",n.href=t,n.setAttribute("data-snapdom","injected-import"),n.onload=()=>e(n),n.onerror=()=>e(null),document.head.appendChild(n)})}async function Fn(t,e,n){if(!(t instanceof Element&&e instanceof Element))return;for(const r of["::before","::after","::first-letter"])try{const o=De(t,r);if(!o||typeof o[Symbol.iterator]!="function"||!(o.content!=="none"||o.backgroundImage!=="none"||o.backgroundColor!=="transparent"||o.borderStyle!=="none"&&parseFloat(o.borderWidth)!==0||o.transform&&o.transform!=="none"||o.display!=="inline"))continue;if(r==="::first-letter"){const I=getComputedStyle(t);if(!(o.color!==I.color||o.fontSize!==I.fontSize||o.fontWeight!==I.fontWeight))continue;const h=Array.from(e.childNodes).find(Z=>Z.nodeType===Node.TEXT_NODE&&Z.textContent?.trim().length>0);if(!h)continue;const S=h.textContent,_=S.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),x=_?.[0],O=S.slice(x?.length||0);if(!x||/[\uD800-\uDFFF]/.test(x))continue;const T=document.createElement("span");T.textContent=x,T.dataset.snapdomPseudo="::first-letter";const z=je(In(o),"span",n);g.preStyleMap.set(T,z);const nt=document.createTextNode(O);e.replaceChild(nt,h),e.insertBefore(T,nt);continue}const a=o.content,l=/counter\s*\(|counters\s*\(/.test(a)?"- ":fr(a),c=o.backgroundImage,u=o.backgroundColor,d=o.fontFamily,p=parseInt(o.fontSize)||32,f=parseInt(o.fontWeight)||!1,v=o.color||"#000",m=o.display,w=parseFloat(o.width),y=parseFloat(o.height),M=o.borderStyle,C=parseFloat(o.borderWidth),b=o.transform,k=bt(d),N=a!=="none"&&l!=="",j=c&&c!=="none",A=u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)",D=m!=="inline"&&(w>0||y>0),R=M&&M!=="none"&&C>0,$=b&&b!=="none";if(!(N||j||A||D||R||$))continue;const E=document.createElement("span");E.dataset.snapdomPseudo=r,E.style.verticalAlign="middle";const Q=je(In(o),"span",n);if(g.preStyleMap.set(E,Q),k&&l.length===1){const{dataUrl:I,width:h,height:S}=await pr(l,d,f,p,v),_=document.createElement("img");_.src=I,_.style=`height:${p}px;width:${h/S*p}px;object-fit:contain;`,E.appendChild(_),e.dataset.snapdomHasIcon="true"}else if(l.startsWith("url(")){const I=Ie(l);if(I?.trim())try{const h=document.createElement("img"),S=await Oe(We(I),n);h.src=S,h.style=`width:${p}px;height:auto;object-fit:contain;`,E.appendChild(h)}catch{}}else!k&&N&&(E.textContent=l);if(j)try{const I=On(c),h=await Promise.all(I.map(Dn));E.style.backgroundImage=h.join(", ")}catch{}if(A&&(E.style.backgroundColor=u),!(E.childNodes.length>0||E.textContent?.trim()!==""||j||A||D||R||$))continue;r==="::before"?e.insertBefore(E,e.firstChild):e.appendChild(E)}catch{}const i=Array.from(t.children),s=Array.from(e.children).filter(r=>!r.dataset.snapdomPseudo);for(let r=0;r0,f=u==="none"||parseFloat(d)===0;p&&f&&(o.style.border=`${c} solid transparent`)})(t);try{(function(o){if(!o)return;const a=new Set;if(o.querySelectorAll("use").forEach(f=>{const v=f.getAttribute("xlink:href")||f.getAttribute("href");v&&v.startsWith("#")&&a.add(v.slice(1))}),!a.size)return;const l=Array.from(document.querySelectorAll("svg > symbol, svg > defs")),c=l.filter(f=>f.tagName.toLowerCase()==="symbol"),u=l.filter(f=>f.tagName.toLowerCase()==="defs");let d=o.querySelector("svg.inline-defs-container");d||(d=document.createElementNS("http://www.w3.org/2000/svg","svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("style","position: absolute; width: 0; height: 0; overflow: hidden;"),d.classList.add("inline-defs-container"),o.insertBefore(d,o.firstChild));const p=new Set;o.querySelectorAll("symbol[id], defs > *[id]").forEach(f=>{p.add(f.id)}),a.forEach(f=>{if(p.has(f))return;const v=c.find(m=>m.id===f);if(v)return d.appendChild(v.cloneNode(!0)),void p.add(f);for(const m of u){const w=m.querySelector(`#${CSS.escape(f)}`);if(w){let y=d.querySelector("defs");y||(y=document.createElementNS("http://www.w3.org/2000/svg","defs"),d.appendChild(y)),y.appendChild(w.cloneNode(!0)),p.add(f);break}}})})(t)}catch{}try{s=ce(t,e,i,t)}catch(o){throw o}try{await Fn(t,s,e,i.useProxy)}catch{}if(e){const o=(function(){const a=new Set(g.preStyleMap.values()),l=new Map;let c=1;for(const u of a)u.trim()&&l.set(u,"c"+c++);return l})();r=Array.from(o.entries()).map(([a,l])=>`.${l}{${a}}`).join("");for(const[a,l]of g.preStyleMap.entries()){if(a.tagName==="STYLE")continue;if(a.getRootNode&&a.getRootNode()instanceof ShadowRoot){a.setAttribute("style",l.replace(/;/g,"; "));continue}const c=o.get(l);c&&a.classList.add(c);const u=a.style?.backgroundImage,d=a.dataset?.snapdomHasIcon;u&&u!=="none"&&(a.style.backgroundImage=u),d&&(a.style.verticalAlign="middle",a.style.display="inline")}}else for(const[o,a]of g.preStyleMap.entries())o.tagName!=="STYLE"&&o.setAttribute("style",a.replace(/;/g,"; "));for(const[o,a]of g.preNodeMap.entries()){const l=a.scrollLeft,c=a.scrollTop;if((l||c)&&o instanceof HTMLElement){o.style.overflow="hidden",o.style.scrollbarWidth="none",o.style.msOverflowStyle="none";const u=document.createElement("div");for(u.style.transform=`translate(${-l}px, ${-c}px)`,u.style.willChange="transform",u.style.display="inline-block",u.style.width="100%";o.firstChild;)u.appendChild(o.firstChild);o.appendChild(u)}}if(t===g.preNodeMap.get(s)){const o=g.preStyle.get(t)||window.getComputedStyle(t);g.preStyle.set(t,o);const a=(function(l){if(!l||l==="none")return"";let c=l.replace(/translate[XY]?\([^)]*\)/g,"");return c=c.replace(/matrix\(([^)]+)\)/g,(u,d)=>{const p=d.split(",").map(f=>f.trim());return p.length!==6?`matrix(${d})`:(p[4]="0",p[5]="0",`matrix(${p.join(", ")})`)}),c=c.replace(/matrix3d\(([^)]+)\)/g,(u,d)=>{const p=d.split(",").map(f=>f.trim());return p.length!==16?`matrix3d(${d})`:(p[12]="0",p[13]="0",`matrix3d(${p.join(", ")})`)}),c.trim().replace(/\s{2,}/g," ")})(o.transform);s.style.margin="0",s.style.position="static",s.style.top="auto",s.style.left="auto",s.style.right="auto",s.style.bottom="auto",s.style.zIndex="auto",s.style.float="none",s.style.clear="none",s.style.transform=a||""}for(const[o,a]of g.preNodeMap.entries())a.tagName==="PRE"&&(o.style.marginTop="0",o.style.marginBlockStart="0");return{clone:s,classCSS:r}}async function mr(t,e={}){if(!t)throw new Error("Element cannot be null or undefined");g.reset();const{compress:n=!0,embedFonts:i=!1,fast:s=!0,scale:r=1,useProxy:o=""}=e;let a,l,c,u,d="",p="";if({clone:a,classCSS:l}=await gr(t,n,i,e),await new Promise(v=>{Qt(async()=>{await(async function(m,w={}){const y=Array.from(m.querySelectorAll("img")),M=async C=>{const b=C.src;try{const k=await Oe(b,{useProxy:w.useProxy});C.src=k,C.width||(C.width=C.naturalWidth||100),C.height||(C.height=C.naturalHeight||100)}catch{const k=document.createElement("div");k.style=`width: ${C.width||100}px; height: ${C.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${C.height||100}px; color: #666; font-size: 12px;`,k.innerText="img",C.replaceWith(k)}};for(let C=0;C{Qt(async()=>{await(async function(m,w,y={}){const M=[[m,w]],C=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;M.length;){const[b,k]=M.shift(),N=g.preStyle.get(b)||De(b);g.preStyle.has(b)||g.preStyle.set(b,N);const j=(()=>{const $=N.getPropertyValue("border-image"),E=N.getPropertyValue("border-image-source");return $&&$!=="none"||E&&E!=="none"})();for(const $ of C){if(["border-image-slice","border-image-width","border-image-outset","border-image-repeat"].includes($)&&!j)continue;const E=N.getPropertyValue($);if(!E||E==="none")continue;const Q=On(E),B=await Promise.all(Q.map(I=>Dn(I,y)));B.some(I=>I&&I!=="none"&&!/^url\(undefined/.test(I))&&k.style.setProperty($,B.join(", "))}const A=N.getPropertyValue("background-color");A&&A!=="transparent"&&A!=="rgba(0, 0, 0, 0)"&&(k.style.backgroundColor=A);const D=Array.from(b.children),R=Array.from(k.children);for(let $=0;${Qt(async()=>{d=await(async function({preCached:m=!1}={}){if(g.resource.has("fonts-embed-css")){if(m){const b=document.createElement("style");b.setAttribute("data-snapdom","embedFonts"),b.textContent=g.resource.get("fonts-embed-css"),document.head.appendChild(b)}return g.resource.get("fonts-embed-css")}const w=/@import\s+url\(["']?([^"')]+)["']?\)/g,y=[];for(const b of document.querySelectorAll("style")){const k=b.textContent||"",N=Array.from(k.matchAll(w));for(const j of N){const A=j[1];bt(A)||Wn(A)||y.push(A)}}await Promise.all(y.map(hr));const M=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(b=>b.href);let C="";for(const b of M)try{const k=await fetch(b.href),N=await k.text();if(bt(b.href)||bt(N))continue;const j=/url\((["']?)([^"')]+)\1\)/g,A=await Promise.all(Array.from(N.matchAll(j)).map(async R=>{let $=Ie(R[0]);if(!$)return null;let E=$;if(E.startsWith("http")||E.startsWith("data:")||(E=new URL(E,b.href).href),bt(E))return null;if(g.resource.has(E))return g.font.add(E),{original:R[0],inlined:`url(${g.resource.get(E)})`};if(g.font.has(E))return null;try{const Q=await fetch(E),B=await Q.blob(),I=await new Promise(h=>{const S=new FileReader;S.onload=()=>h(S.result),S.readAsDataURL(B)});return g.resource.set(E,I),g.font.add(E),{original:R[0],inlined:`url(${I})`}}catch{return null}}));let D=N;for(const R of A)R&&(D=D.replace(R.original,R.inlined));C+=D+` +`}catch{}for(const b of document.styleSheets)try{if(!b.href||M.every(k=>k.href!==b.href)){for(const k of b.cssRules)if(k.type===CSSRule.FONT_FACE_RULE){const N=k.style.getPropertyValue("src"),j=k.style.getPropertyValue("font-family");if(!N||bt(j))continue;const A=/url\((["']?)([^"')]+)\1\)/g,D=/local\((["']?)[^)]+?\1\)/g,R=!!N.match(A),$=!!N.match(D);if(!R&&$){C+=`@font-face{font-family:${j};src:${N};font-style:${k.style.getPropertyValue("font-style")||"normal"};font-weight:${k.style.getPropertyValue("font-weight")||"normal"};}`;continue}let E=N;const Q=Array.from(N.matchAll(A));for(const B of Q){let I=B[2].trim();if(!I)continue;let h=I;if(h.startsWith("http")||h.startsWith("data:")||(h=new URL(h,b.href||location.href).href),!bt(h)){if(g.resource.has(h))g.font.add(h),E=E.replace(B[0],`url(${g.resource.get(h)})`);else if(!g.font.has(h))try{const S=await fetch(h),_=await S.blob(),x=await new Promise(O=>{const T=new FileReader;T.onload=()=>O(T.result),T.readAsDataURL(_)});g.resource.set(h,x),g.font.add(h),E=E.replace(B[0],`url(${x})`)}catch{}}}C+=`@font-face{font-family:${j};src:${E};font-style:${k.style.getPropertyValue("font-style")||"normal"};font-weight:${k.style.getPropertyValue("font-weight")||"normal"};}`}}}catch{}for(const b of document.fonts)if(b.family&&b.status==="loaded"&&b._snapdomSrc){if(bt(b.family))continue;let k=b._snapdomSrc;if(!k.startsWith("data:")){if(g.resource.has(b._snapdomSrc))k=g.resource.get(b._snapdomSrc),g.font.add(b._snapdomSrc);else if(!g.font.has(b._snapdomSrc))try{const N=await fetch(b._snapdomSrc),j=await N.blob();k=await new Promise(A=>{const D=new FileReader;D.onload=()=>A(D.result),D.readAsDataURL(j)}),g.resource.set(b._snapdomSrc,k),g.font.add(b._snapdomSrc)}catch{continue}}C+=`@font-face{font-family:'${b.family}';src:url(${k});font-style:${b.style||"normal"};font-weight:${b.weight||"normal"};}`}if(C&&(g.resource.set("fonts-embed-css",C),m)){const b=document.createElement("style");b.setAttribute("data-snapdom","embedFonts"),b.textContent=C,document.head.appendChild(b)}return C})(),v()},{fast:s})}),n){const v=(function(w){const y=new Set;return w.nodeType!==Node.ELEMENT_NODE&&w.nodeType!==Node.DOCUMENT_FRAGMENT_NODE?[]:(w.tagName&&y.add(w.tagName.toLowerCase()),typeof w.querySelectorAll=="function"&&w.querySelectorAll("*").forEach(M=>y.add(M.tagName.toLowerCase())),Array.from(y))})(a).sort(),m=v.join(",");g.baseStyle.has(m)?p=g.baseStyle.get(m):await new Promise(w=>{Qt(()=>{p=(function(y){const M=new Map;for(let b of y){const k=g.defaultStyle.get(b);if(!k)continue;const N=Object.entries(k).map(([j,A])=>`${j}:${A};`).sort().join("");M.has(N)||M.set(N,[]),M.get(N).push(b)}let C="";for(let[b,k]of M.entries())C+=`${k.join(",")} { ${b} } +`;return C})(v),g.baseStyle.set(m,p),w()},{fast:s})})}await new Promise(v=>{Qt(()=>{const m=t.getBoundingClientRect();let w=m.width,y=m.height;const M=Number.isFinite(e.width),C=Number.isFinite(e.height),b=typeof r=="number"&&r!==1;if(!b){const D=m.width/m.height;M&&C?(w=e.width,y=e.height):M?(w=e.width,y=w/D):C&&(y=e.height,w=y*D)}if(w=Math.ceil(w),y=Math.ceil(y),a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),a.style.transformOrigin="top left",!b&&(M||C)){const D=w/m.width,R=y/m.height,$=a.style.transform||"",E=`scale(${D}, ${R})`;a.style.transform=`${E} ${$}`.trim()}const k="http://www.w3.org/2000/svg",N=document.createElementNS(k,"foreignObject");N.setAttribute("width","100%"),N.setAttribute("height","100%");const j=document.createElement("style");j.textContent=p+d+"svg{overflow:visible;}"+l,N.appendChild(j),N.appendChild(a);const A=new XMLSerializer().serializeToString(N);u=``+A+"",c=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(u)}`,v()},{fast:s})});const f=document.getElementById("snapdom-sandbox");return f&&f.style.position==="absolute"&&f.remove(),c}async function qn(t,{dpr:e=1,scale:n=1}={}){const i=new Image;i.src=t,i.crossOrigin="anonymous",i.loading="eager",i.decoding="sync";const s=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);let r=!1;if(s&&(document.body.appendChild(i),r=!0),await i.decode(),s&&await new Promise(u=>setTimeout(u,100)),i.width===0||i.height===0)throw r&&i.remove(),new Error("Image failed to load or has no dimensions");const o=i.naturalWidth*n,a=i.naturalHeight*n,l=document.createElement("canvas");l.width=Math.ceil(o*e),l.height=Math.ceil(a*e),l.style.width=`${o}px`,l.style.height=`${a}px`;const c=l.getContext("2d");return c.scale(e,e),c.drawImage(i,0,0,o,a),r&&i.remove(),l}async function Un(t,{type:e="svg",scale:n=1,backgroundColor:i="#fff",quality:s}={}){const r={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[e]||"image/png";if(e==="svg"){const a=decodeURIComponent(t.split(",")[1]);return new Blob([a],{type:"image/svg+xml"})}const o=await Ue(t,{dpr:1,scale:n},i);return new Promise(a=>{o.toBlob(l=>a(l),`${r}`,s)})}async function Ue(t,{dpr:e=1,scale:n=1},i){const s=await qn(t,{dpr:e,scale:n});if(!i)return s;const r=document.createElement("canvas");r.width=s.width,r.height=s.height;const o=r.getContext("2d");return o.fillStyle=i,o.fillRect(0,0,r.width,r.height),o.drawImage(s,0,0),r}async function Be(t,{dpr:e=1,scale:n=1,backgroundColor:i,quality:s},r="png"){const o=["jpg","jpeg","webp"].includes(r)?"#fff":void 0,a=i??o,l=await Ue(t,{dpr:e,scale:n},a),c=new Image;return c.src=l.toDataURL(`image/${r}`,s),await c.decode(),c.style.width=l.width/e+"px",c.style.height=l.height/e+"px",c}async function F(t,e={}){if(e={scale:1,...e},!t)throw new Error("Element cannot be null or undefined");return e.iconFonts&&(function(n){const i=Array.isArray(n)?n:[n];for(const s of i)s instanceof RegExp?qe.push(s):typeof s=="string"&&qe.push(new RegExp(s,"i"))})(e.iconFonts),await F.capture(t,e)}function Bn(t,e=null,n={}){const i={constrainToViewport:!0,onDragStart:null,onDrag:null,onDragEnd:null,...n};let s=!1,r=0,o=0,a=0,l=0;const c=e?typeof e=="string"?t.querySelector(e):e:t;if(c)return c.addEventListener("mousedown",u),getComputedStyle(t).position==="static"&&(t.style.position="fixed"),()=>{c.removeEventListener("mousedown",u),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p)};function u(f){f.preventDefault(),s=!0;const v=t.getBoundingClientRect();r=v.left,o=v.top,a=f.pageX,l=f.pageY,t.classList.add("dragging"),c.classList.add("dragging"),document.addEventListener("mousemove",d),document.addEventListener("mouseup",p),i.onDragStart&&i.onDragStart(f,t)}function d(f){if(!s)return;f.preventDefault();const v=r+(f.pageX-a),m=o+(f.pageY-l);if(i.constrainToViewport){const w=t.getBoundingClientRect(),y=window.innerWidth-w.width,M=window.innerHeight-w.height,C=Math.max(0,Math.min(v,y)),b=Math.max(0,Math.min(m,M));t.style.left=`${C}px`,t.style.top=`${b}px`}else t.style.left=`${v}px`,t.style.top=`${m}px`;i.onDrag&&i.onDrag(f,t)}function p(f){f.preventDefault(),s=!1,t.classList.remove("dragging"),c.classList.remove("dragging"),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p),i.onDragEnd&&i.onDragEnd(f,t)}}F.capture=async(t,e={})=>{const n=await mr(t,e),i=e.dpr??(window.devicePixelRatio||1),s=e.scale||1;return{url:n,options:e,toRaw:()=>n,toImg:(r={})=>(async function(o,{scale:a=1}={}){const l=new Image;return l.src=o,await l.decode(),a!==1&&(l.style.width=l.naturalWidth*a+"px",l.style.height=l.naturalHeight*a+"px"),l})(n,{scale:s,...r}),toCanvas:(r={})=>qn(n,{dpr:i,scale:s,...r}),toBlob:(r={})=>Un(n,{scale:s,...r}),toPng:(r={})=>Be(n,{dpr:i,scale:s,...r},"png"),toJpg:(r={})=>Be(n,{dpr:i,scale:s,...r},"jpeg"),toWebp:(r={})=>Be(n,{dpr:i,scale:s,...r},"webp"),download:({format:r="png",filename:o="snapDOM",backgroundColor:a,...l}={})=>(async function(c,{dpr:u=1,scale:d=1,backgroundColor:p,format:f="png",filename:v="snapDOM"}={}){if(f==="svg"){const k=await Un(c),N=URL.createObjectURL(k),j=document.createElement("a");return j.href=N,j.download=`${v}.svg`,j.click(),void URL.revokeObjectURL(N)}const m=["jpg","jpeg","webp"].includes(f)?"#fff":void 0,w=p??m,y=await Ue(c,{dpr:u,scale:d},w),M={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[f]||"image/png",C=y.toDataURL(M),b=document.createElement("a");b.href=C,b.download=`${v}.${f}`,b.click()})(n,{dpr:i,scale:s,format:r,filename:o,backgroundColor:a,...l})}},F.toRaw=async(t,e)=>(await F.capture(t,e)).toRaw(),F.toImg=async(t,e)=>(await F.capture(t,e)).toImg(),F.toCanvas=async(t,e)=>(await F.capture(t,e)).toCanvas(),F.toBlob=async(t,e)=>(await F.capture(t,e)).toBlob(e),F.toPng=async(t,e)=>(await F.capture(t,e)).toPng(e),F.toJpg=async(t,e)=>(await F.capture(t,e)).toJpg(e),F.toWebp=async(t,e)=>(await F.capture(t,e)).toWebp(e),F.download=async(t,e={})=>{const{format:n="png",filename:i="capture",backgroundColor:s,...r}=e;return await(await F.capture(t,r)).download({format:n,filename:i,backgroundColor:s})};var vr=(t,e)=>X(e,null),yr=Kt('
'),wr=Kt(''),br=Kt("
"),xr=Kt("
"),Sr=Kt('
');(function(t){for(var e=0;e(function(i,s){const r=Le.get(i);return r?(Le.delete(i),r(s)):Promise.resolve()})(n)}})(function(t,e){Xe(e,!0);const n=(()=>{const h=document.querySelector("[data-tidy-feedback-config]");if(h)try{return JSON.parse(h.dataset.tidyFeedbackConfig)}catch{}return{}})(),i="info",s="danger",r="error",o="success";let a,l,c,u=tt(!0),d=tt(!0),p=null,f=tt(""),v=tt(i);const m=n.messageHideDelay??0,w=h=>n.messages?.[h]??h+" (missing translation)",y=(h,S=i)=>{p&&clearTimeout(p),X(f,h,!0),X(v,S,!0),m>0&&(p=setTimeout(()=>X(f,""),m))},M=()=>{y(w("Highlight and fill")),X(u,!1),X(d,!1)},C=(h=!1)=>{h&&c.reset(),X(u,!0),X(d,!0)};(function(h){rr();var S=L.f;if(P||(S&Ft)===0||(S&me)!==0)return dn(h);var _=ot;(_.e??=[]).push(h)})(()=>{if(c=document.getElementById("tidy_feedback_form").content?.firstElementChild,c){const h=a.querySelector(".form-placeholder");h.parentNode.replaceChild(c,h),Bn(a,".tidy-feedback-draggable-handle",{constrainToViewport:!0}),l.style.left="300px",l.style.top="300px",l.style.width="300px",l.style.height="200px",(function(x){const O=x.querySelectorAll(".resizer"),T=20;let z=0,nt=0,Z=0,Dt=0,at=0,mt=0;const It=x.parentNode.querySelector(".overlays .top"),dt=x.parentNode.querySelector(".overlays .left"),xt=x.parentNode.querySelector(".overlays .right"),Zt=x.parentNode.querySelector(".overlays .bottom"),At=()=>{It&&(It.style.height=x.style.top),dt&&(dt.style.top=x.style.top,dt.style.height=x.style.height,dt.style.width=x.style.left),xt&&(xt.style.top=x.style.top,xt.style.height=x.style.height,xt.style.left=parseInt(x.style.left,10)+parseInt(x.style.width,10)+"px"),Zt&&(Zt.style.top=parseInt(x.style.top,10)+parseInt(x.style.height,10)+"px")};for(let St=0;StT&&(x.style.width=H+"px"),lt>T&&(x.style.height=lt+"px")}else if(Et.classList.contains("bottom-left")){const H=nt+(W.pageY-mt),lt=z-(W.pageX-at);H>T&&(x.style.height=H+"px"),lt>T&&(x.style.width=lt+"px",x.style.left=Z+(W.pageX-at)+"px")}else if(Et.classList.contains("top-right")){const H=z+(W.pageX-at),lt=nt-(W.pageY-mt);H>T&&(x.style.width=H+"px"),lt>T&&(x.style.height=lt+"px",x.style.top=Dt+(W.pageY-mt)+"px")}else{const H=z-(W.pageX-at),lt=nt-(W.pageY-mt);H>T&&(x.style.width=H+"px",x.style.left=Z+(W.pageX-at)+"px"),lt>T&&(x.style.height=lt+"px",x.style.top=Dt+(W.pageY-mt)+"px")}At()},te=function(){window.removeEventListener("mousemove",Ot),window.removeEventListener("mouseup",te)};const Et=O[St];Et.addEventListener("mousedown",function(W){W.preventDefault(),W.stopPropagation(),z=parseFloat(getComputedStyle(x,null).getPropertyValue("width").replace("px","")),nt=parseFloat(getComputedStyle(x,null).getPropertyValue("height").replace("px","")),Z=x.getBoundingClientRect().left,Dt=x.getBoundingClientRect().top,at=W.pageX,mt=W.pageY,window.addEventListener("mousemove",Ot),window.addEventListener("mouseup",te)})}Bn(x,".resizers",{onDrag:At}),At()})(l);const S=new URLSearchParams(document.location.search),_=/tidy-feedback\[(.+)\]/;for(const[x,O]of S.entries()){const T=_.exec(x);if(T){const z=c.elements[T[1]];z&&(z.value=O)}}S.get("tidy-feedback-show")==="form"&&M()}});var b=Sr(),k=it(b),N=h=>{var S=yr(),_=it(S),x=it(_),O=it(x),T=it(O);$t(T).__click=[vr,f],Ht(()=>{Te(O,0,Rn(["tidy-feedback-message","alert","alert-dismissible",{"alert-info":i===V(v),"alert-danger":s===V(v),"alert-error":r===V(v),"alert-sucess":o===V(v)}])),se(T,`${V(f)??""} `)}),Gt(h,S)};Mn(k,h=>{V(f)&&h(N)});var j=$t(k,2),A=h=>{var S=wr();S.__click=M;var _=it(S);Ht(x=>se(_,x),[()=>w("Send feedback")]),Gt(h,S)};Mn(j,h=>{V(u)&&h(A)});var D=$t(j,2),R=$t(it(D),4);R.__click=async h=>{if(c.reportValidity()){const S={};y("Taking screenshot …");try{const _=document.body,x=await F(_,{scale:1});let O=x.toRaw();for(const T of["toWebp","toPng","toJpg"]){const z=await x[T]();z.src.lengthS[x]=_),S.context={url:document.location.href,referrer:document.referrer,document:document.documentElement.outerHTML,navigator:{userAgent:navigator.userAgent},window:{innerWidth:window.innerWidth,innerHeight:window.innerHeight},region:{left:l.style.left,top:l.style.top,width:l.style.width,height:l.style.height}},y("Sending feedback …"),fetch(c.action,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}).then(_=>{_.status===201?(C(!0),y(w("Feedback created"),o)):_.json().then(x=>y("Error creating feedback: "+JSON.stringify(x),s)).catch(x=>y("Error creating feedback: "+x,s))}).catch(_=>y(_,r))}};var $=it(R),E=$t(R,2);E.__click=()=>{((()=>{for(const h of c.elements)if(h.value||h.checked)return!1;return!0})()||confirm(w("Confirm cancellation")))&&(y(w("Cancelled")),C())};var Q=it(E);jn(D,h=>a=h,()=>a);var B=$t(D,2),I=it(B);Pn(I,20,()=>["top","left","right","bottom"],An,(h,S)=>{var _=br();Ht(()=>Te(_,0,Rn(S))),Gt(h,_)}),Pn(it($t(I,2)),20,()=>["top-left","top-right","bottom-left","bottom-right"],An,(h,S)=>{var _=xr();Ht(()=>Te(_,0,`resizer ${S??""}`)),Gt(h,_)}),jn(B,h=>l=h,()=>l),Ht((h,S)=>{D.hidden=V(u),se($,h),se(Q,S),B.hidden=V(d)},[()=>w("Send feedback"),()=>w("Cancel")]),Gt(t,b),Je()},"tidy_feedback")}); diff --git a/compose.yaml b/compose.yaml index d68d053..bd6e6bb 100644 --- a/compose.yaml +++ b/compose.yaml @@ -25,7 +25,21 @@ services: # https://github.com/prettier/prettier/issues/15206) have an official # docker image. # https://hub.docker.com/r/jauderho/prettier is good candidate (cf. https://hub.docker.com/search?q=prettier&sort=updated_at&order=desc) - image: jauderho/prettier + # image: jauderho/prettier + build: + # Custom image to include https://github.com/sveltejs/prettier-plugin-svelte + dockerfile_inline: | + # https://github.com/jauderho/dockerfiles/blob/main/prettier/Dockerfile + FROM node:24 + + RUN npm install --global prettier prettier-plugin-svelte + + WORKDIR /work + + # Help prettier find our globally installed plugin + # (cf. https://github.com/prettier/prettier/issues/15141#issuecomment-2624767782) + ENTRYPOINT ["prettier", "--plugin", "/usr/local/lib/node_modules/prettier-plugin-svelte/plugin.js"] + CMD ["--help"] volumes: - ./:/work profiles: diff --git a/docs/widget.md b/docs/widget.md index fe12856..bf2b3f9 100644 --- a/docs/widget.md +++ b/docs/widget.md @@ -82,6 +82,7 @@ When done with development, run task assets:build ``` -to build the widget for production and copy the resulting Javascript file -([tidy_feedback.min.js](../widget/static/dist/standalone/tidy_feedback.min.js)) to the [`build` -folder](../build/standalone) (which is under git control). +to build the widget for production and copy the resulting files +([tidy_feedback.min.js](../widget/static/dist/tidy_feedback.min.js) and +[tidy_feedback.css](../widget/static/dist/assets/tidy_feedback.css)) to the [`build` folder](../build/standalone) (which +is under git control). diff --git a/widget/.prettierrc b/widget/.prettierrc index 3f7802c..b82528f 100644 --- a/widget/.prettierrc +++ b/widget/.prettierrc @@ -1,15 +1,11 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] -} +useTabs: true +singleQuote: true +trailingComma: none +printWidth: 100 +# prettier-plugin-svelte is installed in our custom prettier docker image (cf. ../compose.yaml) +# plugins: +# - prettier-plugin-svelte +overrides: + - files: '*.svelte' + options: + parser: svelte diff --git a/widget/Taskfile.yml b/widget/Taskfile.yml index be1979e..88fe4e9 100644 --- a/widget/Taskfile.yml +++ b/widget/Taskfile.yml @@ -22,7 +22,7 @@ tasks: - docker compose run --rm node npx standalone build --all dev: - desc: "Open widget dev site and start Vite dev server" + desc: 'Open widget dev site and start Vite dev server' deps: [install] cmds: # https://stackoverflow.com/a/73821896 @@ -30,7 +30,7 @@ tasks: - docker compose run --name tidy-feedback-widget --rm --publish '{{.APP_PORT}}:{{.APP_PORT}}' node npm run dev -- --port {{.APP_PORT}} --host open: - desc: "Open widget dev site" + desc: 'Open widget dev site' cmds: - open "{{.WIDGET_URL}}" @@ -40,14 +40,19 @@ tasks: - task npm -- install internal: true - lint: - desc: "Apply and check widget coding standards" + format: + desc: 'Apply and check widget coding standards' cmds: - task npm -- run format + + lint: + desc: 'Apply and check widget coding standards' + cmds: + - task: format - task npm -- run lint npm: - desc: "Run npm command. Example: task npm -- install" + desc: 'Run npm command. Example: task npm -- install' cmds: - docker compose run --rm node npm {{.CLI_ARGS}} diff --git a/widget/src/_standalone/tidy_feedback/embed.ts b/widget/src/_standalone/tidy_feedback/embed.ts index 3100883..121c4a4 100644 --- a/widget/src/_standalone/tidy_feedback/embed.ts +++ b/widget/src/_standalone/tidy_feedback/embed.ts @@ -1,5 +1,5 @@ -import { autoEmbedWithTarget } from 'svelte-standalone'; +import { autoEmbedOnBody } from 'svelte-standalone'; import Tidy_feedback from './index.svelte'; -autoEmbedWithTarget(Tidy_feedback, 'tidy_feedback'); +autoEmbedOnBody(Tidy_feedback, 'tidy_feedback'); diff --git a/widget/src/_standalone/tidy_feedback/index.svelte b/widget/src/_standalone/tidy_feedback/index.svelte index 2f92ce9..eedb117 100644 --- a/widget/src/_standalone/tidy_feedback/index.svelte +++ b/widget/src/_standalone/tidy_feedback/index.svelte @@ -19,6 +19,11 @@ return {}; })(); + const MESSAGE_TYPE_INFO = 'info'; + const MESSAGE_TYPE_DANGER = 'danger'; + const MESSAGE_TYPE_ERROR = 'error'; + const MESSAGE_TYPE_SUCCESS = 'success'; + let formContainer; let region; let formHidden = $state(true); @@ -27,12 +32,12 @@ let messageTimeout = null; let message = $state(''); - let messageType = $state('info'); + let messageType = $state(MESSAGE_TYPE_INFO); const messageHideDelay = config.messageHideDelay ?? 0; const t = (text) => config.messages?.[text] ?? text + ' (missing translation)'; - const showMessage = (msg, type = 'info') => { + const showMessage = (msg, type = MESSAGE_TYPE_INFO) => { if (messageTimeout) { clearTimeout(messageTimeout); } @@ -75,7 +80,6 @@ const submitForm = async (target) => { // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement#instance_methods - // @todo This does not actually validate the form elements! const isValid = form.reportValidity(); if (isValid) { const data = {}; @@ -97,7 +101,7 @@ data.image = image; } catch (error) { console.error(error); - showMessage('Error taking screenshot', 'danger'); + showMessage('Error taking screenshot', MESSAGE_TYPE_DANGER); } const formData = new FormData(form); @@ -136,17 +140,19 @@ .then((response) => { if (201 === response.status) { hideForm(true); - showMessage(t('Feedback created'), 'success'); + showMessage(t('Feedback created'), MESSAGE_TYPE_SUCCESS); } else { response .json() .then((data) => - showMessage('Error creating feedback: ' + JSON.stringify(data), 'danger') + showMessage('Error creating feedback: ' + JSON.stringify(data), MESSAGE_TYPE_DANGER) ) - .catch((error) => showMessage('Error creating feedback: ' + error, 'danger')); + .catch((error) => + showMessage('Error creating feedback: ' + error, MESSAGE_TYPE_DANGER) + ); } }) - .catch((reason) => showMessage(reason, 'error')); + .catch((reason) => showMessage(reason, MESSAGE_TYPE_ERROR)); } }; @@ -192,11 +198,21 @@
{#if message} -
+