diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index c7589a9..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @trueberryless diff --git a/.github/workflows/deployment.yaml b/.github/workflows/deployment.yaml index f48c9ca..68c70ad 100644 --- a/.github/workflows/deployment.yaml +++ b/.github/workflows/deployment.yaml @@ -13,7 +13,7 @@ env: REGISTRY: docker.io IMAGE_OWNER: trueberryless IMAGE_NAME: truzzles - NODE_VERSION: 20 + NODE_VERSION: 24.10.0 jobs: changesets: @@ -33,13 +33,15 @@ jobs: private_key: ${{ secrets.BOT_PRIVATE_KEY }} - name: Checkout Repo - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - name: Setup PNPM - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ env.NODE_VERSION }} cache: "pnpm" @@ -56,7 +58,6 @@ jobs: title: "ci: release [skip netlify]" env: GITHUB_TOKEN: ${{ steps.generate_token.outputs.token}} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Get published version if: steps.changesets.outputs.hasChangesets == 'true' @@ -74,7 +75,9 @@ jobs: IMAGE_TAG: ${{ env.IMAGE_TAG }} steps: - name: Check out the repo - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - name: Read version from package.json id: get_version @@ -86,34 +89,35 @@ jobs: needs: [changesets, image-tag] if: > ( - needs.changesets.outputs.hasChangesets == 'false' && + needs.changesets.outputs.hasChangesets == 'false' && ( - contains(github.event.head_commit.message, 'deploy') || + contains(github.event.head_commit.message, 'deploy') || contains(github.event.head_commit.message, 'release') ) - ) || + ) || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest permissions: contents: write steps: - name: Check out the repo - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 + persist-credentials: false - name: Set up Docker Buildx uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - name: Log in to Docker Hub - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 + uses: docker/metadata-action@318604b99e75e41977312d83839a89be02ca4893 # v5.9.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_OWNER }}/${{ env.IMAGE_NAME }} @@ -131,7 +135,7 @@ jobs: run: | yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_OWNER }}/${{ env.IMAGE_NAME }}:${{ needs.image-tag.outputs.IMAGE_TAG }}"' -i manifest/deployment.yaml - - uses: stefanzweifel/git-auto-commit-action@b863ae1933cb653a53c021fe36dbb774e1fb9403 # v5.2.0 + - uses: stefanzweifel/git-auto-commit-action@28e16e81777b558cc906c8750092100bbb34c5e3 # v7.0.0 with: commit_message: update deployment.json container image (automated) @@ -143,7 +147,9 @@ jobs: contents: write steps: - name: Check out the repo - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - id: extract-changelog uses: sean0x42/markdown-extract@7b185cbe85263116bbf741e739e7198ba86465dc # v2.1.0 diff --git a/.github/workflows/format.yaml b/.github/workflows/format.yaml index ecc2f94..9640b6a 100644 --- a/.github/workflows/format.yaml +++ b/.github/workflows/format.yaml @@ -6,19 +6,24 @@ on: permissions: contents: read +env: + NODE_VERSION: 24.10.0 + jobs: autofix: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - name: Setup PNPM - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: - node-version: 20.19.5 + node-version: ${{ env.NODE_VERSION }} cache: "pnpm" - name: Install Dependencies diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml index 83e3c99..d2f39ee 100644 --- a/.github/workflows/labeler.yaml +++ b/.github/workflows/labeler.yaml @@ -16,7 +16,9 @@ jobs: app_id: ${{ secrets.BOT_APP_ID }} private_key: ${{ secrets.BOT_PRIVATE_KEY }} - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - name: Ensure labels exist env: GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} @@ -49,7 +51,7 @@ jobs: gh label create "🏯 styles" --description "Stylesheets or design updates" --color "550F5A" --force gh label create "🔒 wontfix" --description "This will not be worked on" --color "FFFFFF" --force - - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5 + - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 with: configuration-path: .github/labeler.yaml sync-labels: true diff --git a/.github/workflows/welcome-bot.yaml b/.github/workflows/welcome-bot.yaml index 63b6b82..9d858d7 100644 --- a/.github/workflows/welcome-bot.yaml +++ b/.github/workflows/welcome-bot.yaml @@ -20,7 +20,9 @@ jobs: app_id: ${{ secrets.BOT_APP_ID }} private_key: ${{ secrets.BOT_PRIVATE_KEY }} - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false - name: Convert Repository Name to Title Case id: convert_repo_name run: | diff --git a/package.json b/package.json index 23c8768..8064a51 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ "version": "pnpm changeset version && pnpm i --no-frozen-lockfile" }, "devDependencies": { - "@changesets/changelog-github": "^0.5.0", - "@changesets/cli": "^2.27.11", + "@changesets/changelog-github": "^0.5.1", + "@changesets/cli": "^2.29.7", "@trivago/prettier-plugin-sort-imports": "5.2.2", - "prettier": "3.5.3", + "prettier": "3.6.2", "prettier-plugin-astro": "0.14.1" }, "packageManager": "pnpm@10.10.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..f76bc39 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1094 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/changelog-github': + specifier: ^0.5.1 + version: 0.5.1 + '@changesets/cli': + specifier: ^2.29.7 + version: 2.29.7 + '@trivago/prettier-plugin-sort-imports': + specifier: 5.2.2 + version: 5.2.2(prettier@3.6.2) + prettier: + specifier: 3.6.2 + version: 3.6.2 + prettier-plugin-astro: + specifier: 0.14.1 + version: 0.14.1 + +packages: + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/changelog-github@0.5.1': + resolution: {integrity: sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ==} + + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@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'} + + '@trivago/prettier-plugin-sort-imports@5.2.2': + resolution: {integrity: sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==} + engines: {node: '>18.12'} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + prettier-plugin-svelte: 3.x + svelte: 4.x || 5.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + prettier-plugin-svelte: + optional: true + svelte: + optional: true + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + 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'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + hasBin: true + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + 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-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier-plugin-astro@0.14.1: + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + +snapshots: + + '@astrojs/compiler@2.13.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/changelog-github@0.5.1': + dependencies: + '@changesets/get-github-info': 0.6.0 + '@changesets/types': 6.1.0 + dotenv: 8.6.0 + transitivePeerDependencies: + - encoding + + '@changesets/cli@2.29.7': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-github-info@0.6.0': + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 + + '@inquirer/external-editor@1.0.3': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@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 + + '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2)': + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@types/node@12.20.55': {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-union@2.1.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chardet@2.1.1: {} + + ci-info@3.9.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dataloader@1.4.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dotenv@8.6.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + 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 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + 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 + + graceful-fs@4.2.11: {} + + human-id@4.1.2: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + javascript-natural-sort@0.7.1: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsesc@3.1.0: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mri@1.2.0: {} + + ms@2.1.3: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + prettier-plugin-astro@0.14.1: + dependencies: + '@astrojs/compiler': 2.13.0 + prettier: 3.6.2 + sass-formatter: 0.7.9 + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + s.color@0.0.15: {} + + safer-buffer@2.1.2: {} + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + + term-size@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + universalify@0.1.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 diff --git a/src/counting-boxes/index.html b/src/counting-boxes/index.html index a74735b..3794ff4 100644 --- a/src/counting-boxes/index.html +++ b/src/counting-boxes/index.html @@ -1,50 +1,50 @@ - + - - - - Counting Boxes - - - - - -
-

