diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 5535077..a10ebc1 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -69,7 +69,7 @@ jobs: cache-to: type=gha,mode=max - name: Scan image with Trivy - uses: aquasecurity/trivy-action@0.32.0 + uses: aquasecurity/trivy-action@0.33.1 with: image-ref: "${{ env.GHCR_REPO }}:${{ github.sha }}-${{ matrix.tag }}" format: "table" diff --git a/.github/workflows/lint-web.yml b/.github/workflows/lint-web.yml index 71f55bb..9066cab 100644 --- a/.github/workflows/lint-web.yml +++ b/.github/workflows/lint-web.yml @@ -36,6 +36,9 @@ jobs: run: | npm i -g pnpm pnpm i --frozen-lockfile + - name: Build translations + working-directory: ./web + run: pnpm dlx @inlang/paraglide-js compile --project ./project.inlang --outdir ./src/paraglide - name: Lint working-directory: ./web run: pnpm lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a103012..69770ab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,6 +52,12 @@ jobs: draft: true generate_release_notes: true + create-sbom: + needs: [create-release, build-docker-release] + uses: ./.github/workflows/sbom.yml + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + build-binaries: needs: [create-release] runs-on: @@ -111,10 +117,12 @@ jobs: with: version: 10 - - name: Use Node.js 24 + - name: Use Node.js uses: actions/setup-node@v4 with: node-version: 24 + cache: "pnpm" + cache-dependency-path: ./web/pnpm-lock.yaml - name: Install frontend dependencies run: pnpm install --ignore-scripts --frozen-lockfile diff --git a/.github/workflows/sbom-regenerate.yml b/.github/workflows/sbom-regenerate.yml new file mode 100644 index 0000000..3ecb2e6 --- /dev/null +++ b/.github/workflows/sbom-regenerate.yml @@ -0,0 +1,37 @@ +name: Periodic SBOM Regeneration + +on: + schedule: + - cron: '30 2 * * *' # 2:30 AM UTC + +jobs: + list-releases: + name: List releases + runs-on: ubuntu-latest + outputs: + releases: ${{ steps.get-releases.outputs.releases }} + steps: + - name: Get list of releases + id: get-releases + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + RELEASES_JSON=$(gh api repos/${{ github.repository }}/releases \ + --jq '[.[] + | select(.draft == false and (.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+$"))) + | {tagName: .tag_name, uploadUrl: .upload_url}][:1]') + echo "releases=$RELEASES_JSON" >> $GITHUB_OUTPUT + regenerate-for-release: + name: Regenerate SBOM for release + needs: list-releases + # Don't run if no releases were found. + if: needs.list-releases.outputs.releases != '[]' + strategy: + fail-fast: false + matrix: + release: ${{ fromJson(needs.list-releases.outputs.releases) }} + uses: ./.github/workflows/sbom.yml + with: + upload_url: ${{ matrix.release.uploadUrl }} + tag: ${{ matrix.release.tagName }} + secrets: inherit diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml new file mode 100644 index 0000000..38d0bd5 --- /dev/null +++ b/.github/workflows/sbom.yml @@ -0,0 +1,83 @@ +name: Create SBOM files + +on: + workflow_call: + inputs: + upload_url: + description: "Release assets upload URL" + required: true + type: string + tag: + description: "The git tag to generate SBOM for - used in scheduled runs" + required: false + type: string + +jobs: + create-sbom: + runs-on: [self-hosted, Linux, X64] + + steps: + - name: Determine release tag and version + id: vars + # Uses inputs.tag for scheduled runs, otherwise github.ref_name. + run: | + TAG_NAME=${{ inputs.tag || github.ref_name }} + VERSION=${TAG_NAME#v} + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_OUTPUT + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ steps.vars.outputs.TAG_NAME }} + submodules: recursive + + - name: Create SBOM with Trivy + uses: aquasecurity/trivy-action@0.33.1 + with: + scan-type: 'fs' + format: 'spdx-json' + output: "defguard-proxy-${{ steps.vars.outputs.VERSION }}.sbom.json" + scan-ref: '.' + severity: "CRITICAL,HIGH,MEDIUM,LOW" + scanners: "vuln" + + - name: Create docker image SBOM with Trivy + uses: aquasecurity/trivy-action@0.33.1 + with: + image-ref: "ghcr.io/defguard/defguard-proxy:${{ steps.vars.outputs.VERSION }}" + scan-type: 'image' + format: 'spdx-json' + output: "defguard-proxy-${{ steps.vars.outputs.VERSION }}-docker.sbom.json" + severity: "CRITICAL,HIGH,MEDIUM,LOW" + scanners: "vuln" + + - name: Create security advisory file with Trivy + uses: aquasecurity/trivy-action@0.33.1 + with: + scan-type: 'fs' + format: 'json' + output: "defguard-proxy-${{ steps.vars.outputs.VERSION }}.advisories.json" + scan-ref: '.' + severity: "CRITICAL,HIGH,MEDIUM,LOW" + scanners: "vuln" + + - name: Create docker image security advisory file with Trivy + uses: aquasecurity/trivy-action@0.33.1 + with: + image-ref: "ghcr.io/defguard/defguard-proxy:${{ steps.vars.outputs.VERSION }}" + scan-type: 'image' + format: 'json' + output: "defguard-proxy-${{ steps.vars.outputs.VERSION }}-docker.advisories.json" + severity: "CRITICAL,HIGH,MEDIUM,LOW" + scanners: "vuln" + + - name: Upload SBOMs and advisories + uses: shogo82148/actions-upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ inputs.upload_url }} + asset_path: "defguard-*.json" + asset_content_type: application/octet-stream + overwrite: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc24763..ad533e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,6 +34,15 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive + - name: Scan code with Trivy + uses: aquasecurity/trivy-action@0.33.1 + with: + scan-type: 'fs' + scan-ref: '.' + exit-code: "1" + ignore-unfixed: true + severity: "CRITICAL,HIGH,MEDIUM" + scanners: "vuln" - name: Cache uses: Swatinem/rust-cache@v2 - name: Install protoc diff --git a/.gitignore b/.gitignore index f2379c7..ac8220e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ .envrc /node_modules .env +.DS_Store diff --git a/Cargo.lock b/Cargo.lock index 7965a0c..7624d27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -82,9 +82,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -153,17 +153,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - [[package]] name = "axum" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" dependencies = [ "axum-core", "base64", @@ -181,8 +175,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", @@ -209,9 +202,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", @@ -220,7 +213,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -229,9 +221,9 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" +checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" dependencies = [ "axum", "axum-core", @@ -245,17 +237,17 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "serde", - "tower", + "serde_core", "tower-layer", "tower-service", + "tracing", ] [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -263,7 +255,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -311,9 +303,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.38" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ "find-msvc-tools", "jobserver", @@ -556,7 +548,7 @@ dependencies = [ "rust-embed", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tokio", "tokio-stream", @@ -583,7 +575,7 @@ dependencies = [ "os_info", "semver", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "tonic", "tower", "tracing", @@ -592,9 +584,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -691,7 +683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -702,9 +694,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" [[package]] name = "fixedbitset" @@ -714,9 +706,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -869,9 +861,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git2" @@ -1290,9 +1282,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1306,9 +1298,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libgit2-sys" @@ -1348,11 +1340,10 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -1416,9 +1407,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1443,6 +1434,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1506,9 +1498,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -1551,9 +1543,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1561,15 +1553,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1858,9 +1850,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1941,18 +1933,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1962,9 +1954,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -2042,7 +2034,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2083,9 +2075,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -2119,7 +2111,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2130,9 +2122,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags", "core-foundation", @@ -2163,9 +2155,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -2173,18 +2165,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2273,6 +2265,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "siphasher" version = "1.0.1" @@ -2391,7 +2389,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2416,11 +2414,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -2436,9 +2434,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -2528,9 +2526,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2549,9 +2547,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", @@ -2742,7 +2740,7 @@ dependencies = [ "governor", "http", "pin-project", - "thiserror 2.0.16", + "thiserror 2.0.17", "tonic", "tower", "tracing", @@ -2818,9 +2816,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", @@ -2829,15 +2827,15 @@ dependencies = [ "log", "rand 0.9.2", "sha1", - "thiserror 2.0.16", + "thiserror 2.0.17", "utf-8", ] [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" @@ -2999,21 +2997,22 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -3025,9 +3024,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3035,9 +3034,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -3048,18 +3047,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -3109,7 +3108,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -3118,12 +3117,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.0" @@ -3154,16 +3147,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -3184,11 +3177,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -3380,9 +3373,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" diff --git a/Dockerfile b/Dockerfile index f50a857..ac05b0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,10 @@ FROM node:24-alpine AS web WORKDIR /app -COPY web/package.json . -COPY web/pnpm-lock.yaml . -COPY web/.npmrc . +COPY web/package.json web/pnpm-lock.yaml ./ RUN npm i -g pnpm RUN pnpm install --ignore-scripts --frozen-lockfile COPY web/ . -RUN pnpm run generate-translation-types RUN pnpm build FROM rust:1 AS chef @@ -32,7 +29,6 @@ RUN cargo chef cook --release --recipe-path recipe.json # build project COPY --from=web /app/dist ./web/dist -COPY web/src/shared/images/svg ./web/src/shared/images/svg RUN apt-get update && apt-get -y install protobuf-compiler libprotobuf-dev COPY Cargo.toml Cargo.lock build.rs ./ # for vergen @@ -43,8 +39,8 @@ RUN cargo install --locked --path . --root /build # run FROM debian:13-slim AS runtime -RUN apt-get update -y && \ - apt-get install --no-install-recommends -y ca-certificates && \ +RUN apt-get update -y && apt upgrade -y && \ + apt-get install --no-install-recommends -y ca-certificates libssl-dev && \ rm -rf /var/lib/apt/lists/* WORKDIR /app COPY --from=builder /build/bin/defguard-proxy . diff --git a/README.md b/README.md index ae3f49b..49d52c8 100644 --- a/README.md +++ b/README.md @@ -23,25 +23,28 @@ Find us on Matrix: [#defguard:teonite.com](https://matrix.to/#/#defguard:teonite Please review the [Contributing guide](https://defguard.gitbook.io/defguard/for-developers/contributing) for information on how to get started contributing to the project. You might also find our [environment setup guide](https://defguard.gitbook.io/defguard/for-developers/dev-env-setup) handy. - ## Development Clone repository: + ```bash git@github.com:DefGuard/client.git ``` Initialize `proto` submodule: + ```bash git submodule update --init --recursive ``` To run API server: + ```bash cargo run ``` To run webapp dev server: + ```bash cd web/ pnpm install @@ -76,5 +79,3 @@ All release assets (binaries, packages, etc.) include SHA256 checksums that are # Linux/macOS echo known_sha256_checksum_of_the_file path/to/file | sha256sum --check ``` - - diff --git a/src/assets.rs b/src/assets.rs index 0ae3ddc..b229dfd 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -15,17 +15,9 @@ pub async fn index() -> impl IntoResponse { web_asset(Uri::from_static("/index.html")).await } -pub async fn svg(uri: Uri) -> impl IntoResponse { - let mut path = uri.path().trim_start_matches('/').to_string(); - // Rewrite the path to match the structure of the embedded files - path.insert_str(0, "src/shared/images/"); - StaticFile(path) -} - #[derive(Embed)] #[folder = "web/"] #[include = "dist/*"] -#[include = "src/shared/images/*"] struct WebAsset; pub struct StaticFile(pub T); diff --git a/src/enterprise/handlers/desktop_client_mfa.rs b/src/enterprise/handlers/desktop_client_mfa.rs index e4e98fa..fc75614 100644 --- a/src/enterprise/handlers/desktop_client_mfa.rs +++ b/src/enterprise/handlers/desktop_client_mfa.rs @@ -21,23 +21,24 @@ pub(super) async fn mfa_auth_callback( ) -> Result { info!("Processing MFA authentication callback"); debug!( - "Received payload: state={}, flow_type={}", + "Received payload: state={}, flow_type={:?}", payload.state, payload.flow_type ); - let flow_type = payload.flow_type.parse::().map_err(|err| { - warn!("Failed to parse flow type '{}': {err:?}", payload.flow_type); - ApiError::BadRequest("Invalid flow type".into()) - })?; - - if flow_type != FlowType::Mfa { - warn!("Invalid flow type for MFA callback: {flow_type:?}"); - return Err(ApiError::BadRequest( - "Invalid flow type for MFA callback".into(), - )); + match payload.flow_type { + FlowType::Mfa => (), + FlowType::Enrollment => { + warn!( + "Invalid flow type for MFA callback: {:?}", + payload.flow_type + ); + return Err(ApiError::BadRequest( + "Invalid flow type for MFA callback".into(), + )); + } } - debug!("Flow type validation passed: {flow_type:?}"); + debug!("Flow type validation passed: {:?}", payload.flow_type); let nonce = private_cookies .get(NONCE_COOKIE_NAME) @@ -78,7 +79,7 @@ pub(super) async fn mfa_auth_callback( let request = ClientMfaOidcAuthenticateRequest { code: payload.code, nonce, - callback_url: state.callback_url(&flow_type).to_string(), + callback_url: state.callback_url(&payload.flow_type).to_string(), state: payload.state, }; diff --git a/src/enterprise/handlers/openid_login.rs b/src/enterprise/handlers/openid_login.rs index ea0af22..49ad838 100644 --- a/src/enterprise/handlers/openid_login.rs +++ b/src/enterprise/handlers/openid_login.rs @@ -44,29 +44,18 @@ impl AuthInfo { } } -#[derive(Deserialize, Debug, PartialEq, Eq)] +#[derive(Deserialize, Debug)] +#[serde(rename_all = "lowercase")] pub(crate) enum FlowType { Enrollment, Mfa, } -impl std::str::FromStr for FlowType { - type Err = (); - - fn from_str(s: &str) -> Result { - match s.to_lowercase().as_str() { - "enrollment" => Ok(FlowType::Enrollment), - "mfa" => Ok(FlowType::Mfa), - _ => Err(()), - } - } -} - #[derive(Deserialize, Debug)] -struct RequestData { +pub(crate) struct RequestData { state: Option, #[serde(rename = "type")] - flow_type: String, + flow_type: FlowType, } /// Request external OAuth2/OpenID provider details from Defguard Core. @@ -79,13 +68,8 @@ async fn auth_info( ) -> Result<(PrivateCookieJar, Json), ApiError> { debug!("Getting auth info for OAuth2/OpenID login"); - let flow_type = request_data - .flow_type - .parse::() - .map_err(|()| ApiError::BadRequest("Invalid flow type".into()))?; - let request = AuthInfoRequest { - redirect_url: state.callback_url(&flow_type).to_string(), + redirect_url: state.callback_url(&request_data.flow_type).to_string(), state: request_data.state, }; @@ -127,7 +111,7 @@ pub(super) struct AuthenticationResponse { pub(super) code: String, pub(super) state: String, #[serde(rename = "type")] - pub(super) flow_type: String, + pub(super) flow_type: FlowType, } #[derive(Serialize)] @@ -143,15 +127,13 @@ async fn auth_callback( mut private_cookies: PrivateCookieJar, Json(payload): Json, ) -> Result<(PrivateCookieJar, Json), ApiError> { - let flow_type = payload - .flow_type - .parse::() - .map_err(|()| ApiError::BadRequest("Invalid flow type".into()))?; - - if flow_type != FlowType::Enrollment { - return Err(ApiError::BadRequest( - "Invalid flow type for OpenID enrollment callback".into(), - )); + match payload.flow_type { + FlowType::Enrollment => (), + FlowType::Mfa => { + return Err(ApiError::BadRequest( + "Invalid flow type for OpenID enrollment callback".into(), + )); + } } let nonce = private_cookies @@ -176,7 +158,7 @@ async fn auth_callback( let request = AuthCallbackRequest { code: payload.code, nonce, - callback_url: state.callback_url(&flow_type).to_string(), + callback_url: state.callback_url(&payload.flow_type).to_string(), }; let rx = state diff --git a/src/error.rs b/src/error.rs index af5d2eb..b67b35c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -28,11 +28,13 @@ pub enum ApiError { EnterpriseNotEnabled, #[error("Precondition required: {0}")] PreconditionRequired(String), + #[error("Bad request: {0}")] + NotFound(String), } impl IntoResponse for ApiError { fn into_response(self) -> Response { - error!("{}", self); + error!("{self}"); let (status, error_message) = match self { Self::Unauthorized(msg) => (StatusCode::UNAUTHORIZED, msg), Self::BadRequest(msg) => (StatusCode::BAD_REQUEST, msg), @@ -42,15 +44,14 @@ impl IntoResponse for ApiError { "Enterprise features are not enabled".to_string(), ), Self::PreconditionRequired(msg) => (StatusCode::PRECONDITION_REQUIRED, msg), + Self::NotFound(msg) => (StatusCode::NOT_FOUND, msg), _ => ( StatusCode::INTERNAL_SERVER_ERROR, "Internal server error".to_string(), ), }; - let body = Json(json!({ - "error": error_message, - })); + let body = Json(json!({"error": error_message})); (status, body).into_response() } @@ -78,6 +79,7 @@ impl From for ApiError { _ => ApiError::PreconditionRequired(status.message().to_string()), }, Code::Unavailable => ApiError::CoreTimeout, + Code::NotFound => ApiError::NotFound(status.to_string()), _ => ApiError::Unexpected(status.to_string()), } } diff --git a/src/handlers/desktop_client_mfa.rs b/src/handlers/desktop_client_mfa.rs index 4c333b6..26662a8 100644 --- a/src/handlers/desktop_client_mfa.rs +++ b/src/handlers/desktop_client_mfa.rs @@ -196,7 +196,7 @@ async fn finish_remote_mfa( if let Some(sender) = sender_option { let _ = sender.send(response.preshared_key); } - // If desktop stopped listening for the result, there will be no palce to send the + // If desktop stopped listening for the result, there will be no place to send the // result. else { error!("Remote MFA approve finished but session was not found."); diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index c01763c..cf39100 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -55,18 +55,21 @@ where /// /// Waits for core response with a given timeout and returns the response payload. pub(crate) async fn get_core_response(rx: Receiver) -> Result { - debug!("Fetching core response..."); + debug!("Fetching core response."); if let Ok(core_response) = timeout(CORE_RESPONSE_TIMEOUT, rx).await { debug!("Got gRPC response from Defguard Core"); if let Ok(Payload::CoreError(core_error)) = core_response { if core_error.status_code == Code::FailedPrecondition as i32 && core_error.message == "no valid license" { - debug!("Tried to get core response related to an enterprise feature but the enterprise is not enabled, ignoring it..."); + debug!( + "Tried to get response from Core related to an enterprise feature but the \ + enterprise is not enabled, ignoring it." + ); return Err(ApiError::EnterpriseNotEnabled); } error!( - "Received an error response from the core service. | status code: {} message: {}", + "Received an error response from Core service. | status code: {} message: {}", core_error.status_code, core_error.message ); return Err(core_error.into()); @@ -74,7 +77,7 @@ pub(crate) async fn get_core_response(rx: Receiver) -> Result() -> Result>, ApiError> { } async fn healthcheck() -> &'static str { - "I'm alive!" + "alive" } async fn healthcheckgrpc(State(state): State) -> (StatusCode, &'static str) { if state.grpc_server.connected.load(Ordering::Relaxed) { - (StatusCode::OK, "Alive") + (StatusCode::OK, "alive") } else { ( StatusCode::SERVICE_UNAVAILABLE, @@ -158,6 +159,13 @@ async fn core_version_middleware( response } +async fn powered_by_header(mut response: Response) -> Response { + response + .headers_mut() + .insert(X_POWERED_BY, HeaderValue::from_static("Defguard")); + response +} + pub async fn run_server(config: Config) -> anyhow::Result<()> { info!("Starting Defguard Proxy server"); debug!("Using config: {config:?}"); @@ -265,7 +273,6 @@ pub async fn run_server(config: Config) -> anyhow::Result<()> { .route("/{*path}", get(index)) .route("/fonts/{*path}", get(web_asset)) .route("/assets/{*path}", get(web_asset)) - .route("/svg/{*path}", get(svg)) .nest( "/api/v1", Router::new() @@ -279,6 +286,7 @@ pub async fn run_server(config: Config) -> anyhow::Result<()> { .route("/info", get(app_info)), ) .fallback_service(get(handle_404)) + .layer(middleware::map_response(powered_by_header)) .layer(middleware::from_fn_with_state( shared_state.clone(), core_version_middleware, diff --git a/web/.editorconfig b/web/.editorconfig index e24ee12..73f4103 100644 --- a/web/.editorconfig +++ b/web/.editorconfig @@ -7,22 +7,5 @@ insert_final_newline = true indent_style = space indent_size = 2 -[*.{ts,tsx}] -indent_style = space -indent_size = 2 +[*.{ts,tsx,js,jsx,scss,html,json,yaml}] rulers = 90 - -[*.{scss}] -indent_style = space -indent_size = 2 -rulers = 90 - -[*.{html}] -indent_style = space -indent_size = 2 -rulers = 90 - -[*.{json,yaml}] -indent_style = space -indent_size = 2 -rulers = 80 diff --git a/web/.env.template b/web/.env.template new file mode 100644 index 0000000..5b9b47d --- /dev/null +++ b/web/.env.template @@ -0,0 +1,2 @@ +VITE_UPDATE_BASE_URL="/update/api" +UPDATE_TARGET_URL="" diff --git a/web/.gitattributes b/web/.gitattributes new file mode 100644 index 0000000..ee7f45a --- /dev/null +++ b/web/.gitattributes @@ -0,0 +1,36 @@ +* text=auto eol=lf + +*.js text eol=lf +*.jsx text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.json text eol=lf +*.html text eol=lf +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.lock text eol=lf + +*.woff binary +*.woff2 binary +*.ttf binary +*.otf binary +*.eot binary +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.webp binary +*.avif binary +*.ico binary +*.mp4 binary +*.webm binary +*.ogg binary +*.mp3 binary +*.wav binary +*.pdf binary +*.zip binary +*.tar binary +*.gz binary diff --git a/web/.gitignore b/web/.gitignore index 402e11d..b3ee71f 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -8,11 +8,11 @@ pnpm-debug.log* lerna-debug.log* node_modules -./node_modules -./node_modules/* dist dist-ssr *.local +project.inlang/cache +.env.development # Editor directories and files .vscode/* @@ -24,3 +24,4 @@ dist-ssr *.njsproj *.sln *.sw? +.tanstack diff --git a/web/.npmrc b/web/.npmrc deleted file mode 100644 index fa4e095..0000000 --- a/web/.npmrc +++ /dev/null @@ -1 +0,0 @@ -strict-peer-dependencies=false \ No newline at end of file diff --git a/web/.nvmrc b/web/.nvmrc deleted file mode 100644 index 19f23bc..0000000 --- a/web/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v24.4 diff --git a/web/.prettierignore b/web/.prettierignore index 13a3107..74dbecd 100644 --- a/web/.prettierignore +++ b/web/.prettierignore @@ -1,2 +1,4 @@ /src/i18n/*.ts /src/i18n/*.tsx +/src/**/*.tsx +/src/**/*.ts diff --git a/web/.prettierrc b/web/.prettierrc index 9a50f22..71a0f32 100644 --- a/web/.prettierrc +++ b/web/.prettierrc @@ -3,5 +3,6 @@ "tabWidth": 2, "singleQuote": true, "useTabs": false, - "printWidth": 90 + "printWidth": 90, + "endOfLine": "lf" } diff --git a/web/.stylelintrc.json b/web/.stylelintrc.json new file mode 100644 index 0000000..6a4e213 --- /dev/null +++ b/web/.stylelintrc.json @@ -0,0 +1,10 @@ +{ + "extends": ["stylelint-config-standard-scss"], + "plugins": ["stylelint-scss"], + "rules": { + "at-rule-no-unknown": null, + "scss/at-rule-no-unknown": true, + "custom-property-empty-line-before": null, + "value-keyword-case": null + } +} diff --git a/web/.typesafe-i18n.json b/web/.typesafe-i18n.json deleted file mode 100644 index dd9526a..0000000 --- a/web/.typesafe-i18n.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "adapter": "react", - "$schema": "https://unpkg.com/typesafe-i18n@5.26.2/schema/typesafe-i18n.json" -} diff --git a/web/.vscode/extensions.json b/web/.vscode/extensions.json new file mode 100644 index 0000000..116d685 --- /dev/null +++ b/web/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "inlang.vs-code-extension" + ] +} \ No newline at end of file diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 2a528fa..0000000 --- a/web/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Defguard client frontend - -## Development - -### Install pnpm -```bash -npm i -g pnpm -``` -### Install dependencies -```bash -pnpm install -``` -### Start dev server -```bash -pnpm dev -``` - -## Building -### After installing deps -```bash -pnpm build -``` diff --git a/web/biome.json b/web/biome.json index 920639d..b583f36 100644 --- a/web/biome.json +++ b/web/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", + "$schema": "https://biomejs.dev/schemas/2.2.4/schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -9,90 +9,53 @@ "ignoreUnknown": false, "includes": [ "src/**", - "!src/i18n/*.ts", - "!src/i18n/*.tsx", - "!src/i18n/i18n-util", - "!dist" + "!src/messages", + "!src/paraglide/**/*.js", + "!src/routeTree.gen.ts" ] }, "formatter": { "enabled": true, "formatWithErrors": false, - "indentStyle": "space", - "indentWidth": 2, - "lineEnding": "lf", - "lineWidth": 90, "attributePosition": "auto", "bracketSameLine": false, "bracketSpacing": true, "expand": "auto", - "useEditorconfig": true, - "includes": ["./src/**"] + "lineEnding": "lf", + "lineWidth": 90, + "indentStyle": "space", + "useEditorconfig": true }, "linter": { "enabled": true, "rules": { "recommended": true, "a11y": "off", - "complexity": { - "noBannedTypes": "error", - "noUselessTypeConstraint": "error" - }, "correctness": { - "noChildrenProp": "error", - "noPrecisionLoss": "error", - "noUnusedVariables": "error", - "useExhaustiveDependencies": "error", - "useHookAtTopLevel": "error", - "useJsxKeyInIterable": "error", "useUniqueElementIds": "off" }, - "security": { - "noDangerouslySetInnerHtmlWithChildren": "error" - }, "style": { - "noNamespace": "error", - "noNonNullAssertion": "error", - "useArrayLiterals": "error", - "useAsConstAssertion": "error", - "useBlockStatements": "off", - "useLiteralEnumMembers": "off" + "useLiteralEnumMembers": "off", + "useBlockStatements": "off" }, "suspicious": { - "noCommentText": "error", - "noDuplicateJsxProps": "error", - "noExplicitAny": "error", - "noExtraNonNullAssertion": "error", - "noMisleadingInstantiator": "error", - "noUnsafeDeclarationMerging": "error", "noArrayIndexKey": "off" } - }, - "includes": ["src/**"] + } }, "javascript": { "formatter": { + "quoteStyle": "single", "jsxQuoteStyle": "double", "quoteProperties": "asNeeded", "trailingCommas": "all", "semicolons": "always", "arrowParentheses": "always", - "bracketSameLine": false, - "quoteStyle": "single", "attributePosition": "auto", + "bracketSameLine": false, "bracketSpacing": true } }, - "html": { - "formatter": { - "selfCloseVoidElements": "always" - } - }, - "overrides": [ - { - "includes": ["**/*.js"] - } - ], "assist": { "enabled": true, "actions": { diff --git a/web/index.html b/web/index.html index 2f94d84..965f209 100644 --- a/web/index.html +++ b/web/index.html @@ -4,15 +4,80 @@ - Enrollment Wizard + + Defguard Enrollment Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
-
- \ No newline at end of file + diff --git a/web/messages/en.json b/web/messages/en.json new file mode 100644 index 0000000..e3aa70f --- /dev/null +++ b/web/messages/en.json @@ -0,0 +1,102 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "misc_or": "or", + "misc_and": "and", + "misc_for": "for", + "controls_back": "Back", + "controls_continue": "Continue", + "controls_cancel": "Cancel", + "controls_submit": "Submit", + "controls_hide": "Hide", + "controls_show": "Show", + "controls_got_it": "Got it", + "form_error_min_len": "Minimum length of {length}", + "form_error_email": "Enter valid email", + "form_error_required": "Field is required", + "form_error_token": "Token is not valid", + "form_label_token": "Token", + "form_label_email": "email", + "form_label_url": "URL", + "cmp_enrol_step": "Step {current}/{max}", + "cmp_enrol_final": "Final step", + "cmp_openid_button": "Sign in with {provider}", + "cmp_copy_field_tooltip": "Copied", + "footer_contact": "If you need assistance, please contact your defguard administrator at.", + "session_end_title": "Session expired.", + "session_end_subtitle": "Please start the process again.", + "session_end_link": "Back to main page", + "start_footer_copyright": "Copyright ©2023-{currentYear} Defguard Sp. z o.o.", + "start_multi_title": "Get Started with Defguard", + "start_multi_subtitle": "Please select the option that suits your needs.", + "start_multi_enrollment_title": "Enrollment process", + "start_multi_enrollment_subtitle": "Configure your device in a few simple steps to access your VPN.", + "start_multi_enrollment_button": "Launch enrollment", + "start_multi_password_title": "Password reset", + "start_multi_password_subtitle": "Use this option to reset your internal Defguard access password.", + "start_multi_password_button": "Reset password", + "password_start_title": "Reset password", + "password_start_subtitle": "Please enter your email associated with your defguard account.", + "password_start_form_explain": "After you submit the request, a password reset link will be sent to the email you provide. It may take a few minutes. If you do not receive the email in several minutes, please check your spam folder.", + "password_start_form_label_email": "Email", + "password_start_submit": "Send request", + "password_sent_title": "Your request has been sent.", + "password_sent_subTitle": "If the provided email address is assigned to any account, the password reset will be initiated and you will receive an email with further instructions.", + "password_sent_link": "Back to main page", + "password_form_title": "Create new password", + "password_form_subtitle": "Set up a strong password to protect your account.", + "password_form_labels_password": "Create new password", + "password_form_labels_repeat": "Confirm new password", + "password_form_check_title": "Your password must include:", + "password_form_check_number": "At least one number required", + "password_form_check_special": "At least one special character", + "password_form_check_lowercase": "At least one lowercase character", + "password_form_check_uppercase": "At least one uppercase character", + "password_form_check_minimum": "Minimum length of 8", + "password_form_check_repeat_match": "Password's doesn't match", + "password_form_special_error": "Password doesn't meet the requirements. Please check the list below.", + "password_form_submit": "Submit new password", + "password_end_title": "Password successfully updated.", + "password_end_subtitle": "Password successfully updated.", + "password_end_link": "Go to Log in", + "client_download_apple_help_title": "Apple hardware type", + "client_download_apple_help_content_1": "Click the Apple logo in the top-left corner of your screen and choose About This Mac.", + "client_download_apple_help_content_2": "Under the Processor section, you'll see the type of hardware your Mac is using.", + "client_download_title": "Download Defguard application", + "client_download_subtitle": "Download the client/app you want to activate VPN access on.", + "client_download_label_desktop": "Desktop clients", + "client_download_label_mobile": "Mobile applications", + "client_download_for": "Defguard for {platform}", + "client_download_supports_newer": "Supports {platform} and newer.", + "client_download_supports_and": "Supports {platform} and {other}.", + "client_download_supports_linux": "Supports a variety of distributions.", + "client_download_works_with": "Works with {platform}.", + "client_download_modal_title": "Download confirmation", + "client_download_modal_content": "Please make sure to download at least one client, as you'll need it in the next step to configure your VPN device.", + "client_download_modal_cancel": "Back to download", + "client_download_apple_help_header": "Apple Hardware", + "client_download_mobile_warning": "Enrollment process (setting up device, setting up account password and Multi-Factor) is only supported now on desktop client. You can configure your mobile client later in Defguard - after connecting to vpn from desktop client and accessing defguard-url.com", + "enrollment_start_title": "Select activation type", + "enrollment_start_subtitle": "Select the configuration type based on your organization's approach.", + "enrollment_start_external_title": "Sign in with External SSO", + "enrollment_start_external_subtitle": "Select this option if you want to start the enrollment process using an external SSO (Google, Microsoft, etc.).", + "enrollment_start_internal_title": "Enter personal enrolment token", + "enrollment_start_internal_subtitle": "Select this option if your administrator has sent you an email or message with your personal token. If you haven't received your token, please contact your administrator.", + "client_setup_title": "Configure your Defguard client", + "client_setup_subtitle": "Select the activation method according to your device type.", + "client_setup_download_label": "Get the desktop client", + "client_setup_desktop_title": "Desktop client", + "client_setup_desktop_auto_title": "Automatic configuration", + "client_setup_desktop_auto_explain_1": "Click the button below for automatic configuration.", + "client_setup_desktop_auto_explain_2": "Before using this option make sure the Defguard desktop client is already installed.", + "client_setup_desktop_auto_button_one_click": "One-Click Configuration", + "client_setup_desktop_auto_button_download": "Download for Desktop", + "client_setup_desktop_manual_title": "Manual configuration", + "client_setup_desktop_manual_subtitle": "Activate your desktop client manually by entering the URL and token you see bellow.", + "client_setup_desktop_manual_fold": "{intent} advanced configuration", + "client_setup_mobile_title": "Mobile application", + "client_setup_mobile_subtitle": "Scan QR code bellow to activate Defguard mobile application.", + "client_setup_mobile_forgot": "If you forgot to install the mobile app, click one of the buttons bellow.", + "client_setup_mobile_google": "Google Play", + "client_setup_mobile_apple": "Apple Store", + "client_setup_footer_extra": "Once your Defguard client is configured, you can close this window." +} diff --git a/web/package.json b/web/package.json index cde9672..4182080 100644 --- a/web/package.json +++ b/web/package.json @@ -1,108 +1,63 @@ { - "name": "client", - "private": false, - "version": "0.3.0", + "name": "web", + "private": true, + "version": "0.0.1", "type": "module", "scripts": { - "dev": "npm-run-all --parallel vite typesafe-i18n", - "typecheck": "tsc --project ./tsconfig.app.json", - "build": "pnpm run typecheck && vite build", + "dev": "vite", + "build": "vite build && tsc -b", "preview": "vite preview", - "typesafe-i18n": "typesafe-i18n", - "generate-translation-types": "typesafe-i18n --no-watch", - "fix": "biome check --fix && prettier src/**/*.scss -w --log-level silent", - "lint": "biome lint && pnpm run typecheck && prettier src/**/*.scss --check --log-level error", - "lint-ci": "biome ci && pnpm run typecheck && prettier src/**/*.scss --check --log-level error", - "vite": "vite", - "prettier": "prettier", - "parse-svgs": "svgr --no-index --jsx-runtime 'automatic' --svgo-config ./svgo.config.json --prettier-config ./.prettierrc --out-dir ./src/shared/components/svg/ --typescript ./src/shared/images/svg/", - "svgr": "svgr" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "pnpm": { - "peerDependencyRules": { - "ignoreMissing": [ - "react-native" - ] - }, - "onlyBuiltDependencies": [ - "@parcel/watcher", - "@swc/core", - "esbuild" - ] + "biome": "biome", + "lint": "biome check ./src/ && prettier src/**/*.scss --check --log-level error && stylelint \"src/**/*.scss\" -c ./.stylelintrc.json && tsc -b", + "fix": "biome check ./src/ --write --unsafe && prettier src/**/*.scss -w --log-level silent", + "tsc": "tsc" }, "dependencies": { + "@axa-ch/react-polymorphic-types": "^1.4.1", "@floating-ui/react": "^0.27.16", - "@hookform/resolvers": "^5.2.1", - "@react-hook/resize-observer": "^2.0.2", - "@stablelib/base64": "^2.0.1", - "@stablelib/x25519": "^2.0.1", - "@tanstack/query-core": "^4.41.0", - "@tanstack/react-virtual": "^3.13.12", - "@use-gesture/react": "^10.3.1", + "@inlang/paraglide-js": "^2.3.2", + "@tanstack/react-devtools": "^0.7.0", + "@tanstack/react-form": "^1.23.1", + "@tanstack/react-query": "^5.90.2", + "@tanstack/react-query-devtools": "^5.90.2", + "@tanstack/react-router": "^1.132.2", + "@tanstack/react-router-devtools": "^1.132.2", + "@uidotdev/usehooks": "^2.4.1", "axios": "^1.12.2", - "byte-size": "^9.0.1", - "classnames": "^2.5.1", - "clipboardy": "^4.0.0", + "change-case": "^5.4.4", "clsx": "^2.1.1", "dayjs": "^1.11.18", - "detect-browser": "^5.3.0", - "fast-deep-equal": "^3.1.3", - "file-saver": "^2.0.5", - "get-text-width": "^1.0.3", - "html-react-parser": "^5.2.6", - "itertools": "^2.4.1", "lodash-es": "^4.17.21", - "merge-refs": "^2.0.0", - "millify": "^6.1.0", - "motion": "^12.23.12", - "radash": "^12.1.1", + "motion": "^12.23.21", + "qrcode.react": "^4.2.0", + "qs": "^6.14.0", "react": "^19.1.1", - "react-click-away-listener": "^2.4.0", "react-dom": "^19.1.1", - "react-hook-form": "^7.62.0", - "react-loading-skeleton": "^3.5.0", "react-markdown": "^10.1.0", - "react-qr-code": "^2.0.18", - "react-router-dom": "^6.30.1", - "rehype-sanitize": "^6.0.0", "rxjs": "^7.8.2", - "use-breakpoint": "^4.0.6", - "zod": "^4.1.5", + "zod": "^4.1.11", "zustand": "^5.0.8" }, "devDependencies": { - "@biomejs/biome": "2.2.2", - "@hookform/devtools": "^4.4.0", - "@svgr/cli": "^8.1.0", - "@tanstack/react-query": "^4.41.0", - "@tanstack/react-query-devtools": "^4.41.0", - "@types/byte-size": "^8.1.2", - "@types/file-saver": "^2.0.7", + "@biomejs/biome": "2.2.4", + "@inlang/paraglide-js": "2.3.2", + "@tanstack/router-plugin": "^1.132.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^24.3.1", - "@types/react": "^19.1.12", + "@types/node": "^24.5.2", + "@types/qs": "^6.14.0", + "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "@vitejs/plugin-react-swc": "^4.0.1", - "autoprefixer": "^10.4.21", - "npm-run-all": "^4.1.5", - "postcss": "^8.5.6", + "@vitejs/plugin-react-swc": "^4.1.0", + "globals": "^16.4.0", "prettier": "^3.6.2", - "sass": "~1.92.1", - "typesafe-i18n": "^5.26.2", - "typescript": "^5.9.2", - "vite": "^7.1.5" + "sass": "^1.93.2", + "sharp": "^0.34.4", + "stylelint": "^16.24.0", + "stylelint-config-standard-scss": "^16.0.0", + "stylelint-scss": "^6.12.1", + "typescript": "~5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7", + "vite-plugin-image-optimizer": "^2.0.2" } -} \ No newline at end of file +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 64e7514..684cf22 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -8,187 +8,145 @@ importers: .: dependencies: + '@axa-ch/react-polymorphic-types': + specifier: ^1.4.1 + version: 1.4.1(@types/react@19.1.13)(react@19.1.1) '@floating-ui/react': specifier: ^0.27.16 version: 0.27.16(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@hookform/resolvers': - specifier: ^5.2.1 - version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) - '@react-hook/resize-observer': - specifier: ^2.0.2 - version: 2.0.2(react@19.1.1) - '@stablelib/base64': - specifier: ^2.0.1 - version: 2.0.1 - '@stablelib/x25519': - specifier: ^2.0.1 - version: 2.0.1 - '@tanstack/query-core': - specifier: ^4.41.0 - version: 4.41.0 - '@tanstack/react-virtual': - specifier: ^3.13.12 - version: 3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@use-gesture/react': - specifier: ^10.3.1 - version: 10.3.1(react@19.1.1) + '@inlang/paraglide-js': + specifier: ^2.3.2 + version: 2.3.2 + '@tanstack/react-devtools': + specifier: ^0.7.0 + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + '@tanstack/react-form': + specifier: ^1.23.1 + version: 1.23.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-query': + specifier: ^5.90.2 + version: 5.90.2(react@19.1.1) + '@tanstack/react-query-devtools': + specifier: ^5.90.2 + version: 5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1) + '@tanstack/react-router': + specifier: ^1.132.2 + version: 1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-router-devtools': + specifier: ^1.132.2 + version: 1.132.2(@tanstack/react-router@1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.93.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.5) + '@uidotdev/usehooks': + specifier: ^2.4.1 + version: 2.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) axios: specifier: ^1.12.2 version: 1.12.2 - byte-size: - specifier: ^9.0.1 - version: 9.0.1 - classnames: - specifier: ^2.5.1 - version: 2.5.1 - clipboardy: - specifier: ^4.0.0 - version: 4.0.0 + change-case: + specifier: ^5.4.4 + version: 5.4.4 clsx: specifier: ^2.1.1 version: 2.1.1 dayjs: specifier: ^1.11.18 version: 1.11.18 - detect-browser: - specifier: ^5.3.0 - version: 5.3.0 - fast-deep-equal: - specifier: ^3.1.3 - version: 3.1.3 - file-saver: - specifier: ^2.0.5 - version: 2.0.5 - get-text-width: - specifier: ^1.0.3 - version: 1.0.3 - html-react-parser: - specifier: ^5.2.6 - version: 5.2.6(@types/react@19.1.12)(react@19.1.1) - itertools: - specifier: ^2.4.1 - version: 2.4.1 lodash-es: specifier: ^4.17.21 version: 4.17.21 - merge-refs: - specifier: ^2.0.0 - version: 2.0.0(@types/react@19.1.12) - millify: - specifier: ^6.1.0 - version: 6.1.0 motion: - specifier: ^12.23.12 - version: 12.23.12(@emotion/is-prop-valid@1.4.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - radash: - specifier: ^12.1.1 - version: 12.1.1 + specifier: ^12.23.21 + version: 12.23.21(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + qrcode.react: + specifier: ^4.2.0 + version: 4.2.0(react@19.1.1) + qs: + specifier: ^6.14.0 + version: 6.14.0 react: specifier: ^19.1.1 version: 19.1.1 - react-click-away-listener: - specifier: ^2.4.0 - version: 2.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-dom: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) - react-hook-form: - specifier: ^7.62.0 - version: 7.62.0(react@19.1.1) - react-loading-skeleton: - specifier: ^3.5.0 - version: 3.5.0(react@19.1.1) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.1.12)(react@19.1.1) - react-qr-code: - specifier: ^2.0.18 - version: 2.0.18(react@19.1.1) - react-router-dom: - specifier: ^6.30.1 - version: 6.30.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - rehype-sanitize: - specifier: ^6.0.0 - version: 6.0.0 + version: 10.1.0(@types/react@19.1.13)(react@19.1.1) rxjs: specifier: ^7.8.2 version: 7.8.2 - use-breakpoint: - specifier: ^4.0.6 - version: 4.0.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) zod: - specifier: ^4.1.5 - version: 4.1.5 + specifier: ^4.1.11 + version: 4.1.11 zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.1.12)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + version: 5.0.8(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) devDependencies: '@biomejs/biome': - specifier: 2.2.2 - version: 2.2.2 - '@hookform/devtools': - specifier: ^4.4.0 - version: 4.4.0(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@svgr/cli': - specifier: ^8.1.0 - version: 8.1.0(typescript@5.9.2) - '@tanstack/react-query': - specifier: ^4.41.0 - version: 4.41.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/react-query-devtools': - specifier: ^4.41.0 - version: 4.41.0(@tanstack/react-query@4.41.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@types/byte-size': - specifier: ^8.1.2 - version: 8.1.2 - '@types/file-saver': - specifier: ^2.0.7 - version: 2.0.7 + specifier: 2.2.4 + version: 2.2.4 + '@tanstack/router-plugin': + specifier: ^1.132.2 + version: 1.132.2(@tanstack/react-router@1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5)) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.5.2 + version: 24.5.2 + '@types/qs': + specifier: ^6.14.0 + version: 6.14.0 '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.13 + version: 19.1.13 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) - '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(sass@1.92.1)) + version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react-swc': - specifier: ^4.0.1 - version: 4.0.1(vite@7.1.5(@types/node@24.3.1)(sass@1.92.1)) - autoprefixer: - specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.6) - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - postcss: - specifier: ^8.5.6 - version: 8.5.6 + specifier: ^4.1.0 + version: 4.1.0(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5)) + globals: + specifier: ^16.4.0 + version: 16.4.0 prettier: specifier: ^3.6.2 version: 3.6.2 sass: - specifier: ~1.92.1 - version: 1.92.1 - typesafe-i18n: - specifier: ^5.26.2 - version: 5.26.2(typescript@5.9.2) + specifier: ^1.93.2 + version: 1.93.2 + sharp: + specifier: ^0.34.4 + version: 0.34.4 + stylelint: + specifier: ^16.24.0 + version: 16.24.0(typescript@5.9.2) + stylelint-config-standard-scss: + specifier: ^16.0.0 + version: 16.0.0(postcss@8.5.6)(stylelint@16.24.0(typescript@5.9.2)) + stylelint-scss: + specifier: ^6.12.1 + version: 6.12.1(stylelint@16.24.0(typescript@5.9.2)) typescript: - specifier: ^5.9.2 + specifier: ~5.9.2 version: 5.9.2 + typescript-eslint: + specifier: ^8.44.1 + version: 8.44.1(eslint@9.35.0)(typescript@5.9.2) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(sass@1.92.1) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) + vite-plugin-image-optimizer: + specifier: ^2.0.2 + version: 2.0.2(sharp@0.34.4)(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5)) packages: + '@axa-ch/react-polymorphic-types@1.4.1': + resolution: {integrity: sha512-2lo5a9slPZbc9hVCC5Z7fXWimd+UWCtETi88uGxsZ6GG5s6sAnwxPDPZKZ8qR/riFSWROglxDGNBtK+8jKz2eQ==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -205,14 +163,28 @@ packages: resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -223,10 +195,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -248,21 +234,35 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} @@ -276,269 +276,291 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} - '@biomejs/biome@2.2.2': - resolution: {integrity: sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==} + '@biomejs/biome@2.2.4': + resolution: {integrity: sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.2.2': - resolution: {integrity: sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==} + '@biomejs/cli-darwin-arm64@2.2.4': + resolution: {integrity: sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.2.2': - resolution: {integrity: sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==} + '@biomejs/cli-darwin-x64@2.2.4': + resolution: {integrity: sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.2.2': - resolution: {integrity: sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==} + '@biomejs/cli-linux-arm64-musl@2.2.4': + resolution: {integrity: sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.2.2': - resolution: {integrity: sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==} + '@biomejs/cli-linux-arm64@2.2.4': + resolution: {integrity: sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.2.2': - resolution: {integrity: sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==} + '@biomejs/cli-linux-x64-musl@2.2.4': + resolution: {integrity: sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.2.2': - resolution: {integrity: sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==} + '@biomejs/cli-linux-x64@2.2.4': + resolution: {integrity: sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.2.2': - resolution: {integrity: sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==} + '@biomejs/cli-win32-arm64@2.2.4': + resolution: {integrity: sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.2.2': - resolution: {integrity: sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==} + '@biomejs/cli-win32-x64@2.2.4': + resolution: {integrity: sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + '@cacheable/memoize@2.0.2': + resolution: {integrity: sha512-wPrr7FUiq3Qt4yQyda2/NcOLTJCFcQSU3Am2adP+WLy+sz93/fKTokVTHmtz+rjp4PD7ee0AEOeRVNN6IvIfsg==} - '@emotion/is-prop-valid@1.4.0': - resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + '@cacheable/memory@2.0.2': + resolution: {integrity: sha512-sJTITLfeCI1rg7P3ssaGmQryq235EGT8dXGcx6oZwX5NRnKq9IE6lddlllcOl+oXW+yaeTRddCjo0xrfU6ZySA==} - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@cacheable/utils@2.0.2': + resolution: {integrity: sha512-JTFM3raFhVv8LH95T7YnZbf2YoE9wEtkPPStuRF9a6ExZ103hFvs+QyCuYJ6r0hA9wRtbzgZtwUCoDWxssZd4Q==} - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + '@csstools/css-tokenizer': ^3.0.4 - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} - '@emotion/styled@11.14.1': - resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} peerDependencies: - react: '>=16.8.0' + postcss-selector-parser: ^7.0.0 - '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.35.0': + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -560,16 +582,158 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@hookform/devtools@4.4.0': - resolution: {integrity: sha512-Mtlic+uigoYBPXlfvPBfiYYUZuyMrD3pTjDpVIhL6eCZTvQkHsKBSKeZCvXWUZr8fqrkzDg27N+ZuazLKq6Vmg==} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - react-dom: ^16.8.0 || ^17 || ^18 || ^19 + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} - '@hookform/resolvers@5.2.1': - resolution: {integrity: sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ==} - peerDependencies: - react-hook-form: ^7.55.0 + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@inlang/paraglide-js@2.3.2': + resolution: {integrity: sha512-mF7ku1AaXQxa6fnbBczXiEAM7lxhYzaAH7FnDVvAbpzNtgRJESi11KN0bzpCH0YhsKLdimFrQlzjaSVlo9Uh+Q==} + hasBin: true + + '@inlang/recommend-sherlock@0.2.1': + resolution: {integrity: sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==} + + '@inlang/sdk@2.4.9': + resolution: {integrity: sha512-cvz/C1rF5WBxzHbEoiBoI6Sz6q6M+TdxfWkEGBYTD77opY8i8WN01prUWXEM87GPF4SZcyIySez9U0Ccm12oFQ==} + engines: {node: '>=18.0.0'} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -584,8 +748,34 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/bigmap@1.0.2': + resolution: {integrity: sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==} + engines: {node: '>= 18'} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@lix-js/sdk@0.4.7': + resolution: {integrity: sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==} + engines: {node: '>=18'} + + '@lix-js/server-protocol-schema@0.1.1': + resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -669,248 +859,146 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@react-hook/latest@1.0.3': - resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} - peerDependencies: - react: '>=16.8' - - '@react-hook/passive-layout-effect@1.2.1': - resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} - peerDependencies: - react: '>=16.8' - - '@react-hook/resize-observer@2.0.2': - resolution: {integrity: sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==} - peerDependencies: - react: '>=18' - - '@remix-run/router@1.23.0': - resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} - engines: {node: '>=14.0.0'} - - '@rolldown/pluginutils@1.0.0-beta.32': - resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + '@rolldown/pluginutils@1.0.0-beta.35': + resolution: {integrity: sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==} - '@rolldown/pluginutils@1.0.0-beta.34': - resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} - - '@rollup/rollup-android-arm-eabi@4.50.1': - resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.1': - resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.1': - resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': - resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.1': - resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': - resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': - resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': - resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.1': - resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.1': - resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': - resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.1': - resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.1': - resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.1': - resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.1': - resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.1': - resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.1': - resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': - resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': - resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} cpu: [x64] os: [win32] - '@stablelib/base64@2.0.1': - resolution: {integrity: sha512-P2z89A7N1ETt6RxgpVdDT2xlg8cnm3n6td0lY9gyK7EiWK3wdq388yFX/hLknkCC0we05OZAD1rfxlQJUbl5VQ==} - - '@stablelib/binary@2.0.1': - resolution: {integrity: sha512-U9iAO8lXgEDONsA0zPPSgcf3HUBNAqHiJmSHgZz62OvC3Hi2Bhc5kTnQ3S1/L+sthDTHtCMhcEiklmIly6uQ3w==} - - '@stablelib/bytes@2.0.1': - resolution: {integrity: sha512-QIzI6V7nkJA5CjOZ7GoceBd4CIKrJoC471VaI6jh1xPQ2cMhkhQK4HddyzCXOR2y+fBF3/5B2HO3FXXI9C+Xzg==} - - '@stablelib/int@2.0.1': - resolution: {integrity: sha512-Ht63fQp3wz/F8U4AlXEPb7hfJOIILs8Lq55jgtD7KueWtyjhVuzcsGLSTAWtZs3XJDZYdF1WcSKn+kBtbzupww==} - - '@stablelib/keyagreement@2.0.1': - resolution: {integrity: sha512-2+tWBLCMtWlHQ7GqjD5L+lQRyWtun4Lou0IOdTML8zuTuAS0EgihnHFx+4uMZwYU1In40J/WlpyKSLidHfStRQ==} - - '@stablelib/random@2.0.1': - resolution: {integrity: sha512-W6GAtXEEs7r+dSbuBsvoFmlyL3gLxle41tQkjKu17dDWtDdjhVUbtRfRCQcCUeczwkgjQxMPopgwYEvxXtHXGw==} - - '@stablelib/wipe@2.0.1': - resolution: {integrity: sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==} - - '@stablelib/x25519@2.0.1': - resolution: {integrity: sha512-qi04HS2puHaBf50kM/kes5QcZFGsx8yF0YmCjLCOa/LPmnBaKEKX9ZR82OnnCwMn72YH13R/bBZgr/UP0aPFfA==} - - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + cpu: [x64] + os: [win32] - '@svgr/babel-plugin-svg-dynamic-title@8.0.0': - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@sinclair/typebox@0.31.28': + resolution: {integrity: sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==} - '@svgr/babel-plugin-svg-em-dimensions@8.0.0': - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} + '@solid-primitives/event-listener@2.4.3': + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} peerDependencies: - '@babel/core': ^7.0.0-0 + solid-js: ^1.6.12 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0': - resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} - engines: {node: '>=14'} + '@solid-primitives/keyboard@1.3.3': + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} peerDependencies: - '@babel/core': ^7.0.0-0 + solid-js: ^1.6.12 - '@svgr/babel-plugin-transform-svg-component@8.0.0': - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} + '@solid-primitives/rootless@1.5.2': + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + solid-js: ^1.6.12 - '@svgr/babel-preset@8.1.0': - resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} - engines: {node: '>=14'} + '@solid-primitives/utils@6.3.2': + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + solid-js: ^1.6.12 - '@svgr/cli@8.1.0': - resolution: {integrity: sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==} - engines: {node: '>=14'} + '@sqlite.org/sqlite-wasm@3.48.0-build4': + resolution: {integrity: sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ==} hasBin: true - '@svgr/core@8.1.0': - resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} - engines: {node: '>=14'} - - '@svgr/hast-util-to-babel-ast@8.0.0': - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} - - '@svgr/plugin-jsx@8.1.0': - resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - - '@svgr/plugin-prettier@8.1.0': - resolution: {integrity: sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - - '@svgr/plugin-svgo@8.1.0': - resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - '@swc/core-darwin-arm64@1.13.5': resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} engines: {node: '>=10'} @@ -986,77 +1074,158 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} - '@tanstack/match-sorter-utils@8.19.4': - resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} - engines: {node: '>=12'} - - '@tanstack/query-core@4.41.0': - resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} + '@tanstack/devtools-event-bus@0.3.2': + resolution: {integrity: sha512-yJT2As/drc+Epu0nsqCsJaKaLcaNGufiNxSlp/+/oeTD0jsBxF9/PJBfh66XVpYXkKr97b8689mSu7QMef0Rrw==} + engines: {node: '>=18'} - '@tanstack/react-query-devtools@4.41.0': - resolution: {integrity: sha512-p0JJcKYyrRYv7HXPttEArIUIYEiFafTrimFfbT/IDmVlakDD9wYQLHAdjgyq+rzXeSmCkXbwVFiMu5zSl5Ka0A==} - peerDependencies: - '@tanstack/react-query': ^4.41.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/devtools-event-client@0.3.1': + resolution: {integrity: sha512-djlxAeMCdLZBEHWjCexPmc5xYKtCYJn2p5gvqeFrpBTSwmNlsrW0K14OixO0nTyoVIYUI4dNV9HWChHAx/w+oA==} + engines: {node: '>=18'} - '@tanstack/react-query@4.41.0': - resolution: {integrity: sha512-4/euCZAv8zeaB5P/nQiySzB0JHM3tiraU9KjSvSlJAX7oIE9uPDZlHCkDg/bHYNXewzvsg0FtOMq0VUq8XMMOQ==} + '@tanstack/devtools-ui@0.3.5': + resolution: {integrity: sha512-DU8OfLntngnph+Tb7ivQvh4F4w+rDu6r01fXlhjq/Nmgdr0gtsOox4kdmyq5rCs+C6aPgP3M7+BE+fv4dN+VvA==} + engines: {node: '>=18'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + solid-js: '>=1.9.7' - '@tanstack/react-virtual@3.13.12': - resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + '@tanstack/devtools@0.6.14': + resolution: {integrity: sha512-dOtHoeLjjcHeNscu+ZEf89EFboQsy0ggb6pf8Sha59qBUeQbjUsaAvwP8Ogwg89oJxFQbTP7DKYNBNw5CxlNEA==} + engines: {node: '>=18'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + solid-js: '>=1.9.7' - '@tanstack/virtual-core@3.13.12': - resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + '@tanstack/form-core@1.23.1': + resolution: {integrity: sha512-PbPMA/vZPNQgePgGYTKBExuSqLS1Z7WFCYRKRjcomjlPXaiE4KFuIJ7AGsLef5F6goXhIUN4KRhtBq54H6YM+w==} - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + '@tanstack/history@1.132.0': + resolution: {integrity: sha512-GG2R9I6QSlbNR9fEuX2sQCigY6K28w51h2634TWmkaHXlzQw+rWuIWr4nAGM9doA+kWRi1LFSFMvAiG3cOqjXQ==} + engines: {node: '>=12'} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@tanstack/query-devtools@5.90.1': + resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==} - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@tanstack/react-devtools@0.7.0': + resolution: {integrity: sha512-HJH+oNBYQotgsKWAQqvkY8KnfQbbZptHbrkPGVaIwj393vVFGT1BuXMYy+rlmOYxczyerb90ltRFgsQyUtJTuw==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=16.8' + '@types/react-dom': '>=16.8' + react: '>=16.8' + react-dom: '>=16.8' - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@tanstack/react-form@1.23.1': + resolution: {integrity: sha512-fRRNNHa86hIyTujkT/HrR3iGw66UczAYHp12qSnUE6HAKghABu0Ls3DfYgYcteYpt3x4RRKzvf02nzi9XeveZg==} + peerDependencies: + '@tanstack/react-start': ^1.130.10 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@tanstack/react-start': + optional: true - '@types/byte-size@8.1.2': - resolution: {integrity: sha512-jGyVzYu6avI8yuqQCNTZd65tzI8HZrLjKX9sdMqZrGWVlNChu0rf6p368oVEDCYJe5BMx2Ov04tD1wqtgTwGSA==} + '@tanstack/react-query-devtools@5.90.2': + resolution: {integrity: sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==} + peerDependencies: + '@tanstack/react-query': ^5.90.2 + react: ^18 || ^19 - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@tanstack/react-query@5.90.2': + resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} + peerDependencies: + react: ^18 || ^19 - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@tanstack/react-router-devtools@1.132.2': + resolution: {integrity: sha512-Vxltjzdc2BDKVGflESGcZIMAqfrCqlpzh6kEsrzt0xC5XkTcjJO9ZupWOuIN/3oMGcX7gqCpWiemaTKBOM5Djw==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/react-router': ^1.132.2 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@tanstack/react-router@1.132.2': + resolution: {integrity: sha512-667txdisNZVLS8jZnu8HNe8fhQAvayMobUBAGsLjMN7YWOT9F9YwGA1tHugtm0PkfS6k4aevBcNpCKZbJsHc5w==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@types/file-saver@2.0.7': - resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + '@tanstack/react-store@0.7.7': + resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@tanstack/router-core@1.132.2': + resolution: {integrity: sha512-PDaEp1tmBirGaNDtrV6AS7awbO42GCegNTxMi0H1mwgWccDwp6RUS7nOF33jPzfBJXhDJ0xFBNdRI3ItakZgug==} + engines: {node: '>=12'} - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@tanstack/router-devtools-core@1.132.2': + resolution: {integrity: sha512-QdBv1Z1dxqnMn1RHvcL58cPQEW3yFmBW+gOK6mr4pzPTPzJpqVP/UA7Mg9wHJGUG50EywTIiWB/x3OrcwVR0Ww==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/router-core': ^1.132.2 + csstype: ^3.0.10 + solid-js: '>=1.9.5' + tiny-invariant: ^1.3.3 + peerDependenciesMeta: + csstype: + optional: true + + '@tanstack/router-generator@1.132.2': + resolution: {integrity: sha512-Y3wnh+aMJtNXr9v+IoeIlN3o/I82y6vpu00mKMIJt4YlgDbsdQXRqriJolvfFpMMjKqYxUo9NE2/KvKI9zUm5A==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.132.2': + resolution: {integrity: sha512-gizOuK733HnqW2UqjkYCK4fUuxvKtD8bWw6H2HXnLPbxoLfDXAiMJ1qD7vnSAg1Ovts19k0wGGAJtcdZu+3FJA==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.132.2 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' + vite-plugin-solid: ^2.11.8 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.132.0': + resolution: {integrity: sha512-WDnvAi9kO20joLDzlsTvfgXNv+FgQ4G98xAD8r4jKWoTdTTG05DU2sRYimtbdq4Q7E3uVdvyvPdhRy45wan7bw==} + engines: {node: '>=12'} + + '@tanstack/store@0.7.7': + resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} + + '@tanstack/virtual-file-routes@1.132.0': + resolution: {integrity: sha512-d3do4ih9IdLPBVY4Gb8x7Ho7z0oFDLpxoao7uNVkfWtYU7nc3B+rnnVejXIgprmI5gt1hNzyNDJFr8G/W926GA==} + engines: {node: '>=12'} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} '@types/lodash@4.17.20': resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} @@ -1067,19 +1236,19 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@24.3.1': - resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/react-dom@19.1.9': resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.12': - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + '@types/react@19.1.13': + resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1087,76 +1256,143 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@typescript-eslint/eslint-plugin@8.44.1': + resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.44.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.44.1': + resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' - '@use-gesture/core@10.3.1': - resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@use-gesture/react@10.3.1': - resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} + '@uidotdev/usehooks@2.4.1': + resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==} + engines: {node: '>=16'} peerDependencies: - react: '>= 16.8.0' + react: '>=18.0.0' + react-dom: '>=18.0.0' - '@vitejs/plugin-react-swc@4.0.1': - resolution: {integrity: sha512-NQhPjysi5duItyrMd5JWZFf2vNOuSMyw+EoZyTBDzk+DkfYD8WNrsUs09sELV2cr1P15nufsN25hsUBt4CKF9Q==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react-swc@4.1.0': + resolution: {integrity: sha512-Ff690TUck0Anlh7wdIcnsVMhofeEVgm44Y4OYdeeEEPSKyZHzDI9gfVBvySEhDfXtBp8tLCbfsVKPWEMEjq8/g==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4 || ^5 || ^6 || ^7 - '@vitejs/plugin-react@5.0.2': - resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==} - engines: {node: ^20.19.0 || >=22.12.0} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - axios@1.12.2: resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1164,8 +1400,16 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1177,28 +1421,18 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.4: - resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - byte-size@9.0.1: - resolution: {integrity: sha512-YLe9x3rabBrcI0cueCdLS2l5ONUKywcRpTs02B8KP9/Cimhj7o3ZccGrPnRvcbyHMbb7W79/3MUJl7iGgTXKEw==} - engines: {node: '>=12.17'} - peerDependencies: - '@75lb/nature': latest - peerDependenciesMeta: - '@75lb/nature': - optional: true + cacheable@2.0.2: + resolution: {integrity: sha512-dWjhLx8RWnPsAWVKwW/wI6OJpQ/hSVb1qS0NUif8TR9vRiSwci7Gey8x04kRU9iAF+Rnbtex5Kjjfg/aB5w8Pg==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -1207,24 +1441,19 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001741: - resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1237,38 +1466,28 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - - clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1276,33 +1495,32 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + engines: {node: '>= 6'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1310,57 +1528,31 @@ packages: typescript: optional: true - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dashify@2.0.0: - resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==} - engines: {node: '>=4'} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - dayjs@1.11.18: resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1368,20 +1560,22 @@ packages: supports-color: optional: true + decode-formdata@0.9.0: + resolution: {integrity: sha512-q5uwOjR3Um5YD+ZWPOF/1sGHVW9A5rCrRwITQChRXlmPkxDFBqCm4jNTIVdGHNH9OnR+V9MoZVgRhsFb+ARbUw==} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -1391,57 +1585,45 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} hasBin: true - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + engines: {node: '>=8'} - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.215: - resolution: {integrity: sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==} + electron-to-chromium@1.5.223: + resolution: {integrity: sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -1459,12 +1641,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -1472,20 +1650,59 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1493,6 +1710,26 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1502,15 +1739,30 @@ packages: picomatch: optional: true - file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + file-entry-cache@10.1.4: + resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat-cache@6.1.14: + resolution: {integrity: sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -1521,19 +1773,12 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - framer-motion@12.23.12: - resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} + framer-motion@12.23.21: + resolution: {integrity: sha512-UWDtzzPdRA3UpSNGril5HjUtPF1Uo/BCt5VKG/YQ8tVpSkAZ22+q8o+hYO0C1uDAZuotQjcfzsTsDtQxD46E/Q==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1546,9 +1791,6 @@ packages: react-dom: optional: true - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1557,21 +1799,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1580,51 +1811,59 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - get-text-width@1.0.3: - resolution: {integrity: sha512-kv1MaexPcR/qaZ4kN8sUDjG5pRp5ptHvxcDGDBTeGld1cmo7MnlCMH22jevyvs/VV7Ran203o7qAOq2+kWw9cA==} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + goober@2.1.16: + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} @@ -1638,42 +1877,33 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-sanitize@5.0.2: - resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} - hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hookified@1.12.1: + resolution: {integrity: sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==} - html-dom-parser@5.1.1: - resolution: {integrity: sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg==} - - html-react-parser@5.2.6: - resolution: {integrity: sha512-qcpPWLaSvqXi+TndiHbCa+z8qt0tVzjMwFGFBAa41ggC+ZA5BHaMIeMJla9g3VSp4SmiZb9qyQbmbpHYpIfPOg==} - peerDependencies: - '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 - react: 0.14 || 15 || 16 || 17 || 18 || 19 - peerDependenciesMeta: - '@types/react': - optional: true + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} immutable@5.1.3: resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} @@ -1682,85 +1912,40 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1768,91 +1953,27 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} - is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + isbot@5.1.31: + resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} engines: {node: '>=18'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - itertools@2.4.1: - resolution: {integrity: sha512-dFTSYzmbfeNE3q/qxwAr/QdKsK6/rp+LTz8SJdTg1+lo9omXFYpDcOKw47/7TevlnC0LorR5pRSf68+yB3N0GA==} + js-sha256@0.11.1: + resolution: {integrity: sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1866,45 +1987,69 @@ packages: engines: {node: '>=6'} hasBin: true - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyv@5.5.2: + resolution: {integrity: sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.36.0: + resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + kysely@0.27.6: + resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} + engines: {node: '>=14.0.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - little-state-machine@4.8.1: - resolution: {integrity: sha512-liPHqaWMQ7rzZryQUDnbZ1Gclnnai3dIyaJ0nAgwZRXMzqbYrydrlCI0NDojRUbE5VYh5vu6hygEUZiH77nQkQ==} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1912,6 +2057,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -1936,26 +2084,19 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.24.0: + resolution: {integrity: sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==} - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - - merge-refs@2.0.0: - resolution: {integrity: sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -2024,10 +2165,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - millify@6.1.0: - resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} - hasBin: true - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2036,25 +2173,21 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} - motion-dom@12.23.12: - resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + motion-dom@12.23.21: + resolution: {integrity: sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} - motion@12.23.12: - resolution: {integrity: sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==} + motion@12.23.21: + resolution: {integrity: sha512-FzgbQNeZXHWXXEKmpfenYvF5wdc5i7lT/Kwr3xV4dmGVsU7Y30QcgCZsWHAlE/4McAWhNGbOAhgdiabXZ1EjnA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2075,63 +2208,34 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.20: - resolution: {integrity: sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==} - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2140,37 +2244,25 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2182,18 +2274,27 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -2202,115 +2303,63 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - qr.js@0.0.0: - resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} - - radash@12.1.1: - resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==} - engines: {node: '>=14.18.0'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - react-click-away-listener@2.4.0: - resolution: {integrity: sha512-jDkXY8Q9qM8e197K7c7AoVhhk2meQO5POyjRJrKN2vUQUvIef49h/paM3JA6q+lf+JygDy9ENOBOsZalARUIeg==} + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} react-dom@19.1.1: resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: react: ^19.1.1 - react-hook-form@7.62.0: - resolution: {integrity: sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-loading-skeleton@3.5.0: - resolution: {integrity: sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==} - peerDependencies: - react: '>=16.8.0' - react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: '@types/react': '>=18' react: '>=18' - react-property@2.0.2: - resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} - - react-qr-code@2.0.18: - resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==} - peerDependencies: - react: '*' - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react-router-dom@6.30.1: - resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - react-router@6.30.1: - resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - - react-simple-animate@3.5.3: - resolution: {integrity: sha512-Ob+SmB5J1tXDEZyOe2Hf950K4M8VaWBBmQ3cS2BUnTORqHjhK0iKG8fB+bo47ZL15t8d3g/Y0roiqH05UBjG7A==} - peerDependencies: - react-dom: ^16.8.0 || ^17 || ^18 || ^19 - react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -2318,90 +2367,79 @@ packages: remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rollup@4.50.1: - resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - sass@1.92.1: - resolution: {integrity: sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==} + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} engines: {node: '>=14.0.0'} hasBin: true scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -2422,56 +2460,41 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + solid-js@1.9.9: + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + sqlite-wasm-kysely@0.3.0: + resolution: {integrity: sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg==} + peerDependencies: + kysely: '*' string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -2479,13 +2502,9 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -2493,40 +2512,73 @@ packages: style-to-object@1.0.9: resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + stylelint-config-recommended-scss@16.0.1: + resolution: {integrity: sha512-wfpU6kmTUwPEHMACYdpt5wLM/aS44+sqE8yk82LkOkA7yVpAuTZDwd3m9762d0mRnNCn0JMUx4XfDVDmbb8hTA==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.23.1 + peerDependenciesMeta: + postcss: + optional: true - superjson@1.13.3: - resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} - engines: {node: '>=10'} + stylelint-config-recommended@17.0.0: + resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.23.0 - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + stylelint-config-standard-scss@16.0.0: + resolution: {integrity: sha512-/FHECLUu+med/e6OaPFpprG86ShC4SYT7Tzb2PTVdDjJsehhFBOioSlWqYFqJxmGPIwO3AMBxNo+kY3dxrbczA==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.23.1 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-standard@39.0.0: + resolution: {integrity: sha512-JabShWORb8Bmc1A47ZyJstran60P3yUdI1zWMpGYPeFiC6xzHXJMkpKAd8EjIhq3HPUplIWWMDJ/xu0AiPd+kA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.23.0 + + stylelint-scss@6.12.1: + resolution: {integrity: sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.24.0: + resolution: {integrity: sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==} + engines: {node: '>=18.12.0'} + hasBin: true supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} - hasBin: true + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} - system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -2541,42 +2593,38 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + tsx@4.20.5: + resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} + engines: {node: '>=18.0.0'} + hasBin: true - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - typesafe-i18n@5.26.2: - resolution: {integrity: sha512-2QAriFmiY5JwUAJtG7yufoE/XZ1aFBY++wj7YFS2yo89a3jLBfKoWSdq5JfQYk1V2BS7V2c/u+KEcaCQoE65hw==} - hasBin: true + typescript-eslint@8.44.1: + resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=3.5.1' + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -2596,35 +2644,37 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - use-breakpoint@4.0.6: - resolution: {integrity: sha512-1s7vUjf36eeZYTgY1KkmPNXrTbKJVRA9cjBFQdYjK8+pDr0qJgH6/cuX5qQ2zcfkqxN5LieVd/DTVK6ofnwRTQ==} - peerDependencies: - react: '>=18' - react-dom: '>=18' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-deep-compare-effect@1.8.1: - resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13' + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} use-sync-external-store@1.5.0: resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -2632,8 +2682,21 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite-plugin-image-optimizer@2.0.2: + resolution: {integrity: sha512-BYK27SpSScRIaveJVjbP7EjSrawuCc+ffESGvKVRhByAu6RGvwE3EyGg9ZeqQiLUE8e1hKSCr8v5ZfvQNiqvJQ==} + engines: {node: '>=18.17.0'} + peerDependencies: + sharp: '>=0.34.0' + svgo: '>=4' + vite: '>=5' + peerDependenciesMeta: + sharp: + optional: true + svgo: + optional: true + + vite@7.1.7: + resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -2672,21 +2735,8 @@ packages: yaml: optional: true - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -2697,34 +2747,38 @@ packages: engines: {node: '>= 8'} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.1.5: - resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} zustand@5.0.8: resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} @@ -2749,6 +2803,11 @@ packages: snapshots: + '@axa-ch/react-polymorphic-types@1.4.1(@types/react@19.1.13)(react@19.1.1)': + dependencies: + '@types/react': 19.1.13 + react: 19.1.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -2770,7 +2829,7 @@ snapshots: '@babel/types': 7.28.4 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2782,19 +2841,43 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.4 + '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.4 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.4 @@ -2811,8 +2894,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.4 + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} @@ -2828,17 +2931,45 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color - '@babel/runtime@7.28.4': {} + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color '@babel/template@7.27.2': dependencies: @@ -2854,7 +2985,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -2863,202 +2994,199 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@biomejs/biome@2.2.2': + '@biomejs/biome@2.2.4': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.2.2 - '@biomejs/cli-darwin-x64': 2.2.2 - '@biomejs/cli-linux-arm64': 2.2.2 - '@biomejs/cli-linux-arm64-musl': 2.2.2 - '@biomejs/cli-linux-x64': 2.2.2 - '@biomejs/cli-linux-x64-musl': 2.2.2 - '@biomejs/cli-win32-arm64': 2.2.2 - '@biomejs/cli-win32-x64': 2.2.2 - - '@biomejs/cli-darwin-arm64@2.2.2': + '@biomejs/cli-darwin-arm64': 2.2.4 + '@biomejs/cli-darwin-x64': 2.2.4 + '@biomejs/cli-linux-arm64': 2.2.4 + '@biomejs/cli-linux-arm64-musl': 2.2.4 + '@biomejs/cli-linux-x64': 2.2.4 + '@biomejs/cli-linux-x64-musl': 2.2.4 + '@biomejs/cli-win32-arm64': 2.2.4 + '@biomejs/cli-win32-x64': 2.2.4 + + '@biomejs/cli-darwin-arm64@2.2.4': optional: true - '@biomejs/cli-darwin-x64@2.2.2': + '@biomejs/cli-darwin-x64@2.2.4': optional: true - '@biomejs/cli-linux-arm64-musl@2.2.2': + '@biomejs/cli-linux-arm64-musl@2.2.4': optional: true - '@biomejs/cli-linux-arm64@2.2.2': + '@biomejs/cli-linux-arm64@2.2.4': optional: true - '@biomejs/cli-linux-x64-musl@2.2.2': + '@biomejs/cli-linux-x64-musl@2.2.4': optional: true - '@biomejs/cli-linux-x64@2.2.2': + '@biomejs/cli-linux-x64@2.2.4': optional: true - '@biomejs/cli-win32-arm64@2.2.2': + '@biomejs/cli-win32-arm64@2.2.4': optional: true - '@biomejs/cli-win32-x64@2.2.2': + '@biomejs/cli-win32-x64@2.2.4': optional: true - '@emotion/babel-plugin@11.13.5': + '@cacheable/memoize@2.0.2': dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.28.4 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color + '@cacheable/utils': 2.0.2 - '@emotion/cache@11.14.0': + '@cacheable/memory@2.0.2': dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 + '@cacheable/memoize': 2.0.2 + '@cacheable/utils': 2.0.2 + '@keyv/bigmap': 1.0.2 + hookified: 1.12.1 + keyv: 5.5.2 - '@emotion/hash@0.9.2': {} + '@cacheable/utils@2.0.2': {} - '@emotion/is-prop-valid@1.4.0': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@emotion/memoize': 0.9.0 - - '@emotion/memoize@0.9.0': {} + '@csstools/css-tokenizer': 3.0.4 - '@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1)': - dependencies: - '@babel/runtime': 7.28.4 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 19.1.1 - optionalDependencies: - '@types/react': 19.1.12 - transitivePeerDependencies: - - supports-color + '@csstools/css-tokenizer@3.0.4': {} - '@emotion/serialize@1.3.3': + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.2 - csstype: 3.1.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@emotion/sheet@1.4.0': {} - - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)': + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': dependencies: - '@babel/runtime': 7.28.4 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) - '@emotion/utils': 1.4.2 - react: 19.1.1 - optionalDependencies: - '@types/react': 19.1.12 - transitivePeerDependencies: - - supports-color + postcss-selector-parser: 7.1.0 - '@emotion/unitless@0.10.0': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.1)': + '@emnapi/runtime@1.5.0': dependencies: - react: 19.1.1 - - '@emotion/utils@1.4.2': {} - - '@emotion/weak-memoize@0.4.0': {} + tslib: 2.8.1 + optional: true - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.10': optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': + dependencies: + eslint: 9.35.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.1': {} + + '@eslint/core@0.15.2': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.35.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.5': + dependencies: + '@eslint/core': 0.15.2 + levn: 0.4.1 + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -3084,46 +3212,182 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@hookform/devtools@4.4.0(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': dependencies: - '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1) - '@types/lodash': 4.17.20 - little-state-machine: 4.8.1(react@19.1.1) - lodash: 4.17.21 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-simple-animate: 3.5.3(react-dom@19.1.1(react@19.1.1)) - use-deep-compare-effect: 1.8.1(react@19.1.1) - uuid: 8.3.2 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.4': + optional: true + + '@img/sharp-win32-ia32@0.34.4': + optional: true + + '@img/sharp-win32-x64@0.34.4': + optional: true + + '@inlang/paraglide-js@2.3.2': + dependencies: + '@inlang/recommend-sherlock': 0.2.1 + '@inlang/sdk': 2.4.9 + commander: 11.1.0 + consola: 3.4.0 + json5: 2.2.3 + unplugin: 2.3.10 + urlpattern-polyfill: 10.1.0 transitivePeerDependencies: - - '@types/react' - - supports-color + - babel-plugin-macros + + '@inlang/recommend-sherlock@0.2.1': + dependencies: + comment-json: 4.2.5 - '@hookform/resolvers@5.2.1(react-hook-form@7.62.0(react@19.1.1))': + '@inlang/sdk@2.4.9': dependencies: - '@standard-schema/utils': 0.3.0 - react-hook-form: 7.62.0(react@19.1.1) + '@lix-js/sdk': 0.4.7 + '@sinclair/typebox': 0.31.28 + kysely: 0.27.6 + sqlite-wasm-kysely: 0.3.0(kysely@0.27.6) + uuid: 10.0.0 + transitivePeerDependencies: + - babel-plugin-macros '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@keyv/bigmap@1.0.2': + dependencies: + hookified: 1.12.1 + + '@keyv/serialize@1.1.1': {} + + '@lix-js/sdk@0.4.7': + dependencies: + '@lix-js/server-protocol-schema': 0.1.1 + dedent: 1.5.1 + human-id: 4.1.1 + js-sha256: 0.11.1 + kysely: 0.27.6 + sqlite-wasm-kysely: 0.3.0(kysely@0.27.6) + uuid: 10.0.0 + transitivePeerDependencies: + - babel-plugin-macros + + '@lix-js/server-protocol-schema@0.1.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -3185,218 +3449,98 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true - '@react-hook/latest@1.0.3(react@19.1.1)': - dependencies: - react: 19.1.1 - - '@react-hook/passive-layout-effect@1.2.1(react@19.1.1)': - dependencies: - react: 19.1.1 - - '@react-hook/resize-observer@2.0.2(react@19.1.1)': - dependencies: - '@react-hook/latest': 1.0.3(react@19.1.1) - '@react-hook/passive-layout-effect': 1.2.1(react@19.1.1) - react: 19.1.1 + '@rolldown/pluginutils@1.0.0-beta.35': {} - '@remix-run/router@1.23.0': {} - - '@rolldown/pluginutils@1.0.0-beta.32': {} - - '@rolldown/pluginutils@1.0.0-beta.34': {} - - '@rollup/rollup-android-arm-eabi@4.50.1': + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true - '@rollup/rollup-android-arm64@4.50.1': + '@rollup/rollup-android-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-arm64@4.50.1': + '@rollup/rollup-darwin-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-x64@4.50.1': + '@rollup/rollup-darwin-x64@4.52.2': optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true - '@rollup/rollup-freebsd-x64@4.50.1': + '@rollup/rollup-freebsd-x64@4.52.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true - '@rollup/rollup-openharmony-arm64@4.50.1': + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': + '@rollup/rollup-win32-ia32-msvc@4.52.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': + '@rollup/rollup-win32-x64-gnu@4.52.2': optional: true - '@stablelib/base64@2.0.1': {} - - '@stablelib/binary@2.0.1': - dependencies: - '@stablelib/int': 2.0.1 - - '@stablelib/bytes@2.0.1': {} - - '@stablelib/int@2.0.1': {} - - '@stablelib/keyagreement@2.0.1': - dependencies: - '@stablelib/bytes': 2.0.1 - - '@stablelib/random@2.0.1': - dependencies: - '@stablelib/binary': 2.0.1 - '@stablelib/wipe': 2.0.1 - - '@stablelib/wipe@2.0.1': {} - - '@stablelib/x25519@2.0.1': - dependencies: - '@stablelib/keyagreement': 2.0.1 - '@stablelib/random': 2.0.1 - '@stablelib/wipe': 2.0.1 - - '@standard-schema/utils@0.3.0': {} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 + '@rollup/rollup-win32-x64-msvc@4.52.2': + optional: true - '@svgr/babel-preset@8.1.0(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.4) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.4) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.4) - - '@svgr/cli@8.1.0(typescript@5.9.2)': - dependencies: - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - '@svgr/plugin-prettier': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2) - camelcase: 6.3.0 - chalk: 4.1.2 - commander: 9.5.0 - dashify: 2.0.0 - glob: 8.1.0 - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript + '@sinclair/typebox@0.31.28': {} - '@svgr/core@8.1.0(typescript@5.9.2)': + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.9)': dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) - camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.9.2) - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@svgr/hast-util-to-babel-ast@8.0.0': + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.9)': dependencies: - '@babel/types': 7.28.4 - entities: 4.5.0 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))': + '@solid-primitives/rootless@1.5.2(solid-js@1.9.9)': dependencies: - '@babel/core': 7.28.4 - '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4) - '@svgr/core': 8.1.0(typescript@5.9.2) - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@svgr/plugin-prettier@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))': + '@solid-primitives/utils@6.3.2(solid-js@1.9.9)': dependencies: - '@svgr/core': 8.1.0(typescript@5.9.2) - deepmerge: 4.3.1 - prettier: 2.8.8 + solid-js: 1.9.9 - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@svgr/core': 8.1.0(typescript@5.9.2) - cosmiconfig: 8.3.6(typescript@5.9.2) - deepmerge: 4.3.1 - svgo: 3.3.2 - transitivePeerDependencies: - - typescript + '@sqlite.org/sqlite-wasm@3.48.0-build4': {} '@swc/core-darwin-arm64@1.13.5': optional: true @@ -3450,61 +3594,208 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tanstack/match-sorter-utils@8.19.4': + '@tanstack/devtools-event-bus@0.3.2': dependencies: - remove-accents: 0.5.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@tanstack/query-core@4.41.0': {} + '@tanstack/devtools-event-client@0.3.1': {} - '@tanstack/react-query-devtools@4.41.0(@tanstack/react-query@4.41.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/devtools-ui@0.3.5(csstype@3.1.3)(solid-js@1.9.9)': dependencies: - '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-query': 4.41.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - superjson: 1.13.3 - use-sync-external-store: 1.5.0(react@19.1.1) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.9 + transitivePeerDependencies: + - csstype - '@tanstack/react-query@4.41.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/devtools@0.6.14(csstype@3.1.3)(solid-js@1.9.9)': dependencies: - '@tanstack/query-core': 4.41.0 - react: 19.1.1 - use-sync-external-store: 1.5.0(react@19.1.1) - optionalDependencies: - react-dom: 19.1.1(react@19.1.1) + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) + '@tanstack/devtools-event-bus': 0.3.2 + '@tanstack/devtools-ui': 0.3.5(csstype@3.1.3)(solid-js@1.9.9) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.9 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate - '@tanstack/react-virtual@3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/form-core@1.23.1': dependencies: - '@tanstack/virtual-core': 3.13.12 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + '@tanstack/devtools-event-client': 0.3.1 + '@tanstack/store': 0.7.7 + uuid: 13.0.0 - '@tanstack/virtual-core@3.13.12': {} + '@tanstack/history@1.132.0': {} - '@trysound/sax@0.2.0': {} + '@tanstack/query-core@5.90.2': {} - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@tanstack/query-devtools@5.90.1': {} - '@types/babel__generator@7.27.0': + '@tanstack/react-devtools@0.7.0(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': dependencies: - '@babel/types': 7.28.4 + '@tanstack/devtools': 0.6.14(csstype@3.1.3)(solid-js@1.9.9) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate - '@types/babel__template@7.4.4': + '@tanstack/react-form@1.23.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@tanstack/form-core': 1.23.1 + '@tanstack/react-store': 0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + decode-formdata: 0.9.0 + devalue: 5.3.2 + react: 19.1.1 + transitivePeerDependencies: + - react-dom + + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/query-devtools': 5.90.1 + '@tanstack/react-query': 5.90.2(react@19.1.1) + react: 19.1.1 - '@types/babel__traverse@7.28.0': + '@tanstack/react-query@5.90.2(react@19.1.1)': dependencies: + '@tanstack/query-core': 5.90.2 + react: 19.1.1 + + '@tanstack/react-router-devtools@1.132.2(@tanstack/react-router@1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.93.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.5)': + dependencies: + '@tanstack/react-router': 1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-devtools-core': 1.132.2(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(sass@1.93.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.5) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + vite: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) + transitivePeerDependencies: + - '@tanstack/router-core' + - '@types/node' + - csstype + - jiti + - less + - lightningcss + - sass + - sass-embedded + - solid-js + - stylus + - sugarss + - terser + - tiny-invariant + - tsx + - yaml + + '@tanstack/react-router@1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/history': 1.132.0 + '@tanstack/react-store': 0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.2 + isbot: 5.1.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-store@0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/store': 0.7.7 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) + + '@tanstack/router-core@1.132.2': + dependencies: + '@tanstack/history': 1.132.0 + '@tanstack/store': 0.7.7 + cookie-es: 2.0.0 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-devtools-core@1.132.2(@tanstack/router-core@1.132.2)(@types/node@24.5.2)(csstype@3.1.3)(sass@1.93.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.5)': + dependencies: + '@tanstack/router-core': 1.132.2 + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.9 + tiny-invariant: 1.3.3 + vite: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) + optionalDependencies: + csstype: 3.1.3 + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + '@tanstack/router-generator@1.132.2': + dependencies: + '@tanstack/router-core': 1.132.2 + '@tanstack/router-utils': 1.132.0 + '@tanstack/virtual-file-routes': 1.132.0 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.20.5 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.132.2(@tanstack/react-router@1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 + '@tanstack/router-core': 1.132.2 + '@tanstack/router-generator': 1.132.2 + '@tanstack/router-utils': 1.132.0 + '@tanstack/virtual-file-routes': 1.132.0 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.10 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.132.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.132.0': + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + ansis: 4.1.0 + diff: 8.0.2 + fast-glob: 3.3.3 + pathe: 2.0.3 + transitivePeerDependencies: + - supports-color + + '@tanstack/store@0.7.7': {} - '@types/byte-size@8.1.2': {} + '@tanstack/virtual-file-routes@1.132.0': {} '@types/debug@4.1.12': dependencies: @@ -3516,12 +3807,12 @@ snapshots: '@types/estree@1.0.8': {} - '@types/file-saver@2.0.7': {} - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.17.20 @@ -3534,17 +3825,17 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@24.3.1': + '@types/node@24.5.2': dependencies: - undici-types: 7.10.0 + undici-types: 7.12.0 - '@types/parse-json@4.0.2': {} + '@types/qs@6.14.0': {} - '@types/react-dom@19.1.9(@types/react@19.1.12)': + '@types/react-dom@19.1.9(@types/react@19.1.13)': dependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@types/react@19.1.12': + '@types/react@19.1.13': dependencies: csstype: 3.1.3 @@ -3552,79 +3843,162 @@ snapshots: '@types/unist@3.0.3': {} - '@ungap/structured-clone@1.3.0': {} + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/type-utils': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + eslint: 9.35.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.44.1(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + eslint: 9.35.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.44.1(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + debug: 4.4.3 + eslint: 9.35.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.44.1': {} + + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.44.1(eslint@9.35.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + eslint: 9.35.0 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color - '@use-gesture/core@10.3.1': {} + '@typescript-eslint/visitor-keys@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + eslint-visitor-keys: 4.2.1 - '@use-gesture/react@10.3.1(react@19.1.1)': + '@uidotdev/usehooks@2.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@use-gesture/core': 10.3.1 react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react-swc@4.0.1(vite@7.1.5(@types/node@24.3.1)(sass@1.92.1))': + '@vitejs/plugin-react-swc@4.1.0(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5))': dependencies: - '@rolldown/pluginutils': 1.0.0-beta.32 + '@rolldown/pluginutils': 1.0.0-beta.35 '@swc/core': 1.13.5 - vite: 7.1.5(@types/node@24.3.1)(sass@1.92.1) + vite: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.0.2(vite@7.1.5(@types/node@24.3.1)(sass@1.92.1))': + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@rolldown/pluginutils': 1.0.0-beta.34 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 7.1.5(@types/node@24.3.1)(sass@1.92.1) - transitivePeerDependencies: - - supports-color + acorn: 8.15.0 - ansi-regex@5.0.1: {} + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - ansi-styles@3.2.1: + ajv@8.17.1: dependencies: - color-convert: 1.9.3 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - argparse@2.0.1: {} + ansis@4.1.0: {} - array-buffer-byte-length@1.0.2: + anymatch@3.1.3: dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 + normalize-path: 3.0.0 + picomatch: 2.3.1 - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 + argparse@2.0.1: {} - async-function@1.0.0: {} + array-timsort@1.0.3: {} - asynckit@0.4.0: {} + array-union@2.1.0: {} - autoprefixer@10.4.21(postcss@8.5.6): + ast-types@0.16.1: dependencies: - browserslist: 4.25.4 - caniuse-lite: 1.0.30001741 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 + tslib: 2.8.1 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 + astral-regex@2.0.0: {} + + asynckit@0.4.0: {} axios@1.12.2: dependencies: @@ -3634,17 +4008,24 @@ snapshots: transitivePeerDependencies: - debug - babel-plugin-macros@3.1.0: + babel-dead-code-elimination@1.0.10: dependencies: - '@babel/runtime': 7.28.4 - cosmiconfig: 7.1.0 - resolve: 1.22.10 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color bail@2.0.2: {} balanced-match@1.0.2: {} - boolbase@1.0.0: {} + balanced-match@2.0.0: {} + + baseline-browser-mapping@2.8.6: {} + + binary-extensions@2.3.0: {} brace-expansion@1.1.12: dependencies: @@ -3658,29 +4039,28 @@ snapshots: braces@3.0.3: dependencies: fill-range: 7.1.1 - optional: true - browserslist@4.25.4: + browserslist@4.26.2: dependencies: - caniuse-lite: 1.0.30001741 - electron-to-chromium: 1.5.215 - node-releases: 2.0.20 - update-browserslist-db: 1.1.3(browserslist@4.25.4) + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.223 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) - byte-size@9.0.1: {} + cacheable@2.0.2: + dependencies: + '@cacheable/memoize': 2.0.2 + '@cacheable/memory': 2.0.2 + '@cacheable/utils': 2.0.2 + hookified: 1.12.1 + keyv: 5.5.2 call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3688,23 +4068,17 @@ snapshots: callsites@3.1.0: {} - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001741: {} + caniuse-lite@1.0.30001743: {} ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + change-case@5.4.4: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -3713,194 +4087,120 @@ snapshots: character-reference-invalid@2.0.1: {} - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - classnames@2.5.1: {} - - clipboardy@4.0.0: + chokidar@3.6.0: dependencies: - execa: 8.0.1 - is-wsl: 3.1.0 - is64bit: 2.0.0 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - cliui@8.0.1: + chokidar@4.0.3: dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + readdirp: 4.1.2 clsx@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} + colord@2.9.3: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 comma-separated-tokens@2.0.3: {} - commander@7.2.0: {} + commander@11.1.0: {} - commander@9.5.0: {} + comment-json@4.2.5: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 concat-map@0.0.1: {} - convert-source-map@1.9.0: {} + consola@3.4.0: {} convert-source-map@2.0.0: {} - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 + cookie-es@2.0.0: {} - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 + core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: + env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 optionalDependencies: typescript: 5.9.2 - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.1 + css-functions-list@3.2.3: {} - css-tree@2.3.1: + css-tree@3.1.0: dependencies: - mdn-data: 2.0.30 + mdn-data: 2.12.2 source-map-js: 1.2.1 - css-what@6.2.2: {} - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 + cssesc@3.0.0: {} csstype@3.1.3: {} - dashify@2.0.0: {} - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dayjs@1.11.18: {} - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 + decode-formdata@0.9.0: {} + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 - deepmerge@4.3.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 + dedent@1.5.1: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + deep-is@0.1.4: {} delayed-stream@1.0.0: {} dequal@2.0.3: {} - detect-browser@5.3.0: {} - detect-libc@1.0.3: optional: true - devlop@1.1.0: - dependencies: - dequal: 2.0.3 + detect-libc@2.1.0: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} + devalue@5.3.2: {} - domhandler@5.0.3: + devlop@1.1.0: dependencies: - domelementtype: 2.3.0 + dequal: 2.0.3 - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 + diff@8.0.2: {} - dot-case@3.0.4: + dir-glob@3.0.1: dependencies: - no-case: 3.0.4 - tslib: 2.8.1 + path-type: 4.0.0 dunder-proto@1.0.1: dependencies: @@ -3908,75 +4208,16 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.215: {} + electron-to-chromium@1.5.223: {} emoji-regex@8.0.0: {} - entities@4.5.0: {} + env-paths@2.2.1: {} - entities@6.0.1: {} - - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3992,83 +4233,169 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - estree-util-is-identifier-name@3.0.0: {} + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} - execa@8.0.1: + eslint-visitor-keys@4.2.1: {} + + eslint@9.35.0: dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.35.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + esutils@2.0.3: {} extend@3.0.2: {} fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 - file-saver@2.0.5: {} + file-entry-cache@10.1.4: + dependencies: + flat-cache: 6.1.14 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - optional: true - find-root@1.1.0: {} + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 - follow-redirects@1.15.11: {} + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 - for-each@0.3.5: + flat-cache@6.1.14: dependencies: - is-callable: 1.2.7 + cacheable: 2.0.2 + flatted: 3.3.3 + hookified: 1.12.1 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} form-data@4.0.4: dependencies: @@ -4078,40 +4405,22 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - fraction.js@4.3.7: {} - - framer-motion@12.23.12(@emotion/is-prop-valid@1.4.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + framer-motion@12.23.21(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - motion-dom: 12.23.12 + motion-dom: 12.23.21 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: - '@emotion/is-prop-valid': 1.4.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4130,46 +4439,54 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@8.0.1: {} - - get-symbol-description@1.1.0: + get-tsconfig@4.10.1: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + resolve-pkg-maps: 1.0.0 - get-text-width@1.0.3: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 - glob@8.1.0: + glob-parent@6.0.2: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 + is-glob: 4.0.3 - globalthis@1.0.4: + global-modules@2.0.0: dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 + global-prefix: 3.0.0 - gopd@1.2.0: {} + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 - graceful-fs@4.2.11: {} + globals@14.0.0: {} - has-bigints@1.1.0: {} + globals@16.4.0: {} - has-flag@3.0.0: {} + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 - has-flag@4.0.0: {} + globjoin@0.1.4: {} - has-property-descriptors@1.0.2: + goober@2.1.16(csstype@3.1.3): dependencies: - es-define-property: 1.0.1 + csstype: 3.1.3 - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-own-prop@2.0.0: {} has-symbols@1.1.0: {} @@ -4181,12 +4498,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-sanitize@5.0.2: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.3.0 - unist-util-position: 5.0.0 - hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.8 @@ -4211,37 +4522,17 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - hosted-git-info@2.8.9: {} - - html-dom-parser@5.1.1: - dependencies: - domhandler: 5.0.3 - htmlparser2: 10.0.0 + hookified@1.12.1: {} - html-react-parser@5.2.6(@types/react@19.1.12)(react@19.1.1): - dependencies: - domhandler: 5.0.3 - html-dom-parser: 5.1.1 - react: 19.1.1 - react-property: 2.0.2 - style-to-js: 1.1.17 - optionalDependencies: - '@types/react': 19.1.12 + html-tags@3.3.1: {} html-url-attributes@3.0.1: {} - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 + human-id@4.1.1: {} + + ignore@5.3.2: {} - human-signals@5.0.0: {} + ignore@7.0.5: {} immutable@5.1.3: {} @@ -4250,21 +4541,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + imurmurhash@0.1.4: {} - inherits@2.0.4: {} + ini@1.3.8: {} inline-style-parser@0.2.4: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -4272,149 +4554,35 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: + is-binary-path@2.1.0: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + binary-extensions: 2.3.0 is-decimal@2.0.1: {} - is-docker@3.0.0: {} - - is-extglob@2.1.1: - optional: true - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - optional: true - - is-hexadecimal@2.0.1: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-number@7.0.0: - optional: true - - is-plain-obj@4.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@3.0.0: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 + is-extglob@2.1.1: {} - is-weakmap@2.0.2: {} + is-fullwidth-code-point@3.0.0: {} - is-weakref@1.1.1: + is-glob@4.0.3: dependencies: - call-bound: 1.0.4 + is-extglob: 2.1.1 - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + is-hexadecimal@2.0.1: {} - is-what@4.1.16: {} + is-number@7.0.0: {} - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 + is-plain-obj@4.1.0: {} - is64bit@2.0.0: - dependencies: - system-architecture: 0.1.0 + is-plain-object@5.0.0: {} - isarray@2.0.5: {} + isbot@5.1.31: {} isexe@2.0.0: {} - itertools@2.4.1: {} + js-sha256@0.11.1: {} js-tokens@4.0.0: {} @@ -4424,38 +4592,52 @@ snapshots: jsesc@3.1.0: {} - json-parse-better-errors@1.0.2: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} - json5@2.2.3: {} + json-schema-traverse@0.4.1: {} - lines-and-columns@1.2.4: {} + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} - little-state-machine@4.8.1(react@19.1.1): + keyv@4.5.4: dependencies: - react: 19.1.1 + json-buffer: 3.0.1 - load-json-file@4.0.0: + keyv@5.5.2: dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 + '@keyv/serialize': 1.1.1 - lodash-es@4.17.21: {} + kind-of@6.0.3: {} - lodash@4.17.21: {} + known-css-properties@0.36.0: {} - longest-streak@3.1.0: {} + known-css-properties@0.37.0: {} - loose-envify@1.4.0: + kysely@0.27.6: {} + + levn@0.4.1: dependencies: - js-tokens: 4.0.0 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} - lower-case@2.0.2: + locate-path@6.0.0: dependencies: - tslib: 2.8.1 + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + longest-streak@3.1.0: {} lru-cache@5.1.1: dependencies: @@ -4463,6 +4645,8 @@ snapshots: math-intrinsics@1.1.0: {} + mathml-tag-names@2.1.3: {} + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -4552,17 +4736,13 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - mdn-data@2.0.28: {} + mdn-data@2.12.2: {} - mdn-data@2.0.30: {} + mdn-data@2.24.0: {} - memorystream@0.3.1: {} + meow@13.2.0: {} - merge-refs@2.0.0(@types/react@19.1.12): - optionalDependencies: - '@types/react': 19.1.12 - - merge-stream@2.0.0: {} + merge2@1.4.1: {} micromark-core-commonmark@2.0.3: dependencies: @@ -4678,7 +4858,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -4701,11 +4881,6 @@ snapshots: dependencies: braces: 3.0.3 picomatch: 2.3.1 - optional: true - - millify@6.1.0: - dependencies: - yargs: 17.7.2 mime-db@1.52.0: {} @@ -4713,28 +4888,25 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-fn@4.0.0: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.6: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 - motion-dom@12.23.12: + motion-dom@12.23.21: dependencies: motion-utils: 12.23.6 motion-utils@12.23.6: {} - motion@12.23.12(@emotion/is-prop-valid@1.4.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + motion@12.23.21(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - framer-motion: 12.23.12(@emotion/is-prop-valid@1.4.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + framer-motion: 12.23.21(react-dom@19.1.1(react@19.1.1))(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@emotion/is-prop-valid': 1.4.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -4742,75 +4914,33 @@ snapshots: nanoid@3.3.11: {} - nice-try@1.0.5: {} - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 + natural-compare@1.4.0: {} node-addon-api@7.1.1: optional: true - node-releases@2.0.20: {} - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.10 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-range@0.1.2: {} - - npm-run-all@4.1.5: - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.6 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.3 - string.prototype.padend: 3.1.6 - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 + node-releases@2.0.21: {} - object-assign@4.1.1: {} + normalize-path@3.0.0: {} object-inspect@1.13.4: {} - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - once@1.4.0: + optionator@0.9.4: dependencies: - wrappy: 1.0.2 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - onetime@6.0.0: + p-limit@3.1.0: dependencies: - mimic-fn: 4.0.0 + yocto-queue: 0.1.0 - own-keys@1.0.1: + p-locate@5.0.0: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 + p-limit: 3.1.0 parent-module@1.0.1: dependencies: @@ -4826,44 +4956,43 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - path-key@2.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-type@3.0.0: - dependencies: - pify: 3.0.0 - path-type@4.0.0: {} + pathe@2.0.3: {} + picocolors@1.1.1: {} - picomatch@2.3.1: - optional: true + picomatch@2.3.1: {} picomatch@4.0.3: {} - pidtree@0.3.1: {} + postcss-media-query-parser@0.2.3: {} + + postcss-resolve-nested-selector@0.1.6: {} - pify@3.0.0: {} + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 - possible-typed-array-names@1.1.0: {} + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} @@ -4873,49 +5002,36 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@2.8.8: {} + prelude-ls@1.2.1: {} prettier@3.6.2: {} - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - property-information@7.1.0: {} proxy-from-env@1.1.0: {} - qr.js@0.0.0: {} - - radash@12.1.1: {} - - react-click-away-listener@2.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): - dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + punycode@2.3.1: {} - react-dom@19.1.1(react@19.1.1): + qrcode.react@4.2.0(react@19.1.1): dependencies: react: 19.1.1 - scheduler: 0.26.0 - react-hook-form@7.62.0(react@19.1.1): + qs@6.14.0: dependencies: - react: 19.1.1 + side-channel: 1.1.0 - react-is@16.13.1: {} + queue-microtask@1.2.3: {} - react-loading-skeleton@3.5.0(react@19.1.1): + react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 + scheduler: 0.26.0 - react-markdown@10.1.0(@types/react@19.1.12)(react@19.1.1): + react-markdown@10.1.0(@types/react@19.1.13)(react@19.1.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.1.12 + '@types/react': 19.1.13 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -4929,66 +5045,21 @@ snapshots: transitivePeerDependencies: - supports-color - react-property@2.0.2: {} - - react-qr-code@2.0.18(react@19.1.1): - dependencies: - prop-types: 15.8.1 - qr.js: 0.0.0 - react: 19.1.1 - - react-refresh@0.17.0: {} - - react-router-dom@6.30.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): - dependencies: - '@remix-run/router': 1.23.0 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - react-router: 6.30.1(react@19.1.1) - - react-router@6.30.1(react@19.1.1): - dependencies: - '@remix-run/router': 1.23.0 - react: 19.1.1 - - react-simple-animate@3.5.3(react-dom@19.1.1(react@19.1.1)): - dependencies: - react-dom: 19.1.1(react@19.1.1) - react@19.1.1: {} - read-pkg@3.0.0: + readdirp@3.6.0: dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 + picomatch: 2.3.1 readdirp@4.1.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - rehype-sanitize@6.0.0: + recast@0.23.11: dependencies: - '@types/hast': 3.0.4 - hast-util-sanitize: 5.0.2 + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 remark-parse@11.0.0: dependencies: @@ -5007,69 +5078,55 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - remove-accents@0.5.0: {} + repeat-string@1.6.1: {} - require-directory@2.1.1: {} + require-from-string@2.0.2: {} resolve-from@4.0.0: {} - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} - rollup@4.50.1: + reusify@1.1.0: {} + + rollup@4.52.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.1 - '@rollup/rollup-android-arm64': 4.50.1 - '@rollup/rollup-darwin-arm64': 4.50.1 - '@rollup/rollup-darwin-x64': 4.50.1 - '@rollup/rollup-freebsd-arm64': 4.50.1 - '@rollup/rollup-freebsd-x64': 4.50.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 - '@rollup/rollup-linux-arm-musleabihf': 4.50.1 - '@rollup/rollup-linux-arm64-gnu': 4.50.1 - '@rollup/rollup-linux-arm64-musl': 4.50.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 - '@rollup/rollup-linux-ppc64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-musl': 4.50.1 - '@rollup/rollup-linux-s390x-gnu': 4.50.1 - '@rollup/rollup-linux-x64-gnu': 4.50.1 - '@rollup/rollup-linux-x64-musl': 4.50.1 - '@rollup/rollup-openharmony-arm64': 4.50.1 - '@rollup/rollup-win32-arm64-msvc': 4.50.1 - '@rollup/rollup-win32-ia32-msvc': 4.50.1 - '@rollup/rollup-win32-x64-msvc': 4.50.1 + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-push-apply@1.0.0: + run-parallel@1.2.0: dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 + queue-microtask: 1.2.3 - safe-regex-test@1.1.0: + rxjs@7.8.2: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 + tslib: 2.8.1 - sass@1.92.1: + sass@1.93.2: dependencies: chokidar: 4.0.3 immutable: 5.1.3 @@ -5079,46 +5136,51 @@ snapshots: scheduler@0.26.0: {} - semver@5.7.2: {} - semver@6.3.1: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 + semver@7.7.2: {} - set-function-name@2.0.2: + seroval-plugins@1.3.3(seroval@1.3.2): dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + seroval: 1.3.2 - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + seroval@1.3.2: {} - shebang-command@1.2.0: + sharp@0.34.4: dependencies: - shebang-regex: 1.0.0 + '@img/colour': 1.0.0 + detect-libc: 2.1.0 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -5149,35 +5211,32 @@ snapshots: signal-exit@4.1.0: {} - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - source-map-js@1.2.1: {} - - source-map@0.5.7: {} + slash@3.0.0: {} - space-separated-tokens@2.0.2: {} + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 - spdx-correct@3.2.0: + solid-js@1.9.9: dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + + source-map-js@1.2.1: {} - spdx-exceptions@2.5.0: {} + source-map@0.6.1: {} - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + source-map@0.7.6: {} - spdx-license-ids@3.0.22: {} + space-separated-tokens@2.0.2: {} - stop-iteration-iterator@1.1.0: + sqlite-wasm-kysely@0.3.0(kysely@0.27.6): dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 + '@sqlite.org/sqlite-wasm': 3.48.0-build4 + kysely: 0.27.6 string-width@4.2.3: dependencies: @@ -5185,36 +5244,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.padend@3.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -5224,9 +5253,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-bom@3.0.0: {} - - strip-final-newline@3.0.0: {} + strip-json-comments@3.1.1: {} style-to-js@1.1.17: dependencies: @@ -5236,37 +5263,112 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - stylis@4.2.0: {} + stylelint-config-recommended-scss@16.0.1(postcss@8.5.6)(stylelint@16.24.0(typescript@5.9.2)): + dependencies: + postcss-scss: 4.0.9(postcss@8.5.6) + stylelint: 16.24.0(typescript@5.9.2) + stylelint-config-recommended: 17.0.0(stylelint@16.24.0(typescript@5.9.2)) + stylelint-scss: 6.12.1(stylelint@16.24.0(typescript@5.9.2)) + optionalDependencies: + postcss: 8.5.6 + + stylelint-config-recommended@17.0.0(stylelint@16.24.0(typescript@5.9.2)): + dependencies: + stylelint: 16.24.0(typescript@5.9.2) + + stylelint-config-standard-scss@16.0.0(postcss@8.5.6)(stylelint@16.24.0(typescript@5.9.2)): + dependencies: + stylelint: 16.24.0(typescript@5.9.2) + stylelint-config-recommended-scss: 16.0.1(postcss@8.5.6)(stylelint@16.24.0(typescript@5.9.2)) + stylelint-config-standard: 39.0.0(stylelint@16.24.0(typescript@5.9.2)) + optionalDependencies: + postcss: 8.5.6 - superjson@1.13.3: + stylelint-config-standard@39.0.0(stylelint@16.24.0(typescript@5.9.2)): dependencies: - copy-anything: 3.0.5 + stylelint: 16.24.0(typescript@5.9.2) + stylelint-config-recommended: 17.0.0(stylelint@16.24.0(typescript@5.9.2)) - supports-color@5.5.0: + stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.9.2)): dependencies: - has-flag: 3.0.0 + css-tree: 3.1.0 + is-plain-object: 5.0.0 + known-css-properties: 0.36.0 + mdn-data: 2.24.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + stylelint: 16.24.0(typescript@5.9.2) + + stylelint@16.24.0(typescript@5.9.2): + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@dual-bundle/import-meta-resolve': 4.2.1 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.9.2) + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.3 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 10.1.4 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 7.0.5 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript supports-color@7.2.0: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + svg-tags@1.0.0: {} - svg-parser@2.0.4: {} + tabbable@6.2.0: {} - svgo@3.3.2: + table@6.9.0: dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.2.2 - css-tree: 2.3.1 - css-what: 6.2.2 - csso: 5.0.5 - picocolors: 1.1.1 + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - system-architecture@0.1.0: {} + tiny-invariant@1.3.3: {} - tabbable@6.2.0: {} + tiny-warning@1.0.3: {} tinyglobby@0.2.15: dependencies: @@ -5276,61 +5378,42 @@ snapshots: to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - optional: true trim-lines@3.0.1: {} trough@2.2.0: {} - tslib@2.8.1: {} - - typed-array-buffer@1.0.3: + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 + typescript: 5.9.2 - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 + tslib@2.8.1: {} - typed-array-byte-offset@1.0.4: + tsx@4.20.5: dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 + esbuild: 0.25.10 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 - typed-array-length@1.0.7: + type-check@0.4.0: dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 + prelude-ls: 1.2.1 - typesafe-i18n@5.26.2(typescript@5.9.2): + typescript-eslint@8.44.1(eslint@9.35.0)(typescript@5.9.2): dependencies: + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.35.0)(typescript@5.9.2) + eslint: 9.35.0 typescript: 5.9.2 + transitivePeerDependencies: + - supports-color typescript@5.9.2: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - undici-types@7.10.0: {} + undici-types@7.12.0: {} unified@11.0.5: dependencies: @@ -5365,33 +5448,34 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - update-browserslist-db@1.1.3(browserslist@4.25.4): + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.25.4 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 - use-breakpoint@4.0.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + uri-js@4.4.1: dependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + punycode: 2.3.1 - use-deep-compare-effect@1.8.1(react@19.1.1): - dependencies: - '@babel/runtime': 7.28.4 - dequal: 2.0.3 - react: 19.1.1 + urlpattern-polyfill@10.1.0: {} use-sync-external-store@1.5.0(react@19.1.1): dependencies: react: 19.1.1 - uuid@8.3.2: {} + util-deprecate@1.0.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + uuid@10.0.0: {} + + uuid@13.0.0: {} vfile-message@4.0.3: dependencies: @@ -5403,59 +5487,29 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.1.5(@types/node@24.3.1)(sass@1.92.1): + vite-plugin-image-optimizer@2.0.2(sharp@0.34.4)(vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5)): + dependencies: + ansi-colors: 4.1.3 + pathe: 2.0.3 + vite: 7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5) + optionalDependencies: + sharp: 0.34.4 + + vite@7.1.7(@types/node@24.5.2)(sass@1.93.2)(tsx@4.20.5): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.50.1 + rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.5.2 fsevents: 2.3.3 - sass: 1.92.1 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 + sass: 1.93.2 + tsx: 4.20.5 - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 + webpack-virtual-modules@0.6.2: {} which@1.3.1: dependencies: @@ -5465,37 +5519,26 @@ snapshots: dependencies: isexe: 2.0.0 - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + word-wrap@1.2.5: {} - wrappy@1.0.2: {} + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 - y18n@5.0.8: {} + ws@8.18.3: {} yallist@3.1.1: {} - yaml@1.10.2: {} + yocto-queue@0.1.0: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + zod@3.25.76: {} - zod@4.1.5: {} + zod@4.1.11: {} - zustand@5.0.8(@types/react@19.1.12)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): + zustand@5.0.8(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) diff --git a/web/pnpm-workspace.yaml b/web/pnpm-workspace.yaml new file mode 100644 index 0000000..17a31e5 --- /dev/null +++ b/web/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +onlyBuiltDependencies: + - '@parcel/watcher' + - '@swc/core' + - esbuild + - sharp diff --git a/web/postcss.config.js b/web/postcss.config.js deleted file mode 100644 index a47ef4f..0000000 --- a/web/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {}, - }, -}; diff --git a/web/project.inlang/project_id b/web/project.inlang/project_id new file mode 100644 index 0000000..bf8352d --- /dev/null +++ b/web/project.inlang/project_id @@ -0,0 +1 @@ +tfONT6HVsJdzBGusYZ \ No newline at end of file diff --git a/web/project.inlang/settings.json b/web/project.inlang/settings.json new file mode 100644 index 0000000..135d692 --- /dev/null +++ b/web/project.inlang/settings.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": [ + "en" + ], + "modules": [ + "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js" + ], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{locale}.json" + } +} diff --git a/web/public/fonts/Poppins/Poppins-Black.woff2 b/web/public/fonts/Poppins/Poppins-Black.woff2 deleted file mode 100644 index ccfbb59..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Black.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-BlackItalic.woff2 b/web/public/fonts/Poppins/Poppins-BlackItalic.woff2 deleted file mode 100644 index 9012769..0000000 Binary files a/web/public/fonts/Poppins/Poppins-BlackItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Bold.woff2 b/web/public/fonts/Poppins/Poppins-Bold.woff2 deleted file mode 100644 index 8a2eb83..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Bold.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-BoldItalic.woff2 b/web/public/fonts/Poppins/Poppins-BoldItalic.woff2 deleted file mode 100644 index 968d41c..0000000 Binary files a/web/public/fonts/Poppins/Poppins-BoldItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-ExtraBold.woff2 b/web/public/fonts/Poppins/Poppins-ExtraBold.woff2 deleted file mode 100644 index 68ddb41..0000000 Binary files a/web/public/fonts/Poppins/Poppins-ExtraBold.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-ExtraBoldItalic.woff2 b/web/public/fonts/Poppins/Poppins-ExtraBoldItalic.woff2 deleted file mode 100644 index fb6d8fe..0000000 Binary files a/web/public/fonts/Poppins/Poppins-ExtraBoldItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-ExtraLight.woff2 b/web/public/fonts/Poppins/Poppins-ExtraLight.woff2 deleted file mode 100644 index 9dfde95..0000000 Binary files a/web/public/fonts/Poppins/Poppins-ExtraLight.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-ExtraLightItalic.woff2 b/web/public/fonts/Poppins/Poppins-ExtraLightItalic.woff2 deleted file mode 100644 index 87145f1..0000000 Binary files a/web/public/fonts/Poppins/Poppins-ExtraLightItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Italic.woff2 b/web/public/fonts/Poppins/Poppins-Italic.woff2 deleted file mode 100644 index 248df97..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Italic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Light.woff2 b/web/public/fonts/Poppins/Poppins-Light.woff2 deleted file mode 100644 index 48d5d12..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Light.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-LightItalic.woff2 b/web/public/fonts/Poppins/Poppins-LightItalic.woff2 deleted file mode 100644 index 7a5665b..0000000 Binary files a/web/public/fonts/Poppins/Poppins-LightItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Medium.woff2 b/web/public/fonts/Poppins/Poppins-Medium.woff2 deleted file mode 100644 index d9957d0..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Medium.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-MediumItalic.woff2 b/web/public/fonts/Poppins/Poppins-MediumItalic.woff2 deleted file mode 100644 index 58bb29d..0000000 Binary files a/web/public/fonts/Poppins/Poppins-MediumItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Regular.woff2 b/web/public/fonts/Poppins/Poppins-Regular.woff2 deleted file mode 100644 index c2975a8..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Regular.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-SemiBold.woff2 b/web/public/fonts/Poppins/Poppins-SemiBold.woff2 deleted file mode 100644 index 0536a27..0000000 Binary files a/web/public/fonts/Poppins/Poppins-SemiBold.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-SemiBoldItalic.woff2 b/web/public/fonts/Poppins/Poppins-SemiBoldItalic.woff2 deleted file mode 100644 index 9aaf4ae..0000000 Binary files a/web/public/fonts/Poppins/Poppins-SemiBoldItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-Thin.woff2 b/web/public/fonts/Poppins/Poppins-Thin.woff2 deleted file mode 100644 index 5e4e5a3..0000000 Binary files a/web/public/fonts/Poppins/Poppins-Thin.woff2 and /dev/null differ diff --git a/web/public/fonts/Poppins/Poppins-ThinItalic.woff2 b/web/public/fonts/Poppins/Poppins-ThinItalic.woff2 deleted file mode 100644 index cca6fb6..0000000 Binary files a/web/public/fonts/Poppins/Poppins-ThinItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Black.woff2 b/web/public/fonts/Roboto/Roboto-Black.woff2 deleted file mode 100644 index f2bfb80..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Black.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-BlackItalic.woff2 b/web/public/fonts/Roboto/Roboto-BlackItalic.woff2 deleted file mode 100644 index 8d789d1..0000000 Binary files a/web/public/fonts/Roboto/Roboto-BlackItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Bold.woff2 b/web/public/fonts/Roboto/Roboto-Bold.woff2 deleted file mode 100644 index ee956e6..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Bold.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-BoldItalic.woff2 b/web/public/fonts/Roboto/Roboto-BoldItalic.woff2 deleted file mode 100644 index 13a377b..0000000 Binary files a/web/public/fonts/Roboto/Roboto-BoldItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Italic.woff2 b/web/public/fonts/Roboto/Roboto-Italic.woff2 deleted file mode 100644 index 5110f3a..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Italic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Light.woff2 b/web/public/fonts/Roboto/Roboto-Light.woff2 deleted file mode 100644 index 1f43810..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Light.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-LightItalic.woff2 b/web/public/fonts/Roboto/Roboto-LightItalic.woff2 deleted file mode 100644 index 4cdbc95..0000000 Binary files a/web/public/fonts/Roboto/Roboto-LightItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Medium.woff2 b/web/public/fonts/Roboto/Roboto-Medium.woff2 deleted file mode 100644 index e4ae472..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Medium.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-MediumItalic.woff2 b/web/public/fonts/Roboto/Roboto-MediumItalic.woff2 deleted file mode 100644 index f84f46b..0000000 Binary files a/web/public/fonts/Roboto/Roboto-MediumItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Regular.woff2 b/web/public/fonts/Roboto/Roboto-Regular.woff2 deleted file mode 100644 index f643330..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Regular.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-Thin.woff2 b/web/public/fonts/Roboto/Roboto-Thin.woff2 deleted file mode 100644 index 278d65a..0000000 Binary files a/web/public/fonts/Roboto/Roboto-Thin.woff2 and /dev/null differ diff --git a/web/public/fonts/Roboto/Roboto-ThinItalic.woff2 b/web/public/fonts/Roboto/Roboto-ThinItalic.woff2 deleted file mode 100644 index 163c8b8..0000000 Binary files a/web/public/fonts/Roboto/Roboto-ThinItalic.woff2 and /dev/null differ diff --git a/web/public/fonts/SourceCodePro/SourceCodePro-Italic.woff2 b/web/public/fonts/SourceCodePro/SourceCodePro-Italic.woff2 deleted file mode 100644 index 5eff97c..0000000 Binary files a/web/public/fonts/SourceCodePro/SourceCodePro-Italic.woff2 and /dev/null differ diff --git a/web/public/fonts/SourceCodePro/SourceCodePro-Regular.woff2 b/web/public/fonts/SourceCodePro/SourceCodePro-Regular.woff2 deleted file mode 100644 index 03fb22a..0000000 Binary files a/web/public/fonts/SourceCodePro/SourceCodePro-Regular.woff2 and /dev/null differ diff --git a/web/public/fonts/geist/Geist-Bold.woff2 b/web/public/fonts/geist/Geist-Bold.woff2 new file mode 100644 index 0000000..46f524f Binary files /dev/null and b/web/public/fonts/geist/Geist-Bold.woff2 differ diff --git a/web/public/fonts/geist/Geist-BoldItalic.woff2 b/web/public/fonts/geist/Geist-BoldItalic.woff2 new file mode 100644 index 0000000..240acb9 Binary files /dev/null and b/web/public/fonts/geist/Geist-BoldItalic.woff2 differ diff --git a/web/public/fonts/geist/Geist-Medium.woff2 b/web/public/fonts/geist/Geist-Medium.woff2 new file mode 100644 index 0000000..ef6dbb2 Binary files /dev/null and b/web/public/fonts/geist/Geist-Medium.woff2 differ diff --git a/web/public/fonts/geist/Geist-MediumItalic.woff2 b/web/public/fonts/geist/Geist-MediumItalic.woff2 new file mode 100644 index 0000000..344feda Binary files /dev/null and b/web/public/fonts/geist/Geist-MediumItalic.woff2 differ diff --git a/web/public/fonts/geist/Geist-Regular.woff2 b/web/public/fonts/geist/Geist-Regular.woff2 new file mode 100644 index 0000000..0db0f19 Binary files /dev/null and b/web/public/fonts/geist/Geist-Regular.woff2 differ diff --git a/web/public/fonts/geist/Geist-RegularItalic.woff2 b/web/public/fonts/geist/Geist-RegularItalic.woff2 new file mode 100644 index 0000000..33e9948 Binary files /dev/null and b/web/public/fonts/geist/Geist-RegularItalic.woff2 differ diff --git a/web/public/fonts/geist/Geist-SemiBold.woff2 b/web/public/fonts/geist/Geist-SemiBold.woff2 new file mode 100644 index 0000000..8384523 Binary files /dev/null and b/web/public/fonts/geist/Geist-SemiBold.woff2 differ diff --git a/web/public/fonts/geist/Geist-SemiBoldItalic.woff2 b/web/public/fonts/geist/Geist-SemiBoldItalic.woff2 new file mode 100644 index 0000000..2f53ced Binary files /dev/null and b/web/public/fonts/geist/Geist-SemiBoldItalic.woff2 differ diff --git a/web/public/fonts/source_code_pro/SourceCodePro-Regular.woff2 b/web/public/fonts/source_code_pro/SourceCodePro-Regular.woff2 new file mode 100644 index 0000000..40826f1 Binary files /dev/null and b/web/public/fonts/source_code_pro/SourceCodePro-Regular.woff2 differ diff --git a/web/src/app/App.tsx b/web/src/app/App.tsx new file mode 100644 index 0000000..bffd267 --- /dev/null +++ b/web/src/app/App.tsx @@ -0,0 +1,16 @@ +import { QueryClientProvider } from '@tanstack/react-query'; +import { RouterProvider } from '@tanstack/react-router'; +import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import { queryClient } from './query'; +import { router } from './router'; + +dayjs.extend(utc); + +export const App = () => { + return ( + + + + ); +}; diff --git a/web/src/app/SessionGuard.tsx b/web/src/app/SessionGuard.tsx new file mode 100644 index 0000000..2047988 --- /dev/null +++ b/web/src/app/SessionGuard.tsx @@ -0,0 +1,32 @@ +import { useNavigate } from '@tanstack/react-router'; +import dayjs from 'dayjs'; +import { useCallback, useEffect } from 'react'; +import { useEnrollmentStore } from '../shared/hooks/useEnrollmentStore'; + +export const SessionGuard = () => { + const navigate = useNavigate(); + const sessionEnd = useEnrollmentStore((s) => s.enrollmentData?.deadline_timestamp); + + const handleSessionEnd = useCallback(() => { + navigate({ + to: '/session-end', + replace: true, + }); + }, [navigate]); + + useEffect(() => { + if (!sessionEnd) return; + + const deadline = dayjs.unix(sessionEnd).diff(dayjs()); + if (deadline > 0) { + const timeout = setTimeout(handleSessionEnd, deadline); + return () => { + clearTimeout(timeout); + }; + } else { + handleSessionEnd(); + } + }, [sessionEnd, handleSessionEnd]); + + return null; +}; diff --git a/web/src/app/query.ts b/web/src/app/query.ts new file mode 100644 index 0000000..23934e4 --- /dev/null +++ b/web/src/app/query.ts @@ -0,0 +1,29 @@ +import { MutationCache, QueryClient, type QueryKey } from '@tanstack/react-query'; + +type InvalidateMeta = { invalidate?: QueryKey[] }; + +let queryClient: QueryClient; + +const mutationCache = new MutationCache({ + onSuccess: async (_data, _variables, _context, mutation) => { + const keys = (mutation.meta as InvalidateMeta | undefined)?.invalidate; + if (!keys?.length) return; + await Promise.all( + keys.map((key) => queryClient.invalidateQueries({ queryKey: key })), + ); + }, +}); + +queryClient = new QueryClient({ + mutationCache, + defaultOptions: { + queries: { + staleTime: Infinity, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + }, + }, +}); + +export { queryClient }; diff --git a/web/src/app/router.ts b/web/src/app/router.ts new file mode 100644 index 0000000..99936c4 --- /dev/null +++ b/web/src/app/router.ts @@ -0,0 +1,10 @@ +import { createRouter } from '@tanstack/react-router'; +import { routeTree } from '../routeTree.gen'; + +export const router = createRouter({ routeTree, defaultPreloadStaleTime: 0 }); + +declare module '@tanstack/react-router' { + interface Register { + router: typeof router; + } +} diff --git a/web/src/assets/icons/android-icon-144x144.png b/web/src/assets/icons/android-icon-144x144.png new file mode 100644 index 0000000..3109608 Binary files /dev/null and b/web/src/assets/icons/android-icon-144x144.png differ diff --git a/web/src/assets/icons/android-icon-192x192.png b/web/src/assets/icons/android-icon-192x192.png new file mode 100644 index 0000000..a74bc05 Binary files /dev/null and b/web/src/assets/icons/android-icon-192x192.png differ diff --git a/web/src/assets/icons/android-icon-36x36.png b/web/src/assets/icons/android-icon-36x36.png new file mode 100644 index 0000000..90c474b Binary files /dev/null and b/web/src/assets/icons/android-icon-36x36.png differ diff --git a/web/src/assets/icons/android-icon-48x48.png b/web/src/assets/icons/android-icon-48x48.png new file mode 100644 index 0000000..6866c63 Binary files /dev/null and b/web/src/assets/icons/android-icon-48x48.png differ diff --git a/web/src/assets/icons/android-icon-72x72.png b/web/src/assets/icons/android-icon-72x72.png new file mode 100644 index 0000000..6469e44 Binary files /dev/null and b/web/src/assets/icons/android-icon-72x72.png differ diff --git a/web/src/assets/icons/android-icon-96x96.png b/web/src/assets/icons/android-icon-96x96.png new file mode 100644 index 0000000..8c9ff50 Binary files /dev/null and b/web/src/assets/icons/android-icon-96x96.png differ diff --git a/web/src/assets/icons/apple-icon-114x114.png b/web/src/assets/icons/apple-icon-114x114.png new file mode 100644 index 0000000..275d373 Binary files /dev/null and b/web/src/assets/icons/apple-icon-114x114.png differ diff --git a/web/src/assets/icons/apple-icon-120x120.png b/web/src/assets/icons/apple-icon-120x120.png new file mode 100644 index 0000000..78b4a82 Binary files /dev/null and b/web/src/assets/icons/apple-icon-120x120.png differ diff --git a/web/src/assets/icons/apple-icon-144x144.png b/web/src/assets/icons/apple-icon-144x144.png new file mode 100644 index 0000000..3109608 Binary files /dev/null and b/web/src/assets/icons/apple-icon-144x144.png differ diff --git a/web/src/assets/icons/apple-icon-152x152.png b/web/src/assets/icons/apple-icon-152x152.png new file mode 100644 index 0000000..84c9335 Binary files /dev/null and b/web/src/assets/icons/apple-icon-152x152.png differ diff --git a/web/src/assets/icons/apple-icon-180x180.png b/web/src/assets/icons/apple-icon-180x180.png new file mode 100644 index 0000000..3025f36 Binary files /dev/null and b/web/src/assets/icons/apple-icon-180x180.png differ diff --git a/web/src/assets/icons/apple-icon-57x57.png b/web/src/assets/icons/apple-icon-57x57.png new file mode 100644 index 0000000..e0ed68d Binary files /dev/null and b/web/src/assets/icons/apple-icon-57x57.png differ diff --git a/web/src/assets/icons/apple-icon-60x60.png b/web/src/assets/icons/apple-icon-60x60.png new file mode 100644 index 0000000..99d58ac Binary files /dev/null and b/web/src/assets/icons/apple-icon-60x60.png differ diff --git a/web/src/assets/icons/apple-icon-72x72.png b/web/src/assets/icons/apple-icon-72x72.png new file mode 100644 index 0000000..6469e44 Binary files /dev/null and b/web/src/assets/icons/apple-icon-72x72.png differ diff --git a/web/src/assets/icons/apple-icon-76x76.png b/web/src/assets/icons/apple-icon-76x76.png new file mode 100644 index 0000000..a4f840e Binary files /dev/null and b/web/src/assets/icons/apple-icon-76x76.png differ diff --git a/web/src/assets/icons/apple-icon-precomposed.png b/web/src/assets/icons/apple-icon-precomposed.png new file mode 100644 index 0000000..a74bc05 Binary files /dev/null and b/web/src/assets/icons/apple-icon-precomposed.png differ diff --git a/web/src/assets/icons/apple-icon.png b/web/src/assets/icons/apple-icon.png new file mode 100644 index 0000000..a74bc05 Binary files /dev/null and b/web/src/assets/icons/apple-icon.png differ diff --git a/web/src/assets/icons/favicon-16x16.png b/web/src/assets/icons/favicon-16x16.png new file mode 100644 index 0000000..3874dea Binary files /dev/null and b/web/src/assets/icons/favicon-16x16.png differ diff --git a/web/src/assets/icons/favicon-32x32.png b/web/src/assets/icons/favicon-32x32.png new file mode 100644 index 0000000..0b50e1f Binary files /dev/null and b/web/src/assets/icons/favicon-32x32.png differ diff --git a/web/src/assets/icons/favicon-96x96.png b/web/src/assets/icons/favicon-96x96.png new file mode 100644 index 0000000..8c9ff50 Binary files /dev/null and b/web/src/assets/icons/favicon-96x96.png differ diff --git a/web/src/assets/icons/favicon.ico b/web/src/assets/icons/favicon.ico new file mode 100644 index 0000000..1e0863b Binary files /dev/null and b/web/src/assets/icons/favicon.ico differ diff --git a/web/src/assets/icons/ms-icon-144x144.png b/web/src/assets/icons/ms-icon-144x144.png new file mode 100644 index 0000000..3109608 Binary files /dev/null and b/web/src/assets/icons/ms-icon-144x144.png differ diff --git a/web/src/assets/icons/ms-icon-150x150.png b/web/src/assets/icons/ms-icon-150x150.png new file mode 100644 index 0000000..560feeb Binary files /dev/null and b/web/src/assets/icons/ms-icon-150x150.png differ diff --git a/web/src/assets/icons/ms-icon-310x310.png b/web/src/assets/icons/ms-icon-310x310.png new file mode 100644 index 0000000..90b3a1e Binary files /dev/null and b/web/src/assets/icons/ms-icon-310x310.png differ diff --git a/web/src/assets/icons/ms-icon-70x70.png b/web/src/assets/icons/ms-icon-70x70.png new file mode 100644 index 0000000..61f5c3f Binary files /dev/null and b/web/src/assets/icons/ms-icon-70x70.png differ diff --git a/web/src/components/App/App.tsx b/web/src/components/App/App.tsx deleted file mode 100644 index f25343f..0000000 --- a/web/src/components/App/App.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import 'dayjs/locale/en'; - -import dayjs from 'dayjs'; -import customParseData from 'dayjs/plugin/customParseFormat'; -import duration from 'dayjs/plugin/duration'; -import localeData from 'dayjs/plugin/localeData'; -import relativeTime from 'dayjs/plugin/relativeTime'; -import timezone from 'dayjs/plugin/timezone'; -import updateLocale from 'dayjs/plugin/updateLocale'; -import utc from 'dayjs/plugin/utc'; -import { useEffect, useState } from 'react'; -import { createBrowserRouter, Navigate, RouterProvider } from 'react-router-dom'; -import { localStorageDetector } from 'typesafe-i18n/detectors'; - -import TypesafeI18n from '../../i18n/i18n-react'; -import { detectLocale } from '../../i18n/i18n-util'; -import { loadLocaleAsync } from '../../i18n/i18n-util.async'; -import { EnrollmentPage } from '../../pages/enrollment/EnrollmentPage'; -import { MainPage } from '../../pages/main/MainPage'; -import { OpenIdMfaCallbackPage } from '../../pages/mfa/OpenIDCallback'; -import { OpenIdMfaPage } from '../../pages/mfa/OpenIDRedirect'; -import { OpenIDCallbackPage } from '../../pages/openidCallback/OpenIDCallback'; -import { PasswordResetPage } from '../../pages/passwordReset/PasswordResetPage'; -import { SessionTimeoutPage } from '../../pages/sessionTimeout/SessionTimeoutPage'; -import { TokenPage } from '../../pages/token/TokenPage'; -import { routes } from '../../shared/routes'; - -dayjs.extend(duration); -dayjs.extend(utc); -dayjs.extend(customParseData); -dayjs.extend(relativeTime); -dayjs.extend(localeData); -dayjs.extend(updateLocale); -dayjs.extend(timezone); - -const router = createBrowserRouter([ - { - path: routes.main, - element: , - }, - { - path: routes.token, - element: , - }, - { - path: routes.timeout, - element: , - }, - { - path: routes.enrollment, - element: , - }, - { - path: routes.passwordReset, - element: , - }, - { - path: routes.openidCallback, - element: , - }, - { - path: routes.openidMfa, - element: , - }, - { - path: routes.openidMfaCallback, - element: , - }, - { - path: '/*', - element: , - }, -]); - -const detectedLocale = detectLocale(localStorageDetector); - -export const App = () => { - const [wasLoaded, setWasLoaded] = useState(false); - - useEffect(() => { - loadLocaleAsync(detectedLocale).then(() => setWasLoaded(true)); - dayjs.locale(detectedLocale); - }, []); - - if (!wasLoaded) return null; - - return ( - - - - ); -}; diff --git a/web/src/components/LogoContainer/LogoContainer.tsx b/web/src/components/LogoContainer/LogoContainer.tsx deleted file mode 100644 index 89abd82..0000000 --- a/web/src/components/LogoContainer/LogoContainer.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import './style.scss'; - -import { Divider } from '../../shared/components/layout/Divider/Divider'; -import { DividerDirection } from '../../shared/components/layout/Divider/types'; -import SvgDefguardLogoText from '../../shared/components/svg/DefguardLogoText'; -import SvgTeoniteLogo from '../../shared/components/svg/TeoniteLogo'; - -export const LogoContainer = () => { - return ( -
- - - - - - - -
- ); -}; diff --git a/web/src/components/LogoContainer/style.scss b/web/src/components/LogoContainer/style.scss deleted file mode 100644 index b0421db..0000000 --- a/web/src/components/LogoContainer/style.scss +++ /dev/null @@ -1,25 +0,0 @@ -.logo-container { - display: flex; - flex-flow: row; - column-gap: 40px; - align-items: center; - justify-content: center; - height: 48px; - width: 100%; - - & > .divider { - height: 100%; - } - - & > a > .defguard { - path { - fill: var(--text-body-primary); - } - } - - & > a > .teonite { - path { - fill: var(--surface-teonite-logo); - } - } -} diff --git a/web/src/i18n/en/index.ts b/web/src/i18n/en/index.ts deleted file mode 100644 index a840cbb..0000000 --- a/web/src/i18n/en/index.ts +++ /dev/null @@ -1,347 +0,0 @@ -/* eslint-disable no-irregular-whitespace */ -/* eslint-disable max-len */ -import type { BaseTranslation } from '../i18n-types'; - -const en = { - time: { - seconds: { - singular: 'second', - prular: 'seconds', - }, - minutes: { - singular: 'minute', - prular: 'minutes', - }, - }, - form: { - errors: { - invalid: 'Field is invalid', - email: 'Enter a valid E-mail', - required: 'Field is required', - minLength: 'Min length of {length: number}', - maxLength: 'Max length of {length: number}', - specialsRequired: 'At least one special character', - specialsForbidden: 'Special characters are forbidden', - numberRequired: 'At least one number required', - password: { - floatingTitle: 'Please correct the following:', - }, - oneLower: 'At least one lower case character', - oneUpper: 'At least one upper case character', - }, - }, - common: { - controls: { - back: 'Back', - next: 'Next', - submit: 'Submit', - }, - }, - components: { - adminInfo: { - title: 'Your admin', - }, - }, - pages: { - enrollment: { - sideBar: { - title: 'Enrollment', - steps: { - welcome: 'Welcome', - verification: 'Data verification', - password: 'Create password', - vpn: 'Configure VPN', - finish: 'Finish', - }, - appVersion: 'Application version', - }, - stepsIndicator: { - step: 'Step', - of: 'of', - }, - timeLeft: 'Time left', - steps: { - welcome: { - title: 'Hello, {name: string}', - explanation: ` -In order to gain access to the company infrastructure, we require you to complete this enrollment process. During this process, you will need to: - -1. Verify your data -2. Create your password -3. Configurate VPN device - -You have a time limit of **{time: string} minutes** to complete this process. -If you have any questions, please consult your assigned admin.All necessary information can be found at the bottom of the sidebar.`, - }, - dataVerification: { - title: 'Data verification', - messageBox: - 'Please, check your data. If anything is wrong, notify your admin after you complete the process.', - form: { - fields: { - firstName: { - label: 'Name', - }, - lastName: { - label: 'Last name', - }, - email: { - label: 'E-mail', - }, - phone: { - label: 'Phone number', - }, - }, - }, - }, - password: { - title: 'Create password', - form: { - fields: { - password: { - label: 'Create new password', - }, - repeat: { - label: 'Confirm new password', - errors: { - matching: `Passwords aren't matching`, - }, - }, - }, - }, - }, - deviceSetup: { - optionalMessage: `* This step is OPTIONAL. You can skip it if you wish. This can be configured later in defguard.`, - cards: { - device: { - title: 'Configure your device for VPN', - create: { - submit: 'Create Configuration', - messageBox: - 'Please be advised that you have to download the configuration now, since we do not store your private key. After this dialog is closed, you will not be able to get your fulll configuration file (with private keys, only blank template).', - form: { - fields: { - name: { - label: 'Device Name', - }, - public: { - label: 'My Public Key', - }, - toggle: { - generate: 'Generate key pair', - own: 'Use my own public key', - }, - }, - }, - }, - config: { - messageBox: { - auto: ` -

- Please be advised that you have to download the configuration now, - since we do not store your private key. After this - dialog is closed, you will not be able to get your - full configuration file (with private keys, only blank template). -

-`, - manual: ` -

- Please be advised that configuration provided here does not include private key and uses public key to fill it's place you will need to repalce it on your own for configuration to work properly. -

-`, - }, - deviceNameLabel: 'My Device Name', - noNetworksMessage: "You don't have access to any networks", - cardTitle: - 'Use provided configuration file below by scanning QR Code or importing it as file on your devices WireGuard app.', - card: { - selectLabel: 'Config file for location', - }, - }, - }, - guide: { - title: 'Quick Guide', - messageBox: 'This quick guide will help you with device configuration.', - step: 'Step {step: number}:', - steps: { - wireguard: { - content: - 'Download and install WireGuard client on your computer or app on a mobile device.', - button: 'Download WireGuard', - }, - downloadConfig: 'Download provided configuration file to your device.', - addTunnel: `Open WireGuard and select "Add Tunnel" (Import tunnel(s) from file). Find your -Defguard configuration file and hit "OK". On phone use WireGuard app “+” icon and scan QR code.`, - activate: 'Select your tunnel from the list and press "activate".', - finish: ` -**Great work - your Defguard VPN is now active!** - -If you want to disengage your VPN connection, simply press "deactivate". -`, - }, - }, - }, - }, - finish: { - title: 'Configuration completed!', - }, - }, - }, - resetPassword: { - steps: { - email: { - controls: { - send: 'Send', - }, - title: 'Enter your e-mail', - form: { - fields: { - email: { - label: 'E-mail', - }, - }, - }, - }, - linkSent: { - controls: { - back: 'Back to main menu', - }, - messageBox: - 'If the provided email address is assigned to any account - the password reset will be initiated and you will recieve an email with further istructions.', - }, - securityCode: { - controls: { - sendCode: 'Send code', - }, - title: 'Enter security code', - messagebox: - 'In order to reset the password, please provide security code that will be sent to your number:', - form: { - fields: { - code: { - label: 'Security code', - }, - }, - }, - }, - resetPassword: { - title: 'Reset your password', - controls: { - submit: 'Reset password', - }, - form: { - errors: { - repeat: "Fields doesn't match", - }, - fields: { - password: { - label: 'New password', - }, - repeat: { - label: 'Confirm password', - }, - }, - }, - }, - resetSuccess: { - controls: { - back: 'Return to services menu', - }, - messageBox: 'Congratulations, your new password is set.', - }, - resetFailed: { - controls: { - back: 'Return to start', - }, - messageBox: - 'The entered code is invalid. Please start the process from the beginning.', - }, - }, - }, - sessionTimeout: { - card: { - header: 'Session timed out', - message: - 'Sorry, you have exceeded the time limit to complete the process. Please try again. If you need assistance, please watch our guide or contact your administrator.', - }, - controls: { - back: 'Enter new token', - contact: 'Contact admin', - }, - }, - token: { - card: { - title: 'Please, enter your personal enrollment token', - messageBox: { - email: 'You can find token in e-mail message or use direct link.', - }, - form: { - errors: { - token: { - required: 'Token is required', - }, - }, - fields: { - token: { - placeholder: 'Token', - }, - }, - controls: { - submit: 'Next', - }, - }, - oidc: { - oidcButton: 'Sign in with', - title: 'Or Sign In with External SSO', - infoBox: - 'If you would like to initiate the enrollment process using External SSO, please click the link below to sign in and start the process.', - }, - }, - }, - oidcLogin: { - card: { - title: 'Start your enrollment process', - infoBox: - 'Thank you for validating your account, please follow instruction below for configuring your VPN connection.', - steps: { - first: 'Please download and install defguard VPN Desktop Client.', - second: `2. Open the client and Add Instance. Copy the data provided below into the corresponding fields. - You can also learn more about the process in our - documentation - .`, - tokenInput: { - instanceUrl: 'Instance URL', - token: 'Token', - title: 'Please provide instance URL and token', - addInstance: 'Add Instance', - }, - }, - }, - }, - openidMfaCallback: { - error: { - title: 'Authentication Error', - message: - 'There was an error during authentication with the provider. Please go back to the **Defguard VPN Client** and repeat the process.', - detailsTitle: 'Error Details', - }, - success: { - title: 'Authentication Completed', - message: - 'You have been successfully authenticated. Please close this window and get back to the **Defguard VPN Client**.', - }, - }, - openidMfaRedirect: { - error: { - title: 'Authentication Error', - message: - 'No token provided in the URL. Please ensure you have a valid token to proceed with OpenID authentication.', - }, - }, - }, -} satisfies BaseTranslation; - -export default en; diff --git a/web/src/i18n/formatters.ts b/web/src/i18n/formatters.ts deleted file mode 100644 index 10cd025..0000000 --- a/web/src/i18n/formatters.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { FormattersInitializer } from 'typesafe-i18n'; - -import type { Formatters, Locales } from './i18n-types'; - -export const initFormatters: FormattersInitializer = ( - locale: Locales, -) => { - const formatters: Formatters = { - // add your formatter functions here - }; - - return formatters; -}; diff --git a/web/src/i18n/i18n-react.tsx b/web/src/i18n/i18n-react.tsx deleted file mode 100644 index f113051..0000000 --- a/web/src/i18n/i18n-react.tsx +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. -/* eslint-disable */ - -import { useContext } from 'react' -import { initI18nReact } from 'typesafe-i18n/react' -import type { I18nContextType } from 'typesafe-i18n/react' -import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types' -import { loadedFormatters, loadedLocales } from './i18n-util' - -const { component: TypesafeI18n, context: I18nContext } = initI18nReact(loadedLocales, loadedFormatters) - -const useI18nContext = (): I18nContextType => useContext(I18nContext) - -export { I18nContext, useI18nContext } - -export default TypesafeI18n diff --git a/web/src/i18n/i18n-types.ts b/web/src/i18n/i18n-types.ts deleted file mode 100644 index 0aa6a8a..0000000 --- a/web/src/i18n/i18n-types.ts +++ /dev/null @@ -1,1338 +0,0 @@ -// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. -/* eslint-disable */ -import type { BaseTranslation as BaseTranslationType, LocalizedString, RequiredParams } from 'typesafe-i18n' - -export type BaseTranslation = BaseTranslationType -export type BaseLocale = 'en' - -export type Locales = - | 'en' - -export type Translation = RootTranslation - -export type Translations = RootTranslation - -type RootTranslation = { - time: { - seconds: { - /** - * s​e​c​o​n​d - */ - singular: string - /** - * s​e​c​o​n​d​s - */ - prular: string - } - minutes: { - /** - * m​i​n​u​t​e - */ - singular: string - /** - * m​i​n​u​t​e​s - */ - prular: string - } - } - form: { - errors: { - /** - * F​i​e​l​d​ ​i​s​ ​i​n​v​a​l​i​d - */ - invalid: string - /** - * E​n​t​e​r​ ​a​ ​v​a​l​i​d​ ​E​-​m​a​i​l - */ - email: string - /** - * F​i​e​l​d​ ​i​s​ ​r​e​q​u​i​r​e​d - */ - required: string - /** - * M​i​n​ ​l​e​n​g​t​h​ ​o​f​ ​{​l​e​n​g​t​h​} - * @param {number} length - */ - minLength: RequiredParams<'length'> - /** - * M​a​x​ ​l​e​n​g​t​h​ ​o​f​ ​{​l​e​n​g​t​h​} - * @param {number} length - */ - maxLength: RequiredParams<'length'> - /** - * A​t​ ​l​e​a​s​t​ ​o​n​e​ ​s​p​e​c​i​a​l​ ​c​h​a​r​a​c​t​e​r - */ - specialsRequired: string - /** - * S​p​e​c​i​a​l​ ​c​h​a​r​a​c​t​e​r​s​ ​a​r​e​ ​f​o​r​b​i​d​d​e​n - */ - specialsForbidden: string - /** - * A​t​ ​l​e​a​s​t​ ​o​n​e​ ​n​u​m​b​e​r​ ​r​e​q​u​i​r​e​d - */ - numberRequired: string - password: { - /** - * P​l​e​a​s​e​ ​c​o​r​r​e​c​t​ ​t​h​e​ ​f​o​l​l​o​w​i​n​g​: - */ - floatingTitle: string - } - /** - * A​t​ ​l​e​a​s​t​ ​o​n​e​ ​l​o​w​e​r​ ​c​a​s​e​ ​c​h​a​r​a​c​t​e​r - */ - oneLower: string - /** - * A​t​ ​l​e​a​s​t​ ​o​n​e​ ​u​p​p​e​r​ ​c​a​s​e​ ​c​h​a​r​a​c​t​e​r - */ - oneUpper: string - } - } - common: { - controls: { - /** - * B​a​c​k - */ - back: string - /** - * N​e​x​t - */ - next: string - /** - * S​u​b​m​i​t - */ - submit: string - } - } - components: { - adminInfo: { - /** - * Y​o​u​r​ ​a​d​m​i​n - */ - title: string - } - } - pages: { - enrollment: { - sideBar: { - /** - * E​n​r​o​l​l​m​e​n​t - */ - title: string - steps: { - /** - * W​e​l​c​o​m​e - */ - welcome: string - /** - * D​a​t​a​ ​v​e​r​i​f​i​c​a​t​i​o​n - */ - verification: string - /** - * C​r​e​a​t​e​ ​p​a​s​s​w​o​r​d - */ - password: string - /** - * C​o​n​f​i​g​u​r​e​ ​V​P​N - */ - vpn: string - /** - * F​i​n​i​s​h - */ - finish: string - } - /** - * A​p​p​l​i​c​a​t​i​o​n​ ​v​e​r​s​i​o​n - */ - appVersion: string - } - stepsIndicator: { - /** - * S​t​e​p - */ - step: string - /** - * o​f - */ - of: string - } - /** - * T​i​m​e​ ​l​e​f​t - */ - timeLeft: string - steps: { - welcome: { - /** - * H​e​l​l​o​,​ ​{​n​a​m​e​} - * @param {string} name - */ - title: RequiredParams<'name'> - /** - * - ​I​n​ ​o​r​d​e​r​ ​t​o​ ​g​a​i​n​ ​a​c​c​e​s​s​ ​t​o​ ​t​h​e​ ​c​o​m​p​a​n​y​ ​i​n​f​r​a​s​t​r​u​c​t​u​r​e​,​ ​w​e​ ​r​e​q​u​i​r​e​ ​y​o​u​ ​t​o​ ​c​o​m​p​l​e​t​e​ ​t​h​i​s​ ​e​n​r​o​l​l​m​e​n​t​ ​p​r​o​c​e​s​s​.​ ​D​u​r​i​n​g​ ​t​h​i​s​ ​p​r​o​c​e​s​s​,​ ​y​o​u​ ​w​i​l​l​ ​n​e​e​d​ ​t​o​:​ - ​ - ​1​.​ ​V​e​r​i​f​y​ ​y​o​u​r​ ​d​a​t​a​ - ​2​.​ ​C​r​e​a​t​e​ ​y​o​u​r​ ​p​a​s​s​w​o​r​d​ - ​3​.​ ​C​o​n​f​i​g​u​r​a​t​e​ ​V​P​N​ ​d​e​v​i​c​e​ - ​ - ​Y​o​u​ ​h​a​v​e​ ​a​ ​t​i​m​e​ ​l​i​m​i​t​ ​o​f​ ​*​*​{​t​i​m​e​}​ ​m​i​n​u​t​e​s​*​*​ ​t​o​ ​c​o​m​p​l​e​t​e​ ​t​h​i​s​ ​p​r​o​c​e​s​s​.​ - ​I​f​ ​y​o​u​ ​h​a​v​e​ ​a​n​y​ ​q​u​e​s​t​i​o​n​s​,​ ​p​l​e​a​s​e​ ​c​o​n​s​u​l​t​ ​y​o​u​r​ ​a​s​s​i​g​n​e​d​ ​a​d​m​i​n​.​A​l​l​ ​n​e​c​e​s​s​a​r​y​ ​i​n​f​o​r​m​a​t​i​o​n​ ​c​a​n​ ​b​e​ ​f​o​u​n​d​ ​a​t​ ​t​h​e​ ​b​o​t​t​o​m​ ​o​f​ ​t​h​e​ ​s​i​d​e​b​a​r​. - * @param {string} time - */ - explanation: RequiredParams<'time'> - } - dataVerification: { - /** - * D​a​t​a​ ​v​e​r​i​f​i​c​a​t​i​o​n - */ - title: string - /** - * P​l​e​a​s​e​,​ ​c​h​e​c​k​ ​y​o​u​r​ ​d​a​t​a​.​ ​I​f​ ​a​n​y​t​h​i​n​g​ ​i​s​ ​w​r​o​n​g​,​ ​n​o​t​i​f​y​ ​y​o​u​r​ ​a​d​m​i​n​ ​a​f​t​e​r​ ​y​o​u​ ​c​o​m​p​l​e​t​e​ ​t​h​e​ ​p​r​o​c​e​s​s​. - */ - messageBox: string - form: { - fields: { - firstName: { - /** - * N​a​m​e - */ - label: string - } - lastName: { - /** - * L​a​s​t​ ​n​a​m​e - */ - label: string - } - email: { - /** - * E​-​m​a​i​l - */ - label: string - } - phone: { - /** - * P​h​o​n​e​ ​n​u​m​b​e​r - */ - label: string - } - } - } - } - password: { - /** - * C​r​e​a​t​e​ ​p​a​s​s​w​o​r​d - */ - title: string - form: { - fields: { - password: { - /** - * C​r​e​a​t​e​ ​n​e​w​ ​p​a​s​s​w​o​r​d - */ - label: string - } - repeat: { - /** - * C​o​n​f​i​r​m​ ​n​e​w​ ​p​a​s​s​w​o​r​d - */ - label: string - errors: { - /** - * P​a​s​s​w​o​r​d​s​ ​a​r​e​n​'​t​ ​m​a​t​c​h​i​n​g - */ - matching: string - } - } - } - } - } - deviceSetup: { - /** - * *​ ​T​h​i​s​ ​s​t​e​p​ ​i​s​ ​O​P​T​I​O​N​A​L​.​ ​Y​o​u​ ​c​a​n​ ​s​k​i​p​ ​i​t​ ​i​f​ ​y​o​u​ ​w​i​s​h​.​ ​T​h​i​s​ ​c​a​n​ ​b​e​ ​c​o​n​f​i​g​u​r​e​d​ ​l​a​t​e​r​ ​i​n​ ​d​e​f​g​u​a​r​d​. - */ - optionalMessage: string - cards: { - device: { - /** - * C​o​n​f​i​g​u​r​e​ ​y​o​u​r​ ​d​e​v​i​c​e​ ​f​o​r​ ​V​P​N - */ - title: string - create: { - /** - * C​r​e​a​t​e​ ​C​o​n​f​i​g​u​r​a​t​i​o​n - */ - submit: string - /** - * P​l​e​a​s​e​ ​b​e​ ​a​d​v​i​s​e​d​ ​t​h​a​t​ ​y​o​u​ ​h​a​v​e​ ​t​o​ ​d​o​w​n​l​o​a​d​ ​t​h​e​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​n​o​w​,​ ​s​i​n​c​e​ ​w​e​ ​d​o​ ​n​o​t​ ​s​t​o​r​e​ ​y​o​u​r​ ​p​r​i​v​a​t​e​ ​k​e​y​.​ ​A​f​t​e​r​ ​t​h​i​s​ ​d​i​a​l​o​g​ ​i​s​ ​c​l​o​s​e​d​,​ ​y​o​u​ ​w​i​l​l​ ​n​o​t​ ​b​e​ ​a​b​l​e​ ​t​o​ ​g​e​t​ ​y​o​u​r​ ​f​u​l​l​l​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​f​i​l​e​ ​(​w​i​t​h​ ​p​r​i​v​a​t​e​ ​k​e​y​s​,​ ​o​n​l​y​ ​b​l​a​n​k​ ​t​e​m​p​l​a​t​e​)​. - */ - messageBox: string - form: { - fields: { - name: { - /** - * D​e​v​i​c​e​ ​N​a​m​e - */ - label: string - } - 'public': { - /** - * M​y​ ​P​u​b​l​i​c​ ​K​e​y - */ - label: string - } - toggle: { - /** - * G​e​n​e​r​a​t​e​ ​k​e​y​ ​p​a​i​r - */ - generate: string - /** - * U​s​e​ ​m​y​ ​o​w​n​ ​p​u​b​l​i​c​ ​k​e​y - */ - own: string - } - } - } - } - config: { - messageBox: { - /** - * - ​ ​ ​ ​ ​ ​ ​ ​<​p​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​P​l​e​a​s​e​ ​b​e​ ​a​d​v​i​s​e​d​ ​t​h​a​t​ ​y​o​u​ ​h​a​v​e​ ​t​o​ ​d​o​w​n​l​o​a​d​ ​t​h​e​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​n​o​w​,​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​s​i​n​c​e​ ​<​s​t​r​o​n​g​>​w​e​ ​d​o​ ​n​o​t​<​/​s​t​r​o​n​g​>​ ​s​t​o​r​e​ ​y​o​u​r​ ​p​r​i​v​a​t​e​ ​k​e​y​.​ ​A​f​t​e​r​ ​t​h​i​s​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​d​i​a​l​o​g​ ​i​s​ ​c​l​o​s​e​d​,​ ​y​o​u​ ​<​s​t​r​o​n​g​>​w​i​l​l​ ​n​o​t​ ​b​e​ ​a​b​l​e​<​/​s​t​r​o​n​g​>​ ​t​o​ ​g​e​t​ ​y​o​u​r​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​f​u​l​l​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​f​i​l​e​ ​(​w​i​t​h​ ​p​r​i​v​a​t​e​ ​k​e​y​s​,​ ​o​n​l​y​ ​b​l​a​n​k​ ​t​e​m​p​l​a​t​e​)​.​ - ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​>​ - - */ - auto: string - /** - * - ​ ​ ​ ​ ​ ​ ​ ​ ​<​p​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​P​l​e​a​s​e​ ​b​e​ ​a​d​v​i​s​e​d​ ​t​h​a​t​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​p​r​o​v​i​d​e​d​ ​h​e​r​e​ ​<​s​t​r​o​n​g​>​ ​d​o​e​s​ ​n​o​t​ ​i​n​c​l​u​d​e​ ​p​r​i​v​a​t​e​ ​k​e​y​ ​a​n​d​ ​u​s​e​s​ ​p​u​b​l​i​c​ ​k​e​y​ ​t​o​ ​f​i​l​l​ ​i​t​'​s​ ​p​l​a​c​e​ ​<​/​s​t​r​o​n​g​>​ ​y​o​u​ ​w​i​l​l​ ​n​e​e​d​ ​t​o​ ​r​e​p​a​l​c​e​ ​i​t​ ​o​n​ ​y​o​u​r​ ​o​w​n​ ​f​o​r​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​t​o​ ​w​o​r​k​ ​p​r​o​p​e​r​l​y​.​ - ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​>​ - - */ - manual: string - } - /** - * M​y​ ​D​e​v​i​c​e​ ​N​a​m​e - */ - deviceNameLabel: string - /** - * Y​o​u​ ​d​o​n​'​t​ ​h​a​v​e​ ​a​c​c​e​s​s​ ​t​o​ ​a​n​y​ ​n​e​t​w​o​r​k​s - */ - noNetworksMessage: string - /** - * U​s​e​ ​p​r​o​v​i​d​e​d​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​f​i​l​e​ ​b​e​l​o​w​ ​b​y​ ​s​c​a​n​n​i​n​g​ ​Q​R​ ​C​o​d​e​ ​o​r​ ​i​m​p​o​r​t​i​n​g​ ​i​t​ ​a​s​ ​f​i​l​e​ ​o​n​ ​y​o​u​r​ ​d​e​v​i​c​e​s​ ​W​i​r​e​G​u​a​r​d​ ​a​p​p​. - */ - cardTitle: string - card: { - /** - * C​o​n​f​i​g​ ​f​i​l​e​ ​f​o​r​ ​l​o​c​a​t​i​o​n - */ - selectLabel: string - } - } - } - guide: { - /** - * Q​u​i​c​k​ ​G​u​i​d​e - */ - title: string - /** - * T​h​i​s​ ​q​u​i​c​k​ ​g​u​i​d​e​ ​w​i​l​l​ ​h​e​l​p​ ​y​o​u​ ​w​i​t​h​ ​d​e​v​i​c​e​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​. - */ - messageBox: string - /** - * S​t​e​p​ ​{​s​t​e​p​}​: - * @param {number} step - */ - step: RequiredParams<'step'> - steps: { - wireguard: { - /** - * D​o​w​n​l​o​a​d​ ​a​n​d​ ​i​n​s​t​a​l​l​ ​W​i​r​e​G​u​a​r​d​ ​c​l​i​e​n​t​ ​o​n​ ​y​o​u​r​ ​c​o​m​p​u​t​e​r​ ​o​r​ ​a​p​p​ ​o​n​ ​a​ ​m​o​b​i​l​e​ ​d​e​v​i​c​e​. - */ - content: string - /** - * D​o​w​n​l​o​a​d​ ​W​i​r​e​G​u​a​r​d - */ - button: string - } - /** - * D​o​w​n​l​o​a​d​ ​p​r​o​v​i​d​e​d​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​f​i​l​e​ ​t​o​ ​y​o​u​r​ ​d​e​v​i​c​e​. - */ - downloadConfig: string - /** - * O​p​e​n​ ​W​i​r​e​G​u​a​r​d​ ​a​n​d​ ​s​e​l​e​c​t​ ​"​A​d​d​ ​T​u​n​n​e​l​"​ ​(​I​m​p​o​r​t​ ​t​u​n​n​e​l​(​s​)​ ​f​r​o​m​ ​f​i​l​e​)​.​ ​F​i​n​d​ ​y​o​u​r​ - ​D​e​f​g​u​a​r​d​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​f​i​l​e​ ​a​n​d​ ​h​i​t​ ​"​O​K​"​.​ ​O​n​ ​p​h​o​n​e​ ​u​s​e​ ​W​i​r​e​G​u​a​r​d​ ​a​p​p​ ​“​+​”​ ​i​c​o​n​ ​a​n​d​ ​s​c​a​n​ ​Q​R​ ​c​o​d​e​. - */ - addTunnel: string - /** - * S​e​l​e​c​t​ ​y​o​u​r​ ​t​u​n​n​e​l​ ​f​r​o​m​ ​t​h​e​ ​l​i​s​t​ ​a​n​d​ ​p​r​e​s​s​ ​"​a​c​t​i​v​a​t​e​"​. - */ - activate: string - /** - * - ​*​*​G​r​e​a​t​ ​w​o​r​k​ ​-​ ​y​o​u​r​ ​D​e​f​g​u​a​r​d​ ​V​P​N​ ​i​s​ ​n​o​w​ ​a​c​t​i​v​e​!​*​*​ - ​ - ​I​f​ ​y​o​u​ ​w​a​n​t​ ​t​o​ ​d​i​s​e​n​g​a​g​e​ ​y​o​u​r​ ​V​P​N​ ​c​o​n​n​e​c​t​i​o​n​,​ ​s​i​m​p​l​y​ ​p​r​e​s​s​ ​"​d​e​a​c​t​i​v​a​t​e​"​.​ - - */ - finish: string - } - } - } - } - finish: { - /** - * C​o​n​f​i​g​u​r​a​t​i​o​n​ ​c​o​m​p​l​e​t​e​d​! - */ - title: string - } - } - } - resetPassword: { - steps: { - email: { - controls: { - /** - * S​e​n​d - */ - send: string - } - /** - * E​n​t​e​r​ ​y​o​u​r​ ​e​-​m​a​i​l - */ - title: string - form: { - fields: { - email: { - /** - * E​-​m​a​i​l - */ - label: string - } - } - } - } - linkSent: { - controls: { - /** - * B​a​c​k​ ​t​o​ ​m​a​i​n​ ​m​e​n​u - */ - back: string - } - /** - * I​f​ ​t​h​e​ ​p​r​o​v​i​d​e​d​ ​e​m​a​i​l​ ​a​d​d​r​e​s​s​ ​i​s​ ​a​s​s​i​g​n​e​d​ ​t​o​ ​a​n​y​ ​a​c​c​o​u​n​t​ ​-​ ​t​h​e​ ​p​a​s​s​w​o​r​d​ ​r​e​s​e​t​ ​w​i​l​l​ ​b​e​ ​i​n​i​t​i​a​t​e​d​ ​a​n​d​ ​y​o​u​ ​w​i​l​l​ ​r​e​c​i​e​v​e​ ​a​n​ ​e​m​a​i​l​ ​w​i​t​h​ ​f​u​r​t​h​e​r​ ​i​s​t​r​u​c​t​i​o​n​s​. - */ - messageBox: string - } - securityCode: { - controls: { - /** - * S​e​n​d​ ​c​o​d​e - */ - sendCode: string - } - /** - * E​n​t​e​r​ ​s​e​c​u​r​i​t​y​ ​c​o​d​e - */ - title: string - /** - * I​n​ ​o​r​d​e​r​ ​t​o​ ​r​e​s​e​t​ ​t​h​e​ ​p​a​s​s​w​o​r​d​,​ ​p​l​e​a​s​e​ ​p​r​o​v​i​d​e​ ​s​e​c​u​r​i​t​y​ ​c​o​d​e​ ​t​h​a​t​ ​w​i​l​l​ ​b​e​ ​s​e​n​t​ ​t​o​ ​y​o​u​r​ ​n​u​m​b​e​r​: - */ - messagebox: string - form: { - fields: { - code: { - /** - * S​e​c​u​r​i​t​y​ ​c​o​d​e - */ - label: string - } - } - } - } - resetPassword: { - /** - * R​e​s​e​t​ ​y​o​u​r​ ​p​a​s​s​w​o​r​d - */ - title: string - controls: { - /** - * R​e​s​e​t​ ​p​a​s​s​w​o​r​d - */ - submit: string - } - form: { - errors: { - /** - * F​i​e​l​d​s​ ​d​o​e​s​n​'​t​ ​m​a​t​c​h - */ - repeat: string - } - fields: { - password: { - /** - * N​e​w​ ​p​a​s​s​w​o​r​d - */ - label: string - } - repeat: { - /** - * C​o​n​f​i​r​m​ ​p​a​s​s​w​o​r​d - */ - label: string - } - } - } - } - resetSuccess: { - controls: { - /** - * R​e​t​u​r​n​ ​t​o​ ​s​e​r​v​i​c​e​s​ ​m​e​n​u - */ - back: string - } - /** - * C​o​n​g​r​a​t​u​l​a​t​i​o​n​s​,​ ​y​o​u​r​ ​n​e​w​ ​p​a​s​s​w​o​r​d​ ​i​s​ ​s​e​t​. - */ - messageBox: string - } - resetFailed: { - controls: { - /** - * R​e​t​u​r​n​ ​t​o​ ​s​t​a​r​t - */ - back: string - } - /** - * T​h​e​ ​e​n​t​e​r​e​d​ ​c​o​d​e​ ​i​s​ ​i​n​v​a​l​i​d​.​ ​P​l​e​a​s​e​ ​s​t​a​r​t​ ​t​h​e​ ​p​r​o​c​e​s​s​ ​f​r​o​m​ ​t​h​e​ ​b​e​g​i​n​n​i​n​g​. - */ - messageBox: string - } - } - } - sessionTimeout: { - card: { - /** - * S​e​s​s​i​o​n​ ​t​i​m​e​d​ ​o​u​t - */ - header: string - /** - * S​o​r​r​y​,​ ​y​o​u​ ​h​a​v​e​ ​e​x​c​e​e​d​e​d​ ​t​h​e​ ​t​i​m​e​ ​l​i​m​i​t​ ​t​o​ ​c​o​m​p​l​e​t​e​ ​t​h​e​ ​p​r​o​c​e​s​s​.​ ​P​l​e​a​s​e​ ​t​r​y​ ​a​g​a​i​n​.​ ​I​f​ ​y​o​u​ ​n​e​e​d​ ​a​s​s​i​s​t​a​n​c​e​,​ ​p​l​e​a​s​e​ ​w​a​t​c​h​ ​o​u​r​ ​g​u​i​d​e​ ​o​r​ ​c​o​n​t​a​c​t​ ​y​o​u​r​ ​a​d​m​i​n​i​s​t​r​a​t​o​r​. - */ - message: string - } - controls: { - /** - * E​n​t​e​r​ ​n​e​w​ ​t​o​k​e​n - */ - back: string - /** - * C​o​n​t​a​c​t​ ​a​d​m​i​n - */ - contact: string - } - } - token: { - card: { - /** - * P​l​e​a​s​e​,​ ​e​n​t​e​r​ ​y​o​u​r​ ​p​e​r​s​o​n​a​l​ ​e​n​r​o​l​l​m​e​n​t​ ​t​o​k​e​n - */ - title: string - messageBox: { - /** - * Y​o​u​ ​c​a​n​ ​f​i​n​d​ ​t​o​k​e​n​ ​i​n​ ​e​-​m​a​i​l​ ​m​e​s​s​a​g​e​ ​o​r​ ​u​s​e​ ​d​i​r​e​c​t​ ​l​i​n​k​. - */ - email: string - } - form: { - errors: { - token: { - /** - * T​o​k​e​n​ ​i​s​ ​r​e​q​u​i​r​e​d - */ - required: string - } - } - fields: { - token: { - /** - * T​o​k​e​n - */ - placeholder: string - } - } - controls: { - /** - * N​e​x​t - */ - submit: string - } - } - oidc: { - /** - * S​i​g​n​ ​i​n​ ​w​i​t​h - */ - oidcButton: string - /** - * O​r​ ​S​i​g​n​ ​I​n​ ​w​i​t​h​ ​E​x​t​e​r​n​a​l​ ​S​S​O - */ - title: string - /** - * I​f​ ​y​o​u​ ​w​o​u​l​d​ ​l​i​k​e​ ​t​o​ ​i​n​i​t​i​a​t​e​ ​t​h​e​ ​e​n​r​o​l​l​m​e​n​t​ ​p​r​o​c​e​s​s​ ​u​s​i​n​g​ ​E​x​t​e​r​n​a​l​ ​S​S​O​,​ ​p​l​e​a​s​e​ ​c​l​i​c​k​ ​t​h​e​ ​l​i​n​k​ ​b​e​l​o​w​ ​t​o​ ​s​i​g​n​ ​i​n​ ​a​n​d​ ​s​t​a​r​t​ ​t​h​e​ ​p​r​o​c​e​s​s​. - */ - infoBox: string - } - } - } - oidcLogin: { - card: { - /** - * S​t​a​r​t​ ​y​o​u​r​ ​e​n​r​o​l​l​m​e​n​t​ ​p​r​o​c​e​s​s - */ - title: string - /** - * T​h​a​n​k​ ​y​o​u​ ​f​o​r​ ​v​a​l​i​d​a​t​i​n​g​ ​y​o​u​r​ ​a​c​c​o​u​n​t​,​ ​p​l​e​a​s​e​ ​f​o​l​l​o​w​ ​i​n​s​t​r​u​c​t​i​o​n​ ​b​e​l​o​w​ ​f​o​r​ ​c​o​n​f​i​g​u​r​i​n​g​ ​y​o​u​r​ ​V​P​N​ ​c​o​n​n​e​c​t​i​o​n​. - */ - infoBox: string - steps: { - /** - * P​l​e​a​s​e​ ​d​o​w​n​l​o​a​d​ ​a​n​d​ ​i​n​s​t​a​l​l​ ​d​e​f​g​u​a​r​d​ ​V​P​N​ ​D​e​s​k​t​o​p​ ​C​l​i​e​n​t​. - */ - first: string - /** - * 2​.​ ​O​p​e​n​ ​t​h​e​ ​c​l​i​e​n​t​ ​a​n​d​ ​<​i​>​A​d​d​ ​I​n​s​t​a​n​c​e​<​/​i​>​.​ ​C​o​p​y​ ​t​h​e​ ​d​a​t​a​ ​p​r​o​v​i​d​e​d​ ​b​e​l​o​w​ ​i​n​t​o​ ​t​h​e​ ​c​o​r​r​e​s​p​o​n​d​i​n​g​ ​f​i​e​l​d​s​.​ ​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​Y​o​u​ ​c​a​n​ ​a​l​s​o​ ​l​e​a​r​n​ ​m​o​r​e​ ​a​b​o​u​t​ ​t​h​e​ ​p​r​o​c​e​s​s​ ​i​n​ ​o​u​r​ ​<​a​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​h​r​e​f​=​"​h​t​t​p​s​:​/​/​d​o​c​s​.​d​e​f​g​u​a​r​d​.​n​e​t​/​h​e​l​p​/​c​o​n​f​i​g​u​r​i​n​g​-​v​p​n​/​a​d​d​-​n​e​w​-​i​n​s​t​a​n​c​e​"​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​t​a​r​g​e​t​=​"​_​b​l​a​n​k​"​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​d​o​c​u​m​e​n​t​a​t​i​o​n​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​a​>​. - */ - second: string - tokenInput: { - /** - * I​n​s​t​a​n​c​e​ ​U​R​L - */ - instanceUrl: string - /** - * T​o​k​e​n - */ - token: string - /** - * P​l​e​a​s​e​ ​p​r​o​v​i​d​e​ ​i​n​s​t​a​n​c​e​ ​U​R​L​ ​a​n​d​ ​t​o​k​e​n - */ - title: string - /** - * A​d​d​ ​I​n​s​t​a​n​c​e - */ - addInstance: string - } - } - } - } - openidMfaCallback: { - error: { - /** - * A​u​t​h​e​n​t​i​c​a​t​i​o​n​ ​E​r​r​o​r - */ - title: string - /** - * T​h​e​r​e​ ​w​a​s​ ​a​n​ ​e​r​r​o​r​ ​d​u​r​i​n​g​ ​a​u​t​h​e​n​t​i​c​a​t​i​o​n​ ​w​i​t​h​ ​t​h​e​ ​p​r​o​v​i​d​e​r​.​ ​P​l​e​a​s​e​ ​g​o​ ​b​a​c​k​ ​t​o​ ​t​h​e​ ​*​*​D​e​f​g​u​a​r​d​ ​V​P​N​ ​C​l​i​e​n​t​*​*​ ​a​n​d​ ​r​e​p​e​a​t​ ​t​h​e​ ​p​r​o​c​e​s​s​. - */ - message: string - /** - * E​r​r​o​r​ ​D​e​t​a​i​l​s - */ - detailsTitle: string - } - success: { - /** - * A​u​t​h​e​n​t​i​c​a​t​i​o​n​ ​C​o​m​p​l​e​t​e​d - */ - title: string - /** - * Y​o​u​ ​h​a​v​e​ ​b​e​e​n​ ​s​u​c​c​e​s​s​f​u​l​l​y​ ​a​u​t​h​e​n​t​i​c​a​t​e​d​.​ ​P​l​e​a​s​e​ ​c​l​o​s​e​ ​t​h​i​s​ ​w​i​n​d​o​w​ ​a​n​d​ ​g​e​t​ ​b​a​c​k​ ​t​o​ ​t​h​e​ ​*​*​D​e​f​g​u​a​r​d​ ​V​P​N​ ​C​l​i​e​n​t​*​*​. - */ - message: string - } - } - openidMfaRedirect: { - error: { - /** - * A​u​t​h​e​n​t​i​c​a​t​i​o​n​ ​E​r​r​o​r - */ - title: string - /** - * N​o​ ​t​o​k​e​n​ ​p​r​o​v​i​d​e​d​ ​i​n​ ​t​h​e​ ​U​R​L​.​ ​P​l​e​a​s​e​ ​e​n​s​u​r​e​ ​y​o​u​ ​h​a​v​e​ ​a​ ​v​a​l​i​d​ ​t​o​k​e​n​ ​t​o​ ​p​r​o​c​e​e​d​ ​w​i​t​h​ ​O​p​e​n​I​D​ ​a​u​t​h​e​n​t​i​c​a​t​i​o​n​. - */ - message: string - } - } - } -} - -export type TranslationFunctions = { - time: { - seconds: { - /** - * second - */ - singular: () => LocalizedString - /** - * seconds - */ - prular: () => LocalizedString - } - minutes: { - /** - * minute - */ - singular: () => LocalizedString - /** - * minutes - */ - prular: () => LocalizedString - } - } - form: { - errors: { - /** - * Field is invalid - */ - invalid: () => LocalizedString - /** - * Enter a valid E-mail - */ - email: () => LocalizedString - /** - * Field is required - */ - required: () => LocalizedString - /** - * Min length of {length} - */ - minLength: (arg: { length: number }) => LocalizedString - /** - * Max length of {length} - */ - maxLength: (arg: { length: number }) => LocalizedString - /** - * At least one special character - */ - specialsRequired: () => LocalizedString - /** - * Special characters are forbidden - */ - specialsForbidden: () => LocalizedString - /** - * At least one number required - */ - numberRequired: () => LocalizedString - password: { - /** - * Please correct the following: - */ - floatingTitle: () => LocalizedString - } - /** - * At least one lower case character - */ - oneLower: () => LocalizedString - /** - * At least one upper case character - */ - oneUpper: () => LocalizedString - } - } - common: { - controls: { - /** - * Back - */ - back: () => LocalizedString - /** - * Next - */ - next: () => LocalizedString - /** - * Submit - */ - submit: () => LocalizedString - } - } - components: { - adminInfo: { - /** - * Your admin - */ - title: () => LocalizedString - } - } - pages: { - enrollment: { - sideBar: { - /** - * Enrollment - */ - title: () => LocalizedString - steps: { - /** - * Welcome - */ - welcome: () => LocalizedString - /** - * Data verification - */ - verification: () => LocalizedString - /** - * Create password - */ - password: () => LocalizedString - /** - * Configure VPN - */ - vpn: () => LocalizedString - /** - * Finish - */ - finish: () => LocalizedString - } - /** - * Application version - */ - appVersion: () => LocalizedString - } - stepsIndicator: { - /** - * Step - */ - step: () => LocalizedString - /** - * of - */ - of: () => LocalizedString - } - /** - * Time left - */ - timeLeft: () => LocalizedString - steps: { - welcome: { - /** - * Hello, {name} - */ - title: (arg: { name: string }) => LocalizedString - /** - * - In order to gain access to the company infrastructure, we require you to complete this enrollment process. During this process, you will need to: - - 1. Verify your data - 2. Create your password - 3. Configurate VPN device - - You have a time limit of **{time} minutes** to complete this process. - If you have any questions, please consult your assigned admin.All necessary information can be found at the bottom of the sidebar. - */ - explanation: (arg: { time: string }) => LocalizedString - } - dataVerification: { - /** - * Data verification - */ - title: () => LocalizedString - /** - * Please, check your data. If anything is wrong, notify your admin after you complete the process. - */ - messageBox: () => LocalizedString - form: { - fields: { - firstName: { - /** - * Name - */ - label: () => LocalizedString - } - lastName: { - /** - * Last name - */ - label: () => LocalizedString - } - email: { - /** - * E-mail - */ - label: () => LocalizedString - } - phone: { - /** - * Phone number - */ - label: () => LocalizedString - } - } - } - } - password: { - /** - * Create password - */ - title: () => LocalizedString - form: { - fields: { - password: { - /** - * Create new password - */ - label: () => LocalizedString - } - repeat: { - /** - * Confirm new password - */ - label: () => LocalizedString - errors: { - /** - * Passwords aren't matching - */ - matching: () => LocalizedString - } - } - } - } - } - deviceSetup: { - /** - * * This step is OPTIONAL. You can skip it if you wish. This can be configured later in defguard. - */ - optionalMessage: () => LocalizedString - cards: { - device: { - /** - * Configure your device for VPN - */ - title: () => LocalizedString - create: { - /** - * Create Configuration - */ - submit: () => LocalizedString - /** - * Please be advised that you have to download the configuration now, since we do not store your private key. After this dialog is closed, you will not be able to get your fulll configuration file (with private keys, only blank template). - */ - messageBox: () => LocalizedString - form: { - fields: { - name: { - /** - * Device Name - */ - label: () => LocalizedString - } - 'public': { - /** - * My Public Key - */ - label: () => LocalizedString - } - toggle: { - /** - * Generate key pair - */ - generate: () => LocalizedString - /** - * Use my own public key - */ - own: () => LocalizedString - } - } - } - } - config: { - messageBox: { - /** - * -

- Please be advised that you have to download the configuration now, - since we do not store your private key. After this - dialog is closed, you will not be able to get your - full configuration file (with private keys, only blank template). -

- - */ - auto: () => LocalizedString - /** - * -

- Please be advised that configuration provided here does not include private key and uses public key to fill it's place you will need to repalce it on your own for configuration to work properly. -

- - */ - manual: () => LocalizedString - } - /** - * My Device Name - */ - deviceNameLabel: () => LocalizedString - /** - * You don't have access to any networks - */ - noNetworksMessage: () => LocalizedString - /** - * Use provided configuration file below by scanning QR Code or importing it as file on your devices WireGuard app. - */ - cardTitle: () => LocalizedString - card: { - /** - * Config file for location - */ - selectLabel: () => LocalizedString - } - } - } - guide: { - /** - * Quick Guide - */ - title: () => LocalizedString - /** - * This quick guide will help you with device configuration. - */ - messageBox: () => LocalizedString - /** - * Step {step}: - */ - step: (arg: { step: number }) => LocalizedString - steps: { - wireguard: { - /** - * Download and install WireGuard client on your computer or app on a mobile device. - */ - content: () => LocalizedString - /** - * Download WireGuard - */ - button: () => LocalizedString - } - /** - * Download provided configuration file to your device. - */ - downloadConfig: () => LocalizedString - /** - * Open WireGuard and select "Add Tunnel" (Import tunnel(s) from file). Find your - Defguard configuration file and hit "OK". On phone use WireGuard app “+” icon and scan QR code. - */ - addTunnel: () => LocalizedString - /** - * Select your tunnel from the list and press "activate". - */ - activate: () => LocalizedString - /** - * - **Great work - your Defguard VPN is now active!** - - If you want to disengage your VPN connection, simply press "deactivate". - - */ - finish: () => LocalizedString - } - } - } - } - finish: { - /** - * Configuration completed! - */ - title: () => LocalizedString - } - } - } - resetPassword: { - steps: { - email: { - controls: { - /** - * Send - */ - send: () => LocalizedString - } - /** - * Enter your e-mail - */ - title: () => LocalizedString - form: { - fields: { - email: { - /** - * E-mail - */ - label: () => LocalizedString - } - } - } - } - linkSent: { - controls: { - /** - * Back to main menu - */ - back: () => LocalizedString - } - /** - * If the provided email address is assigned to any account - the password reset will be initiated and you will recieve an email with further istructions. - */ - messageBox: () => LocalizedString - } - securityCode: { - controls: { - /** - * Send code - */ - sendCode: () => LocalizedString - } - /** - * Enter security code - */ - title: () => LocalizedString - /** - * In order to reset the password, please provide security code that will be sent to your number: - */ - messagebox: () => LocalizedString - form: { - fields: { - code: { - /** - * Security code - */ - label: () => LocalizedString - } - } - } - } - resetPassword: { - /** - * Reset your password - */ - title: () => LocalizedString - controls: { - /** - * Reset password - */ - submit: () => LocalizedString - } - form: { - errors: { - /** - * Fields doesn't match - */ - repeat: () => LocalizedString - } - fields: { - password: { - /** - * New password - */ - label: () => LocalizedString - } - repeat: { - /** - * Confirm password - */ - label: () => LocalizedString - } - } - } - } - resetSuccess: { - controls: { - /** - * Return to services menu - */ - back: () => LocalizedString - } - /** - * Congratulations, your new password is set. - */ - messageBox: () => LocalizedString - } - resetFailed: { - controls: { - /** - * Return to start - */ - back: () => LocalizedString - } - /** - * The entered code is invalid. Please start the process from the beginning. - */ - messageBox: () => LocalizedString - } - } - } - sessionTimeout: { - card: { - /** - * Session timed out - */ - header: () => LocalizedString - /** - * Sorry, you have exceeded the time limit to complete the process. Please try again. If you need assistance, please watch our guide or contact your administrator. - */ - message: () => LocalizedString - } - controls: { - /** - * Enter new token - */ - back: () => LocalizedString - /** - * Contact admin - */ - contact: () => LocalizedString - } - } - token: { - card: { - /** - * Please, enter your personal enrollment token - */ - title: () => LocalizedString - messageBox: { - /** - * You can find token in e-mail message or use direct link. - */ - email: () => LocalizedString - } - form: { - errors: { - token: { - /** - * Token is required - */ - required: () => LocalizedString - } - } - fields: { - token: { - /** - * Token - */ - placeholder: () => LocalizedString - } - } - controls: { - /** - * Next - */ - submit: () => LocalizedString - } - } - oidc: { - /** - * Sign in with - */ - oidcButton: () => LocalizedString - /** - * Or Sign In with External SSO - */ - title: () => LocalizedString - /** - * If you would like to initiate the enrollment process using External SSO, please click the link below to sign in and start the process. - */ - infoBox: () => LocalizedString - } - } - } - oidcLogin: { - card: { - /** - * Start your enrollment process - */ - title: () => LocalizedString - /** - * Thank you for validating your account, please follow instruction below for configuring your VPN connection. - */ - infoBox: () => LocalizedString - steps: { - /** - * Please download and install defguard VPN Desktop Client. - */ - first: () => LocalizedString - /** - * 2. Open the client and Add Instance. Copy the data provided below into the corresponding fields. - You can also learn more about the process in our - documentation - . - */ - second: () => LocalizedString - tokenInput: { - /** - * Instance URL - */ - instanceUrl: () => LocalizedString - /** - * Token - */ - token: () => LocalizedString - /** - * Please provide instance URL and token - */ - title: () => LocalizedString - /** - * Add Instance - */ - addInstance: () => LocalizedString - } - } - } - } - openidMfaCallback: { - error: { - /** - * Authentication Error - */ - title: () => LocalizedString - /** - * There was an error during authentication with the provider. Please go back to the **Defguard VPN Client** and repeat the process. - */ - message: () => LocalizedString - /** - * Error Details - */ - detailsTitle: () => LocalizedString - } - success: { - /** - * Authentication Completed - */ - title: () => LocalizedString - /** - * You have been successfully authenticated. Please close this window and get back to the **Defguard VPN Client**. - */ - message: () => LocalizedString - } - } - openidMfaRedirect: { - error: { - /** - * Authentication Error - */ - title: () => LocalizedString - /** - * No token provided in the URL. Please ensure you have a valid token to proceed with OpenID authentication. - */ - message: () => LocalizedString - } - } - } -} - -export type Formatters = {} diff --git a/web/src/i18n/i18n-util.async.ts b/web/src/i18n/i18n-util.async.ts deleted file mode 100644 index d87b526..0000000 --- a/web/src/i18n/i18n-util.async.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. -/* eslint-disable */ - -import { initFormatters } from './formatters' -import type { Locales, Translations } from './i18n-types' -import { loadedFormatters, loadedLocales, locales } from './i18n-util' - -const localeTranslationLoaders = { - en: () => import('./en'), -} - -const updateDictionary = (locale: Locales, dictionary: Partial): Translations => - loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary } - -export const importLocaleAsync = async (locale: Locales): Promise => - (await localeTranslationLoaders[locale]()).default as unknown as Translations - -export const loadLocaleAsync = async (locale: Locales): Promise => { - updateDictionary(locale, await importLocaleAsync(locale)) - loadFormatters(locale) -} - -export const loadAllLocalesAsync = (): Promise => Promise.all(locales.map(loadLocaleAsync)) - -export const loadFormatters = (locale: Locales): void => - void (loadedFormatters[locale] = initFormatters(locale)) diff --git a/web/src/i18n/i18n-util.sync.ts b/web/src/i18n/i18n-util.sync.ts deleted file mode 100644 index bebffe4..0000000 --- a/web/src/i18n/i18n-util.sync.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. -/* eslint-disable */ - -import { initFormatters } from './formatters' -import type { Locales, Translations } from './i18n-types' -import { loadedFormatters, loadedLocales, locales } from './i18n-util' - -import en from './en' - -const localeTranslations = { - en, -} - -export const loadLocale = (locale: Locales): void => { - if (loadedLocales[locale]) return - - loadedLocales[locale] = localeTranslations[locale] as unknown as Translations - loadFormatters(locale) -} - -export const loadAllLocales = (): void => locales.forEach(loadLocale) - -export const loadFormatters = (locale: Locales): void => - void (loadedFormatters[locale] = initFormatters(locale)) diff --git a/web/src/i18n/i18n-util.ts b/web/src/i18n/i18n-util.ts deleted file mode 100644 index 452e0a6..0000000 --- a/web/src/i18n/i18n-util.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. -/* eslint-disable */ - -import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n' -import type { LocaleDetector } from 'typesafe-i18n/detectors' -import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n' -import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors' -import { initExtendDictionary } from 'typesafe-i18n/utils' -import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types' - -export const baseLocale: Locales = 'en' - -export const locales: Locales[] = [ - 'en' -] - -export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales) - -export const loadedLocales: Record = {} as Record - -export const loadedFormatters: Record = {} as Record - -export const extendDictionary = initExtendDictionary() - -export const i18nString = (locale: Locales): TranslateByString => initI18nString(locale, loadedFormatters[locale]) - -export const i18nObject = (locale: Locales): TranslationFunctions => - initI18nObject( - locale, - loadedLocales[locale], - loadedFormatters[locale] - ) - -export const i18n = (): LocaleTranslationFunctions => - initI18n(loadedLocales, loadedFormatters) - -export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn(baseLocale, locales, ...detectors) diff --git a/web/src/main.tsx b/web/src/main.tsx index b674ddb..abcf38d 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -1,23 +1,27 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; import './shared/defguard-ui/scss/index.scss'; -import './shared/scss/index.scss'; - -import { App } from './components/App/App'; -import { ToastManager } from './shared/defguard-ui/components/Layout/ToastManager/ToastManager'; - -const queryClient = new QueryClient(); -const rootElement = document.getElementById('root') as HTMLElement; - -const root = createRoot(rootElement); +import { TanStackDevtools } from '@tanstack/react-devtools'; +import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools'; +import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { App } from './app/App'; -root.render( +// biome-ignore lint/style/noNonNullAssertion: always there +createRoot(document.getElementById('root')!).render( - - - - + + , + }, + { + name: 'TanStack Query', + render: , + }, + ]} + /> , ); diff --git a/web/src/pages/ClientDownload/ClientDownloadPage.tsx b/web/src/pages/ClientDownload/ClientDownloadPage.tsx new file mode 100644 index 0000000..dea1def --- /dev/null +++ b/web/src/pages/ClientDownload/ClientDownloadPage.tsx @@ -0,0 +1,299 @@ +import './style.scss'; +import { useQuery } from '@tanstack/react-query'; +import { + type RouterState, + useLoaderData, + useNavigate, + useRouterState, +} from '@tanstack/react-router'; +import { useMemo, useState } from 'react'; +import { m } from '../../paraglide/messages'; +import { AppleHelpModal } from '../../shared/components/AppleHelpModal/AppleHelpModal'; +import { Page } from '../../shared/components/Page/Page'; +import { PageNavigation } from '../../shared/components/PageNavigation/PageNavigation'; +import { EnrollmentStep } from '../../shared/components/Step/Step'; +import { externalLink } from '../../shared/consts'; +import { Button } from '../../shared/defguard-ui/components/Button/Button'; +import { ButtonMenu } from '../../shared/defguard-ui/components/ButtonMenu/MenuButton'; +import { Icon } from '../../shared/defguard-ui/components/Icon'; +import type { IconKindValue } from '../../shared/defguard-ui/components/Icon/icon-types'; +import { InfoBanner } from '../../shared/defguard-ui/components/InfoBanner/InfoBanner'; +import type { MenuItemsGroup } from '../../shared/defguard-ui/components/Menu/types'; +import { Modal } from '../../shared/defguard-ui/components/Modal/Modal'; +import { ModalControls } from '../../shared/defguard-ui/components/ModalControls/ModalControls'; +import { SizedBox } from '../../shared/defguard-ui/components/SizedBox/SizedBox'; +import { ThemeSpacing } from '../../shared/defguard-ui/types'; +import { isPresent } from '../../shared/defguard-ui/utils/isPresent'; +import { getClientArtifactsQueryOptions } from '../../shared/query/queryOptions'; +import { openClientLink } from '../../shared/utils/openVirtualLink'; +import androidIcon from './assets/android.png'; +import iosIcon from './assets/ios.png'; +import laptopIcon from './assets/laptop.png'; +import linuxIcon from './assets/linux.png'; +import desktopIcon from './assets/pc-tower.png'; + +export const ClientDownloadPage = () => { + const { data: pageData } = useQuery(getClientArtifactsQueryOptions); + const { enrollmentState } = useLoaderData({ + from: '/download', + }); + const routerLoading = useRouterState({ select: (s: RouterState) => s.isLoading }); + + const navigate = useNavigate(); + + const [confirmModalOpen, setConfirmModalOpen] = useState(false); + const [appleHelpModalOpen, setAppleHelpModalOpen] = useState(false); + + const appleMenu = useMemo( + (): MenuItemsGroup[] => [ + { + header: { + text: m.client_download_apple_help_header(), + onHelp: () => { + setAppleHelpModalOpen(true); + }, + }, + items: [ + { + text: 'Intel', + onClick: () => openClientLink(pageData?.macos_amd64), + }, + { + text: 'ARM', + onClick: () => openClientLink(pageData?.macos_arm64), + }, + ], + }, + ], + [pageData], + ); + + const linuxMenu: MenuItemsGroup[] = useMemo(() => { + const res: MenuItemsGroup[] = [ + { + items: [ + { + icon: 'ubuntu', + text: 'Ubuntu 24.04 ARM', + onClick: () => openClientLink(pageData?.deb_arm64), + }, + { + icon: 'ubuntu', + text: 'Ubuntu 24.04 AMD64', + onClick: () => openClientLink(pageData?.deb_amd64), + }, + ], + }, + { + items: [ + { + icon: 'debian', + text: 'Ubuntu 22.04 / Debian 12&13 ARM', + onClick: () => openClientLink(pageData?.deb_legacy_arm64), + }, + { + icon: 'debian', + text: 'Ubuntu 22.04 / Debian 12&13 AMD64', + onClick: () => openClientLink(pageData?.deb_legacy_amd64), + }, + ], + }, + { + items: [ + { + icon: 'linux', + text: 'RPM ARM', + onClick: () => openClientLink(pageData?.rpm_arm64), + }, + { + icon: 'linux', + text: 'RPM AMD64', + onClick: () => openClientLink(pageData?.rpm_amd64), + }, + ], + }, + { + items: [ + { + icon: 'arch-linux', + text: 'Arch Linux', + onClick: () => openClientLink(externalLink.client.desktop.linux.arch), + }, + ], + }, + ]; + return res; + }, [pageData]); + + return ( + + +
+

