diff --git a/astro.config.mjs b/astro.config.mjs index af720af..e6735c1 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,49 +1,13 @@ // @ts-check import { defineConfig } from 'astro/config'; -import starlight from '@astrojs/starlight'; -import mdx from '@astrojs/mdx'; -import starlightUITweaks from 'starlight-ui-tweaks'; // https://astro.build/config export default defineConfig({ site: 'https://meetup.nixos-cn.org', - integrations: [ - starlight({ - title: 'Nix CN', - defaultLocale: 'root', - logo: { - light: './src/assets/nix-cn.svg', - dark: './src/assets/nix-cn-dark.svg', - replacesTitle: true, - }, - locales: { - root: { - label: '简体中文', - lang: 'zh-CN', - }, - en: { - label: 'English', - }, - }, - social: [ - { - icon: 'seti:git', - label: 'Source', - href: 'https://github.com/NixOS-CN/nixcn-web', - }, - ], - sidebar: ['meetup-2-guide', 'souvenir-customization', 'volunteers', 'code-of-conduct', 'calendar'], - plugins: [ - starlightUITweaks({ - navbarLinks: [{ label: 'Nix CN 社区 ↗', href: 'https://nixos-cn.org/' }], - locales: { - en: { - navbarLinks: [{ label: 'Nix CN Community ↗', href: 'https://nixos-cn.org/' }], - }, - }, - }), - ], - }), - mdx(), - ], + server: { + host: true, + }, + redirects: { + '/': '/zh-CN/', + }, }); diff --git a/package.json b/package.json index 29d2de4..5f2104e 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,16 @@ "start": "astro dev", "build": "astro build", "preview": "astro preview", - "astro": "astro" + "astro": "astro", + "check": "astro check", + "typecheck": "astro check", + "lint:fix": "prettier --write ." }, "dependencies": { - "@astrojs/mdx": "^4.3.12", - "@astrojs/starlight": "^0.37.0", + "@astrojs/check": "^0.9.9", "astro": "^5.6.1", "sharp": "^0.34.2", - "starlight-ui-tweaks": "^0.1.0" + "typescript": "^6.0.3" }, "devDependencies": { "prettier": "^3.7.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da16199..cb3fa6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,21 +8,18 @@ importers: .: dependencies: - '@astrojs/mdx': - specifier: ^4.3.12 - version: 4.3.12(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)) - '@astrojs/starlight': - specifier: ^0.37.0 - version: 0.37.0(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)) + '@astrojs/check': + specifier: ^0.9.9 + version: 0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.7.4)(typescript@6.0.3) astro: specifier: ^5.6.1 - version: 5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3) + version: 5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@6.0.3)(yaml@2.9.0) sharp: specifier: ^0.34.2 version: 0.34.5 - starlight-ui-tweaks: - specifier: ^0.1.0 - version: 0.1.0(@astrojs/starlight@0.37.0(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3))) + typescript: + specifier: ^6.0.3 + version: 6.0.3 devDependencies: prettier: specifier: ^3.7.4 @@ -36,37 +33,47 @@ importers: packages: + '@astrojs/check@0.9.9': + resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + '@astrojs/compiler@2.13.0': resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + '@astrojs/internal-helpers@0.7.5': resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} + '@astrojs/language-server@2.16.9': + resolution: {integrity: sha512-L9kddTg+ZSO3X0Pwfx0ZPO+Z+eSSq0/39jXRyIkHzcBICzusdn2T464R4P6K0WcDZ6pMkLlFpuGS73u1pOnMSw==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + '@astrojs/markdown-remark@6.3.9': resolution: {integrity: sha512-hX2cLC/KW74Io1zIbn92kI482j9J7LleBLGCVU9EP3BeH5MVrnFawOnqD0t/q6D1Z+ZNeQG2gNKMslCcO36wng==} - '@astrojs/mdx@4.3.12': - resolution: {integrity: sha512-pL3CVPtuQrPnDhWjy7zqbOibNyPaxP4VpQS8T8spwKqKzauJ4yoKyNkVTD8jrP7EAJHmBhZ7PTmUGZqOpKKp8g==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - peerDependencies: - astro: ^5.0.0 - '@astrojs/prism@3.3.0': resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - '@astrojs/sitemap@3.6.0': - resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==} - - '@astrojs/starlight@0.37.0': - resolution: {integrity: sha512-1AlaEjYYRO+5o6P5maPUBQZr6Q3wtuhMQTmsDQExI07wJVwe7EC2wGhXnFo+jpCjwHv/Bdg33PQheY4UhMj01g==} - peerDependencies: - astro: ^5.5.0 - '@astrojs/telemetry@3.3.0': resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -80,10 +87,6 @@ packages: 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/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -142,9 +145,26 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@ctrl/tinycolor@4.2.0': - resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} - engines: {node: '>=14'} + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -461,18 +481,6 @@ packages: cpu: [x64] os: [win32] - '@expressive-code/core@0.41.3': - resolution: {integrity: sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ==} - - '@expressive-code/plugin-frames@0.41.3': - resolution: {integrity: sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ==} - - '@expressive-code/plugin-shiki@0.41.3': - resolution: {integrity: sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA==} - - '@expressive-code/plugin-text-markers@0.41.3': - resolution: {integrity: sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g==} - '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -525,183 +533,155 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -753,45 +733,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mdx-js/mdx@3.1.1': - resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@pagefind/darwin-arm64@1.4.0': - resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} - cpu: [arm64] - os: [darwin] - - '@pagefind/darwin-x64@1.4.0': - resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} - cpu: [x64] - os: [darwin] - - '@pagefind/default-ui@1.4.0': - resolution: {integrity: sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==} - - '@pagefind/freebsd-x64@1.4.0': - resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} - cpu: [x64] - os: [freebsd] - - '@pagefind/linux-arm64@1.4.0': - resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} - cpu: [arm64] - os: [linux] - - '@pagefind/linux-x64@1.4.0': - resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} - cpu: [x64] - os: [linux] - - '@pagefind/windows-x64@1.4.0': - resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} - cpu: [x64] - os: [win32] - '@poppinss/colors@4.1.5': resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} @@ -844,67 +788,56 @@ packages: resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.3': resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.3': resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.3': resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.3': resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.3': resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.3': resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.3': resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.3': resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.3': resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.3': resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.3': resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} @@ -965,9 +898,6 @@ packages: '@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==} @@ -977,43 +907,49 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} @@ -1029,6 +965,17 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1040,6 +987,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -1048,9 +999,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1061,15 +1009,6 @@ packages: array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} - hasBin: true - - astro-expressive-code@0.41.3: - resolution: {integrity: sha512-u+zHMqo/QNLE2eqYRCrK3+XMlKakv33Bzuz+56V1gs8H0y6TZ0hIi3VNbIxeTn51NLn+mJfUV/A0kMNfE4rANw==} - peerDependencies: - astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 - astro@5.16.4: resolution: {integrity: sha512-rgXI/8/tnO3Y9tfAaUyg/8beKhlIMltbiC8Q6jCoAfEidOyaue4KYKzbe0gJIb6qEdEaG3Kf3BY3EOSLkbWOLg==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} @@ -1088,12 +1027,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - - bcp-47@2.1.0: - resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} - blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -1127,9 +1060,6 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1142,6 +1072,10 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} @@ -1150,9 +1084,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1190,9 +1121,6 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-selector-parser@3.2.0: - resolution: {integrity: sha512-L1bdkNKUP5WYxiW5dW6vA2hd3sL8BdRNLy2FCX0rLVise4eNw9nBdeBuJHxlELieSE2H1f6bYQFfwVUwWCV9rQ==} - 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'} @@ -1257,10 +1185,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} - hasBin: true - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1281,6 +1205,9 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1301,12 +1228,6 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - esast-util-from-estree@2.0.0: - resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} - - esast-util-from-js@2.0.1: - resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -1317,28 +1238,14 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} - - estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} - - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} - - estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - - estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1352,15 +1259,15 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expressive-code@0.41.3: - resolution: {integrity: sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1385,6 +1292,10 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} @@ -1398,57 +1309,27 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} - hast-util-embedded@3.0.0: - resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - - hast-util-format@1.1.0: - resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - - hast-util-is-body-ok-link@3.0.1: - resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} - hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - hast-util-minify-whitespace@1.0.1: - resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} - hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - hast-util-phrasing@3.0.1: - resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-select@6.0.4: - resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} - - hast-util-to-estree@3.1.3: - resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - hast-util-to-parse5@8.0.1: resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - hast-util-to-string@3.0.1: - resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} - hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -1464,36 +1345,18 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - html-whitespace-sensitive-tag-names@3.0.1: - resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} - http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - i18next@23.16.8: - resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} - import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - inline-style-parser@0.2.7: - resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - 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-arrayish@0.3.4: resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - 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} @@ -1503,9 +1366,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - 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'} @@ -1523,6 +1383,15 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -1531,10 +1400,6 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -1547,19 +1412,12 @@ packages: magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} - markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - mdast-util-directive@3.1.0: - resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} - mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -1584,18 +1442,6 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - - mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} - - mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -1617,9 +1463,6 @@ packages: micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - micromark-extension-directive@3.0.2: - resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} - micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -1641,30 +1484,12 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-mdx-expression@3.0.1: - resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - - micromark-extension-mdx-jsx@3.0.2: - resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} - - micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - - micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - - micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-mdx-expression@2.0.3: - resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -1695,9 +1520,6 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-events-to-acorn@2.0.3: - resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} - micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -1739,6 +1561,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1791,22 +1616,18 @@ packages: package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - pagefind@1.4.0: - resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} - hasBin: true - pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -1827,15 +1648,9 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} @@ -1868,20 +1683,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - - recma-jsx@1.0.1: - resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - - recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -1891,36 +1692,21 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - rehype-expressive-code@0.41.3: - resolution: {integrity: sha512-8d9Py4c/V6I/Od2VIXFAdpiO2kc0SV2qTJsRAaqSIcM9aruW4ASLNe2kOEo1inXAAkIhpFzAHTc358HKbvpNUg==} - - rehype-format@5.0.1: - resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} - rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} - rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} rehype@13.0.2: resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} - remark-directive@3.0.1: - resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} - remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-mdx@3.1.1: - resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} - remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -1934,6 +1720,20 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + restructure@3.0.2: resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} @@ -1985,11 +1785,6 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@8.0.2: - resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} - engines: {node: '>=14.0.0', npm: '>=6.0.0'} - hasBin: true - smol-toml@1.5.2: resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} engines: {node: '>= 18'} @@ -1998,26 +1793,13 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 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==} - starlight-ui-tweaks@0.1.0: - resolution: {integrity: sha512-RY5qfXqfl40EAVVuXkBhfer1igPzFD2F3FrzwPBtbPEurUE933WmO6stHZOEa0TxIwg2KtTD22HAj7hq17KqcQ==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - peerDependencies: - '@astrojs/starlight': '>=0.36' - stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - stream-replace-string@2.0.0: - resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2037,12 +1819,6 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} - style-to-js@1.1.21: - resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - - style-to-object@1.0.14: - resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -2066,6 +1842,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2089,8 +1869,14 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -2134,9 +1920,6 @@ packages: unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} - unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} @@ -2217,9 +2000,6 @@ packages: uploadthing: optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -2277,6 +2057,98 @@ packages: vite: optional: true + volar-service-css@0.0.70: + resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.70: + resolution: {integrity: sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.70: + resolution: {integrity: sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.70: + resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.70: + resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.70: + resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.70: + resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -2303,6 +2175,10 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -2322,10 +2198,32 @@ packages: xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-language-server@1.20.0: + resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} + hasBin: true + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -2366,10 +2264,49 @@ packages: snapshots: + '@astrojs/check@0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.7.4)(typescript@6.0.3)': + dependencies: + '@astrojs/language-server': 2.16.9(prettier-plugin-astro@0.14.1)(prettier@3.7.4)(typescript@6.0.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 6.0.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + '@astrojs/compiler@2.13.0': {} + '@astrojs/compiler@2.13.1': {} + '@astrojs/internal-helpers@0.7.5': {} + '@astrojs/language-server@2.16.9(prettier-plugin-astro@0.14.1)(prettier@3.7.4)(typescript@6.0.3)': + dependencies: + '@astrojs/compiler': 2.13.1 + '@astrojs/yaml2ts': 0.2.4 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.28(typescript@6.0.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28 + '@volar/language-service': 2.4.28 + muggle-string: 0.4.1 + tinyglobby: 0.2.16 + volar-service-css: 0.0.70(@volar/language-service@2.4.28) + volar-service-emmet: 0.0.70(@volar/language-service@2.4.28) + volar-service-html: 0.0.70(@volar/language-service@2.4.28) + volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.7.4) + volar-service-typescript: 0.0.70(@volar/language-service@2.4.28) + volar-service-typescript-twoslash-queries: 0.0.70(@volar/language-service@2.4.28) + volar-service-yaml: 0.0.70(@volar/language-service@2.4.28) + vscode-html-languageservice: 5.6.2 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.7.4 + prettier-plugin-astro: 0.14.1 + transitivePeerDependencies: + - typescript + '@astrojs/markdown-remark@6.3.9': dependencies: '@astrojs/internal-helpers': 0.7.5 @@ -2396,69 +2333,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.12(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3))': - dependencies: - '@astrojs/markdown-remark': 6.3.9 - '@mdx-js/mdx': 3.1.1 - acorn: 8.15.0 - astro: 5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3) - es-module-lexer: 1.7.0 - estree-util-visit: 2.0.0 - hast-util-to-html: 9.0.5 - piccolore: 0.1.3 - rehype-raw: 7.0.0 - remark-gfm: 4.0.1 - remark-smartypants: 3.0.2 - source-map: 0.7.6 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - '@astrojs/prism@3.3.0': dependencies: prismjs: 1.30.0 - '@astrojs/sitemap@3.6.0': - dependencies: - sitemap: 8.0.2 - stream-replace-string: 2.0.0 - zod: 3.25.76 - - '@astrojs/starlight@0.37.0(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3))': - dependencies: - '@astrojs/markdown-remark': 6.3.9 - '@astrojs/mdx': 4.3.12(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)) - '@astrojs/sitemap': 3.6.0 - '@pagefind/default-ui': 1.4.0 - '@types/hast': 3.0.4 - '@types/js-yaml': 4.0.9 - '@types/mdast': 4.0.4 - astro: 5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3) - astro-expressive-code: 0.41.3(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)) - bcp-47: 2.1.0 - hast-util-from-html: 2.0.3 - hast-util-select: 6.0.4 - hast-util-to-string: 3.0.1 - hastscript: 9.0.1 - i18next: 23.16.8 - js-yaml: 4.1.1 - klona: 2.0.6 - magic-string: 0.30.21 - mdast-util-directive: 3.1.0 - mdast-util-to-markdown: 2.1.2 - mdast-util-to-string: 4.0.0 - pagefind: 1.4.0 - rehype: 13.0.2 - rehype-format: 5.0.1 - remark-directive: 3.0.1 - ultrahtml: 1.6.0 - unified: 11.0.5 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - '@astrojs/telemetry@3.3.0': dependencies: ci-info: 4.3.1 @@ -2471,6 +2349,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@astrojs/yaml2ts@0.2.4': + dependencies: + yaml: 2.9.0 + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} @@ -2479,8 +2361,6 @@ snapshots: dependencies: '@babel/types': 7.28.5 - '@babel/runtime@7.28.4': {} - '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -2522,7 +2402,28 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@ctrl/tinycolor@4.2.0': {} + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} '@emnapi/runtime@1.7.1': dependencies: @@ -2685,31 +2586,6 @@ snapshots: '@esbuild/win32-x64@0.27.0': optional: true - '@expressive-code/core@0.41.3': - dependencies: - '@ctrl/tinycolor': 4.2.0 - hast-util-select: 6.0.4 - hast-util-to-html: 9.0.5 - hast-util-to-text: 4.0.2 - hastscript: 9.0.1 - postcss: 8.5.6 - postcss-nested: 6.2.0(postcss@8.5.6) - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.2 - - '@expressive-code/plugin-frames@0.41.3': - dependencies: - '@expressive-code/core': 0.41.3 - - '@expressive-code/plugin-shiki@0.41.3': - dependencies: - '@expressive-code/core': 0.41.3 - shiki: 3.19.0 - - '@expressive-code/plugin-text-markers@0.41.3': - dependencies: - '@expressive-code/core': 0.41.3 - '@img/colour@1.0.0': {} '@img/sharp-darwin-arm64@0.33.5': @@ -2890,58 +2766,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mdx-js/mdx@3.1.1': - dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.15.0 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.0 - estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.6 - markdown-extensions: 2.0.0 - recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.15.0) - recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - source-map: 0.7.6 - unified: 11.0.5 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - '@oslojs/encoding@1.1.0': {} - '@pagefind/darwin-arm64@1.4.0': - optional: true - - '@pagefind/darwin-x64@1.4.0': - optional: true - - '@pagefind/default-ui@1.4.0': {} - - '@pagefind/freebsd-x64@1.4.0': - optional: true - - '@pagefind/linux-arm64@1.4.0': - optional: true - - '@pagefind/linux-x64@1.4.0': - optional: true - - '@pagefind/windows-x64@1.4.0': - optional: true - '@poppinss/colors@4.1.5': dependencies: kleur: 4.1.5 @@ -3073,10 +2899,6 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.8 - '@types/estree@1.0.8': {} '@types/fontkit@2.0.8': @@ -3087,39 +2909,73 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/js-yaml@4.0.9': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mdx@2.0.13': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.3 - '@types/node@17.0.45': {} - '@types/node@24.10.1': dependencies: undici-types: 7.16.0 - '@types/sax@1.2.7': - dependencies: - '@types/node': 17.0.45 - - '@types/unist@2.0.11': {} - '@types/unist@3.0.3': {} '@ungap/structured-clone@1.3.0': {} - acorn-jsx@5.3.2(acorn@8.15.0): + '@volar/kit@2.4.28(typescript@6.0.3)': dependencies: - acorn: 8.15.0 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + typesafe-path: 0.2.2 + typescript: 6.0.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/language-server@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} acorn-walk@8.3.2: {} @@ -3127,6 +2983,17 @@ snapshots: acorn@8.15.0: {} + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -3135,6 +3002,10 @@ snapshots: ansi-regex@6.2.2: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansi-styles@6.2.3: {} anymatch@3.1.3: @@ -3142,22 +3013,13 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@5.0.2: {} - argparse@2.0.1: {} aria-query@5.3.2: {} array-iterate@2.0.1: {} - astring@1.9.0: {} - - astro-expressive-code@0.41.3(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)): - dependencies: - astro: 5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3) - rehype-expressive-code: 0.41.3 - - astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3): + astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@6.0.3)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -3208,20 +3070,20 @@ snapshots: svgo: 4.0.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.9.3) + tsconfck: 3.1.6(typescript@6.0.3) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 unstorage: 1.17.3 vfile: 6.0.3 - vite: 6.4.1(@types/node@24.10.1) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)) + vite: 6.4.1(@types/node@24.10.1)(yaml@2.9.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.25.0(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@6.0.3)(zod@3.25.76) optionalDependencies: sharp: 0.34.5 transitivePeerDependencies: @@ -3267,14 +3129,6 @@ snapshots: base64-js@1.5.1: {} - bcp-47-match@2.0.3: {} - - bcp-47@2.1.0: - dependencies: - is-alphabetical: 2.0.1 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - blake3-wasm@2.1.5: {} boolbase@1.0.0: {} @@ -3306,8 +3160,6 @@ snapshots: character-entities@2.0.2: {} - character-reference-invalid@2.0.1: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -3316,12 +3168,16 @@ snapshots: cli-boxes@3.0.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone@2.1.2: {} clsx@2.1.1: {} - collapse-white-space@2.1.0: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3360,8 +3216,6 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-selector-parser@3.2.0: {} - css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -3410,8 +3264,6 @@ snapshots: diff@5.2.0: {} - direction@2.0.1: {} - dlv@1.1.3: {} dom-serializer@2.0.0: @@ -3434,6 +3286,11 @@ snapshots: dset@3.1.4: {} + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -3446,20 +3303,6 @@ snapshots: es-module-lexer@1.7.0: {} - esast-util-from-estree@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - unist-util-position-from-estree: 2.0.0 - - esast-util-from-js@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - acorn: 8.15.0 - esast-util-from-estree: 2.0.0 - vfile-message: 4.0.3 - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -3518,37 +3361,10 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 + escalade@3.2.0: {} + escape-string-regexp@5.0.0: {} - estree-util-attach-comments@3.0.0: - dependencies: - '@types/estree': 1.0.8 - - estree-util-build-jsx@3.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 - - estree-util-is-identifier-name@3.0.0: {} - - estree-util-scope@1.0.0: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - - estree-util-to-js@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.9.0 - source-map: 0.7.6 - - estree-util-visit@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.3 - estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -3559,21 +3375,20 @@ snapshots: exit-hook@2.2.1: {} - expressive-code@0.41.3: - dependencies: - '@expressive-code/core': 0.41.3 - '@expressive-code/plugin-frames': 0.41.3 - '@expressive-code/plugin-shiki': 0.41.3 - '@expressive-code/plugin-text-markers': 0.41.3 - extend@3.0.2: {} fast-deep-equal@3.1.3: {} + fast-uri@3.1.2: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + flattie@1.1.1: {} fontace@0.3.1: @@ -3596,6 +3411,8 @@ snapshots: fsevents@2.3.3: optional: true + get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} github-slugger@2.0.0: {} @@ -3614,21 +3431,6 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - hast-util-embedded@3.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-is-element: 3.0.0 - - hast-util-format@1.1.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-minify-whitespace: 1.0.1 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.1 - unist-util-visit-parents: 6.0.2 - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -3649,38 +3451,14 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 - hast-util-has-property@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-is-body-ok-link@3.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 - hast-util-minify-whitespace@1.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.1 - hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 - hast-util-phrasing@3.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.1 - hast-util-is-element: 3.0.0 - hast-util-raw@9.1.0: dependencies: '@types/hast': 3.0.4 @@ -3697,45 +3475,6 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-select@6.0.4: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - bcp-47-match: 2.0.3 - comma-separated-tokens: 2.0.3 - css-selector-parser: 3.2.0 - devlop: 1.1.0 - direction: 2.0.1 - hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.1 - hast-util-whitespace: 3.0.0 - nth-check: 2.1.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - hast-util-to-estree@3.1.3: - dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -3750,26 +3489,6 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.6: - dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 @@ -3780,10 +3499,6 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-string@3.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 @@ -3807,37 +3522,18 @@ snapshots: html-void-elements@3.0.0: {} - html-whitespace-sensitive-tag-names@3.0.1: {} - http-cache-semantics@4.2.0: {} - i18next@23.16.8: - dependencies: - '@babel/runtime': 7.28.4 - import-meta-resolve@4.2.0: {} - inline-style-parser@0.2.7: {} - iron-webcrypto@1.2.1: {} - is-alphabetical@2.0.1: {} - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - is-arrayish@0.3.4: {} - is-decimal@2.0.1: {} - is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} - is-hexadecimal@2.0.1: {} - is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -3852,12 +3548,16 @@ snapshots: dependencies: argparse: 2.0.1 + json-schema-traverse@1.0.0: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + kleur@3.0.3: {} kleur@4.1.5: {} - klona@2.0.6: {} - longest-streak@3.1.0: {} lru-cache@10.4.3: {} @@ -3872,8 +3572,6 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 - markdown-extensions@2.0.0: {} - markdown-table@3.0.4: {} mdast-util-definitions@6.0.0: @@ -3882,20 +3580,6 @@ snapshots: '@types/unist': 3.0.3 unist-util-visit: 5.0.0 - mdast-util-directive@3.1.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.2 - transitivePeerDependencies: - - supports-color - mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -3977,55 +3661,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@3.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -4082,16 +3717,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-directive@3.0.2: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - parse-entities: 4.0.2 - micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -4150,57 +3775,6 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-mdx-expression@3.0.1: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-mdx-jsx@3.0.2: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - vfile-message: 4.0.3 - - micromark-extension-mdx-md@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-mdxjs-esm@3.0.0: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 - - micromark-extension-mdxjs@3.0.0: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - micromark-extension-mdx-expression: 3.0.1 - micromark-extension-mdx-jsx: 3.0.2 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -4214,18 +3788,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-factory-mdx-expression@2.0.3: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 - micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -4278,16 +3840,6 @@ snapshots: micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.3: - dependencies: - '@types/estree': 1.0.8 - '@types/unist': 3.0.3 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - vfile-message: 4.0.3 - micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: @@ -4361,6 +3913,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + nanoid@3.3.11: {} neotraverse@0.6.18: {} @@ -4408,27 +3962,8 @@ snapshots: package-manager-detector@1.6.0: {} - pagefind@1.4.0: - optionalDependencies: - '@pagefind/darwin-arm64': 1.4.0 - '@pagefind/darwin-x64': 1.4.0 - '@pagefind/freebsd-x64': 1.4.0 - '@pagefind/linux-arm64': 1.4.0 - '@pagefind/linux-x64': 1.4.0 - '@pagefind/windows-x64': 1.4.0 - pako@0.2.9: {} - parse-entities@4.0.2: - dependencies: - '@types/unist': 2.0.11 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.2.0 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -4442,6 +3977,8 @@ snapshots: dependencies: entities: 6.0.1 + path-browserify@1.0.1: {} + path-to-regexp@6.3.0: {} pathe@2.0.3: {} @@ -4454,15 +3991,7 @@ snapshots: picomatch@4.0.3: {} - postcss-nested@6.2.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + picomatch@4.0.4: {} postcss@8.5.6: dependencies: @@ -4491,35 +4020,6 @@ snapshots: readdirp@4.1.2: {} - recma-build-jsx@1.0.0: - dependencies: - '@types/estree': 1.0.8 - estree-util-build-jsx: 3.0.1 - vfile: 6.0.3 - - recma-jsx@1.0.1(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - estree-util-to-js: 2.0.0 - recma-parse: 1.0.0 - recma-stringify: 1.0.0 - unified: 11.0.5 - - recma-parse@1.0.0: - dependencies: - '@types/estree': 1.0.8 - esast-util-from-js: 2.0.1 - unified: 11.0.5 - vfile: 6.0.3 - - recma-stringify@1.0.0: - dependencies: - '@types/estree': 1.0.8 - estree-util-to-js: 2.0.0 - unified: 11.0.5 - vfile: 6.0.3 - regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -4530,15 +4030,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - rehype-expressive-code@0.41.3: - dependencies: - expressive-code: 0.41.3 - - rehype-format@5.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-format: 1.1.0 - rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -4551,14 +4042,6 @@ snapshots: hast-util-raw: 9.1.0 vfile: 6.0.3 - rehype-recma@1.0.0: - dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.3 - transitivePeerDependencies: - - supports-color - rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 @@ -4572,15 +4055,6 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 - remark-directive@3.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-directive: 3.1.0 - micromark-extension-directive: 3.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -4592,13 +4066,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.1.1: - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4629,6 +4096,14 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + restructure@3.0.2: {} retext-latin@4.0.0: @@ -4768,29 +4243,14 @@ snapshots: sisteransi@1.0.5: {} - sitemap@8.0.2: - dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.7 - arg: 5.0.2 - sax: 1.4.3 - smol-toml@1.5.2: {} source-map-js@1.2.1: {} - source-map@0.7.6: {} - space-separated-tokens@2.0.2: {} - starlight-ui-tweaks@0.1.0(@astrojs/starlight@0.37.0(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3))): - dependencies: - '@astrojs/starlight': 0.37.0(astro@5.16.4(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)) - stoppable@1.1.0: {} - stream-replace-string@2.0.0: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4816,14 +4276,6 @@ snapshots: dependencies: ansi-regex: 6.2.2 - style-to-js@1.1.21: - dependencies: - style-to-object: 1.0.14 - - style-to-object@1.0.14: - dependencies: - inline-style-parser: 0.2.7 - suf-log@2.5.3: dependencies: s.color: 0.0.15 @@ -4849,19 +4301,30 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + trim-lines@3.0.1: {} trough@2.2.0: {} - tsconfck@3.1.6(typescript@5.9.3): + tsconfck@3.1.6(typescript@6.0.3): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 tslib@2.8.1: {} type-fest@4.41.0: {} - typescript@5.9.3: {} + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.3 + + typescript@6.0.3: {} ufo@1.6.1: {} @@ -4917,10 +4380,6 @@ snapshots: '@types/unist': 3.0.3 array-iterate: 2.0.1 - unist-util-position-from-estree@2.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -4960,8 +4419,6 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.1 - util-deprecate@1.0.2: {} - vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -4977,7 +4434,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1(@types/node@24.10.1): + vite@6.4.1(@types/node@24.10.1)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -4988,10 +4445,108 @@ snapshots: optionalDependencies: '@types/node': 24.10.1 fsevents: 2.3.3 + yaml: 2.9.0 - vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.1(@types/node@24.10.1) + vite: 6.4.1(@types/node@24.10.1)(yaml@2.9.0) + + volar-service-css@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-emmet@0.0.70(@volar/language-service@2.4.28): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-html@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.7.4): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + prettier: 3.7.4 + + volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-typescript@0.0.70(@volar/language-service@2.4.28): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.3 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-yaml@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.20.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + vscode-css-languageservice@6.3.10: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.6.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} web-namespaces@2.0.1: {} @@ -5026,6 +4581,12 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -5036,8 +4597,38 @@ snapshots: xxhash-wasm@1.1.0: {} + y18n@5.0.8: {} + + yaml-language-server@1.20.0: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + prettier: 3.7.4 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + yaml: 2.7.1 + + yaml@2.7.1: {} + + yaml@2.9.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 + yocto-queue@1.2.2: {} yocto-spinner@0.2.3: @@ -5063,9 +4654,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + zod-to-ts@1.2.0(typescript@6.0.3)(zod@3.25.76): dependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 3.25.76 zod@3.22.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..5f6885f --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +onlyBuiltDependencies: + - esbuild + - sharp + - workerd diff --git a/public/images/calendar/food-map-en.png b/public/images/calendar/food-map-en.png new file mode 100644 index 0000000..492ef8f Binary files /dev/null and b/public/images/calendar/food-map-en.png differ diff --git a/public/images/calendar/food-map.png b/public/images/calendar/food-map.png new file mode 100644 index 0000000..5c7e995 Binary files /dev/null and b/public/images/calendar/food-map.png differ diff --git a/public/images/cms-guide/bottom-circles.png b/public/images/cms-guide/bottom-circles.png new file mode 100644 index 0000000..512e8a4 Binary files /dev/null and b/public/images/cms-guide/bottom-circles.png differ diff --git a/public/images/cms-guide/hero-bg.png b/public/images/cms-guide/hero-bg.png new file mode 100644 index 0000000..6c3f3ad Binary files /dev/null and b/public/images/cms-guide/hero-bg.png differ diff --git a/public/images/home/hero-bg-texture.png b/public/images/home/hero-bg-texture.png new file mode 100644 index 0000000..6c1f4b2 Binary files /dev/null and b/public/images/home/hero-bg-texture.png differ diff --git a/public/images/home/hero-decoration.png b/public/images/home/hero-decoration.png new file mode 100644 index 0000000..a1447b8 Binary files /dev/null and b/public/images/home/hero-decoration.png differ diff --git a/public/images/home/nix-tile-50.svg b/public/images/home/nix-tile-50.svg new file mode 100644 index 0000000..edc10ad --- /dev/null +++ b/public/images/home/nix-tile-50.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/home/nix-tile.png b/public/images/home/nix-tile.png new file mode 100644 index 0000000..193979a Binary files /dev/null and b/public/images/home/nix-tile.png differ diff --git a/src/assets/badges/normal.webp b/public/images/shared/badges/normal.webp similarity index 100% rename from src/assets/badges/normal.webp rename to public/images/shared/badges/normal.webp diff --git a/src/assets/badges/rainbow.webp b/public/images/shared/badges/rainbow.webp similarity index 100% rename from src/assets/badges/rainbow.webp rename to public/images/shared/badges/rainbow.webp diff --git a/src/assets/badges/trans.webp b/public/images/shared/badges/trans.webp similarity index 100% rename from src/assets/badges/trans.webp rename to public/images/shared/badges/trans.webp diff --git a/src/assets/nameplate.webp b/public/images/shared/nameplate.webp similarity index 100% rename from src/assets/nameplate.webp rename to public/images/shared/nameplate.webp diff --git a/src/assets/nix-cn-dark.svg b/public/images/shared/nix-cn-dark.svg similarity index 100% rename from src/assets/nix-cn-dark.svg rename to public/images/shared/nix-cn-dark.svg diff --git a/src/assets/nix-cn.svg b/public/images/shared/nix-cn.svg similarity index 97% rename from src/assets/nix-cn.svg rename to public/images/shared/nix-cn.svg index b9aa5b4..0f4f4c0 100644 --- a/src/assets/nix-cn.svg +++ b/public/images/shared/nix-cn.svg @@ -1,12 +1,14 @@ - + + + diff --git a/src/assets/nix-flake-logo.svg b/public/images/shared/nix-flake-logo.svg similarity index 100% rename from src/assets/nix-flake-logo.svg rename to public/images/shared/nix-flake-logo.svg diff --git a/public/images/shared/nix-logo-full.png b/public/images/shared/nix-logo-full.png new file mode 100644 index 0000000..618555c Binary files /dev/null and b/public/images/shared/nix-logo-full.png differ diff --git a/public/images/shared/nix-tile-100.svg b/public/images/shared/nix-tile-100.svg new file mode 100644 index 0000000..3b92a0e --- /dev/null +++ b/public/images/shared/nix-tile-100.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/shared/tab-line.svg b/public/images/shared/tab-line.svg new file mode 100644 index 0000000..9835c44 --- /dev/null +++ b/public/images/shared/tab-line.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/images/souvenir/bottom-circles.png b/public/images/souvenir/bottom-circles.png new file mode 100644 index 0000000..2b3d808 Binary files /dev/null and b/public/images/souvenir/bottom-circles.png differ diff --git a/public/images/souvenir/card-snowflake.png b/public/images/souvenir/card-snowflake.png new file mode 100644 index 0000000..b19e9b3 Binary files /dev/null and b/public/images/souvenir/card-snowflake.png differ diff --git a/public/images/souvenir/card-texture.png b/public/images/souvenir/card-texture.png new file mode 100644 index 0000000..48fbc82 Binary files /dev/null and b/public/images/souvenir/card-texture.png differ diff --git a/public/images/souvenir/cta-arrow.png b/public/images/souvenir/cta-arrow.png new file mode 100644 index 0000000..acf80a2 Binary files /dev/null and b/public/images/souvenir/cta-arrow.png differ diff --git a/public/images/souvenir/hero-bg.png b/public/images/souvenir/hero-bg.png new file mode 100644 index 0000000..c743846 Binary files /dev/null and b/public/images/souvenir/hero-bg.png differ diff --git a/src/components/BadgeTemplates.astro b/src/components/BadgeTemplates.astro deleted file mode 100644 index 6d7a83b..0000000 --- a/src/components/BadgeTemplates.astro +++ /dev/null @@ -1,27 +0,0 @@ ---- -import { Image } from 'astro:assets'; -import NormalBadgeTemplate from '@assets/badges/normal.webp'; -import RainbowBadgeTemplate from '@assets/badges/rainbow.webp'; -import TransBadgeTemplate from '@assets/badges/trans.webp'; ---- - -
- NormalBadgeTemplate - RainbowBadgeTemplate - TransBadgeTemplate -
- - diff --git a/src/components/CalendarPage.astro b/src/components/CalendarPage.astro new file mode 100644 index 0000000..2612f59 --- /dev/null +++ b/src/components/CalendarPage.astro @@ -0,0 +1,580 @@ +--- +import Navbar from './Navbar.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import { type Locale, getTranslations } from '../i18n/config'; + +interface Props { + locale: Locale; +} + +const { locale } = Astro.props; +const t = getTranslations(locale); +const tp = t.calendar; +const foodMapSrc = + locale === 'en' ? '/images/calendar/food-map-en.png' : '/images/calendar/food-map.png'; +--- + + + + + +
+

