diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3335c05 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + ci: + name: Check, Lint & Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 11.5.2 + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Type check + run: pnpm check + + - name: Lint + run: pnpm lint + + - name: Format check + run: pnpm format:check + + - name: Build + run: pnpm build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 9f8229c..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: [main] - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout your repository using git - uses: actions/checkout@v5 - - - name: Install, build, and upload your site - uses: withastro/action@v5 - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index 543c909..0d05831 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ Marketing site and content hub for Ultraviolet, built with Astro and Tailwind CS Run commands from the repository root: -| Command | Action | -| :-- | :-- | -| `pnpm install` | Install dependencies | -| `pnpm run dev` | Start the local Astro development server | -| `pnpm run build` | Build the production site | -| `pnpm run preview` | Preview the production build locally | -| `pnpm run check` | Run Astro and TypeScript checks | +| Command | Action | +| :----------------- | :--------------------------------------- | +| `pnpm install` | Install dependencies | +| `pnpm run dev` | Start the local Astro development server | +| `pnpm run build` | Build the production site | +| `pnpm run preview` | Preview the production build locally | +| `pnpm run check` | Run Astro and TypeScript checks | ## Content Notes diff --git a/astro.config.mjs b/astro.config.mjs index 12a8fac..6a2ac06 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,5 @@ -import { defineConfig } from 'astro/config'; -import tailwind from '@astrojs/tailwind'; +import { defineConfig } from "astro/config"; +import tailwind from "@astrojs/tailwind"; import sitemap from "@astrojs/sitemap"; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..a8bbf5e --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,14 @@ +import js from "@eslint/js"; +import tseslint from "typescript-eslint"; +import astro from "eslint-plugin-astro"; +import prettier from "eslint-config-prettier"; + +export default tseslint.config( + { + ignores: ["dist/", ".astro/", "node_modules/", ".wrangler/"], + }, + js.configs.recommended, + ...tseslint.configs.recommended, + ...astro.configs.recommended, + prettier, +); diff --git a/package.json b/package.json index 88d0846..5afc145 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "ultraviolet-website", "type": "module", "version": "0.0.1", - "packageManager": "pnpm@9.15.4", + "packageManager": "pnpm@11.5.2", "scripts": { "dev": "astro dev", "build": "astro build", @@ -20,8 +20,8 @@ "@astrojs/cloudflare": "^12", "@astrojs/sitemap": "^3.7.2", "@astrojs/tailwind": "^6.0.2", - "astro": "^5.17.1", - "lucide-astro": "^0.556.0" + "@lucide/astro": "^1.17.0", + "astro": "^5.17.1" }, "devDependencies": { "@astrojs/check": "^0.9.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c603f3..3a6581f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,65 +10,65 @@ importers: dependencies: '@astrojs/cloudflare': specifier: ^12 - version: 12.6.13(@types/node@24.12.0)(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(yaml@2.8.2) + version: 12.6.13(@types/node@24.13.0)(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.7.0)(yaml@2.9.0) '@astrojs/sitemap': specifier: ^3.7.2 - version: 3.7.2 + version: 3.7.3 '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(yaml@2.8.2)) + version: 6.0.2(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0))(tailwindcss@3.4.19(yaml@2.9.0)) + '@lucide/astro': + specifier: ^1.17.0 + version: 1.17.0(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0)) astro: specifier: ^5.17.1 - version: 5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) - lucide-astro: - specifier: ^0.556.0 - version: 0.556.0(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)) + version: 5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0) devDependencies: '@astrojs/check': specifier: ^0.9.6 - version: 0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) + version: 0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@5.9.3) '@eslint/css': specifier: ^1.0.0 - version: 1.0.0 + version: 1.3.0 '@eslint/js': specifier: ^9.39.4 version: 9.39.4 '@eslint/json': specifier: ^1.1.0 - version: 1.1.0 + version: 1.2.0 '@eslint/markdown': specifier: ^7.5.1 version: 7.5.1 '@tailwindcss/typography': specifier: ^0.5.19 - version: 0.5.19(tailwindcss@3.4.19(yaml@2.8.2)) + version: 0.5.19(tailwindcss@3.4.19(yaml@2.9.0)) '@typescript-eslint/eslint-plugin': specifier: ^8.28.0 - version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.28.0 - version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) eslint: specifier: ^9.39.4 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.1 - version: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-astro: specifier: ^1.3.1 - version: 1.6.0(eslint@9.39.4(jiti@2.6.1)) + version: 1.7.0(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.2.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3) globals: specifier: ^17.4.0 - version: 17.4.0 + version: 17.6.0 jiti: specifier: ^2.6.1 - version: 2.6.1 + version: 2.7.0 prettier: specifier: ^3.5.3 - version: 3.8.1 + version: 3.8.3 prettier-plugin-astro: specifier: ^0.14.1 version: 0.14.1 @@ -77,16 +77,16 @@ importers: version: 0.34.5 tailwindcss: specifier: ^3.4.19 - version: 3.4.19(yaml@2.8.2) + version: 3.4.19(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: specifier: ^8.57.0 - version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) wrangler: specifier: ^4.77.0 - version: 4.77.0(@cloudflare/workers-types@4.20260317.1) + version: 4.98.0(@cloudflare/workers-types@4.20260604.1) packages: @@ -94,11 +94,11 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@astrojs/check@0.9.6': - resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} + '@astrojs/check@0.9.9': + resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==} hasBin: true peerDependencies: - typescript: ^5.0.0 + typescript: ^5.0.0 || ^6.0.0 '@astrojs/cloudflare@12.6.13': resolution: {integrity: sha512-oKaCyiovyQr183r9U93787Ju1zwk+rRMgPnLTwCLckHmOUK7sltA1Gp4LSGt8oNMgqQS6jR7uRdfQ/NPul37QA==} @@ -108,14 +108,14 @@ packages: '@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/compiler@3.0.1': + resolution: {integrity: sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==} '@astrojs/internal-helpers@0.7.6': resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==} - '@astrojs/language-server@2.16.3': - resolution: {integrity: sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==} + '@astrojs/language-server@2.16.10': + resolution: {integrity: sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -126,15 +126,15 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@6.3.10': - resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} + '@astrojs/markdown-remark@6.3.11': + resolution: {integrity: sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==} '@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.7.2': - resolution: {integrity: sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==} + '@astrojs/sitemap@3.7.3': + resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==} '@astrojs/tailwind@6.0.2': resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==} @@ -149,24 +149,24 @@ packages: '@astrojs/underscore-redirects@1.0.0': resolution: {integrity: sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ==} - '@astrojs/yaml2ts@0.2.2': - resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@capsizecss/unpack@4.0.0': @@ -177,6 +177,10 @@ packages: resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} engines: {node: '>=18.0.0'} + '@cloudflare/kv-asset-handler@0.5.0': + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} + engines: {node: '>=22.0.0'} + '@cloudflare/unenv-preset@2.10.0': resolution: {integrity: sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==} peerDependencies: @@ -186,11 +190,11 @@ packages: workerd: optional: true - '@cloudflare/unenv-preset@2.16.0': - resolution: {integrity: sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==} + '@cloudflare/unenv-preset@2.16.1': + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} peerDependencies: unenv: 2.0.0-rc.24 - workerd: 1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0 + workerd: '>1.20260305.0 <2.0.0-0' peerDependenciesMeta: workerd: optional: true @@ -201,8 +205,8 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260317.1': - resolution: {integrity: sha512-8hjh3sPMwY8M/zedq3/sXoA2Q4BedlGufn3KOOleIG+5a4ReQKLlUah140D7J6zlKmYZAFMJ4tWC7hCuI/s79g==} + '@cloudflare/workerd-darwin-64@1.20260603.1': + resolution: {integrity: sha512-cEXDWu6V3ZrpmwWkM4OJE9AeXjdAgOY5rh8EHhcBVCuP5rxnzUbPzLtrVOHx0UUUAcCrFq0Xsa6mZKL1VUZsKQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -213,8 +217,8 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260317.1': - resolution: {integrity: sha512-M/MnNyvO5HMgoIdr3QHjdCj2T1ki9gt0vIUnxYxBu9ISXS/jgtMl6chUVPJ7zHYBn9MyYr8ByeN6frjYxj0MGg==} + '@cloudflare/workerd-darwin-arm64@1.20260603.1': + resolution: {integrity: sha512-uBPK4LaWJNbbCYwPnUAehlHbbVulhVZPZsdcAhBPfZhHb3QAuAEPAQepO/P67R3V6Cni4YGx1fLbL8A5wwoaNA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -225,8 +229,8 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20260317.1': - resolution: {integrity: sha512-1ltuEjkRcS3fsVF7CxsKlWiRmzq2ZqMfqDN0qUOgbUwkpXsLVJsXmoblaLf5OP00ELlcgF0QsN0p2xPEua4Uug==} + '@cloudflare/workerd-linux-64@1.20260603.1': + resolution: {integrity: sha512-ht9l6/8Tk7Rp6kA4S9oFZ4X8u0VjnnFdmU/6B3fnABYKREYTKh2RdOqXqXxcp5eNJseireKnWik/hQOPK1CutQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -237,8 +241,8 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260317.1': - resolution: {integrity: sha512-3QrNnPF1xlaNwkHpasvRvAMidOvQs2NhXQmALJrEfpIJ/IDL2la8g499yXp3eqhG3hVMCB07XVY149GTs42Xtw==} + '@cloudflare/workerd-linux-arm64@1.20260603.1': + resolution: {integrity: sha512-LJZ6x00rAjSrobV4m0ZW0TpH5ilBbKcWBzlH+y+KOUsIE/CpTuhAzKV43TbSnFLRX5+jrWKiz2v0hO91lPXy6A==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -249,14 +253,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20260317.1': - resolution: {integrity: sha512-MfZTz+7LfuIpMGTa3RLXHX8Z/pnycZLItn94WRdHr8LPVet+C5/1Nzei399w/jr3+kzT4pDKk26JF/tlI5elpQ==} + '@cloudflare/workerd-windows-64@1.20260603.1': + resolution: {integrity: sha512-DvwqkXMAJRPoDN4PxapAwhlz/6ouD+6R1ttbAEK3cWD/QBvFF5STx7Ds/9Irf+rBly3np3uHWkeX+wZnNFEuzA==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260317.1': - resolution: {integrity: sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==} + '@cloudflare/workers-types@4.20260604.1': + resolution: {integrity: sha512-nVTydUwPcz9WfwZ/6xAmqs8uUVeGbDVmyPvSYrYAo4CQTyi0122SoE1Suw8RvqnN60XXHPChAjDqSIjnr/mbmg==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -283,8 +287,8 @@ packages: '@emmetio/stream-reader@2.2.0': resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -304,6 +308,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -322,6 +332,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -340,6 +356,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -358,6 +380,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -376,6 +404,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -394,6 +428,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -412,6 +452,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -430,6 +476,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -448,6 +500,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -466,6 +524,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -484,6 +548,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -502,6 +572,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -520,6 +596,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -538,6 +620,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -556,6 +644,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -574,6 +668,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -592,6 +692,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -610,6 +716,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -628,6 +740,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -646,6 +764,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -664,6 +788,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -682,6 +812,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -700,6 +836,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -718,6 +860,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -736,6 +884,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -754,6 +908,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -776,16 +936,16 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.1.1': - resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/css-tree@3.6.9': - resolution: {integrity: sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + '@eslint/css-tree@4.0.4': + resolution: {integrity: sha512-nxMparyhqVWQvadx9x8dIfubfIPOE+X2b2waua8fzdnM9vdp9rgVtwEZlG0TmCwEUz/d/f40fzvO/eqBwdxz0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/css@1.0.0': - resolution: {integrity: sha512-2MjyL517F1wrLrmmfaFntKKiImudiXW6Dd80oE7VRIRu64bT5YieRs+WPgdZy9m8izs/tSUqi3j2mBnjUrqJfA==} + '@eslint/css@1.3.0': + resolution: {integrity: sha512-MwY657chvFQWtXmO86syZgD+JpWlzDq7VkKZyi65PwHDbhELQPMzPXh5s8rhrjptG6FCuls0puCmlXk66+14uA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/eslintrc@3.3.5': @@ -796,8 +956,8 @@ packages: resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/json@1.1.0': - resolution: {integrity: sha512-noH9FUYqyhZSDf3Yq5HswsjDH/MWJAatMooWwT5YgQ0XHMekoFc/iyEufP+7kD1kaOj9qwFiXySqHsKii3zmlw==} + '@eslint/json@1.2.0': + resolution: {integrity: sha512-CEFEyNgvzu8zn5QwVYDg3FaG+ZKUeUsNYitFpMYJAqoAlnw68EQgNbUfheSmexZr4n0wZPrAkPLuvsLaXO6wRw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/markdown@7.5.1': @@ -816,12 +976,20 @@ packages: resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -836,8 +1004,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -866,89 +1034,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] 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.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] 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.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] 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.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.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.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.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.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.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.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -989,6 +1173,11 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lucide/astro@1.17.0': + resolution: {integrity: sha512-wF5wyjF8zThvI5JVUWG1WLoFdbTcMNXouxnholAyR0EEFfWNnGP1DGsvuu7cym/2mj2vUEjPbIPPDgWwjabFRQ==} + peerDependencies: + astro: ^4 || ^5 || ^6 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1004,9 +1193,9 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} '@poppinss/colors@4.1.6': resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} @@ -1017,8 +1206,8 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1026,148 +1215,161 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + '@rollup/rollup-android-arm-eabi@4.61.1': + resolution: {integrity: sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rollup/rollup-android-arm64@4.61.1': + resolution: {integrity: sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rollup/rollup-darwin-arm64@4.61.1': + resolution: {integrity: sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rollup/rollup-darwin-x64@4.61.1': + resolution: {integrity: sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + '@rollup/rollup-freebsd-arm64@4.61.1': + resolution: {integrity: sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rollup/rollup-freebsd-x64@4.61.1': + resolution: {integrity: sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + resolution: {integrity: sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + resolution: {integrity: sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==} cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rollup/rollup-linux-arm64-gnu@4.61.1': + resolution: {integrity: sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rollup/rollup-linux-arm64-musl@4.61.1': + resolution: {integrity: sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + '@rollup/rollup-linux-loong64-gnu@4.61.1': + resolution: {integrity: sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==} cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + '@rollup/rollup-linux-loong64-musl@4.61.1': + resolution: {integrity: sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==} cpu: [loong64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + resolution: {integrity: sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rollup/rollup-linux-ppc64-musl@4.61.1': + resolution: {integrity: sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==} cpu: [ppc64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + resolution: {integrity: sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + '@rollup/rollup-linux-riscv64-musl@4.61.1': + resolution: {integrity: sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==} cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rollup/rollup-linux-s390x-gnu@4.61.1': + resolution: {integrity: sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rollup/rollup-linux-x64-gnu@4.61.1': + resolution: {integrity: sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rollup/rollup-linux-x64-musl@4.61.1': + resolution: {integrity: sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==} cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + '@rollup/rollup-openbsd-x64@4.61.1': + resolution: {integrity: sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rollup/rollup-openharmony-arm64@4.61.1': + resolution: {integrity: sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + '@rollup/rollup-win32-arm64-msvc@4.61.1': + resolution: {integrity: sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + '@rollup/rollup-win32-ia32-msvc@4.61.1': + resolution: {integrity: sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rollup/rollup-win32-x64-gnu@4.61.1': + resolution: {integrity: sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + '@rollup/rollup-win32-x64-msvc@4.61.1': + resolution: {integrity: sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==} cpu: [x64] os: [win32] - '@shikijs/core@3.22.0': - resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - '@shikijs/engine-javascript@3.22.0': - resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} - '@shikijs/engine-oniguruma@3.22.0': - resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - '@shikijs/langs@3.22.0': - resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - '@shikijs/themes@3.22.0': - resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - '@shikijs/types@3.22.0': - resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1184,11 +1386,11 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1205,8 +1407,8 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@types/node@24.13.0': + resolution: {integrity: sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -1214,67 +1416,67 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.57.0': - resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.0 + '@typescript-eslint/parser': ^8.60.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.57.0': - resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.57.0': - resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.57.0': - resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.0': - resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.57.0': - resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.57.0': - resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.0': - resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.57.0': - resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.57.0': - resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -1307,8 +1509,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1320,11 +1522,11 @@ packages: ajv: optional: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + 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==} @@ -1365,12 +1567,12 @@ packages: array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - astro-eslint-parser@1.3.0: - resolution: {integrity: sha512-aOLc/aDR7lTWAHlytEefwn4Y6qs6uMr69DZvUx2A1AOAZsWhGB/paiRWPtVchh9wzMvLeqr+DkbENhVreVr9AQ==} + astro-eslint-parser@1.4.0: + resolution: {integrity: sha512-+QDcgc7e+au6EZ0YjMmRRjNoQo5bDMlaR45aWDoFsuxQTCM9qmCHRoiKJPELgckJ8Wmr7vcfpa9eCDHBFh6G4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - astro@5.17.2: - resolution: {integrity: sha512-7jnMqGo53hOQNwo1N/wqeOvUp8wwW/p+DeerSjSkHNx8L/1mhy6P7rVo7EhdmF8DpKqw0tl/B5Fx1WcIzg1ysA==} + astro@5.18.2: + resolution: {integrity: sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -1380,8 +1582,8 @@ packages: peerDependencies: '@astrojs/compiler': '>=0.27.0' - autoprefixer@10.4.24: - resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1404,8 +1606,9 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + engines: {node: '>=6.0.0'} hasBin: true binary-extensions@2.3.0: @@ -1422,19 +1625,19 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1450,8 +1653,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001770: - resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==} + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1525,8 +1728,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} @@ -1546,8 +1749,8 @@ packages: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.2.2: @@ -1578,8 +1781,8 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -1596,8 +1799,8 @@ packages: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} - devalue@5.6.2: - resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + devalue@5.8.1: + resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1605,8 +1808,8 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} dlv@1.1.3: @@ -1629,8 +1832,8 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - electron-to-chromium@1.5.286: - resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + electron-to-chromium@1.5.367: + resolution: {integrity: sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==} emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} @@ -1649,9 +1852,17 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1670,6 +1881,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1694,14 +1910,14 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-astro@1.6.0: - resolution: {integrity: sha512-yGIbLHuj5MOUXa0s4sZ6cVhv6ehb+WLF80tsrGaxMk6VTUExruMzubQDzhOYt8fbR1c9vILCCRSCsKI7M1whig==} + eslint-plugin-astro@1.7.0: + resolution: {integrity: sha512-89xpAn528UKCdmyysbg0AHHqi6sqcK89wXnJIpu4F0mFBN03zATEBNK7pRtMfl6gwtMOm5ECXs+Wz5qDHhwTFw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.57.0' - eslint-plugin-prettier@5.5.5: - resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + eslint-plugin-prettier@5.5.6: + resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1788,8 +2004,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1822,8 +2038,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.1: - resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} @@ -1832,8 +2048,8 @@ packages: fontace@0.4.1: resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} - fontkitten@1.0.2: - resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} engines: {node: '>=20'} format@0.2.2: @@ -1855,8 +2071,8 @@ packages: 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==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} github-slugger@2.0.0: @@ -1878,19 +2094,19 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globals@17.4.0: - resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} - h3@1.15.5: - resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} hast-util-from-html@2.0.3: @@ -1958,8 +2174,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-docker@3.0.0: @@ -2003,12 +2219,12 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true json-buffer@3.0.1: @@ -2058,27 +2274,18 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} - lucide-astro@0.556.0: - resolution: {integrity: sha512-ugMjPb45AMfkLCaduNSbyy5NQEKvB1TxVVMmUS4S6L807PMESnX0Qp+DIKHjbyjJmPXOyLRbrzvR3YikTK7brg==} - deprecated: 'Deprecated: Use `@lucide/astro`' - peerDependencies: - astro: '>=2.7.1' - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -2089,8 +2296,8 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} @@ -2128,11 +2335,11 @@ packages: mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdn-data@2.23.0: - resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} + mdn-data@2.28.1: + resolution: {integrity: sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -2234,13 +2441,13 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20260317.2: - resolution: {integrity: sha512-qNL+yWAFMX6fr0pWU6Lx1vNpPobpnDSF1V8eunIckWvoIQl8y1oBjL2RJFEGY3un+l3f9gwW9dirDPP26usYJQ==} - engines: {node: '>=18.0.0'} + miniflare@4.20260603.0: + resolution: {integrity: sha512-+kMQYB82gC8MPOuojHur3icQsUeZUEJ+Sphuo5rVC3Ri9txBLAW/mH33b9OVrpmkogQeaaqPS4tPtugJZhk5Kw==} + engines: {node: '>=22.0.0'} hasBin: true - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -2259,8 +2466,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2280,8 +2487,9 @@ packages: node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -2304,11 +2512,11 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -2373,12 +2581,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@2.3.0: @@ -2452,8 +2660,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2468,8 +2676,8 @@ packages: resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} engines: {node: ^14.15.0 || >=16.0.0} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -2481,8 +2689,8 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -2564,8 +2772,8 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -2585,8 +2793,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + rollup@4.61.1: + resolution: {integrity: sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2599,12 +2807,12 @@ packages: sass-formatter@0.7.9: resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} engines: {node: '>=10'} hasBin: true @@ -2620,8 +2828,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.22.0: - resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2631,8 +2839,8 @@ packages: engines: {node: '>=20.19.5', npm: '>=10.8.2'} hasBin: true - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -2660,8 +2868,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-json-comments@3.1.1: @@ -2688,13 +2896,13 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@4.0.0: - resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} hasBin: true - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} tailwindcss@3.4.19: @@ -2712,12 +2920,12 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -2730,8 +2938,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2766,20 +2974,20 @@ packages: typescript-auto-import-cache@0.3.6: resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} - typescript-eslint@8.57.0: - resolution: {integrity: sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==} + typescript-eslint@8.60.1: + resolution: {integrity: sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -2787,15 +2995,15 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} undici@7.14.0: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} - undici@7.24.4: - resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} + undici@7.24.8: + resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} unenv@2.0.0-rc.24: @@ -2834,8 +3042,8 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - unstorage@1.17.4: - resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -2917,8 +3125,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2957,40 +3165,40 @@ packages: yaml: optional: true - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: vite: optional: true - volar-service-css@0.0.68: - resolution: {integrity: sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==} + 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.68: - resolution: {integrity: sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==} + 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.68: - resolution: {integrity: sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==} + 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.68: - resolution: {integrity: sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==} + volar-service-prettier@0.0.70: + resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==} peerDependencies: '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 @@ -3000,35 +3208,35 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.68: - resolution: {integrity: sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==} + 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.68: - resolution: {integrity: sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==} + 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.68: - resolution: {integrity: sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==} + 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.9: - resolution: {integrity: sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==} + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} - vscode-html-languageservice@5.6.1: - resolution: {integrity: sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==} + 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==} @@ -3038,15 +3246,25 @@ packages: resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} engines: {node: '>=14.0.0'} + vscode-jsonrpc@9.0.0: + resolution: {integrity: sha512-+VvMmQPJhtvJ+8O+zu2JKIRiLxXF8NW7krWgyMGeOHrp4Cn23T5hc0v2LknNeopDOB70wghHAds7mKtcZ0I4Sg==} + engines: {node: '>=14.0.0'} + vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + vscode-languageserver-protocol@3.18.0: + resolution: {integrity: sha512-Zdz+kJ12Iz6tc11xfZyEo501bBATHXrCjmMfnaR3pMnf1CoqZBKIynba3P+/bi9VEdrMbNtAVKYpKhbODvqy+Q==} + 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-types@3.18.0: + resolution: {integrity: sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==} + vscode-languageserver@9.0.1: resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} hasBin: true @@ -3082,8 +3300,8 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20260317.1: - resolution: {integrity: sha512-ZuEq1OdrJBS+NV+L5HMYPCzVn49a2O60slQiiLpG44jqtlOo+S167fWC76kEXteXLLLydeuRrluRel7WdOUa4g==} + workerd@1.20260603.1: + resolution: {integrity: sha512-NPcbhI1++CS+fnELyXtsIR52en+5kwr/OrKeiQeYXGy10HxmPdsQBv9N+DU7hJIOOmBHhOGAAsoGDjyiQ2YCaA==} engines: {node: '>=16'} hasBin: true @@ -3097,12 +3315,12 @@ packages: '@cloudflare/workers-types': optional: true - wrangler@4.77.0: - resolution: {integrity: sha512-E2Gm69+K++BFd3QvoWjC290RPQj1vDOUotA++sNHmtKPb7EP6C8Qv+1D5Ii73tfZtyNgakpqHlh8lBBbVWTKAQ==} - engines: {node: '>=20.3.0'} + wrangler@4.98.0: + resolution: {integrity: sha512-cXfFUuF4rMIvE0hiMnXjEAB27ERryaCgquBJdUoPIjFzYYE1rbRdMUkEdQ18qDPUtsPvhJdqxLntixT9OfSzQw==} + engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260317.1 + '@cloudflare/workers-types': ^4.20260603.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3127,6 +3345,18 @@ packages: utf-8-validate: optional: true + ws@8.20.1: + resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} @@ -3134,8 +3364,8 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaml-language-server@1.19.2: - resolution: {integrity: sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==} + yaml-language-server@1.20.0: + resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} hasBin: true yaml@2.7.1: @@ -3143,8 +3373,8 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -3178,10 +3408,10 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: - zod: ^3.25 || ^4 + zod: ^3.25.28 || ^4 zod-to-ts@1.2.0: resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} @@ -3192,8 +3422,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3202,9 +3432,9 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@astrojs/check@0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': + '@astrojs/check@0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) + '@astrojs/language-server': 2.16.10(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 5.9.3 @@ -3213,15 +3443,15 @@ snapshots: - prettier - prettier-plugin-astro - '@astrojs/cloudflare@12.6.13(@types/node@24.12.0)(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(yaml@2.8.2)': + '@astrojs/cloudflare@12.6.13(@types/node@24.13.0)(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.7.0)(yaml@2.9.0)': dependencies: '@astrojs/internal-helpers': 0.7.6 '@astrojs/underscore-redirects': 1.0.0 - '@cloudflare/workers-types': 4.20260317.1 - astro: 5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) - tinyglobby: 0.2.15 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2) - wrangler: 4.59.2(@cloudflare/workers-types@4.20260317.1) + '@cloudflare/workers-types': 4.20260604.1 + astro: 5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0) + tinyglobby: 0.2.17 + vite: 6.4.3(@types/node@24.13.0)(jiti@2.7.0)(yaml@2.9.0) + wrangler: 4.59.2(@cloudflare/workers-types@4.20260604.1) transitivePeerDependencies: - '@types/node' - bufferutil @@ -3239,45 +3469,45 @@ snapshots: '@astrojs/compiler@2.13.1': {} - '@astrojs/internal-helpers@0.7.5': {} + '@astrojs/compiler@3.0.1': {} '@astrojs/internal-helpers@0.7.6': {} - '@astrojs/language-server@2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': + '@astrojs/language-server@2.16.10(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.13.1 - '@astrojs/yaml2ts': 0.2.2 + '@astrojs/yaml2ts': 0.2.4 '@jridgewell/sourcemap-codec': 1.5.5 '@volar/kit': 2.4.28(typescript@5.9.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.15 - volar-service-css: 0.0.68(@volar/language-service@2.4.28) - volar-service-emmet: 0.0.68(@volar/language-service@2.4.28) - volar-service-html: 0.0.68(@volar/language-service@2.4.28) - volar-service-prettier: 0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1) - volar-service-typescript: 0.0.68(@volar/language-service@2.4.28) - volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.28) - volar-service-yaml: 0.0.68(@volar/language-service@2.4.28) - vscode-html-languageservice: 5.6.1 + tinyglobby: 0.2.17 + 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.8.3) + 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.8.1 + prettier: 3.8.3 prettier-plugin-astro: 0.14.1 transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@6.3.10': + '@astrojs/markdown-remark@6.3.11': dependencies: - '@astrojs/internal-helpers': 0.7.5 + '@astrojs/internal-helpers': 0.7.6 '@astrojs/prism': 3.3.0 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 import-meta-resolve: 4.2.0 - js-yaml: 4.1.1 + js-yaml: 4.2.0 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 @@ -3285,8 +3515,8 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.22.0 - smol-toml: 1.6.0 + shiki: 3.23.0 + smol-toml: 1.6.1 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.1.0 @@ -3299,19 +3529,19 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/sitemap@3.7.2': + '@astrojs/sitemap@3.7.3': dependencies: sitemap: 9.0.1 stream-replace-string: 2.0.0 - zod: 4.3.6 + zod: 4.4.3 - '@astrojs/tailwind@6.0.2(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2))(tailwindcss@3.4.19(yaml@2.8.2))': + '@astrojs/tailwind@6.0.2(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0))(tailwindcss@3.4.19(yaml@2.9.0))': dependencies: - astro: 5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) - autoprefixer: 10.4.24(postcss@8.5.6) - postcss: 8.5.6 - postcss-load-config: 4.0.2(postcss@8.5.6) - tailwindcss: 3.4.19(yaml@2.8.2) + astro: 5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0) + autoprefixer: 10.5.0(postcss@8.5.15) + postcss: 8.5.15 + postcss-load-config: 4.0.2(postcss@8.5.15) + tailwindcss: 3.4.19(yaml@2.9.0) transitivePeerDependencies: - ts-node @@ -3329,72 +3559,74 @@ snapshots: '@astrojs/underscore-redirects@1.0.0': {} - '@astrojs/yaml2ts@0.2.2': + '@astrojs/yaml2ts@0.2.4': dependencies: - yaml: 2.8.2 + yaml: 2.9.0 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.0': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@capsizecss/unpack@4.0.0': dependencies: - fontkitten: 1.0.2 + fontkitten: 1.0.3 '@cloudflare/kv-asset-handler@0.4.2': {} + '@cloudflare/kv-asset-handler@0.5.0': {} + '@cloudflare/unenv-preset@2.10.0(unenv@2.0.0-rc.24)(workerd@1.20260114.0)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: workerd: 1.20260114.0 - '@cloudflare/unenv-preset@2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1)': + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260603.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260317.1 + workerd: 1.20260603.1 '@cloudflare/workerd-darwin-64@1.20260114.0': optional: true - '@cloudflare/workerd-darwin-64@1.20260317.1': + '@cloudflare/workerd-darwin-64@1.20260603.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260114.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260317.1': + '@cloudflare/workerd-darwin-arm64@1.20260603.1': optional: true '@cloudflare/workerd-linux-64@1.20260114.0': optional: true - '@cloudflare/workerd-linux-64@1.20260317.1': + '@cloudflare/workerd-linux-64@1.20260603.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260114.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20260317.1': + '@cloudflare/workerd-linux-arm64@1.20260603.1': optional: true '@cloudflare/workerd-windows-64@1.20260114.0': optional: true - '@cloudflare/workerd-windows-64@1.20260317.1': + '@cloudflare/workerd-windows-64@1.20260603.1': optional: true - '@cloudflare/workers-types@4.20260317.1': {} + '@cloudflare/workers-types@4.20260604.1': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3423,7 +3655,7 @@ snapshots: '@emmetio/stream-reader@2.2.0': {} - '@emnapi/runtime@1.8.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -3437,6 +3669,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true + '@esbuild/aix-ppc64@0.27.7': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true @@ -3446,6 +3681,9 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true + '@esbuild/android-arm64@0.27.7': + optional: true + '@esbuild/android-arm@0.25.12': optional: true @@ -3455,6 +3693,9 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true + '@esbuild/android-arm@0.27.7': + optional: true + '@esbuild/android-x64@0.25.12': optional: true @@ -3464,6 +3705,9 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true + '@esbuild/android-x64@0.27.7': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true @@ -3473,6 +3717,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true + '@esbuild/darwin-arm64@0.27.7': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true @@ -3482,6 +3729,9 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true + '@esbuild/darwin-x64@0.27.7': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true @@ -3491,6 +3741,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true + '@esbuild/freebsd-arm64@0.27.7': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true @@ -3500,6 +3753,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true + '@esbuild/freebsd-x64@0.27.7': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true @@ -3509,6 +3765,9 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true + '@esbuild/linux-arm64@0.27.7': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true @@ -3518,6 +3777,9 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true + '@esbuild/linux-arm@0.27.7': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true @@ -3527,6 +3789,9 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true + '@esbuild/linux-ia32@0.27.7': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true @@ -3536,6 +3801,9 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true + '@esbuild/linux-loong64@0.27.7': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true @@ -3545,6 +3813,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true + '@esbuild/linux-mips64el@0.27.7': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true @@ -3554,6 +3825,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true + '@esbuild/linux-ppc64@0.27.7': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true @@ -3563,6 +3837,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true + '@esbuild/linux-riscv64@0.27.7': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true @@ -3572,6 +3849,9 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true + '@esbuild/linux-s390x@0.27.7': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true @@ -3581,6 +3861,9 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true + '@esbuild/linux-x64@0.27.7': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true @@ -3590,6 +3873,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true + '@esbuild/netbsd-arm64@0.27.7': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -3599,6 +3885,9 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true + '@esbuild/netbsd-x64@0.27.7': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true @@ -3608,6 +3897,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true + '@esbuild/openbsd-arm64@0.27.7': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -3617,6 +3909,9 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true + '@esbuild/openbsd-x64@0.27.7': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true @@ -3626,6 +3921,9 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true + '@esbuild/openharmony-arm64@0.27.7': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true @@ -3635,6 +3933,9 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true + '@esbuild/sunos-x64@0.27.7': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true @@ -3644,6 +3945,9 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true + '@esbuild/win32-arm64@0.27.7': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true @@ -3653,6 +3957,9 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true + '@esbuild/win32-ia32@0.27.7': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -3662,9 +3969,12 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': + '@esbuild/win32-x64@0.27.7': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3685,30 +3995,30 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.1.1': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/css-tree@3.6.9': + '@eslint/css-tree@4.0.4': dependencies: - mdn-data: 2.23.0 + mdn-data: 2.28.1 source-map-js: 1.2.1 - '@eslint/css@1.0.0': + '@eslint/css@1.3.0': dependencies: - '@eslint/core': 1.1.1 - '@eslint/css-tree': 3.6.9 - '@eslint/plugin-kit': 0.6.1 + '@eslint/core': 1.2.1 + '@eslint/css-tree': 4.0.4 + '@eslint/plugin-kit': 0.7.2 '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.2.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -3716,9 +4026,9 @@ snapshots: '@eslint/js@9.39.4': {} - '@eslint/json@1.1.0': + '@eslint/json@1.2.0': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.6.1 '@humanwhocodes/momoa': 3.3.10 natural-compare: 1.4.0 @@ -3728,7 +4038,7 @@ snapshots: '@eslint/core': 0.17.0 '@eslint/plugin-kit': 0.4.1 github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-frontmatter: 2.0.1 mdast-util-gfm: 3.1.0 micromark-extension-frontmatter: 2.0.0 @@ -3746,23 +4056,33 @@ snapshots: '@eslint/plugin-kit@0.6.1': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/momoa@3.3.10': {} '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.0.0': {} + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: @@ -3846,7 +4166,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.8.1 + '@emnapi/runtime': 1.10.0 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -3877,6 +4197,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lucide/astro@1.17.0(astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0))': + dependencies: + astro: 5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0) + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3891,7 +4215,7 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@poppinss/colors@4.1.6': dependencies: @@ -3905,116 +4229,116 @@ snapshots: '@poppinss/exception@1.2.3': {} - '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + '@rollup/pluginutils@5.4.0(rollup@4.61.1)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: - rollup: 4.57.1 + rollup: 4.61.1 - '@rollup/rollup-android-arm-eabi@4.57.1': + '@rollup/rollup-android-arm-eabi@4.61.1': optional: true - '@rollup/rollup-android-arm64@4.57.1': + '@rollup/rollup-android-arm64@4.61.1': optional: true - '@rollup/rollup-darwin-arm64@4.57.1': + '@rollup/rollup-darwin-arm64@4.61.1': optional: true - '@rollup/rollup-darwin-x64@4.57.1': + '@rollup/rollup-darwin-x64@4.61.1': optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': + '@rollup/rollup-freebsd-arm64@4.61.1': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@rollup/rollup-freebsd-x64@4.61.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rollup/rollup-linux-arm-musleabihf@4.61.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rollup/rollup-linux-arm64-gnu@4.61.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rollup/rollup-linux-arm64-musl@4.61.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rollup/rollup-linux-loong64-gnu@4.61.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rollup/rollup-linux-loong64-musl@4.61.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rollup/rollup-linux-ppc64-gnu@4.61.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rollup/rollup-linux-ppc64-musl@4.61.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rollup/rollup-linux-riscv64-gnu@4.61.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rollup/rollup-linux-riscv64-musl@4.61.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rollup/rollup-linux-s390x-gnu@4.61.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rollup/rollup-linux-x64-gnu@4.61.1': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rollup/rollup-linux-x64-musl@4.61.1': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rollup/rollup-openbsd-x64@4.61.1': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@rollup/rollup-openharmony-arm64@4.61.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@rollup/rollup-win32-arm64-msvc@4.61.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@rollup/rollup-win32-ia32-msvc@4.61.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@rollup/rollup-win32-x64-gnu@4.61.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@rollup/rollup-win32-x64-msvc@4.61.1': optional: true - '@shikijs/core@3.22.0': + '@shikijs/core@3.23.0': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.22.0': + '@shikijs/engine-javascript@3.23.0': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 + oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@3.22.0': + '@shikijs/engine-oniguruma@3.23.0': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.22.0': + '@shikijs/langs@3.23.0': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/types': 3.23.0 - '@shikijs/themes@3.22.0': + '@shikijs/themes@3.23.0': dependencies: - '@shikijs/types': 3.22.0 + '@shikijs/types': 3.23.0 - '@shikijs/types@3.22.0': + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -4025,16 +4349,16 @@ snapshots: '@speed-highlight/core@1.2.15': {} - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(yaml@2.8.2))': + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19(yaml@2.9.0))': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.19(yaml@2.8.2) + tailwindcss: 3.4.19(yaml@2.9.0) - '@types/debug@4.1.12': + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/hast@3.0.4': dependencies: @@ -4052,108 +4376,108 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@24.12.0': + '@types/node@24.13.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/sax@1.2.7': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.13.0 '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.0': + '@typescript-eslint/scope-manager@8.60.1': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.57.0': {} + '@typescript-eslint/types@8.60.1': {} - '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/project-service': 8.60.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.0': + '@typescript-eslint/visitor-keys@8.60.1': dependencies: - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/types': 8.60.1 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.3.1': {} '@volar/kit@2.4.28(typescript@5.9.3)': dependencies: @@ -4176,14 +4500,14 @@ snapshots: path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 - vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-protocol: 3.18.0 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-protocol: 3.18.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -4200,32 +4524,32 @@ snapshots: emmet: 2.4.11 jsonc-parser: 2.3.1 vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 + vscode-languageserver-types: 3.18.0 vscode-uri: 3.1.0 '@vscode/l10n@0.0.18': {} - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} - ajv-draft-04@1.0.0(ajv@8.18.0): + ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: - ajv: 8.18.0 + ajv: 8.20.0 - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.18.0: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4248,7 +4572,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 arg@5.0.2: {} @@ -4258,33 +4582,33 @@ snapshots: array-iterate@2.0.1: {} - astro-eslint-parser@1.3.0: + astro-eslint-parser@1.4.0: dependencies: - '@astrojs/compiler': 2.13.1 - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - astrojs-compiler-sync: 1.1.1(@astrojs/compiler@2.13.1) + '@astrojs/compiler': 3.0.1 + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + astrojs-compiler-sync: 1.1.1(@astrojs/compiler@3.0.1) debug: 4.4.3 - entities: 6.0.1 + entities: 7.0.1 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 - semver: 7.7.4 + semver: 7.8.1 transitivePeerDependencies: - supports-color - astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2): + astro@5.18.2(@types/node@24.13.0)(jiti@2.7.0)(rollup@4.61.1)(typescript@5.9.3)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.13.1 - '@astrojs/internal-helpers': 0.7.5 - '@astrojs/markdown-remark': 6.3.10 + '@astrojs/internal-helpers': 0.7.6 + '@astrojs/markdown-remark': 6.3.11 '@astrojs/telemetry': 3.3.0 '@capsizecss/unpack': 4.0.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - acorn: 8.15.0 + '@rollup/pluginutils': 5.4.0(rollup@4.61.1) + acorn: 8.16.0 aria-query: 5.3.2 axobject-query: 4.1.0 boxen: 8.0.1 @@ -4295,12 +4619,12 @@ snapshots: cssesc: 3.0.0 debug: 4.4.3 deterministic-object-hash: 2.0.2 - devalue: 5.6.2 - diff: 8.0.3 + devalue: 5.8.1 + diff: 8.0.4 dlv: 1.1.3 dset: 3.1.4 es-module-lexer: 1.7.0 - esbuild: 0.27.3 + esbuild: 0.27.7 estree-walker: 3.0.3 flattie: 1.1.1 fontace: 0.4.1 @@ -4308,37 +4632,37 @@ snapshots: html-escaper: 3.0.3 http-cache-semantics: 4.2.0 import-meta-resolve: 4.2.0 - js-yaml: 4.1.1 + js-yaml: 4.2.0 magic-string: 0.30.21 - magicast: 0.5.2 + magicast: 0.5.3 mrmime: 2.0.1 neotraverse: 0.6.18 p-limit: 6.2.0 p-queue: 8.1.1 package-manager-detector: 1.6.0 piccolore: 0.1.3 - picomatch: 4.0.3 + picomatch: 4.0.4 prompts: 2.4.2 rehype: 13.0.2 - semver: 7.7.4 - shiki: 3.22.0 - smol-toml: 1.6.0 - svgo: 4.0.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 + semver: 7.8.1 + shiki: 3.23.0 + smol-toml: 1.6.1 + svgo: 4.0.1 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.6.0 unifont: 0.7.4 unist-util-visit: 5.1.0 - unstorage: 1.17.4 + unstorage: 1.17.5 vfile: 6.0.3 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2)) + vite: 6.4.3(@types/node@24.13.0)(jiti@2.7.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@6.4.3(@types/node@24.13.0)(jiti@2.7.0)(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.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: sharp: 0.34.5 @@ -4377,18 +4701,18 @@ snapshots: - uploadthing - yaml - astrojs-compiler-sync@1.1.1(@astrojs/compiler@2.13.1): + astrojs-compiler-sync@1.1.1(@astrojs/compiler@3.0.1): dependencies: - '@astrojs/compiler': 2.13.1 - synckit: 0.11.12 + '@astrojs/compiler': 3.0.1 + synckit: 0.11.13 - autoprefixer@10.4.24(postcss@8.5.6): + autoprefixer@10.5.0(postcss@8.5.15): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001770 + browserslist: 4.28.2 + caniuse-lite: 1.0.30001793 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.15 postcss-value-parser: 4.2.0 axobject-query@4.1.0: {} @@ -4401,7 +4725,7 @@ snapshots: base-64@1.0.0: {} - baseline-browser-mapping@2.9.19: {} + baseline-browser-mapping@2.10.33: {} binary-extensions@2.3.0: {} @@ -4420,12 +4744,12 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 - brace-expansion@1.1.12: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.4: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -4433,13 +4757,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001770 - electron-to-chromium: 1.5.286 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.367 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) callsites@3.1.0: {} @@ -4447,7 +4771,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001770: {} + caniuse-lite@1.0.30001793: {} ccount@2.0.1: {} @@ -4512,7 +4836,7 @@ snapshots: concat-map@0.0.1: {} - cookie-es@1.2.2: {} + cookie-es@1.2.3: {} cookie@1.1.1: {} @@ -4539,9 +4863,9 @@ snapshots: mdn-data: 2.0.28 source-map-js: 1.2.1 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 css-what@6.2.2: {} @@ -4562,7 +4886,7 @@ snapshots: deep-is@0.1.4: {} - defu@6.1.4: {} + defu@6.1.7: {} dequal@2.0.3: {} @@ -4574,7 +4898,7 @@ snapshots: dependencies: base-64: 1.0.0 - devalue@5.6.2: {} + devalue@5.8.1: {} devlop@1.1.0: dependencies: @@ -4582,7 +4906,7 @@ snapshots: didyoumean@1.2.2: {} - diff@8.0.3: {} + diff@8.0.4: {} dlv@1.1.3: {} @@ -4606,7 +4930,7 @@ snapshots: dset@3.1.4: {} - electron-to-chromium@1.5.286: {} + electron-to-chromium@1.5.367: {} emmet@2.4.11: dependencies: @@ -4621,8 +4945,12 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + error-stack-parser-es@1.0.5: {} + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} esbuild@0.25.12: @@ -4712,43 +5040,72 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.6.5(eslint@9.39.4(jiti@2.6.1)): + eslint-compat-utils@0.6.5(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) - semver: 7.7.4 + eslint: 9.39.4(jiti@2.7.0) + semver: 7.8.1 - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-astro@1.6.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-astro@1.7.0(eslint@9.39.4(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@jridgewell/sourcemap-codec': 1.5.5 - '@typescript-eslint/types': 8.57.0 - astro-eslint-parser: 1.3.0 - eslint: 9.39.4(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@9.39.4(jiti@2.6.1)) + '@typescript-eslint/types': 8.60.1 + astro-eslint-parser: 1.4.0 + eslint: 9.39.4(jiti@2.7.0) + eslint-compat-utils: 0.6.5(eslint@9.39.4(jiti@2.7.0)) globals: 16.5.0 - postcss: 8.5.6 + postcss: 8.5.15 postcss-selector-parser: 7.1.1 transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(prettier@3.8.3): dependencies: - eslint: 9.39.4(jiti@2.6.1) - prettier: 3.8.1 + eslint: 9.39.4(jiti@2.7.0) + prettier: 3.8.3 prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 + synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-scope@8.4.0: dependencies: @@ -4761,9 +5118,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.6.1): + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 @@ -4771,11 +5128,11 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -4798,14 +5155,14 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 esquery@1.7.0: @@ -4822,7 +5179,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -4846,7 +5203,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fastq@1.20.1: dependencies: @@ -4856,9 +5213,9 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 file-entry-cache@8.0.0: dependencies: @@ -4875,18 +5232,18 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.1 + flatted: 3.4.2 keyv: 4.5.4 - flatted@3.4.1: {} + flatted@3.4.2: {} flattie@1.1.1: {} fontace@0.4.1: dependencies: - fontkitten: 1.0.2 + fontkitten: 1.0.3 - fontkitten@1.0.2: + fontkitten@1.0.3: dependencies: tiny-inflate: 1.0.3 @@ -4901,7 +5258,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.4.0: {} + get-east-asian-width@1.6.0: {} github-slugger@2.0.0: {} @@ -4917,23 +5274,23 @@ snapshots: globals@16.5.0: {} - globals@17.4.0: {} + globals@17.6.0: {} - h3@1.15.5: + h3@1.15.11: dependencies: - cookie-es: 1.2.2 + cookie-es: 1.2.3 crossws: 0.3.5 - defu: 6.1.4 + defu: 6.1.7 destr: 2.0.5 iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.3 + ufo: 1.6.4 uncrypto: 0.1.3 has-flag@4.0.0: {} - hasown@2.0.2: + hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -4952,7 +5309,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.1.0 + property-information: 7.2.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -4969,7 +5326,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.1 hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 @@ -4990,7 +5347,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -5000,7 +5357,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -5021,7 +5378,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 html-escaper@3.0.3: {} @@ -5049,9 +5406,9 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 is-docker@3.0.0: {} @@ -5079,9 +5436,9 @@ snapshots: jiti@1.21.7: {} - jiti@2.6.1: {} + jiti@2.7.0: {} - js-yaml@4.1.1: + js-yaml@4.2.0: dependencies: argparse: 2.0.1 @@ -5120,24 +5477,18 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.17.21: {} - longest-streak@3.1.0: {} - lru-cache@11.2.6: {} - - lucide-astro@0.556.0(astro@5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)): - dependencies: - astro: 5.17.2(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) + lru-cache@11.5.1: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.2: + magicast@0.5.3: dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 markdown-table@3.0.4: {} @@ -5155,7 +5506,7 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.2: + mdast-util-from-markdown@2.0.3: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 @@ -5177,7 +5528,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -5195,7 +5546,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: @@ -5204,7 +5555,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -5214,7 +5565,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -5223,14 +5574,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -5249,7 +5600,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.1 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -5275,9 +5626,9 @@ snapshots: mdn-data@2.0.28: {} - mdn-data@2.12.2: {} + mdn-data@2.27.1: {} - mdn-data@2.23.0: {} + mdn-data@2.28.1: {} merge2@1.4.1: {} @@ -5459,7 +5810,7 @@ snapshots: micromark@4.0.2: dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 @@ -5482,7 +5833,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 miniflare@4.20260114.0: dependencies: @@ -5497,25 +5848,25 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20260317.2: + miniflare@4.20260603.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 - undici: 7.24.4 - workerd: 1.20260317.1 - ws: 8.18.0 + undici: 7.24.8 + workerd: 1.20260603.1 + ws: 8.20.1 youch: 4.1.0-beta.10 transitivePeerDependencies: - bufferutil - utf-8-validate - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.15 mrmime@2.0.1: {} @@ -5529,7 +5880,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -5543,7 +5894,7 @@ snapshots: node-mock-http@1.0.4: {} - node-releases@2.0.27: {} + node-releases@2.0.47: {} normalize-path@3.0.0: {} @@ -5559,15 +5910,15 @@ snapshots: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 - ufo: 1.6.3 + ufo: 1.6.4 ohash@2.0.11: {} - oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} - oniguruma-to-es@4.3.4: + oniguruma-to-es@4.3.6: dependencies: - oniguruma-parser: 0.12.1 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 @@ -5634,44 +5985,44 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pify@2.3.0: {} pirates@4.0.7: {} - postcss-import@15.1.0(postcss@8.5.6): + postcss-import@15.1.0(postcss@8.5.15): dependencies: - postcss: 8.5.6 + postcss: 8.5.15 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.11 + resolve: 1.22.12 - postcss-js@4.1.0(postcss@8.5.6): + postcss-js@4.1.0(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.6 + postcss: 8.5.15 - postcss-load-config@4.0.2(postcss@8.5.6): + postcss-load-config@4.0.2(postcss@8.5.15): dependencies: lilconfig: 3.1.3 - yaml: 2.8.2 + yaml: 2.9.0 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.15 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.6 - yaml: 2.8.2 + postcss: 8.5.15 + yaml: 2.9.0 - postcss-nested@6.2.0(postcss@8.5.6): + postcss-nested@6.2.0(postcss@8.5.15): dependencies: - postcss: 8.5.6 + postcss: 8.5.15 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -5691,9 +6042,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -5706,10 +6057,10 @@ snapshots: prettier-plugin-astro@0.14.1: dependencies: '@astrojs/compiler': 2.13.1 - prettier: 3.8.1 + prettier: 3.8.3 sass-formatter: 0.7.9 - prettier@3.8.1: {} + prettier@3.8.3: {} prismjs@1.30.0: {} @@ -5718,7 +6069,7 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - property-information@7.1.0: {} + property-information@7.2.0: {} punycode@2.3.1: {} @@ -5732,7 +6083,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 readdirp@4.1.2: {} @@ -5787,7 +6138,7 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: @@ -5824,9 +6175,10 @@ snapshots: resolve-from@4.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5857,35 +6209,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.57.1: + rollup@4.61.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.61.1 + '@rollup/rollup-android-arm64': 4.61.1 + '@rollup/rollup-darwin-arm64': 4.61.1 + '@rollup/rollup-darwin-x64': 4.61.1 + '@rollup/rollup-freebsd-arm64': 4.61.1 + '@rollup/rollup-freebsd-x64': 4.61.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.1 + '@rollup/rollup-linux-arm-musleabihf': 4.61.1 + '@rollup/rollup-linux-arm64-gnu': 4.61.1 + '@rollup/rollup-linux-arm64-musl': 4.61.1 + '@rollup/rollup-linux-loong64-gnu': 4.61.1 + '@rollup/rollup-linux-loong64-musl': 4.61.1 + '@rollup/rollup-linux-ppc64-gnu': 4.61.1 + '@rollup/rollup-linux-ppc64-musl': 4.61.1 + '@rollup/rollup-linux-riscv64-gnu': 4.61.1 + '@rollup/rollup-linux-riscv64-musl': 4.61.1 + '@rollup/rollup-linux-s390x-gnu': 4.61.1 + '@rollup/rollup-linux-x64-gnu': 4.61.1 + '@rollup/rollup-linux-x64-musl': 4.61.1 + '@rollup/rollup-openbsd-x64': 4.61.1 + '@rollup/rollup-openharmony-arm64': 4.61.1 + '@rollup/rollup-win32-arm64-msvc': 4.61.1 + '@rollup/rollup-win32-ia32-msvc': 4.61.1 + '@rollup/rollup-win32-x64-gnu': 4.61.1 + '@rollup/rollup-win32-x64-msvc': 4.61.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5898,15 +6250,15 @@ snapshots: dependencies: suf-log: 2.5.3 - sax@1.4.4: {} + sax@1.6.0: {} - semver@7.7.4: {} + semver@7.8.1: {} sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.8.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -5939,14 +6291,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.22.0: + shiki@3.23.0: dependencies: - '@shikijs/core': 3.22.0 - '@shikijs/engine-javascript': 3.22.0 - '@shikijs/engine-oniguruma': 3.22.0 - '@shikijs/langs': 3.22.0 - '@shikijs/themes': 3.22.0 - '@shikijs/types': 3.22.0 + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -5954,12 +6306,12 @@ snapshots: sitemap@9.0.1: dependencies: - '@types/node': 24.12.0 + '@types/node': 24.13.0 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.4 + sax: 1.6.0 - smol-toml@1.6.0: {} + smol-toml@1.6.1: {} source-map-js@1.2.1: {} @@ -5976,8 +6328,8 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 stringify-entities@4.0.4: dependencies: @@ -5988,7 +6340,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -6001,7 +6353,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 suf-log@2.5.3: @@ -6016,21 +6368,21 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@4.0.0: + svgo@4.0.1: dependencies: commander: 11.1.0 css-select: 5.2.2 - css-tree: 3.1.0 + css-tree: 3.2.1 css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 - sax: 1.4.4 + sax: 1.6.0 - synckit@0.11.12: + synckit@0.11.13: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.3.6 - tailwindcss@3.4.19(yaml@2.8.2): + tailwindcss@3.4.19(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -6046,13 +6398,13 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2) - postcss-nested: 6.2.0(postcss@8.5.6) + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.1.0(postcss@8.5.15) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15)(yaml@2.9.0) + postcss-nested: 6.2.0(postcss@8.5.15) postcss-selector-parser: 6.1.2 - resolve: 1.22.11 + resolve: 1.22.12 sucrase: 3.35.1 transitivePeerDependencies: - tsx @@ -6068,12 +6420,12 @@ snapshots: tiny-inflate@1.0.3: {} - tinyexec@1.0.2: {} + tinyexec@1.2.4: {} - tinyglobby@0.2.15: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 to-regex-range@5.0.1: dependencies: @@ -6083,7 +6435,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -6106,32 +6458,32 @@ snapshots: typescript-auto-import-cache@0.3.6: dependencies: - semver: 7.7.4 + semver: 7.8.1 - typescript-eslint@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.9.3: {} - ufo@1.6.3: {} + ufo@1.6.4: {} ultrahtml@1.6.0: {} uncrypto@0.1.3: {} - undici-types@7.16.0: {} + undici-types@7.18.2: {} undici@7.14.0: {} - undici@7.24.4: {} + undici@7.24.8: {} unenv@2.0.0-rc.24: dependencies: @@ -6149,7 +6501,7 @@ snapshots: unifont@0.7.4: dependencies: - css-tree: 3.1.0 + css-tree: 3.2.1 ofetch: 1.5.1 ohash: 2.0.11 @@ -6195,20 +6547,20 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unstorage@1.17.4: + unstorage@1.17.5: dependencies: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.5 - lru-cache: 11.2.6 + h3: 1.15.11 + lru-cache: 11.5.1 node-fetch-native: 1.6.7 ofetch: 1.5.1 - ufo: 1.6.3 + ufo: 1.6.4 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -6233,33 +6585,33 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2): + vite@6.4.3(@types/node@24.13.0)(jiti@2.7.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 - tinyglobby: 0.2.15 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.1 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.12.0 + '@types/node': 24.13.0 fsevents: 2.3.3 - jiti: 2.6.1 - yaml: 2.8.2 + jiti: 2.7.0 + yaml: 2.9.0 - vitefu@1.1.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2)): + vitefu@1.1.3(vite@6.4.3(@types/node@24.13.0)(jiti@2.7.0)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 6.4.3(@types/node@24.13.0)(jiti@2.7.0)(yaml@2.9.0) - volar-service-css@0.0.68(@volar/language-service@2.4.28): + volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: - vscode-css-languageservice: 6.3.9 + 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.68(@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 @@ -6268,31 +6620,31 @@ snapshots: optionalDependencies: '@volar/language-service': 2.4.28 - volar-service-html@0.0.68(@volar/language-service@2.4.28): + volar-service-html@0.0.70(@volar/language-service@2.4.28): dependencies: - vscode-html-languageservice: 5.6.1 + 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.68(@volar/language-service@2.4.28)(prettier@3.8.1): + volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3): dependencies: vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.28 - prettier: 3.8.1 + prettier: 3.8.3 - volar-service-typescript-twoslash-queries@0.0.68(@volar/language-service@2.4.28): + 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.68(@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.4 + semver: 7.8.1 typescript-auto-import-cache: 0.3.6 vscode-languageserver-textdocument: 1.0.12 vscode-nls: 5.2.0 @@ -6300,46 +6652,55 @@ snapshots: optionalDependencies: '@volar/language-service': 2.4.28 - volar-service-yaml@0.0.68(@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.19.2 + yaml-language-server: 1.20.0 optionalDependencies: '@volar/language-service': 2.4.28 - vscode-css-languageservice@6.3.9: + 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.1: + 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-languageserver-types: 3.18.0 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-languageserver-types: 3.18.0 vscode-nls: 5.2.0 vscode-uri: 3.1.0 vscode-jsonrpc@8.2.0: {} + vscode-jsonrpc@9.0.0: {} + vscode-languageserver-protocol@3.17.5: dependencies: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 + vscode-languageserver-protocol@3.18.0: + dependencies: + vscode-jsonrpc: 9.0.0 + vscode-languageserver-types: 3.18.0 + vscode-languageserver-textdocument@1.0.12: {} vscode-languageserver-types@3.17.5: {} + vscode-languageserver-types@3.18.0: {} + vscode-languageserver@9.0.1: dependencies: vscode-languageserver-protocol: 3.17.5 @@ -6370,15 +6731,15 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260114.0 '@cloudflare/workerd-windows-64': 1.20260114.0 - workerd@1.20260317.1: + workerd@1.20260603.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260317.1 - '@cloudflare/workerd-darwin-arm64': 1.20260317.1 - '@cloudflare/workerd-linux-64': 1.20260317.1 - '@cloudflare/workerd-linux-arm64': 1.20260317.1 - '@cloudflare/workerd-windows-64': 1.20260317.1 + '@cloudflare/workerd-darwin-64': 1.20260603.1 + '@cloudflare/workerd-darwin-arm64': 1.20260603.1 + '@cloudflare/workerd-linux-64': 1.20260603.1 + '@cloudflare/workerd-linux-arm64': 1.20260603.1 + '@cloudflare/workerd-windows-64': 1.20260603.1 - wrangler@4.59.2(@cloudflare/workers-types@4.20260317.1): + wrangler@4.59.2(@cloudflare/workers-types@4.20260604.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@cloudflare/unenv-preset': 2.10.0(unenv@2.0.0-rc.24)(workerd@1.20260114.0) @@ -6389,24 +6750,24 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20260114.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260317.1 + '@cloudflare/workers-types': 4.20260604.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - utf-8-validate - wrangler@4.77.0(@cloudflare/workers-types@4.20260317.1): + wrangler@4.98.0(@cloudflare/workers-types@4.20260604.1): dependencies: - '@cloudflare/kv-asset-handler': 0.4.2 - '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260317.1) + '@cloudflare/kv-asset-handler': 0.5.0 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260603.1) blake3-wasm: 2.1.5 esbuild: 0.27.3 - miniflare: 4.20260317.2 + miniflare: 4.20260603.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260317.1 + workerd: 1.20260603.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260317.1 + '@cloudflare/workers-types': 4.20260604.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil @@ -6422,32 +6783,33 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 ws@8.18.0: {} + ws@8.20.1: {} + xxhash-wasm@1.1.0: {} y18n@5.0.8: {} - yaml-language-server@1.19.2: + yaml-language-server@1.20.0: dependencies: '@vscode/l10n': 0.0.18 - ajv: 8.18.0 - ajv-draft-04: 1.0.0(ajv@8.18.0) - lodash: 4.17.21 - prettier: 3.8.1 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + prettier: 3.8.3 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-languageserver-types: 3.18.0 vscode-uri: 3.1.0 yaml: 2.7.1 yaml@2.7.1: {} - yaml@2.8.2: {} + yaml@2.9.0: {} yargs-parser@21.1.1: {} @@ -6484,7 +6846,7 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 - zod-to-json-schema@3.25.1(zod@3.25.76): + zod-to-json-schema@3.25.2(zod@3.25.76): dependencies: zod: 3.25.76 @@ -6495,6 +6857,6 @@ snapshots: zod@3.25.76: {} - zod@4.3.6: {} + zod@4.4.3: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..661850f --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +allowBuilds: + esbuild: true + sharp: true + workerd: true diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..b1088b4 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,10 @@ +/** @type {import("prettier").Config} */ +export default { + plugins: ["prettier-plugin-astro"], + overrides: [ + { + files: "*.astro", + options: { parser: "astro" }, + }, + ], +}; diff --git a/src/components/Compliance.astro b/src/components/Compliance.astro index bbaaa8d..a6482af 100644 --- a/src/components/Compliance.astro +++ b/src/components/Compliance.astro @@ -1,13 +1,32 @@ --- -import { Check } from 'lucide-astro'; +import { Check } from "@lucide/astro"; -const badges = ['GDPR', 'HIPAA', 'EU AI Act', 'TEE Attestation', 'AMD SEV-SNP', 'Intel TDX']; +const badges = [ + "GDPR", + "HIPAA", + "EU AI Act", + "TEE Attestation", + "AMD SEV-SNP", + "Intel TDX", +]; const proof = [ - ['CONFIDENTIAL6G', 'Quantum-resistant cryptography for 6G security', '€5M · Horizon Europe'], - ['TITAN', 'Confidential data collaboration & privacy-preserving AI', '€5M · Horizon Europe'], - ['ELASTIC', 'WebAssembly + confidential computing for 6G', 'Horizon Europe'], - ['Open governance', 'Linux Foundation · Confidential Computing Consortium', 'Apache 2.0'], + [ + "CONFIDENTIAL6G", + "Quantum-resistant cryptography for 6G security", + "€5M · Horizon Europe", + ], + [ + "TITAN", + "Confidential data collaboration & privacy-preserving AI", + "€5M · Horizon Europe", + ], + ["ELASTIC", "WebAssembly + confidential computing for 6G", "Horizon Europe"], + [ + "Open governance", + "Linux Foundation · Confidential Computing Consortium", + "Apache 2.0", + ], ]; --- @@ -15,28 +34,41 @@ const proof = [
- Trust, by architecture -