{m.client_download_title()}

+

{m.client_download_subtitle()}

+
+ +
+
+

{m.client_download_label_desktop()}

+
+ + + +
+ + {enrollmentState.enrollmentData.user.enrolled && ( +
+
+

{m.client_download_label_mobile()}

+
+ + +
+ )} + {!enrollmentState.enrollmentData.user.enrolled && ( + + )} + { + setAppleHelpModalOpen(false); + }} + /> + { + setConfirmModalOpen(false); + } + : undefined + } + > +

{m.client_download_modal_content()}

+ setConfirmModalOpen(false), + disabled: routerLoading, + }} + submitProps={{ + text: m.controls_continue(), + testId: 'modal-confirm-download-submit', + loading: routerLoading, + onClick: () => { + navigate({ + to: '/client-setup', + replace: true, + }); + }, + }} + /> +
+ { + setConfirmModalOpen(true); + }} + /> +
+ ); +}; + +const Platform = ({ + buttonIconKind, + buttonText, + icon, + subtitle, + title, + testId, + menuItems, + directLink, +}: { + icon: string; + title: string; + subtitle: string; + buttonText: string; + buttonIconKind: IconKindValue; + testId: string; + directLink?: string; + menuItems?: MenuItemsGroup[]; +}) => { + return ( +
+ +
+

{title}

+

{subtitle}

+
+ {isPresent(directLink) && ( + +
+ ); +}; diff --git a/web/src/pages/ClientDownload/assets/android.png b/web/src/pages/ClientDownload/assets/android.png new file mode 100644 index 0000000..5e29acf Binary files /dev/null and b/web/src/pages/ClientDownload/assets/android.png differ diff --git a/web/src/pages/ClientDownload/assets/ios.png b/web/src/pages/ClientDownload/assets/ios.png new file mode 100644 index 0000000..ab63bd0 Binary files /dev/null and b/web/src/pages/ClientDownload/assets/ios.png differ diff --git a/web/src/pages/ClientDownload/assets/laptop.png b/web/src/pages/ClientDownload/assets/laptop.png new file mode 100644 index 0000000..0831ff8 Binary files /dev/null and b/web/src/pages/ClientDownload/assets/laptop.png differ diff --git a/web/src/pages/ClientDownload/assets/linux.png b/web/src/pages/ClientDownload/assets/linux.png new file mode 100644 index 0000000..e0745f7 Binary files /dev/null and b/web/src/pages/ClientDownload/assets/linux.png differ diff --git a/web/src/pages/ClientDownload/assets/pc-tower.png b/web/src/pages/ClientDownload/assets/pc-tower.png new file mode 100644 index 0000000..1d02efe Binary files /dev/null and b/web/src/pages/ClientDownload/assets/pc-tower.png differ diff --git a/web/src/pages/ClientDownload/style.scss b/web/src/pages/ClientDownload/style.scss new file mode 100644 index 0000000..d42321c --- /dev/null +++ b/web/src/pages/ClientDownload/style.scss @@ -0,0 +1,59 @@ +#client-download-page .page-content { + .platforms { + width: 100%; + display: flex; + flex-flow: column; + row-gap: var(--spacing-md); + flex: none; + + & > .label { + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: flex-start; + column-gap: var(--spacing-sm); + + p { + font: var(--t-body-sm-400); + color: var(--fg-muted); + } + } + + .platform { + width: 100%; + box-sizing: border-box; + border: 1px solid var(--border-default); + border-radius: var(--radius-lg); + display: grid; + grid-template-columns: 60px 1fr auto; + grid-template-rows: 1fr; + column-gap: var(--spacing-xl); + align-items: center; + padding: var(--spacing-md); + + & > img { + width: 60px; + height: 60px; + user-select: none; + } + + .btn { + min-width: 212px; + } + + & > .description { + p { + &:nth-child(1) { + font: var(--t-body-primary-600); + padding-bottom: var(--spacing-xs); + } + + &:nth-child(2) { + font: var(--t-body-sm-400); + color: var(--fg-neutral); + } + } + } + } + } +} diff --git a/web/src/pages/Home/HomePage.tsx b/web/src/pages/Home/HomePage.tsx new file mode 100644 index 0000000..e65f50b --- /dev/null +++ b/web/src/pages/Home/HomePage.tsx @@ -0,0 +1,30 @@ +import './style.scss'; + +import { m } from '../../paraglide/messages'; +import { Page } from '../../shared/components/Page/Page'; +import { SizedBox } from '../../shared/defguard-ui/components/SizedBox/SizedBox'; +import { ThemeSpacing } from '../../shared/defguard-ui/types'; +import { HomeChoice } from './components/HomeChoice'; + +const currentYear = new Date().getFullYear(); + +export const HomePage = () => { + return ( + +

{m.start_multi_title()}

+ +

{m.start_multi_subtitle()}

+ + +
+

+ Copyright ©2023-{currentYear.toString()} + + Defguard + + Sp. z o.o. +

+
+
+ ); +}; diff --git a/web/src/pages/Home/components/HomeChoice.tsx b/web/src/pages/Home/components/HomeChoice.tsx new file mode 100644 index 0000000..f1823dc --- /dev/null +++ b/web/src/pages/Home/components/HomeChoice.tsx @@ -0,0 +1,96 @@ +import './style.scss'; + +import { Link } from '@tanstack/react-router'; +import clsx from 'clsx'; +import { m } from '../../../paraglide/messages'; +import { Button } from '../../../shared/defguard-ui/components/Button/Button'; +import type { IconKindValue } from '../../../shared/defguard-ui/components/Icon/icon-types'; +import { SizedBox } from '../../../shared/defguard-ui/components/SizedBox/SizedBox'; +import { ThemeSpacing } from '../../../shared/defguard-ui/types'; +import enrollDefaultImage from './assets/enroll-default.png'; +import enrollHoverImage from './assets/enroll-hover.png'; +import passwordDefaultImage from './assets/password-default.png'; +import passwordHoverImage from './assets/password-hover.png'; + +export const HomeChoice = () => { + return ( +
+ {}} + /> + {}} + /> +
+ ); +}; + +type CardProps = { + img: 'enroll' | 'password'; + link: '/password' | '/enrollment-start'; + buttonIcon: IconKindValue; + buttonText: string; + subtitle: string; + title: string; + card?: boolean; + testId?: string; + onClick: () => void; +}; + +const Card = ({ + buttonIcon, + buttonText, + subtitle, + title, + link, + img, + testId, + onClick, +}: CardProps) => { + return ( +
+
+ {img === 'enroll' && ( + <> + + + + )} + {img === 'password' && ( + <> + + + + )} +
+ +

{title}

+ +

{subtitle}

+ + +
+ ); +}; diff --git a/web/src/pages/Home/components/assets/enroll-default.png b/web/src/pages/Home/components/assets/enroll-default.png new file mode 100644 index 0000000..5991582 Binary files /dev/null and b/web/src/pages/Home/components/assets/enroll-default.png differ diff --git a/web/src/pages/Home/components/assets/enroll-hover.png b/web/src/pages/Home/components/assets/enroll-hover.png new file mode 100644 index 0000000..5d61d66 Binary files /dev/null and b/web/src/pages/Home/components/assets/enroll-hover.png differ diff --git a/web/src/pages/Home/components/assets/password-default.png b/web/src/pages/Home/components/assets/password-default.png new file mode 100644 index 0000000..143c547 Binary files /dev/null and b/web/src/pages/Home/components/assets/password-default.png differ diff --git a/web/src/pages/Home/components/assets/password-hover.png b/web/src/pages/Home/components/assets/password-hover.png new file mode 100644 index 0000000..1f335d1 Binary files /dev/null and b/web/src/pages/Home/components/assets/password-hover.png differ diff --git a/web/src/pages/Home/components/style.scss b/web/src/pages/Home/components/style.scss new file mode 100644 index 0000000..57047b4 --- /dev/null +++ b/web/src/pages/Home/components/style.scss @@ -0,0 +1,74 @@ +#home-choice { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr; + gap: var(--spacing-4xl); + + @include break-up(md) { + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + } + + & > .choice { + --border-color: var(--border-default); + + box-sizing: border-box; + padding: var(--spacing-3xl); + border-radius: var(--radius-xl); + border: 1px solid var(--border-color); + transition-timing-function: ease-out; + transition-duration: 400ms; + transition-property: border-color; + + @include break-down(md) { + max-width: 390px; + } + + .title { + color: var(--fg-faded); + font: var(--t-title-h3); + } + + .subtitle { + color: var(--fg-muted); + font: var(--t-body-primary-400); + } + + .image { + width: 100%; + max-width: 100%; + overflow: hidden; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr; + user-select: none; + + img { + width: 100%; + height: unset; + grid-column: 1 / 2; + grid-row: 1; + opacity: 1; + transition-timing-function: ease-out; + transition-duration: 400ms; + transition-property: opacity; + + &:nth-child(2) { + opacity: 0; + } + } + } + + &:hover { + --border-color: var(--border-action); + + .image { + img { + &:nth-child(2) { + opacity: 1; + } + } + } + } + } +} diff --git a/web/src/pages/Home/style.scss b/web/src/pages/Home/style.scss new file mode 100644 index 0000000..9da433a --- /dev/null +++ b/web/src/pages/Home/style.scss @@ -0,0 +1,37 @@ +#home-page { + .page-content { + display: flex; + flex-flow: column; + align-items: center; + max-width: 100%; + overflow-x: hidden; + + h1 { + font-size: 52px; + font-weight: 500; + line-height: 44px; + text-align: center; + } + + & > .subtitle { + font: var(--t-body-primary-400); + text-align: center; + color: var(--fg-muted); + } + + & > footer { + margin-top: auto; + + p { + text-align: center; + font: var(--t-body-xs-400); + color: var(--fg-muted); + + span, + a { + color: inherit; + } + } + } + } +} diff --git a/web/src/pages/PasswordForm/PasswordFormPage.tsx b/web/src/pages/PasswordForm/PasswordFormPage.tsx new file mode 100644 index 0000000..f42c388 --- /dev/null +++ b/web/src/pages/PasswordForm/PasswordFormPage.tsx @@ -0,0 +1,277 @@ +import z from 'zod'; +import { m } from '../../paraglide/messages'; +import { Container } from '../../shared/components/Container/Container'; +import { Page } from '../../shared/components/Page/Page'; +import './style.scss'; +import { revalidateLogic, useStore } from '@tanstack/react-form'; +import { useMutation } from '@tanstack/react-query'; +import { useNavigate, useSearch } from '@tanstack/react-router'; +import clsx from 'clsx'; +import { useCallback } from 'react'; +import { api } from '../../shared/api/api'; +import { Button } from '../../shared/defguard-ui/components/Button/Button'; +import { Icon } from '../../shared/defguard-ui/components/Icon'; +import type { IconKindValue } from '../../shared/defguard-ui/components/Icon/icon-types'; +import { SizedBox } from '../../shared/defguard-ui/components/SizedBox/SizedBox'; +import { useAppForm, withForm } from '../../shared/defguard-ui/form'; +import { ThemeSpacing } from '../../shared/defguard-ui/types'; + +const PasswordErrorCode = { + Number: 'password_form_check_number', + Special: 'password_form_check_special', + Lowercase: 'password_form_check_lowercase', + Uppercase: 'password_form_check_uppercase', + Minimum: 'password_form_check_minimum', +} as const; + +const errorCodes = Object.values(PasswordErrorCode); + +type PasswordErrorCodeValue = (typeof PasswordErrorCode)[keyof typeof PasswordErrorCode]; + +const errorIsCustomCode = (value: string): value is PasswordErrorCodeValue => { + return (errorCodes as readonly string[]).includes(value); +}; + +const mapPasswordFieldError = (errorValue: string): string => { + if (errorIsCustomCode(errorValue)) { + return m.password_form_special_error(); + } + return errorValue; +}; + +const hasNumber = /[0-9]/; + +const hasUppercase = /[A-Z]/; + +const hasLowercase = /[a-z]/; + +const hasSpecialChar = /[^a-zA-Z0-9]/; + +const formSchema = z + .object({ + password: z.string().trim().min(1, m.form_error_required()), + repeat: z.string().trim().min(1, m.form_error_required()), + }) + .superRefine(({ password, repeat }, ctx) => { + if (password.length < 8) { + ctx.addIssue({ + message: PasswordErrorCode.Minimum, + code: 'custom', + path: ['password'], + continue: true, + }); + } + if (!hasNumber.test(password)) { + ctx.addIssue({ + message: PasswordErrorCode.Number, + code: 'custom', + path: ['password'], + continue: true, + }); + } + if (!hasUppercase.test(password)) { + ctx.addIssue({ + message: PasswordErrorCode.Uppercase, + code: 'custom', + path: ['password'], + continue: true, + }); + } + if (!hasLowercase.test(password)) { + ctx.addIssue({ + message: PasswordErrorCode.Lowercase, + code: 'custom', + continue: true, + path: ['password'], + }); + } + if (!hasSpecialChar.test(password)) { + ctx.addIssue({ + message: PasswordErrorCode.Special, + code: 'custom', + continue: true, + path: ['password'], + }); + } + if (repeat.length && repeat !== password) { + ctx.addIssue({ + message: m.password_form_check_repeat_match(), + code: 'custom', + path: ['repeat'], + continue: true, + }); + } + }); + +type FormFields = z.infer; + +const defaultFormValues: FormFields = { + password: '', + repeat: '', +}; + +export const PasswordFormPage = () => { + const { token } = useSearch({ + from: '/password-reset', + }); + + const navigate = useNavigate(); + + const { mutateAsync } = useMutation({ + mutationFn: api.password.finish.callbackFn, + onError: (e) => { + console.error(e); + }, + }); + + const form = useAppForm({ + defaultValues: defaultFormValues, + validationLogic: revalidateLogic({ + mode: 'change', + modeAfterSubmission: 'change', + }), + validators: { + onDynamic: formSchema, + }, + onSubmit: async ({ value }) => { + await mutateAsync({ + data: { + password: value.password, + token, + }, + }); + navigate({ + to: '/password/finish', + replace: true, + }); + }, + }); + + return ( + +
+