{tp.heading.title}

+

{tp.heading.sub}

+
+ + +
+
+ + + +
+ +
+ +
+

+ {tp.agenda.leadEmoji} + +

+
    + { + tp.agenda.bullets.map((html) => ( +
  • + +
  • + )) + } +
+
+ + + + + +
+

+ {tp.schedule.emoji} + {tp.schedule.title} +

+ +
+
+ {tp.schedule.timeLabel} + {tp.schedule.timeValue} +
+
+ {tp.schedule.flowLabel} +
    + { + tp.schedule.flow.map((item) => ( +
  • + +
  • + )) + } +
+
+
+
+
+ + +
+
+

+ {tp.food.emoji} + {tp.food.title} +

+ +
+ {tp.food.mapAlt} +
+
+
+
+
+
+
+ + diff --git a/src/components/CmsGuidePage.astro b/src/components/CmsGuidePage.astro new file mode 100644 index 0000000..24fee21 --- /dev/null +++ b/src/components/CmsGuidePage.astro @@ -0,0 +1,434 @@ +--- +import Navbar from './Navbar.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import { type Locale, getTranslations } from '../i18n/config'; + +interface Props { + locale: Locale; +} + +const { locale } = Astro.props; +const t = getTranslations(locale); +const tp = t.cmsGuide; +--- + + + + + +
+ +
+