Compliance you can prove —
not just promise.

+ Trust, by architecture +

+ Compliance you can prove —
not just promise. +

- Sovereignty is enforced in hardware. Trusted Execution Environments isolate every workload, - remote attestation makes that isolation verifiable, and a complete audit trail makes it - provable to a regulator. Validated through three EU Horizon Europe research projects and built - as a member of the Linux Foundation and Confidential Computing Consortium. + Sovereignty is enforced in hardware. Trusted Execution Environments + isolate every workload, remote attestation makes that isolation + verifiable, and a complete audit trail makes it provable to a + regulator. Validated through three EU Horizon Europe research projects + and built as a member of the Linux Foundation and Confidential + Computing Consortium.

- {badges.map(b => ( - {b} - ))} + { + badges.map((b) => ( + + + {b} + + )) + }
- {proof.map(([t, d, m]) => ( -
-
{t}
-
{d}
-
{m}
-
- ))} + { + proof.map(([t, d, m]) => ( +
+
{t}
+
{d}
+
{m}
+
+ )) + }
diff --git a/src/components/CubeSpotlight.astro b/src/components/CubeSpotlight.astro index 0f5d288..abe0050 100644 --- a/src/components/CubeSpotlight.astro +++ b/src/components/CubeSpotlight.astro @@ -1,5 +1,5 @@ --- -import { Server, Layers, Shield, Eye, Lock } from "lucide-astro"; +import { Server, Layers, Shield, Eye, Lock } from "@lucide/astro"; const caps = [ { diff --git a/src/components/Deployment.astro b/src/components/Deployment.astro index e8d4d28..ab775d9 100644 --- a/src/components/Deployment.astro +++ b/src/components/Deployment.astro @@ -1,38 +1,72 @@ --- -import { Server, Lock, Globe, Layers, Plug, Check } from 'lucide-astro'; +import { Server, Lock, Globe, Layers, Plug, Check } from "@lucide/astro"; const models = [ - { Icon: Server, label: 'On-premises', desc: 'Run on your own servers and GPUs, behind your firewall, under your change control.' }, - { Icon: Lock, label: 'Air-gapped', desc: 'Fully disconnected deployment for the most sensitive classified and regulated environments.' }, - { Icon: Globe, label: 'Sovereign cloud', desc: 'Deploy in an EU or national cloud region that meets your data-residency mandate.' }, - { Icon: Layers, label: 'Private cloud', desc: 'Bring your own VPC. Hardware-isolated TEEs keep workloads confidential from the host.' }, - { Icon: Plug, label: 'Edge', desc: 'Push inference to the edge — factories, vehicles, field sites — with the same governance.' }, + { + Icon: Server, + label: "On-premises", + desc: "Run on your own servers and GPUs, behind your firewall, under your change control.", + }, + { + Icon: Lock, + label: "Air-gapped", + desc: "Fully disconnected deployment for the most sensitive classified and regulated environments.", + }, + { + Icon: Globe, + label: "Sovereign cloud", + desc: "Deploy in an EU or national cloud region that meets your data-residency mandate.", + }, + { + Icon: Layers, + label: "Private cloud", + desc: "Bring your own VPC. Hardware-isolated TEEs keep workloads confidential from the host.", + }, + { + Icon: Plug, + label: "Edge", + desc: "Push inference to the edge — factories, vehicles, field sites — with the same governance.", + }, ]; ---
- Deploy anywhere -

Wherever your data has to live,
your AI can run.

+ Deploy anywhere +

+ Wherever your data has to live,
your AI can run. +

-
- {models.map(({ Icon, label }, i) => ( - - ))} +
+ { + models.map(({ Icon, label }, i) => ( + + )) + }
- +

{models[0].label}

{models[0].desc}

@@ -45,24 +79,47 @@ const models = [ diff --git a/src/components/HomeHero.astro b/src/components/HomeHero.astro index 7d9bb4c..fe51cfb 100644 --- a/src/components/HomeHero.astro +++ b/src/components/HomeHero.astro @@ -1,12 +1,26 @@ --- + --- +
- Sovereign AI Infrastructure -

AI you own.
Infrastructure you control.

-

Ultraviolet is a sovereign AI infrastructure company. Our products let you build, deploy, govern, and operate AI entirely inside your own perimeter — on hardware you control, with nothing leaving your network.

+ Sovereign AI + Infrastructure +

+ AI you own.
Infrastructure you control. +

+

+ Ultraviolet is a sovereign AI infrastructure company. Our products let + you build, deploy, govern, and operate AI entirely inside your own + perimeter — on hardware you control, with nothing leaving your + network. +

Explore products Contact sales @@ -25,49 +39,77 @@
- perimeter sealed · zero egress · attested + perimeter sealed + · zero egress · attested
diff --git a/src/components/Industries.astro b/src/components/Industries.astro index 8299347..367604e 100644 --- a/src/components/Industries.astro +++ b/src/components/Industries.astro @@ -1,31 +1,70 @@ --- -import { Shield, Lock, Eye, Zap, Plug, Layers } from 'lucide-astro'; +import { Shield, Lock, Eye, Zap, Plug, Layers } from "@lucide/astro"; const list = [ - { Icon: Shield, t: 'Government', d: 'Sovereign AI for public administration and citizen services.', href: '/industries/government' }, - { Icon: Lock, t: 'Defense', d: 'Air-gapped AI for classified and mission-critical environments.', href: '/industries/defense' }, - { Icon: Eye, t: 'Healthcare', d: 'HIPAA-aligned AI on protected health data that never leaves the hospital.', href: '/industries/healthcare' }, - { Icon: Zap, t: 'Financial Services', d: 'Private AI for risk, fraud, and analysis under strict data residency.', href: '/industries/financial-services' }, - { Icon: Plug, t: 'Telecommunications', d: 'Confidential AI across multi-operator and 6G networks.', href: '/industries/telecommunications' }, - { Icon: Layers, t: 'Research', d: 'Privacy-preserving collaboration across institutions and borders.', href: '/industries/research' }, + { + Icon: Shield, + t: "Government", + d: "Sovereign AI for public administration and citizen services.", + href: "/industries/government", + }, + { + Icon: Lock, + t: "Defense", + d: "Air-gapped AI for classified and mission-critical environments.", + href: "/industries/defense", + }, + { + Icon: Eye, + t: "Healthcare", + d: "HIPAA-aligned AI on protected health data that never leaves the hospital.", + href: "/industries/healthcare", + }, + { + Icon: Zap, + t: "Financial Services", + d: "Private AI for risk, fraud, and analysis under strict data residency.", + href: "/industries/financial-services", + }, + { + Icon: Plug, + t: "Telecommunications", + d: "Confidential AI across multi-operator and 6G networks.", + href: "/industries/telecommunications", + }, + { + Icon: Layers, + t: "Research", + d: "Privacy-preserving collaboration across institutions and borders.", + href: "/industries/research", + }, ]; ---
- Built for regulated reality + Built for regulated + reality

Where sovereignty isn’t optional.

- {list.map(({ Icon, t, d, href }, i) => ( - - -

{t}

-

{d}

- -
- ))} + { + list.map(({ Icon, t, d, href }, i) => ( + + + + +

{t}

+

{d}

+ +
+ )) + }
diff --git a/src/components/LensPage.astro b/src/components/LensPage.astro index ab1d66f..974c8ad 100644 --- a/src/components/LensPage.astro +++ b/src/components/LensPage.astro @@ -2,7 +2,7 @@ import PageHero from "./PageHero.astro"; import SectionHead from "./SectionHead.astro"; import ProductCTA from "./ProductCTA.astro"; -import { Check } from "lucide-astro"; +import { Check } from "@lucide/astro"; interface ProductDef { which: string; @@ -19,7 +19,6 @@ interface Props { sub: string; compH2: string; compBody: string; - compBadges?: string[]; compRows: [string, string, string][]; compHeaders: [string, string]; product: ProductDef; @@ -36,7 +35,6 @@ const { sub, compH2, compBody, - compBadges, compRows, compHeaders, product, diff --git a/src/components/NavDropdown.astro b/src/components/NavDropdown.astro index 35e2c17..05a0d7e 100644 --- a/src/components/NavDropdown.astro +++ b/src/components/NavDropdown.astro @@ -6,23 +6,52 @@ interface Props { } const { label, href, panelClass } = Astro.props; --- +
- {href ? ( - - {label} - - - ) : ( - - )} -
+ { + href ? ( + + {label} + + + ) : ( + + ) + } +
diff --git a/src/components/PageHero.astro b/src/components/PageHero.astro index 6f3c54b..0ce748f 100644 --- a/src/components/PageHero.astro +++ b/src/components/PageHero.astro @@ -14,63 +14,113 @@ interface Props { } const { - eyebrow, h1, sub, - primaryLabel, primaryHref, primaryExternal, - secondaryLabel, secondaryHref, secondaryExternal, - center, meta, + eyebrow, + h1, + sub, + primaryLabel, + primaryHref, + primaryExternal, + secondaryLabel, + secondaryHref, + secondaryExternal, + center, + meta, } = Astro.props; --- -{center ? ( -
-
-
- {eyebrow} -

-

{sub}

-
- {primaryLabel} - {secondaryLabel && ( - {secondaryLabel} - )} -
- {Astro.slots.has('default') && ( -
- -
- )} -

-
-
-) : ( -
-
-
-
- {eyebrow} +{ + center ? ( +
+
+
+ +

-

{sub}

+

{sub}

- {meta && ( -
- {meta.map((m, i) => ( - <> - {i > 0 && ·} - {i === 0 && }{m} - - ))} + {Astro.slots.has("default") && ( +
+
)}
-
- +
+

+ ) : ( +
+
+
+
+ + +

+

{sub}

+
+ + {primaryLabel} + + {secondaryLabel && ( + + {secondaryLabel} + + )} +
+ {meta && ( +
+ {meta.map((m, i) => ( + <> + {i > 0 && ·} + + {i === 0 && } + {m} + + + ))} +
+ )} +

+
+ +
-
-
-)} +
+ ) +} diff --git a/src/components/Principles.astro b/src/components/Principles.astro index fff4f6e..697bd81 100644 --- a/src/components/Principles.astro +++ b/src/components/Principles.astro @@ -1,25 +1,41 @@ --- const items = [ - ['01', 'Private', 'Every prompt, embedding, and response stays inside your perimeter. Zero outbound by default. No hidden telemetry, no training on your data.'], - ['02', 'Sovereign', 'Data residency, compliance, and operational control governed by your policies and your jurisdiction — never a vendor\'s terms of service.'], - ['03', 'Open', 'Open core. Cube AI and Cocos AI are Apache 2.0 — inspect the source, fork the platform, extend it for your environment. No black boxes, no lock-in.'], + [ + "01", + "Private", + "Every prompt, embedding, and response stays inside your perimeter. Zero outbound by default. No hidden telemetry, no training on your data.", + ], + [ + "02", + "Sovereign", + "Data residency, compliance, and operational control governed by your policies and your jurisdiction — never a vendor's terms of service.", + ], + [ + "03", + "Open", + "Open core. Cube AI and Cocos AI are Apache 2.0 — inspect the source, fork the platform, extend it for your environment. No black boxes, no lock-in.", + ], ]; ---
- First principles + First principles

Three commitments
behind every product.

- {items.map(([n, t, d], i) => ( -
-
{n}
-

{t}

-

{d}

-
- ))} + { + items.map(([n, t, d], i) => ( +
+
{n}
+

{t}

+

{d}

+
+ )) + }
diff --git a/src/components/PrismCocos.astro b/src/components/PrismCocos.astro index 2d5b477..13f4134 100644 --- a/src/components/PrismCocos.astro +++ b/src/components/PrismCocos.astro @@ -1,18 +1,23 @@ --- + --- +
- + Prism AI

Collaborate on AI
without exposing data.

- Prism AI runs joint AI workloads across organizational boundaries inside Trusted Execution - Environments. Each party keeps its data private while sharing only the result. A commercial - platform with free and enterprise tiers. + Prism AI runs joint AI workloads across organizational boundaries + inside Trusted Execution Environments. Each party keeps its data + private while sharing only the result. A commercial platform with free + and enterprise tiers.

@@ -21,40 +26,58 @@ prism.ultraviolet.rs
- Prism AI dashboard showing confidential computations and CVM status + Prism AI dashboard showing confidential computations and CVM status
Multi-party computation RBAC + ABAC Free + Enterprise
- Explore Prism AI + Explore Prism AI
-
+
- + Cocos AI

The open foundation
the stack runs on.

- Cocos AI is the open-source hardware abstraction layer for Trusted Execution Environments — - the transparent, auditable substrate beneath Cube and Prism. Inspect it, fork it, extend it. + Cocos AI is the open-source hardware abstraction layer for Trusted + Execution Environments — the transparent, auditable substrate beneath + Cube and Prism. Inspect it, fork it, extend it.

- {[ - ['AMD SEV-SNP', 'Hardware memory encryption'], - ['Intel TDX', 'Confidential VMs'], - ['Remote attestation', 'Verifiable trust'], - ['Apache 2.0', 'Consortium-backed'], - ].map(([t, d]) => ( -
-
{t}
-
{d}
-
- ))} + { + [ + ["AMD SEV-SNP", "Hardware memory encryption"], + ["Intel TDX", "Confidential VMs"], + ["Remote attestation", "Verifiable trust"], + ["Apache 2.0", "Consortium-backed"], + ].map(([t, d]) => ( +
+
{t}
+
{d}
+
+ )) + }
- Explore Cocos AI + Explore Cocos AI
diff --git a/src/components/Problem.astro b/src/components/Problem.astro index 21c8d60..d82ad08 100644 --- a/src/components/Problem.astro +++ b/src/components/Problem.astro @@ -1,35 +1,65 @@ --- -import { Check } from 'lucide-astro'; +import { Check } from "@lucide/astro"; const rows = [ - ['Where do prompts go?', 'To a third-party cloud, logged and retained on someone else\'s terms.', 'Never leave your perimeter. Zero outbound by default.'], - ['Who can see your data?', 'The provider, their subprocessors, and a foreign jurisdiction.', 'Only you. Hardware-isolated inside Trusted Execution Environments.'], - ['Can you prove compliance?', 'You inherit a vendor\'s policies and hope for the best.', 'Compliance by architecture — GDPR, HIPAA, the EU AI Act.'], - ['What happens at renewal?', 'Prices rise, models change, lock-in deepens.', 'Apache 2.0. Own it, fork it, run it forever.'], + [ + "Where do prompts go?", + "To a third-party cloud, logged and retained on someone else's terms.", + "Never leave your perimeter. Zero outbound by default.", + ], + [ + "Who can see your data?", + "The provider, their subprocessors, and a foreign jurisdiction.", + "Only you. Hardware-isolated inside Trusted Execution Environments.", + ], + [ + "Can you prove compliance?", + "You inherit a vendor's policies and hope for the best.", + "Compliance by architecture — GDPR, HIPAA, the EU AI Act.", + ], + [ + "What happens at renewal?", + "Prices rise, models change, lock-in deepens.", + "Apache 2.0. Own it, fork it, run it forever.", + ], ]; ---
- The status quo is a liability -

Frontier AI shouldn’t mean
surrendering your data.

+ The status quo is a + liability +

+ Frontier AI shouldn’t mean
surrendering your data. +

- Every prompt sent to a hosted model is data leaving your control. For regulated - and sovereign organizations, that’s not a feature trade-off — it’s an unacceptable risk. + Every prompt sent to a hosted model is data leaving your control. For + regulated and sovereign organizations, that’s not a feature + trade-off — it’s an unacceptable risk.

Hosted AI APIsUltraviolet
- {rows.map(([q, a, b]) => ( -
- {q} - {a} - {b} -
- ))} + { + rows.map(([q, a, b]) => ( +
+ {q} + + + {a} + + + + {b} + +
+ )) + }
diff --git a/src/components/ProductCTA.astro b/src/components/ProductCTA.astro index e6ccb08..e9e316d 100644 --- a/src/components/ProductCTA.astro +++ b/src/components/ProductCTA.astro @@ -11,20 +11,47 @@ interface Props { note?: string; } -const { h2, sub, primaryLabel, primaryHref, primaryExternal, secondaryLabel, secondaryHref, secondaryExternal, note } = Astro.props; +const { + h2, + sub, + primaryLabel, + primaryHref, + primaryExternal, + secondaryLabel, + secondaryHref, + secondaryExternal, + note, +} = Astro.props; ---
- — Get started + — Get started

{sub}

- {primaryLabel} - {secondaryLabel && ( - {secondaryLabel} - )} + {primaryLabel} + { + secondaryLabel && ( + + {secondaryLabel} + + ) + }
{note &&
{note}
}

diff --git a/src/components/SectionHead.astro b/src/components/SectionHead.astro index e920d3a..c72b0b5 100644 --- a/src/components/SectionHead.astro +++ b/src/components/SectionHead.astro @@ -6,11 +6,19 @@ interface Props { class?: string; } -const { eyebrow, title, intro, class: className = '' } = Astro.props; +const { eyebrow, title, intro, class: className = "" } = Astro.props; ---
- {eyebrow} + {eyebrow}

- {intro &&

{intro}

} + { + intro && ( +

+ {intro} +

+ ) + }

diff --git a/src/content/blog/amd-sev-snp-vs-intel-tdx.md b/src/content/blog/amd-sev-snp-vs-intel-tdx.md index a5e94dc..be1a4aa 100644 --- a/src/content/blog/amd-sev-snp-vs-intel-tdx.md +++ b/src/content/blog/amd-sev-snp-vs-intel-tdx.md @@ -6,17 +6,17 @@ excerpt: "A technical comparison of AMD SEV-SNP and Intel TDX confidential compu author: name: "sammy oina" picture: "https://avatars.githubusercontent.com/u/44265300?v=4" -tags: [security, confidential-computing, amd, intel, technical-deep-dive, "cube ai"] +tags: + [security, confidential-computing, amd, intel, technical-deep-dive, "cube ai"] image: /img/amd-sev-snp-vs-intel-tdx/amd_sev_snp_vs_intel_tdx_cover.png coverImage: /img/amd-sev-snp-vs-intel-tdx/amd_sev_snp_vs_intel_tdx_cover.png ogImage: /img/amd-sev-snp-vs-intel-tdx/amd_sev_snp_vs_intel_tdx_cover.png date: 2026-02-24 --- - In the rapidly evolving landscape of [Confidential Computing](/blog/confidential-computing-meets-ai), hardware-based isolation is the foundation of trust. For security engineers and infrastructure teams, understanding the underlying Trusted Execution Environment (TEE) technologies is crucial for deploying secure AI workloads. -Cube AI is designed to run seamlessly on the two leading hardware-based TEE platforms: **AMD SEV-SNP** and **Intel TDX**. +Cube AI is designed to run seamlessly on the two leading hardware-based TEE platforms: **AMD SEV-SNP** and **Intel TDX**. This post provides a technical comparison of these technologies and explains how Cube AI abstracts their complexities to provide a unified, secure platform for your AI models. @@ -30,9 +30,9 @@ Both AMD and Intel have developed robust technologies to solve the same problem: AMD SEV-SNP is the third generation of AMD's confidential computing technology. It builds upon the memory encryption of the original SEV and the register protection of SEV-ES. -* **Key Mechanism**: Memory Encryption Key (MEK) management is handled by the **AMD Secure Processor (ASP)**, a dedicated ARM core on the die. -* **Integrity Protection**: "Secure Nested Paging" (SNP) adds strong integrity protection to prevent hypervisors from remapping memory (e.g., integrity checks on page table lookups). -* **VMPL (Virtual Machine Privilege Levels)**: SEV-SNP introduces VMPL rings (0-3), allowing a guest VM to run a "paravisor" or other privileged components within the CVM that are more privileged than the guest OS but less privileged than the hardware root of trust. +- **Key Mechanism**: Memory Encryption Key (MEK) management is handled by the **AMD Secure Processor (ASP)**, a dedicated ARM core on the die. +- **Integrity Protection**: "Secure Nested Paging" (SNP) adds strong integrity protection to prevent hypervisors from remapping memory (e.g., integrity checks on page table lookups). +- **VMPL (Virtual Machine Privilege Levels)**: SEV-SNP introduces VMPL rings (0-3), allowing a guest VM to run a "paravisor" or other privileged components within the CVM that are more privileged than the guest OS but less privileged than the hardware root of trust. **Further Reading**: [AMD SEV-SNP Specification](https://www.amd.com/en/technologies/se/secure-encrypted-virtualization) | [AMD Secure Processor Technical Reference](https://developer.amd.com/sev/) @@ -40,34 +40,36 @@ AMD SEV-SNP is the third generation of AMD's confidential computing technology. Intel TDX creates an architectural isolation boundary known as a **Trust Domain (TD)**. -* **Key Mechanism**: The **Intel TDX Module** is a software module that runs in a special CPU mode (SEAM - Secure Arbitration Mode) to manage valid transitions between the host and the guest (TD). -* **MKTME (Multi-Key Total Memory Encryption)**: Uses AES-128-XTS encryption engines in the memory controller. -* **Measurement**: TDX provides a comprehensive measurement of the initial VM state, including the firmware (TDVF) and the kernel. +- **Key Mechanism**: The **Intel TDX Module** is a software module that runs in a special CPU mode (SEAM - Secure Arbitration Mode) to manage valid transitions between the host and the guest (TD). +- **MKTME (Multi-Key Total Memory Encryption)**: Uses AES-128-XTS encryption engines in the memory controller. +- **Measurement**: TDX provides a comprehensive measurement of the initial VM state, including the firmware (TDVF) and the kernel. **Further Reading**: [Intel TDX Overview](https://www.intel.com/content/www/us/en/architecture-and-technology/trust-domain-extensions.html) | [Intel TDX Module Documentation](https://software.intel.com/content/www/us/en/develop/download/intel-trust-domain-extension-module-documentation.html) ## Feature Comparison -| Feature | AMD SEV-SNP | Intel TDX | -| :--- | :--- | :--- | -| **Isolation Boundary** | VM (with VMPLs) | Trust Domain (TD) | -| **Memory Encryption** | AES-128 / AES-256 XTS (Engine in Memory Controller) | AES-128-XTS (MKTME) | -| **Attestation Root** | AMD Secure Processor (ASP) | SGX Quoting Enclave (QE) | -| **Register State** | Encrypted (SEV-ES) | Managed by hardware/TDX Module | -| **Key Management** | Cloud Provider independent (mostly) | Cloud Provider independent | +| Feature | AMD SEV-SNP | Intel TDX | +| :--------------------- | :-------------------------------------------------- | :----------------------------- | +| **Isolation Boundary** | VM (with VMPLs) | Trust Domain (TD) | +| **Memory Encryption** | AES-128 / AES-256 XTS (Engine in Memory Controller) | AES-128-XTS (MKTME) | +| **Attestation Root** | AMD Secure Processor (ASP) | SGX Quoting Enclave (QE) | +| **Register State** | Encrypted (SEV-ES) | Managed by hardware/TDX Module | +| **Key Management** | Cloud Provider independent (mostly) | Cloud Provider independent | ## Security Guarantees & Threat Model Both technologies operate under a similar threat model, designed to protect against powerful adversaries. ### What is Protected? -* **Hypervisor Access**: The cloud provider's hypervisor (KVM, Hyper-V) cannot read guest memory. Attempts to read encrypted pages result in ciphertext or exceptions. -* **Host Admin**: Root access on the physical host does not grant access to the guest VM's memory. -* **Physical Attacks**: Basic cold-boot attacks are mitigated, though sophisticated physical access to the die itself is often out of scope for standard cloud threat models. + +- **Hypervisor Access**: The cloud provider's hypervisor (KVM, Hyper-V) cannot read guest memory. Attempts to read encrypted pages result in ciphertext or exceptions. +- **Host Admin**: Root access on the physical host does not grant access to the guest VM's memory. +- **Physical Attacks**: Basic cold-boot attacks are mitigated, though sophisticated physical access to the die itself is often out of scope for standard cloud threat models. ### What is Out of Scope? -* **Guest OS Vulnerabilities**: If the software *inside* the TEE is compromised (e.g., a vulnerability in the Linux kernel running in the VM), the TEE protects the *execution*, but the attacker is "inside the house." **This is why Cube AI uses a minimal, hardened OS image.** -* **Denial of Service**: The host can always turn off the VM. + +- **Guest OS Vulnerabilities**: If the software _inside_ the TEE is compromised (e.g., a vulnerability in the Linux kernel running in the VM), the TEE protects the _execution_, but the attacker is "inside the house." **This is why Cube AI uses a minimal, hardened OS image.** +- **Denial of Service**: The host can always turn off the VM. ## Cube AI Architecture: The Unified Layer @@ -76,33 +78,34 @@ Cube AI abstracts the differences between SEV-SNP and Intel TDX, allowing you to ```mermaid graph TD User["User / Client App"] --> Proxy["Cube AI Proxy"] - + subgraph CVM ["Confidential VM (CVM)"] Agent["Cube Agent"] LLM["vLLM / Ollama"] end - + subgraph HAL ["Hardware Abstraction Layer"] Detect["TEE Detection"] Attest["Attestation Report Gen"] end - + subgraph HW ["Hardware"] AMD["AMD EPYC (SEV-SNP)"] Intel["Intel Xeon (TDX)"] end - + Proxy -->|Attested TLS| Agent Agent --> LLM Agent --> Detect Detect -.->|Calls| AMD Detect -.->|Calls| Intel - + style CVM fill:#ecfdf5,stroke:#22c55e style HW fill:#1e293b,stroke:#94a3b8,color:#fff ``` When Cube AI starts: + 1. It **automatically detects** the platform (AMD or Intel). 2. It loads the appropriate kernel modules (e.g., `sev-guest` or `tdx-guest`). Supported by Cube's Hardware Abstraction Layer built on buildroot. 3. It fetches the **Attestation Report** using a unified internal interface. @@ -117,10 +120,11 @@ While the hardware is standard, cloud providers expose these features differentl ## Key Takeaway You don't need to be a CPU architect to use Confidential Computing. Whether your infrastructure runs on the red team (AMD) or the blue team (Intel), **Cube AI** provides the same high-level security guarantees: -* Your model weights are protected. -* Your user prompts are encrypted in memory. -* The cloud provider is locked out. + +- Your model weights are protected. +- Your user prompts are encrypted in memory. +- The cloud provider is locked out. --- -*Ready to secure your AI infrastructure? Read our guide on [Architecture](https://cube.ultraviolet.rs/docs/architecture) or dive into the [Attestation specs](https://cube.ultraviolet.rs/docs/attestation).* +_Ready to secure your AI infrastructure? Read our guide on [Architecture](https://cube.ultraviolet.rs/docs/architecture) or dive into the [Attestation specs](https://cube.ultraviolet.rs/docs/attestation)._ diff --git a/src/content/blog/atls-binding-milestone.md b/src/content/blog/atls-binding-milestone.md index c74d7c1..145e2ad 100644 --- a/src/content/blog/atls-binding-milestone.md +++ b/src/content/blog/atls-binding-milestone.md @@ -8,7 +8,15 @@ authors: picture: "https://avatars.githubusercontent.com/u/44265300?v=4" - name: "Danko Miladinovic" picture: "https://avatars.githubusercontent.com/u/72250944?v=4" -tags: [confidential-computing, attestation, aTLS, security, TLS-Exporters, IETF-SEAT] +tags: + [ + confidential-computing, + attestation, + aTLS, + security, + TLS-Exporters, + IETF-SEAT, + ] date: 2026-03-27 image: "/img/atls-milestone/cover.png" --- @@ -24,6 +32,7 @@ Today, we are thrilled to announce that we have fulfilled our roadmap. With [PR The previous vulnerability (and the class of attacks identified by Sardar et al. using ProVerif) stemmed from the fact that an attacker who could extract a TEE's ephemeral private key — even momentarily — could relay that TEE's attestation report to a different connection. In the old design: + 1. Evidence tied to `Hash(ServerPubKey ‖ Nonce)`. 2. Nonce delivered via SNI (a non-standard hack). 3. Verification happened in a custom callback that "bolted on" trust. @@ -37,9 +46,11 @@ The gold standard for aTLS, as defined by the IETF SEAT (Secure Evidence ATtesta Cocos AI now achieves this through three major architectural shifts: ### 1. Exclusive TLS 1.3 + We have dropped support for older TLS versions in our aTLS paths. TLS 1.3 provides a cleaner handshake and superior key derivation functions (HKDF) which are essential for robust session export. ### 2. TLS Exporters & Nonce Freshness (RFC 5705) + A common misconception is that session binding replaces the need for a nonce. In the new Cocos aTLS flow (based on the [IETF EXPAT draft](https://datatracker.ietf.org/doc/draft-fossati-seat-expat/)), the nonce provided by the CLI is now carried within the `certificate_request_context`. This context is then used as the `context_value` for the TLS Exporter, ensuring that the derived value is both fresh (non-repeating) and cryptographically bound to the session: @@ -60,30 +71,31 @@ The binding value, which serves as the final attestation challenge, is defined a $$\text{Binding} = \text{Hash}(\text{PublicKey} \parallel \text{TLS-Exporter}(\text{Label, Nonce}))$$ ### 3. Level 2 Binding Logic -By including this TLS-exported binder in the attestation's `report_data`, we achieve **Level 2 Binding** (Correlation to Handshake Traffic Keys). This ensures that the evidence is fundamentally bound to the cryptographic state of the *specific* TLS session. + +By including this TLS-exported binder in the attestation's `report_data`, we achieve **Level 2 Binding** (Correlation to Handshake Traffic Keys). This ensures that the evidence is fundamentally bound to the cryptographic state of the _specific_ TLS session. ```mermaid sequenceDiagram participant Client participant Server - + Note over Client,Server: 1. Standard TLS 1.3 Handshake Client->>Server: ClientHello Server-->>Client: ServerHello... Finished Client-->>Server: [Certificate]... Finished - + Note over Client,Server: 2. Secure Channel Established - + Client->>Server: AuthenticatorRequest (Nonce, Extensions) - + Note over Server: 3. Compute Binding Note over Server: ExportedValue = TLS-Exporter("Attestation", Nonce) Note over Server: Binding = Hash(PubKey || ExportedValue) - + Server->>Server: Request TEE Report (report_data = Binding) - + Server-->>Client: Authenticator (Certificate + Attestation Payload + Finished) - + Note over Client: 4. Formal Verification Note over Client: Verify report_data == Hash(PubKey || Client-Side Exporter) ``` @@ -95,6 +107,7 @@ Even if an adversary manages to extract the ephemeral private key, they **cannot Standardization and protocol hygiene were also key goals. The previous use of the SNI (Server Name Indication) field to transport nonces was a pragmatic but fragile hack. The new implementation moves away from SNI abuse. Instead, it utilizes a sophisticated frame-based protocol over the TLS connection or **Exported Authenticators** (RFC 9162). This allows for a clean separation of concerns: + - **TLS** handles the secure channel. - **Exported Authenticators** handle the platform identity and evidence exchange. @@ -106,7 +119,7 @@ As detailed in the advisory, the flaw was architectural: by binding attestation By implementing **Level 2 binding** with TLS 1.3 Exporters, we have fundamentally closed this vector. The attestation evidence is now cryptographically tied to the unique handshake transcript and session keys of the specific connection. Even in a hypothetical scenario where a private key leaks, the stolen evidence cannot be relayed to a different session; it is mathematically anchored to the secure channel it was generated for. -## Cocos v0.9.0: A New Era of Modularity +## Cocos v0.9.0: A New Era of Modularity While Level 2 session binding is a pivotal security milestone, it is just one part of the broader **Cocos v0.9.0** release. This version marks a significant architectural shift towards modularity and production-readiness: @@ -130,4 +143,5 @@ Cocos AI is now more than just "attested." It is **formally bound**. By migratin Upgrade your CLI and Agent to the latest version (v0.9.0+) to take advantage of these security enhancements. --- -*For more technical details, check out the [Cocos repository](https://github.com/ultravioletrs/cocos) and the [new aTLS implementation](https://github.com/ultravioletrs/cocos/tree/main/pkg/atls).* + +_For more technical details, check out the [Cocos repository](https://github.com/ultravioletrs/cocos) and the [new aTLS implementation](https://github.com/ultravioletrs/cocos/tree/main/pkg/atls)._ diff --git a/src/content/blog/cocos-prism-release.md b/src/content/blog/cocos-prism-release.md index dfab937..49e9ea1 100644 --- a/src/content/blog/cocos-prism-release.md +++ b/src/content/blog/cocos-prism-release.md @@ -27,6 +27,7 @@ Cocos AI (Confidential Computing System for AI) is a comprehensive software plat ![Cocos Architecture](https://raw.githubusercontent.com/ultravioletrs/cocos-docs/main/static/img/arch.png) The platform enables: + - **Model training and inference on sensitive data** without ever exposing that data - **Secure Multi-Party Computation (SMPC)** for collaborative analysis across different data sources - **Hardware attestation** to verify the integrity and trustworthiness of computations @@ -43,16 +44,19 @@ While Cocos AI provides the core confidential computing infrastructure, **Prism* ### What Prism Brings to the Table **1. User & Workspace Management** + - Create and manage users across workspaces (consortiums) - Fine-grained role-based access control (RBAC) - Multi-tenant isolation for collaborative environments **2. Policy Management** + - Define access control policies between users, workspaces, and computations - Manage asset access and computational workflows - Enforce data governance rules seamlessly **3. Asset Management** + - Organize and search datasets and algorithms - Track asset usage across computations - Maintain metadata and audit trails @@ -60,16 +64,19 @@ While Cocos AI provides the core confidential computing infrastructure, **Prism* ![Asset Management Dashboard](https://raw.githubusercontent.com/ultravioletrs/prism-docs/main/static/img/asset_management.png) **4. Computation Orchestration** + - Submit and monitor confidential computations - View computation results with audit logs - Track computation policies and resource allocation **5. Billing & Subscription Management** + - Manage subscription tiers and payment information - Track resource usage and costs - Email notifications for important events **6. Secure Infrastructure** + - Leverage TEE-based secure VM provisioning - End-to-end encryption throughout the workflow - Comprehensive logging and monitoring @@ -83,6 +90,7 @@ Cocos v0.8.0 brings significant improvements focused on attestation, security, a ### Key Highlights **Enhanced Attestation Policy** + - Improved CLI attestation policy tools for better developer experience - Updated configurations for AMD SEV-SNP and Intel TDX platforms - Added reported TCB (Trusted Computing Base) support for more comprehensive security validation @@ -91,22 +99,24 @@ Cocos v0.8.0 brings significant improvements focused on attestation, security, a ![SEV-SNP Threat Model](https://raw.githubusercontent.com/ultravioletrs/cocos-docs/main/static/img/SEVSNPThreatModel.png) **Performance Innovations** + - **VCEK Caching on aTLS Verification**: Significantly improves performance by caching VCEK (Versioned Chip Endorsement Key) certificates during attestation TLS verification - Optimized certificate handling and verification workflows - Enhanced HTTP and gRPC client reusability **Architecture Enhancements** + - Refactored attestation handling: `AttestationResult` renamed to `AzureAttestationToken` for clarity - New `CertificateProvider` interface for flexible certificate handling - Improved aTLS and gRPC server architecture - Better code reusability across components **Security Updates** + - Major dependency upgrades (gRPC 1.74.2 → 1.75.0, Docker SDK 28.3.2 → 28.5.0) - Updated SMQ library to 0.18.1 with security patches - Enhanced certificate library integration - ### Patch Updates Recent patch releases (**v0.8.1** and **v0.8.2**) have focused on platform stability, security patches for cryptography libraries, and adding advanced vTPM features to enhance SEV-SNP reporting. @@ -120,11 +130,13 @@ Prism v0.6.0 focuses on user experience, asset discovery, and operational improv ### What's New **Advanced Search & Discovery** + - **Comprehensive Asset Search**: New asset search functionality with full UI and backend support - Find and manage algorithms, datasets, and computational resources effortlessly - Enhanced search performance and filtering options **User Management Enhancements** + - **Subscription Management Button**: Dedicated UI for easier subscription control access - **Email Notifications**: Introduced notifications for email events, keeping users informed of critical updates - Better visibility into account and subscription status @@ -141,14 +153,17 @@ We've polished the interface with cleaner styling for asset templates, improved ## Why These Releases Matter ### For Data Scientists & Researchers + - **Cocos**: Attestable proof that their sensitive algorithms and data are executed in protected enclaves - **Prism**: Intuitive interface to run confidential computations without infrastructure complexity ### For Enterprises & Organizations + - **Cocos**: Hardware-validated security guarantees for regulatory compliance (HIPAA, GDPR, etc.) - **Prism**: Enterprise features like billing, user management, and audit logs for governance ### For Security Teams + - **Cocos**: Advanced attestation validation, updated security policies, and dependency management - **Prism**: Fine-grained access control, comprehensive logging, and policy enforcement @@ -173,9 +188,11 @@ Together, Cocos and Prism enable a new paradigm for AI: ## Getting Started ### Explore Cocos AI + Visit the [Cocos GitHub repository](https://github.com/ultravioletrs/cocos) to deploy and integrate confidential computing into your infrastructure. ### Experience Prism + Access [Prism's web interface](https://prism.ultraviolet.rs/) to manage users, policies, and computations in a secure, user-friendly environment. --- @@ -183,6 +200,7 @@ Access [Prism's web interface](https://prism.ultraviolet.rs/) to manage users, p ## What's Next? Both projects continue to evolve. The roadmap includes: + - Enhanced multi-party computation capabilities - Support for additional TEE technologies - Expanded analytics and reporting features @@ -193,6 +211,7 @@ Stay tuned for more innovations in the confidential computing space! --- **Learn More:** + - [Cocos AI Documentation](https://cocos.ultraviolet.rs/docs/) - [Prism Documentation](https://prism.ultraviolet.rs/docs/) - [Ultraviolet RS](https://ultraviolet.rs) diff --git a/src/content/blog/confidential-computing-meets-ai.md b/src/content/blog/confidential-computing-meets-ai.md index bba7c6e..57eef6c 100644 --- a/src/content/blog/confidential-computing-meets-ai.md +++ b/src/content/blog/confidential-computing-meets-ai.md @@ -27,7 +27,7 @@ In this deep dive, we'll explore how Cube AI leverages Trusted Execution Environ At the heart of Cube AI's security model are **Trusted Execution Environments (TEEs)**, specifically utilizing **AMD SEV-SNP** and **Intel TDX**. -Traditionally, if you run a VM in the cloud, the cloud provider (the hypervisor context) has technical access to your memory. They *could*, in theory, dump the RAM and see your unencrypted data. +Traditionally, if you run a VM in the cloud, the cloud provider (the hypervisor context) has technical access to your memory. They _could_, in theory, dump the RAM and see your unencrypted data. TEEs change this equation by encrypting the virtual machine's memory **at the hardware level**. @@ -39,30 +39,30 @@ TEEs change this equation by encrypting the virtual machine's memory **at the ha Core["CPU Core
(Data is Plaintext)"] ME["Memory Encryption Engine
(AES-128/256)"] end - + subgraph RAM ["System Memory (Untrusted)"] EncData["Encrypted Data
(Ciphertext)"] end - + subgraph Host ["Hypervisor / Host OS"] Admin["Cloud Admin / Root"] end Core <--> ME ME <-->|Encrypted Read/Write| EncData - + Admin -.->|Attempts to Read| EncData Admin -- "Sees Garbage" --> EncData - + style CPU fill:#ecfdf5,stroke:#22c55e,stroke-width:2px,color:#000 style RAM fill:#f8fafc,stroke:#eab308,stroke-width:2px,color:#000 style Host fill:#fef2f2,stroke:#ef4444,stroke-width:2px,color:#000 ``` 2. **Remote Attestation**: This is the "proof" part. The hardware generates a cryptographic "quote"—a digital signature signed by the processor's manufacturer key. This quote serves as proof that: - * The software running is exactly what you expect (measured by a hash). - * The hardware protections (SEV-SNP/TDX) are active. - * The environment hasn't been tampered with. + - The software running is exactly what you expect (measured by a hash). + - The hardware protections (SEV-SNP/TDX) are active. + - The environment hasn't been tampered with. ## Why Traditional LLM APIs Expose Privacy Risks @@ -71,31 +71,30 @@ When you use a standard API (like OpenAI or Anthropic), the flow usually looks l 1. TLS encrypts data in transit (good). 2. Provider decrypts data on their server to process it (necessary). 3. **Risk Zone**: While the data is processed, it is visible in plain text in the server's memory. - * **Insider Threats**: Rogue admins with root access could potentially inspect memory. - * **Side-Channel Attacks**: Exploits like Spectre/Meltdown or purely software-based memory scrapers could exfiltrate data. - * **Data Retention**: Mistakes in logging configurations could accidentally save sensitive prompts to persistent storage. + - **Insider Threats**: Rogue admins with root access could potentially inspect memory. + - **Side-Channel Attacks**: Exploits like Spectre/Meltdown or purely software-based memory scrapers could exfiltrate data. + - **Data Retention**: Mistakes in logging configurations could accidentally save sensitive prompts to persistent storage. ```mermaid graph LR User([User]) -->|TLS Encrypted| Gateway[API Gateway] Gateway -->|Plaintext| Server[Model Server] - + subgraph RAM ["Server Memory (RAM)"] Prompt["User Prompt
(Plaintext)"] end - + Server -- Processing --> Prompt - + Hacker[Attacker / Malware] -.->|Side Channel| Prompt Admin[Rogue Employee] -.->|Direct Memory Dump| Prompt Logs[Log Collector] -.->|Misconfiguration| Prompt - + style Prompt fill:#ef4444,stroke:#7f1d1d,color:#fff,stroke-width:2px style RAM fill:#e2e8f0,stroke:#94a3b8,color:#333 style Hacker stroke:#ef4444,stroke-dasharray: 5 5 ``` - For regulated industries, this "Processing in the Clear" is a major compliance hurdle. ## Cube AI Architecture: Isolation by Design @@ -110,9 +109,8 @@ Here is how Cube AI isolates your data: ![The Protected Inference Flow](/img/confidential-computing-meets-ai/protected-inference-flow.png) - 1. **Attestation Handshake**: The connection negotiation starts with an **Attested TLS (aTLS)** handshake. The Attestation Agent sends its certificate along with a hardware-signed quote. -2. **Proxy Verification**: The Cube Proxy verifies this quote against a strict attestation policy. Unlike standard TLS which blindly trusts a Certificate Authority, the Proxy validates the *hardware identity* and *software integrity* of the Agent. +2. **Proxy Verification**: The Cube Proxy verifies this quote against a strict attestation policy. Unlike standard TLS which blindly trusts a Certificate Authority, the Proxy validates the _hardware identity_ and _software integrity_ of the Agent. 3. **Secure Tunnel**: Once verified, an encrypted aTLS tunnel is established between the Proxy and the Agent. 4. **Inference Proxying**: The User sends an encrypted prompt to the Proxy, which forwards it through the aTLS tunnel. The Agent then proxies this request to the local LLM backend (vLLM/Ollama) running inside the enclave. Use the same key. @@ -120,15 +118,15 @@ Here is how Cube AI isolates your data: Imagine a healthcare provider building an AI assistant to analyze patient records for rare disease patterns. -* **The Data**: Highly sensitive patient history, genetic markers, and lab results. -* **The Risk**: Uploading this to a public LLM violates HIPAA and GDPR. -* **The Cube AI Solution**: - 1. The hospital's application connects to their private Cube AI instance. - 2. It verifies the instance acts as a "black box" via Remote Attestation. - 3. It sends the patient data. - 4. **Insight**: The model analyzes the data *in memory* (which is encrypted at the hardware level). - 5. **Result**: The diagnosis is returned encrypted. - 6. **Aftermath**: Once the request is done, the data in memory is wiped. No logs, no training, no eyes on the data. +- **The Data**: Highly sensitive patient history, genetic markers, and lab results. +- **The Risk**: Uploading this to a public LLM violates HIPAA and GDPR. +- **The Cube AI Solution**: + 1. The hospital's application connects to their private Cube AI instance. + 2. It verifies the instance acts as a "black box" via Remote Attestation. + 3. It sends the patient data. + 4. **Insight**: The model analyzes the data _in memory_ (which is encrypted at the hardware level). + 5. **Result**: The diagnosis is returned encrypted. + 6. **Aftermath**: Once the request is done, the data in memory is wiped. No logs, no training, no eyes on the data. ## Key Takeaway @@ -138,4 +136,4 @@ By combining the power of open-weights models (like Llama 3, Mistral) with the h --- -*Ready to secure your AI workloads? Check out our [Getting Started](https://cube.ultraviolet.rs/docs/getting-started) guide or explore the [Attestation Documentation](https://cube.ultraviolet.rs/docs/attestation).* +_Ready to secure your AI workloads? Check out our [Getting Started](https://cube.ultraviolet.rs/docs/getting-started) guide or explore the [Attestation Documentation](https://cube.ultraviolet.rs/docs/attestation)._ diff --git a/src/content/blog/cube-ai-public-beta-launch.md b/src/content/blog/cube-ai-public-beta-launch.md index 8d021c9..1e0ed4f 100644 --- a/src/content/blog/cube-ai-public-beta-launch.md +++ b/src/content/blog/cube-ai-public-beta-launch.md @@ -40,19 +40,23 @@ To achieve this deep hardware integration, Cube AI relies on the open-source **[ Cube AI is not merely a wrapper around existing LLM backends; it is a multi-tenant, microservices-based framework designed for scalability and secure governance. ### Multi-Tenancy and Domain Isolation + At the heart of the platform's scalability is the **SuperMQ** microservices architecture. It handles identity management natively and ensures that each domain acts as a strictly isolated workspace, preventing data leakage between different departments or organizations. ![Domain Overview UI](https://cube.ultraviolet.rs/img/ui/domain-overview.png) ![Routes Management UI](https://cube.ultraviolet.rs/img/ui/routes.png) ### High-Performance Inference Backends + We support two primary [inference backends](/blog/vllm-vs-ollama-in-cube-ai) to suit varying computational needs: -* **Ollama**: Ideal for lightweight model management, local deployments, and rapid prototyping. -* **vLLM**: Built for production environments requiring high throughput. Utilizing PagedAttention and continuous batching, vLLM maximizes memory efficiency and inference speed. When deployed within a Cube AI TEE, model weights and intermediate tensors remain encrypted throughout the execution cycle. + +- **Ollama**: Ideal for lightweight model management, local deployments, and rapid prototyping. +- **vLLM**: Built for production environments requiring high throughput. Utilizing PagedAttention and continuous batching, vLLM maximizes memory efficiency and inference speed. When deployed within a Cube AI TEE, model weights and intermediate tensors remain encrypted throughout the execution cycle. ![Models UI](https://cube.ultraviolet.rs/img/ui/models.png) ### The Cube Proxy & Security Guardrails + The Cube Proxy serves as the hardened gateway, providing an **OpenAI-compatible API**. This allows organizations to leverage existing Python or JavaScript SDKs effortlessly. Beyond hardware isolation, our integrated Guardrails Service enforces proactive defense against prompt injection, output sanitization, and automatic **PII (Personally Identifiable Information) redaction** through Microsoft Presidio. Hot-reload capabilities ensure administrators can update safety rules with zero downtime. @@ -73,9 +77,10 @@ Where `L_attestation` represents the time taken for remote verification and `L_e ## Tooling Ecosystem: IDEs and Secure RAG We prioritize a "developer-first" approach to ensure seamless integration: -* **IDE Support**: Native integration with "Continue" and OpenCode IDE ensures safe AI-assisted development without intellectual property leakage. -* **Secure Embeddings (RAG)**: Generate embeddings entirely within the TEE. This ensures that sensitive documents are properly vectorized for Retrieval-Augmented Generation architectures without ever exposing raw text to an external provider. -* **Secure Chat**: Provide users with an end-to-end encrypted chat interface powered by verifiable hardware attestation for maximum privacy. + +- **IDE Support**: Native integration with "Continue" and OpenCode IDE ensures safe AI-assisted development without intellectual property leakage. +- **Secure Embeddings (RAG)**: Generate embeddings entirely within the TEE. This ensures that sensitive documents are properly vectorized for Retrieval-Augmented Generation architectures without ever exposing raw text to an external provider. +- **Secure Chat**: Provide users with an end-to-end encrypted chat interface powered by verifiable hardware attestation for maximum privacy. ![Secure Chat UI](https://cube.ultraviolet.rs/img/chat-ui.png) @@ -87,5 +92,5 @@ Cube AI represents a fundamental shift in how Large Language Models are deployed The future of AI is confidential. Welcome to the Cube AI Beta! -* **Get Started**: Visit [cube.ultraviolet.rs](https://cube.ultraviolet.rs) to launch your first confidential AI stack. -* **Read the Docs**: Dive deep into the [Cube AI Documentation](https://cube.ultraviolet.rs/docs/) and [Getting Started Guide](https://cube.ultraviolet.rs/docs/user/getting-started/). \ No newline at end of file +- **Get Started**: Visit [cube.ultraviolet.rs](https://cube.ultraviolet.rs) to launch your first confidential AI stack. +- **Read the Docs**: Dive deep into the [Cube AI Documentation](https://cube.ultraviolet.rs/docs/) and [Getting Started Guide](https://cube.ultraviolet.rs/docs/user/getting-started/). diff --git a/src/content/blog/prism-public-beta-launch.md b/src/content/blog/prism-public-beta-launch.md index c9e4bb7..17cf973 100644 --- a/src/content/blog/prism-public-beta-launch.md +++ b/src/content/blog/prism-public-beta-launch.md @@ -15,14 +15,13 @@ featured: false category: announcement --- - -In an era where AI is transforming industries, the challenge of **data privacy** remains a significant hurdle. Organizations often find themselves choosing between the power of state-of-the-art AI and the security of their most sensitive data. +In an era where AI is transforming industries, the challenge of **data privacy** remains a significant hurdle. Organizations often find themselves choosing between the power of state-of-the-art AI and the security of their most sensitive data. Today, we are thrilled to bridge that gap with the launch of the [**Prism AI Public Beta**](https://cloud.prism.ultraviolet.rs/). -[Prism AI](https://prism.ultraviolet.rs) is a web-based SaaS platform designed to make **Confidential Computing** accessible, powerful, and truly collaborative. It provides an enterprise-ready interface for orchestrating **zero-trust collaboration** via **Secure Multiparty Computation (SMPC)**, powered by Trusted Execution Environments (TEEs). +[Prism AI](https://prism.ultraviolet.rs) is a web-based SaaS platform designed to make **Confidential Computing** accessible, powerful, and truly collaborative. It provides an enterprise-ready interface for orchestrating **zero-trust collaboration** via **Secure Multiparty Computation (SMPC)**, powered by Trusted Execution Environments (TEEs). -Through the technical guarantees of hardware-level isolation, Prism AI allows multiple organizations to jointly train models or run private inferences in a shared TEE. Critically, raw datasets and proprietary algorithms are technically shielded from *every* other party in the computation—including collaborators and the cloud provider itself—ensuring absolute privacy throughout the entire lifecycle. Built on the open-source **Cocos AI** foundation, Prism AI turns trust from a policy into a physical law. +Through the technical guarantees of hardware-level isolation, Prism AI allows multiple organizations to jointly train models or run private inferences in a shared TEE. Critically, raw datasets and proprietary algorithms are technically shielded from _every_ other party in the computation—including collaborators and the cloud provider itself—ensuring absolute privacy throughout the entire lifecycle. Built on the open-source **Cocos AI** foundation, Prism AI turns trust from a policy into a physical law. @@ -50,23 +49,24 @@ Transparency is fundamental to trust. That's why the core components of Prism AI Prism AI is already being used to solve critical privacy challenges in high-stakes industries: -* **Healthcare**: Training diagnostic models on patient records across multiple hospitals without violating GDPR or HIPAA. -* **Finance**: Collaborative fraud detection and risk assessment across institutions without sharing proprietary data. -* **Governments**: Enabling secure data sharing between agencies for public safety and research while maintaining strict data sovereignty. +- **Healthcare**: Training diagnostic models on patient records across multiple hospitals without violating GDPR or HIPAA. +- **Finance**: Collaborative fraud detection and risk assessment across institutions without sharing proprietary data. +- **Governments**: Enabling secure data sharing between agencies for public safety and research while maintaining strict data sovereignty. ## Join the Mission for Secure AI We’re on a mission to make privacy the default for artificial intelligence, and we’d love for you to be a part of it. The Prism AI Public Beta is officially live, and we can’t wait to see what you build. -* 🚀 **Get Started for Free**: Sign up at [cloud.prism.ultraviolet.rs](https://cloud.prism.ultraviolet.rs/) and start running your first confidential computations. -* 📚 **Explore the Docs**: Dive into the technical details at [docs.prism.ultraviolet.rs](https://prism.ultraviolet.rs/docs/). -* 🤝 **Join the Community**: Follow our progress on [GitHub](https://github.com/ultravioletrs/cocos) and help us shape the next generation of privacy-preserving AI. +- 🚀 **Get Started for Free**: Sign up at [cloud.prism.ultraviolet.rs](https://cloud.prism.ultraviolet.rs/) and start running your first confidential computations. +- 📚 **Explore the Docs**: Dive into the technical details at [docs.prism.ultraviolet.rs](https://prism.ultraviolet.rs/docs/). +- 🤝 **Join the Community**: Follow our progress on [GitHub](https://github.com/ultravioletrs/cocos) and help us shape the next generation of privacy-preserving AI. The era of choosing between powerful AI and strict privacy is finally over. With Prism AI, you can have both—fearlessly. --- **Learn More:** + - 🌐 [Prism AI Website](https://prism.ultraviolet.rs/) - [Cocos AI Documentation](https://cocos.ai/docs/) - [Ultraviolet RS](https://ultraviolet.rs/) diff --git a/src/content/blog/privacy-paradox-confidential-computing.md b/src/content/blog/privacy-paradox-confidential-computing.md index 4094f04..2d9efcf 100644 --- a/src/content/blog/privacy-paradox-confidential-computing.md +++ b/src/content/blog/privacy-paradox-confidential-computing.md @@ -6,7 +6,8 @@ description: "Discover why AI teams need Confidential Computing to protect sensi author: name: "Jilks Smith" picture: "https://avatars.githubusercontent.com/u/41241359?v=4" -tags: [confidential-computing, ai-security, privacy, tee, enterprise-ai, cube ai] +tags: + [confidential-computing, ai-security, privacy, tee, enterprise-ai, cube ai] image: /img/privacy-paradox/privacy-paradox.jpg ogImage: url: /img/privacy-paradox/privacy-paradox.jpg @@ -14,7 +15,6 @@ category: blog date: 2026-02-16 --- - As organizations race to integrate Large Language Models into their operations, they're simultaneously exposing intellectual property, customer records, financial models and many more assets to unprecedented vulnerabilities. **The problem? Traditional software architectures are structurally inadequate for the AI era.** @@ -137,8 +137,6 @@ Remote attestation proves a workload is running in a genuine TEE: This ensures keys are never released unless the environment is proven secure and untampered. If malware is injected, the hash changes, verification fails, and keys remain locked. - - ## Industry Applications ### Healthcare: Clinical AI Development @@ -170,19 +168,23 @@ This ensures keys are never released unless the environment is proven secure and Organizations generally face two paths when adopting Confidential Computing: ### Option 1: The Hard Way (Raw Infrastructure) + You can build directly on top of raw Confidential VMs (CVMs) or Confidential Containers (CoCo). **Confidential VMs (CVMs)** -* **Approach**: "Lift and Shift"—run entire VMs inside TEEs (AMD SEV-SNP). -* **Pros**: Works with legacy applications. -* **Cons**: Large Trusted Computing Base (TCB); you are responsible for managing attestation and key exchanges. + +- **Approach**: "Lift and Shift"—run entire VMs inside TEEs (AMD SEV-SNP). +- **Pros**: Works with legacy applications. +- **Cons**: Large Trusted Computing Base (TCB); you are responsible for managing attestation and key exchanges. **Confidential Containers (CoCo)** -* **Approach**: Run Kubernetes Pods in lightweight microVM TEEs. -* **Pros**: Smaller TCB and better isolation. -* **Cons**: Requires complex Kubernetes setup and deep expertise in attestation flows. + +- **Approach**: Run Kubernetes Pods in lightweight microVM TEEs. +- **Pros**: Smaller TCB and better isolation. +- **Cons**: Requires complex Kubernetes setup and deep expertise in attestation flows. ### Option 2: The Smart Way (Cube AI Platform) + The alternative is to use a platform that abstracts this complexity. **Cube AI** bridges the gap, offering the security of Option 1 with the usability of a standard cloud service. **1. Zero-Refactor Integration** @@ -193,8 +195,9 @@ As detailed in our [comparison of vLLM and Ollama](/blogs/vllm-vs-ollama-in-cube **3. Automated Security & Compliance** Cube AI handles the heavy lifting of Confidential Computing: -* **Attested TLS (aTLS)**: Automatically terminates connections inside the enclave. -* **Built-in Guardrails**: Enforces data policies before requests reach the model, preventing PII leakage. + +- **Attested TLS (aTLS)**: Automatically terminates connections inside the enclave. +- **Built-in Guardrails**: Enforces data policies before requests reach the model, preventing PII leakage. By solving the "usability paradox," Cube AI allows organizations to protect their data immediately, rather than spending months building custom security infrastructure. @@ -215,8 +218,8 @@ Confidential Computing is the "HTTPS for AI"—the protocol that builds the trus 1. **Traditional security fails AI**: The "two-state" model (at rest, in transit) leaves data-in-use vulnerable—the exact state AI requires 2. **Hardware-based isolation is essential**: TEEs provide mathematical guarantees that software-based security cannot 3. **Regulatory pressure is accelerating**: The EU AI Act and US legislation increasingly demand "privacy by design" -4**The question has changed**: From "Can we afford to implement this?" to "Can we survive ignoring it?" + 4**The question has changed**: From "Can we afford to implement this?" to "Can we survive ignoring it?" --- -*Ready to secure your AI workloads? Learn more about [Cube AI's confidential computing architecture](https://cube.ultraviolet.rs/docs/architecture) or explore our [developer guides](https://cube.ultraviolet.rs/docs/developer-guide) to get started.* \ No newline at end of file +_Ready to secure your AI workloads? Learn more about [Cube AI's confidential computing architecture](https://cube.ultraviolet.rs/docs/architecture) or explore our [developer guides](https://cube.ultraviolet.rs/docs/developer-guide) to get started._ diff --git a/src/content/blog/securing-trust-rats-and-attested-tls.md b/src/content/blog/securing-trust-rats-and-attested-tls.md index c34dcc5..1839563 100644 --- a/src/content/blog/securing-trust-rats-and-attested-tls.md +++ b/src/content/blog/securing-trust-rats-and-attested-tls.md @@ -10,7 +10,7 @@ tags: [confidential-computing, attestation, aTLS, cocos ai] date: 2026-02-19 image: "/img/securing-trust-rats-and-attested-tls/overview.png" ogImage: - url: "/img/securing-trust-rats-and-attested-tls/overview.png" + url: "/img/securing-trust-rats-and-attested-tls/overview.png" --- In this article, we'll explore **Remote ATtestation procedureS (RATS)**, @@ -42,61 +42,61 @@ RATS define several key **roles** in this process: 1\. The **Attester** is the entity that generates **Evidence** about its own operational state. -- Runs in a TEE, device, confidential VM, or enclave. -- Produces measurements like firmware hashes, kernel versions, or PCR - values from a TPM. -- Uses **Attestation Keys** bound to hardware or firmware to sign - this evidence. +- Runs in a TEE, device, confidential VM, or enclave. +- Produces measurements like firmware hashes, kernel versions, or PCR + values from a TPM. +- Uses **Attestation Keys** bound to hardware or firmware to sign + this evidence. 2\. The **Verifier** evaluates the **Evidence** received from the Attester. -- Uses **Endorsements** (e.g., TPM vendor certificates) and - **Reference Values** (known-good measurements) to check - validity. -- Produces an **Attestation Result** - a signed statement about the - Attester's trustworthiness. -- Often operated by a trusted authority, like a cloud provider or - security service. +- Uses **Endorsements** (e.g., TPM vendor certificates) and + **Reference Values** (known-good measurements) to check + validity. +- Produces an **Attestation Result** - a signed statement about the + Attester's trustworthiness. +- Often operated by a trusted authority, like a cloud provider or + security service. 3\. The **Relying Party** consumes the **Attestation Result** from the Verifier and **makes trust decisions**. Examples: -- A cloud orchestration platform deciding whether to schedule - workloads on a VM. -- A client deciding whether to connect to a server running inside a - TEE. -- Does **not** need to understand raw evidence, only the Verifier's - signed results. +- A cloud orchestration platform deciding whether to schedule + workloads on a VM. +- A client deciding whether to connect to a server running inside a + TEE. +- Does **not** need to understand raw evidence, only the Verifier's + signed results. 4\. The **Endorser** vouches for the trustworthiness of an **Attesting Environment** by providing **Endorsements**. Typically the hardware or firmware vendor. Examples: -- Intel SGX/TDX provisioning services signing enclave keys. -- AMD providing ARK and ASK certificates for SEV-SNP. +- Intel SGX/TDX provisioning services signing enclave keys. +- AMD providing ARK and ASK certificates for SEV-SNP. 5\. The **Reference Value Provider** supplies **Reference Values** - known-good measurements used by the Verifier. Ensures the Verifier knows what a "trusted state" looks like. Examples: -- BIOS vendors providing approved firmware hashes. -- Container registries providing signed digests of container - images. +- BIOS vendors providing approved firmware hashes. +- Container registries providing signed digests of container + images. 6\. The **Verifier Owner** defines **appraisal policies** for a device or environment. Determines **what evidence matters** and **what constitutes a trustworthy state**. Could be: -- A cloud tenant defining which OS images are approved. -- An IoT fleet operator defining minimum firmware - requirements. +- A cloud tenant defining which OS images are approved. +- An IoT fleet operator defining minimum firmware + requirements. 7\. **Relying Party Owner** (optional, less explicit). Some deployments separate the **Relying Party** from the **Relying Party Owner**: -- The **Relying Party** executes policy decisions. -- The **Owner** defines those policies. +- The **Relying Party** executes policy decisions. +- The **Owner** defines those policies. This distinction matters in multi-tenant or cloud scenarios where **service providers enforce policies defined by customers**. @@ -139,9 +139,9 @@ it**. Whether you're securing IoT devices, protecting cloud workloads, or enabling confidential computing, RATS provide the architectural foundation for verifiable trust at scale. -### From TLS to aTLS: Embedding Trust into Secure Channels +### From TLS to aTLS: Embedding Trust into Secure Channels -#### TLS Recap - The Foundation of Secure Communication +#### TLS Recap - The Foundation of Secure Communication Transport Layer Security (**TLS**) is the backbone of secure communication on the internet. It establishes an encrypted channel @@ -168,7 +168,7 @@ outdated firmware or malicious code, and the client has no way of knowing. In highly sensitive environments - like confidential computing, IoT, and secure AI workloads - this isn't enough. -#### What Is aTLS? - Attested TLS +#### What Is aTLS? - Attested TLS **Attested TLS (aTLS)** extends TLS by embedding **remote attestation** into the TLS handshake, enabling endpoints to prove not just **who** @@ -179,17 +179,17 @@ extension - includes **attestation evidence** or **attestation results**. This allows one party to verify not only the cryptographic identity of the other, but also: -- Whether it's running in a **Trusted Execution Environment - (TEE)**. -- Whether the **firmware and software stack** match known-good - configurations. -- Whether **security policies** are being enforced. +- Whether it's running in a **Trusted Execution Environment + (TEE)**. +- Whether the **firmware and software stack** match known-good + configurations. +- Whether **security policies** are being enforced. This builds on the **RATS architecture** defined in [RFC 9334](https://datatracker.ietf.org/doc/rfc9334/), which standardizes how evidence, endorsements, and attestation results are produced and consumed. -#### How aTLS Uses RATS +#### How aTLS Uses RATS aTLS doesn't invent a new attestation framework - it **integrates RATS into TLS**. The flow depends on which RATS model is used. The Passport @@ -219,22 +219,22 @@ This flexibility makes aTLS suitable for cloud workloads, IoT deployments, and secure AI environments - each with different trust relationships. -#### The Bigger Picture +#### The Bigger Picture By combining **TLS** with **RATS**, aTLS transforms "secure communication" into **"secure and verifiable communication."** It ensures that: -- **Who you're talking to** is verified. -- **What they're running** is trustworthy. -- **How your data is handled** respects your security - policies. +- **Who you're talking to** is verified. +- **What they're running** is trustworthy. +- **How your data is handled** respects your security + policies. This is especially critical for **confidential computing**, where trust must extend beyond identities to include the **state of the runtime environment**. -### Real-World Example - Confidential Computing & AI in COCOS AI +### Real-World Example - Confidential Computing & AI in COCOS AI **Cocos AI** is an advanced platform that leverages **Confidential Computing** and **Trusted Execution Environments (TEEs)** to enable @@ -291,6 +291,7 @@ tlsConfig := &tls.Config{ }, } ``` + Note: setting `InsecureSkipVerify: true` disables Go's built‑in certificate verification. In this aTLS setup, that is intentional because `VerifyPeerCertificate` replaces the default verifier so it can both @@ -302,12 +303,11 @@ implementing full certificate and hostname/SAN validation in your own `VerifyPeerCertificate` callback, otherwise TLS certificate checks will effectively be disabled. - The behavior of the `VerifyPeerCertificate` function, which verifies the attestation extension, depends on the underlying platform, such as **AMD SEV-SNP** or **Intel TDX**. -### Conclusion +### Conclusion As workloads move to **untrusted environments** like public clouds and edge platforms, securing communication is no longer just about @@ -331,4 +331,4 @@ COCOS AI ensures that every connection is both **encrypted** and As technologies like confidential computing and secure AI continue to evolve, approaches like **RATS + aTLS** are set to become a cornerstone of **next-generation security architectures** - enabling us to build -systems where trust is **cryptographically enforced**, not just assumed. \ No newline at end of file +systems where trust is **cryptographically enforced**, not just assumed. diff --git a/src/content/blog/tee-tls-privacy.md b/src/content/blog/tee-tls-privacy.md index 35728a3..42ebb56 100644 --- a/src/content/blog/tee-tls-privacy.md +++ b/src/content/blog/tee-tls-privacy.md @@ -10,11 +10,12 @@ authors: picture: "https://avatars.githubusercontent.com/u/7561155?v=4" - name: "Sammy Oina" picture: "https://avatars.githubusercontent.com/u/44265300?v=4" -tags: [confidential-computing, attestation, aTLS, cocos ai, security analysis, RATS] +tags: + [confidential-computing, attestation, aTLS, cocos ai, security analysis, RATS] date: 2026-02-27 image: "/img/tls-tee-privacy/cover_minimal.png" ogImage: - url: "/img/tls-tee-privacy/cover_minimal.png" + url: "/img/tls-tee-privacy/cover_minimal.png" --- ## Introduction @@ -175,11 +176,11 @@ For AMD SEV-SNP, the `Attestation()` call results in a hardware-signed report vi The attestation report is embedded into the X.509 certificate as a custom extension identified by a platform-specific OID: -| Platform | OID | -|:---------------|:-----------------| -| SEV-SNP + TPM | `2.99999.1.0` | -| Azure CVM | `2.99999.1.1` | -| Intel TDX | `2.99999.1.2` | +| Platform | OID | +| :------------ | :------------ | +| SEV-SNP + TPM | `2.99999.1.0` | +| Azure CVM | `2.99999.1.1` | +| Intel TDX | `2.99999.1.2` | ```go extension := pkix.Extension{ @@ -391,13 +392,13 @@ Beyond the fundamental binding gap, the IETF analysis flagged two implementation The table below summarizes how Cocos AI compares to other implementations analyzed by Sardar et al.: -| Implementation | Binding Mechanism | Platform | Nonce Delivery | Vulnerable to Relay? | -|:---|:---|:---|:---|:---| -| **Cocos AI** | `SHA3-512(pubKey ‖ attestation_nonce)` | SEV-SNP, TDX | SNI extension | Yes | -| **Meta Private Processing** | Client's TLS nonce in report_data | SEV-SNP | TLS nonce (no separate attestation nonce) | Yes (also lacks freshness) | -| **Edgeless Contrast** | `Hash(attestation_nonce ‖ pubKey)` | Intel TDX | ALPN extension | Yes | -| **CCC PoC** | Per draft-fossati-seat-early-attestation | Various | TLS extension | Yes | -| **Proposed Mitigation (Sardar et al.)** | Cryptographic binder in CertificateVerify | Any | TLS extension | Achieves Level 2 | +| Implementation | Binding Mechanism | Platform | Nonce Delivery | Vulnerable to Relay? | +| :-------------------------------------- | :---------------------------------------- | :----------- | :---------------------------------------- | :------------------------- | +| **Cocos AI** | `SHA3-512(pubKey ‖ attestation_nonce)` | SEV-SNP, TDX | SNI extension | Yes | +| **Meta Private Processing** | Client's TLS nonce in report_data | SEV-SNP | TLS nonce (no separate attestation nonce) | Yes (also lacks freshness) | +| **Edgeless Contrast** | `Hash(attestation_nonce ‖ pubKey)` | Intel TDX | ALPN extension | Yes | +| **CCC PoC** | Per draft-fossati-seat-early-attestation | Various | TLS extension | Yes | +| **Proposed Mitigation (Sardar et al.)** | Cryptographic binder in CertificateVerify | Any | TLS extension | Achieves Level 2 | Notable: Meta's implementation was audited by Trail of Bits, who did not find the relay attack. As Sardar et al. note, no formal methods were used in that review, underscoring the value of symbolic analysis tools like ProVerif. @@ -464,4 +465,4 @@ In the meantime, we encourage all users of Confidential Computing platforms to: 3. Define strict attestation policies that validate all available report fields. 4. Monitor the IETF SEAT and UFMRG working groups for updates on standardized attested TLS protocols. -The path forward is clear: stronger binding, formal verification, and community collaboration. We are committed to getting there. \ No newline at end of file +The path forward is clear: stronger binding, formal verification, and community collaboration. We are committed to getting there. diff --git a/src/content/blog/vllm-vs-ollama-in-cube-ai.md b/src/content/blog/vllm-vs-ollama-in-cube-ai.md index e510b9a..d449609 100644 --- a/src/content/blog/vllm-vs-ollama-in-cube-ai.md +++ b/src/content/blog/vllm-vs-ollama-in-cube-ai.md @@ -85,7 +85,7 @@ When measuring single-request latency in isolation, Ollama performs well for ind vLLM shines under load due to its batching efficiency. Because it processes multiple requests simultaneously, the amortized latency per request can actually decrease as more requests arrive — the GPU processes a batch of requests in roughly the same time it would take to process a single one. **Important Insight:** -If your system experiences burst traffic patterns — where many requests arrive in a short window — vLLM's latency often *improves* relative to sequential engines. While a sequential engine queues requests and processes them one at a time (leading to linearly increasing wait times), vLLM absorbs the burst into a batch and processes it as a unit. +If your system experiences burst traffic patterns — where many requests arrive in a short window — vLLM's latency often _improves_ relative to sequential engines. While a sequential engine queues requests and processes them one at a time (leading to linearly increasing wait times), vLLM absorbs the burst into a batch and processes it as a unit. ### Memory Usage @@ -106,10 +106,10 @@ Ollama takes a different approach, handling memory management automatically base **Trade-off:** -| Goal | Better Choice | -| :--- | :--- | -| Deterministic GPU planning | vLLM | -| Operational simplicity | Ollama | +| Goal | Better Choice | +| :------------------------- | :------------ | +| Deterministic GPU planning | vLLM | +| Operational simplicity | Ollama | --- @@ -161,12 +161,12 @@ One of Ollama's most significant advantages over vLLM is its ability to manage m Ollama is designed to run across a wide range of hardware configurations, which makes it far more versatile than vLLM in terms of deployment targets: -| Capability | Ollama | -| :--- | :--- | -| CPU-only | Supported | -| NVIDIA GPU | Supported | +| Capability | Ollama | +| :------------- | :-------- | +| CPU-only | Supported | +| NVIDIA GPU | Supported | | AMD GPU (ROCm) | Supported | -| Edge devices | Supported | +| Edge devices | Supported | This broad hardware compatibility makes Ollama extremely attractive for deployment scenarios where GPU availability cannot be guaranteed. Confidential Virtual Machines (CVMs) running in Trusted Execution Environments may not have GPU passthrough configured, edge inference nodes may be running on commodity ARM hardware, on-premises deployments may need to operate on whatever hardware is available, and secure or air-gapped environments may have strict procurement constraints that limit GPU options. In all of these cases, Ollama's ability to run on CPU-only nodes provides a viable path to deploying LLM inference without GPU dependencies. @@ -206,14 +206,14 @@ When building a multi-tenant SaaS product where hundreds or thousands of concurr Understanding the cost profile of each backend is essential for making financially sound infrastructure decisions, especially as LLM workloads grow from experimental to production scale. -| Dimension | vLLM | Ollama | -| :--- | :--- | :--- | -| **Upfront Cost** | High (requires NVIDIA GPUs, GPU orchestration) | Low (runs on CPU, standard instances) | -| **Cost per Token** | Lower at scale (continuous batching) | Higher under load (sequential processing) | -| **Idle Cost** | Expensive (reserved GPU capacity) | Minimal (standard compute) | -| **Best For** | Sustained high traffic, predictable workloads | Early-stage, sporadic traffic, PoC | -| **Scaling Model** | Vertical (GPU utilization) | Horizontal (more instances) | -| **Infrastructure** | Specialized (NVIDIA runtime, GPU drivers) | Standard (no specialized requirements) | +| Dimension | vLLM | Ollama | +| :----------------- | :--------------------------------------------- | :---------------------------------------- | +| **Upfront Cost** | High (requires NVIDIA GPUs, GPU orchestration) | Low (runs on CPU, standard instances) | +| **Cost per Token** | Lower at scale (continuous batching) | Higher under load (sequential processing) | +| **Idle Cost** | Expensive (reserved GPU capacity) | Minimal (standard compute) | +| **Best For** | Sustained high traffic, predictable workloads | Early-stage, sporadic traffic, PoC | +| **Scaling Model** | Vertical (GPU utilization) | Horizontal (more instances) | +| **Infrastructure** | Specialized (NVIDIA runtime, GPU drivers) | Standard (no specialized requirements) | ### vLLM Cost Profile @@ -278,18 +278,18 @@ This HAL integration enables bare-metal CVM deployments where Docker is not avai ## Side-by-Side Comparison -| Dimension | Ollama | vLLM | -| :--- | :--- | :--- | -| **Version** | 0.12.3 | 0.10.2 | -| **API** | Native `/api/*` | OpenAI `/v1/*` | -| **GPU** | Optional | Required (NVIDIA) | -| **CPU Support** | Yes | No | -| **Model Mgmt** | Runtime | Startup | -| **Batching** | Sequential | Continuous | -| **Default Model** | `llama3.2:3b` | `DialoGPT-medium` | -| **Memory Config** | Automatic | Explicit | -| **Guardrails** | Native adapter | Via OpenAI | -| **Compose Profile** | default | vllm | +| Dimension | Ollama | vLLM | +| :------------------ | :-------------- | :---------------- | +| **Version** | 0.12.3 | 0.10.2 | +| **API** | Native `/api/*` | OpenAI `/v1/*` | +| **GPU** | Optional | Required (NVIDIA) | +| **CPU Support** | Yes | No | +| **Model Mgmt** | Runtime | Startup | +| **Batching** | Sequential | Continuous | +| **Default Model** | `llama3.2:3b` | `DialoGPT-medium` | +| **Memory Config** | Automatic | Explicit | +| **Guardrails** | Native adapter | Via OpenAI | +| **Compose Profile** | default | vllm | --- @@ -333,4 +333,4 @@ That is the power of backend modularity, and it is built into the foundation of --- -*Explore Cube AI's backend architecture in the [Deployment Guide](https://cube.ultraviolet.rs/docs/getting-started) or learn more about [Cube AI Architecture](https://cube.ultraviolet.rs/docs/architecture).* +_Explore Cube AI's backend architecture in the [Deployment Guide](https://cube.ultraviolet.rs/docs/getting-started) or learn more about [Cube AI Architecture](https://cube.ultraviolet.rs/docs/architecture)._ diff --git a/src/content/config.ts b/src/content/config.ts index d0809f1..04f8319 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -1,29 +1,35 @@ -import { defineCollection, z } from 'astro:content'; +import { defineCollection, z } from "astro:content"; const authorSchema = z.object({ - name: z.string(), - picture: z.string().optional(), + name: z.string(), + picture: z.string().optional(), }); const blog = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - description: z.string().optional(), - excerpt: z.string().optional(), - author: authorSchema.optional(), - authors: z.array(authorSchema).optional(), - date: z.coerce.date(), - image: z.string().optional(), - coverImage: z.string().optional(), - ogImage: z.union([z.string(), z.object({ url: z.string() })]).optional(), - tags: z.array(z.string()).optional(), - featured: z.boolean().optional(), - category: z.string().optional(), - }), + type: "content", + schema: z.object({ + title: z.string(), + description: z.string().optional(), + excerpt: z.string().optional(), + author: authorSchema.optional(), + authors: z.array(authorSchema).optional(), + date: z.coerce.date(), + image: z.string().optional(), + coverImage: z.string().optional(), + ogImage: z.union([z.string(), z.object({ url: z.string() })]).optional(), + tags: z.array(z.string()).optional(), + featured: z.boolean().optional(), + category: z.string().optional(), + }), }); -const industries = defineCollection({ type: 'content', schema: z.object({ title: z.string() }) }); -const solutions = defineCollection({ type: 'content', schema: z.object({ title: z.string() }) }); +const industries = defineCollection({ + type: "content", + schema: z.object({ title: z.string() }), +}); +const solutions = defineCollection({ + type: "content", + schema: z.object({ title: z.string() }), +}); export const collections = { blog, industries, solutions }; diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index 2fc4151..e99f8f3 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -1,13 +1,15 @@ --- -import { getCollection, render } from 'astro:content'; -import Layout from '../../layouts/Layout.astro'; -import Header from '../../components/Header.astro'; -import Footer from '../../components/Footer.astro'; -import ProductCTA from '../../components/ProductCTA.astro'; +import { getCollection, render } from "astro:content"; +import Layout from "../../layouts/Layout.astro"; +import Header from "../../components/Header.astro"; +import Footer from "../../components/Footer.astro"; +import ProductCTA from "../../components/ProductCTA.astro"; export async function getStaticPaths() { - const allPosts = await getCollection('blog'); - const sorted = allPosts.sort((a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime()); + const allPosts = await getCollection("blog"); + const sorted = allPosts.sort( + (a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime(), + ); return sorted.map((post, idx) => { const next: typeof sorted = []; for (let i = 1; next.length < 3; i++) { @@ -21,16 +23,28 @@ const { post, nextPosts } = Astro.props; const { Content } = await render(post); function fmtDate(d: Date) { - return new Date(d).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); + return new Date(d).toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); } -const coverImage = post.data.image || post.data.coverImage || `/img/blog/${post.slug}.png`; -const eyebrow = post.data.category || (post.data.tags || [])[0] || 'Blog'; -const authors: { name: string; picture?: string }[] = - post.data.authors?.length ? post.data.authors : post.data.author ? [post.data.author] : []; +const coverImage = + post.data.image || post.data.coverImage || `/img/blog/${post.slug}.png`; +const eyebrow = post.data.category || (post.data.tags || [])[0] || "Blog"; +const authors: { name: string; picture?: string }[] = post.data.authors?.length + ? post.data.authors + : post.data.author + ? [post.data.author] + : []; function getPostAuthors(p: typeof post): { name: string; picture?: string }[] { - return p.data.authors?.length ? p.data.authors : p.data.author ? [p.data.author] : []; + return p.data.authors?.length + ? p.data.authors + : p.data.author + ? [p.data.author] + : []; } --- @@ -49,21 +63,32 @@ function getPostAuthors(p: typeof post): { name: string; picture?: string }[] {
{eyebrow}

{post.data.title}

- {authors.length > 0 && ( - - {nextPosts.length > 0 && ( -
-
- )} +
+ ) + } new Date(b.data.date).getTime() - new Date(a.data.date).getTime()); +const allPosts = await getCollection("blog"); +const posts = allPosts.sort( + (a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime(), +); function fmtDate(d: Date) { - return new Date(d).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); + return new Date(d).toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); } -const cats = ['All', 'Cube AI', 'Prism AI', 'Cocos AI']; +const cats = ["All", "Cube AI", "Prism AI", "Cocos AI"]; const productTags: Record = { - 'cube ai': 'Cube AI', - 'cube': 'Cube AI', - 'prism ai': 'Prism AI', - 'prism': 'Prism AI', - 'cocos ai': 'Cocos AI', - 'cocos': 'Cocos AI', + "cube ai": "Cube AI", + cube: "Cube AI", + "prism ai": "Prism AI", + prism: "Prism AI", + "cocos ai": "Cocos AI", + cocos: "Cocos AI", }; -function getAuthors(post: (typeof posts)[0]): { name: string; picture?: string }[] { - if (post.data.authors && post.data.authors.length > 0) return post.data.authors; +function getAuthors( + post: (typeof posts)[0], +): { name: string; picture?: string }[] { + if (post.data.authors && post.data.authors.length > 0) + return post.data.authors; if (post.data.author) return [post.data.author]; return []; } function getProduct(post: (typeof posts)[0]) { - for (const tag of (post.data.tags || [])) { + for (const tag of post.data.tags || []) { const p = productTags[tag.toLowerCase()]; if (p) return p; } @@ -38,10 +47,13 @@ function getProduct(post: (typeof posts)[0]) { } const [featuredPost, ...restPosts] = posts; -const allTags = [...new Set(posts.flatMap(p => p.data.tags || []))].sort(); +// const allTags = [...new Set(posts.flatMap(p => p.data.tags || []))].sort(); --- - +
p.data.tags || []))].sort();
- {featuredPost && ( - -
- {featuredPost.data.title} -
-
-
- {featuredPost.data.category && {featuredPost.data.category}} - Featured -
-

{featuredPost.data.title}

-

{featuredPost.data.excerpt || featuredPost.data.description}

-
- {getAuthors(featuredPost).some(a => a.picture) && ( -
- {getAuthors(featuredPost).filter(a => a.picture).map(a => ( - {a.name} - ))} -
- )} -
-
{getAuthors(featuredPost).map(a => a.name).join(', ')}
-
{fmtDate(featuredPost.data.date)}
-
-
-
- {(featuredPost.data.tags || []).slice(0, 4).map(t => {t})} -
-
-
- )} -
@@ -84,27 +165,61 @@ const focus = [
- Backing & governance -

Open, funded,
and accountable.

-

Ultraviolet builds in the open and is validated through EU Horizon Europe research, as a member of the Linux Foundation and the Confidential Computing Consortium.

+ Backing & governance +

+ Open, funded,
and accountable. +

+

+ Ultraviolet builds in the open and is validated through EU Horizon + Europe research, as a member of the Linux Foundation and the + Confidential Computing Consortium. +

- {['Apache 2.0', 'Linux Foundation', 'Confidential Computing Consortium', 'Horizon Europe', 'GDPR', 'EU AI Act'].map(b => ( - {b} - ))} + { + [ + "Apache 2.0", + "Linux Foundation", + "Confidential Computing Consortium", + "Horizon Europe", + "GDPR", + "EU AI Act", + ].map((b) => ( + + + {b} + + )) + }
- {[ - ['CONFIDENTIAL6G', 'Quantum-resistant cryptography for 6G', '€5M · Horizon Europe'], - ['TITAN', 'Confidential data collaboration & privacy-preserving AI', '€5M · Horizon Europe'], - ['ELASTIC', 'WebAssembly + confidential computing for 6G', '€4M · Horizon Europe'], - ].map(([t, d, m]) => ( -
-
{t}
-
{d}
-
{m}
-
- ))} + { + [ + [ + "CONFIDENTIAL6G", + "Quantum-resistant cryptography for 6G", + "€5M · Horizon Europe", + ], + [ + "TITAN", + "Confidential data collaboration & privacy-preserving AI", + "€5M · Horizon Europe", + ], + [ + "ELASTIC", + "WebAssembly + confidential computing for 6G", + "€4M · Horizon Europe", + ], + ].map(([t, d, m]) => ( +
+
{t}
+
{d}
+
{m}
+
+ )) + }
diff --git a/src/pages/company/careers.astro b/src/pages/company/careers.astro index e2981ff..9a9f193 100644 --- a/src/pages/company/careers.astro +++ b/src/pages/company/careers.astro @@ -1,21 +1,42 @@ --- -import Layout from '../../layouts/Layout.astro'; -import Header from '../../components/Header.astro'; -import Footer from '../../components/Footer.astro'; -import PageHero from '../../components/PageHero.astro'; -import ProductCTA from '../../components/ProductCTA.astro'; +import Layout from "../../layouts/Layout.astro"; +import Header from "../../components/Header.astro"; +import Footer from "../../components/Footer.astro"; +import PageHero from "../../components/PageHero.astro"; +import ProductCTA from "../../components/ProductCTA.astro"; const why = [ - ['Innovative technology', 'Work at the forefront of cloud computing, AI/ML, multi-party computation, and secure data sharing.'], - ['Cross-disciplinary', 'Collaborate with experts across confidential computing and AI, with continuous learning and growth.'], - ['Impactful projects', 'Contribute to work that drives digital transformation and shapes the future of secure computing.'], - ['Professional development', 'We invest in growth through training, workshops, and skill development on cutting-edge tech.'], - ['Work-life balance', 'A flexible environment that values your well-being while you build meaningful technology.'], - ['Open source', 'Your work ships in the open — Apache 2.0 software used and inspected around the world.'], + [ + "Innovative technology", + "Work at the forefront of cloud computing, AI/ML, multi-party computation, and secure data sharing.", + ], + [ + "Cross-disciplinary", + "Collaborate with experts across confidential computing and AI, with continuous learning and growth.", + ], + [ + "Impactful projects", + "Contribute to work that drives digital transformation and shapes the future of secure computing.", + ], + [ + "Professional development", + "We invest in growth through training, workshops, and skill development on cutting-edge tech.", + ], + [ + "Work-life balance", + "A flexible environment that values your well-being while you build meaningful technology.", + ], + [ + "Open source", + "Your work ships in the open — Apache 2.0 software used and inspected around the world.", + ], ]; --- - +
-

As a member of the Ultraviolet team, you'll work on cutting-edge projects, collaborate with experts in cloud computing and AI/ML, and contribute to the growth and success of our clients across rapidly evolving landscapes.

-

We're always looking for talented engineers excited about cloud computing, AI/ML, multi-party computation, and secure data sharing who want to be part of our innovative team.

+

+ As a member of the Ultraviolet team, you'll work on cutting-edge + projects, collaborate with experts in cloud computing and AI/ML, and + contribute to the growth and success of our clients across rapidly + evolving landscapes. +

+

+ We're always looking for talented engineers excited about cloud + computing, AI/ML, multi-party computation, and secure data sharing + who want to be part of our innovative team. +

@@ -45,16 +77,22 @@ const why = [
Why join -

Why work at Ultraviolet?

+

+ Why work at Ultraviolet? +

- {why.map(([t, d], i) => ( -
- {String(i + 1).padStart(2, '0')} -

{t}

-

{d}

-
- ))} + { + why.map(([t, d], i) => ( +
+ + {String(i + 1).padStart(2, "0")} + +

{t}

+

{d}

+
+ )) + }
diff --git a/src/pages/company/contact.astro b/src/pages/company/contact.astro index d1afdc8..d9e3d0a 100644 --- a/src/pages/company/contact.astro +++ b/src/pages/company/contact.astro @@ -1,12 +1,15 @@ --- -import Layout from '../../layouts/Layout.astro'; -import Header from '../../components/Header.astro'; -import Footer from '../../components/Footer.astro'; -import PageHero from '../../components/PageHero.astro'; -import ProductCTA from '../../components/ProductCTA.astro'; +import Layout from "../../layouts/Layout.astro"; +import Header from "../../components/Header.astro"; +import Footer from "../../components/Footer.astro"; +import PageHero from "../../components/PageHero.astro"; +import ProductCTA from "../../components/ProductCTA.astro"; --- - +
Careers careers@ultraviolet.rs - + Community Chat on Gitter ↗

Follow us

- + GitHub @ultravioletrs ↗ - + LinkedIn Ultraviolet ↗ - + Twitter @ultravioletrs ↗ @@ -59,14 +82,20 @@ import ProductCTA from '../../components/ProductCTA.astro';
Office

Ultraviolet

-

Bulevar Arsenija Čarnojevića 103
11000 Belgrade
Serbia

+

+ Bulevar Arsenija Čarnojevića 103
11000 Belgrade
Serbia +

+ width="100%" + height="380" + style="border:0" + allowfullscreen + loading="lazy" + referrerpolicy="no-referrer-when-downgrade">
diff --git a/src/pages/company/index.astro b/src/pages/company/index.astro index b74c8a2..c653d5e 100644 --- a/src/pages/company/index.astro +++ b/src/pages/company/index.astro @@ -1,3 +1,3 @@ --- -return Astro.redirect('/company/about', 301); +return Astro.redirect("/company/about", 301); --- diff --git a/src/pages/contact.astro b/src/pages/contact.astro index 105437e..7c3b302 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -1,3 +1,3 @@ --- -return Astro.redirect('/company/contact', 301); +return Astro.redirect("/company/contact", 301); --- diff --git a/src/pages/cube/privacy.astro b/src/pages/cube/privacy.astro index bb14dcf..effbfaf 100644 --- a/src/pages/cube/privacy.astro +++ b/src/pages/cube/privacy.astro @@ -1,129 +1,173 @@ --- -import Layout from '../../layouts/Layout.astro'; -import Header from '../../components/Header.astro'; -import Footer from '../../components/Footer.astro'; +import Layout from "../../layouts/Layout.astro"; +import Header from "../../components/Header.astro"; +import Footer from "../../components/Footer.astro"; const title = "Cube AI Privacy Policy - Ultraviolet"; -const description = "Privacy Policy for Cube AI. Learn how Ultraviolet collects, uses, and protects your personal data when using the Cube AI platform."; +const description = + "Privacy Policy for Cube AI. Learn how Ultraviolet collects, uses, and protects your personal data when using the Cube AI platform."; --- -
- -
- -
-
-

- Privacy Policy -

- -
-

- This Privacy Policy explains how Ultraviolet ("we," "us," or - "our") collects, uses, and protects your personal data when - you use the Cube AI platform ("Platform"). We are committed to - complying with the General Data Protection Regulation (GDPR) - and other applicable privacy laws. -

- -

1. Who We Are

-

- Ultraviolet is a company registered in Serbia with - headquarters at Bulevar Arsenija Carnojevica 103, 11000 - Belgrade, Serbia. We are the data controller for your personal - data when you create and use an account on our Platform. -

- -

2. WHAT DATA WE COLLECT

-
    -
  • Full name
  • -
  • Email address
  • -
  • Company name
  • -
  • User credentials and login metadata (IP, device, browser)
  • -
  • Payment and billing information (processed via third-party payment processor)
  • -
  • Technical usage data (e.g., API usage, project activity)
  • -
- -

3. HOW WE USE YOUR DATA

-

We use your data to:

-
    -
  • Provide access to and operate the Platform
  • -
  • Communicate with you regarding your account and service updates
  • -
  • Provide support and respond to inquiries
  • -
  • Process payments and manage subscriptions
  • -
  • Improve the Platform and monitor usage
  • -
  • Comply with legal obligations
  • -
- -

4. LEGAL BASIS FOR PROCESSING

-

We process your data on the following legal bases:

-
    -
  • Contractual necessity – to deliver the services you signed up for
  • -
  • Legitimate interests – to maintain and improve our services
  • -
  • Legal obligation – to meet accounting or regulatory requirements
  • -
  • Consent - where applicable (e.g., marketing communications)
  • -
- -

5. DATA RETENTION

-

- We retain your personal data for as long as your account is - active and for a limited period thereafter to comply with - legal and operational obligations. Data may be anonymized for - analytics. -

- -

6. DATA SHARING AND SUBPROCESSORS

-

We do not sell or share your personal data with third parties, except:

-
    -
  • With cloud hosting providers, email service providers, and payment processors strictly as needed to provide the Platform
  • -
  • With public authorities if legally required
  • -
-

All subprocessors are GDPR-compliant and under data processing agreements.

- -

7. DATA TRANSFERS

-

- Your data may be processed or stored in the EU or other - jurisdictions with adequate protection standards. Where - applicable, we use Standard Contractual Clauses (SCCs) to - safeguard cross-border data transfers. -

- -

8. YOUR RIGHTS UNDER GDPR

-

You have the right to:

-
    -
  • Access your personal data
  • -
  • Correct or update inaccuracies
  • -
  • Request deletion ("right to be forgotten")
  • -
  • Restrict or object to processing
  • -
  • Data portability
  • -
  • Lodge a complaint with a data protection authority
  • -
-

To exercise your rights, contact us at privacy@ultraviolet.rs

- -

9. SECURITY

-

- We implement appropriate technical and organizational measures - to protect your data, including encryption, access control, - and regular security reviews. -

- -

10. CHANGES TO THIS POLICY

-

- We may update this Privacy Policy from time to time. We will - notify you via email or through the Platform when significant - changes occur. -

- -

11. CONTACT

-

- If you have questions or concerns about this policy or how we - handle your data, contact us at: privacy@ultraviolet.rs
- Ultraviolet, Bulevar Arsenija Carnojevica 103, 11000 Belgrade, Serbia. -

-
-
-
- -