Counting Boxes

-

- Click on a box to increase the number of the box itself and the neighbouring boxes. - The aim is to set all boxes to 0. -

-
-
-
- 0 - Clicks: 0 -
-
- 0 - Clicks: 0 -
-
- 0 - Clicks: 0 -
-
- 0 - Clicks: 0 -
-
-
-

Total clicks: 0

-

- - -
-
+ + + + Counting Boxes + + + + + +
+

Counting Boxes

+

+ Click on a box to increase the number of the box itself and the + neighbouring boxes. The aim is to set all boxes to 0. +

+
+
+
+ 0 + Clicks: 0 +
+
+ 0 + Clicks: 0 +
+
+ 0 + Clicks: 0 +
+
+ 0 + Clicks: 0 +
- - +
+

Total clicks: 0

+

+ + +
+
+
+ + diff --git a/src/counting-boxes/script.js b/src/counting-boxes/script.js index 0fb5d09..b2dd359 100644 --- a/src/counting-boxes/script.js +++ b/src/counting-boxes/script.js @@ -1,161 +1,166 @@ document.addEventListener("DOMContentLoaded", () => { - const boxes = Array.from(document.querySelectorAll(".box")); - const newGameBtn = document.getElementById("new-game-btn"); - const resetBtn = document.getElementById("reset-btn"); - const message = document.getElementById("message"); - const currentClicksDisplay = document.getElementById("current-clicks"); - let initialValues = []; - let minClickCount = 0; - let currentClicks = 0; - - function initializeGame() { - boxes.forEach((box) => { - const randomValue = Math.floor(Math.random() * 4); - box.querySelector(".value").textContent = randomValue; - box.querySelector(".counter").textContent = "Clicks: 0"; - box.classList.remove("solved"); - - if (randomValue === 3) { - box.querySelector(".value").setAttribute("data-change", "=0"); - } else { - box.querySelector(".value").setAttribute("data-change", "+1"); - } - }); - saveInitialValues(); - minClickCount = calculateMinClicks(); - message.textContent = `Minimum clicks to solve: ${minClickCount}`; - currentClicks = 0; - currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; - newGameBtn.style.display = "none"; - } - - function resetGame() { - boxes.forEach((box, index) => { - box.querySelector(".value").textContent = initialValues[index]; - box.querySelector(".counter").textContent = "Clicks: 0"; - box.classList.remove("solved"); - }); - message.textContent = `Minimum clicks to solve: ${minClickCount}`; - currentClicks = 0; - currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; - currentClicksDisplay.style.color = "inherit"; - newGameBtn.style.display = "none"; - } - - function saveInitialValues() { - initialValues = boxes.map((box) => box.querySelector(".value").textContent); - } - + const boxes = Array.from(document.querySelectorAll(".box")); + const newGameBtn = document.getElementById("new-game-btn"); + const resetBtn = document.getElementById("reset-btn"); + const message = document.getElementById("message"); + const currentClicksDisplay = document.getElementById("current-clicks"); + let initialValues = []; + let minClickCount = 0; + let currentClicks = 0; + + function initializeGame() { + boxes.forEach((box) => { + const randomValue = Math.floor(Math.random() * 4); + box.querySelector(".value").textContent = randomValue; + box.querySelector(".counter").textContent = "Clicks: 0"; + box.classList.remove("solved"); + + if (randomValue === 3) { + box.querySelector(".value").setAttribute("data-change", "=0"); + } else { + box.querySelector(".value").setAttribute("data-change", "+1"); + } + }); + saveInitialValues(); + minClickCount = calculateMinClicks(); + message.textContent = `Minimum clicks to solve: ${minClickCount}`; + currentClicks = 0; + currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; + newGameBtn.style.display = "none"; + } + + function resetGame() { boxes.forEach((box, index) => { - box.addEventListener("click", () => { - incrementBox(index); - incrementCounter(index); - currentClicks += 1; - currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; - if (currentClicks > minClickCount) { - currentClicksDisplay.style.color = "#dc3545"; - } - checkSolved(); - }); + box.querySelector(".value").textContent = initialValues[index]; + box.querySelector(".counter").textContent = "Clicks: 0"; + box.classList.remove("solved"); }); - - newGameBtn.addEventListener("click", initializeGame); - resetBtn.addEventListener("click", resetGame); - - function incrementBox(index) { - const adjacentIndices = getAdjacentIndices(index); - - [index, ...adjacentIndices].forEach((i) => { - const box = boxes[i].querySelector(".value"); - let value = parseInt(box.textContent, 10); - value = (value + 1) % 4; - if (value === 3) { - box.setAttribute("data-change", "=0"); - } else { - box.setAttribute("data-change", "+1"); - } - box.textContent = value; - }); - } - - function incrementCounter(index) { - const counter = boxes[index].querySelector(".counter"); - let count = parseInt(counter.textContent.split(": ")[1], 10); - count += 1; - counter.textContent = `Clicks: ${count}`; - } - - function getAdjacentIndices(index) { - const adjacent = []; - - if (index % 2 !== 0) adjacent.push(index - 1); // Left - if (index % 2 === 0 && index + 1 < 4) adjacent.push(index + 1); // Right - if (index - 2 >= 0) adjacent.push(index - 2); // Above - if (index + 2 < 4) adjacent.push(index + 2); // Below - - return adjacent; - } - - function checkSolved() { - const allZero = boxes.every((box) => box.querySelector(".value").textContent === "0"); - const totalClicks = boxes.reduce((sum, box) => { - return sum + parseInt(box.querySelector(".counter").textContent.split(": ")[1], 10); - }, 0); - - if (allZero) { - boxes.forEach((box) => box.classList.add("solved")); - if (totalClicks === minClickCount) { - message.textContent = `Congratulations! You have solved the puzzle with the minimum number of ${minClickCount} clicks!`; - newGameBtn.style.display = "block"; - } else { - message.textContent = `Puzzle solved! Try again to solve it with just ${minClickCount} clicks.`; - } - } else { - boxes.forEach((box) => box.classList.remove("solved")); - message.textContent = `Minimum clicks to solve: ${minClickCount}`; - } + message.textContent = `Minimum clicks to solve: ${minClickCount}`; + currentClicks = 0; + currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; + currentClicksDisplay.style.color = "inherit"; + newGameBtn.style.display = "none"; + } + + function saveInitialValues() { + initialValues = boxes.map((box) => box.querySelector(".value").textContent); + } + + boxes.forEach((box, index) => { + box.addEventListener("click", () => { + incrementBox(index); + incrementCounter(index); + currentClicks += 1; + currentClicksDisplay.textContent = `Total clicks: ${currentClicks}`; + if (currentClicks > minClickCount) { + currentClicksDisplay.style.color = "#dc3545"; + } + checkSolved(); + }); + }); + + newGameBtn.addEventListener("click", initializeGame); + resetBtn.addEventListener("click", resetGame); + + function incrementBox(index) { + const adjacentIndices = getAdjacentIndices(index); + + [index, ...adjacentIndices].forEach((i) => { + const box = boxes[i].querySelector(".value"); + let value = parseInt(box.textContent, 10); + value = (value + 1) % 4; + if (value === 3) { + box.setAttribute("data-change", "=0"); + } else { + box.setAttribute("data-change", "+1"); + } + box.textContent = value; + }); + } + + function incrementCounter(index) { + const counter = boxes[index].querySelector(".counter"); + let count = parseInt(counter.textContent.split(": ")[1], 10); + count += 1; + counter.textContent = `Clicks: ${count}`; + } + + function getAdjacentIndices(index) { + const adjacent = []; + + if (index % 2 !== 0) adjacent.push(index - 1); // Left + if (index % 2 === 0 && index + 1 < 4) adjacent.push(index + 1); // Right + if (index - 2 >= 0) adjacent.push(index - 2); // Above + if (index + 2 < 4) adjacent.push(index + 2); // Below + + return adjacent; + } + + function checkSolved() { + const allZero = boxes.every( + (box) => box.querySelector(".value").textContent === "0" + ); + const totalClicks = boxes.reduce((sum, box) => { + return ( + sum + + parseInt(box.querySelector(".counter").textContent.split(": ")[1], 10) + ); + }, 0); + + if (allZero) { + boxes.forEach((box) => box.classList.add("solved")); + if (totalClicks === minClickCount) { + message.textContent = `Congratulations! You have solved the puzzle with the minimum number of ${minClickCount} clicks!`; + newGameBtn.style.display = "block"; + } else { + message.textContent = `Puzzle solved! Try again to solve it with just ${minClickCount} clicks.`; + } + } else { + boxes.forEach((box) => box.classList.remove("solved")); + message.textContent = `Minimum clicks to solve: ${minClickCount}`; } + } - function calculateMinClicks() { - const initialState = boxes.map((box) => - parseInt(box.querySelector(".value").textContent, 10) - ); - const targetState = [0, 0, 0, 0]; - const queue = [{ state: initialState, clicks: 0 }]; - const visited = new Set(); + function calculateMinClicks() { + const initialState = boxes.map((box) => + parseInt(box.querySelector(".value").textContent, 10) + ); + const targetState = [0, 0, 0, 0]; + const queue = [{ state: initialState, clicks: 0 }]; + const visited = new Set(); - visited.add(stateToString(initialState)); + visited.add(stateToString(initialState)); - while (queue.length > 0) { - const { state, clicks } = queue.shift(); + while (queue.length > 0) { + const { state, clicks } = queue.shift(); - if (state.toString() === targetState.toString()) { - return clicks; - } + if (state.toString() === targetState.toString()) { + return clicks; + } - for (let i = 0; i < 4; i++) { - const newState = state.slice(); - const indices = [i, ...getAdjacentIndices(i)]; + for (let i = 0; i < 4; i++) { + const newState = state.slice(); + const indices = [i, ...getAdjacentIndices(i)]; - indices.forEach((index) => { - newState[index] = (newState[index] + 1) % 4; - }); + indices.forEach((index) => { + newState[index] = (newState[index] + 1) % 4; + }); - const stateStr = stateToString(newState); + const stateStr = stateToString(newState); - if (!visited.has(stateStr)) { - visited.add(stateStr); - queue.push({ state: newState, clicks: clicks + 1 }); - } - } + if (!visited.has(stateStr)) { + visited.add(stateStr); + queue.push({ state: newState, clicks: clicks + 1 }); } - - return -1; // Should not reach here + } } - function stateToString(state) { - return state.join(","); - } + return -1; // Should not reach here + } + + function stateToString(state) { + return state.join(","); + } - initializeGame(); + initializeGame(); }); diff --git a/src/counting-boxes/styles.css b/src/counting-boxes/styles.css index 0e1dfb3..105476d 100644 --- a/src/counting-boxes/styles.css +++ b/src/counting-boxes/styles.css @@ -1,235 +1,235 @@ * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: "Roboto", sans-serif; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - background-color: #1a1a1a; - color: #f0f0f0; + font-family: "Roboto", sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + background-color: #1a1a1a; + color: #f0f0f0; } .game-container { - text-align: center; + text-align: center; } h1 { - font-weight: 700; - margin-bottom: 10px; + font-weight: 700; + margin-bottom: 10px; } p { - font-weight: 400; - margin: 0 auto 20px; - max-width: 450px; + font-weight: 400; + margin: 0 auto 20px; + max-width: 450px; } .content-wrapper { - display: flex; - justify-content: center; + display: flex; + justify-content: center; } .container { - display: grid; - grid-template-columns: repeat(2, 100px); - gap: 10px; + display: grid; + grid-template-columns: repeat(2, 100px); + gap: 10px; } .box { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 100px; - height: 100px; - background-color: #007bff; - color: white; - font-size: 2em; - cursor: pointer; - border-radius: 10px; - user-select: none; - transition: background-color 0.3s; - position: relative; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100px; + height: 100px; + background-color: #007bff; + color: white; + font-size: 2em; + cursor: pointer; + border-radius: 10px; + user-select: none; + transition: background-color 0.3s; + position: relative; } .box:hover { - background-color: #0056b3; - cursor: pointer; - border: 3px solid white; + background-color: #0056b3; + cursor: pointer; + border: 3px solid white; } .box:has([data-change="+1"]):hover::before { - content: "+1"; /* Der Inhalt des Pseudo-Elements */ - position: absolute; /* Position relativ zur Box */ - top: -10px; /* 20px über der Box */ - right: -10px; /* 20px rechts von der Box */ - background-color: #dc3545; - color: white; - padding: 5px 10px; - border-radius: 10000px; - transform: rotate(-5deg); /* Leichte Rotation */ - animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ - opacity: 0; /* Beginnt unsichtbar */ - user-select: none; - z-index: 1000; - font-size: 1rem; + content: "+1"; /* Der Inhalt des Pseudo-Elements */ + position: absolute; /* Position relativ zur Box */ + top: -10px; /* 20px über der Box */ + right: -10px; /* 20px rechts von der Box */ + background-color: #dc3545; + color: white; + padding: 5px 10px; + border-radius: 10000px; + transform: rotate(-5deg); /* Leichte Rotation */ + animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ + opacity: 0; /* Beginnt unsichtbar */ + user-select: none; + z-index: 1000; + font-size: 1rem; } .box:has([data-change="=0"]):hover::before { - content: "=0"; /* Der Inhalt des Pseudo-Elements */ - position: absolute; /* Position relativ zur Box */ - top: -10px; /* 20px über der Box */ - right: -10px; /* 20px rechts von der Box */ - background-color: #dc3545; - color: white; - padding: 5px 10px; - border-radius: 10000px; - transform: rotate(-5deg); /* Leichte Rotation */ - animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ - opacity: 0; /* Beginnt unsichtbar */ - user-select: none; - z-index: 1000; - font-size: 1rem; + content: "=0"; /* Der Inhalt des Pseudo-Elements */ + position: absolute; /* Position relativ zur Box */ + top: -10px; /* 20px über der Box */ + right: -10px; /* 20px rechts von der Box */ + background-color: #dc3545; + color: white; + padding: 5px 10px; + border-radius: 10000px; + transform: rotate(-5deg); /* Leichte Rotation */ + animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ + opacity: 0; /* Beginnt unsichtbar */ + user-select: none; + z-index: 1000; + font-size: 1rem; } :is( - .container:has(.box:nth-child(1):hover) .box:nth-child(2), - .container:has(.box:nth-child(1):hover) .box:nth-child(3), - .container:has(.box:nth-child(2):hover) .box:nth-child(1), - .container:has(.box:nth-child(2):hover) .box:nth-child(4), - .container:has(.box:nth-child(3):hover) .box:nth-child(1), - .container:has(.box:nth-child(3):hover) .box:nth-child(4), - .container:has(.box:nth-child(4):hover) .box:nth-child(2), - .container:has(.box:nth-child(4):hover) .box:nth-child(3) - ) { - background-color: #0056b3; + .container:has(.box:nth-child(1):hover) .box:nth-child(2), + .container:has(.box:nth-child(1):hover) .box:nth-child(3), + .container:has(.box:nth-child(2):hover) .box:nth-child(1), + .container:has(.box:nth-child(2):hover) .box:nth-child(4), + .container:has(.box:nth-child(3):hover) .box:nth-child(1), + .container:has(.box:nth-child(3):hover) .box:nth-child(4), + .container:has(.box:nth-child(4):hover) .box:nth-child(2), + .container:has(.box:nth-child(4):hover) .box:nth-child(3) +) { + background-color: #0056b3; } :is( - .container:has(.box:nth-child(1):hover) .box:nth-child(2), - .container:has(.box:nth-child(1):hover) .box:nth-child(3), - .container:has(.box:nth-child(2):hover) .box:nth-child(1), - .container:has(.box:nth-child(2):hover) .box:nth-child(4), - .container:has(.box:nth-child(3):hover) .box:nth-child(1), - .container:has(.box:nth-child(3):hover) .box:nth-child(4), - .container:has(.box:nth-child(4):hover) .box:nth-child(2), - .container:has(.box:nth-child(4):hover) .box:nth-child(3) - ):has([data-change="+1"])::before { - content: "+1"; /* Der Inhalt des Pseudo-Elements */ - position: absolute; /* Position relativ zur Box */ - top: -10px; /* 20px über der Box */ - right: -10px; /* 20px rechts von der Box */ - background-color: #dc3545; - color: white; - padding: 5px 10px; - border-radius: 10000px; - transform: rotate(-5deg); /* Leichte Rotation */ - animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ - opacity: 0; /* Beginnt unsichtbar */ - user-select: none; - z-index: 1000; - font-size: 1rem; + .container:has(.box:nth-child(1):hover) .box:nth-child(2), + .container:has(.box:nth-child(1):hover) .box:nth-child(3), + .container:has(.box:nth-child(2):hover) .box:nth-child(1), + .container:has(.box:nth-child(2):hover) .box:nth-child(4), + .container:has(.box:nth-child(3):hover) .box:nth-child(1), + .container:has(.box:nth-child(3):hover) .box:nth-child(4), + .container:has(.box:nth-child(4):hover) .box:nth-child(2), + .container:has(.box:nth-child(4):hover) .box:nth-child(3) + ):has([data-change="+1"])::before { + content: "+1"; /* Der Inhalt des Pseudo-Elements */ + position: absolute; /* Position relativ zur Box */ + top: -10px; /* 20px über der Box */ + right: -10px; /* 20px rechts von der Box */ + background-color: #dc3545; + color: white; + padding: 5px 10px; + border-radius: 10000px; + transform: rotate(-5deg); /* Leichte Rotation */ + animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ + opacity: 0; /* Beginnt unsichtbar */ + user-select: none; + z-index: 1000; + font-size: 1rem; } :is( - .container:has(.box:nth-child(1):hover) .box:nth-child(2), - .container:has(.box:nth-child(1):hover) .box:nth-child(3), - .container:has(.box:nth-child(2):hover) .box:nth-child(1), - .container:has(.box:nth-child(2):hover) .box:nth-child(4), - .container:has(.box:nth-child(3):hover) .box:nth-child(1), - .container:has(.box:nth-child(3):hover) .box:nth-child(4), - .container:has(.box:nth-child(4):hover) .box:nth-child(2), - .container:has(.box:nth-child(4):hover) .box:nth-child(3) - ):has([data-change="=0"])::before { - content: "=0"; /* Der Inhalt des Pseudo-Elements */ - position: absolute; /* Position relativ zur Box */ - top: -10px; /* 20px über der Box */ - right: -10px; /* 20px rechts von der Box */ - background-color: #dc3545; - color: white; - padding: 5px 10px; - border-radius: 10000px; - transform: rotate(-5deg); /* Leichte Rotation */ - animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ - opacity: 0; /* Beginnt unsichtbar */ - user-select: none; - z-index: 1000; - font-size: 1rem; + .container:has(.box:nth-child(1):hover) .box:nth-child(2), + .container:has(.box:nth-child(1):hover) .box:nth-child(3), + .container:has(.box:nth-child(2):hover) .box:nth-child(1), + .container:has(.box:nth-child(2):hover) .box:nth-child(4), + .container:has(.box:nth-child(3):hover) .box:nth-child(1), + .container:has(.box:nth-child(3):hover) .box:nth-child(4), + .container:has(.box:nth-child(4):hover) .box:nth-child(2), + .container:has(.box:nth-child(4):hover) .box:nth-child(3) + ):has([data-change="=0"])::before { + content: "=0"; /* Der Inhalt des Pseudo-Elements */ + position: absolute; /* Position relativ zur Box */ + top: -10px; /* 20px über der Box */ + right: -10px; /* 20px rechts von der Box */ + background-color: #dc3545; + color: white; + padding: 5px 10px; + border-radius: 10000px; + transform: rotate(-5deg); /* Leichte Rotation */ + animation: badgeAnimation 0.5s ease-in-out forwards; /* Animationseffekt */ + opacity: 0; /* Beginnt unsichtbar */ + user-select: none; + z-index: 1000; + font-size: 1rem; } @keyframes badgeAnimation { - 0% { - transform: rotate(-15deg) translateY(-50px); /* Startposition oberhalb der Box */ - opacity: 0; /* Beginnt unsichtbar */ - } - 100% { - transform: rotate(-15deg) translateY(0); /* Endposition auf Höhe der Box */ - opacity: 1; /* Wird sichtbar */ - } + 0% { + transform: rotate(-15deg) translateY(-50px); /* Startposition oberhalb der Box */ + opacity: 0; /* Beginnt unsichtbar */ + } + 100% { + transform: rotate(-15deg) translateY(0); /* Endposition auf Höhe der Box */ + opacity: 1; /* Wird sichtbar */ + } } .counter { - display: none; - position: absolute; - bottom: 5px; - font-size: 0.5em; + display: none; + position: absolute; + bottom: 5px; + font-size: 0.5em; } .solved { - background-color: #28a745 !important; + background-color: #28a745 !important; } .button-container { - display: flex; - flex-direction: column; - justify-content: center; - margin-left: 20px; + display: flex; + flex-direction: column; + justify-content: center; + margin-left: 20px; } #new-game-btn { - padding: 10px 20px; - font-size: 1em; - cursor: pointer; - border: none; - border-radius: 5px; - background-color: #007bff; - color: white; - transition: background-color 0.3s; - margin-bottom: 10px; + padding: 10px 20px; + font-size: 1em; + cursor: pointer; + border: none; + border-radius: 5px; + background-color: #007bff; + color: white; + transition: background-color 0.3s; + margin-bottom: 10px; } #new-game-btn:hover { - background-color: #0056b3; + background-color: #0056b3; } #reset-btn { - padding: 10px 20px; - font-size: 1em; - cursor: pointer; - border: none; - border-radius: 5px; - background-color: #dc3545; - color: white; - transition: background-color 0.3s; - margin-bottom: 10px; + padding: 10px 20px; + font-size: 1em; + cursor: pointer; + border: none; + border-radius: 5px; + background-color: #dc3545; + color: white; + transition: background-color 0.3s; + margin-bottom: 10px; } #reset-btn:hover { - background-color: #c82333; + background-color: #c82333; } #message { - font-size: 1em; - margin-top: 10px; - font-weight: 700; - color: #cccccc; + font-size: 1em; + margin-top: 10px; + font-weight: 700; + color: #cccccc; } #current-clicks { - font-weight: 700; - margin-bottom: 10px; + font-weight: 700; + margin-bottom: 10px; } diff --git a/src/index.html b/src/index.html index 1756238..edf7e0b 100644 --- a/src/index.html +++ b/src/index.html @@ -1,32 +1,32 @@ - + - - - - Truzzles - - - - -
-

Truzzles — Trueberryless Puzzles

-

- Welcome! This website offers a selection of small puzzle games, all hosted here. - Enjoy playing! -

-
-
-
- -
-
- - + + + + Truzzles + + + + +
+

Truzzles — Trueberryless Puzzles

+

+ Welcome! This website offers a selection of small puzzle games, all + hosted here. Enjoy playing! +

+
+
+
+ +
+
+ + diff --git a/src/styles.css b/src/styles.css index f6e6217..6e35d11 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1,80 +1,82 @@ body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - color: #ffffff; /* Light text color */ - background: url("img/Truzzles.png") #121212 center center; - height: 100vh; - backdrop-filter: blur(100px); + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + color: #ffffff; /* Light text color */ + background: url("img/Truzzles.png") #121212 center center; + height: 100vh; + backdrop-filter: blur(100px); } header { - background-color: #1e1e1e; - color: #ffffff; - text-align: center; - padding: 1em 0; + background-color: #1e1e1e; + color: #ffffff; + text-align: center; + padding: 1em 0; } header h1 { - margin: 0; - font-size: 2.5em; + margin: 0; + font-size: 2.5em; } header p { - margin: 0.5em 0 0; - font-size: 1.2em; + margin: 0.5em 0 0; + font-size: 1.2em; } main { - display: flex; - justify-content: center; - padding: 2em 0; + display: flex; + justify-content: center; + padding: 2em 0; } .game-grid { - display: flex; - flex-wrap: wrap; - gap: 1em; - justify-content: center; + display: flex; + flex-wrap: wrap; + gap: 1em; + justify-content: center; } .game-card { - background: rgba(255, 255, 255, 0.2); /* Glass effect background color */ - border-radius: 16px; - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - border: 1px solid rgba(255, 255, 255, 0.3); - overflow: hidden; - transition: transform 0.3s, box-shadow 0.3s; - width: 200px; - text-align: center; + background: rgba(255, 255, 255, 0.2); /* Glass effect background color */ + border-radius: 16px; + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); + border: 1px solid rgba(255, 255, 255, 0.3); + overflow: hidden; + transition: + transform 0.3s, + box-shadow 0.3s; + width: 200px; + text-align: center; } .game-card:hover { - transform: translateY(-5px); - box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2); /* Increased shadow on hover */ + transform: translateY(-5px); + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2); /* Increased shadow on hover */ } .game-card img { - width: 100%; - height: auto; + width: 100%; + height: auto; } .game-card h2 { - margin: 0; - padding: 1em; - background-color: #1e1e1e; /* Dark title background color */ - color: #ffffff; + margin: 0; + padding: 1em; + background-color: #1e1e1e; /* Dark title background color */ + color: #ffffff; } footer { - background-color: #1e1e1e; - backdrop-filter: blur(10000px); - color: #ffffff; - text-align: center; - padding: 1em 0; - position: fixed; - width: 100%; - bottom: 0; + background-color: #1e1e1e; + backdrop-filter: blur(10000px); + color: #ffffff; + text-align: center; + padding: 1em 0; + position: fixed; + width: 100%; + bottom: 0; }