{tp.hero.title}

+ {tp.hero.subs.map((s) =>

{s}

)} +
+
+ + +
+ { + tp.steps.map((step, i) => ( +
+

+ {step.num} + + {step.name} +

+ + {'bodyHtml' in step && step.bodyHtml !== undefined && ( +

+ +

+ )} + + {'bodyHtmls' in step && + step.bodyHtmls !== undefined && + step.bodyHtmls.map((html) => ( +

+ +

+ ))} + + {'list' in step && step.list !== undefined && ( +
    + {step.list.map((item) => ( +
  • {item}
  • + ))} +
+ )} + + {'afterListHtml' in step && step.afterListHtml !== undefined && ( +

+ +

+ )} + + {step.tip?.text && ( +
+

+ + {tp.tipLabel} + {step.tip.text} +

+
+ )} +
+ )) + } +
+ + + +
+ + diff --git a/src/components/HomePage.astro b/src/components/HomePage.astro new file mode 100644 index 0000000..09cb1d6 --- /dev/null +++ b/src/components/HomePage.astro @@ -0,0 +1,576 @@ +--- +import Navbar from './Navbar.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import { type Locale, getTranslations, getPageUrl } from '../i18n/config'; + +interface Props { + locale: Locale; +} + +const { locale } = Astro.props; +const t = getTranslations(locale); +const tp = t.home; + +const url = (p: Parameters[1]) => getPageUrl(locale, p); +--- + + + + + +
+ + + + + + + + + + +
+
+