{m.password_form_title()}

+

{m.password_form_subtitle()}

+
+ + +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + + + {(field) => ( + + )} + + + {(field) => ( + + )} + + + + + {pageData.enrollmentData.user.enrolled && ( + <> + + +
+
{m.client_setup_mobile_title()}
+

{m.client_setup_mobile_subtitle()}

+
+
+
+ +
+
+

{m.client_setup_mobile_forgot()}

+ +
+
+
+ + )} +
+

{m.client_setup_footer_extra()}

+ +
+ { + setAppleHelpModalOpen(false); + }} + /> +
+ ); +}; diff --git a/web/src/pages/enrollment/ConfigureClient/style.scss b/web/src/pages/enrollment/ConfigureClient/style.scss new file mode 100644 index 0000000..a9dcff7 --- /dev/null +++ b/web/src/pages/enrollment/ConfigureClient/style.scss @@ -0,0 +1,142 @@ +/* stylelint-disable no-descending-specificity */ +#configure-client-page .page-content { + .container-with-icon { + width: 100%; + + header { + padding-bottom: var(--spacing-2xl); + } + } + + footer { + margin-top: auto; + + p { + text-align: center; + } + + .finish { + color: var(--fg-success); + padding-bottom: var(--spacing-sm); + font: var(--t-body-xs-500); + } + } +} + +#configure-client-page #setup-desktop { + .buttons { + display: flex; + flex-flow: row wrap; + align-items: center; + justify-content: space-between; + gap: var(--spacing-lg); + + & > .download { + display: flex; + flex-flow: row; + align-items: center; + justify-content: flex-end; + column-gap: var(--spacing-md); + + & > p { + font: var(--t-body-xs-400); + color: var(--fg-muted); + } + } + } + + .divider { + padding: var(--spacing-xl) 0; + } + + .fold-button { + display: grid; + grid-template-columns: 20px auto; + grid-template-rows: 1fr; + column-gap: var(--spacing-sm); + align-items: center; + background-color: transparent; + border: none; + cursor: pointer; + padding: 0; + margin: 0; + + svg path { + fill: var(--fg-action); + } + + & > span { + font: var(--t-body-sm-400); + color: var(--fg-action); + } + } + + header { + h5 { + padding-bottom: var(--spacing-xl); + } + + p { + &:nth-child(2) { + font: var(--t-body-sm-600); + color: var(--fg-faded); + } + + &:nth-child(3) { + font: var(--t-body-sm-400); + color: var(--fg-neutral); + + span { + color: var(--fg-attention); + } + } + } + } + + .manual { + & > p { + &:nth-child(1) { + font: var(--t-body-sm-600); + color: var(--fg-faded); + } + + &:nth-child(2) { + font: var(--t-body-sm-400); + color: var(--fg-neutral); + } + } + } +} + +#configure-client-page #setup-mobile { + header { + p { + font: var(--t-body-sm-400); + color: var(--fg-neutral); + } + } + + .bottom { + display: grid; + grid-template-columns: 100px 1fr; + grid-template-rows: 1fr; + align-items: center; + column-gap: var(--spacing-4xl); + } + + .download { + & > p { + font: var(--t-body-xs-500); + color: var(--fg-muted); + padding-bottom: var(--spacing-lg); + } + + .links { + display: flex; + flex-flow: row; + align-items: center; + justify-content: flex-start; + column-gap: var(--spacing-md); + } + } +} diff --git a/web/src/pages/enrollment/EnrollmentPage.tsx b/web/src/pages/enrollment/EnrollmentPage.tsx deleted file mode 100644 index 0309d78..0000000 --- a/web/src/pages/enrollment/EnrollmentPage.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import './style.scss'; - -import dayjs from 'dayjs'; -import { type ReactNode, useEffect, useRef } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { useBreakpoint } from 'use-breakpoint'; -import { shallow } from 'zustand/shallow'; - -import { LogoContainer } from '../../components/LogoContainer/LogoContainer'; -import { useI18nContext } from '../../i18n/i18n-react'; -import { ArrowSingle } from '../../shared/components/icons/ArrowSingle/ArrowSingle'; -import { - ArrowSingleDirection, - ArrowSingleSize, -} from '../../shared/components/icons/ArrowSingle/types'; -import { Button } from '../../shared/components/layout/Button/Button'; -import { - ButtonSize, - ButtonStyleVariant, -} from '../../shared/components/layout/Button/types'; -import { PageContainer } from '../../shared/components/layout/PageContainer/PageContainer'; -import { deviceBreakpoints } from '../../shared/constants'; -import { routes } from '../../shared/routes'; -import { EnrollmentSideBar } from './components/EnrollmentSideBar/EnrollmentSideBar'; -import { EnrollmentStepControls } from './components/EnrollmentStepControls/EnrollmentStepControls'; -import { useEnrollmentStore } from './hooks/store/useEnrollmentStore'; -import { DataVerificationStep } from './steps/DataVerificationStep/DataVerificationStep'; -import { DeviceStep } from './steps/DeviceStep/DeviceStep'; -import { FinishStep } from './steps/FinishStep/FinishStep'; -import { PasswordStep } from './steps/PasswordStep/PasswordStep'; -import { WelcomeStep } from './steps/WelcomeStep/WelcomeStep'; - -export const EnrollmentPage = () => { - const enrollmentFinished = useRef(false); - const navigate = useNavigate(); - const { LL } = useI18nContext(); - const { breakpoint } = useBreakpoint(deviceBreakpoints); - const sessionEnd = useEnrollmentStore((state) => state.sessionEnd); - const currentStep = useEnrollmentStore((state) => state.step); - const stepsMax = useEnrollmentStore((state) => state.stepsMax); - const loading = useEnrollmentStore((state) => state.loading); - - const [setEnrollmentState, back, _reset, nextSubject] = useEnrollmentStore( - (state) => [state.setState, state.perviousStep, state.reset, state.nextSubject], - shallow, - ); - - const controlsSize: ButtonSize = - breakpoint !== 'desktop' ? ButtonSize.SMALL : ButtonSize.LARGE; - - // ensure number of steps is correct - useEffect(() => { - if (stepsMax !== steps.length - 1) { - setEnrollmentState({ stepsMax: steps.length - 1 }); - } - }, [setEnrollmentState, stepsMax]); - - useEffect(() => { - if (!enrollmentFinished.current) { - if (sessionEnd) { - const endDay = dayjs(sessionEnd); - const diff = endDay.diff(dayjs(), 'millisecond'); - if (diff > 0) { - const timeout = setTimeout(() => { - if (!enrollmentFinished.current) { - navigate(routes.timeout, { replace: true }); - } - }, diff); - return () => { - clearTimeout(timeout); - }; - } else { - navigate(routes.timeout, { replace: true }); - } - } else { - navigate(routes.timeout, { replace: true }); - } - } - }, [sessionEnd, navigate]); - - useEffect(() => { - enrollmentFinished.current = stepsMax === currentStep; - }, [stepsMax, currentStep]); - - return ( - - - - {currentStep !== stepsMax && ( - - - ); -}; - -const CustomButton = ({ url, display_name }: { url: string; display_name?: string }) => { - const { LL } = useI18nContext(); - return ( - - ); -}; diff --git a/web/src/pages/token/components/TokenCard.tsx b/web/src/pages/token/components/TokenCard.tsx deleted file mode 100644 index 7f074c3..0000000 --- a/web/src/pages/token/components/TokenCard.tsx +++ /dev/null @@ -1,180 +0,0 @@ -import './style.scss'; - -import { zodResolver } from '@hookform/resolvers/zod'; -import { useMutation, useQuery } from '@tanstack/react-query'; -import dayjs from 'dayjs'; -import { useMemo } from 'react'; -import { type SubmitHandler, useForm } from 'react-hook-form'; -import { useNavigate } from 'react-router-dom'; -import { useBreakpoint } from 'use-breakpoint'; -import { z } from 'zod'; - -import { useI18nContext } from '../../../i18n/i18n-react'; -import { FormInput } from '../../../shared/components/Form/FormInput/FormInput'; -import { ArrowSingle } from '../../../shared/components/icons/ArrowSingle/ArrowSingle'; -import { - ArrowSingleDirection, - ArrowSingleSize, -} from '../../../shared/components/icons/ArrowSingle/types'; -import { BigInfoBox } from '../../../shared/components/layout/BigInfoBox/BigInfoBox'; -import { Button } from '../../../shared/components/layout/Button/Button'; -import { - ButtonSize, - ButtonStyleVariant, -} from '../../../shared/components/layout/Button/types'; -import { Card } from '../../../shared/components/layout/Card/Card'; -import { LoaderSpinner } from '../../../shared/components/layout/LoaderSpinner/LoaderSpinner'; -import { deviceBreakpoints } from '../../../shared/constants'; -import { useApi } from '../../../shared/hooks/api/useApi'; -import { routes } from '../../../shared/routes'; -import { useEnrollmentStore } from '../../enrollment/hooks/store/useEnrollmentStore'; -import { OpenIdLoginButton } from './OIDCButtons'; - -type FormFields = { - token: string; -}; - -export const TokenCard = () => { - const navigate = useNavigate(); - const { - enrollment: { start: startEnrollment }, - getOpenIDAuthInfo, - } = useApi(); - const { breakpoint } = useBreakpoint(deviceBreakpoints); - const { LL } = useI18nContext(); - const initEnrollment = useEnrollmentStore((state) => state.init); - const schema = useMemo( - () => - z - .object({ - token: z - .string() - .trim() - .min(1, LL.pages.token.card.form.errors.token.required()), - }) - .required(), - [LL.pages.token.card.form.errors.token], - ); - - const { control, handleSubmit, setError } = useForm({ - mode: 'all', - defaultValues: { - token: '', - }, - resolver: zodResolver(schema), - }); - - const { isLoading: openidLoading, data: openidData } = useQuery( - [], - () => - getOpenIDAuthInfo({ - type: 'enrollment', - }), - { - refetchOnMount: true, - refetchOnWindowFocus: false, - }, - ); - - const { isLoading, mutate } = useMutation({ - mutationFn: startEnrollment, - onSuccess: (res) => { - const sessionEnd = dayjs.unix(res.deadline_timestamp).utc().local().format(); - const sessionStart = dayjs().local().format(); - initEnrollment({ - step: 0, - userInfo: res.user, - adminInfo: res.admin, - sessionStart, - sessionEnd, - enrollmentSettings: res.settings, - endContent: res.final_page_content, - }); - navigate(routes.enrollment, { replace: true }); - }, - onError: (err) => { - setError( - 'token', - { - message: LL.form.errors.invalid(), - }, - { - shouldFocus: true, - }, - ); - console.error(err); - }, - }); - - const handleValidSubmit: SubmitHandler = (values) => { - if (!isLoading) { - mutate({ - token: values.token, - }); - } - }; - - if (openidLoading) { - return ( -
- -
- ); - } - - return ( - -

{LL.pages.token.card.title()}

- -
- - - {openidData?.url && ( - <> -

{LL.pages.token.card.oidc.title()}

- -
- -
- - )} -
-
-
- ); -}; diff --git a/web/src/pages/token/components/style.scss b/web/src/pages/token/components/style.scss deleted file mode 100644 index 28c665e..0000000 --- a/web/src/pages/token/components/style.scss +++ /dev/null @@ -1,157 +0,0 @@ -#token-page { - .token-card { - box-sizing: border-box; - padding: 50px 40px; - width: 100%; - - & > h2 { - @include typography(app-body-1); - - color: var(--text-body-primary); - margin-bottom: 15px; - text-align: left; - } - - & > form { - margin-top: 40px; - } - } - - .loader-container { - min-height: 300px; - display: flex; - justify-content: center; - align-items: center; - } - - .openid-button { - display: flex; - justify-content: center; - padding: 50px 0; - } - - .openid-heading { - margin-top: 20px; - } -} - -.gsi-material-button { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - -webkit-appearance: none; - background-color: WHITE; - background-image: none; - border: 1px solid #747775; - -webkit-border-radius: 4px; - border-radius: 4px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: #1f1f1f; - cursor: pointer; - font-family: 'Roboto', arial, sans-serif; - font-size: 14px; - letter-spacing: 0.25px; - outline: none; - overflow: hidden; - padding: 10px 30px; - position: relative; - text-align: center; - -webkit-transition: - background-color 0.218s, - border-color 0.218s, - box-shadow 0.218s; - transition: - background-color 0.218s, - border-color 0.218s, - box-shadow 0.218s; - vertical-align: middle; - white-space: nowrap; - width: auto; - max-width: 400px; - min-width: min-content; -} - -.gsi-material-button .gsi-material-button-icon { - height: 20px; - margin-right: 12px; - min-width: 20px; - width: 20px; -} - -.gsi-material-button .gsi-material-button-content-wrapper { - -webkit-align-items: center; - align-items: center; - display: flex; - -webkit-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - flex-wrap: nowrap; - height: 100%; - justify-content: space-between; - position: relative; - width: 100%; -} - -.gsi-material-button .gsi-material-button-contents { - -webkit-flex-grow: 1; - flex-grow: 1; - font-family: 'Roboto', arial, sans-serif; - font-weight: 500; - overflow: hidden; - text-overflow: ellipsis; - vertical-align: top; -} - -.gsi-material-button .gsi-material-button-state { - -webkit-transition: opacity 0.218s; - transition: opacity 0.218s; - bottom: 0; - left: 0; - opacity: 0; - position: absolute; - right: 0; - top: 0; -} - -.gsi-material-button:disabled { - cursor: default; - background-color: #ffffff61; - border-color: #1f1f1f1f; -} - -.gsi-material-button:disabled .gsi-material-button-contents { - opacity: 38%; -} - -.gsi-material-button:disabled .gsi-material-button-icon { - opacity: 38%; -} - -.gsi-material-button:not(:disabled):active .gsi-material-button-state, -.gsi-material-button:not(:disabled):focus .gsi-material-button-state { - background-color: #303030; - opacity: 12%; -} - -.gsi-material-button:not(:disabled):hover { - -webkit-box-shadow: - 0 1px 2px 0 rgba(60, 64, 67, 0.3), - 0 1px 3px 1px rgba(60, 64, 67, 0.15); - box-shadow: - 0 1px 2px 0 rgba(60, 64, 67, 0.3), - 0 1px 3px 1px rgba(60, 64, 67, 0.15); -} - -.gsi-material-button:not(:disabled):hover .gsi-material-button-state { - background-color: #303030; - opacity: 8%; -} - -.ms-button { - background-color: transparent; - border: none; - cursor: pointer; - padding: 0; - min-width: 250px; -} diff --git a/web/src/pages/token/style.scss b/web/src/pages/token/style.scss deleted file mode 100644 index b979bb8..0000000 --- a/web/src/pages/token/style.scss +++ /dev/null @@ -1,57 +0,0 @@ -#token-page { - @include media-breakpoint-up(lg) { - padding: 100px 50px; - } - - & > * { - max-width: 920px; - } - - & > .logo-container { - display: none; - margin-bottom: 30px; - - @include media-breakpoint-up(lg) { - display: flex; - margin-bottom: 100px; - } - } - - .controls { - // FIXME Add responsive :) - display: grid; - height: 60px; - grid-template-rows: 60px; - grid-template-columns: 1fr 1fr; - column-gap: 32px; - width: 100%; - box-sizing: border-box; - - &.single { - grid-template-columns: 1fr; - } - - .btn { - .arrow-single { - height: 36px; - width: 36px; - - svg { - g { - fill: var(--surface-icon-primary); - } - } - } - - &.variant-primary { - .arrow-single { - svg { - g { - fill: var(--surface-icon-secondary); - } - } - } - } - } - } -} diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts new file mode 100644 index 0000000..2dc0610 --- /dev/null +++ b/web/src/routeTree.gen.ts @@ -0,0 +1,273 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as TestRouteImport } from './routes/test' +import { Route as SessionEndRouteImport } from './routes/session-end' +import { Route as PasswordResetRouteImport } from './routes/password-reset' +import { Route as EnrollmentStartRouteImport } from './routes/enrollment-start' +import { Route as DownloadRouteImport } from './routes/download' +import { Route as ClientSetupRouteImport } from './routes/client-setup' +import { Route as IndexRouteImport } from './routes/index' +import { Route as PasswordIndexRouteImport } from './routes/password/index' +import { Route as PasswordSentRouteImport } from './routes/password/sent' +import { Route as PasswordFinishRouteImport } from './routes/password/finish' +import { Route as OpenidCallbackRouteImport } from './routes/openid/callback' + +const TestRoute = TestRouteImport.update({ + id: '/test', + path: '/test', + getParentRoute: () => rootRouteImport, +} as any) +const SessionEndRoute = SessionEndRouteImport.update({ + id: '/session-end', + path: '/session-end', + getParentRoute: () => rootRouteImport, +} as any) +const PasswordResetRoute = PasswordResetRouteImport.update({ + id: '/password-reset', + path: '/password-reset', + getParentRoute: () => rootRouteImport, +} as any) +const EnrollmentStartRoute = EnrollmentStartRouteImport.update({ + id: '/enrollment-start', + path: '/enrollment-start', + getParentRoute: () => rootRouteImport, +} as any) +const DownloadRoute = DownloadRouteImport.update({ + id: '/download', + path: '/download', + getParentRoute: () => rootRouteImport, +} as any) +const ClientSetupRoute = ClientSetupRouteImport.update({ + id: '/client-setup', + path: '/client-setup', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const PasswordIndexRoute = PasswordIndexRouteImport.update({ + id: '/password/', + path: '/password/', + getParentRoute: () => rootRouteImport, +} as any) +const PasswordSentRoute = PasswordSentRouteImport.update({ + id: '/password/sent', + path: '/password/sent', + getParentRoute: () => rootRouteImport, +} as any) +const PasswordFinishRoute = PasswordFinishRouteImport.update({ + id: '/password/finish', + path: '/password/finish', + getParentRoute: () => rootRouteImport, +} as any) +const OpenidCallbackRoute = OpenidCallbackRouteImport.update({ + id: '/openid/callback', + path: '/openid/callback', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/client-setup': typeof ClientSetupRoute + '/download': typeof DownloadRoute + '/enrollment-start': typeof EnrollmentStartRoute + '/password-reset': typeof PasswordResetRoute + '/session-end': typeof SessionEndRoute + '/test': typeof TestRoute + '/openid/callback': typeof OpenidCallbackRoute + '/password/finish': typeof PasswordFinishRoute + '/password/sent': typeof PasswordSentRoute + '/password': typeof PasswordIndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/client-setup': typeof ClientSetupRoute + '/download': typeof DownloadRoute + '/enrollment-start': typeof EnrollmentStartRoute + '/password-reset': typeof PasswordResetRoute + '/session-end': typeof SessionEndRoute + '/test': typeof TestRoute + '/openid/callback': typeof OpenidCallbackRoute + '/password/finish': typeof PasswordFinishRoute + '/password/sent': typeof PasswordSentRoute + '/password': typeof PasswordIndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/client-setup': typeof ClientSetupRoute + '/download': typeof DownloadRoute + '/enrollment-start': typeof EnrollmentStartRoute + '/password-reset': typeof PasswordResetRoute + '/session-end': typeof SessionEndRoute + '/test': typeof TestRoute + '/openid/callback': typeof OpenidCallbackRoute + '/password/finish': typeof PasswordFinishRoute + '/password/sent': typeof PasswordSentRoute + '/password/': typeof PasswordIndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/client-setup' + | '/download' + | '/enrollment-start' + | '/password-reset' + | '/session-end' + | '/test' + | '/openid/callback' + | '/password/finish' + | '/password/sent' + | '/password' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/client-setup' + | '/download' + | '/enrollment-start' + | '/password-reset' + | '/session-end' + | '/test' + | '/openid/callback' + | '/password/finish' + | '/password/sent' + | '/password' + id: + | '__root__' + | '/' + | '/client-setup' + | '/download' + | '/enrollment-start' + | '/password-reset' + | '/session-end' + | '/test' + | '/openid/callback' + | '/password/finish' + | '/password/sent' + | '/password/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ClientSetupRoute: typeof ClientSetupRoute + DownloadRoute: typeof DownloadRoute + EnrollmentStartRoute: typeof EnrollmentStartRoute + PasswordResetRoute: typeof PasswordResetRoute + SessionEndRoute: typeof SessionEndRoute + TestRoute: typeof TestRoute + OpenidCallbackRoute: typeof OpenidCallbackRoute + PasswordFinishRoute: typeof PasswordFinishRoute + PasswordSentRoute: typeof PasswordSentRoute + PasswordIndexRoute: typeof PasswordIndexRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/test': { + id: '/test' + path: '/test' + fullPath: '/test' + preLoaderRoute: typeof TestRouteImport + parentRoute: typeof rootRouteImport + } + '/session-end': { + id: '/session-end' + path: '/session-end' + fullPath: '/session-end' + preLoaderRoute: typeof SessionEndRouteImport + parentRoute: typeof rootRouteImport + } + '/password-reset': { + id: '/password-reset' + path: '/password-reset' + fullPath: '/password-reset' + preLoaderRoute: typeof PasswordResetRouteImport + parentRoute: typeof rootRouteImport + } + '/enrollment-start': { + id: '/enrollment-start' + path: '/enrollment-start' + fullPath: '/enrollment-start' + preLoaderRoute: typeof EnrollmentStartRouteImport + parentRoute: typeof rootRouteImport + } + '/download': { + id: '/download' + path: '/download' + fullPath: '/download' + preLoaderRoute: typeof DownloadRouteImport + parentRoute: typeof rootRouteImport + } + '/client-setup': { + id: '/client-setup' + path: '/client-setup' + fullPath: '/client-setup' + preLoaderRoute: typeof ClientSetupRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/password/': { + id: '/password/' + path: '/password' + fullPath: '/password' + preLoaderRoute: typeof PasswordIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/password/sent': { + id: '/password/sent' + path: '/password/sent' + fullPath: '/password/sent' + preLoaderRoute: typeof PasswordSentRouteImport + parentRoute: typeof rootRouteImport + } + '/password/finish': { + id: '/password/finish' + path: '/password/finish' + fullPath: '/password/finish' + preLoaderRoute: typeof PasswordFinishRouteImport + parentRoute: typeof rootRouteImport + } + '/openid/callback': { + id: '/openid/callback' + path: '/openid/callback' + fullPath: '/openid/callback' + preLoaderRoute: typeof OpenidCallbackRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ClientSetupRoute: ClientSetupRoute, + DownloadRoute: DownloadRoute, + EnrollmentStartRoute: EnrollmentStartRoute, + PasswordResetRoute: PasswordResetRoute, + SessionEndRoute: SessionEndRoute, + TestRoute: TestRoute, + OpenidCallbackRoute: OpenidCallbackRoute, + PasswordFinishRoute: PasswordFinishRoute, + PasswordSentRoute: PasswordSentRoute, + PasswordIndexRoute: PasswordIndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/web/src/routes/__root.tsx b/web/src/routes/__root.tsx new file mode 100644 index 0000000..11a8220 --- /dev/null +++ b/web/src/routes/__root.tsx @@ -0,0 +1,15 @@ +import { createRootRoute, Outlet } from '@tanstack/react-router'; +import { SessionGuard } from '../app/SessionGuard'; + +export const Route = createRootRoute({ + component: RootComponent, +}); + +function RootComponent() { + return ( + <> + + + + ); +} diff --git a/web/src/routes/client-setup.tsx b/web/src/routes/client-setup.tsx new file mode 100644 index 0000000..70abd21 --- /dev/null +++ b/web/src/routes/client-setup.tsx @@ -0,0 +1,28 @@ +import { createFileRoute, redirect } from '@tanstack/react-router'; +import { queryClient } from '../app/query'; +import { ConfigureClientPage } from '../pages/enrollment/ConfigureClient/ConfigureClientPage'; +import type { EnrollmentStartResponse } from '../shared/api/types'; +import { useEnrollmentStore } from '../shared/hooks/useEnrollmentStore'; +import { getClientArtifactsQueryOptions } from '../shared/query/queryOptions'; + +export const Route = createFileRoute('/client-setup')({ + component: ConfigureClientPage, + // check if required session state is present + beforeLoad: () => { + const { enrollmentData, token } = useEnrollmentStore.getState(); + if (!enrollmentData || !token) { + throw redirect({ + to: '/', + replace: true, + }); + } + }, + loader: async () => { + void queryClient.ensureQueryData(getClientArtifactsQueryOptions); + const state = useEnrollmentStore.getState(); + return { + token: state.token as string, + enrollmentData: state.enrollmentData as EnrollmentStartResponse, + }; + }, +}); diff --git a/web/src/routes/download.tsx b/web/src/routes/download.tsx new file mode 100644 index 0000000..a9f1ddf --- /dev/null +++ b/web/src/routes/download.tsx @@ -0,0 +1,28 @@ +import { createFileRoute, redirect } from '@tanstack/react-router'; +import { queryClient } from '../app/query'; +import { ClientDownloadPage } from '../pages/ClientDownload/ClientDownloadPage'; +import { useEnrollmentStore } from '../shared/hooks/useEnrollmentStore'; +import { getClientArtifactsQueryOptions } from '../shared/query/queryOptions'; + +export const Route = createFileRoute('/download')({ + component: ClientDownloadPage, + loaderDeps: () => { + const storeState = useEnrollmentStore.getState(); + if (storeState.enrollmentData === undefined || storeState.token === undefined) { + throw redirect({ + to: '/', + replace: true, + }); + } + return { + enrollmentState: { + token: storeState.token, + enrollmentData: storeState.enrollmentData, + }, + }; + }, + loader: ({ deps }) => { + void queryClient.ensureQueryData(getClientArtifactsQueryOptions); + return deps; + }, +}); diff --git a/web/src/routes/enrollment-start.tsx b/web/src/routes/enrollment-start.tsx new file mode 100644 index 0000000..b8c546f --- /dev/null +++ b/web/src/routes/enrollment-start.tsx @@ -0,0 +1,21 @@ +import { createFileRoute } from '@tanstack/react-router'; +import type { AxiosError } from 'axios'; +import { EnrollmentStartPage } from '../pages/enrollment/EnrollmentStart/EnrollmentStartPage'; +import { api } from '../shared/api/api'; + +export const Route = createFileRoute('/enrollment-start')({ + component: EnrollmentStartPage, + loader: async () => { + // workaround cuz this endpoint throws 404 when openid is not configured + const resp = await api.openId.authInfo + .callbackFn({ + data: { + type: 'enrollment', + }, + }) + .catch((e: AxiosError) => { + console.error(e); + }); + return resp?.data; + }, +}); diff --git a/web/src/routes/index.tsx b/web/src/routes/index.tsx new file mode 100644 index 0000000..58d88a4 --- /dev/null +++ b/web/src/routes/index.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { HomePage } from '../pages/Home/HomePage'; +import { useEnrollmentStore } from '../shared/hooks/useEnrollmentStore'; + +export const Route = createFileRoute('/')({ + component: HomePage, + loader: () => { + useEnrollmentStore.getState().reset(); + }, +}); diff --git a/web/src/routes/openid/callback.tsx b/web/src/routes/openid/callback.tsx new file mode 100644 index 0000000..2304ba0 --- /dev/null +++ b/web/src/routes/openid/callback.tsx @@ -0,0 +1,43 @@ +import { createFileRoute, redirect } from '@tanstack/react-router'; +import z from 'zod'; +import { api } from '../../shared/api/api'; +import { useEnrollmentStore } from '../../shared/hooks/useEnrollmentStore'; + +const schema = z.object({ + state: z.string().trim().min(1), + code: z.string().trim().min(1), +}); + +// this route exists only for redirect, this is done to maintain compatibility with old UI and retain existing links +export const Route = createFileRoute('/openid/callback')({ + component: RouteComponent, + validateSearch: schema, + loaderDeps: ({ search }) => ({ search }), + beforeLoad: async ({ search }) => { + const openIdResponse = await api.openId.enrollmentCallback.callbackFn({ + data: { + code: search.code, + state: search.state, + type: 'enrollment', + }, + }); + const enrollmentStartResponse = await api.enrollment.start.callbackFn({ + data: { + token: openIdResponse.data.token, + }, + }); + useEnrollmentStore.setState({ + enrollmentData: enrollmentStartResponse.data, + token: openIdResponse.data.token, + }); + throw redirect({ + to: '/download', + search: search, + replace: true, + }); + }, +}); + +function RouteComponent() { + return null; +} diff --git a/web/src/routes/password-reset.tsx b/web/src/routes/password-reset.tsx new file mode 100644 index 0000000..3400ead --- /dev/null +++ b/web/src/routes/password-reset.tsx @@ -0,0 +1,30 @@ +import { createFileRoute, redirect } from '@tanstack/react-router'; +import z from 'zod'; +import { PasswordFormPage } from '../pages/PasswordForm/PasswordFormPage'; +import { api } from '../shared/api/api'; + +const searchParamsSchema = z.object({ + token: z.string().min(1, 'token is required'), +}); + +export const Route = createFileRoute('/password-reset')({ + component: PasswordFormPage, + validateSearch: searchParamsSchema, + loaderDeps: ({ search }) => ({ token: search.token }), + loader: async ({ deps: { token } }) => { + const resp = await api.password.start + .callbackFn({ + data: { + token, + }, + }) + .catch((e) => { + console.error(e); + throw redirect({ + to: '/', + replace: true, + }); + }); + return resp.data; + }, +}); diff --git a/web/src/routes/password/finish.tsx b/web/src/routes/password/finish.tsx new file mode 100644 index 0000000..7d86ccb --- /dev/null +++ b/web/src/routes/password/finish.tsx @@ -0,0 +1,18 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { m } from '../../paraglide/messages'; +import { PageProcessEnd } from '../../shared/components/PageProcessEnd/PageProcessEnd'; + +const RouteComponent = () => { + return ( + + ); +}; + +export const Route = createFileRoute('/password/finish')({ + component: RouteComponent, +}); diff --git a/web/src/routes/password/index.tsx b/web/src/routes/password/index.tsx new file mode 100644 index 0000000..1dc0755 --- /dev/null +++ b/web/src/routes/password/index.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { PasswordStartPage } from '../../pages/PasswordStart/PasswordStartPage'; + +export const Route = createFileRoute('/password/')({ + component: PasswordStartPage, +}); diff --git a/web/src/routes/password/sent.tsx b/web/src/routes/password/sent.tsx new file mode 100644 index 0000000..646469a --- /dev/null +++ b/web/src/routes/password/sent.tsx @@ -0,0 +1,18 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { m } from '../../paraglide/messages'; +import { PageProcessEnd } from '../../shared/components/PageProcessEnd/PageProcessEnd'; + +export const Route = createFileRoute('/password/sent')({ + component: RouteComponent, +}); + +function RouteComponent() { + return ( + + ); +} diff --git a/web/src/routes/session-end.tsx b/web/src/routes/session-end.tsx new file mode 100644 index 0000000..56612c2 --- /dev/null +++ b/web/src/routes/session-end.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { SessionEndPage } from '../pages/SessionEnd/SessionEndPage'; +import { useEnrollmentStore } from '../shared/hooks/useEnrollmentStore'; + +export const Route = createFileRoute('/session-end')({ + component: SessionEndPage, + loader: () => { + useEnrollmentStore.getState().reset(); + }, +}); diff --git a/web/src/routes/test.tsx b/web/src/routes/test.tsx new file mode 100644 index 0000000..95de9fd --- /dev/null +++ b/web/src/routes/test.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { TestPage } from '../test_components/page/TestPage'; + +export const Route = createFileRoute('/test')({ + component: TestPage, +}); diff --git a/web/src/shared/api/api-client.ts b/web/src/shared/api/api-client.ts new file mode 100644 index 0000000..a1ecb2e --- /dev/null +++ b/web/src/shared/api/api-client.ts @@ -0,0 +1,191 @@ +/** biome-ignore-all lint/suspicious/noExplicitAny: too generic to bother typing this strictly */ +/** biome-ignore-all lint/suspicious/noConfusingVoidType: same */ +/** biome-ignore-all lint/complexity/noBannedTypes: same */ +import type { QueryKey } from '@tanstack/react-query'; +import axios from 'axios'; +import qs from 'qs'; + +const client = axios.create({ + baseURL: '/api/v1', + headers: { 'Content-Type': 'application/json' }, + paramsSerializer: { + serialize: (params) => + qs.stringify(params, { + arrayFormat: 'repeat', + }), + }, +}); + +type ApiResponse = { + data: T; + status: number; + invalidateKeys?: QueryKey[]; +}; + +const RequestMethod = { + Get: 'get', + Post: 'post', + Patch: 'patch', + Delete: 'delete', +} as const; + +type RequestMethodValue = (typeof RequestMethod)[keyof typeof RequestMethod]; + +type UrlLike = string | ((path: Path) => string); +type PathFromUrl = U extends (path: infer P) => string ? P : never; + +type PathProp = [Path] extends [never] ? { path?: never } : { path: Path }; + +type ParamsProp