+ {tp.hero.conferenceTitle} + {tp.hero.year} +

+

+ {tp.hero.headlineBefore}{tp.hero.headlineBadge} +

+

{tp.hero.lead}

+ +
+
+
+
+ + + + + diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro new file mode 100644 index 0000000..cbaf5c0 --- /dev/null +++ b/src/components/Navbar.astro @@ -0,0 +1,318 @@ +--- +import { type Locale, type PageSlug, getTranslations, getPageUrl, LOCALES } from '../i18n/config'; + +type Page = PageSlug; + +interface Props { + locale: Locale; + activePage: Page; +} + +const { locale, activePage } = Astro.props; +const t = getTranslations(locale); +const otherLocale = LOCALES.find((l) => l !== locale) ?? LOCALES[0]; + +const url = (l: Locale, p: Page) => getPageUrl(l, p); +const switchHref = url(otherLocale, activePage); +--- + + + + diff --git a/src/components/SouvenirPage.astro b/src/components/SouvenirPage.astro new file mode 100644 index 0000000..0c5152d --- /dev/null +++ b/src/components/SouvenirPage.astro @@ -0,0 +1,637 @@ +--- +import Navbar from './Navbar.astro'; +import BaseLayout from '../layouts/BaseLayout.astro'; +import { type Locale, getTranslations } from '../i18n/config'; + +interface Props { + locale: Locale; +} + +const { locale } = Astro.props; +const t = getTranslations(locale); +const tp = t.souvenir; +const ts = tp.comingSoon; +--- + + + + + +
+ +
+

{tp.hero.title}

+

{tp.hero.sub}

+
+
+ + +
+
+ + +
+

{tp.card.title}

+

{tp.card.body}

+ +
+
+
+ + + + + + +
+ + + + diff --git a/src/content.config.ts b/src/content.config.ts deleted file mode 100644 index d68e795..0000000 --- a/src/content.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineCollection } from 'astro:content'; -import { docsLoader } from '@astrojs/starlight/loaders'; -import { docsSchema } from '@astrojs/starlight/schema'; - -export const collections = { - docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), -}; diff --git a/src/content/docs/LICENSE b/src/content/docs/LICENSE deleted file mode 100644 index cbe5ad1..0000000 --- a/src/content/docs/LICENSE +++ /dev/null @@ -1,437 +0,0 @@ -Attribution-NonCommercial-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International -Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NonCommercial-ShareAlike 4.0 International Public License -("Public License"). To the extent this Public License may be -interpreted as a contract, You are granted the Licensed Rights in -consideration of Your acceptance of these terms and conditions, and the -Licensor grants You such rights in consideration of benefits the -Licensor receives from making the Licensed Material available under -these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-NC-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution, NonCommercial, and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. NonCommercial means not primarily intended for or directed towards - commercial advantage or monetary compensation. For purposes of - this Public License, the exchange of the Licensed Material for - other material subject to Copyright and Similar Rights by digital - file-sharing or similar means is NonCommercial provided there is - no payment of monetary compensation in connection with the - exchange. - - l. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - m. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - n. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part, for NonCommercial purposes only; and - - b. produce, reproduce, and Share Adapted Material for - NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties, including when - the Licensed Material is used other than for NonCommercial - purposes. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-NC-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database for NonCommercial purposes - only; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - including for purposes of Section 3(b); and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/src/content/docs/calendar.mdx b/src/content/docs/calendar.mdx deleted file mode 100644 index d99e90e..0000000 --- a/src/content/docs/calendar.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: '议程日历' -description: '议程日历' -sidebar: - label: '议程日历' ---- - -点击右上角“月”按钮,选择“日程”视图,以获得最佳的查看体验。 - - diff --git a/src/content/docs/code-of-conduct.mdx b/src/content/docs/code-of-conduct.mdx deleted file mode 100644 index 99c570c..0000000 --- a/src/content/docs/code-of-conduct.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: '参会行为准则' -description: '本行为准则用于说明我们对所有 Nix CN Meetup #2 参与者的基本期待。我们希望每一位参与者都能在活动中感到被尊重、被接纳,并拥有安全、友好的交流体验。' -sidebar: - label: '参会行为准则' ---- - -# Nix CN Meetup #2 - 行为准则 - -本行为准则用于说明我们对所有 Nix CN Meetup #2 参与者的基本期待。我们希望每一位参与者都能在活动中感到被尊重、被接纳,并拥有安全、友好的交流体验。 - -## 尊重与友善 - -- 请尽量以开放、少偏见的态度与他人相处。每个人的背景、经历和表达方式都可能不同。 - -- 与他人互动时,请保持体贴与尊重,关注他人的需求和界限。这包括尊重个人空间、认真倾听对方发言,以及避免打断或压迫他人。 - -- 默认使用性别中立、不过度假设的称呼方式。当你清楚了解对方偏好的称呼或代词时再使用;如果不确定,可以礼貌地询问。请尊重只使用姓名、或不使用任何代词的选择,并支持他人正确使用其偏好的称呼方式。 - -## 自我照顾 - -- 请为自己的身心状态负责,并优先照顾好自己的感受与需求。如果你在任何对话或场合中感到不适,你随时可以选择退出、离开或寻求帮助,这完全是被尊重的选择。 - -## 开放沟通与相互支持 - -- 如果你不确定自己的言行是否合适,欢迎主动询问。界限和是否构成冒犯,应以当事人的感受为准。 - -- 面对分歧或不同观点时,请保持开放和好奇,尝试理解对方的立场,并愿意倾听,而不是急于否定或争论。 - -- 如果有人向你寻求支持,或你注意到可能存在不适或风险的情况,请在尊重当事人意愿的前提下提供帮助。如有需要,也可以及时联系活动工作人员。 - -- 你不需要独自承担。当你不确定该如何处理某种情况时,随时可以向活动工作人员寻求建议或协助。 - -## 承担责任与持续学习 - -- 每个人都有可能犯错。当你意识到自己的言行给他人带来不适时,请真诚道歉,并愿意倾听反馈。我们鼓励把反馈视为彼此学习、共同成长的机会。 - -## 尊重活动环境 - -- 请尊重活动场地及其相关规定,共同维护整洁、舒适的公共空间。 - -## 举报与求助 - -如果你亲身经历或目睹了违反本行为准则的行为,或因任何原因需要帮助: - -- 请联系活动组织者或指定的支持人员。 - -- 我们会对所有反馈和举报进行谨慎、保密的处理。活动组织者有权并有责任根据情况采取适当的应对措施。 - -## 改编说明 - -本行为准则参考并改编自 NixCon 2025 行为准则及 bUm 行为准则。 diff --git a/src/content/docs/en/calendar.mdx b/src/content/docs/en/calendar.mdx deleted file mode 100644 index 9b50580..0000000 --- a/src/content/docs/en/calendar.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 'Agenda Calendar' -description: 'Agenda Calendar' -sidebar: - label: 'Agenda Calendar' ---- - -Click "Month" button, select "Agenda" view, to get the best viewing experience. - - diff --git a/src/content/docs/en/code-of-conduct.mdx b/src/content/docs/en/code-of-conduct.mdx deleted file mode 100644 index f3281e6..0000000 --- a/src/content/docs/en/code-of-conduct.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: 'Code Of Conduct' -description: 'This Code of Conduct outlines our expectations for all participants at Nix CN Meetup #2. We are committed to providing a respectful and inclusive experience for everyone.' -sidebar: - label: 'Code Of Conduct' ---- - -# Nix CN Meetup #2 - Code of Conduct - -This Code of Conduct outlines our expectations for all participants at Nix CN Meetup #2. We are committed to providing a respectful and inclusive experience for everyone. - -## Respectful Interaction - -- Encounter everyone with as little bias as possible. - -- Act considerately and respectfully towards others, their needs, and boundaries. This includes respecting personal space, listening attentively, and refraining from interrupting. - -- Use gender-neutral ways of addressing people by default. Only use pronouns when you know which pronouns (if any) an individual prefers. Ask respectfully how others wish to be addressed. Respect preferences for names only or no pronouns. Support others in using correct pronouns. - -## Personal Responsibility - -- Take responsibility for your own wellbeing and look after your needs. You can leave any conversation or situation at any time if you feel uncomfortable. - -## Openness & Support - -- If you are unsure if your behaviour is acceptable, ask. Boundaries and discrimination are defined by those who experience them. - -- Approach conflicts or differences of opinion with openness, curiosity, and a willingness to listen. - -- If someone asks for your support or if you notice something concerning, offer support if appropriate, but respect their wishes. Alert event staff if necessary. - -- You are not alone. Ask for help or advice from event staff when you don't know what to do. - -## Accountability & Learning - -- Apologize when you make mistakes and be open to criticism and feedback. View feedback as an opportunity to learn. - -## Respect for the Environment - -- Respect the event venue and any specific rules it may have. Help keep shared spaces tidy. - -## Reporting & Assistance - -If you experience or witness behavior that violates this Code of Conduct, or if you need assistance for any reason: - -- Please contact event organizers or designated support staff. - -- All reports will be treated with discretion. Event organizers are empowered to take appropriate actions in response to violations. - -## Adaptation - -This Code of Conduct is adapted from the NixCon 2025 Code of Conduct and the bUm Code of Conduct. diff --git a/src/content/docs/en/index.mdx b/src/content/docs/en/index.mdx deleted file mode 100644 index 6376c2c..0000000 --- a/src/content/docs/en/index.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 'Nix CN' -description: Explore a reproducible future with the Nix CN community -template: splash -hero: - tagline: Explore a reproducible future with the Nix CN community - image: - file: ../../../assets/nix-flake-logo.svg - actions: - - text: 'Meetup #2 Attendee Guide' - link: /en/meetup-2-guide - icon: right-arrow - - text: Join event group - link: /en/meetup-2-guide#event-groups - variant: minimal ---- diff --git a/src/content/docs/en/meetup-2-guide.mdx b/src/content/docs/en/meetup-2-guide.mdx deleted file mode 100644 index ff59465..0000000 --- a/src/content/docs/en/meetup-2-guide.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: 'Nix CN Meetup #2 Guide' -description: 'Nix CN Meetup #2 is the second Nix-themed meetup in China. We aim to bring together Nix enthusiasts, developers, and practitioners to share usage experiences, best practices, and real-world applications of Nix.' -sidebar: - label: 'Meetup #2 Guide' ---- - -import { LinkButton } from '@astrojs/starlight/components'; - -Nix CN Meetup #2 is the second Nix-themed gathering in China. We aim to bring together Nix enthusiasts, developers, and practitioners to share their experiences, best practices, and use cases of Nix in various scenarios. - -## Event Information - -- Date (UTC+8): 2025/12/27 (Sat.) ~ 2025/12/28 (Sun.) -- Checkin Time (UTC+8): 9:30 - 10:00 -- Venue: Tongji Jingdu Office Building, No. 25 Yixian Road, Yangpu District, Shanghai (Wait for event staff) -- Live: [youtube:@nixcn-meetup](https://youtube.com/@nixcn-meetup) - - - Register (Chinese) - - - Propose a talk (Chinese) - - - Request Souvenir Customization - - -## Event Groups - - - Telegram event group - - - Matrix event group - - -## Transportation - -### Arriving in Shanghai - -Shanghai is accessible by air or by rail. The city has two major airports — **Shanghai Pudong International Airport (PVG)** and **Shanghai Hongqiao International Airport (SHA)** — and several railway stations, including **Shanghai Hongqiao Station**, **Shanghai Station**, **Shanghai South Station**, and **Shanghai Songjiang Station**. -Arriving via Jinshan North Rail Station or Nanxiang North Rail Station is possible but strongly discouraged because they are exceptionally far from the venue. Please pay attention to the distinctions when purchasing tickets. - -Due to the considerable distance from all aforementioned transport hubs to the venue, please take careful note of the **first and last service times** of public transportation (metro, bus, etc.) and allow ample time for transfers. - -### Getting to the Venue - -- From Hongqiao Railway Station / Hongqiao Airport: Take Metro Line 2 to Zhongshan Park Station, transfer to Metro Line 3 to Dabaishu Station, then walk to the venue. - -- From Pudong Airport: Take Metro Line 2 or Maglev to Longyang Road Station, transfer to Metro Line 18 to Fudan University Station, then walk to the venue. - -- From Shanghai Railway Station / Shanghai South Railway Station: Take Metro Line 3 to Dabaishu Station, then walk to the venue. - -- From Shanghai Songjiang Station: Take Metro Line 9 to Yishan Road Station, transfer to Metro Line 3 to Dabaishu Station, then walk to the venue. diff --git a/src/content/docs/en/souvenir-customization.mdx b/src/content/docs/en/souvenir-customization.mdx deleted file mode 100644 index 1a7c121..0000000 --- a/src/content/docs/en/souvenir-customization.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: 'Souvenir Customization' -description: 'Souvenir Customization' -sidebar: - label: 'Souvenir Customization' ---- - -import { Image } from 'astro:assets'; -import { LinkButton } from '@astrojs/starlight/components'; -import BadgeTemplates from '@components/BadgeTemplates.astro'; -import Nameplate from '@assets/nameplate.webp'; - -# Attendee Badge Customization - -We offer three attendee badge templates: - - - -For all attendees, the first template style (Nix color scheme) will be used by default. - -The `#name` and `#type` fields on the badge will be determined by the information you provide during registration and your attendance role (Attendee / Volunteer / Speaker). - -To select a different template or make other customizations, file a request here: - - - Fill a Souvenir Customization Request form (Chinese) - - -※ The following customizations are currently supported. -Please fill them out in the "Attendee Badge Customization" section of the Souvenir Customization Request Form. - -- color of the the text at bottom - - Please provide the specific location of the text to be modified and the color HEX code (e.g., `#5277C3`). -- the snowflake logo in the bottom right Corner - - Please use [this file](https://meetup-files.nixos.org.cn/nixos-template.svg) as the basis for your customization. - - Please **do** keep the aspect ratio of the original file. - - After modification, please export a **PNG file with transparent background**, maintaining the original aspect ratio, and send the file to [nixcn-meetup@sne.moe](mailto:nixcn-meetup@sne.moe) using the email address provided in the Souvenir Customization Request form. - -# Name Plate Customization - -Nameplate - -※ The souvenir name plate only supports customization of the subtitle. -Please fill this out in the Name Plate Customization section of the Souvenir Customization Request form mentioned above. - -- The souvenir name plate is made from cut metal. -- The subtitle should be less than 20 half-width characters wide in English (full-width characters such as CJK characters each count as 2 half-width characters). diff --git a/src/content/docs/en/volunteers.mdx b/src/content/docs/en/volunteers.mdx deleted file mode 100644 index f83311d..0000000 --- a/src/content/docs/en/volunteers.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: 'Volunteer Staffing' -description: 'Volunteer Staffing' -sidebar: - label: 'Volunteer Staffing' ---- - -import { LinkButton } from '@astrojs/starlight/components'; - -We are recruiting volunteers for Nix CN Meetup #2! - - - Fill out the Volunteer Application Form (Chinese) - - -Open roles are as follows: - -- On-site Support (3 people) - - Handle check-in and souvenir distribution - - Provide guidance and answer general inquiries - - Pass the microphone for audience questions -- Online Streaming Support (2 people) - - Monitor livestream status - - Answer general online inquiries -- Refreshment Pickup (~5 people) - - Heavy lifting involved. -- Venue Setup (2 people) - - Please arrive at the venue 3 days before the event starts. -- Flexible (≤10 people) - - Tasks assigned based on real-time needs. diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx deleted file mode 100644 index 3a42993..0000000 --- a/src/content/docs/index.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 'Nix CN' -description: 与 Nix 中文社群一起探索可复现的未来 -template: splash -hero: - tagline: 与 Nix 中文社群一起探索可复现的未来 - image: - file: ../../assets/nix-flake-logo.svg - actions: - - text: 'Meetup #2 参会指南' - link: /meetup-2-guide - icon: right-arrow - - text: 加入活动群组 - link: /meetup-2-guide#%E6%B4%BB%E5%8A%A8%E7%BE%A4%E7%BB%84 - variant: minimal ---- diff --git a/src/content/docs/meetup-2-guide.mdx b/src/content/docs/meetup-2-guide.mdx deleted file mode 100644 index 15d8b77..0000000 --- a/src/content/docs/meetup-2-guide.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: 'Nix CN Meetup #2 参会指南' -description: 'Nix CN Meetup #2 是国内第二次以 Nix 为主题的聚会。我们希望汇聚国内 Nix 爱好者、开发者和实践者,共同分享 Nix 的使用经验、最佳实践以及在不同场景下的应用案例。' -sidebar: - label: 'Meetup #2 参会指南' ---- - -import { LinkButton } from '@astrojs/starlight/components'; - -Nix CN Meetup #2 是国内第二次以 Nix 为主题的聚会。我们希望汇聚国内 Nix 爱好者、开发者和实践者,共同分享 Nix 的使用经验、最佳实践以及在不同场景下的应用案例。 - -## 会议信息 - -- 日期(UTC+8):2025/12/27 (Sat.) ~ 2025/12/28 (Sun.) -- 签到时间(UTC+8): 9:30 - 10:00 -- 线下会议地点:上海市杨浦区逸仙路25号同济·晶度写字楼(于大堂前台等待活动工作人员引导) -- 线上直播地址:[youtube:@nixcn-meetup](https://youtube.com/@nixcn-meetup) - - - 填写报名表 - - - 填写议程收集表 - - - 纪念品定制说明 - - -## 活动群组 - - - Telegram 活动群组 - - - Matrix 活动群组 - - -## 交通信息 - -### 抵达上海 - -可通过航空、铁路抵达上海。上海有 **浦东国际机场**、**虹桥国际机场** 两大机场和 **上海虹桥站**、**上海站**、**上海南站**、**上海松江站** 等火车站。 -不建议通过金山北站、南翔北站抵达上海,因为它们位于上海郊区,距离市中心和会议地点太远;购票时请注意不要买错。 - -从各大交通枢纽到达会场的路程均较远,请留意地铁、公交等公共交通的**首末班车时间**以免错过末班车,并预留充足的换乘时间。 - -### 前往会场 - -- 虹桥火车站/虹桥机场:乘坐地铁2号线至中山公园站, - 换乘地铁3号线至大柏树站,步行到达会场。 - -- 浦东机场:乘坐地铁2号线/磁浮快线至龙阳路站, - 换乘地铁18号线至复旦大学站,步行到达会场。 - -- 上海火车站/上海南站:乘坐地铁3号线至大柏树站,步行到达会场。 - -- 上海松江站:乘坐地铁9号线至宜山路站, - 换乘地铁3号线至大柏树站,步行到达会场。 diff --git a/src/content/docs/souvenir-customization.mdx b/src/content/docs/souvenir-customization.mdx deleted file mode 100644 index 57f0571..0000000 --- a/src/content/docs/souvenir-customization.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: '纪念品定制说明' -description: '纪念品定制说明' -sidebar: - label: '纪念品定制说明' ---- - -import { Image } from 'astro:assets'; -import { LinkButton } from '@astrojs/starlight/components'; -import BadgeTemplates from '@components/BadgeTemplates.astro'; -import Nameplate from '@assets/nameplate.webp'; - -# 参会证定制 - -我们提供三种预设的参会证模板: - - - -对于所有参会者,默认会使用第一种模板样式(Nix 配色)制作参会证。 - -参会证上的 `#name` 和 `#type` 字段,将由您在报名时填写的信息和您的与会身份(参会者/志愿者/讲者)决定。 - -如果需要选择模板或有其他定制需求,您可以在这里提交申请: - - - 填写纪念品定制需求表 - - -※ 目前支持以下内容的定制。请在「纪念品定制需求表」的「参会证定制」分区中进行填写。 - -- 下方文字颜色定制 - - 请提供具体需要修改的文字位置和颜色HEX码(例:`#5277C3`)。 -- 右下角雪花标志定制 - - 请使用[此文件](https://meetup-files.nixos.org.cn/nixos-template.svg)作为定制基础进行修改。 - - 请勿修改原文件的比例。 - - 修改后,请维持原比例导出**透明底 PNG 文件**,并使用「纪念品定制需求表」中填写的邮件地址,发送文件到 [nixcn-meetup@sne.moe](mailto:nixcn-meetup@sne.moe)。 - -# 铭牌定制 - -Nameplate - -※ 纪念品铭牌仅支持定制副标题。请在上述「纪念品定制需求表」的「铭牌定制」分区中一并填写。 - -- 纪念品铭牌为金属切削制成。 -- 副标题字数应小于 20 个英文字符宽度(中文字符宽度计为 2)。 diff --git a/src/content/docs/volunteers.mdx b/src/content/docs/volunteers.mdx deleted file mode 100644 index 48055d1..0000000 --- a/src/content/docs/volunteers.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: '志愿者人员安排' -description: '志愿者人员安排' -sidebar: - label: '志愿者人员安排' ---- - -import { LinkButton } from '@astrojs/starlight/components'; - -我们正在为 Nix CN Meetup #2 招募志愿者! - - - 填写志愿者报名表 - - -开放岗位如下: - -- 场务(3人) - - 处理签到和纪念品分发 - - 提供指引答疑 - - 在提问环节传递话筒等 -- 直播维护(2人) - - 监控直播状态 - - 回答线上提问 -- 茶歇取货(~5人) - - 请确保体力充足。 -- 场地准备(2人) - - 请在活动开始前3天到达会场。 -- 自由岗位(≤10人) - - 灵活处理场中其他事务 diff --git a/src/i18n/config.ts b/src/i18n/config.ts new file mode 100644 index 0000000..3bc711d --- /dev/null +++ b/src/i18n/config.ts @@ -0,0 +1,27 @@ +import translations from './translations.json'; + +export const LOCALES = ['zh-CN', 'en'] as const; +export type Locale = (typeof LOCALES)[number]; +export const defaultLocale: Locale = 'zh-CN'; + +export function getLocalePaths() { + return LOCALES.map((lang) => ({ params: { lang } })); +} + +export function getTranslations(locale: Locale) { + return translations[locale]; +} + +export const PAGE_SLUGS = { + home: '', + calendar: 'calendar', + cmsGuide: 'cms-guide', + souvenir: 'souvenir', +} as const; + +export type PageSlug = keyof typeof PAGE_SLUGS; + +export function getPageUrl(locale: Locale, page: PageSlug): string { + const slug = PAGE_SLUGS[page]; + return slug ? `/${locale}/${slug}` : `/${locale}/`; +} diff --git a/src/i18n/translations.json b/src/i18n/translations.json new file mode 100644 index 0000000..5bbfaae --- /dev/null +++ b/src/i18n/translations.json @@ -0,0 +1,334 @@ +{ + "zh-CN": { + "nav": { + "home": "HOME", + "calendar": "活动指南", + "cmsGuide": "CMS 系统指引", + "souvenir": "纪念品信息", + "ariaLogoHome": "NixCN 首页", + "ariaMain": "主导航", + "ariaMobile": "移动导航", + "ariaMenu": "打开导航菜单", + "ariaTelegram": "Telegram 群组", + "ariaMatrix": "Matrix 频道", + "ariaLangSwitch": "切换语言 / Switch Language" + }, + "home": { + "meta": { + "htmlLang": "zh-CN", + "title": "NixCN Conference 2605", + "description": "NixCN Conference 2605 — 一次面向中文社区的 Nix / NixOS 线下聚会,让真实的实践、问题与探索,在现场被看见。" + }, + "hero": { + "conferenceTitle": "NixCN Conference", + "year": "2605", + "headlineBefore": "让你的\u00a0", + "headlineBadge": "Nix", + "headlineAfter": "\u00a0实践被看见", + "lead": "欢迎回来相聚。这是又一次面向中文社区的 Nix / NixOS 线下聚会——更丰富,也更好玩。我们希望把正在使用 Nix、研究 Nix,或刚刚开始了解 Nix 的人聚在一起。让真实的实践、问题与探索,在现场被看见。", + "ctaPrimary": "报名参会\u00a0→", + "ctaSecondary": "CMS 系统指引\u00a0👈" + } + }, + "calendar": { + "meta": { + "htmlLang": "zh-CN", + "title": "活动指南 · NixCN Conference 2605", + "description": "NixCN Conference 2605 活动指南 — 议程安排、会议时间、周边美食地图,让你的参会体验更具体。" + }, + "heading": { + "title": "活动指南", + "sub": "如果你对 Nix 有一点好奇,这里可能会给你一个更具体的答案。" + }, + "agenda": { + "leadEmoji": "🌟", + "leadHtml": "本次活动以 议题分享(Talk Session) 为主。", + "bullets": [ + "每个议题分享约 30 分钟", + "每场议题结束后设有约 10 分钟交流 / 提问环节", + "下午约 15:00 设置茶歇时间" + ] + }, + "schedule": { + "emoji": "📅", + "title": "会议安排", + "timeLabel": "会议时间:", + "timeValue": "2026/06/13 (Sat.) ~ 2026/06/14 (Sun.)", + "flowLabel": "当天流程:", + "flow": [ + "签到时间:08:30 – 09:30", + "议题分享:09:30 开始", + "午休时间:12:00 – 14:00", + "下午议题:14:00 – 18:00", + "活动结束:18:30 前" + ] + }, + "food": { + "emoji": "🍜", + "title": "美食指引", + "mapAlt": "NixCN Conference 2605 会场周边美食地图,标注了 2-13 分钟步行距离内的推荐餐厅" + } + }, + "cmsGuide": { + "meta": { + "htmlLang": "zh-CN", + "title": "CMS 系统指引 · NixCN Conference 2605", + "description": "NixCN Conference 2605 CMS 系统指引 — 邮箱登录、查看活动、身份认证、提交议程、议程审核、入场签到的完整使用流程。" + }, + "hero": { + "title": "CMS 系统指引", + "subs": [ + "通过报名系统,你可以完成活动报名、身份认证、议程提交,以及后续入场签到等操作。", + "首次使用无需提前注册,使用邮箱登录后,系统会自动创建账号。" + ] + }, + "tipBell": "🔔", + "tipLabel": "提示:", + "steps": [ + { + "id": "step-01", + "num": "01", + "name": "使用邮箱登录", + "bodyHtml": "进入报名系统后,输入任意可正常接收邮件的邮箱,即可获取登录链接。
首次登录时,系统会自动为你创建账号。你只需要根据提示设置用户名和昵称,即可进入系统。", + "tip": { + "kind": "inline", + "text": "请尽量使用常用邮箱登录哦。后续活动报名、身份认证、议程提交和会务通知,都将与该邮箱关联。" + } + }, + { + "id": "step-02", + "num": "02", + "name": "查看近期活动", + "bodyHtml": "登录后,你可以在「活动列表」中查看当前开放的会议活动。
选择对应活动后,可以进入活动详情页,查看会议时间、地点、活动说明、报名状态与相关操作入口。
你可以在这里完成:", + "list": ["加入活动", "查看活动详情", "提交议程", "查看已加入的活动"] + }, + { + "id": "step-03", + "num": "03", + "name": "加入活动并完成身份认证", + "bodyHtmls": [ + "点击「加入活动」后,系统会提示你完成身份认证。", + "身份认证用于确认参会者身份,保障现场入场、签到和会务管理的准确性。认证信息仅用于本次活动身份核验,我们会妥善保护你的个人信息安全,你填写的身份信息会在 30 天内销毁。", + "你可以选择以下方式完成认证:" + ], + "list": ["身份证认证", "护照认证"], + "afterListHtml": "完成认证后,即可继续参与活动相关操作。", + "tip": { + "kind": "inline", + "text": "需要填写个人有效证件的真实信息哦。" + } + }, + { + "id": "step-04", + "num": "04", + "name": "提交议程", + "bodyHtml": "加入活动后,你可以在活动页面提交议程。
提交时需要填写议程名称、简要描述和预计分享时长等信息。请尽量清晰说明你的分享主题、内容方向和希望讨论的问题,方便主办方进行审核与安排。" + }, + { + "id": "step-05", + "num": "05", + "name": "议程审核与排期", + "bodyHtmls": [ + "提交后的议程将由主办方统一审核。
我们会根据主题相关性、内容完整度、分享价值和会议整体安排进行筛选。通过审核的议程将进入排期流程。", + "最终议程预计将在会议开始前两周进行公示。
请以后续官网或活动页面发布的信息为准。" + ] + }, + { + "id": "step-06", + "num": "06", + "name": "入场码和签到码", + "bodyHtml": "活动开始后,系统将为已加入活动的参会者生成入场码和签到码。
入场码和签到码是你现场参会的重要凭证。到达会场后,请根据工作人员指引,在对应环节出示使用。" + } + ] + }, + "souvenir": { + "meta": { + "htmlLang": "zh-CN", + "title": "纪念品信息 · NixCN Conference 2605", + "description": "NixCN Conference 2605 纪念品信息 — DIY 个性化参会证,提前解锁活动限定纪念品定制服务。" + }, + "hero": { + "title": "纪念品信息", + "sub": "打造你的专属参会名片!你可以在此 DIY 个性化参会证,并提前解锁更多活动限定纪念品信息。" + }, + "card": { + "title": "NixCN Conference 2605 打造你的专属参会证 ✨", + "body": "提供纪念品的个性化设定服务。点击下方按钮跳转至外部定制通道,录入你的专属身份参数以生成定制化参会证。", + "cta": "开启专属定制", + "ctaUrl": "https://forms.office.com/Pages/DesignPageV2.aspx?subpage=design&FormId=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAZ__u0jrMtUODNTWUpJSEs0STZZWThNTTJVUlNHN01OQy4u&Token=f0e798fadec04532bf2ef8b474a4d7b2" + }, + "comingSoon": { + "title": "定制通道暂未开放", + "body": "纪念品个性化定制功能正在准备中,敬请期待。通道开放后,点击下方按钮即可跳转至外部表单完成定制。", + "close": "知道了", + "ariaClose": "关闭弹窗" + } + } + }, + "en": { + "nav": { + "home": "HOME", + "calendar": "Event Guide", + "cmsGuide": "CMS Guide", + "souvenir": "Souvenirs", + "ariaLogoHome": "NixCN Home", + "ariaMain": "Primary navigation", + "ariaMobile": "Mobile navigation", + "ariaMenu": "Open navigation menu", + "ariaTelegram": "Telegram group", + "ariaMatrix": "Matrix channel", + "ariaLangSwitch": "Switch Language / 切换语言" + }, + "home": { + "meta": { + "htmlLang": "en", + "title": "NixCN Conference 2605", + "description": "NixCN Conference 2605 — an in-person Nix / NixOS gathering for the Chinese community, where real-world practice, questions and exploration get to be seen onstage." + }, + "hero": { + "conferenceTitle": "NixCN Conference", + "year": "2605", + "headlineBefore": "Let your\u00a0", + "headlineBadge": "Nix", + "headlineAfter": "practice
be seen", + "lead": "Welcome back to the table. This is another in-person Nix / NixOS meetup for the Chinese community — richer, and more fun. We want to bring together people who are already using Nix, studying Nix, or just starting to learn about Nix. Let real practice, questions and exploration be seen onstage.", + "ctaPrimary": "Sign up\u00a0→", + "ctaSecondary": "CMS Guide\u00a0👈" + } + }, + "calendar": { + "meta": { + "htmlLang": "en", + "title": "Event Guide · NixCN Conference 2605", + "description": "NixCN Conference 2605 Event Guide — agenda, schedule, and a nearby food map to make your conference experience more concrete." + }, + "heading": { + "title": "Event Guide", + "sub": "If you are a little curious about Nix, this page may give you a more concrete answer." + }, + "agenda": { + "leadEmoji": "🌟", + "leadHtml": "This event centers on Talk Sessions.", + "bullets": [ + "Each talk runs for about 30 minutes", + "Every talk is followed by about 10 minutes of discussion / Q&A", + "A tea break is scheduled around 15:00 in the afternoon" + ] + }, + "schedule": { + "emoji": "📅", + "title": "Conference schedule", + "timeLabel": "Conference dates:", + "timeValue": "2026/06/13 (Sat.) ~ 2026/06/14 (Sun.)", + "flowLabel": "Daily flow:", + "flow": [ + "Check-in: 08:30 – 09:30", + "Talks start: 09:30", + "Lunch break: 12:00 – 14:00", + "Afternoon talks: 14:00 – 18:00", + "Wrap up before: 18:30" + ] + }, + "food": { + "emoji": "🍜", + "title": "Food guide", + "mapAlt": "NixCN Conference 2605 nearby food map, with recommended restaurants within a 2–13 minute walk from the venue" + } + }, + "cmsGuide": { + "meta": { + "htmlLang": "en", + "title": "CMS Guide · NixCN Conference 2605", + "description": "NixCN Conference 2605 CMS Guide — the full flow for email login, browsing events, identity verification, talk submission, talk review and on-site check-in." + }, + "hero": { + "title": "CMS Guide", + "subs": [ + "Through the registration system you can sign up for events, complete identity verification, submit talks, and check in on-site.", + "First-time users do not need to register in advance. Log in with your email and the system will create your account automatically." + ] + }, + "tipBell": "🔔", + "tipLabel": "Tip:", + "steps": [ + { + "id": "step-01", + "num": "01", + "name": "Log in with your email", + "bodyHtml": "Once you open the registration system, enter any email address that can receive mail and you will get a login link.
On first login the system creates an account for you automatically. Just follow the prompts to set a username and display name, and you are in.", + "tip": { + "kind": "inline", + "text": "Please use an email address you check often. Future event sign-ups, identity verification, talk submissions and event notifications will all be tied to this address." + } + }, + { + "id": "step-02", + "num": "02", + "name": "Browse upcoming events", + "bodyHtml": "Once logged in, you can browse currently open events on the Events page.
Select an event to open its detail page, where you can see the date, venue, description, registration status and the action entries you need.
Here you can:", + "list": ["Join the event", "View event details", "Submit a talk", "View events you have joined"] + }, + { + "id": "step-03", + "num": "03", + "name": "Join an event and complete identity verification", + "bodyHtmls": [ + "Once you click Join, the system will prompt you to complete identity verification.", + "Identity verification is used to confirm attendee identity and to ensure accurate on-site entry, check-in and event management. The information is used only for verifying your identity for this event. We take care to protect your personal information, and the identity data you submit will be destroyed within 30 days.", + "You can verify your identity using either of the following:" + ], + "list": ["National ID card verification", "Passport verification"], + "afterListHtml": "Once verified, you can continue with the rest of the event actions.", + "tip": { + "kind": "inline", + "text": "Please fill in real information from a valid personal ID document." + } + }, + { + "id": "step-04", + "num": "04", + "name": "Submit a talk", + "bodyHtml": "Once you have joined an event, you can submit a talk from the event page.
When submitting, fill in the talk title, a short description, and the expected length. Please describe your topic, the direction of the content, and the questions you want to discuss as clearly as you can — it helps the organizers review and schedule the program." + }, + { + "id": "step-05", + "num": "05", + "name": "Talk review and scheduling", + "bodyHtmls": [ + "Submitted talks are reviewed by the organizers as a whole.
We curate the program based on topic relevance, content completeness, sharing value and the overall conference plan. Accepted talks then move into the scheduling phase.", + "The final program is expected to be announced two weeks before the conference.
Please refer to the latest information on the website or event page closer to the date." + ] + }, + { + "id": "step-06", + "num": "06", + "name": "Entry code and check-in code", + "bodyHtml": "Once the event starts, the system will generate an entry code and a check-in code for every attendee who has joined.
These codes are your essential credentials on-site. Once you arrive at the venue, please present them at the matching step under staff guidance." + } + ] + }, + "souvenir": { + "meta": { + "htmlLang": "en", + "title": "Souvenirs · NixCN Conference 2605", + "description": "NixCN Conference 2605 Souvenirs — DIY your personalized conference badge and unlock event-limited souvenir customization." + }, + "hero": { + "title": "Souvenirs", + "sub": "Create your exclusive conference name card! DIY your personalized badge here and unlock more event-limited souvenir information in advance." + }, + "card": { + "title": "NixCN Conference 2605 — Create Your Exclusive Badge ✨", + "body": "We offer personalized souvenir settings. Click the button below to open the external customization channel and enter your identity details to generate a customized conference badge.", + "cta": "Start Customization", + "ctaUrl": "https://forms.office.com/Pages/DesignPageV2.aspx?subpage=design&FormId=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAZ__u0jrMtUODNTWUpJSEs0STZZWThNTTJVUlNHN01OQy4u&Token=f0e798fadec04532bf2ef8b474a4d7b2" + }, + "comingSoon": { + "title": "Customization Not Open Yet", + "body": "Personalized souvenir customization is still being prepared. Please check back later — once live, the button below will take you to the external form.", + "close": "Got it", + "ariaClose": "Close dialog" + } + } + } +} diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..5dc63f0 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,59 @@ +--- +interface Props { + title: string; + description?: string; + lang: string; +} + +const { title, description, lang } = Astro.props; +--- + + + + + + + {description && } + + {title} + + +
+ +
+ + + + diff --git a/src/pages/[lang]/calendar.astro b/src/pages/[lang]/calendar.astro new file mode 100644 index 0000000..c4bb325 --- /dev/null +++ b/src/pages/[lang]/calendar.astro @@ -0,0 +1,10 @@ +--- +import CalendarPage from '../../components/CalendarPage.astro'; +import { getLocalePaths, type Locale } from '../../i18n/config'; + +export const getStaticPaths = getLocalePaths; + +const { lang } = Astro.params as { lang: Locale }; +--- + + diff --git a/src/pages/[lang]/cms-guide.astro b/src/pages/[lang]/cms-guide.astro new file mode 100644 index 0000000..28ae771 --- /dev/null +++ b/src/pages/[lang]/cms-guide.astro @@ -0,0 +1,10 @@ +--- +import CmsGuidePage from '../../components/CmsGuidePage.astro'; +import { getLocalePaths, type Locale } from '../../i18n/config'; + +export const getStaticPaths = getLocalePaths; + +const { lang } = Astro.params as { lang: Locale }; +--- + + diff --git a/src/pages/[lang]/index.astro b/src/pages/[lang]/index.astro new file mode 100644 index 0000000..f13666e --- /dev/null +++ b/src/pages/[lang]/index.astro @@ -0,0 +1,10 @@ +--- +import HomePage from '../../components/HomePage.astro'; +import { getLocalePaths, type Locale } from '../../i18n/config'; + +export const getStaticPaths = getLocalePaths; + +const { lang } = Astro.params as { lang: Locale }; +--- + + diff --git a/src/pages/[lang]/souvenir.astro b/src/pages/[lang]/souvenir.astro new file mode 100644 index 0000000..63a6a54 --- /dev/null +++ b/src/pages/[lang]/souvenir.astro @@ -0,0 +1,10 @@ +--- +import SouvenirPage from '../../components/SouvenirPage.astro'; +import { getLocalePaths, type Locale } from '../../i18n/config'; + +export const getStaticPaths = getLocalePaths; + +const { lang } = Astro.params as { lang: Locale }; +--- + + diff --git a/src/pages/index.astro b/src/pages/index.astro deleted file mode 100644 index 8e03c0d..0000000 --- a/src/pages/index.astro +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/scripts/badge-tilt.ts b/src/scripts/badge-tilt.ts new file mode 100644 index 0000000..c411a39 --- /dev/null +++ b/src/scripts/badge-tilt.ts @@ -0,0 +1,101 @@ +// Nix badge: 3D tilt + 光泽追踪(仅鼠标 / 触控笔等精确指针) +// +// 效果:徽章的"正面法线"始终指向指针 —— 指针在徽章右上方时, +// 徽章右上角往前凸(rotateY 正、rotateX 负),整体像被指针"吸引" +// 而面向它转动。同时一个软高光斑跟着指针在徽章表面上滑动, +// 进一步强化 3D 玻璃药丸的观感。 +// +// 仅响应鼠标:触屏滑动也会触发 pointermove,会让徽章跟着滚走。 +// 不用 pointer:coarse 整段禁用,避免触屏笔记本在桌面宽度下丢失鼠标 3D 效果。 +export function initBadgeTilt() { + const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; + + const nixBadge = document.querySelector('.nix-highlight') as HTMLElement | null; + if (!nixBadge || prefersReducedMotion) return; + + const MAX_ROT_Y = 18; + const MAX_ROT_X = 14; + const LIFT_BASE = 6; + const LIFT_AMP = 10; + const RANGE = 360; + const SMOOTH = 0.14; + const REST_GX = 0.3; + const REST_GY = 0.25; + + let tgtX = 0; + let tgtY = 0; + let curX = 0; + let curY = 0; + let tgtGX = REST_GX; + let tgtGY = REST_GY; + let curGX = REST_GX; + let curGY = REST_GY; + let rafBadge = 0; + + const clamp = (v: number, lo: number, hi: number) => (v < lo ? lo : v > hi ? hi : v); + + function scheduleTick() { + if (!rafBadge) rafBadge = requestAnimationFrame(tickBadge); + } + + function onMove(e: PointerEvent) { + if (e.pointerType !== 'mouse') return; + + const rect = nixBadge!.getBoundingClientRect(); + const cxB = rect.left + rect.width / 2; + const cyB = rect.top + rect.height / 2; + const dx = e.clientX - cxB; + const dy = e.clientY - cyB; + tgtX = clamp(dx / RANGE, -1, 1); + tgtY = clamp(dy / RANGE, -1, 1); + + const localX = (e.clientX - rect.left) / rect.width; + const localY = (e.clientY - rect.top) / rect.height; + tgtGX = clamp(localX, -0.2, 1.2); + tgtGY = clamp(localY, -0.2, 1.2); + + scheduleTick(); + } + + function onPointerEnd(e: PointerEvent) { + if (e.pointerType === 'touch' || e.pointerType === 'pen') { + tgtX = 0; + tgtY = 0; + tgtGX = REST_GX; + tgtGY = REST_GY; + scheduleTick(); + } + } + + function tickBadge() { + curX += (tgtX - curX) * SMOOTH; + curY += (tgtY - curY) * SMOOTH; + curGX += (tgtGX - curGX) * SMOOTH; + curGY += (tgtGY - curGY) * SMOOTH; + + const rotY = curX * MAX_ROT_Y; + const rotX = -curY * MAX_ROT_X; + const lift = LIFT_BASE + (Math.abs(curX) + Math.abs(curY)) * LIFT_AMP; + + nixBadge!.style.transform = `rotateY(${rotY.toFixed(2)}deg) rotateX(${rotX.toFixed( + 2, + )}deg) translateZ(${lift.toFixed(2)}px)`; + nixBadge!.style.setProperty('--gloss-x', `${(curGX * 100).toFixed(1)}%`); + nixBadge!.style.setProperty('--gloss-y', `${(curGY * 100).toFixed(1)}%`); + + if ( + Math.abs(tgtX - curX) > 0.0008 || + Math.abs(tgtY - curY) > 0.0008 || + Math.abs(tgtGX - curGX) > 0.001 || + Math.abs(tgtGY - curGY) > 0.001 + ) { + rafBadge = requestAnimationFrame(tickBadge); + } else { + rafBadge = 0; + } + } + + document.addEventListener('pointermove', onMove, { passive: true }); + document.addEventListener('pointerup', onPointerEnd, { passive: true }); + document.addEventListener('pointercancel', onPointerEnd, { passive: true }); +} diff --git a/src/scripts/bg-parallax.ts b/src/scripts/bg-parallax.ts new file mode 100644 index 0000000..c4eab2f --- /dev/null +++ b/src/scripts/bg-parallax.ts @@ -0,0 +1,36 @@ +export function initBgParallax() { + const isCoarse = window.matchMedia('(pointer: coarse)').matches; + if (isCoarse) return; + + const circles = document.querySelector('.bg-circles') as HTMLElement | null; + const texture = document.querySelector('.bg-texture') as HTMLElement | null; + const textBlock = document.querySelector('.hero-text') as HTMLElement | null; + + if (!circles || !texture || !textBlock) return; + + let rafBg = 0; + let tx = 0, + ty = 0; + let cx = 0, + cy = 0; + + document.addEventListener('mousemove', (e: MouseEvent) => { + tx = (e.clientX / window.innerWidth - 0.5) * 2; + ty = (e.clientY / window.innerHeight - 0.5) * 2; + cancelAnimationFrame(rafBg); + rafBg = requestAnimationFrame(tickBg); + }); + + function tickBg() { + cx += (tx - cx) * 0.07; + cy += (ty - cy) * 0.07; + + circles!.style.transform = `translate(${cx * -20}px, ${cy * -14}px)`; + texture!.style.transform = `translate(${cx * -10}px, ${cy * -7}px)`; + textBlock!.style.transform = `translate(${cx * 6}px, ${cy * 3}px)`; + + if (Math.abs(tx - cx) > 0.0005 || Math.abs(ty - cy) > 0.0005) { + rafBg = requestAnimationFrame(tickBg); + } + } +} diff --git a/src/scripts/nixflake-animation.ts b/src/scripts/nixflake-animation.ts new file mode 100644 index 0000000..c62f80f --- /dev/null +++ b/src/scripts/nixflake-animation.ts @@ -0,0 +1,396 @@ +export function initNixflakeAnimation() { + // ─── Canvas: NixOS snowflake — single SVG tile, drawn 78 times ── + // + // Strategy: each of the 78 tiles renders the SAME mini-snowflake SVG + // at its home position. Spring physics repels tiles from the cursor + // and springs them back. Per Figma source (node 23:289 etc.) all 78 + // tiles use the same image at the same orientation — the arms only + // look angled because the tile positions are arranged along 6 lines + // at 60° intervals. No per-tile rotation needed. + // + // Coordinate derivation: + // Raw relX/relY come from tile.absoluteTransform − logoFrame.x (684) + // Desktop-2 page-abs position: x=1319, y=−36 + // Logo frame within Desktop-2: x=684, y=139 → size 863×856 px + // + // tile position IN logo frame: + // x_wl = relX − 1319 (since: absX = 1319 + 684 + x_wl, relX = absX − 684) + // y_wl = relY + 36 (since: absY = −36 + 139 + y_wl, relY = absY − 139) + // + // Canvas logical size: 700×700 px → fills the right column + overflows right + // Canvas scale vs Figma: CS = 700/863 ≈ 0.811 + // + const canvas = document.getElementById('nixflake') as HTMLCanvasElement | null; + if (!canvas) return; + + const DPR = Math.min(window.devicePixelRatio || 1, 2); + const W = 700; + const H = 700; + canvas.width = W * DPR; + canvas.height = H * DPR; + canvas.style.width = W + 'px'; + canvas.style.height = H + 'px'; + + const ctx = canvas.getContext('2d')!; + ctx.scale(DPR, DPR); + + // Figma logo frame dimensions + const LFW = 863; + // Scale factor: canvas px per Figma unit + const CS = W / LFW; // ≈ 0.811 + // Tile pitch in Figma units (from Figma rect dimensions). Used to + // anchor RAW coordinates; tile rendering itself is square below. + const TW_F = 39.7; + const TH_F = 36.5; + // Tile dest size on canvas — SQUARE so the hexagonally-symmetric + // mini-snowflake has equal margin on all sides (no horizontal + // squash that made arms look uneven). Use the larger of the two + // Figma dimensions so the glyph keeps its natural size. + const DS = TW_F * CS; // ≈ 32.2 px (square edge) + // SVG viewBox is now 530×530 (was 530×456). The snowflake glyph + // occupies the central 530×455 band → 2.3px transparent padding + // top + bottom when drawn at DS×DS. Shift hy up by half the + // height increase so the snowflake's visual center stays at the + // exact same canvas position as before. + const HY_SHIFT = (DS - TH_F * CS) / 2; // ≈ 1.3 px + + // Nix flake = Star of David (hexagram): two overlapping equilateral + // triangles. Each triangle contributes 3 bars (= triangle edges), + // and the 6 bars are shifted SHIFT units along their triangle's CCW + // edge direction. This shift is what creates the characteristic + // 6-pointed star — bars from the two triangles cross at the 6 + // outer star tips, giving the design its 6-fold rotational symmetry. + // + // Each bar is 9 main tiles (along its edge) plus a 4-tile branch + // extending outward from the bar midpoint, rotated 60° (Figma + // matrix [cos60, -sin60; sin60, cos60]) from the bar direction. + // + // Geometry derived from the Figma source — bar center spacing, + // shift, and branch direction all match the original to within + // sub-pixel tolerance. We regenerate (instead of using the raw + // Figma coords) only to even out 2% variance between horizontal + // sides (PITCH ≈ 38.96) and diagonal sides (PITCH ≈ 39.6), and to + // make SHIFT identical across all 6 bars (Figma source varied 92–100). + // Hexagram center in RAW coord space, chosen so the snowflake + // visually centers at (W/2, H/2) on canvas. Derived from the + // inverse of the (rx, ry) → (hx, hy) transform below: + // STAR_C_X = (W/2) / CS + 1319 = 350/0.8112 + 1319 ≈ 1750.5 + // STAR_C_Y = (H/2 + HY_SHIFT) / CS − 36 ≈ 396.9 + const STAR_C_X = 1750.5; + const STAR_C_Y = 396.9; + const STAR_R = 388.8; // triangle circumradius (vertex distance from center) + const STAR_PITCH = 39; // main-bar tile-to-tile spacing + const STAR_BRANCH_PITCH = 41; // branch tile-to-tile spacing + // Bar offset along its triangle's CCW edge direction. + // + // For the 6 outer star tips (branch outermost tiles) to land on a + // proper AXIS-ALIGNED regular hexagon (flat-top, horizontal top/ + // bottom edges), this offset must equal R·√3/6. Derivation: pick + // the leftmost tip (UP-1 bar's branch end). Its y component + // relative to center is R/4 − SHIFT·√3/2. Setting that to 0 + // (tip exactly on the horizontal axis) gives SHIFT = R/(2√3) = + // R·√3/6. The other 5 tips then fall at 60° intervals around + // a circle of radius R·√3/3 + 4·BRANCH_PITCH, by symmetry. + // + // (The Figma source used SHIFT ≈ 96, which gives a hex rotated + // ~2° off-axis. We use the exact value to make the outer hex + // perfectly axis-aligned.) + const STAR_SHIFT = (STAR_R * Math.sqrt(3)) / 6; // ≈ 112.24 + + // 6 edges, identified by their two endpoint vertex angles (math y-up). + // Upward triangle CCW: v90 → v210 → v330 → v90. + // Downward triangle CCW: v30 → v150 → v270 → v30. + const STAR_EDGES: { v_from_deg: number; v_to_deg: number }[] = [ + { v_from_deg: 90, v_to_deg: 210 }, // UP-1 + { v_from_deg: 210, v_to_deg: 330 }, // UP-2 (horizontal, bottom of upward triangle) + { v_from_deg: 330, v_to_deg: 90 }, // UP-3 + { v_from_deg: 30, v_to_deg: 150 }, // DN-1 (horizontal, top of downward triangle) + { v_from_deg: 150, v_to_deg: 270 }, // DN-2 + { v_from_deg: 270, v_to_deg: 30 }, // DN-3 + ]; + + const COS60 = 0.5; + const SIN60 = Math.sqrt(3) / 2; + + const RAW: { tiles: [number, number][]; isLight: boolean }[] = STAR_EDGES.map( + ({ v_from_deg, v_to_deg }, edgeIdx) => { + const a1 = (v_from_deg * Math.PI) / 180; + const a2 = (v_to_deg * Math.PI) / 180; + // Triangle vertices (math y-up → Figma y-down: flip y). + const vfx = STAR_C_X + STAR_R * Math.cos(a1); + const vfy = STAR_C_Y - STAR_R * Math.sin(a1); + const vtx = STAR_C_X + STAR_R * Math.cos(a2); + const vty = STAR_C_Y - STAR_R * Math.sin(a2); + // Edge midpoint and CCW direction along the edge. + const Mx = (vfx + vtx) / 2; + const My = (vfy + vty) / 2; + const ex = vtx - vfx; + const ey = vty - vfy; + const elen = Math.sqrt(ex * ex + ey * ey); + const dx = ex / elen; + const dy = ey / elen; + // Bar midpoint = edge midpoint shifted SHIFT units along d. + const bcx = Mx + STAR_SHIFT * dx; + const bcy = My + STAR_SHIFT * dy; + // Branch direction = bar dir rotated 60° in Figma (matrix + // [cos60, -sin60; sin60, cos60]). Verified to match the Figma + // source's branch directions across all 6 bars. + const bdx = dx * COS60 - dy * SIN60; + const bdy = dx * SIN60 + dy * COS60; + + const tiles: [number, number][] = []; + // 9 main bar tiles, centered on bar midpoint, j=0..8 along d. + for (let j = 0; j < 9; j++) { + const cx = bcx + (j - 4) * STAR_PITCH * dx; + const cy = bcy + (j - 4) * STAR_PITCH * dy; + tiles.push([cx - TW_F / 2, cy - TH_F / 2]); + } + // 4 branch tiles extending out from bar midpoint. + for (let k = 1; k <= 4; k++) { + const cx = bcx + k * STAR_BRANCH_PITCH * bdx; + const cy = bcy + k * STAR_BRANCH_PITCH * bdy; + tiles.push([cx - TW_F / 2, cy - TH_F / 2]); + } + // Each bar gets ONE color (dark or light) — uniform across its + // 9 main + 4 branch tiles. The split matches the canonical + // Nix flake logo (public/images/shared/nix-flake-logo.svg), whose 6 + // lambdas alternate around flat-top hex positions: + // DARK at math 0° / 120° / 240° + // LIGHT at math 60° / 180° / 300° + // Our bar midpoints (after STAR_SHIFT) land exactly on those + // 6 hex positions, with a clean triangle correspondence: + // indices 0–2 (UP-*, upward triangle) → hit 60° / 180° / 300° → LIGHT + // indices 3–5 (DN-*, downward triangle) → hit 0° / 120° / 240° → DARK + // We can't use a bar-midpoint-Y vs center-Y test because + // UP-1 (180°) and DN-3 (0°) both sit exactly on the + // horizontal axis — a Y comparison misclassifies them. + const isLight = edgeIdx < 3; + return { tiles, isLight }; + }, + ); + + interface Tile { + hx: number; + hy: number; + ox: number; + oy: number; + vx: number; + vy: number; + isLight: boolean; + } + + const tiles: Tile[] = []; + for (const { tiles: groupTiles, isLight } of RAW) { + for (const [rx, ry] of groupTiles) { + const x_wl = rx - 1319; + const y_wl = ry + 36; + tiles.push({ + hx: x_wl * CS, + hy: y_wl * CS - HY_SHIFT, + ox: 0, + oy: 0, + vx: 0, + vy: 0, + isLight, + }); + } + } + + // Single clean mini-snowflake SVG, pre-rasterized ONCE to an + // offscreen bitmap. The SVG contains multi-layer drop-shadow + + // inner-shadow + Gaussian-blur filter chains; drawing it directly + // 78× per frame forces the browser to re-run the entire filter + // pipeline on every drawImage call → tanks performance. + // Pre-rasterizing collapses each per-frame tile draw to a cheap + // bitmap copy. + const img = new Image(); + img.src = '/images/shared/nix-tile-100.svg'; + + // Offscreen bitmap dimensioning targets a "soft fog" + // shadow rather than a sharp cast shadow: + // - Larger BMP → SVG's stdDev=5 Gaussian blur survives + // more downscale → shadow spreads SOFTER over a + // WIDER area (looks blurrier). + // - Lower globalAlpha → each pixel of that wider + // spread is more transparent → looks LIGHTER. + // The two compensate so total shadow "ink" stays modest + // but the shadow's visual radius grows. + // + // Letterbox keeps the SVG's 1.156:1 hexagram aspect. + const SVG_W = 520; + const SVG_H = 450; + const SVG_RATIO = SVG_W / SVG_H; + // SCALE 5.5 → BMP ≈ 355 px → SVG downscale ~1.46× → + // stdDev=5 blurs render at ~3.4 px (vs ~2.5 at SCALE=4) + // — softer, broader penumbra without the SVG-native + // overweight you get at full SVG resolution. + const TILE_BMP_SCALE = 5.5; + const BMP_SIZE = Math.ceil(DS * DPR * TILE_BMP_SCALE); + const SVG_DRAW_W = BMP_SIZE; + const SVG_DRAW_H = BMP_SIZE / SVG_RATIO; + const SVG_DRAW_Y = (BMP_SIZE - SVG_DRAW_H) / 2; + const bmpDark = document.createElement('canvas'); + bmpDark.width = BMP_SIZE; + bmpDark.height = BMP_SIZE; + const bmpLight = document.createElement('canvas'); + bmpLight.width = BMP_SIZE; + bmpLight.height = BMP_SIZE; + + // Shadow strategy: instead of a uniform CSS drop-shadow + // (single tint, fully alpha-driven) we cast a SOFT BLURRED + // COPY of the SVG itself. Because the bitmap retains the + // SVG's per-path color, deep-blue arms (#64AEE0 at + // fill-opacity 0.8) naturally cast a stronger, deeper + // shadow than the pale arms (#D5ECF9) — matches the + // physical intuition "opaque blocks light, translucent + // lets it through" without having to hack fill-opacity. + // + // Padding: ctx.filter='blur(r)' spreads pixels by ~3r + // beyond the source bounds; we pad the shadow bitmap so + // the halo isn't clipped at tile edges. + const SHADOW_BLUR_BMP = 28; + const SHADOW_PAD_BMP = SHADOW_BLUR_BMP * 4; + const bmpShadow = document.createElement('canvas'); + bmpShadow.width = BMP_SIZE + SHADOW_PAD_BMP * 2; + bmpShadow.height = BMP_SIZE + SHADOW_PAD_BMP * 2; + let bmpReady = false; + + function buildBitmaps() { + const dctx = bmpDark.getContext('2d')!; + const lctx = bmpLight.getContext('2d')!; + const sctx = bmpShadow.getContext('2d')!; + dctx.clearRect(0, 0, BMP_SIZE, BMP_SIZE); + lctx.clearRect(0, 0, BMP_SIZE, BMP_SIZE); + sctx.clearRect(0, 0, bmpShadow.width, bmpShadow.height); + + // Foreground bitmaps — small main-arm tint difference + // only. The shadow story is told by bmpShadow below, + // not by globalAlpha here. + dctx.globalAlpha = 0.85; + dctx.drawImage(img, 0, SVG_DRAW_Y, SVG_DRAW_W, SVG_DRAW_H); + lctx.globalAlpha = 0.62; + lctx.drawImage(img, 0, SVG_DRAW_Y, SVG_DRAW_W, SVG_DRAW_H); + + // Shadow bitmap: same SVG, drawn ONCE with a + // gaussian blur via ctx.filter and reduced alpha, + // shifted into the bitmap by SHADOW_PAD_BMP so the + // halo has room to bleed in every direction. + sctx.filter = `blur(${SHADOW_BLUR_BMP}px)`; + sctx.globalAlpha = 0.6; + sctx.drawImage(img, SHADOW_PAD_BMP, SHADOW_PAD_BMP + SVG_DRAW_Y, SVG_DRAW_W, SVG_DRAW_H); + sctx.filter = 'none'; + + bmpReady = true; + } + + // Shadow offset on the main canvas (right-down). Sized + // relative to the tile so the offset scales with DS. + const SHADOW_OFF_X = DS * 0.32; + const SHADOW_OFF_Y = DS * 0.44; + // SHADOW_PAD_BMP in canvas px (bmpShadow's BMP_SIZE region + // covers DS canvas px, so pad converts at the same ratio). + const SHADOW_PAD_PX = (SHADOW_PAD_BMP / BMP_SIZE) * DS; + const SHADOW_DRAW_SIZE = DS + SHADOW_PAD_PX * 2; + + const SPRING = 0.09; + const DAMPING = 0.72; + const REPEL_R = 90; + const REPEL_F = 6000; + + let mxC = -9999; + let myC = -9999; + + function syncPointer(clientX: number, clientY: number) { + const rect = canvas!.getBoundingClientRect(); + mxC = (clientX - rect.left) * (W / rect.width); + myC = (clientY - rect.top) * (H / rect.height); + } + + document.addEventListener('mousemove', (e: MouseEvent) => { + syncPointer(e.clientX, e.clientY); + }); + canvas.addEventListener('mouseleave', () => { + mxC = -9999; + }); + + // Touch 输入(手机 / 平板)。全局 passive 监听,绝不 + // preventDefault —— 否则会破坏页面纵向滚动。手指抬起 / + // 取消时把指针拉到极远处,让 spring 自然把雪花拉回原位。 + const onTouch = (e: TouchEvent) => { + const t = e.touches[0]; + if (t) syncPointer(t.clientX, t.clientY); + }; + const releaseTouch = () => { + mxC = -9999; + }; + document.addEventListener('touchstart', onTouch, { passive: true }); + document.addEventListener('touchmove', onTouch, { passive: true }); + document.addEventListener('touchend', releaseTouch, { passive: true }); + document.addEventListener('touchcancel', releaseTouch, { passive: true }); + + let rafId = 0; + function tick() { + ctx.clearRect(0, 0, W, H); + + // Pass 1: physics update (spring + cursor repulsion). + for (const tile of tiles) { + tile.vx += -tile.ox * SPRING; + tile.vy += -tile.oy * SPRING; + + if (mxC > -100) { + const tcx = tile.hx + DS / 2 + tile.ox; + const tcy = tile.hy + DS / 2 + tile.oy; + const dx = tcx - mxC; + const dy = tcy - myC; + const d2 = dx * dx + dy * dy; + if (d2 < REPEL_R * REPEL_R && d2 > 0.25) { + const d = Math.sqrt(d2); + const f = REPEL_F / d2; + tile.vx += (dx / d) * f; + tile.vy += (dy / d) * f; + } + } + + tile.vx *= DAMPING; + tile.vy *= DAMPING; + tile.ox += tile.vx; + tile.oy += tile.vy; + } + + if (bmpReady) { + // Pass 2: paint ALL shadows first, right-down + // offset. Doing this before any foreground means + // a tile's shadow can correctly slide under its + // right-down neighbor's body instead of being + // overpainted by that neighbor's own shadow. + for (const tile of tiles) { + ctx.drawImage( + bmpShadow, + tile.hx + tile.ox + SHADOW_OFF_X - SHADOW_PAD_PX, + tile.hy + tile.oy + SHADOW_OFF_Y - SHADOW_PAD_PX, + SHADOW_DRAW_SIZE, + SHADOW_DRAW_SIZE, + ); + } + + // Pass 3: paint all sharp foregrounds on top. + for (const tile of tiles) { + ctx.drawImage(tile.isLight ? bmpLight : bmpDark, tile.hx + tile.ox, tile.hy + tile.oy, DS, DS); + } + } + + rafId = requestAnimationFrame(tick); + } + + img.onload = () => { + buildBitmaps(); + cancelAnimationFrame(rafId); + tick(); + }; + if (img.complete && img.naturalWidth > 0) { + buildBitmaps(); + tick(); + } else { + tick(); + } +} diff --git a/tsconfig.json b/tsconfig.json index 19e893c..7857648 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "include": [".astro/types.d.ts", "**/*"], "compilerOptions": { "paths": { - "@assets/*": ["./src/assets/*"], "@components/*": ["./src/components/*"] } },