= [P] extends [never] + ? { params?: never } + : [P] extends [void] + ? { params?: undefined } + : { params: P }; + +type GetDeleteProps = PathProp & + ParamsProp & { + data?: never; + abortSignal?: AbortSignal; + }; + +type PostPatchProps = PathProp & { + data: Body; +} & ParamsProp & { + abortSignal?: AbortSignal; + }; + +type RequestHandle = { + callbackFn: Fn; + invalidateKeys?: QueryKey[]; +}; + +type Cfg> = { + method: M; + url: U; + invalidateKeys?: QueryKey[]; +}; + +function createRequest, Params = void, Res = unknown>( + cfg: Cfg | Cfg, +): RequestHandle< + (props: GetDeleteProps>) => Promise> +>; + +function createRequest< + U extends UrlLike, + Body = unknown, + Res = unknown, + Params = never, +>( + cfg: Cfg | Cfg, +): RequestHandle< + (props: PostPatchProps>) => Promise> +>; + +function createRequest( + cfg: Cfg>, +): RequestHandle<(props: any) => Promise>> { + const callbackFn = async (props: any = {}): Promise> => { + const { abortSignal, path, ...rest } = props ?? {}; + const method = cfg.method; + + if ((method === 'get' || method === 'delete') && 'data' in rest) { + throw new Error(`[${method.toUpperCase()}] must not include 'data'.`); + } + if ((method === 'post' || method === 'patch') && !('data' in rest)) { + throw new Error(`[${method.toUpperCase()}] requires 'data'.`); + } + + const finalUrl = + typeof cfg.url === 'function' + ? (cfg.url as (p: any) => string)(path) + : (cfg.url as string); + + const axiosRes = await client.request({ + url: finalUrl, + method, + ...(rest.params !== undefined ? { params: rest.params } : {}), + ...(rest.data !== undefined ? { data: rest.data } : {}), + signal: abortSignal, + }); + + return { + data: axiosRes.data, + status: axiosRes.status, + invalidateKeys: cfg.invalidateKeys, + }; + }; + + return { callbackFn, invalidateKeys: cfg.invalidateKeys }; +} + +type HelperOpts = { invalidateKeys?: QueryKey[] }; + +export function get( + url: string, + opts?: HelperOpts, +): RequestHandle<(props: GetDeleteProps) => Promise>>; +export function get( + url: (path: P) => string, + opts?: HelperOpts, +): RequestHandle<(props: GetDeleteProps) => Promise>>; +// implementation signature must be compatible with both overloads: +export function get(url: UrlLike, opts?: HelperOpts) { + return createRequest({ + method: RequestMethod.Get, + url: url as UrlLike, + invalidateKeys: opts?.invalidateKeys, + }) as any; +} + +export function del( + url: string, + opts?: HelperOpts, +): RequestHandle<(props: GetDeleteProps) => Promise>>; +export function del( + url: (path: P) => string, + opts?: HelperOpts, +): RequestHandle<(props: GetDeleteProps) => Promise>>; +export function del(url: UrlLike, opts?: HelperOpts) { + return createRequest({ + method: RequestMethod.Delete, + url: url as UrlLike, + invalidateKeys: opts?.invalidateKeys, + }) as any; +} + +export function post( + url: string, + opts?: HelperOpts, +): RequestHandle< + (props: PostPatchProps) => Promise> +>; +export function post( + url: (path: P) => string, + opts?: HelperOpts, +): RequestHandle<(props: PostPatchProps) => Promise>>; +export function post(url: UrlLike, opts?: HelperOpts) { + return createRequest({ + method: RequestMethod.Post, + url: url as UrlLike, + invalidateKeys: opts?.invalidateKeys, + }) as any; +} + +export function patch( + url: string, + opts?: HelperOpts, +): RequestHandle< + (props: PostPatchProps) => Promise> +>; +export function patch( + url: (path: P) => string, + opts?: HelperOpts, +): RequestHandle<(props: PostPatchProps) => Promise>>; +export function patch(url: UrlLike, opts?: HelperOpts) { + return createRequest({ + method: RequestMethod.Patch, + url: url as UrlLike, + invalidateKeys: opts?.invalidateKeys, + }) as any; +} diff --git a/web/src/shared/api/api.ts b/web/src/shared/api/api.ts new file mode 100644 index 0000000..58d3d33 --- /dev/null +++ b/web/src/shared/api/api.ts @@ -0,0 +1,38 @@ +import { get, post } from './api-client'; +import type { + AppInfo, + EmptyApiResponse, + EnrollmentStartResponse, + OpenIdAuthInfoRequest, + OpenIdAuthInfoResponse, + OpenIdCallbackRequest, + OpenIdCallbackResponse, + OpenIdMfaCallbackRequest, + PasswordResetFinishRequest, + PasswordResetStartRequest, + PasswordResetStartResponse, + TokenRequest, +} from './types'; + +const api = { + appInfo: get('/info'), + enrollment: { + start: post('/enrollment/start'), + }, + password: { + sendEmail: post( + '/password-reset/request', + ), + start: post('/password-reset/start'), + finish: post('/password-reset/reset'), + }, + openId: { + authInfo: post('openid/auth_info'), + enrollmentCallback: post( + 'openid/callback', + ), + mfaCallback: post('openid/callback/mfa'), + }, +} as const; + +export { api }; diff --git a/web/src/shared/api/types.ts b/web/src/shared/api/types.ts new file mode 100644 index 0000000..b9ff877 --- /dev/null +++ b/web/src/shared/api/types.ts @@ -0,0 +1,94 @@ +export type EmptyApiResponse = Record; + +export type TokenRequest = { + token: string; +}; + +export type AdminInfo = { + name: string; + email: string; + phone_number?: string; +}; + +export type UserInfo = { + first_name: string; + last_name: string; + login: string; + email: string; + phone_number?: string; + is_admin: boolean; + is_active: boolean; + enrolled: boolean; +}; + +export type AppInfo = { + version: string; +}; + +export type EnrollmentSettings = { + vpn_setup_optional: boolean; + only_client_activation: boolean; + admin_device_management: boolean; +}; + +export type EnrollmentStartResponse = { + admin: AdminInfo; + user: UserInfo; + instance: InstanceInfo; + deadline_timestamp: number; + final_page_content: string; + settings: EnrollmentSettings; +}; + +export type PasswordResetStartRequest = { + email: string; +}; + +export type PasswordResetStartResponse = { + deadline_timestamp: number; +}; + +export type PasswordResetFinishRequest = { + password: string; + token: string; +}; + +export type OpenIdType = 'enrollment' | 'mfa'; + +export type OpenIdAuthInfoRequest = { + state?: string; + type: OpenIdType; +}; + +export type OpenIdAuthInfoResponse = { + url?: string; + button_display_name?: string; +}; + +export type OpenIdCallbackRequest = { + code: string; + state: string; + type: 'enrollment'; +}; + +export type OpenIdCallbackResponse = { + token: string; + url: string; +}; + +export type OpenIdMfaCallbackRequest = { + code: string; + state: string; + type: 'mfa'; +}; + +export type InstanceInfo = { + id: string; + name: string; + url: string; + proxy_url: string; + username: string; + enterprise_enabled: boolean; + disable_all_traffic: boolean; + openid_display_name: string; +}; diff --git a/web/src/shared/api/update-service.ts b/web/src/shared/api/update-service.ts new file mode 100644 index 0000000..b05563b --- /dev/null +++ b/web/src/shared/api/update-service.ts @@ -0,0 +1,72 @@ +import axios from 'axios'; +import qs from 'qs'; + +const baseUrl = import.meta.env.VITE_UPDATE_BASE_URL as string | undefined; + +const clientDownloadFallback = 'https://defguard.net/download'; + +const client = axios.create({ + baseURL: baseUrl ?? 'http://pkgs.defguard.net/api', + headers: { 'Content-Type': 'application/json' }, + paramsSerializer: { + serialize: (params) => + qs.stringify(params, { + arrayFormat: 'repeat', + }), + }, +}); + +export type ClientVersionCheck = { + windows_amd64?: string; + deb_amd64?: string; + deb_arm64?: string; + deb_legacy_arm64?: string; + deb_legacy_amd64?: string; + rpm_amd64?: string; + rpm_arm64?: string; + macos_amd64?: string; + macos_arm64?: string; +}; + +const updateServiceApi = { + getClientArtifacts: () => + client + .get('/update/artifacts', { + params: { + product: 'defguard-client', + source: 'enrollment', + }, + }) + .then((response) => { + const { data } = response; + const res: ClientVersionCheck = { + deb_amd64: data.deb_amd64 ?? clientDownloadFallback, + deb_arm64: data.deb_arm64 ?? clientDownloadFallback, + deb_legacy_arm64: data.deb_legacy_arm64 ?? clientDownloadFallback, + deb_legacy_amd64: data.deb_legacy_amd64 ?? clientDownloadFallback, + macos_amd64: data.macos_amd64 ?? clientDownloadFallback, + macos_arm64: data.macos_arm64 ?? clientDownloadFallback, + rpm_amd64: data.rpm_amd64 ?? clientDownloadFallback, + rpm_arm64: data.rpm_arm64 ?? clientDownloadFallback, + windows_amd64: data.windows_amd64 ?? clientDownloadFallback, + }; + return res; + }) + .catch((e) => { + console.error(e); + const fallback: ClientVersionCheck = { + deb_amd64: clientDownloadFallback, + deb_arm64: clientDownloadFallback, + deb_legacy_arm64: clientDownloadFallback, + deb_legacy_amd64: clientDownloadFallback, + macos_amd64: clientDownloadFallback, + macos_arm64: clientDownloadFallback, + rpm_amd64: clientDownloadFallback, + rpm_arm64: clientDownloadFallback, + windows_amd64: clientDownloadFallback, + }; + return fallback; + }), +} as const; + +export { updateServiceApi }; diff --git a/web/src/shared/components/AppleHelpModal/AppleHelpModal.tsx b/web/src/shared/components/AppleHelpModal/AppleHelpModal.tsx new file mode 100644 index 0000000..9e285e0 --- /dev/null +++ b/web/src/shared/components/AppleHelpModal/AppleHelpModal.tsx @@ -0,0 +1,43 @@ +import { m } from '../../../paraglide/messages'; +import { Modal } from '../../defguard-ui/components/Modal/Modal'; +import { ModalControls } from '../../defguard-ui/components/ModalControls/ModalControls'; +import { SizedBox } from '../../defguard-ui/components/SizedBox/SizedBox'; +import { ThemeSpacing } from '../../defguard-ui/types'; +import apple_video_src from './assets/apple_hardware_help.mp4'; + +type Props = { + isOpen: boolean; + onClose: () => void; +}; + +export const AppleHelpModal = ({ isOpen, onClose }: Props) => { + return ( + +

{m.client_download_apple_help_content_1()}

+ +