diff --git a/apps/website/.gitignore b/apps/website/.gitignore new file mode 100644 index 00000000..ed65dbef --- /dev/null +++ b/apps/website/.gitignore @@ -0,0 +1,22 @@ +# build output +dist/ +# generated types +.astro/ +.idea/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/apps/website/.prettierrc b/apps/website/.prettierrc new file mode 100644 index 00000000..2cd8da88 --- /dev/null +++ b/apps/website/.prettierrc @@ -0,0 +1,20 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "bracketSpacing": true, + "arrowParens": "avoid", + "endOfLine": "lf", + "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ] +} diff --git a/apps/website/THIRD_PARTY_NOTICES.md b/apps/website/THIRD_PARTY_NOTICES.md new file mode 100644 index 00000000..de757f9e --- /dev/null +++ b/apps/website/THIRD_PARTY_NOTICES.md @@ -0,0 +1,27 @@ +# Third-Party Notices + +This website app vendors and adapts portions of the ScrewFast project. + +## ScrewFast + +MIT License + +Copyright (c) 2024 Emil Gulamov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/website/astro.config.mjs b/apps/website/astro.config.mjs index 83689aa9..d038fca8 100644 --- a/apps/website/astro.config.mjs +++ b/apps/website/astro.config.mjs @@ -1,28 +1,122 @@ -import { fileURLToPath } from 'node:url'; - -import tailwindcss from '@tailwindcss/vite'; -import icon from 'astro-icon'; import { defineConfig } from 'astro/config'; +import tailwindcss from '@tailwindcss/vite'; +import sitemap from '@astrojs/sitemap'; +import starlight from '@astrojs/starlight'; -const publicSiteUrl = process.env.PUBLIC_SITE_URL ?? 'https://tenantial.example'; +import mdx from '@astrojs/mdx'; +const redirectOnlyPaths = new Set([ + '/product/', + '/products/', + '/services/', + '/blog/', + '/insights/', +]); + +const isRedirectOnlySitemapPath = page => { + const pathname = page.startsWith('http') ? new URL(page).pathname : page; + const normalized = pathname.endsWith('/') ? pathname : `${pathname}/`; + + return redirectOnlyPaths.has(normalized); +}; + +// https://astro.build/config export default defineConfig({ - integrations: [icon()], - output: 'static', - redirects: { - '/product': '/platform', - }, - site: publicSiteUrl, - server: { - host: true, - port: 4321, - }, - vite: { - plugins: [tailwindcss()], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - }, + devToolbar: { + enabled: false, + }, + // https://docs.astro.build/en/guides/images/#authorizing-remote-images + site: process.env.PUBLIC_SITE_URL ?? 'https://tenantial.com', + image: { + domains: ['images.unsplash.com'], + }, + // i18n: { + // defaultLocale: "en", + // locales: ["en", "fr"], + // fallback: { + // fr: "en", + // }, + // routing: { + // prefixDefaultLocale: false, + // }, + // }, + prefetch: true, + integrations: [ + sitemap({ + filter: page => !isRedirectOnlySitemapPath(page), + i18n: { + defaultLocale: 'en', + locales: { + en: 'en', }, - }, + }, + }), + starlight({ + title: 'Tenantial Docs', + // https://github.com/withastro/starlight/blob/main/packages/starlight/CHANGELOG.md + // If no Astro and Starlight i18n configurations are provided, the built-in default locale is used in Starlight and a matching Astro i18n configuration is generated/used. + // If only a Starlight i18n configuration is provided, an equivalent Astro i18n configuration is generated/used. + // If only an Astro i18n configuration is provided, the Starlight i18n configuration is updated to match it. + // If both an Astro and Starlight i18n configurations are provided, an error is thrown. + locales: { + root: { + label: 'English', + lang: 'en', + }, + }, + // https://starlight.astro.build/guides/sidebar/ + sidebar: [ + { + label: 'Evaluation Guides', + translations: { + de: 'Schnellstartanleitungen', + es: 'Guías de Inicio Rápido', + fa: 'راهنمای شروع سریع', + fr: 'Guides de Démarrage Rapide', + ja: 'クイックスタートガイド', + 'zh-cn': '快速入门指南', + }, + items: [{ autogenerate: { directory: 'guides' } }], + }, + { + label: 'Platform Notes', + items: [{ label: 'Evidence Review', link: 'platform/evidence-review/' }], + }, + ], + social: [], + disable404Route: true, + customCss: ['./src/assets/styles/starlight.css'], + favicon: '/favicon.ico', + components: { + SiteTitle: './src/components/ui/starlight/SiteTitle.astro', + Head: './src/components/ui/starlight/Head.astro', + MobileMenuFooter: + './src/components/ui/starlight/MobileMenuFooter.astro', + ThemeSelect: './src/components/ui/starlight/ThemeSelect.astro', + }, + head: [ + { + tag: 'meta', + attrs: { + property: 'og:image', + content: 'https://tenantial.com' + '/social.webp', + }, + }, + { + tag: 'meta', + attrs: { + property: 'twitter:image', + content: 'https://tenantial.com' + '/social.webp', + }, + }, + ], + }), + mdx(), + ], + experimental: { + clientPrerender: true, + }, + vite: { + plugins: [tailwindcss()], + }, }); diff --git a/apps/website/package.json b/apps/website/package.json index 0ffea9bc..010cd0ba 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -1,28 +1,44 @@ { - "name": "@tenantatlas/website", - "version": "0.0.0", - "private": true, - "type": "module", - "engines": { - "node": ">=20.0.0" - }, - "scripts": { - "dev": "astro dev --host 0.0.0.0 --port ${WEBSITE_PORT:-4321}", - "build": "astro build", - "preview": "astro preview --host 0.0.0.0", - "test": "playwright test", - "test:smoke": "playwright test" - }, - "dependencies": { - "@iconify-json/lucide": "^1.2.102", - "astro": "^6.0.0", - "astro-icon": "^1.1.5" - }, - "devDependencies": { - "@playwright/test": "^1.59.1", - "@tailwindcss/vite": "^4.2.2", - "@types/node": "^24.7.2", - "tailwindcss": "^4.2.2", - "typescript": "^5.9.3" - } + "name": "@tenantatlas/website", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev --host 0.0.0.0 --port ${WEBSITE_PORT:-4321}", + "start": "astro dev --host 0.0.0.0 --port ${WEBSITE_PORT:-4321}", + "build": "astro check && astro build && node process-html.mjs", + "preview": "astro preview --host 0.0.0.0 --port ${WEBSITE_PORT:-4321}", + "test": "playwright test", + "test:smoke": "playwright test", + "format:check": "prettier --check .", + "format:fix": "prettier --write .", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.9.9", + "@astrojs/mdx": "^5.0.6", + "@astrojs/sitemap": "^3.7.2", + "@astrojs/starlight": "^0.39.2", + "@tailwindcss/vite": "^4.3.0", + "astro": "^6.3.3", + "clipboard": "^2.0.11", + "globby": "^16.2.0", + "gsap": "^3.15.0", + "html-minifier-terser": "^7.2.0", + "lenis": "^1.3.23", + "preline": "^4.2.0", + "rimraf": "^6.1.3", + "sharp": "^0.34.5", + "sharp-ico": "^0.1.5", + "tailwindcss": "^4.3.0" + }, + "devDependencies": { + "@playwright/test": "^1.59.1", + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/typography": "^0.5.19", + "astro-vtbot": "^2.1.12", + "prettier": "^3.8.3", + "prettier-plugin-astro": "^0.14.1", + "prettier-plugin-tailwindcss": "^0.8.0", + "typescript": "^6.0.3" + } } diff --git a/apps/website/playwright.config.ts b/apps/website/playwright.config.ts index 39e96dc3..85bb8456 100644 --- a/apps/website/playwright.config.ts +++ b/apps/website/playwright.config.ts @@ -1,29 +1,35 @@ import { defineConfig, devices } from '@playwright/test'; -const port = Number(process.env.WEBSITE_PORT ?? '4321'); +const port = Number(process.env.WEBSITE_PORT ?? 4321); const baseURL = `http://127.0.0.1:${port}`; export default defineConfig({ - testDir: './tests/smoke', - fullyParallel: true, - retries: process.env.CI ? 2 : 0, - reporter: [['list']], - use: { - baseURL, - trace: 'on-first-retry', + testDir: './tests/smoke', + timeout: 30_000, + expect: { + timeout: 5_000, + }, + fullyParallel: true, + retries: process.env.CI ? 1 : 0, + reporter: 'list', + use: { + baseURL, + trace: 'on-first-retry', + }, + projects: [ + { + name: 'desktop', + use: { ...devices['Desktop Chrome'] }, }, - projects: [ - { - name: 'chromium', - use: { - ...devices['Desktop Chrome'], - }, - }, - ], - webServer: { - command: `WEBSITE_PORT=${port} corepack pnpm dev`, - port, - reuseExistingServer: !process.env.CI, - timeout: 120000, + { + name: 'mobile', + use: { ...devices['Pixel 5'] }, }, + ], + webServer: { + command: 'corepack pnpm preview', + reuseExistingServer: false, + timeout: 120_000, + url: baseURL, + }, }); diff --git a/apps/website/pnpm-lock.yaml b/apps/website/pnpm-lock.yaml new file mode 100644 index 00000000..e5e7135f --- /dev/null +++ b/apps/website/pnpm-lock.yaml @@ -0,0 +1,5867 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/check': + specifier: ^0.9.9 + version: 0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3) + '@astrojs/mdx': + specifier: ^5.0.6 + version: 5.0.6(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0)) + '@astrojs/sitemap': + specifier: ^3.7.2 + version: 3.7.2 + '@astrojs/starlight': + specifier: ^0.39.2 + version: 0.39.2(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0))(typescript@6.0.3) + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + astro: + specifier: ^6.3.3 + version: 6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0) + clipboard: + specifier: ^2.0.11 + version: 2.0.11 + globby: + specifier: ^16.2.0 + version: 16.2.0 + gsap: + specifier: ^3.15.0 + version: 3.15.0 + html-minifier-terser: + specifier: ^7.2.0 + version: 7.2.0 + lenis: + specifier: ^1.3.23 + version: 1.3.23 + preline: + specifier: ^4.2.0 + version: 4.2.0 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + sharp: + specifier: ^0.34.5 + version: 0.34.5 + sharp-ico: + specifier: ^0.1.5 + version: 0.1.5 + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 + devDependencies: + '@tailwindcss/forms': + specifier: ^0.5.11 + version: 0.5.11(tailwindcss@4.3.0) + '@tailwindcss/typography': + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@4.3.0) + astro-vtbot: + specifier: ^2.1.12 + version: 2.1.12 + prettier: + specifier: ^3.8.3 + version: 3.8.3 + prettier-plugin-astro: + specifier: ^0.14.1 + version: 0.14.1 + prettier-plugin-tailwindcss: + specifier: ^0.8.0 + version: 0.8.0(prettier-plugin-astro@0.14.1)(prettier@3.8.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + +packages: + + '@astrojs/check@0.9.9': + resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 || ^6.0.0 + + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + + '@astrojs/compiler@4.0.0': + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} + + '@astrojs/internal-helpers@0.9.0': + resolution: {integrity: sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==} + + '@astrojs/internal-helpers@0.9.1': + resolution: {integrity: sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ==} + + '@astrojs/language-server@2.16.8': + resolution: {integrity: sha512-yg1pZF6hs9FaKr2fgXMOGbW7pDLgFexFjuhWilPAc8VybTU+WSnbfbhYaUL1exm6dAK4sM3aKXGcfVwss+HXbg==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@7.1.1': + resolution: {integrity: sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==} + + '@astrojs/markdown-remark@7.1.2': + resolution: {integrity: sha512-caXZ4Dc2St2dW8luEg22GlP0gupLdztCTQE4EzZOxW1pqWXz9mbeJEuHUkgDYcKWW8tjIHkydYDhWLVoxJ327Q==} + + '@astrojs/mdx@5.0.6': + resolution: {integrity: sha512-4dKe0ZMmqujofPNDHahzClkwinn9f8jHPcaXcgdGvPAlboD2mjzkUCofli2cBnxYAkdfhC6d50gBJ8i/cH8gHw==} + engines: {node: '>=22.12.0'} + peerDependencies: + astro: ^6.0.0 + + '@astrojs/prism@4.0.1': + resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==} + engines: {node: '>=22.12.0'} + + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} + + '@astrojs/sitemap@3.7.2': + resolution: {integrity: sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==} + + '@astrojs/starlight@0.39.2': + resolution: {integrity: sha512-vlw+bwnjtf5buCTUtLU7JfV6D3knslxqnspr6LKs6hfRuFZiyr5hT44F7GyDqR9FKANUqFxnIzWM81F1k/kOUA==} + peerDependencies: + astro: ^6.0.0 + + '@astrojs/telemetry@3.3.2': + resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/yaml2ts@0.2.3': + resolution: {integrity: sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@canvas/image-data@1.1.0': + resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} + + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@clack/core@1.3.1': + resolution: {integrity: sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.4.0': + resolution: {integrity: sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==} + engines: {node: '>= 20.12.0'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + 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.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + 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.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + 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.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + 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.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@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.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + 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.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.42.0': + resolution: {integrity: sha512-MN11+9nfmaC7sYu2BZJXAXqwkBRt8t1xTSqP+Ti1NfTEskgl6xUnzDxoaiQkg0BMzpglA0pys4dpDKquP/cyIw==} + + '@expressive-code/plugin-frames@0.42.0': + resolution: {integrity: sha512-XtkPm+941Uta7Y+81Acv+OA/20F1NJmJhCX6UYGKpqEIGqplNh3PTOhcURp6tcruhlzJcWcvpWy6Oigz3SrjqA==} + + '@expressive-code/plugin-shiki@0.42.0': + resolution: {integrity: sha512-PMKey/kLmewttAHQezL+Y5Fx3vVssfDi3+FJOYQQS2mXP3tQspFELtKKAfsXfmSXdToZYgwoO69HJndqfE+09g==} + + '@expressive-code/plugin-text-markers@0.42.0': + resolution: {integrity: sha512-l59lUx8fq1v5g6SpmbDjiU0+7IdfbiWnAyRmtTVSpfhyq+nZMN4UcmYyu2b9Mynhzt7Gr+O+cXyEPDNb2AVWVQ==} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.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==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@4.0.2': + resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.0.2': + resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.0.2': + resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.0.2': + resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.0.2': + resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} + engines: {node: '>=20'} + + '@shikijs/themes@4.0.2': + resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} + engines: {node: '>=20'} + + '@shikijs/types@4.0.2': + resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@svgdotjs/svg.draggable.js@3.0.6': + resolution: {integrity: sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + + '@svgdotjs/svg.filter.js@3.0.9': + resolution: {integrity: sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==} + engines: {node: '>= 0.8.0'} + + '@svgdotjs/svg.js@3.2.5': + resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} + + '@svgdotjs/svg.resize.js@2.0.5': + resolution: {integrity: sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + '@svgdotjs/svg.select.js': ^4.0.1 + + '@svgdotjs/svg.select.js@4.0.3': + resolution: {integrity: sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + + '@swc/helpers@0.2.14': + resolution: {integrity: sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA==} + + '@tailwindcss/forms@0.5.11': + resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@types/culori@4.0.1': + resolution: {integrity: sha512-43M51r/22CjhbOXyGT361GZ9vncSVQ39u62x5eJdBQFviI8zWp2X5jzqg7k4M6PVgDQAClpy2bUe2dtwEgEDVQ==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/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==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@24.12.3': + resolution: {integrity: sha512-8oljBDGun9cIsZRJR6fkihn0TSXJI0UDOOhncYaERq6M0JMDoPLxyscwruJcb4GKS6dvK/d8xebYBg27h/duaQ==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + '@vtbag/cam-shaft@1.0.6': + resolution: {integrity: sha512-Xy1bmJJLXuCqxmY2agwPfhGNv1XZViqh54H0VGK4mouGsItFsh8Mz/wWAP6mZwAOEuu9bEOJ1mJ+oNoaczZ1zw==} + + '@vtbag/element-crossing@1.1.0': + resolution: {integrity: sha512-1YL609KPwhHUKRrVNfoogQCVJPfFrE5DubOLcCJZLHVCjWZ2ZAPcaq1wR2OP6nXD0Ok9JLX41YsEtYBYzw6CxQ==} + + '@vtbag/inspection-chamber@1.0.24': + resolution: {integrity: sha512-L6CrMbzJ0gdG/P5WnGyVgRxHVeLhlQgXh3mp+OI4JdJjFiwIhh9+sG/FXM2DneBs5HQvaWUq4qf6NiSlgVbyvQ==} + + '@vtbag/turn-signal@1.3.1': + resolution: {integrity: sha512-6rWkG+ik3U+KQGI94yNOrOh5QedB9zmP/8H51X5WQwrJz8m2MAU5YwGRRcweO/dJ6wW/Bn7OsgC1vRURnwrvCg==} + + '@vtbag/utensil-drawer@1.2.16': + resolution: {integrity: sha512-RSahZXk4NAFTF3zDYQH1x4qv8gFLcWus7qD//D0b58zoZIeqa2uKePLMy4lSHagYdkwBlKXKlfcDSrqUvWmxnw==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apexcharts@4.7.0: + resolution: {integrity: sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro-expressive-code@0.42.0: + resolution: {integrity: sha512-aiTePi2Cn0mJPYWZSzP1GcxCinX9mNtJyCCshVVPSg1yRwM7ADvFJOx0FnS440M9t65hp8JH//dc2qr22Bm4ag==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta + + astro-vtbot@2.1.12: + resolution: {integrity: sha512-6RlA0rdVPLT24FAyxsHAI71quTrLWuMXOADhcx8uEMTfuIVRhg4GajzmZmOiX6/nHA9p1gaIBuaTF3jVE1XWSA==} + + astro@6.3.3: + resolution: {integrity: sha512-wvLIZQYbBZt6U8gyflBW4SLBypaqdwLZUH93rT3oT53cmQ0bTGubvMAGjqBRoheOYzYcTJZtW6czztzbu4kQ5g==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + 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'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-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: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + culori@4.0.2: + resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + datatables.net-dt@2.3.8: + resolution: {integrity: sha512-GD4on0YvNlUS/l+mrXeA1OC2JDzF2/GGbehVv4AacwtiFaoTwqxZseiR0cED6w59u/lgpVrZRC2RwuubUX996Q==} + + datatables.net@2.3.8: + resolution: {integrity: sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-bmp@0.2.1: + resolution: {integrity: sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==} + engines: {node: '>=8.6.0'} + + decode-ico@0.4.1: + resolution: {integrity: sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==} + engines: {node: '>=8.6'} + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + 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==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dropzone@6.0.0-beta.2: + resolution: {integrity: sha512-k44yLuFFhRk53M8zP71FaaNzJYIzr99SKmpbO/oZKNslDjNXQsBTdfLs+iONd0U0L94zzlFzRnFdqbLcs7h9fQ==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.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'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + expressive-code@0.42.0: + resolution: {integrity: sha512-V5DtJLEKuj4wf9O6IRtPtRObkMVy2ggR+S0MdjrTw6m58krZnDioyhW1si3Y04c5YPeooP4nd85Yq9NwEVHS4g==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gsap@3.15.0: + resolution: {integrity: sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + i18next@26.1.0: + resolution: {integrity: sha512-dIU6td04DvQuIqVst5S9g0GviTmhZ0DYD4b9ociVGJmuCa5vZ2de/t+Enf4olvj87mF8Y2lwjNQBwC9QZsvzKQ==} + peerDependencies: + typescript: ^5 || ^6 + peerDependenciesMeta: + typescript: + optional: true + + ico-endec@0.1.6: + resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jquery@4.0.0: + resolution: {integrity: sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + just-extend@5.1.1: + resolution: {integrity: sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + lenis@1.3.23: + resolution: {integrity: sha512-YxYq3TJqj9sJNv0V9SkyQHejt14xwyIwgDaaMK89Uf9SxQfIszu+gTQSSphh6BWlLTNVKvvXAGkg+Zf+oFIevg==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nouislider@15.8.1: + resolution: {integrity: sha512-93TweAi8kqntHJSPiSWQ1o/uZ29VWOmal9YKb6KKGGlCkugaNfAupT7o1qTHqdJvNQ7S0su5rO6qRFCjP8fxtw==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} + + p-queue@9.3.0: + resolution: {integrity: sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + preline@4.2.0: + resolution: {integrity: sha512-lDdP5VzJDwVdWFDOUHKtkvWGxnsKt1o7Q9Sla19MMX03Lzzp4Pxwxs+TndcFZaNiSchYSDgSnjCsm7olV5JV3g==} + hasBin: true + + prettier-plugin-astro@0.14.1: + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier-plugin-tailwindcss@0.8.0: + resolution: {integrity: sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==} + engines: {node: '>=20.19'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-expressive-code@0.42.0: + resolution: {integrity: sha512-8rp/1YMEVVSYbtz+bFBx+uSx3vA4i4T8RwRm5Q/IWbucQnnQqQ0hDqtmKOr8tv+59Cik6cu5aH3WPo0I7csuTA==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@6.1.3: + resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + + sharp-ico@0.1.5: + resolution: {integrity: sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shiki@4.0.2: + resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==} + engines: {node: '>=20'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} + hasBin: true + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} + engines: {node: '>=10'} + hasBin: true + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyclip@0.1.12: + resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} + engines: {node: ^16.14.0 || >= 17.3.0} + + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + to-data-view@1.1.0: + resolution: {integrity: sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vanilla-calendar-pro@3.1.0: + resolution: {integrity: sha512-yXDtCaedcKz6i5OOdWGwui0C8MAmjXjj7JzKZyjDlkczSRqnhI8BDGFygqT2K+qL1uY7R2fLYlTlxA6oyFs2yg==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.3.3: + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + 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 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.70: + resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.70: + resolution: {integrity: sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.70: + resolution: {integrity: sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.70: + resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.70: + resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.70: + resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.70: + resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml-language-server@1.20.0: + resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} + hasBin: true + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/check@0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3)': + dependencies: + '@astrojs/language-server': 2.16.8(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 6.0.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.13.1': {} + + '@astrojs/compiler@4.0.0': {} + + '@astrojs/internal-helpers@0.9.0': + dependencies: + picomatch: 4.0.4 + + '@astrojs/internal-helpers@0.9.1': + dependencies: + picomatch: 4.0.4 + + '@astrojs/language-server@2.16.8(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3)': + dependencies: + '@astrojs/compiler': 2.13.1 + '@astrojs/yaml2ts': 0.2.3 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.28(typescript@6.0.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28 + '@volar/language-service': 2.4.28 + muggle-string: 0.4.1 + tinyglobby: 0.2.16 + volar-service-css: 0.0.70(@volar/language-service@2.4.28) + volar-service-emmet: 0.0.70(@volar/language-service@2.4.28) + volar-service-html: 0.0.70(@volar/language-service@2.4.28) + volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.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.3 + prettier-plugin-astro: 0.14.1 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@7.1.1': + dependencies: + '@astrojs/internal-helpers': 0.9.0 + '@astrojs/prism': 4.0.1 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + js-yaml: 4.1.1 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + retext-smartypants: 6.2.0 + shiki: 4.0.2 + smol-toml: 1.6.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/markdown-remark@7.1.2': + dependencies: + '@astrojs/internal-helpers': 0.9.1 + '@astrojs/prism': 4.0.2 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + js-yaml: 4.1.1 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + retext-smartypants: 6.2.0 + shiki: 4.0.2 + smol-toml: 1.6.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@5.0.6(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0))': + dependencies: + '@astrojs/markdown-remark': 7.1.2 + '@mdx-js/mdx': 3.1.1 + acorn: 8.16.0 + astro: 6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0) + es-module-lexer: 2.1.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + piccolore: 0.1.3 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.6 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.0.1': + dependencies: + prismjs: 1.30.0 + + '@astrojs/prism@4.0.2': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.7.2': + dependencies: + sitemap: 9.0.1 + stream-replace-string: 2.0.0 + zod: 4.4.3 + + '@astrojs/starlight@0.39.2(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0))(typescript@6.0.3)': + dependencies: + '@astrojs/markdown-remark': 7.1.1 + '@astrojs/mdx': 5.0.6(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0)) + '@astrojs/sitemap': 3.7.2 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.4 + '@types/js-yaml': 4.0.9 + '@types/mdast': 4.0.4 + astro: 6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0) + astro-expressive-code: 0.42.0(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 26.1.0(typescript@6.0.3) + js-yaml: 4.1.1 + klona: 2.0.6 + magic-string: 0.30.21 + mdast-util-directive: 3.1.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.5.2 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 4.0.0 + ultrahtml: 1.6.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@astrojs/telemetry@3.3.2': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + is-wsl: 3.1.1 + which-pm-runs: 1.1.0 + + '@astrojs/yaml2ts@0.2.3': + dependencies: + yaml: 2.9.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@canvas/image-data@1.1.0': {} + + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.3.1': + dependencies: + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + '@clack/prompts@1.4.0': + dependencies: + '@clack/core': 1.3.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + '@ctrl/tinycolor@4.2.0': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@expressive-code/core@0.42.0': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.14 + postcss-nested: 6.2.0(postcss@8.5.14) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-frames@0.42.0': + dependencies: + '@expressive-code/core': 0.42.0 + + '@expressive-code/plugin-shiki@0.42.0': + dependencies: + '@expressive-code/core': 0.42.0 + shiki: 4.0.2 + + '@expressive-code/plugin-text-markers@0.42.0': + dependencies: + '@expressive-code/core': 0.42.0 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.16.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.16.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + + '@rollup/pluginutils@5.3.0(rollup@4.60.4)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + + '@rollup/rollup-android-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-x64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.4': + optional: true + + '@shikijs/core@4.0.2': + dependencies: + '@shikijs/primitive': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/primitive@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/types@4.0.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.filter.js@3.0.9': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.js@3.2.5': {} + + '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5))': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + + '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@swc/helpers@0.2.14': {} + + '@tailwindcss/forms@0.5.11(tailwindcss@4.3.0)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 4.3.0 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.3.0)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + + '@types/culori@4.0.1': {} + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + + '@types/estree@1.0.8': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@24.12.3': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + optional: true + + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.12.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.1': {} + + '@volar/kit@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + typesafe-path: 0.2.2 + typescript: 6.0.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/language-server@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + '@vtbag/cam-shaft@1.0.6': {} + + '@vtbag/element-crossing@1.1.0': {} + + '@vtbag/inspection-chamber@1.0.24': {} + + '@vtbag/turn-signal@1.3.1': {} + + '@vtbag/utensil-drawer@1.2.16': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + apexcharts@4.7.0: + dependencies: + '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.filter.js': 3.0.9 + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)) + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + '@yr/monotone-cubic-spline': 1.0.3 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro-expressive-code@0.42.0(astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0)): + dependencies: + astro: 6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0) + rehype-expressive-code: 0.42.0 + + astro-vtbot@2.1.12: + dependencies: + '@vtbag/cam-shaft': 1.0.6 + '@vtbag/element-crossing': 1.1.0 + '@vtbag/inspection-chamber': 1.0.24 + '@vtbag/turn-signal': 1.3.1 + '@vtbag/utensil-drawer': 1.2.16 + + astro@6.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.4)(terser@5.47.1)(yaml@2.9.0): + dependencies: + '@astrojs/compiler': 4.0.0 + '@astrojs/internal-helpers': 0.9.1 + '@astrojs/markdown-remark': 7.1.2 + '@astrojs/telemetry': 3.3.2 + '@capsizecss/unpack': 4.0.0 + '@clack/prompts': 1.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 1.1.1 + devalue: 5.8.1 + diff: 8.0.4 + dset: 3.1.4 + es-module-lexer: 2.1.0 + esbuild: 0.27.7 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + js-yaml: 4.1.1 + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + magicast: 0.5.3 + mrmime: 2.0.1 + neotraverse: 0.6.18 + obug: 2.1.1 + p-limit: 7.3.0 + p-queue: 9.3.0 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.4 + rehype: 13.0.2 + semver: 7.8.0 + shiki: 4.0.2 + smol-toml: 1.6.1 + svgo: 4.0.1 + tinyclip: 0.1.12 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + ultrahtml: 1.6.0 + unifont: 0.7.4 + unist-util-visit: 5.1.0 + unstorage: 1.17.5 + vfile: 6.0.3 + vite: 7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + vitefu: 1.1.3(vite@7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.4.3 + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@4.0.4: {} + + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + boolbase@1.0.0: {} + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.4.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@2.20.3: {} + + common-ancestor-path@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie@1.1.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + culori@4.0.2: {} + + datatables.net-dt@2.3.8: + dependencies: + datatables.net: 2.3.8 + jquery: 4.0.0 + + datatables.net@2.3.8: + dependencies: + jquery: 4.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-bmp@0.2.1: + dependencies: + '@canvas/image-data': 1.1.0 + to-data-view: 1.1.0 + + decode-ico@0.4.1: + dependencies: + '@canvas/image-data': 1.1.0 + decode-bmp: 0.2.1 + to-data-view: 1.1.0 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + defu@6.1.7: {} + + delegate@3.2.0: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + devalue@5.8.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.4: {} + + direction@2.0.1: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dropzone@6.0.0-beta.2: + dependencies: + '@swc/helpers': 0.2.14 + just-extend: 5.1.1 + + dset@3.1.4: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.21.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-module-lexer@2.1.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.16.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.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@5.0.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + eventemitter3@5.0.4: {} + + expressive-code@0.42.0: + dependencies: + '@expressive-code/core': 0.42.0 + '@expressive-code/plugin-frames': 0.42.0 + '@expressive-code/plugin-shiki': 0.42.0 + '@expressive-code/plugin-text-markers': 0.42.0 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.2: {} + + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + globby@16.2.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + + graceful-fs@4.2.11: {} + + gsap@3.15.0: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + 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.4 + uncrypto: 0.1.3 + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@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 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.47.1 + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + + http-cache-semantics@4.2.0: {} + + i18next@26.1.0(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + + ico-endec@0.1.6: {} + + ignore@7.0.5: {} + + inline-style-parser@0.2.7: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-docker@4.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + jiti@2.7.0: {} + + jquery@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + just-extend@5.1.1: {} + + kleur@4.1.5: {} + + klona@2.0.6: {} + + lenis@1.3.23: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + longest-streak@3.1.0: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@11.3.6: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + 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.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mini-svg-data-uri@1.4.4: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minipass@7.1.3: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.12: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-fetch-native@1.6.7: {} + + node-mock-http@1.0.4: {} + + normalize-path@3.0.0: {} + + nouislider@15.8.1: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + obug@2.1.1: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.11: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + p-limit@7.3.0: + dependencies: + yocto-queue: 1.2.2 + + p-queue@9.3.0: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.6.0: {} + + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-browserify@1.0.1: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.3.6 + minipass: 7.1.3 + + piccolore@0.1.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + postcss-nested@6.2.0(postcss@8.5.14): + dependencies: + postcss: 8.5.14 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preline@4.2.0: + dependencies: + '@floating-ui/dom': 1.7.6 + '@types/culori': 4.0.1 + apexcharts: 4.7.0 + culori: 4.0.2 + datatables.net-dt: 2.3.8 + dropzone: 6.0.0-beta.2 + nouislider: 15.8.1 + vanilla-calendar-pro: 3.1.0 + + prettier-plugin-astro@0.14.1: + dependencies: + '@astrojs/compiler': 2.13.1 + prettier: 3.8.3 + sass-formatter: 0.7.9 + + prettier-plugin-tailwindcss@0.8.0(prettier-plugin-astro@0.14.1)(prettier@3.8.3): + dependencies: + prettier: 3.8.3 + optionalDependencies: + prettier-plugin-astro: 0.14.1 + + prettier@3.8.3: {} + + prismjs@1.30.0: {} + + property-information@7.1.0: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + readdirp@4.1.2: {} + + readdirp@5.0.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.42.0: + dependencies: + expressive-code: 0.42.0 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + relateurl@0.2.7: {} + + remark-directive@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 4.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-pkg-maps@1.0.0: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + rimraf@6.1.3: + dependencies: + glob: 13.0.6 + package-json-from-dist: 1.0.1 + + rollup@4.60.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + s.color@0.0.15: {} + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + sax@1.6.0: {} + + select@1.1.2: {} + + semver@7.8.0: {} + + sharp-ico@0.1.5: + dependencies: + decode-ico: 0.4.1 + ico-endec: 0.1.6 + sharp: 0.34.5 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + + shiki@4.0.2: + dependencies: + '@shikijs/core': 4.0.2 + '@shikijs/engine-javascript': 4.0.2 + '@shikijs/engine-oniguruma': 4.0.2 + '@shikijs/langs': 4.0.2 + '@shikijs/themes': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + sisteransi@1.0.5: {} + + sitemap@9.0.1: + dependencies: + '@types/node': 24.12.3 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.6.0 + + slash@5.1.0: {} + + smol-toml@1.6.1: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + stream-replace-string@2.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + terser@5.47.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tiny-emitter@2.1.0: {} + + tiny-inflate@1.0.3: {} + + tinyclip@0.1.12: {} + + tinyexec@1.1.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + to-data-view@1.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.8.0 + + typescript@6.0.3: {} + + ufo@1.6.4: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + + undici-types@7.16.0: {} + + unicorn-magic@0.4.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.4: + dependencies: + css-tree: 3.2.1 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.3.6 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + util-deprecate@1.0.2: {} + + vanilla-calendar-pro@3.1.0: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.14 + rollup: 4.60.4 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + terser: 5.47.1 + yaml: 2.9.0 + + vitefu@1.1.3(vite@7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)): + optionalDependencies: + vite: 7.3.3(@types/node@25.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) + + volar-service-css@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-emmet@0.0.70(@volar/language-service@2.4.28): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-html@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + prettier: 3.8.3 + + volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-typescript@0.0.70(@volar/language-service@2.4.28): + dependencies: + path-browserify: 1.0.1 + semver: 7.8.0 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-yaml@0.0.70(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.20.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + vscode-css-languageservice@6.3.10: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.6.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yaml-language-server@1.20.0: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + prettier: 3.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-uri: 3.1.0 + yaml: 2.7.1 + + yaml@2.7.1: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs-parser@22.0.0: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@1.2.2: {} + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/apps/website/process-html.mjs b/apps/website/process-html.mjs new file mode 100644 index 00000000..64532e83 --- /dev/null +++ b/apps/website/process-html.mjs @@ -0,0 +1,23 @@ +import fs from 'node:fs/promises'; +import { globby } from 'globby'; +import { minify } from 'html-minifier-terser'; + +// Get all HTML files from the output directory +const path = './dist'; +const files = await globby(`${path}/**/*.html`); + +await Promise.all( + files.map(async file => { + console.log('Processing file:', file); + let html = await fs.readFile(file, 'utf-8'); + + // Minify the HTML + html = await minify(html, { + removeComments: true, + preserveLineBreaks: true, + collapseWhitespace: true, + minifyJS: true, + }); + await fs.writeFile(file, html); + }) +); diff --git a/apps/website/public/banner-pattern.svg b/apps/website/public/banner-pattern.svg new file mode 100644 index 00000000..4f111736 --- /dev/null +++ b/apps/website/public/banner-pattern.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/website/public/favicon.svg b/apps/website/public/favicon.svg deleted file mode 100644 index 2a4f6385..00000000 --- a/apps/website/public/favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/apps/website/public/images/tenantial-logo-transparent-clean.png b/apps/website/public/images/tenantial-logo-transparent-clean.png deleted file mode 100644 index e24524c6..00000000 Binary files a/apps/website/public/images/tenantial-logo-transparent-clean.png and /dev/null differ diff --git a/apps/website/public/images/tenantial-wave-mesh.svg b/apps/website/public/images/tenantial-wave-mesh.svg deleted file mode 100644 index 0a7dbc81..00000000 --- a/apps/website/public/images/tenantial-wave-mesh.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/website/public/robots.txt b/apps/website/public/robots.txt deleted file mode 100644 index b27b184a..00000000 --- a/apps/website/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -User-agent: * -Allow: / -Sitemap: /sitemap.xml diff --git a/apps/website/src/assets/scripts/lenisSmoothScroll.js b/apps/website/src/assets/scripts/lenisSmoothScroll.js new file mode 100644 index 00000000..2fdface2 --- /dev/null +++ b/apps/website/src/assets/scripts/lenisSmoothScroll.js @@ -0,0 +1,9 @@ +import '@styles/lenis.css'; + +import Lenis from 'lenis'; + +// Script to handle Lenis library settings for smooth scrolling +// https://github.com/darkroomengineering/lenis +const lenis = new Lenis({ + autoRaf: true, +}); diff --git a/apps/website/src/assets/styles/global.css b/apps/website/src/assets/styles/global.css new file mode 100644 index 00000000..47a01a8b --- /dev/null +++ b/apps/website/src/assets/styles/global.css @@ -0,0 +1,127 @@ +@import 'tailwindcss'; + +/* Preline UI */ +@source '../../../node_modules/preline/dist/*.js'; +@import '../../../node_modules/preline/variants.css'; + +/* Plugins */ +@plugin '@tailwindcss/forms'; +@plugin '@tailwindcss/typography'; + +@custom-variant dark (&:is(.dark *)); + +@theme { + /* https://tailwindcss.com/docs/colors#customizing-your-colors */ + --color-*: initial; + --color-transparent: transparent; + --color-current: currentColor; + --color-black: #000; + --color-white: #fff; + + --color-gray-50: oklch(0.985 0.002 247.839); + --color-gray-100: oklch(0.967 0.003 264.542); + --color-gray-200: oklch(0.928 0.006 264.531); + --color-gray-300: oklch(0.872 0.01 258.338); + --color-gray-400: oklch(0.707 0.022 261.325); + --color-gray-500: oklch(0.551 0.027 264.364); + --color-gray-600: oklch(0.446 0.03 256.802); + --color-gray-700: oklch(0.373 0.034 259.733); + --color-gray-800: oklch(0.278 0.033 256.848); + --color-gray-900: oklch(0.21 0.034 264.665); + --color-gray-950: oklch(0.13 0.028 261.692); + + --color-indigo-50: oklch(0.962 0.018 272.314); + --color-indigo-100: oklch(0.93 0.034 272.788); + --color-indigo-200: oklch(0.87 0.065 274.039); + --color-indigo-300: oklch(0.785 0.115 274.713); + --color-indigo-400: oklch(0.673 0.182 276.935); + --color-indigo-500: oklch(0.585 0.233 277.117); + --color-indigo-600: oklch(0.511 0.262 276.966); + --color-indigo-700: oklch(0.457 0.24 277.023); + --color-indigo-800: oklch(0.398 0.195 277.366); + --color-indigo-900: oklch(0.359 0.144 278.697); + --color-indigo-950: oklch(0.257 0.09 281.288); + + --color-neutral-50: oklch(0.985 0 0); + --color-neutral-100: oklch(0.97 0 0); + --color-neutral-200: oklch(0.922 0 0); + --color-neutral-300: oklch(0.87 0 0); + --color-neutral-400: oklch(0.708 0 0); + --color-neutral-500: oklch(0.556 0 0); + --color-neutral-600: oklch(0.439 0 0); + --color-neutral-700: oklch(0.371 0 0); + --color-neutral-800: oklch(0.269 0 0); + --color-neutral-900: oklch(0.205 0 0); + --color-neutral-950: oklch(0.145 0 0); + + --color-yellow-50: oklch(0.987 0.026 102.212); + --color-yellow-100: oklch(0.973 0.071 103.193); + --color-yellow-200: oklch(0.945 0.129 101.54); + --color-yellow-300: oklch(0.905 0.182 98.111); + --color-yellow-400: oklch(0.852 0.199 91.936); + --color-yellow-500: oklch(0.795 0.184 86.047); + --color-yellow-600: oklch(0.681 0.162 75.834); + --color-yellow-700: oklch(0.554 0.135 66.442); + --color-yellow-800: oklch(0.476 0.114 61.907); + --color-yellow-900: oklch(0.421 0.095 57.708); + --color-yellow-950: oklch(0.286 0.066 53.813); + + --color-orange-50: oklch(0.98 0.016 73.684); + --color-orange-100: oklch(0.954 0.038 75.164); + --color-orange-200: oklch(0.901 0.076 70.697); + --color-orange-300: oklch(70.72% 0.182 40.56); + --color-orange-400: oklch(67.4% 0.2072 39.23); + --color-orange-500: oklch(61.86% 0.1946 38.88); + --color-orange-600: oklch(0.646 0.222 41.116); + --color-orange-700: oklch(0.553 0.195 38.402); + --color-orange-800: oklch(0.47 0.157 37.304); + --color-orange-900: oklch(0.408 0.123 38.172); + --color-orange-950: oklch(0.266 0.079 36.259); + + --color-red-50: oklch(0.971 0.013 17.38); + --color-red-100: oklch(0.936 0.032 17.717); + --color-red-200: oklch(0.885 0.062 18.334); + --color-red-300: oklch(0.808 0.114 19.571); + --color-red-400: oklch(0.704 0.191 22.216); + --color-red-500: oklch(0.637 0.237 25.331); + --color-red-600: oklch(0.577 0.245 27.325); + --color-red-700: oklch(0.505 0.213 27.518); + --color-red-800: oklch(0.444 0.177 26.899); + --color-red-900: oklch(0.396 0.141 25.723); + --color-red-950: oklch(0.258 0.092 26.042); + + --color-zinc-50: oklch(0.985 0 0); + --color-zinc-100: oklch(0.967 0.001 286.375); + --color-zinc-200: oklch(0.92 0.004 286.32); + --color-zinc-300: oklch(0.871 0.006 286.286); + --color-zinc-400: oklch(0.705 0.015 286.067); + --color-zinc-500: oklch(0.552 0.016 285.938); + --color-zinc-600: oklch(0.442 0.017 285.786); + --color-zinc-700: oklch(0.37 0.013 285.805); + --color-zinc-800: oklch(0.274 0.006 286.033); + --color-zinc-900: oklch(0.21 0.006 285.885); + --color-zinc-950: oklch(0.141 0.005 285.823); +} + +/* + The default border color has changed to `currentColor` in Tailwind CSS v4, + so we've added these compatibility styles to make sure everything still + looks the same as it did with Tailwind CSS v3. + + If we ever want to remove these styles, we need to add an explicit border + color utility to any element that depends on these defaults. +*/ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentColor); + } + + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } +} diff --git a/apps/website/src/assets/styles/lenis.css b/apps/website/src/assets/styles/lenis.css new file mode 100644 index 00000000..c1350f29 --- /dev/null +++ b/apps/website/src/assets/styles/lenis.css @@ -0,0 +1,22 @@ +html.lenis, +html.lenis body { + height: auto; +} + +.lenis:not(.lenis-autoToggle).lenis-stopped { + overflow: clip; +} + +.lenis.lenis-smooth [data-lenis-prevent] { + overscroll-behavior: contain; +} + +.lenis.lenis-smooth iframe { + pointer-events: none; +} + +.lenis.lenis-autoToggle { + transition-property: overflow; + transition-duration: 1ms; + transition-behavior: allow-discrete; +} diff --git a/apps/website/src/assets/styles/starlight.css b/apps/website/src/assets/styles/starlight.css new file mode 100644 index 00000000..36711743 --- /dev/null +++ b/apps/website/src/assets/styles/starlight.css @@ -0,0 +1,191 @@ +@import 'tailwindcss'; + +@layer base { + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } +} + +/* Dark mode colors. */ +:root { + --border: hsla(var(--border-neutral), 0.4); + --backdrop-color: #272727cc; + --sl-color-accent: #ff801f; + --sl-color-accent-high: #ffa057; + --sl-color-accent-low: #562800; + --sl-color-black: #181818; + --sl-color-gray-1: #eee; + --sl-color-gray-2: #c2c2c2; + --sl-color-gray-3: #8b8b8b; + --sl-color-gray-4: #585858; + --sl-color-gray-5: #383838; + --sl-color-gray-6: #272727; + --sl-color-white: #fff; + --list-marker-color: #fb923c; + --border-neutral: 0, 0%, 25.1%; +} + +/* Light mode colors. */ +:root[data-theme='light'] { + --border: hsla(var(--border-yellow), 0.4); + --backdrop-color: #f6f6f699; + --sl-color-accent: #b73d00; + --sl-color-accent-high: #562800; + --sl-color-accent-low: #ffa057; + --sl-color-black: #fff; + --sl-color-gray-1: #272727; + --sl-color-gray-2: #383838; + --sl-color-gray-3: #585858; + --sl-color-gray-4: #8b8b8b; + --sl-color-gray-5: #c2c2c2; + --sl-color-gray-6: #eee; + --sl-color-gray-7: #f6f6f6; + --sl-color-white: #181818; + --list-marker-color: #fb923c; + --border-yellow: 54.9, 96.7%, 88%; +} + +header { + border: none !important; + padding: 0 !important; +} + +header.header { + background-color: transparent !important; + height: 4.5rem !important; + margin-inline: auto !important; + padding-block: 0 !important; + padding-inline: 2rem !important; +} + +header > div:first-of-type { + backdrop-filter: blur(12px) !important; + background-color: var(--backdrop-color) !important; + border: 1px var(--border) solid; + border-radius: 36px; + height: 100% !important; + margin-inline: auto !important; + margin-top: 1rem !important; + max-width: 1536px; + padding-inline: 2rem !important; + width: auto !important; +} + +#starlight__sidebar { + border-radius: 1rem; + margin-top: 2rem !important; +} + +.content-panel:first-of-type { + margin-top: 2rem !important; +} + +.right-sidebar { + top: 2rem !important; +} + +#starlight__on-this-page--mobile { + border: none !important; +} + +mobile-starlight-toc > nav { + border: none !important; + border-radius: 1rem; + margin-top: 2rem !important; +} + +select { + background-image: none; + box-shadow: none; +} + +select:focus-visible { + outline: -webkit-focus-ring-color auto 1px; +} + +article.card { + border-radius: 0.5rem; +} + +.pagination-links a:hover { + border-color: var(--sl-color-accent); +} + +.sl-link-card:hover { + border-color: var(--sl-color-gray-4) !important; +} + +.starlight-aside--tip { + background: linear-gradient(45deg, #ff512f, #f09819); + border: none; + border-radius: 0.5rem; + color: #66350c; +} + +.starlight-aside--note { + background: linear-gradient(45deg, #00b4db, #2193b0); + border: none; + border-radius: 0.5rem; + color: #004558; +} + +.starlight-aside__icon { + transform: scale(0.8); +} + +.starlight-aside--tip .starlight-aside__title { + color: #ffe0c2; +} + +.starlight-aside--note .starlight-aside__title { + color: #bbf3fef7; +} + +.sl-markdown-content ul:not(:where(.not-content *)) { + list-style-type: none; + padding-left: 0; +} + +.sl-markdown-content ul:not(:where(.not-content *)) > li { + padding-left: 1.75rem; + position: relative; +} + +.sl-markdown-content li:not(:where(.not-content *)) > ul, +.sl-markdown-content li + li:not(:where(.not-content *)) { + margin-top: 0.625rem; +} + +.sl-markdown-content ul:not(:where(.not-content *)) > li:before { + background: var(--list-marker-color); + border-radius: 1px; + content: ''; + height: 2px; + left: 2px; + position: absolute; + top: 13px; + width: 0.875rem; +} + +@media screen and (max-width: 800px) { + mobile-starlight-toc > nav { + border-radius: 1rem; + margin-top: 3rem !important; + } + + header > div:first-of-type { + padding-inline-end: 5rem !important; + } + + starlight-menu-button > button { + right: 3rem !important; + top: 2.2rem !important; + } +} + +@media screen and (max-width: 1280px) { + header.header { + padding-inline: 1.5rem !important; + } +} diff --git a/apps/website/src/assets/styles/starlight_main.css b/apps/website/src/assets/styles/starlight_main.css new file mode 100644 index 00000000..39bbfef7 --- /dev/null +++ b/apps/website/src/assets/styles/starlight_main.css @@ -0,0 +1,100 @@ +@import 'tailwindcss'; + +@layer base { + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } +} +/* Dark mode colors. */ +:root { + --primary-button-hover: #ff801f; + --backdrop-color: #272727cc; + --sl-color-accent: #ff801f; + --sl-color-accent-high: #ffa057; + --sl-color-accent-low: #562800; + --sl-color-black: #181818; + --sl-color-gray-1: #eee; + --sl-color-gray-2: #c2c2c2; + --sl-color-gray-3: #8b8b8b; + --sl-color-gray-4: #585858; + --sl-color-gray-5: #383838; + --sl-color-gray-6: #272727; + --sl-color-white: #fff; + --yellow-hsl: 43.3, 96.4%, 56.3%; + --overlay-yellow: hsla(var(--yellow-hsl), 0.2); + --border: hsla(var(--border-neutral), 0.4); + --border-neutral: 0, 0%, 25.1%; +} + +/* Light mode colors. */ +:root[data-theme='light'] { + --primary-button-hover: #ff801f; + --backdrop-color: #f6f6f699; + --sl-color-accent: #f76b15; + --sl-color-accent-high: #562800; + --sl-color-accent-low: #ffa057; + --sl-color-black: #fff; + --sl-color-gray-1: #272727; + --sl-color-gray-2: #383838; + --sl-color-gray-3: #585858; + --sl-color-gray-4: #8b8b8b; + --sl-color-gray-5: #c2c2c2; + --sl-color-gray-6: #eee; + --sl-color-gray-7: #f6f6f6; + --sl-color-white: #181818; + --yellow-hsl: 47.9, 95.8%, 53.1%; + --border-yellow: 54.9, 96.7%, 88%; + --border: hsla(var(--border-yellow), 0.4); +} + +.page { + background: + linear-gradient(215deg, var(--overlay-yellow), transparent 40%), + radial-gradient(var(--overlay-yellow), transparent 40%) no-repeat center + center / cover, + radial-gradient(var(--overlay-yellow), transparent 65%) no-repeat center + center / cover; + background-blend-mode: overlay; +} + +header { + border: none !important; + padding: 0 !important; +} + +header.header { + background-color: transparent !important; + height: 4.5rem !important; + margin-inline: auto !important; + padding-block: 0 !important; + padding-inline: 2rem !important; +} + +header > div:first-of-type { + backdrop-filter: blur(12px) !important; + background-color: var(--backdrop-color) !important; + border: 1px var(--border) solid; + border-radius: 36px; + height: 100% !important; + margin-inline: auto !important; + margin-top: 1rem !important; + max-width: 1536px; + padding-inline: 2rem !important; + width: auto !important; +} + +select { + background-image: none; + box-shadow: none; +} + +.sl-link-button.primary:hover { + background-color: var(--primary-button-hover); + transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1); +} + +.sl-link-button.primary:hover svg { + transform: translateX(0.25rem); + transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1); +} diff --git a/apps/website/src/components/BrandLogo.astro b/apps/website/src/components/BrandLogo.astro new file mode 100644 index 00000000..cf1ed9f1 --- /dev/null +++ b/apps/website/src/components/BrandLogo.astro @@ -0,0 +1,13 @@ + + T + Tenantial + diff --git a/apps/website/src/components/Meta.astro b/apps/website/src/components/Meta.astro new file mode 100644 index 00000000..5c078eae --- /dev/null +++ b/apps/website/src/components/Meta.astro @@ -0,0 +1,138 @@ +--- +import { getImage } from 'astro:assets'; +import { OG, SEO, SITE } from '@data/constants'; +import faviconSvgSrc from '@images/icon.svg'; +import faviconSrc from '@images/icon.png'; + +// Default properties for the Meta component. These values are used if props are not provided. +// 'meta' sets a default description meta tag to describe the page content. +// 'structuredData' defines default structured data in JSON-LD format to enhance search engine understanding of the page (for SEO purposes). +const defaultProps = { + meta: SITE.description, + structuredData: SEO.structuredData, + customDescription: null, + customOgTitle: null, +}; + +// Extract props with default values assigned from defaultProps. Values can be overridden when the component is used. +// For example: +// +const { + meta = defaultProps.meta, + structuredData = defaultProps.structuredData, + customDescription = defaultProps.customDescription, + customOgTitle = defaultProps.customOgTitle, +} = Astro.props; + +// Use custom description if provided, otherwise use default meta +const description = customDescription || meta; +// Use custom OG title if provided, otherwise use default OG title +const ogTitle = customOgTitle || OG.title; +const ogDescription = customDescription || OG.description; + +// Define the metadata for your website and individual pages +const siteURL = `${Astro.site}`; // Set the website URL in astro.config.mjs +const author = SITE.author; +const canonical = new URL(Astro.url.pathname, Astro.site || Astro.url.origin) + .href; +const basePath = Astro.url.pathname; +const socialImageRes = await getImage({ + src: OG.image, + width: 1200, + height: 600, +}); +const socialImage = Astro.url.origin + socialImageRes.src; // Get the full URL of the image (https://stackoverflow.com/a/9858694) + +const languages: { [key: string]: string } = { + en: '', +}; + +function createHref(lang: string, prefix: string, path: string): string { + // Remove any existing language prefix + const cleanPath = path.replace(/^\/(en)\//, '/'); + + // Add the correct language prefix if needed + const basePath = prefix ? `/${prefix}${cleanPath}` : cleanPath; + const normalizedBasePath = basePath.replace(/\/\/+/g, '/'); + + return `${siteURL.slice(0, -1)}${normalizedBasePath}`; +} + +const fullPath: string = Astro.url.pathname; + +// Generate and optimize the favicon images +const faviconSvg = await getImage({ + src: faviconSvgSrc, + format: 'svg', +}); + +const appleTouchIcon = await getImage({ + src: faviconSrc, + width: 180, + height: 180, + format: 'png', +}); +--- + +{ + /* Inject structured data into the page if provided. This data is formatted as JSON-LD, a method recommended by Google for structured data pass: + https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data */ +}{ + structuredData && ( + + + diff --git a/apps/website/src/components/sections/navbar&footer/Navbar.astro b/apps/website/src/components/sections/navbar&footer/Navbar.astro new file mode 100644 index 00000000..63e2bbd0 --- /dev/null +++ b/apps/website/src/components/sections/navbar&footer/Navbar.astro @@ -0,0 +1,205 @@ +--- +//Import relevant dependencies +import ThemeIcon from '@components/ThemeIcon.astro'; +import NavLink from '@components/ui/links/NavLink.astro'; +import Authentication from '../misc/Authentication.astro'; +import enStrings from '@utils/navigation.ts'; +import BrandLogo from '@components/BrandLogo.astro'; + +const strings = enStrings; +const homeUrl = '/'; +--- + +{/* Main header component */} +
+ {/* Navigation container */} + +
+{/* Theme Appearance script to manage light/dark modes */} + diff --git a/apps/website/src/components/sections/pricing/PricingSection.astro b/apps/website/src/components/sections/pricing/PricingSection.astro new file mode 100644 index 00000000..837983f8 --- /dev/null +++ b/apps/website/src/components/sections/pricing/PricingSection.astro @@ -0,0 +1,158 @@ +--- +// Import SecondaryCTA component for use in this module +import SecondaryCTA from '@components/ui/buttons/SecondaryCTA.astro'; +import Icon from '@components/ui/icons/Icon.astro'; + +// Define props from Astro +const { pricing } = Astro.props; + +// Define TypeScript type for products. +type Product = { + name: string; + description: string; + price: string; + cents: string; + billingFrequency: string; + features: Array; + purchaseBtnTitle: string; + purchaseLink: string; +}; + +interface PricingSectionProps { + title: string; + subTitle: string; + badge: string; + thirdOption: string; + btnText: string; + pricing: { + title: string; + subTitle: string; + starterKit: Product; + professionalToolbox: Product; + }; +} +--- + +
+ {/* Section heading and sub-heading */} +
+

+ {pricing.title} +

+

+ {pricing.subTitle} +

+
+ {/* Contains two main product blocks */} +
+ {/* Starter Kit product details */} +
+
+

+ {pricing.starterKit.name} +

+

{pricing.starterKit.description}

+
+ +
+ {pricing.starterKit.price} + {pricing.starterKit.cents} + {pricing.starterKit.billingFrequency} +
+ { + /* Features list - automatically created by mapping over `features` array */ + } +
    + { + pricing.starterKit.features.map((feature: string) => ( +
  • + + + {feature} +
  • + )) + } +
+ {/* CTA for purchasing the product */} + {pricing.starterKit.purchaseBtnTitle} +
+ {/* Professional Toolbox product details */} +
+
+
+

+ {pricing.professionalToolbox.name} +

+

+ {pricing.professionalToolbox.description} +

+
+ + {pricing.badge} +
+ +
+ {pricing.professionalToolbox.price} + {pricing.professionalToolbox.cents} + {pricing.professionalToolbox.billingFrequency} +
+ { + /* Features list - automatically created by mapping over `features` array */ + } +
    + { + pricing.professionalToolbox.features.map((feature: string) => ( +
  • + + + {feature} +
  • + )) + } +
+ {/* CTA for purchasing the product */} + {pricing.professionalToolbox.purchaseBtnTitle} +
+
+ {/* Call to action for Enterprise Solutions */} +
+

+ {pricing.thirdOption} +

+ + +
+
diff --git a/apps/website/src/components/sections/testimonials/TestimonialItem.astro b/apps/website/src/components/sections/testimonials/TestimonialItem.astro new file mode 100644 index 00000000..6c6d92bc --- /dev/null +++ b/apps/website/src/components/sections/testimonials/TestimonialItem.astro @@ -0,0 +1,43 @@ +--- +import { Image } from 'astro:assets'; +import Icon from '../../ui/icons/Icon.astro'; + +const { content, author, role, avatarSrc } = Astro.props; + +interface Props { + content: string; + author: string; + role: string; + avatarSrc: string; +} +--- + +
+ + +
+

+ {content} +

+
+ +
+
+
+ Avatar Description +
+
+
+ {author} +
+
{role}
+
+
+
+
diff --git a/apps/website/src/components/sections/testimonials/TestimonialsSection.astro b/apps/website/src/components/sections/testimonials/TestimonialsSection.astro new file mode 100644 index 00000000..bb3de182 --- /dev/null +++ b/apps/website/src/components/sections/testimonials/TestimonialsSection.astro @@ -0,0 +1,85 @@ +--- +import TestimonialItem from './TestimonialItem.astro'; +import StatsGrid from '../../ui/blocks/StatsGrid.astro'; + +const { title, subTitle, testimonials, statistics } = Astro.props; + +interface Props { + title: string; + subTitle?: string; + testimonials?: Testimonial[]; + statistics?: StatProps[]; +} + +// TypeScript type for testimonials +type Testimonial = { + content: string; + author: string; + role: string; + avatarSrc: string; +}; + +// TypeScript type for stats. +type StatProps = { + count: string; + description: string; +}; +--- + +
+ {/* Container for the testimonials */} +
+
+ {/* Title and Subtitle */} +
+

+ {title} +

+ { + subTitle && ( +

{subTitle}

+ ) + } +
+ + { + /* Generate a blockquote for each testimonial in the testimonials array by mapping over the array. */ + } + { + testimonials && + testimonials.map(testimonial => ( + + )) + } +
+ { + statistics && ( +
+
+
    + {/* Generate a list item for each stat in the statistics array by mapping over the array. */} + {statistics.map((stat, index) => ( + + ))} +
+
+
+ ) + } +
+
diff --git a/apps/website/src/components/sections/testimonials/TestimonialsSectionAlt.astro b/apps/website/src/components/sections/testimonials/TestimonialsSectionAlt.astro new file mode 100644 index 00000000..e35082d5 --- /dev/null +++ b/apps/website/src/components/sections/testimonials/TestimonialsSectionAlt.astro @@ -0,0 +1,73 @@ +--- +// Import AvatarTestimonialSection component for use in this module +import AvatarTestimonialSection from '../../ui/avatars/AvatarTestimonialSection.astro'; + +// Define props from Astro +const { title, testimonials } = Astro.props; + +// Define TypeScript interface for Testimonial +interface Testimonial { + content: string; + author: string; + role: string; + avatarSrc: string; + avatarAlt: string; +} + +// Define TypeScript interface for props +interface Props { + title: string; + testimonials: Testimonial[]; +} +--- + +{/* Main div that wraps the testimonials section */} +
+ {/* Title of the testimonials section */} +
+

+ {title} +

+
+ +
+ {/* Looping through each testimonial data and rendering it */} + { + testimonials.map(testimonial => ( +
+
+
+ {/* Testimonial content */} +

+ {testimonial.content} +

+
+ +
+
+ + +
+

+ {testimonial.author} +

+

+ {testimonial.role} +

+
+
+
+
+
+ )) + } +
+
diff --git a/apps/website/src/components/ui/avatars/Avatar.astro b/apps/website/src/components/ui/avatars/Avatar.astro new file mode 100644 index 00000000..19eced54 --- /dev/null +++ b/apps/website/src/components/ui/avatars/Avatar.astro @@ -0,0 +1,18 @@ +--- +import { Image } from 'astro:assets'; + +const { src, alt } = Astro.props; + +interface Props { + src: string; + alt: string; +} +--- + +{alt} diff --git a/apps/website/src/components/ui/avatars/AvatarBlog.astro b/apps/website/src/components/ui/avatars/AvatarBlog.astro new file mode 100644 index 00000000..8217cf5e --- /dev/null +++ b/apps/website/src/components/ui/avatars/AvatarBlog.astro @@ -0,0 +1,22 @@ +--- +// Import necessary components +import { Image } from 'astro:assets'; + +import type { CollectionEntry } from 'astro:content'; + +const { blogEntry } = Astro.props; + +interface Props { + blogEntry: CollectionEntry<'blog'>; +} +--- + +
+ {blogEntry.data.authorImageAlt} +
diff --git a/apps/website/src/components/ui/avatars/AvatarBlogLarge.astro b/apps/website/src/components/ui/avatars/AvatarBlogLarge.astro new file mode 100644 index 00000000..dfae70ef --- /dev/null +++ b/apps/website/src/components/ui/avatars/AvatarBlogLarge.astro @@ -0,0 +1,22 @@ +--- +// Import necessary components +import { Image } from 'astro:assets'; + +import type { CollectionEntry } from 'astro:content'; + +const { blogEntry } = Astro.props; + +interface Props { + blogEntry: CollectionEntry<'blog'>; +} +--- + +
+ {blogEntry.data.authorImageAlt} +
diff --git a/apps/website/src/components/ui/avatars/AvatarTestimonialSection.astro b/apps/website/src/components/ui/avatars/AvatarTestimonialSection.astro new file mode 100644 index 00000000..7d187938 --- /dev/null +++ b/apps/website/src/components/ui/avatars/AvatarTestimonialSection.astro @@ -0,0 +1,17 @@ +--- +const { src, alt } = Astro.props; + +interface Props { + src: string; + alt: string; +} +--- + +
+ {alt} +
diff --git a/apps/website/src/components/ui/banners/AnnouncementBanner.astro b/apps/website/src/components/ui/banners/AnnouncementBanner.astro new file mode 100644 index 00000000..e9b1ce12 --- /dev/null +++ b/apps/website/src/components/ui/banners/AnnouncementBanner.astro @@ -0,0 +1,84 @@ +--- +const { title, btnId, btnTitle, url } = Astro.props; + +interface Props { + title?: string; + btnId: string; + btnTitle: string; + url: string; +} +--- + + +
+
+
+
+ { + title && ( +

+ {title} +

+ ) + } + + {btnTitle} + + +
+ +
+
+
+
+ diff --git a/apps/website/src/components/ui/blocks/AccordionItem.astro b/apps/website/src/components/ui/blocks/AccordionItem.astro new file mode 100644 index 00000000..49d8cda5 --- /dev/null +++ b/apps/website/src/components/ui/blocks/AccordionItem.astro @@ -0,0 +1,51 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +// Define props from Astro +const { id, collapseId, question, answer, first } = Astro.props; +// Define TypeScript interface for props +interface Props { + id: string; + collapseId: string; + question: string; + answer: string; + first?: boolean; +} +// Define class names for the accordion and its content +const ACCORDION_CLASS_DEFAULT = 'hs-accordion pb-3 active'; +const ACCORDION_CLASS_COLLAPSED = 'hs-accordion pt-6 pb-3'; +const ACCORDION_CONTENT_CLASS = + 'hs-accordion-content w-full overflow-hidden transition-[height] duration-300'; +// Helper function to return the correct class for the accordion +function getAccordionClass(first: boolean = false) { + return first ? ACCORDION_CLASS_DEFAULT : ACCORDION_CLASS_COLLAPSED; +} +--- + +{/* The main container for the accordion item */} +
+ {/* The accordion button, which toggles the expanded/collapsed state */} + + {/* The collapsible content of the accordion */} +
+ {/* The content paragraph */} +

+ {answer} +

+
+
diff --git a/apps/website/src/components/ui/blocks/ContactIconBlock.astro b/apps/website/src/components/ui/blocks/ContactIconBlock.astro new file mode 100644 index 00000000..061a72c6 --- /dev/null +++ b/apps/website/src/components/ui/blocks/ContactIconBlock.astro @@ -0,0 +1,66 @@ +--- +// Define props from Astro +const { + heading, + content, + isAddressVisible, + addressContent, + isLinkVisible, + linkTitle, + linkURL, + isArrowVisible, +} = Astro.props; + +// Define TypeScript interface for props +interface Props { + heading?: string; + content?: string; + isAddressVisible?: boolean; + addressContent?: string; + isLinkVisible?: boolean; + linkTitle?: string; + linkURL?: string; + isArrowVisible?: boolean; +} + +// Define SVG arrow to be used in the component +const arrowSVG: string = ` + `; +--- + +{/* Root container, which arranges the heading and content */} +
+ {/* Slot to allow for extensibility of the component */} + +
+ {/* Heading of the section */} +

+ {heading} +

+ {/* Content of the section */} +

{content}

+ {/* Conditional rendering of address content if isAddressVisible is true */} + { + isAddressVisible ? ( +

{addressContent}

+ ) : null + } + { + /* Conditional rendering of a link if isLinkVisible is true. + The link also conditionally includes an arrow SVG if isArrowVisible is true */ + } + { + isLinkVisible ? ( + + {linkTitle} + {isArrowVisible ? : null} + + ) : null + } +
+
diff --git a/apps/website/src/components/ui/blocks/IconBlock.astro b/apps/website/src/components/ui/blocks/IconBlock.astro new file mode 100644 index 00000000..f450a9e1 --- /dev/null +++ b/apps/website/src/components/ui/blocks/IconBlock.astro @@ -0,0 +1,28 @@ +--- +// Get heading and content from Astro props +const { heading, content } = Astro.props; +// Define TypeScript interface for props +interface Props { + heading?: string; + content?: string; +} +// Define classes for heading and content +const headingClasses = + 'text-balance text-lg font-bold text-neutral-800 dark:text-neutral-200'; +const contentClasses = + 'mt-1 text-pretty text-neutral-700 dark:text-neutral-300'; +--- + +{/* The root container that arranges your slot and the heading/content */} +
+ {/* Slot to allow for extensibility of the component */} + +
+ {/* Heading of the section */} +

+ {heading} +

+ {/* Content text of the section */} +

{content}

+
+
diff --git a/apps/website/src/components/ui/blocks/LeftSection.astro b/apps/website/src/components/ui/blocks/LeftSection.astro new file mode 100644 index 00000000..14bf12bf --- /dev/null +++ b/apps/website/src/components/ui/blocks/LeftSection.astro @@ -0,0 +1,49 @@ +--- +// Import the necessary modules +import { Image } from 'astro:assets'; +import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro'; +// Destructure the props passed to the Astro component +const { title, subTitle, btnExists, btnTitle, btnURL, img, imgAlt } = + Astro.props; +// Define TypeScript interface for props +interface Props { + title: string; + subTitle: string; + btnExists?: boolean; + btnTitle?: string; + btnURL?: string; + img: any; + imgAlt: any; +} +--- + +{/* The root section of the component */} +
+ {/* The Image component which renders the image */} + {imgAlt} + {/* The container for title, subtitle, and optional CTA button */} +
+ {/* The title of the section */} +

+ {title} +

+ {/* The subtitle of the section */} +

+ {subTitle} +

+ {/* Conditionally render the Primary CTA button if btnExists is true */} + {btnExists ? : null} +
+
diff --git a/apps/website/src/components/ui/blocks/MainSection.astro b/apps/website/src/components/ui/blocks/MainSection.astro new file mode 100644 index 00000000..5ecf462b --- /dev/null +++ b/apps/website/src/components/ui/blocks/MainSection.astro @@ -0,0 +1,45 @@ +--- +// Import PrimaryCTA component +import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro'; + +// Destructure the props passed to the Astro component +const { title, subTitle, btnExists, btnTitle, btnURL } = Astro.props; +// Define TypeScript interface for props +interface Props { + title: string; + subTitle: string; + btnExists?: boolean; + btnTitle?: string; + btnURL?: string; +} +--- + +{/* Root section of the component */} +
+
+ {/* Section title */} +

+ {title} +

+ {/* Section subtitle */} +

+ {subTitle} +

+ { + /* Conditional rendering of PrimaryCTA component if 'btnExists' property is truthy */ + } + { + btnExists ? ( +
+ +
+ ) : null + } +
+
diff --git a/apps/website/src/components/ui/blocks/ReviewComponent.astro b/apps/website/src/components/ui/blocks/ReviewComponent.astro new file mode 100644 index 00000000..1d78bc23 --- /dev/null +++ b/apps/website/src/components/ui/blocks/ReviewComponent.astro @@ -0,0 +1,61 @@ +--- +import Avatar from '@components/ui/avatars/Avatar.astro'; +import FullStar from '@components/ui/stars/FullStar.astro'; +import HalfStar from '@components/ui/stars/HalfStar.astro'; + +const { avatars, starCount = 0, rating, reviews } = Astro.props; + +interface Props { + avatars?: Array; + starCount?: number; + rating?: string; + reviews?: string; +} +--- + +
+
+
+
+ {/* Avatar Group */} +
+ {avatars?.map(src => )} + + 7k+ + +
+
+
+
+ {/* Review Ratings */} +
+
+
+ {/* Your star ratings */} + { + Array(starCount) + .fill(0) + .map((_, i) => ) + } + {/* Adding additional half-star */} + +
+

+ +

+
+
+

+ +

+
+
+
+
+
diff --git a/apps/website/src/components/ui/blocks/RightSection.astro b/apps/website/src/components/ui/blocks/RightSection.astro new file mode 100644 index 00000000..2834626d --- /dev/null +++ b/apps/website/src/components/ui/blocks/RightSection.astro @@ -0,0 +1,88 @@ +--- +// Import the required modules +import { Image } from 'astro:assets'; +import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro'; +// Extract properties from Astro.props +const { + title, + subTitle, + btnExists, + btnTitle, + btnURL, + single, + imgOne, + imgOneAlt, + imgTwo, + imgTwoAlt, +} = Astro.props; +// Define TypeScript interface for the properties +interface Props { + title: string; + subTitle: string; + btnExists?: boolean; + btnTitle?: string; + btnURL?: string; + single?: boolean; + imgOne?: any; + imgOneAlt?: any; + imgTwo?: any; + imgTwoAlt?: any; +} +--- + +{/* Root section of the component */} +
+
+ {/* Title of the section */} +

+ {title} +

+ {/* Subtitle of the section */} +

+ {subTitle} +

+ { + /* Conditional rendering of the Primary Call-To-Action button if 'btnExists' is true */ + } + {btnExists ? : null} +
+ {/* Conditionally render one or two images based on 'single' property */} + { + single ? ( +
+ {/* Single image */} + {imgOneAlt} +
+ ) : ( +
+ {/* First image in a two-image layout */} + {imgOneAlt} + {/* Second image in a two-image layout */} + {imgTwoAlt} +
+ ) + } +
diff --git a/apps/website/src/components/ui/blocks/StatsBig.astro b/apps/website/src/components/ui/blocks/StatsBig.astro new file mode 100644 index 00000000..580d6200 --- /dev/null +++ b/apps/website/src/components/ui/blocks/StatsBig.astro @@ -0,0 +1,17 @@ +--- +// Extract the properties from Astro.props +const { title, subTitle } = Astro.props; +// Define TypeScript interface for the properties +interface Props { + title: string; + subTitle: string; +} +--- + +{/* Container for the title and subtitle */} +
+

+ {title} +

+

{subTitle}

+
diff --git a/apps/website/src/components/ui/blocks/StatsGrid.astro b/apps/website/src/components/ui/blocks/StatsGrid.astro new file mode 100644 index 00000000..f617f9b1 --- /dev/null +++ b/apps/website/src/components/ui/blocks/StatsGrid.astro @@ -0,0 +1,23 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; + +const { count, description, index } = Astro.props; + +interface Props { + count: string; + description: string; + index: number; +} +--- + +
  • +
    + {index === 1 || index === 2 ? : null} + {count} +
    +

    + {description} +

    +
  • diff --git a/apps/website/src/components/ui/blocks/StatsSmall.astro b/apps/website/src/components/ui/blocks/StatsSmall.astro new file mode 100644 index 00000000..ba500ed0 --- /dev/null +++ b/apps/website/src/components/ui/blocks/StatsSmall.astro @@ -0,0 +1,15 @@ +--- +// Extract the properties from Astro.props +const { title, subTitle } = Astro.props; +// Define TypeScript interface for the properties +interface Props { + title: string; + subTitle: string; +} +--- + +{/* Container for title and subtitle */} +
    +

    {title}

    +

    {subTitle}

    +
    diff --git a/apps/website/src/components/ui/blocks/TabContent.astro b/apps/website/src/components/ui/blocks/TabContent.astro new file mode 100644 index 00000000..42822816 --- /dev/null +++ b/apps/website/src/components/ui/blocks/TabContent.astro @@ -0,0 +1,54 @@ +--- +// Import the Image component from astro:assets +import { Image } from 'astro:assets'; + +// Destructure the component properties from Astro.props +const { id, aria, src, alt, first, second } = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + id: string; + aria: string; + src?: any; + alt: string; + first?: boolean; + second?: boolean; +} +// Set class based on 'first' property +// If 'first' is present, show the tab content immediately +const firstClass = first ? '' : 'hidden'; +// Set class based on 'second' property +// If 'second' is present, use an alternate style for the image +const secondClass = second + ? 'shadow-xl aspect-video object-contain bg-neutral-300 dark:bg-neutral-600 p-3 lg:object-cover lg:aspect-square shadow-neutral-200 rounded-xl dark:shadow-neutral-900/[.2]' + : 'shadow-xl aspect-video object-cover lg:aspect-square shadow-neutral-200 rounded-xl dark:shadow-neutral-900/[.2]'; + +/* +first: This property should be set to true for the initial TabContent component +in your list to ensure that it's visible when the page first loads. +All subsequent TabContent components should omit this property or set it to false. + +second: This property allows to control changes in the look of the Image. +If it is set to true, the Image will have different aspect ratio and background color. +If this property is not provided or is set to false, the Image will use default styling. +You can enable this for any TabContent component you want to apply these changes to. + +This is the full example: + + + +*/ +--- + +{/* Container for tab content that controls visibility and accessibility */} +
    + + {alt} +
    diff --git a/apps/website/src/components/ui/blocks/TabNav.astro b/apps/website/src/components/ui/blocks/TabNav.astro new file mode 100644 index 00000000..b4396c13 --- /dev/null +++ b/apps/website/src/components/ui/blocks/TabNav.astro @@ -0,0 +1,59 @@ +--- +// Extract properties from Astro.props +const { aria, dataTab, id, heading, content, first } = Astro.props; + +// Define TypeScript interface for properties +interface Props { + dataTab: string; + id: string; + aria: string; + heading?: string; + content?: string; + first?: boolean; +} +// Define button classes +const BUTTON_CLASS = + 'dark:hover:bg-neutral-700 rounded-xl p-4 text-start outline-hidden ring-zinc-500 transition duration-300 hover:bg-neutral-200 focus-visible:ring-3 hs-tab-active:bg-neutral-50 hs-tab-active:shadow-md hs-tab-active:hover:border-transparent dark:ring-zinc-200 dark:focus:outline-hidden dark:hs-tab-active:bg-neutral-700/60 md:p-5'; + +/* +first: This property should be set to true for the initial TabNav component in your list +to ensure that it's visible when the page first loads. All subsequent TabNav components +should omit this property or set it to false. + +Example: + + + +*/ +--- + +{ + /* Tab button with dynamic class based on 'first' property, id, tab data, and aria-controls */ +} + diff --git a/apps/website/src/components/ui/buttons/AuthBtn.astro b/apps/website/src/components/ui/buttons/AuthBtn.astro new file mode 100644 index 00000000..f3c833ef --- /dev/null +++ b/apps/website/src/components/ui/buttons/AuthBtn.astro @@ -0,0 +1,25 @@ +--- +// Destructure the properties from Astro.props +const { title } = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + title: string; +} +// Define CSS classes for styling the button +const baseClasses = + 'inline-flex w-full items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm font-bold text-neutral-700 focus-visible:ring-3 outline-hidden transition duration-300'; +const borderClasses = 'border border-transparent'; +const bgColorClasses = 'bg-yellow-400 dark:focus:outline-hidden'; +const hoverClasses = 'hover:bg-yellow-500'; +const fontSizeClasses = '2xl:text-base'; +const disabledClasses = 'disabled:pointer-events-none disabled:opacity-50'; +const ringClasses = 'ring-zinc-500 dark:ring-zinc-200'; +--- + +{/* Styled submit button with dynamic title */} + diff --git a/apps/website/src/components/ui/buttons/Bookmark.astro b/apps/website/src/components/ui/buttons/Bookmark.astro new file mode 100644 index 00000000..279d68e5 --- /dev/null +++ b/apps/website/src/components/ui/buttons/Bookmark.astro @@ -0,0 +1,95 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +--- + + + + diff --git a/apps/website/src/components/ui/buttons/Btn404.astro b/apps/website/src/components/ui/buttons/Btn404.astro new file mode 100644 index 00000000..108eed8b --- /dev/null +++ b/apps/website/src/components/ui/buttons/Btn404.astro @@ -0,0 +1,30 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +// Destructure the properties from Astro.props +const { title, id, noArrow } = Astro.props; +// Define TypeScript interface for the properties +interface Props { + title?: string; + id?: string; + noArrow?: boolean; +} +// Define CSS classes for styling the button +const baseClasses = + 'group inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm font-bold text-neutral-50 ring-zinc-500 transition duration-300 focus-visible:ring-3 outline-hidden'; +const borderClasses = 'border border-transparent'; +const bgColorClasses = + 'bg-orange-400 hover:bg-orange-500 active:bg-orange-500 dark:focus:outline-hidden'; +const disableClasses = 'disabled:pointer-events-none disabled:opacity-50'; +const fontSizeClasses = '2xl:text-base'; +const ringClasses = 'dark:ring-zinc-200'; +--- + +{/* Button with dynamic title, id, and optional arrow */} + diff --git a/apps/website/src/components/ui/buttons/GithubBtn.astro b/apps/website/src/components/ui/buttons/GithubBtn.astro new file mode 100644 index 00000000..d88ce961 --- /dev/null +++ b/apps/website/src/components/ui/buttons/GithubBtn.astro @@ -0,0 +1,27 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +const { title, url } = Astro.props; + +interface Props { + title?: string; + url?: string; +} + +const baseClasses = + 'group inline-flex items-center justify-center gap-x-3 rounded-lg px-4 py-3 text-center text-sm font-medium text-neutral-700 ring-zinc-500 focus-visible:ring-3 transition duration-300 outline-hidden'; +const borderClasses = 'border border-transparent'; +const bgColorClasses = 'bg-yellow-400 dark:focus:outline-hidden'; +const hoverClasses = 'hover:shadow-2xl hover:shadow-yellow-500'; +const fontSizeClasses = '2xl:text-base'; +const ringClasses = 'dark:ring-zinc-200'; +--- + + + + {title} + diff --git a/apps/website/src/components/ui/buttons/GoogleBtn.astro b/apps/website/src/components/ui/buttons/GoogleBtn.astro new file mode 100644 index 00000000..b90596c4 --- /dev/null +++ b/apps/website/src/components/ui/buttons/GoogleBtn.astro @@ -0,0 +1,47 @@ +--- +const { title } = Astro.props; + +interface Props { + title: string; +} + +const baseClasses = + 'inline-flex w-full items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm dark:text-neutral-400 font-medium text-neutral-600 shadow-xs transition duration-300 focus-visible:ring-3 outline-hidden'; +const borderClasses = 'border border-neutral-200 dark:border-neutral-700'; +const bgColorClasses = + 'bg-neutral-50 dark:bg-neutral-800 hover:bg-neutral-200 dark:hover:bg-neutral-900'; +const disableClasses = 'disabled:pointer-events-none disabled:opacity-50'; +const ringClasses = 'ring-zinc-500 dark:ring-zinc-200'; +const googleSVG = ` + + + + + `; +--- + + diff --git a/apps/website/src/components/ui/buttons/LoginBtn.astro b/apps/website/src/components/ui/buttons/LoginBtn.astro new file mode 100644 index 00000000..1e52e07a --- /dev/null +++ b/apps/website/src/components/ui/buttons/LoginBtn.astro @@ -0,0 +1,42 @@ +--- +const { title = 'Log in' } = Astro.props; + +interface Props { + title?: string; +} + +const baseClasses = + 'flex items-center gap-x-2 text-base md:text-sm font-medium text-neutral-600 ring-zinc-500 transition duration-300 focus-visible:ring-3 outline-hidden'; +const hoverClasses = 'hover:text-orange-400 dark:hover:text-orange-300'; +const darkClasses = + 'dark:border-neutral-700 dark:text-neutral-400 dark:ring-zinc-200 dark:focus:outline-hidden'; +const mdClasses = 'md:my-6 md:border-s md:border-neutral-300 md:ps-6'; +const txtSizeClasses = '2xl:text-base'; +const userSVG = ` + + + `; +--- + + diff --git a/apps/website/src/components/ui/buttons/PrimaryCTA.astro b/apps/website/src/components/ui/buttons/PrimaryCTA.astro new file mode 100644 index 00000000..e3200cf5 --- /dev/null +++ b/apps/website/src/components/ui/buttons/PrimaryCTA.astro @@ -0,0 +1,31 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +// Destructure the properties from Astro.props +const { title, url, noArrow } = Astro.props; +// Define TypeScript interface for the properties +interface Props { + title?: string; + url?: string; + noArrow?: boolean; +} +// Define CSS classes for styling the button +const baseClasses = + 'group inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm font-bold text-neutral-50 ring-zinc-500 transition duration-300 focus-visible:ring-3 outline-hidden'; +const borderClasses = 'border border-transparent'; +const bgColorClasses = + 'bg-orange-400 hover:bg-orange-500 active:bg-orange-500 dark:focus:outline-hidden'; +const disableClasses = 'disabled:pointer-events-none disabled:opacity-50'; +const fontSizeClasses = '2xl:text-base'; +const ringClasses = 'dark:ring-zinc-200'; +--- + +{/* Link styled as a button, with dynamic title, URL, and optional arrow */} + + {title} + {/* Display the arrow based on the 'noArrow' property */} + + {noArrow ? null : } + diff --git a/apps/website/src/components/ui/buttons/ProductTabBtn.astro b/apps/website/src/components/ui/buttons/ProductTabBtn.astro new file mode 100644 index 00000000..a668c0c5 --- /dev/null +++ b/apps/website/src/components/ui/buttons/ProductTabBtn.astro @@ -0,0 +1,34 @@ +--- +// Destructure the properties from Astro.props +const { id, dataTab, title, first } = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + id: string; + dataTab: string; + title: string; + first?: boolean; +} +// Define constants for styling classes +const BUTTON_CLASS = + 'flex w-full justify-center rounded-xl border border-transparent p-3 outline-hidden ring-zinc-500 transition duration-300 hover:bg-neutral-100 focus-visible:ring-3 dark:ring-zinc-200 dark:hover:bg-neutral-700 dark:focus:outline-hidden md:p-5'; + +const HEADING_CLASS = 'block text-center font-bold'; +const INACTIVE_HEADING_CLASS = 'text-neutral-800 dark:text-neutral-200'; +--- + +{/* Tab button element */} + diff --git a/apps/website/src/components/ui/buttons/SecondaryCTA.astro b/apps/website/src/components/ui/buttons/SecondaryCTA.astro new file mode 100644 index 00000000..a996bda7 --- /dev/null +++ b/apps/website/src/components/ui/buttons/SecondaryCTA.astro @@ -0,0 +1,31 @@ +--- +// Destructure the properties from Astro.props +const { title, url } = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + title?: string; + url?: string; +} +// Define CSS classes for the hyperlink button +const baseClasses = + 'inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-center text-sm font-medium text-neutral-600 shadow-xs outline-hidden ring-zinc-500 focus-visible:ring-3 transition duration-300'; +const borderClasses = 'border border-neutral-200'; +const bgColorClasses = 'bg-neutral-300'; +const hoverClasses = + 'hover:bg-neutral-400/50 hover:text-neutral-600 active:text-neutral-700'; +const disableClasses = 'disabled:pointer-events-none disabled:opacity-50'; +const fontSizeClasses = '2xl:text-base'; +const ringClasses = 'ring-zinc-500'; + +const darkClasses = + 'dark:border-neutral-700 dark:bg-zinc-700 dark:text-neutral-300 dark:ring-zinc-200 dark:hover:bg-zinc-600 dark:focus:outline-hidden'; +--- + +{/* Styled hyperlink */} + + {title} + diff --git a/apps/website/src/components/ui/buttons/SocialShare.astro b/apps/website/src/components/ui/buttons/SocialShare.astro new file mode 100644 index 00000000..f8e03941 --- /dev/null +++ b/apps/website/src/components/ui/buttons/SocialShare.astro @@ -0,0 +1,173 @@ +--- +import Icon from '@components/ui/icons/Icon.astro'; +// Destructure the properties from Astro.props +const { + pageTitle, + title = Astro.currentLocale === 'fr' ? 'Partager' : 'Share', +} = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + pageTitle: string; + title?: string; +} + +type SocialPlatform = { + name: string; + url: string; + svg: string; +}; + +const encoded_url = encodeURIComponent(Astro.url.href); + +const socialPlatforms: SocialPlatform[] = [ + { + name: 'Facebook', + url: `https://www.facebook.com/sharer/sharer.php?u=${encoded_url}`, + svg: 'facebook', + }, + { + name: 'X', + url: `https://twitter.com/intent/tweet?url=${encoded_url}&text=${pageTitle}`, + svg: 'x', + }, + { + name: 'LinkedIn', + url: `https://www.linkedin.com/sharing/share-offsite/?url=${encoded_url}&title=${pageTitle}`, + svg: 'linkedIn', + }, +]; +--- + +
    + + + +
    + +{/* Import the necessary Clipboard plugin */} +{/* https://clipboardjs.com/ */} + + diff --git a/apps/website/src/components/ui/cards/CardBlog.astro b/apps/website/src/components/ui/cards/CardBlog.astro new file mode 100644 index 00000000..a4ada984 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardBlog.astro @@ -0,0 +1,76 @@ +--- +// Import necessary components and utilities +import AvatarBlog from '@components/ui/avatars/AvatarBlog.astro'; +import { Image } from 'astro:assets'; +import { formatDate } from '@utils/utils'; +import type { CollectionEntry } from 'astro:content'; + +const { blogEntry, blogLocale = '' } = Astro.props; + +interface Props { + blogEntry: CollectionEntry<'blog'>; + blogLocale?: string; +} +--- + +{ + /* The following anchor tag is the main container for the card. + It's a link to the blog post detailed page. + The data-astro-prefetch is an Astro specific Dynamic HTML feature, + which automatically prefetches the linked page to speed up navigation. */ +} + + { + /* The container for the blog post's cover image. Uses astro:assets' Image for image source */ + } +
    + {blogEntry.data.cardImageAlt} +
    + { + /* The container for the blog author's avatar and associated metadata (author name and publication date) */ + } +
    +
    +
    + + +
    +

    + {blogEntry.data.author} +

    +

    + {formatDate(blogEntry.data.pubDate)} +

    +
    +
    +
    +
    + {/* The container for the blog post's title and description */} +
    +
    +

    + {blogEntry.data.title} +

    +

    + {blogEntry.data.description} +

    +
    +
    +
    diff --git a/apps/website/src/components/ui/cards/CardBlogRecent.astro b/apps/website/src/components/ui/cards/CardBlogRecent.astro new file mode 100644 index 00000000..576bb526 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardBlogRecent.astro @@ -0,0 +1,74 @@ +--- +// Import all required components and utilities +import { Image } from 'astro:assets'; +import type { CollectionEntry } from 'astro:content'; +import AvatarBlogLarge from '@components/ui/avatars/AvatarBlogLarge.astro'; +import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro'; + +const { blogEntry, recentBlogLocale = '' } = Astro.props; + +interface Props { + blogEntry: CollectionEntry<'blog'>; + recentBlogLocale?: string; +} +--- + +{ + /* Root container, which is divided into 2 grid column layout for larger screens */ +} +
    + {/* Container for the blog post's cover image */} +
    +
    + {blogEntry.data.cardImageAlt} +
    +
    + { + /* Container for the blog post's heading, author avatar, author's role, and read more button */ + } +
    + {/* Blog title which is also a hyperlink to the blog detail page */} +

    + + {blogEntry.data.description} + +

    + {/* Container for the author's avatar and metadata */} +
    + + +
    +

    + {blogEntry.data.author} +

    +

    + {blogEntry.data.role} +

    +
    +
    + {/* Read More button which is a link to the blog post detailed page */} +
    + +
    +
    +
    diff --git a/apps/website/src/components/ui/cards/CardInsight.astro b/apps/website/src/components/ui/cards/CardInsight.astro new file mode 100644 index 00000000..12b6efa2 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardInsight.astro @@ -0,0 +1,61 @@ +--- +// Import necessary modules and utilities +import { Image } from 'astro:assets'; +import Icon from '@components/ui/icons/Icon.astro'; +import type { CollectionEntry } from 'astro:content'; + +const { + insightEntry, + insightLocale, + label = Astro.currentLocale === 'fr' ? 'Lire plus' : 'Read more', +} = Astro.props; + +interface Props { + insightEntry: CollectionEntry<'insights'>; + insightLocale?: string; + label?: string; +} +--- + +{ + /* The anchor tag is the root container for the "Insight" card. It links to the insight detail page. */ +} + + {/* This is the container for the insight's cover image. */} +
    + {insightEntry.data.cardImageAlt} +
    + {/* This is the container for the insight's title and description. */} +
    + {/* The title of the insight */} +

    + {insightEntry.data.title} +

    + {/* The description of the insight */} +

    + {insightEntry.data.description} +

    + { + /* The "Read More" hyperlink going to the full insight. With an arrow icon */ + } +

    + {label} + +

    +
    +
    diff --git a/apps/website/src/components/ui/cards/CardRelated.astro b/apps/website/src/components/ui/cards/CardRelated.astro new file mode 100644 index 00000000..5eb10aa4 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardRelated.astro @@ -0,0 +1,41 @@ +--- +// Import necessary modules and utilities +import { Image } from 'astro:assets'; +import { formatDate } from '@utils/utils'; +import type { CollectionEntry } from 'astro:content'; + +const { blogEntry, recentBlogLocale = '' } = Astro.props; + +interface Props { + blogEntry: CollectionEntry<'blog'>; + recentBlogLocale?: string; +} +--- + + +
    + {blogEntry.data.cardImageAlt} + {/* The title of the blog post */} +

    + {blogEntry.data.title} +

    + {/* The formatted publication date of the blog post */} +

    + {formatDate(blogEntry.data.pubDate)} +

    +
    diff --git a/apps/website/src/components/ui/cards/CardSmall.astro b/apps/website/src/components/ui/cards/CardSmall.astro new file mode 100644 index 00000000..e77b9866 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardSmall.astro @@ -0,0 +1,45 @@ +--- +// Import necessary modules and utilities +import { Image } from 'astro:assets'; +import Icon from '@components/ui/icons/Icon.astro'; +import type { CollectionEntry } from 'astro:content'; + +const { product, productLocale = '' } = Astro.props; + +interface Props { + product: CollectionEntry<'products'>; + productLocale?: string; +} + +// Define classes to be used with the Image component +const imageClass = + 'absolute inset-0 h-full w-full object-cover object-center transition duration-[600ms] ease-[cubic-bezier(0.45,0,0.55,1)] group-hover:scale-110'; +--- + +{/* A clickable card that leads to the details of the product*/} + + {/* The product's main image */} + {product.data.main.imgAlt} + {/* An overlay gradient that sits on top of the product image*/} +
    +
    + {/* The product's subtitle and the anchor SVG icon*/} + {product.data.description} + +
    diff --git a/apps/website/src/components/ui/cards/CardWide.astro b/apps/website/src/components/ui/cards/CardWide.astro new file mode 100644 index 00000000..dd495155 --- /dev/null +++ b/apps/website/src/components/ui/cards/CardWide.astro @@ -0,0 +1,47 @@ +--- +// Import necessary modules and utilities +import { Image } from 'astro:assets'; +import Icon from '@components/ui/icons/Icon.astro'; +import type { CollectionEntry } from 'astro:content'; + +const { product, productLocale = '' } = Astro.props; + +interface Props { + product: CollectionEntry<'products'>; + productLocale?: string; +} + +// Define classes to be used with the Image component +const imageClass = + 'absolute inset-0 h-full w-full object-cover object-center transition duration-[600ms] ease-[cubic-bezier(0.45,0,0.55,1)] group-hover:scale-110'; +--- + +{ + /* The anchor tag is the main container for the product card. When clicked, this leads to the details of the product. */ +} + + {/* The product's main image */} + {product.data.main.imgAlt} + {/* This container includes a gradient overlay over the product's image */} +
    +
    + {/* This container includes product's subtitle and an SVG icon*/} + {product.data.description} +
    diff --git a/apps/website/src/components/ui/feedback/PostFeedback.astro b/apps/website/src/components/ui/feedback/PostFeedback.astro new file mode 100644 index 00000000..12902d99 --- /dev/null +++ b/apps/website/src/components/ui/feedback/PostFeedback.astro @@ -0,0 +1,55 @@ +--- +// Define props from Astro +const { title, firstChoice, secondChoice } = Astro.props; + +// Define TypeScript interface for props +interface Props { + title: string; + firstChoice: string; + secondChoice: string; +} +--- + +
    +

    {title}

    + + +
    diff --git a/apps/website/src/components/ui/forms/LoginModal.astro b/apps/website/src/components/ui/forms/LoginModal.astro new file mode 100644 index 00000000..97650edc --- /dev/null +++ b/apps/website/src/components/ui/forms/LoginModal.astro @@ -0,0 +1,83 @@ +--- +// Import necessary components from their individual files +import EmailInput from './input/EmailInput.astro'; +import PasswordInput from './input/PasswordInput.astro'; +import Checkbox from './input/Checkbox.astro'; +import AuthBtn from '@components/ui/buttons/AuthBtn.astro'; +import GoogleBtn from '@components/ui/buttons/GoogleBtn.astro'; + +// Variables for customization of the LoginModal Component + +const config = { + id: 'hs-toggle-between-modals-login-modal', // Modal IDENTIFIER + title: 'Sign in', // Main HEADING + subTitle: "Don't have an account yet?", // Sub-Heading TEXT + registerBtn: 'Sign up here', // Text for REGISTRATION BUTTON + registerBtnDataHS: '#hs-toggle-between-modals-register-modal', // TARGET LINK for registration button +}; +--- + + diff --git a/apps/website/src/components/ui/forms/RecoverModal.astro b/apps/website/src/components/ui/forms/RecoverModal.astro new file mode 100644 index 00000000..15756545 --- /dev/null +++ b/apps/website/src/components/ui/forms/RecoverModal.astro @@ -0,0 +1,67 @@ +--- +// Import necessary components from individual files +import EmailInput from './input/EmailInput.astro'; +import AuthBtn from '@components/ui/buttons/AuthBtn.astro'; + +// Config object for customization of the component +const config = { + id: 'hs-toggle-between-modals-recover-modal', // Modal identifier + title: 'Forgot password?', // Main heading + subTitle: 'Remember your password?', // Sub-heading text + loginBtn: 'Sign in here', // Text for login button + loginBtnDataHS: '#hs-toggle-between-modals-login-modal', // Target link for login button +}; +--- + +{/* Root element of the modal with id and styling */} + diff --git a/apps/website/src/components/ui/forms/RegisterModal.astro b/apps/website/src/components/ui/forms/RegisterModal.astro new file mode 100644 index 00000000..087c58ec --- /dev/null +++ b/apps/website/src/components/ui/forms/RegisterModal.astro @@ -0,0 +1,101 @@ +--- +// Import necessary components from individual files +import EmailInput from './input/EmailInput.astro'; +import PasswordInput from './input/PasswordInput.astro'; +import Checkbox from './input/Checkbox.astro'; +import GoogleBtn from '@components/ui/buttons/GoogleBtn.astro'; +import AuthBtn from '@components/ui/buttons/AuthBtn.astro'; +// Config object for customization of the component +const config = { + id: 'hs-toggle-between-modals-register-modal', // Modal identifier + title: 'Sign up', // Main heading + subTitle: 'Already have an account?', // Sub-heading text + loginBtn: 'Sign in here', // Text for login button + loginBtnDataHS: '#hs-toggle-between-modals-login-modal', // Target link for login button +}; +--- + +{/* Root element of the registration modal with the id and styling */} + diff --git a/apps/website/src/components/ui/forms/input/Checkbox.astro b/apps/website/src/components/ui/forms/input/Checkbox.astro new file mode 100644 index 00000000..9a6ddd56 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/Checkbox.astro @@ -0,0 +1,30 @@ +--- +const { + label = Astro.currentLocale === 'fr' ? 'Me rappeler' : 'Remember me', + id, +} = Astro.props; + +interface Props { + label?: string; + id?: string; +} +--- + +{/* Container for the checkbox and its label */} +
    + {/* Checkbox input */} +
    + +
    + {/* Label for the checkbox */} +
    + +
    +
    diff --git a/apps/website/src/components/ui/forms/input/EmailContactInput.astro b/apps/website/src/components/ui/forms/input/EmailContactInput.astro new file mode 100644 index 00000000..69e42d00 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/EmailContactInput.astro @@ -0,0 +1,26 @@ +--- +const { label = Astro.currentLocale === 'fr' ? 'E-mail' : 'Email', id } = + Astro.props; + +interface Props { + label?: string; + id: string; +} +--- + +{/* Container for the label and email input field */} +
    + { + /* Label for the email input field, visually hidden but accessible to screen readers */ + } + + {/* Email input field */} + +
    diff --git a/apps/website/src/components/ui/forms/input/EmailFooterInput.astro b/apps/website/src/components/ui/forms/input/EmailFooterInput.astro new file mode 100644 index 00000000..54e8ab1d --- /dev/null +++ b/apps/website/src/components/ui/forms/input/EmailFooterInput.astro @@ -0,0 +1,37 @@ +--- +const { + label = 'Search', + title = Astro.currentLocale === 'fr' ? "S'abonner" : 'Subscribe', + id = 'footer-input', +} = Astro.props; + +interface Props { + label?: string; + title?: string; + id?: string; +} + +const placeholder = + Astro.currentLocale === 'fr' ? 'Entrez votre email' : 'Enter your email'; +--- + +
    +
    + + +
    + + {title} + +
    diff --git a/apps/website/src/components/ui/forms/input/EmailInput.astro b/apps/website/src/components/ui/forms/input/EmailInput.astro new file mode 100644 index 00000000..fea15e72 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/EmailInput.astro @@ -0,0 +1,55 @@ +--- +const { + label = Astro.currentLocale === 'fr' ? 'Adresse e-mail' : 'Email address', + id, + errorId, +} = Astro.props; + +interface Props { + label?: string; + id: string; + errorId: string; +} +--- + +{/* Container for the label, input, and validation message */} +
    + {/* Label for the email input field */} + + {/* Label for the email input field */} +
    + {/* Email input field */} + + {/* Hidden error icon */} + +
    + {/* Validation message which is hidden by default */} + +
    diff --git a/apps/website/src/components/ui/forms/input/PasswordInput.astro b/apps/website/src/components/ui/forms/input/PasswordInput.astro new file mode 100644 index 00000000..1d5bc919 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/PasswordInput.astro @@ -0,0 +1,60 @@ +--- +const { label = 'Password', forgot, id, errorId, content } = Astro.props; + +interface Props { + label?: string; + forgot?: boolean; + id?: string; + errorId?: string; + content?: string; +} +--- + +
    +
    + + { + forgot ? ( + + ) : ( + '' + ) + } +
    +
    + + +
    + +
    diff --git a/apps/website/src/components/ui/forms/input/PhoneInput.astro b/apps/website/src/components/ui/forms/input/PhoneInput.astro new file mode 100644 index 00000000..d248595f --- /dev/null +++ b/apps/website/src/components/ui/forms/input/PhoneInput.astro @@ -0,0 +1,22 @@ +--- +const { + label = Astro.currentLocale === 'fr' ? 'Numéro de téléphone' : 'Phone Number', + id, +} = Astro.props; + +interface Props { + label?: string; + id: string; +} +--- + +
    + + +
    diff --git a/apps/website/src/components/ui/forms/input/TextAreaInput.astro b/apps/website/src/components/ui/forms/input/TextAreaInput.astro new file mode 100644 index 00000000..1908e216 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/TextAreaInput.astro @@ -0,0 +1,19 @@ +--- +const { label, id, name } = Astro.props; + +interface Props { + label: string; + name: string; + id: string; +} +--- + +
    + + +
    diff --git a/apps/website/src/components/ui/forms/input/TextInput.astro b/apps/website/src/components/ui/forms/input/TextInput.astro new file mode 100644 index 00000000..8fd21308 --- /dev/null +++ b/apps/website/src/components/ui/forms/input/TextInput.astro @@ -0,0 +1,20 @@ +--- +const { label, id, name } = Astro.props; + +interface Props { + label: string; + name: string; + id: string; +} +--- + +
    + + +
    diff --git a/apps/website/src/components/ui/icons/Icon.astro b/apps/website/src/components/ui/icons/Icon.astro new file mode 100644 index 00000000..9de58835 --- /dev/null +++ b/apps/website/src/components/ui/icons/Icon.astro @@ -0,0 +1,39 @@ +--- +import { Icons } from './icons.ts'; + +interface Path { + d: string; + class?: string; +} + +const { name } = Astro.props; + +let icon = (Icons as any)[name] || {}; + +let paths: Path[] = icon.paths || []; +--- + +{ + icon ? ( + + {icon.title} + {paths.map((path: Path) => ( + + ))} + + ) : ( + 'Icon not found' + ) +} diff --git a/apps/website/src/components/ui/icons/icons.ts b/apps/website/src/components/ui/icons/icons.ts new file mode 100644 index 00000000..f4be1853 --- /dev/null +++ b/apps/website/src/components/ui/icons/icons.ts @@ -0,0 +1,521 @@ +export const Icons = { + groups: { + paths: [ + { + d: 'm150-400 82-80-82-82-80 82 80 80Zm573-10 87-140 88 140H723Zm-243-70q-50 0-85-35t-35-85q0-51 35-85.5t85-34.5q51 0 85.5 34.5T600-600q0 50-34.5 85T480-480Zm.351-180Q455-660 437.5-642.851t-17.5 42.5Q420-575 437.351-557.5t43 17.5Q506-540 523-557.351t17-43Q540-626 522.851-643t-42.5-17ZM480-600ZM0-240v-53q0-39.464 42-63.232T150.398-380q12.158 0 23.38.5T196-377.273q-8 17.273-12 34.842-4 17.57-4 37.431v65H0Zm240 0v-65q0-65 66.5-105T480-450q108 0 174 40t66 105v65H240Zm570-140q67.5 0 108.75 23.768T960-293v53H780v-65q0-19.861-3.5-37.431Q773-360 765-377.273q11-1.727 22.171-2.227 11.172-.5 22.829-.5Zm-330.2-10Q400-390 350-366q-50 24-50 61v5h360v-6q0-36-49.5-60t-130.7-24Zm.2 90Z', + }, + ], + class: 'mt-1 h-8 w-8 shrink-0 fill-orange-400 dark:fill-orange-300', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + books: { + paths: [ + { + d: 'M343-420h225v-60H343v60Zm0-90h395v-60H343v60Zm0-90h395v-60H343v60Zm-83 400q-24 0-42-18t-18-42v-560q0-24 18-42t42-18h560q24 0 42 18t18 42v560q0 24-18 42t-42 18H260Zm0-60h560v-560H260v560ZM140-80q-24 0-42-18t-18-42v-620h60v620h620v60H140Zm120-740v560-560Z', + }, + ], + class: 'mt-1 h-8 w-8 shrink-0 fill-orange-400 dark:fill-orange-300', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + verified: { + paths: [ + { + d: 'm346-60-76-130-151-31 17-147-96-112 96-111-17-147 151-31 76-131 134 62 134-62 77 131 150 31-17 147 96 111-96 112 17 147-150 31-77 130-134-62-134 62Zm27-79 107-45 110 45 67-100 117-30-12-119 81-92-81-94 12-119-117-28-69-100-108 45-110-45-67 100-117 28 12 119-81 94 81 92-12 121 117 28 70 100Zm107-341Zm-43 133 227-225-45-41-182 180-95-99-46 45 141 140Z', + }, + ], + class: 'mt-1 h-8 w-8 shrink-0 fill-orange-400 dark:fill-orange-300', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + frame: { + paths: [ + { + d: 'M480-480q-51 0-85.5-34.5T360-600q0-50 34.5-85t85.5-35q50 0 85 35t35 85q0 51-35 85.5T480-480Zm-.351-60Q505-540 522.5-557.149t17.5-42.5Q540-625 522.649-642.5t-43-17.5Q454-660 437-642.649t-17 43Q420-574 437.149-557t42.5 17ZM240-240v-76q0-27 17.5-47.5T300-397q42-22 86.943-32.5 44.942-10.5 93-10.5Q528-440 573-429.5t87 32.5q25 13 42.5 33.5T720-316v76H240Zm240-140q-47.546 0-92.773 13T300-328v28h360v-28q-42-26-87.227-39-45.227-13-92.773-13Zm0-220Zm0 300h180-360 180ZM140-80q-24 0-42-18t-18-42v-172h60v172h172v60H140ZM80-648v-172q0-24 18-42t42-18h172v60H140v172H80ZM648-80v-60h172v-172h60v172q0 24-18 42t-42 18H648Zm172-568v-172H648v-60h172q24 0 42 18t18 42v172h-60Z', + }, + ], + class: 'mt-1 h-8 w-8 shrink-0 fill-orange-400 dark:fill-orange-300', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + tools: { + paths: [ + { + d: 'M764-80q-6 0-11-2t-10-7L501-331q-5-5-7-10t-2-11q0-6 2-11t7-10l85-85q5-5 10-7t11-2q6 0 11 2t10 7l242 242q5 5 7 10t2 11q0 6-2 11t-7 10l-85 85q-5 5-10 7t-11 2Zm0-72 43-43-200-200-43 43 200 200ZM195-80q-6 0-11.5-2T173-89l-84-84q-5-5-7-10.5T80-195q0-6 2-11t7-10l225-225h85l38-38-175-175h-57L80-779l99-99 125 125v57l175 175 130-130-67-67 56-56H485l-18-18 128-128 18 18v113l56-56 169 169q15 15 23.5 34.5T870-600q0 20-6.5 38.5T845-528l-85-85-56 56-52-52-211 211v84L216-89q-5 5-10 7t-11 2Zm0-72 200-200v-43h-43L152-195l43 43Zm0 0-43-43 22 21 21 22Zm569 0 43-43-43 43Z', + }, + ], + class: + 'mt-2 h-6 w-6 shrink-0 fill-neutral-700 hs-tab-active:fill-orange-400 dark:fill-neutral-300 dark:hs-tab-active:fill-orange-300 md:h-7 md:w-7', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + dashboard: { + paths: [ + { + d: 'M510-570v-270h330v270H510ZM120-450v-390h330v390H120Zm390 330v-390h330v390H510Zm-390 0v-270h330v270H120Zm60-390h210v-270H180v270Zm390 330h210v-270H570v270Zm0-450h210v-150H570v150ZM180-180h210v-150H180v150Zm210-330Zm180-120Zm0 180ZM390-330Z', + }, + ], + class: + 'mt-2 h-6 w-6 shrink-0 fill-neutral-700 hs-tab-active:fill-orange-400 dark:fill-neutral-300 dark:hs-tab-active:fill-orange-300 md:h-7 md:w-7', + width: 48, + height: 48, + viewBox: '0 -960 960 960', + }, + house: { + paths: [ + { + d: 'M8.25 21v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21m0 0h4.5V3.545M12.75 21h7.5V10.75M2.25 21h1.5m18 0h-18M2.25 9l4.5-1.636M18.75 3l-1.5.545m0 6.205 3 1m1.5.5-1.5-.5M6.75 7.364V3h-3v18m3-13.636 10.5-3.819', + }, + ], + class: + 'h-6 w-6 shrink-0 text-neutral-700 hs-tab-active:text-orange-400 dark:text-neutral-300 dark:hs-tab-active:text-orange-300 md:h-7 md:w-7', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + arrowUp: { + paths: [ + { + d: 'm5 12 7-7 7 7', + }, + { + d: 'M12 19V5', + }, + ], + class: 'h-5 w-5 shrink-0 text-orange-400 dark:text-orange-300', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + checkCircle: { + paths: [ + { + d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM13.707 8.293a1 1 0 00-1.414-1.414L9 10.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z', + }, + ], + class: 'h-5 w-5 shrink-0', + viewBox: '0 0 20 20', + fill: 'currentColor', + fillRule: 'evenodd', + clipRule: 'evenodd', + }, + bookmark: { + paths: [ + { + d: 'M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z', + class: + 'fill-current text-neutral-500 transition duration-300 group-hover:text-red-400 dark:group-hover:text-red-400', + }, + ], + class: 'h-6 w-6 fill-none transition duration-300', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + arrowRight: { + paths: [ + { + d: 'm9 18 6-6-6-6', + }, + ], + class: 'h-4 w-4 shrink-0 transition duration-300 group-hover:translate-x-1', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + facebook: { + paths: [ + { + d: 'M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z', + }, + ], + class: 'size-4 shrink-0 fill-current', + viewBox: '0 0 24 24', + stroke: 'currentColor', + }, + x: { + paths: [ + { + d: 'M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z', + }, + ], + class: 'size-4 shrink-0 fill-current', + viewBox: '0 0 24 24', + stroke: 'currentColor', + }, + linkedIn: { + paths: [ + { + d: 'M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z', + }, + ], + class: 'size-4 shrink-0 fill-current', + viewBox: '0 0 24 24', + stroke: 'currentColor', + }, + share: { + paths: [ + { + d: 'M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z', + }, + ], + class: 'h-4 w-4 group-hover:text-neutral-700', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + github: { + paths: [ + { + d: 'M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z', + }, + ], + class: + 'w-4.5 h-4.5 transition shrink-0 text-neutral-700 duration-300 group-hover:-translate-y-1', + width: 16, + height: 16, + viewBox: '0 0 16 16', + fill: 'currentColor', + }, + arrowRightStatic: { + paths: [ + { + d: 'm9 18 6-6-6-6', + }, + ], + class: 'size-4 shrink-0', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + openInNew: { + paths: [ + { + d: 'm4.5 19.5 15-15m0 0H8.25m11.25 0v11.25', + }, + ], + class: 'ml-0.5 w-3 h-3 md:w-4 md:h-4 inline pb-0.5', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '3', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + accordionNotActive: { + paths: [ + { + d: 'm6 9 6 6 6-6', + }, + ], + class: + 'block h-5 w-5 shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:hidden dark:text-neutral-400', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + accordionActive: { + paths: [ + { + d: 'm18 15-6-6-6 6', + }, + ], + class: + 'hidden h-5 w-5 shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:block dark:text-neutral-400', + width: 24, + height: 24, + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + xFooter: { + paths: [ + { + d: 'M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z', + }, + ], + class: + 'h-4 w-4 shrink-0 fill-current text-neutral-700 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'currentColor', + title: 'Twitter', + }, + facebookFooter: { + paths: [ + { + d: 'M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z', + }, + ], + class: + 'h-4 w-4 shrink-0 fill-current text-neutral-700 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'currentColor', + title: 'Facebook', + }, + githubFooter: { + paths: [ + { + d: 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12', + }, + ], + class: + 'h-4 w-4 shrink-0 fill-current text-neutral-700 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'currentColor', + title: 'GitHub', + }, + googleFooter: { + paths: [ + { + d: 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z', + }, + ], + class: + 'h-4 w-4 shrink-0 fill-current text-neutral-700 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'currentColor', + title: 'Google', + }, + slackFooter: { + paths: [ + { + d: 'M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z', + }, + ], + class: + 'h-4 w-4 shrink-0 fill-current text-neutral-700 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'currentColor', + title: 'Slack', + }, + quotation: { + paths: [ + { + d: 'M7.39762 10.3C7.39762 11.0733 7.14888 11.7 6.6514 12.18C6.15392 12.6333 5.52552 12.86 4.76621 12.86C3.84979 12.86 3.09047 12.5533 2.48825 11.94C1.91222 11.3266 1.62421 10.4467 1.62421 9.29999C1.62421 8.07332 1.96459 6.87332 2.64535 5.69999C3.35231 4.49999 4.33418 3.55332 5.59098 2.85999L6.4943 4.25999C5.81354 4.73999 5.26369 5.27332 4.84476 5.85999C4.45201 6.44666 4.19017 7.12666 4.05926 7.89999C4.29491 7.79332 4.56983 7.73999 4.88403 7.73999C5.61716 7.73999 6.21938 7.97999 6.69067 8.45999C7.16197 8.93999 7.39762 9.55333 7.39762 10.3ZM14.6242 10.3C14.6242 11.0733 14.3755 11.7 13.878 12.18C13.3805 12.6333 12.7521 12.86 11.9928 12.86C11.0764 12.86 10.3171 12.5533 9.71484 11.94C9.13881 11.3266 8.85079 10.4467 8.85079 9.29999C8.85079 8.07332 9.19117 6.87332 9.87194 5.69999C10.5789 4.49999 11.5608 3.55332 12.8176 2.85999L13.7209 4.25999C13.0401 4.73999 12.4903 5.27332 12.0713 5.85999C11.6786 6.44666 11.4168 7.12666 11.2858 7.89999C11.5215 7.79332 11.7964 7.73999 12.1106 7.73999C12.8437 7.73999 13.446 7.97999 13.9173 8.45999C14.3886 8.93999 14.6242 9.55333 14.6242 10.3Z', + }, + ], + class: + 'absolute start-0 top-0 h-16 w-16 -translate-x-6 -translate-y-8 transform text-neutral-300 dark:text-neutral-700', + width: 16, + height: 16, + viewBox: '0 0 16 16', + fill: 'currentColor', + }, + question: { + paths: [ + { + d: 'M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z', + }, + ], + class: 'mt-1.5 h-6 w-6 shrink-0 text-neutral-600 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + chatBubble: { + paths: [ + { + d: 'M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 0 1-.825-.242m9.345-8.334a2.126 2.126 0 0 0-.476-.095 48.64 48.64 0 0 0-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0 0 11.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155', + }, + ], + class: 'mt-1.5 h-6 w-6 shrink-0 text-neutral-600 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + mapPin: { + paths: [ + { + d: 'M15 10.5a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z', + }, + { + d: 'M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1 1 15 0Z', + }, + ], + class: 'mt-1.5 h-6 w-6 shrink-0 text-neutral-600 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + envelopeOpen: { + paths: [ + { + d: 'M21.75 9v.906a2.25 2.25 0 0 1-1.183 1.981l-6.478 3.488M2.25 9v.906a2.25 2.25 0 0 0 1.183 1.981l6.478 3.488m8.839 2.51-4.66-2.51m0 0-1.023-.55a2.25 2.25 0 0 0-2.134 0l-1.022.55m0 0-4.661 2.51m16.5 1.615a2.25 2.25 0 0 1-2.25 2.25h-15a2.25 2.25 0 0 1-2.25-2.25V8.844a2.25 2.25 0 0 1 1.183-1.981l7.5-4.039a2.25 2.25 0 0 1 2.134 0l7.5 4.039a2.25 2.25 0 0 1 1.183 1.98V19.5Z', + }, + ], + class: 'mt-1.5 h-6 w-6 shrink-0 text-neutral-600 dark:text-neutral-400', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + earth: { + paths: [ + { + d: 'm20.893 13.393-1.135-1.135a2.252 2.252 0 0 1-.421-.585l-1.08-2.16a.414.414 0 0 0-.663-.107.827.827 0 0 1-.812.21l-1.273-.363a.89.89 0 0 0-.738 1.595l.587.39c.59.395.674 1.23.172 1.732l-.2.2c-.212.212-.33.498-.33.796v.41c0 .409-.11.809-.32 1.158l-1.315 2.191a2.11 2.11 0 0 1-1.81 1.025 1.055 1.055 0 0 1-1.055-1.055v-1.172c0-.92-.56-1.747-1.414-2.089l-.655-.261a2.25 2.25 0 0 1-1.383-2.46l.007-.042a2.25 2.25 0 0 1 .29-.787l.09-.15a2.25 2.25 0 0 1 2.37-1.048l1.178.236a1.125 1.125 0 0 0 1.302-.795l.208-.73a1.125 1.125 0 0 0-.578-1.315l-.665-.332-.091.091a2.25 2.25 0 0 1-1.591.659h-.18c-.249 0-.487.1-.662.274a.931.931 0 0 1-1.458-1.137l1.411-2.353a2.25 2.25 0 0 0 .286-.76m11.928 9.869A9 9 0 0 0 8.965 3.525m11.928 9.868A9 9 0 1 1 8.965 3.525', + }, + ], + class: 'w-4 h-4 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + guides: { + paths: [ + { + d: 'M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + puzzle: { + paths: [ + { + d: 'M2.25 7.125C2.25 6.504 2.754 6 3.375 6h6c.621 0 1.125.504 1.125 1.125v3.75c0 .621-.504 1.125-1.125 1.125h-6a1.125 1.125 0 0 1-1.125-1.125v-3.75ZM14.25 8.625c0-.621.504-1.125 1.125-1.125h5.25c.621 0 1.125.504 1.125 1.125v8.25c0 .621-.504 1.125-1.125 1.125h-5.25a1.125 1.125 0 0 1-1.125-1.125v-8.25ZM3.75 16.125c0-.621.504-1.125 1.125-1.125h5.25c.621 0 1.125.504 1.125 1.125v2.25c0 .621-.504 1.125-1.125 1.125h-5.25a1.125 1.125 0 0 1-1.125-1.125v-2.25Z', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + rocket: { + paths: [ + { + d: 'M15.59 14.37a6 6 0 0 1-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 0 0 6.16-12.12A14.98 14.98 0 0 0 9.631 8.41m5.96 5.96a14.926 14.926 0 0 1-5.841 2.58m-.119-8.54a6 6 0 0 0-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 0 0-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 0 1-2.448-2.448 14.9 14.9 0 0 1 .06-.312m-2.24 2.39a4.493 4.493 0 0 0-1.757 4.306 4.493 4.493 0 0 0 4.306-1.758M16.5 9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + hammer: { + paths: [ + { + d: 'M11.42 15.17 17.25 21A2.652 2.652 0 0 0 21 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 1 1-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 0 0 4.486-6.336l-3.276 3.277a3.004 3.004 0 0 1-2.25-2.25l3.276-3.276a4.5 4.5 0 0 0-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437 1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008Z', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + sparks: { + paths: [ + { + d: 'M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + community: { + paths: [ + { + d: 'M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z', + }, + ], + class: 'mt-1 size-5 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, + chevronDown: { + paths: [ + { + d: 'm19.5 8.25-7.5 7.5-7.5-7.5', + }, + ], + class: 'ms-2 size-4 shrink-0', + viewBox: '0 0 24 24', + fill: 'none', + strokeWidth: '1.5', + strokeLinecap: 'round', + strokeLinejoin: 'round', + stroke: 'currentColor', + }, +}; diff --git a/apps/website/src/components/ui/links/FooterSocialLink.astro b/apps/website/src/components/ui/links/FooterSocialLink.astro new file mode 100644 index 00000000..973a78b1 --- /dev/null +++ b/apps/website/src/components/ui/links/FooterSocialLink.astro @@ -0,0 +1,12 @@ +--- +const { url } = Astro.props; +interface Props { + url: string; +} +const linkClass = + 'inline-flex h-10 w-10 items-center justify-center gap-x-2 rounded-lg border border-transparent text-sm font-bold text-neutral-700 outline-hidden ring-zinc-500 hover:bg-neutral-500/10 focus:outline-hidden focus-visible:ring-3 focus-visible:ring-zinc-500 dark:ring-zinc-200 dark:hover:bg-neutral-50/10'; +--- + + + + diff --git a/apps/website/src/components/ui/links/NavLink.astro b/apps/website/src/components/ui/links/NavLink.astro new file mode 100644 index 00000000..41857d1d --- /dev/null +++ b/apps/website/src/components/ui/links/NavLink.astro @@ -0,0 +1,53 @@ +--- +// Destructure the properties from Astro.props +const { url, name } = Astro.props; + +// Define TypeScript interface for the properties +interface Props { + url: string; + name: string; +} +--- + +{ + /* +Re-usable link component for navigation bar. Highlights the active link +by comparing the current URL with the href of each link. +We assign an ID matching the URL for easy reference in our script. +If URL is '/' (home page), assign ID as 'home' +*/ +} + + {name} + + + diff --git a/apps/website/src/components/ui/starlight/Head.astro b/apps/website/src/components/ui/starlight/Head.astro new file mode 100644 index 00000000..c53ed163 --- /dev/null +++ b/apps/website/src/components/ui/starlight/Head.astro @@ -0,0 +1,35 @@ +--- +import type { Props } from '@astrojs/starlight/props'; +import StarlightHead from '@astrojs/starlight/components/Head.astro'; +import VtbotStarlight from 'astro-vtbot/components/starlight/Base.astro'; +--- + + + + + + + + + diff --git a/apps/website/src/components/ui/starlight/MobileMenuFooter.astro b/apps/website/src/components/ui/starlight/MobileMenuFooter.astro new file mode 100644 index 00000000..5e20847d --- /dev/null +++ b/apps/website/src/components/ui/starlight/MobileMenuFooter.astro @@ -0,0 +1,34 @@ +--- +import LanguageSelect from '@astrojs/starlight/components/LanguageSelect.astro'; +import SocialIcons from '@astrojs/starlight/components/SocialIcons.astro'; +import ThemeSelect from '@components/ui/starlight/ThemeSelectMobile.astro'; +import type { Props } from '@astrojs/starlight/props'; +--- + +
    + + + +
    + + diff --git a/apps/website/src/components/ui/starlight/SiteTitle.astro b/apps/website/src/components/ui/starlight/SiteTitle.astro new file mode 100644 index 00000000..afad17d8 --- /dev/null +++ b/apps/website/src/components/ui/starlight/SiteTitle.astro @@ -0,0 +1,33 @@ +--- +const docs = '/welcome-to-docs/'; +--- + + + + + + + diff --git a/apps/website/src/components/ui/starlight/ThemeSelect.astro b/apps/website/src/components/ui/starlight/ThemeSelect.astro new file mode 100644 index 00000000..9cbbc0a3 --- /dev/null +++ b/apps/website/src/components/ui/starlight/ThemeSelect.astro @@ -0,0 +1,106 @@ +{/* Dark Theme Toggle Button */} + + +{/* Light Theme Toggle Button */} + + + diff --git a/apps/website/src/components/ui/starlight/ThemeSelectMobile.astro b/apps/website/src/components/ui/starlight/ThemeSelectMobile.astro new file mode 100644 index 00000000..2d4adcf1 --- /dev/null +++ b/apps/website/src/components/ui/starlight/ThemeSelectMobile.astro @@ -0,0 +1,104 @@ +{/* Dark Theme Toggle Button */} + + +{/* Light Theme Toggle Button */} + + + diff --git a/apps/website/src/components/ui/stars/FullStar.astro b/apps/website/src/components/ui/stars/FullStar.astro new file mode 100644 index 00000000..43034437 --- /dev/null +++ b/apps/website/src/components/ui/stars/FullStar.astro @@ -0,0 +1,11 @@ + + + diff --git a/apps/website/src/components/ui/stars/HalfStar.astro b/apps/website/src/components/ui/stars/HalfStar.astro new file mode 100644 index 00000000..7b9c8040 --- /dev/null +++ b/apps/website/src/components/ui/stars/HalfStar.astro @@ -0,0 +1,14 @@ + + + + diff --git a/apps/website/src/content.config.ts b/apps/website/src/content.config.ts index 9f1d23c3..0c7eafc3 100644 --- a/apps/website/src/content.config.ts +++ b/apps/website/src/content.config.ts @@ -1,36 +1,18 @@ +import { defineCollection } from 'astro:content'; +import { z } from 'astro/zod'; +import { docsLoader } from '@astrojs/starlight/loaders'; +import { docsSchema } from '@astrojs/starlight/schema'; import { glob } from 'astro/loaders'; -import { defineCollection, z } from 'astro:content'; -const baseContentSchema = z.object({ - title: z.string(), - description: z.string(), - publishedAt: z.coerce.date().optional(), -}); - -const changelogSchema = baseContentSchema.extend({ - draft: z.boolean().default(false), - publishedAt: z.coerce.date(), -}); - -const optionalContentSchema = baseContentSchema.extend({ - draft: z.boolean().default(false), -}); - -const editorialInventorySchema = baseContentSchema.extend({ - draft: z.boolean().default(true), -}); +const passthroughCollection = (base: string) => + defineCollection({ + loader: glob({ pattern: '**/[^_]*.{md,mdx}', base }), + schema: z.any(), + }); export const collections = { - articles: defineCollection({ - loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/articles' }), - schema: editorialInventorySchema, - }), - changelog: defineCollection({ - loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/changelog' }), - schema: changelogSchema, - }), - resources: defineCollection({ - loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/resources' }), - schema: optionalContentSchema, - }), + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), + products: passthroughCollection('./src/content/products'), + blog: passthroughCollection('./src/content/blog'), + insights: passthroughCollection('./src/content/insights'), }; diff --git a/apps/website/src/content/blog/tenantial-placeholder.md b/apps/website/src/content/blog/tenantial-placeholder.md new file mode 100644 index 00000000..0e4848fd --- /dev/null +++ b/apps/website/src/content/blog/tenantial-placeholder.md @@ -0,0 +1,14 @@ +--- +title: Tenantial editorial placeholder +description: Hidden placeholder content for the retained editorial collection. +pubDate: 2026-05-20 +contents: [] +author: Tenantial +authorImage: ../../images/blog/anna.avif +authorImageAlt: Static editorial avatar +cardImage: ../../images/blog/post-1.avif +cardImageAlt: Static editorial preview +readTime: 1 +--- + +This collection is retained for the vendored website foundation, but the public route redirects until editorial content is ready. diff --git a/apps/website/src/content/changelog/2026-04-19-initial-core-pages.md b/apps/website/src/content/changelog/2026-04-19-initial-core-pages.md deleted file mode 100644 index 8177e03a..00000000 --- a/apps/website/src/content/changelog/2026-04-19-initial-core-pages.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Initial core pages and IA realignment -description: Published the canonical Product, Trust, Changelog, Contact, Privacy, and Imprint route model, added the new Trust and Changelog surfaces, and demoted legacy supporting routes out of primary navigation. -publishedAt: 2026-04-19 -draft: false ---- - -This update establishes the first deliberate public route set for the website. - -- Product, Trust, Changelog, and Contact now define the core buyer journey. -- Privacy and Imprint remain part of the canonical legal baseline. -- Solutions, Integrations, Legal, and Terms stay published as retained secondary surfaces instead of top-level core routes. -- The legacy `/security-trust` path now resolves to the canonical `/trust` surface. diff --git a/apps/website/src/content/docs/guides/first-project-checklist.mdx b/apps/website/src/content/docs/guides/first-project-checklist.mdx new file mode 100644 index 00000000..4244ed70 --- /dev/null +++ b/apps/website/src/content/docs/guides/first-project-checklist.mdx @@ -0,0 +1,15 @@ +--- +title: Evaluation Checklist +description: A conservative checklist for early Tenantial evaluation. +sidebar: + label: Evaluation Checklist + order: 3 +--- + +Use this checklist before a product walkthrough: + +- Confirm which Microsoft tenant workflows are in scope. +- Separate read-only review needs from any future write or restore needs. +- Identify audit and approval expectations. +- Plan staging validation before production rollout. +- Keep private tenant data out of public website communication. diff --git a/apps/website/src/content/docs/guides/getting-started.mdx b/apps/website/src/content/docs/guides/getting-started.mdx new file mode 100644 index 00000000..cf7cadf1 --- /dev/null +++ b/apps/website/src/content/docs/guides/getting-started.mdx @@ -0,0 +1,18 @@ +--- +title: Getting Started +description: How evaluators should approach a Tenantial walkthrough. +sidebar: + label: Getting Started + order: 2 +--- + +Start with a scoped conversation about the tenant governance problem you want to solve. + +Useful preparation: + +- Identify the Microsoft tenant administration workflows that need review. +- List which policy families, backup flows, or restore planning scenarios matter first. +- Decide who needs to participate in evidence review and approval. +- Avoid sending private tenant exports or credentials through public website contact paths. + +Tenantial walkthroughs should stay focused on review clarity, least-privilege rollout planning, and staging validation before production use. diff --git a/apps/website/src/content/docs/guides/intro.mdx b/apps/website/src/content/docs/guides/intro.mdx new file mode 100644 index 00000000..371dce1d --- /dev/null +++ b/apps/website/src/content/docs/guides/intro.mdx @@ -0,0 +1,18 @@ +--- +title: Introduction to Tenantial +description: Public introduction to Tenantial's evidence-first Microsoft tenant governance model. +sidebar: + label: Introduction + order: 1 +--- + +Tenantial is positioned around careful Microsoft tenant governance. Public materials focus on observed inventory, immutable policy snapshots, drift review, findings, exceptions, audit context, and defensive restore planning. + +The website documentation is intentionally public and static. It does not expose live tenant data, operational evidence, private support material, credentials, or connected Microsoft accounts. + +## What to review first + +- How policy evidence is collected and normalized for review. +- How snapshots support comparison and restore planning. +- How findings and exceptions make decisions attributable. +- How restore is treated as preview-first work. diff --git a/apps/website/src/content/docs/platform/evidence-review.mdx b/apps/website/src/content/docs/platform/evidence-review.mdx new file mode 100644 index 00000000..216ca749 --- /dev/null +++ b/apps/website/src/content/docs/platform/evidence-review.mdx @@ -0,0 +1,17 @@ +--- +title: Evidence Review +description: Public platform note for Tenantial evidence review workflows. +sidebar: + label: Evidence Review + order: 1 +--- + +Evidence review is the public framing for Tenantial's product direction. + +The model is intentionally cautious: + +- Inventory is treated as observed state. +- Snapshots are explicit records for comparison and planning. +- Drift and findings become review work. +- Exceptions and audit notes keep decisions attributable. +- Restore is planned through preview, validation, selective scope, and explicit confirmation. diff --git a/apps/website/src/content/docs/welcome-to-docs.mdx b/apps/website/src/content/docs/welcome-to-docs.mdx new file mode 100644 index 00000000..57cf6773 --- /dev/null +++ b/apps/website/src/content/docs/welcome-to-docs.mdx @@ -0,0 +1,30 @@ +--- +title: Tenantial Docs +head: + - tag: title + content: Tenantial Docs +description: Public notes for understanding Tenantial's evidence-first Microsoft tenant governance model. +editUrl: false +lastUpdated: false +next: false +hero: + title: Tenantial documentation + tagline: Public notes for evidence review, snapshot discipline, drift review, and cautious restore planning. + actions: + - text: Get started + icon: right-arrow + variant: primary + link: /guides/getting-started/ +--- +import "@styles/starlight_main.css"; +import { Card, CardGrid } from '@astrojs/starlight/components'; + + + + Understand the public product model before planning a rollout conversation. + + + + Review how Tenantial frames inventory evidence, snapshots, findings, and restore planning. + + diff --git a/apps/website/src/content/insights/tenantial-placeholder.md b/apps/website/src/content/insights/tenantial-placeholder.md new file mode 100644 index 00000000..2785631a --- /dev/null +++ b/apps/website/src/content/insights/tenantial-placeholder.md @@ -0,0 +1,8 @@ +--- +title: Tenantial insight placeholder +description: Hidden placeholder content for the retained insight collection. +cardImage: ../../images/insights/insight-1.avif +cardImageAlt: Static insight preview +--- + +This collection is retained for the vendored website foundation, but the public route redirects until insight content is ready. diff --git a/apps/website/src/content/pages/changelog.ts b/apps/website/src/content/pages/changelog.ts deleted file mode 100644 index 524e59c0..00000000 --- a/apps/website/src/content/pages/changelog.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { HeroContent, PageSeo } from '@/types/site'; - -export const changelogSeo: PageSeo = { - title: 'Tenantial | Changelog', - description: - 'Tenantial uses a dedicated changelog to show dated public progress without pretending a broader editorial or resources program is already live.', - path: '/changelog', -}; - -export const changelogHero: HeroContent = { - eyebrow: 'Visible product progress', - title: 'Visible product progress through dated updates, not placeholder routes.', - description: - 'The changelog gives returning visitors one explicit place to verify progress. It should be concrete, dated, and connected to the product and contact path instead of acting like a placeholder blog.', - primaryCta: { - href: '/contact', - label: 'Start the working session', - }, - secondaryCta: { - href: '/product', - label: 'See the product model', - variant: 'secondary', - }, - highlights: [ - 'Dated updates beat vague progress claims.', - 'Resources remain hidden until substantive content exists.', - 'The changelog supports the product read instead of replacing it.', - ], -}; diff --git a/apps/website/src/content/pages/contact.ts b/apps/website/src/content/pages/contact.ts deleted file mode 100644 index ac787c72..00000000 --- a/apps/website/src/content/pages/contact.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { HeroContent, LegalSection, PageSeo } from '@/types/site'; - -export const contactSeo: PageSeo = { - title: 'Tenantial | Contact', - description: - 'Tenantial uses one clear contact path for serious product, trust, and rollout conversations instead of splitting first contact across vague demo flows.', - path: '/contact', -}; - -export const contactHero: HeroContent = { - eyebrow: 'Primary conversion route', - title: 'Start the contact path with context instead of a generic demo request.', - description: - 'The contact path should help serious buyers explain who they are, what governance questions they are trying to solve, and what kind of follow-up would actually be useful.', - primaryCta: { - href: 'mailto:hello@tenantial.example?subject=Tenantial%20working%20session', - label: 'Email the Tenantial team', - variant: 'primary', - }, - secondaryCta: { - href: '/trust', - label: 'Review the trust posture', - variant: 'secondary', - }, - highlights: [ - 'Use the page to qualify the conversation, not to force a form funnel.', - 'Keep trust, privacy, terms, and imprint visible before anyone shares evaluation details.', - 'The route stays obvious from Home, Product, Trust, and Changelog.', - ], -}; - -export const contactTopics = [ - 'Evaluation of backup, restore, or version-governance workflows for Intune and Microsoft tenant operations.', - 'Questions about MSP fit, customer-facing evidence, or multi-tenant operational discipline.', - 'Internal enterprise review of change history, drift visibility, evidence collection, or restore posture.', -]; - -export const contactPrompts = [ - { - title: 'Good first conversation', - description: - 'Explain the current operating model, where version history breaks down today, and which changes feel hardest to review or restore safely.', - }, - { - title: 'Useful context to share', - description: - 'Team shape, tenant count, policy complexity, change frequency, and whether the first concern is restore safety, auditability, or review evidence.', - }, -]; - -export const contactPreview = { - message: - 'We operate Microsoft tenant governance across multiple environments and want to understand how Tenantial approaches version history, safer restore flows, drift visibility, and review evidence.', - topic: 'Environment and operating model summary', -}; - -export const contactLegalSections: LegalSection[] = [ - { - title: 'Before you reach out', - body: [ - 'Use the legal links below before sharing evaluation details so the contact path stays trustworthy and unsurprising.', - 'Trust, privacy, terms, imprint, and the retained legal hub remain reachable from the contact flow and the global footer.', - ], - }, -]; diff --git a/apps/website/src/content/pages/home.ts b/apps/website/src/content/pages/home.ts deleted file mode 100644 index 53538dc5..00000000 --- a/apps/website/src/content/pages/home.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { - CtaLink, - FeatureItemContent, - HeroContent, - PageSeo, - TrustPrincipleContent, -} from '@/types/site'; - -export const homeSeo: PageSeo = { - title: 'Tenantial - Evidence-first governance for Microsoft tenants', - description: - 'Tenantial helps Microsoft tenant teams govern backup, restore, drift detection, snapshot-backed audit context, verifiable evidence, and structured governance reviews from one evidence-first surface.', - ogTitle: 'Evidence-first governance for Microsoft tenants.', - ogDescription: - 'Evidence-oriented restore discipline, drift detection, and governance review workflows for Microsoft tenants without unsupported proof claims.', - path: '/', -}; - -export const homeHero: HeroContent = { - eyebrow: 'Governance that earns trust', - title: 'Evidence-first governance for Microsoft tenants.', - description: - 'Backup and restore with confidence. Detect drift before it becomes audit work. Preserve snapshot history and review context for governance conversations that need evidence.', - primaryCta: { - href: '/contact', - label: 'Book a demo', - }, - secondaryCta: { - href: '/platform', - label: 'Explore the platform', - variant: 'secondary', - }, - trustSubclaims: [ - 'Built for Microsoft 365 and Azure AD', - 'Snapshot-first history with review context.', - 'Designed for audit-ready workflows.', - ], -}; - -export const homeTrustBar: TrustPrincipleContent[] = [ - { - title: 'Microsoft tenant focused', - description: 'Built around the governance surfaces Microsoft tenant teams already need to inspect.', - }, - { - title: 'Evidence-oriented workflows', - description: 'Backup, drift, restore, and review context stay connected to the decision trail.', - }, - { - title: 'Designed for audit review', - description: 'Claims stay grounded in reviewable evidence rather than unverified certification language.', - }, - { - title: 'Operator-led governance', - description: 'High-risk actions stay framed by preview, confirmation, and explicit accountability.', - }, -]; - -export const homeFeaturePillars: FeatureItemContent[] = [ - { - title: 'Backup', - description: 'Preserve full Microsoft tenant configuration snapshots so recovery starts from known evidence.', - icon: 'archive', - meta: 'Snapshot record', - }, - { - title: 'Restore', - description: 'Preview scope, assignments, and conflicts before an operator commits to a restore path.', - icon: 'refresh', - meta: 'Dry-run first', - }, - { - title: 'Drift Detection', - description: 'Surface meaningful configuration change so review work starts before drift becomes incident work.', - icon: 'git-branch', - meta: 'Review required', - }, - { - title: 'Evidence', - description: 'Keep screenshots, snapshots, findings, and review notes attached to the governance decision.', - icon: 'file-check', - meta: 'Decision context', - }, - { - title: 'Audit Trail', - description: 'Show who changed, reviewed, backed up, or restored tenant configuration with clear timestamps.', - icon: 'clipboard', - meta: 'Traceable activity', - }, - { - title: 'Governance Reviews', - description: 'Move structured tenant reviews from memory and exports into a repeatable operating rhythm.', - icon: 'shield', - meta: 'Review cadence', - }, -]; - -export const homeCtaSection = { - eyebrow: 'Next step', - title: 'Build tenant governance on evidence, not assumptions.', - description: - 'Use a focused walkthrough to map Tenantial against your Microsoft tenant backup, restore, drift, evidence, and review workflows.', - primary: { - href: '/contact', - label: 'Book a demo', - } as CtaLink, - secondary: { - href: '/platform', - label: 'Explore the platform', - variant: 'secondary', - } as CtaLink, -}; diff --git a/apps/website/src/content/pages/imprint.ts b/apps/website/src/content/pages/imprint.ts deleted file mode 100644 index 2ff3bad8..00000000 --- a/apps/website/src/content/pages/imprint.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { HeroContent, LegalSection, PageSeo } from '@/types/site'; - -export const imprintSeo: PageSeo = { - title: 'Tenantial | Imprint', - description: - 'Tenantial uses the Imprint route as the canonical public legal notice and publisher baseline for the website.', - path: '/imprint', -}; - -export const imprintHero: HeroContent = { - eyebrow: 'Canonical legal notice', - title: 'Imprint and public legal notice baseline for the Tenantial website.', - description: - 'This route is the canonical public notice surface for publisher identity and jurisdiction-specific disclosure details. During controlled evaluation, it also makes clear which launch-ready fields still need to be finalized before broader publication.', - primaryCta: { - href: '/contact', - label: 'Return to contact', - }, - secondaryCta: { - href: '/privacy', - label: 'Review privacy', - variant: 'secondary', - }, - highlights: [ - 'Imprint is the canonical notice route, not a footer afterthought.', - 'The legal hub remains secondary while this route carries the notice baseline.', - 'Controlled-evaluation gaps should stay explicit instead of being hidden.', - ], -}; - -export const imprintSections: LegalSection[] = [ - { - title: 'Current publication status', - body: [ - 'Tenantial is still tightening its launch-ready publisher and jurisdiction details for the broader public website.', - 'Until those fields are finalized, this route makes the intended legal-notice location explicit so the public IA stays honest about where the canonical notice belongs.', - ], - bullets: [ - 'Publisher identity, registration details, and jurisdiction-specific notices should publish here before broad public launch.', - 'Privacy, Terms, and the retained Legal route stay linked so the public legal baseline remains coherent.', - ], - }, - { - title: 'Questions in the meantime', - body: [ - 'If you need current operator or publication details during controlled evaluation, use the contact path and state the trust, legal, or procurement question you need answered.', - 'The website should update this route before or at the same time as any material change to the published notice baseline.', - ], - }, -]; diff --git a/apps/website/src/content/pages/integrations.ts b/apps/website/src/content/pages/integrations.ts deleted file mode 100644 index 9bb0eaf8..00000000 --- a/apps/website/src/content/pages/integrations.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { - FeatureItemContent, - HeroContent, - IntegrationEntry, - PageSeo, -} from '@/types/site'; - -export const integrationsSeo: PageSeo = { - title: 'Tenantial | Integrations', - description: - 'Tenantial keeps ecosystem-fit detail available as a supporting page without pretending integrations belong in the primary navigation.', - path: '/integrations', -}; - -export const integrationsHero: HeroContent = { - eyebrow: 'Retained supporting page', - title: 'Keep ecosystem fit detail visible without pretending it is the first thing every buyer needs.', - description: - 'This page shows the real systems Tenantial is built around, the workflows it expects to support, and the deliberate boundaries where speculative integration language would create more noise than trust.', - primaryCta: { - href: '/contact', - label: 'Plan the working session', - }, - secondaryCta: { - href: '/product', - label: 'See the product model', - variant: 'secondary', - }, - highlights: [ - 'Microsoft-first and governance-led.', - 'Real direction only, no catalog-padding.', - 'Explains fit without implying runtime coupling to the public site.', - ], -}; - -export const integrationEntries: IntegrationEntry[] = [ - { - category: 'Microsoft core', - name: 'Microsoft Graph', - summary: - 'Graph remains the primary contract path for inventory, history, and restore-oriented product behavior in the platform.', - note: 'Core product contract', - }, - { - category: 'Identity', - name: 'Entra ID', - summary: - 'Identity context matters where tenant change, privileged access, or governance reviews intersect with Microsoft tenant administration.', - note: 'Operational context', - }, - { - category: 'Endpoint', - name: 'Intune', - summary: - 'Intune configuration state is central to the current product story, especially for version history, backup, restore, and drift visibility.', - note: 'Current release truth', - }, - { - category: 'Evidence', - name: 'Review & evidence workflows', - summary: - 'Exports, review packs, and evidence-linked conversations should remain grounded in the actual tenant object and its change history.', - note: 'Governance workflow fit', - }, -]; - -export const integrationRules: FeatureItemContent[] = [ - { - eyebrow: 'Direction', - title: 'Integrations should reinforce the governance model.', - description: - 'The page is not a marketplace list. It should show which systems matter because they change the product workflow, evidence story, or operator context.', - }, - { - eyebrow: 'Boundaries', - title: 'Do not imply shared public-site runtime dependencies.', - description: - 'The website stays static and independent even while the product story references Graph, Intune, and Microsoft tenant governance flows.', - }, - { - eyebrow: 'Credibility', - title: 'Speculative wishlist entries reduce trust instead of creating momentum.', - description: - 'The public integrations page should stay shorter and sharper than a catalog full of future ideas that are not relevant to launch truth.', - }, -]; diff --git a/apps/website/src/content/pages/legal.ts b/apps/website/src/content/pages/legal.ts deleted file mode 100644 index 5f493e7d..00000000 --- a/apps/website/src/content/pages/legal.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { HeroContent, LegalSection, PageSeo } from '@/types/site'; - -export const legalSeo: PageSeo = { - title: 'Tenantial | Legal', - description: - 'The Tenantial legal baseline keeps privacy, terms, imprint, and trust routing accessible without promoting the legal hub into the primary navigation.', - path: '/legal', -}; - -export const legalHero: HeroContent = { - eyebrow: 'Retained legal surface', - title: 'Legal access should stay one click away from the trust and contact path.', - description: - 'The legal hub keeps privacy, website terms, imprint details, and trust routing discoverable from the footer and the conversion flow so visitors do not have to guess where those basics live.', - primaryCta: { - href: '/imprint', - label: 'Imprint', - }, - secondaryCta: { - href: '/trust', - label: 'Trust', - variant: 'secondary', - }, - highlights: [ - 'Public legal basics stay reachable before a visitor shares evaluation context.', - 'The site separates website disclosures from future product-commercial paperwork.', - 'Imprint remains the canonical notice surface while this hub stays a secondary index.', - ], -}; - -export const legalNoticeSections: LegalSection[] = [ - { - title: 'Why this route still exists', - body: [ - 'This retained legal hub exists so visitors can still find the legal baseline quickly while the canonical notice itself lives on Imprint and the core trust story lives on Trust.', - 'During controlled evaluation, legal and privacy inquiries can be routed through the public contact path while launch-ready publisher details continue to tighten.', - ], - bullets: [ - 'Trust stays top-level visible in the header, not buried inside legal pages.', - 'Privacy, Terms, and Imprint remain directly reachable from the footer.', - 'The legal hub stays published without becoming part of the initial core navigation.', - ], - }, -]; diff --git a/apps/website/src/content/pages/platform.ts b/apps/website/src/content/pages/platform.ts deleted file mode 100644 index d089f40c..00000000 --- a/apps/website/src/content/pages/platform.ts +++ /dev/null @@ -1,304 +0,0 @@ -import type { CtaLink, FeatureItemContent, HeroContent, PageSeo } from '@/types/site'; - -export interface GovernanceLoopItem { - description: string; - label: string; - tone?: 'default' | 'focus' | 'source'; -} - -export interface OperatingModelStep { - badge: string; - description: string; - icon: string; - label: string; -} - -export interface PlatformBoundaryContent { - description: string; - headline: string; - items: string[]; -} - -export interface PlatformCapabilityPrimary { - ctaLabel: string; - description: string; - icon: string; - proofPoints: string[]; - title: string; -} - -export interface PlatformHeroTrustSignal { - icon: string; - label: string; -} - -export interface PlatformWorkflowContent { - audience: string; - description: string; - icon: string; -} - -export interface TruthLayerContent { - description: string; - question: string; - title: string; -} - -export const platformSeo: PageSeo = { - title: 'Tenantial Platform | Evidence-first governance for Microsoft tenants', - description: - 'Tenantial Platform connects backup, restore, drift detection, findings, evidence, audit trails, exceptions, and reviews for Microsoft tenant governance.', - path: '/platform', -}; - -export const platformHero: HeroContent = { - eyebrow: 'TENANTIAL PLATFORM', - title: 'Govern Microsoft tenants through evidence, drift context, and reviewable decisions.', - description: - 'Tenantial continuously maps Microsoft tenant configuration into reviewable records, so backup records, configuration drift, findings, evidence, audit trails, and structured reviews stay connected.', - primaryCta: { - href: '/contact', - label: 'Book a demo', - }, - secondaryCta: { - href: '#governance-loop', - label: 'See the governance loop', - variant: 'secondary', - }, -}; - -export const platformHeroTrustSignals: PlatformHeroTrustSignal[] = [ - { - icon: 'lucide:cloud-cog', - label: 'Microsoft tenant focused', - }, - { - icon: 'lucide:file-check-2', - label: 'Evidence-oriented workflows', - }, - { - icon: 'lucide:refresh-cw', - label: 'Reviewable decisions', - }, - { - icon: 'lucide:users-round', - label: 'Operator-led governance', - }, -]; - -export const operatingModelSteps: OperatingModelStep[] = [ - { - badge: 'Observed', - icon: 'lucide:camera', - label: 'Snapshot', - description: 'Capture the current state of policies, identities, roles, and configuration.', - }, - { - badge: 'Detected', - icon: 'lucide:activity', - label: 'Drift', - description: 'Detect meaningful movement against known baselines and recent evidence.', - }, - { - badge: 'Qualified', - icon: 'lucide:triangle-alert', - label: 'Finding', - description: 'Qualify drift with risk context, affected scope, and remediation options.', - }, - { - badge: 'Decided', - icon: 'lucide:users-round', - label: 'Review', - description: 'Let the responsible operator inspect context before the next action is chosen.', - }, - { - badge: 'Documented', - icon: 'lucide:file-check-2', - label: 'Evidence', - description: 'Attach artifacts, screenshots, notes, and logs to the review record.', - }, - { - badge: 'Recorded', - icon: 'lucide:shield-check', - label: 'Audit trail', - description: 'Retain who decided what, when, and which evidence supported the decision.', - }, -]; - -export const governanceLoopIntro = { - eyebrow: 'Governance loop', - title: 'Context, evidence, and auditability stay connected.', - description: - 'Every decision is grounded in verifiable data. Nothing gets lost in handoffs or memory, and review work stays tied to the source material that created it.', - bullets: [ - 'End-to-end traceability from change to decision', - 'Immutable evidence with screenshots and logs', - 'Clear accountability for every action', - 'Ready for internal and external reviews', - ], -}; - -export const governanceLoop: GovernanceLoopItem[] = [ - { - label: 'Source of truth', - description: 'Graph, Entra ID, SharePoint, Exchange, Defender, Azure AD, and operator scripts.', - tone: 'source', - }, - { - label: 'Snapshot', - description: 'Point-in-time state captured.', - }, - { - label: 'Diff', - description: 'Baseline comparison highlights drift.', - }, - { - label: 'Finding', - description: 'Risk context and suggested remediation.', - }, - { - label: 'Exception', - description: 'Accepted risk with owner and expiry.', - }, - { - label: 'Review', - description: 'Operator reviews context and decides.', - tone: 'focus', - }, - { - label: 'Evidence', - description: 'Artifacts and notes attach to the decision.', - tone: 'focus', - }, - { - label: 'Audit trail', - description: 'Decision history stays traceable.', - }, -]; - -export const platformCapabilityPrimary: PlatformCapabilityPrimary = { - icon: 'lucide:archive-restore', - title: 'Backup & Restore', - description: - 'Protect critical tenant configurations and data. Preview, validate, and restore with confidence from preserved configuration evidence.', - ctaLabel: 'Explore backups', - proofPoints: ['Point-in-time records', 'Restore preview context', 'Evidence for each decision'], -}; - -export const platformCapabilities: FeatureItemContent[] = [ - { - icon: 'git-branch', - title: 'Drift Detection', - description: 'Detect policy, access, and configuration changes before they turn into audit work.', - meta: 'Detected', - }, - { - icon: 'search', - title: 'Findings', - description: 'Risk-rank drift with context, impact, and recommended actions.', - meta: 'Qualified', - }, - { - icon: 'file-check', - title: 'Evidence', - description: 'Capture and organize artifacts that prove every decision.', - meta: 'Documented', - }, - { - icon: 'clipboard', - title: 'Audit Trail', - description: 'Maintain history of changes, decisions, and operator actions.', - meta: 'Traceable', - }, - { - icon: 'flag', - title: 'Exceptions', - description: 'Document accepted risks with owners and review cadence.', - meta: 'Owned', - }, - { - icon: 'users', - title: 'Governance Reviews', - description: 'Run structured reviews with tasks, approvals, and reporting.', - meta: 'Review cadence', - }, -]; - -export const truthLayers: TruthLayerContent[] = [ - { - title: 'Execution truth', - description: 'What is happening right now in the tenant.', - question: 'What changed?', - }, - { - title: 'Artifact truth', - description: 'The evidence and logs that prove it.', - question: 'What proves it?', - }, - { - title: 'Backup truth', - description: 'What we have protected and can restore.', - question: 'What can we recover?', - }, - { - title: 'Recovery evidence', - description: 'Proof of restores, tests, and recovery actions.', - question: 'How do we restore?', - }, - { - title: 'Operator next action', - description: 'What the operator should do or review next.', - question: 'What should we do now?', - }, -]; - -export const operatorWorkflows: PlatformWorkflowContent[] = [ - { - audience: 'MSP Operator', - icon: 'lucide:user-round', - description: 'Manage multiple clients with consistent guardrails, backups, and reviews.', - }, - { - audience: 'Enterprise IT', - icon: 'lucide:building-2', - description: 'Maintain secure posture with drift context and clear actions.', - }, - { - audience: 'Security Reviewer', - icon: 'lucide:shield-check', - description: 'Investigate, validate, and ensure issues are remediated.', - }, - { - audience: 'Compliance / Audit', - icon: 'lucide:scroll-text', - description: 'Access evidence and reports to meet internal and external needs.', - }, -]; - -export const platformBoundary: PlatformBoundaryContent = { - headline: 'Built for governance of record and recovery context.', - description: - 'Tenantial is designed to preserve context, evidence, and governance control so operators can act with confidence.', - items: [ - 'We do not take actions on your behalf.', - 'We do not manage devices.', - 'We do not replace your ITSM, SIEM, ticketing, or Microsoft admin centers.', - 'We support reviewable decisions.', - ], -}; - -export const platformFinalCta = { - eyebrow: 'Evaluate the loop', - title: 'See how evidence-first governance fits your Microsoft tenant operations.', - description: - 'Explore a focused demo of Tenantial and see how your team can turn signal into trusted decisions.', - primary: { - href: '/contact', - label: 'Book a demo', - } as CtaLink, - secondary: { - href: '#governance-loop', - label: 'Explore the platform', - variant: 'secondary', - } as CtaLink, -}; diff --git a/apps/website/src/content/pages/privacy.ts b/apps/website/src/content/pages/privacy.ts deleted file mode 100644 index ff72e38d..00000000 --- a/apps/website/src/content/pages/privacy.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { HeroContent, LegalSection, PageSeo } from '@/types/site'; - -export const privacySeo: PageSeo = { - title: 'Tenantial | Privacy', - description: - 'Public-site privacy overview for Tenantial inquiries, including how contact details and evaluation context are handled on the public website.', - path: '/privacy', -}; - -export const privacyHero: HeroContent = { - eyebrow: 'Privacy', - title: 'Public-site privacy overview for Tenantial inquiries.', - description: - 'This page explains the privacy expectations for the public website and the contact path, rather than promising a full product-tenant data processing agreement from a static marketing surface.', - primaryCta: { - href: '/contact', - label: 'Return to contact', - }, - secondaryCta: { - href: '/imprint', - label: 'Review the imprint', - variant: 'secondary', - }, - highlights: [ - 'The public site should only request information that supports a useful follow-up.', - 'Contact details and evaluation context should be handled carefully and minimally.', - 'Future product-processing details belong in product/legal agreements, not hidden marketing copy.', - ], -}; - -export const privacySections: LegalSection[] = [ - { - title: 'Scope', - body: [ - 'This privacy overview applies to the public Tenantial website and to information a visitor intentionally shares through the public contact path.', - 'It does not describe tenant data processing inside the product itself, which belongs in product-specific legal and contractual materials.', - ], - }, - { - title: 'Information you choose to send', - body: [ - 'If you contact the team, the information you provide may include your name, company, role, email address, and the evaluation or governance questions you want to discuss.', - 'The site should not ask for unnecessary secrets, production credentials, or tenant data through the public contact path.', - ], - }, - { - title: 'Use and retention', - body: [ - 'Information shared through the public contact path is used to understand the inquiry, respond to the request, and coordinate a relevant follow-up conversation.', - 'Public-site inquiry information should be retained only for as long as needed to manage the evaluation discussion and related follow-up.', - ], - }, - { - title: 'Questions and updates', - body: [ - 'Privacy questions can be routed through the public contact path until the final launch imprint publishes the full operating-entity details for privacy correspondence.', - 'If the public-site data handling model changes materially, this page should be updated before or at the same time as the change.', - ], - }, -]; diff --git a/apps/website/src/content/pages/product.ts b/apps/website/src/content/pages/product.ts deleted file mode 100644 index 8f8e4a14..00000000 --- a/apps/website/src/content/pages/product.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { - CalloutContent, - FeatureItemContent, - HeroContent, - MetricItem, - PageSeo, -} from '@/types/site'; - -export const productSeo: PageSeo = { - title: 'Tenantial | Product', - description: - 'Tenantial explains backup, restore, version history, drift, findings, evidence, and reviews as one operating model rather than a loose feature list.', - path: '/product', -}; - -export const productHero: HeroContent = { - eyebrow: 'Product model', - title: 'Explain the product as one operating model before asking a buyer to trust the route map around it.', - description: - 'Tenantial treats Microsoft tenant governance as one connected system: observe the current state, preserve immutable history, detect meaningful change, and support reviews or restores with the context operators actually need.', - primaryCta: { - href: '/trust', - label: 'Review the trust posture', - }, - secondaryCta: { - href: '/contact', - label: 'Start the working session', - variant: 'secondary', - }, - highlights: [ - 'Backup, restore, versioning, auditability, drift, and evidence belong in one explanation layer.', - 'Trust and changelog should deepen the product read, not replace it.', - 'Audience-fit detail remains secondary until the core model is understood.', - ], -}; - -export const productMetrics: MetricItem[] = [ - { - value: '6', - label: 'Capability areas', - description: 'Backup, restore, versioning, audit, drift visibility, and governance workflows are made legible as one system.', - }, - { - value: '100%', - label: 'Queryable versions', - description: 'Version semantics stay tied to who changed what, when, and in which tenant context.', - }, -]; - -export const productModelBlocks: FeatureItemContent[] = [ - { - eyebrow: 'Inventory and drift', - icon: 'search', - title: 'Current-state inventory and drift visibility establish what the tenant actually looks like now.', - description: - 'The product starts with last-observed tenant state so teams can compare real configuration truth instead of relying on partial memory or exported spreadsheets.', - }, - { - eyebrow: 'Backup and versioning', - icon: 'database', - title: 'Snapshots and versions preserve immutable history without replacing present-tense truth.', - description: - 'Backups and versions are explicit artifacts tied to tenant context, operators, and timing so the history remains reproducible and queryable.', - }, - { - eyebrow: 'Restore safety', - icon: 'refresh', - title: 'Restore is handled as a governed operation, not as a blind push.', - description: - 'Preview, validation, selective scope, and confirmation reduce the risk of turning a recovery step into a new incident.', - }, - { - eyebrow: 'Audit and review', - icon: 'eye', - title: 'Differences become reviewable signals instead of noisy raw deltas.', - description: - 'Human-readable summaries and structured differences help operators and reviewers decide what changed, who needs to know, and what deserves follow-up.', - }, - { - eyebrow: 'Findings and evidence', - icon: 'file-check', - title: 'Findings, exceptions, and evidence stay anchored to operational truth.', - description: - 'Governance discussions stay attached to the real object, version, and review context instead of drifting into separate manual trackers.', - }, - { - eyebrow: 'Baselines and governance', - icon: 'shield', - title: 'Baselines, reviews, and operator safety belong to the same workflow.', - description: - 'The product is built so teams can explain actions afterward, not just execute them quickly in the moment.', - }, -]; - -export const productNarrative: CalloutContent[] = [ - { - eyebrow: 'What it is', - title: 'The point is not “backup plus reporting plus restore.”', - description: - 'The point is to reduce operator uncertainty by keeping those capabilities connected through the same source material and the same decision flow.', - tone: 'accent', - }, - { - eyebrow: 'What it is for', - title: 'A calmer path from observation to action.', - description: - 'Teams can move from understanding the current tenant state to comparing history, planning remediation, or reviewing restore options without leaving the product model behind.', - }, - { - eyebrow: 'What it is not', - title: 'No generic dashboard theater.', - description: - 'The product story avoids pretending that another alerting page or compliance badge alone solves governance discipline.', - tone: 'subtle', - }, -]; diff --git a/apps/website/src/content/pages/security-trust.ts b/apps/website/src/content/pages/security-trust.ts deleted file mode 100644 index cd937e30..00000000 --- a/apps/website/src/content/pages/security-trust.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { - CalloutContent, - HeroContent, - PageSeo, - TrustPrincipleContent, -} from '@/types/site'; - -export const securityTrustSeo: PageSeo = { - title: 'Tenantial | Security & Trust', - description: - 'Tenantial frames trust through substantiated product posture, safer restore discipline, and operational clarity rather than inflated guarantees.', - path: '/security-trust', -}; - -export const securityTrustHero: HeroContent = { - eyebrow: 'Security & Trust', - title: 'Explain the trust posture in the language of operational controls, not marketing claims.', - description: - 'The public trust page should set realistic expectations: what the product helps teams observe, preserve, review, and restore, and where launch claims intentionally stay narrow until they can be substantiated further.', - primaryCta: { - href: '/legal', - label: 'Read the legal surface', - }, - secondaryCta: { - href: '/contact', - label: 'Discuss trust requirements', - variant: 'secondary', - }, - highlights: [ - 'Preview, confirmation, and auditability remain part of the restore story.', - 'Public claims stay narrower than internal ambition.', - 'No fake compliance theater for launch.', - ], -}; - -export const securityPrinciples: TrustPrincipleContent[] = [ - { - title: 'Safer changes are a product rule, not an afterthought.', - description: - 'Destructive or high-risk flows are framed around preview, validation, and explicit confirmation instead of one-click confidence theater.', - note: 'Trust starts with operator discipline.', - }, - { - title: 'Operational evidence stays tied to the real object and version.', - description: - 'Findings, exceptions, and reviews remain anchored to observable tenant state so the trust story is defensible when someone asks for proof.', - note: 'Evidence should stay attributable.', - }, - { - title: 'Launch messaging stays within substantiated boundaries.', - description: - 'The public site avoids promising certifications, guarantees, or full automation outcomes that are not yet appropriate to claim.', - note: 'Restraint is part of credibility.', - }, -]; - -export const securityTrustNotes: CalloutContent[] = [ - { - eyebrow: 'Substantiated public posture', - title: 'Public posture should stay anchored to product safeguards.', - description: - 'The launch story focuses on product shape and operator safeguards: inventory truth, immutable snapshots, safer restore flows, drift visibility, and review support.', - tone: 'accent', - }, - { - eyebrow: 'Sensitive connections', - title: 'Sensitive Microsoft connections should be explained carefully.', - description: - 'The public site acknowledges Graph- and tenant-facing access without pretending the site itself is part of the runtime trust boundary.', - }, - { - eyebrow: 'What we will not say', - title: 'No blanket assurances and no vague “fully automated governance” language.', - description: - 'Trust pages lose credibility quickly when they substitute slogans for the actual controls and workflows a buyer will later inspect.', - tone: 'subtle', - }, -]; diff --git a/apps/website/src/content/pages/solutions.ts b/apps/website/src/content/pages/solutions.ts deleted file mode 100644 index 2ab5d8ed..00000000 --- a/apps/website/src/content/pages/solutions.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { - AudienceRowContent, - FeatureItemContent, - HeroContent, - PageSeo, -} from '@/types/site'; - -export const solutionsSeo: PageSeo = { - title: 'Tenantial | Solutions', - description: - 'Tenantial keeps MSP and enterprise outcome framing available as a supporting page without requiring it for the first public read.', - path: '/solutions', -}; - -export const solutionsHero: HeroContent = { - eyebrow: 'Retained supporting page', - title: 'Keep MSP and enterprise audience-fit detail published without letting it crowd the core route set.', - description: - 'The product helps different organizations answer similar governance questions, but the surrounding workflow, accountability, and evidence needs are not identical. This page stays available without becoming required orientation for every first-time visitor.', - primaryCta: { - href: '/product', - label: 'See the product model', - }, - secondaryCta: { - href: '/contact', - label: 'Start the working session', - variant: 'secondary', - }, - highlights: [ - 'Separate MSP and enterprise language on purpose.', - 'Keep the product story stable while the buying context changes.', - 'Stay secondary to Product, Trust, Changelog, and Contact.', - ], -}; - -export const solutionsAudiences: AudienceRowContent[] = [ - { - audience: 'MSP', - title: 'MSP operating model', - description: - 'Managed service providers need tenant-scoped operational truth, repeatable review workflows, and a way to explain change history to customers without drowning in manual evidence gathering.', - bullets: [ - 'Keep per-tenant history and restore posture reviewable during service delivery.', - 'Support a higher tempo of customer change while preserving a clean audit story.', - 'Give account and delivery teams a shared language for exceptions, findings, and follow-up.', - ], - cta: { - href: '/contact', - label: 'Discuss MSP delivery fit', - variant: 'secondary', - }, - }, - { - audience: 'Enterprise IT', - title: 'Enterprise IT operating model', - description: - 'Internal IT and security teams need durable version truth, change visibility, and review evidence that can stand up to operational leadership, audit, and cross-team scrutiny.', - bullets: [ - 'Reduce uncertainty around who changed what and when across the Microsoft tenant surface.', - 'Support internal review packs, exception handling, and evidence collection without fragmented tooling.', - 'Keep restore and remediation conversations grounded in the current tenant state and the relevant history.', - ], - cta: { - href: '/trust', - label: 'Inspect the trust posture', - variant: 'secondary', - }, - }, -]; - -export const solutionsSignals: FeatureItemContent[] = [ - { - eyebrow: 'Why buyers care', - title: 'The product is serious about both velocity and control.', - description: - 'Teams can move quickly without giving up visibility, confirmation discipline, or explainability when a risky change needs review.', - }, - { - eyebrow: 'Where it lands', - title: 'The product belongs in the operating layer, not just the reporting layer.', - description: - 'Visitors should understand that Tenantial helps teams make safer decisions about configuration state rather than merely summarize activity afterward.', - }, - { - eyebrow: 'How it reads', - title: 'The story changes by audience, but the product truth does not.', - description: - 'MSP and enterprise readers see their own operating concerns reflected without the site inventing two different products.', - }, -]; diff --git a/apps/website/src/content/pages/terms.ts b/apps/website/src/content/pages/terms.ts deleted file mode 100644 index 69fc0131..00000000 --- a/apps/website/src/content/pages/terms.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { HeroContent, LegalSection, PageSeo } from '@/types/site'; - -export const termsSeo: PageSeo = { - title: 'Tenantial | Terms', - description: - 'Website terms for the public Tenantial surface, covering informational use of the site and the limits of public product statements.', - path: '/terms', -}; - -export const termsHero: HeroContent = { - eyebrow: 'Website terms', - title: 'Website terms for the public Tenantial surface.', - description: - 'These terms describe the public website itself: informational use of the content, basic conduct expectations, and the fact that a public product site is not the same thing as a signed service agreement.', - primaryCta: { - href: '/contact', - label: 'Return to contact', - }, - secondaryCta: { - href: '/imprint', - label: 'Review the imprint', - variant: 'secondary', - }, - highlights: [ - 'Public copy explains the product but does not replace commercial agreements.', - 'The site is for evaluation and information, not operational control of a tenant.', - 'Any future service commitment belongs in explicit signed terms.', - ], -}; - -export const termsSections: LegalSection[] = [ - { - title: 'Informational website use', - body: [ - 'The public Tenantial website is provided to explain the product category, trust posture, integrations direction, and contact path for evaluation conversations.', - 'Nothing on the public site should be interpreted as a guarantee of product availability, certification, or commercial commitment unless it is later confirmed in signed agreements.', - ], - }, - { - title: 'Reasonable reliance', - body: [ - 'Visitors may use the public site to understand the product and decide whether to start a conversation, but they should not rely on public marketing pages as the sole source of contractual or implementation truth.', - 'Detailed service commitments, security terms, and procurement obligations belong in later commercial and legal documentation.', - ], - }, - { - title: 'Acceptable conduct', - body: [ - 'Visitors should use the public website lawfully and should not attempt to interfere with the availability or integrity of the public site.', - 'The public website is not a runtime administration surface and should not be treated as one.', - ], - }, - { - title: 'Questions', - body: [ - 'Questions about the public website terms, privacy, or future product legal materials can be routed through the public contact path.', - 'The legal hub remains published, while Imprint carries the canonical notice baseline.', - ], - }, -]; diff --git a/apps/website/src/content/pages/trust.ts b/apps/website/src/content/pages/trust.ts deleted file mode 100644 index a5a795fd..00000000 --- a/apps/website/src/content/pages/trust.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { - CalloutContent, - HeroContent, - PageSeo, - TrustPrincipleContent, -} from '@/types/site'; - -export const trustSeo: PageSeo = { - title: 'Tenantial | Trust', - description: - 'Tenantial uses the Trust surface to explain tenant isolation, access boundaries, operating discipline, and the limits of public claims in one explicit place.', - path: '/trust', -}; - -export const trustHero: HeroContent = { - eyebrow: 'Canonical trust surface', - title: 'Review the trust posture in the language of operator safeguards, access boundaries, and explicit limits.', - description: - 'The Trust page exists so public claims about isolation, hosting, update discipline, and safer change handling have one bounded supporting surface instead of leaking across product copy.', - primaryCta: { - href: '/contact', - label: 'Start the working session', - }, - secondaryCta: { - href: '/imprint', - label: 'Read the imprint', - variant: 'secondary', - }, - highlights: [ - 'Tenant isolation, access handling, and safer restore posture are explained directly.', - 'Public claims stay narrower than internal ambition or future certification plans.', - 'Trust still routes to a human conversation instead of becoming a dead-end policy wall.', - ], -}; - -export const trustPrinciples: TrustPrincipleContent[] = [ - { - title: 'Tenant isolation is a product boundary, not a marketing adjective.', - description: - 'The public trust story should make it clear that tenant-scoped truth, access, and workflow boundaries are deliberate product rules, not hand-wavy positioning language.', - note: 'Isolation must stay attributable.', - }, - { - title: 'Sensitive access remains bounded, reviewable, and purpose-specific.', - description: - 'The product depends on Microsoft tenant-facing access where governance work requires it, but the public site should explain those boundaries without pretending the website itself is part of that runtime path.', - note: 'Bound the trust story carefully.', - }, - { - title: 'Restore and other high-risk actions are framed around preview and confirmation.', - description: - 'Safer changes come from validation, selective scope, and explicit confirmation rather than from confidence theater about one-click remediation.', - note: 'Safer execution is part of credibility.', - }, - { - title: 'Operating discipline matters as much as storage or hosting claims.', - description: - 'Change history, evidence linkage, review posture, and update discipline all contribute to whether a serious buyer can trust the product story.', - note: 'Trust includes how the team operates.', - }, -]; - -export const trustNotes: CalloutContent[] = [ - { - eyebrow: 'Hosting and residency claims', - title: 'Hosting-region or residency language must stay qualified and current.', - description: - 'If the product makes a public claim about where data or workloads run, the Trust page should explain the scope, boundary, and any conditions instead of leaving the claim unbounded.', - tone: 'accent', - }, - { - eyebrow: 'Update discipline', - title: 'Operational rigor needs a public explanation even before formal certifications exist.', - description: - 'A serious trust page should explain update posture, review expectations, and how the product treats risky changes without falling back on empty compliance theater.', - }, - { - eyebrow: 'What we will not imply', - title: 'No absolute legal-compliance claims and no vague “fully automated governance” language.', - description: - 'Trust weakens quickly when a public page substitutes slogans for the real controls and workflows a buyer will later inspect.', - tone: 'subtle', - }, -]; diff --git a/apps/website/src/content/products/tenantial-placeholder.md b/apps/website/src/content/products/tenantial-placeholder.md new file mode 100644 index 00000000..d6d0f2ae --- /dev/null +++ b/apps/website/src/content/products/tenantial-placeholder.md @@ -0,0 +1,21 @@ +--- +title: Tenantial platform placeholder +description: Hidden placeholder content for the retained platform collection. +main: + id: 1 + content: Tenantial platform placeholder + imgCard: ../../images/product-image-1.avif + imgMain: ../../images/product-image-main-1.avif + imgAlt: Static platform preview +tabs: [] +longDescription: + title: Tenantial platform placeholder + subTitle: Hidden content retained for the vendored foundation. + btnTitle: Contact + btnURL: /contact +descriptionList: [] +specificationsLeft: [] +blueprints: {} +--- + +This collection is retained for the vendored website foundation, but product routes redirect to the canonical platform page. diff --git a/apps/website/src/data_files/constants.ts b/apps/website/src/data_files/constants.ts new file mode 100644 index 00000000..21a80165 --- /dev/null +++ b/apps/website/src/data_files/constants.ts @@ -0,0 +1,45 @@ +import ogImageSrc from '@images/social.png'; + +export const SITE = { + title: 'Tenantial', + tagline: 'Evidence-first Microsoft tenant governance', + description: + 'Tenantial helps Microsoft tenant administrators review policy evidence, snapshots, drift, findings, and restore plans before high-impact changes move forward.', + description_short: + 'Evidence-first governance workflows for Microsoft tenant review, backup, drift, and restore planning.', + url: 'https://tenantial.com', + author: 'Tenantial', +}; + +export const SEO = { + title: SITE.title, + description: SITE.description, + structuredData: { + '@context': 'https://schema.org', + '@type': 'WebPage', + inLanguage: 'en-US', + '@id': SITE.url, + url: SITE.url, + name: SITE.title, + description: SITE.description, + isPartOf: { + '@type': 'WebSite', + url: SITE.url, + name: SITE.title, + description: SITE.description, + }, + }, +}; + +export const OG = { + locale: 'en_US', + type: 'website', + url: SITE.url, + title: `${SITE.title}: Evidence-first Microsoft tenant governance`, + description: + 'Review tenant inventory, snapshots, drift, findings, exceptions, and restore plans with conservative, audit-friendly workflows.', + image: ogImageSrc, +}; + +export const partnersData: Array<{ icon: string; name: string; href: string }> = + []; diff --git a/apps/website/src/data_files/faqs.json b/apps/website/src/data_files/faqs.json new file mode 100644 index 00000000..69a8349d --- /dev/null +++ b/apps/website/src/data_files/faqs.json @@ -0,0 +1,21 @@ +{ + "subTitle": "Straight answers for public website visitors.", + "faqs": [ + { + "question": "Does this public website connect to a live tenant?", + "answer": "No. Product previews and examples are static demonstrations and do not authenticate visitors or read tenant data." + }, + { + "question": "Is restore positioned as an automatic outcome?", + "answer": "No. Tenantial describes restore as a cautious workflow with preview, validation, selective scope, explicit confirmation, and review context." + }, + { + "question": "Are pricing plans self-serve?", + "answer": "Not from this website. Pricing is framed around evaluation and scoped rollout conversations until commercial packaging is finalized." + }, + { + "question": "Does Tenantial publish customer proof here?", + "answer": "No customer logos, third-party endorsements, external assurance statements, service-level commitments, or recovery promises are published without supplied and reviewed evidence." + } + ] +} diff --git a/apps/website/src/data_files/features.json b/apps/website/src/data_files/features.json new file mode 100644 index 00000000..a822fdfe --- /dev/null +++ b/apps/website/src/data_files/features.json @@ -0,0 +1,22 @@ +[ + { + "heading": "Inventory evidence", + "content": "Normalize observed policy metadata so reviews start from what was last seen, not scattered exports.", + "svg": "frame" + }, + { + "heading": "Immutable snapshots", + "content": "Keep point-in-time policy records that can be compared, reviewed, and used for restore planning.", + "svg": "dashboard" + }, + { + "heading": "Drift review", + "content": "Turn differences and findings into readable review work before administrators decide what to change.", + "svg": "verified" + }, + { + "heading": "Restore caution", + "content": "Frame restore around preview, validation, conflict awareness, selective scope, and explicit confirmation.", + "svg": "checkCircle" + } +] diff --git a/apps/website/src/data_files/pricing.json b/apps/website/src/data_files/pricing.json new file mode 100644 index 00000000..40977f80 --- /dev/null +++ b/apps/website/src/data_files/pricing.json @@ -0,0 +1,36 @@ +{ + "title": "Evaluation and rollout options", + "subTitle": "Commercial packaging is intentionally conservative on the public website. No self-serve checkout or fixed entitlement claim is implied.", + "badge": "Scoped", + "thirdOption": "Need a narrower advisory conversation?", + "btnText": "Contact us", + "starterKit": { + "name": "Evaluation", + "description": "For teams reviewing fit before rollout.", + "price": "Contact", + "cents": "", + "billingFrequency": "for scope", + "features": [ + "Guided public product walkthrough", + "Static demo review", + "Deployment-fit discussion" + ], + "purchaseBtnTitle": "Request walkthrough", + "purchaseLink": "/contact" + }, + "professionalToolbox": { + "name": "Managed rollout", + "description": "For planned staging and operator review.", + "price": "Scoped", + "cents": "", + "billingFrequency": "quote", + "features": [ + "Readiness review", + "Staging validation plan", + "Operational handoff notes", + "Trust and legal copy review" + ], + "purchaseBtnTitle": "Discuss rollout", + "purchaseLink": "/contact" + } +} diff --git a/apps/website/src/env.d.ts b/apps/website/src/env.d.ts new file mode 100644 index 00000000..acef35f1 --- /dev/null +++ b/apps/website/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/apps/website/src/images/aerial-view.avif b/apps/website/src/images/aerial-view.avif new file mode 100644 index 00000000..f602f02b Binary files /dev/null and b/apps/website/src/images/aerial-view.avif differ diff --git a/apps/website/src/images/automated-tools.avif b/apps/website/src/images/automated-tools.avif new file mode 100644 index 00000000..648f1ab9 Binary files /dev/null and b/apps/website/src/images/automated-tools.avif differ diff --git a/apps/website/src/images/before-after.avif b/apps/website/src/images/before-after.avif new file mode 100644 index 00000000..b5675a49 Binary files /dev/null and b/apps/website/src/images/before-after.avif differ diff --git a/apps/website/src/images/blog/anna.avif b/apps/website/src/images/blog/anna.avif new file mode 100644 index 00000000..52a4eac3 Binary files /dev/null and b/apps/website/src/images/blog/anna.avif differ diff --git a/apps/website/src/images/blog/brad.avif b/apps/website/src/images/blog/brad.avif new file mode 100644 index 00000000..9e2a044f Binary files /dev/null and b/apps/website/src/images/blog/brad.avif differ diff --git a/apps/website/src/images/blog/jacob.avif b/apps/website/src/images/blog/jacob.avif new file mode 100644 index 00000000..2eee8a47 Binary files /dev/null and b/apps/website/src/images/blog/jacob.avif differ diff --git a/apps/website/src/images/blog/post-1.avif b/apps/website/src/images/blog/post-1.avif new file mode 100644 index 00000000..1cde82e5 Binary files /dev/null and b/apps/website/src/images/blog/post-1.avif differ diff --git a/apps/website/src/images/blog/post-2.avif b/apps/website/src/images/blog/post-2.avif new file mode 100644 index 00000000..32fb3a3c Binary files /dev/null and b/apps/website/src/images/blog/post-2.avif differ diff --git a/apps/website/src/images/blog/post-3.avif b/apps/website/src/images/blog/post-3.avif new file mode 100644 index 00000000..325f67e2 Binary files /dev/null and b/apps/website/src/images/blog/post-3.avif differ diff --git a/apps/website/src/images/blueprint-1.avif b/apps/website/src/images/blueprint-1.avif new file mode 100644 index 00000000..97d156c5 Binary files /dev/null and b/apps/website/src/images/blueprint-1.avif differ diff --git a/apps/website/src/images/blueprint-2.avif b/apps/website/src/images/blueprint-2.avif new file mode 100644 index 00000000..1d4346a0 Binary files /dev/null and b/apps/website/src/images/blueprint-2.avif differ diff --git a/apps/website/src/images/blueprints-image.avif b/apps/website/src/images/blueprints-image.avif new file mode 100644 index 00000000..124de3bb Binary files /dev/null and b/apps/website/src/images/blueprints-image.avif differ diff --git a/apps/website/src/images/construction-image.avif b/apps/website/src/images/construction-image.avif new file mode 100644 index 00000000..9c995438 Binary files /dev/null and b/apps/website/src/images/construction-image.avif differ diff --git a/apps/website/src/images/construction-workers.avif b/apps/website/src/images/construction-workers.avif new file mode 100644 index 00000000..6e130280 Binary files /dev/null and b/apps/website/src/images/construction-workers.avif differ diff --git a/apps/website/src/images/dashboard-image.avif b/apps/website/src/images/dashboard-image.avif new file mode 100644 index 00000000..312f23db Binary files /dev/null and b/apps/website/src/images/dashboard-image.avif differ diff --git a/apps/website/src/images/features-image.avif b/apps/website/src/images/features-image.avif new file mode 100644 index 00000000..8d8d5250 Binary files /dev/null and b/apps/website/src/images/features-image.avif differ diff --git a/apps/website/src/images/hero-image.avif b/apps/website/src/images/hero-image.avif new file mode 100644 index 00000000..04aeceab Binary files /dev/null and b/apps/website/src/images/hero-image.avif differ diff --git a/apps/website/src/images/icon-maskable.png b/apps/website/src/images/icon-maskable.png new file mode 100644 index 00000000..1ca4c1af Binary files /dev/null and b/apps/website/src/images/icon-maskable.png differ diff --git a/apps/website/src/images/icon.png b/apps/website/src/images/icon.png new file mode 100644 index 00000000..39cf2048 Binary files /dev/null and b/apps/website/src/images/icon.png differ diff --git a/apps/website/src/images/icon.svg b/apps/website/src/images/icon.svg new file mode 100644 index 00000000..f48b5351 --- /dev/null +++ b/apps/website/src/images/icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/website/src/images/insights/insight-1.avif b/apps/website/src/images/insights/insight-1.avif new file mode 100644 index 00000000..dcdae976 Binary files /dev/null and b/apps/website/src/images/insights/insight-1.avif differ diff --git a/apps/website/src/images/insights/insight-2.avif b/apps/website/src/images/insights/insight-2.avif new file mode 100644 index 00000000..7913e936 Binary files /dev/null and b/apps/website/src/images/insights/insight-2.avif differ diff --git a/apps/website/src/images/insights/insight-3.avif b/apps/website/src/images/insights/insight-3.avif new file mode 100644 index 00000000..d46c38d6 Binary files /dev/null and b/apps/website/src/images/insights/insight-3.avif differ diff --git a/apps/website/src/images/person-working.avif b/apps/website/src/images/person-working.avif new file mode 100644 index 00000000..f4bf905a Binary files /dev/null and b/apps/website/src/images/person-working.avif differ diff --git a/apps/website/src/images/product-image-1.avif b/apps/website/src/images/product-image-1.avif new file mode 100644 index 00000000..2220d473 Binary files /dev/null and b/apps/website/src/images/product-image-1.avif differ diff --git a/apps/website/src/images/product-image-2.avif b/apps/website/src/images/product-image-2.avif new file mode 100644 index 00000000..856f17b1 Binary files /dev/null and b/apps/website/src/images/product-image-2.avif differ diff --git a/apps/website/src/images/product-image-3.avif b/apps/website/src/images/product-image-3.avif new file mode 100644 index 00000000..acc0d9fa Binary files /dev/null and b/apps/website/src/images/product-image-3.avif differ diff --git a/apps/website/src/images/product-image-4.avif b/apps/website/src/images/product-image-4.avif new file mode 100644 index 00000000..f9ee723f Binary files /dev/null and b/apps/website/src/images/product-image-4.avif differ diff --git a/apps/website/src/images/product-image-main-1.avif b/apps/website/src/images/product-image-main-1.avif new file mode 100644 index 00000000..f1ec32e7 Binary files /dev/null and b/apps/website/src/images/product-image-main-1.avif differ diff --git a/apps/website/src/images/product-image-main-2.avif b/apps/website/src/images/product-image-main-2.avif new file mode 100644 index 00000000..3c209efe Binary files /dev/null and b/apps/website/src/images/product-image-main-2.avif differ diff --git a/apps/website/src/images/product-image-main-3.avif b/apps/website/src/images/product-image-main-3.avif new file mode 100644 index 00000000..c0abcbaf Binary files /dev/null and b/apps/website/src/images/product-image-main-3.avif differ diff --git a/apps/website/src/images/product-image-main-4.avif b/apps/website/src/images/product-image-main-4.avif new file mode 100644 index 00000000..42226f72 Binary files /dev/null and b/apps/website/src/images/product-image-main-4.avif differ diff --git a/apps/website/src/images/progress-building.avif b/apps/website/src/images/progress-building.avif new file mode 100644 index 00000000..3fd3cbfe Binary files /dev/null and b/apps/website/src/images/progress-building.avif differ diff --git a/apps/website/src/images/social.png b/apps/website/src/images/social.png new file mode 100644 index 00000000..d5b5aca3 Binary files /dev/null and b/apps/website/src/images/social.png differ diff --git a/apps/website/src/images/starlight/docs_logo.svg b/apps/website/src/images/starlight/docs_logo.svg new file mode 100644 index 00000000..15fe0557 --- /dev/null +++ b/apps/website/src/images/starlight/docs_logo.svg @@ -0,0 +1,8 @@ + + + + diff --git a/apps/website/src/images/tenantial-dashboard.avif b/apps/website/src/images/tenantial-dashboard.avif new file mode 100644 index 00000000..22ba4527 Binary files /dev/null and b/apps/website/src/images/tenantial-dashboard.avif differ diff --git a/apps/website/src/images/tenantial-decision-review.avif b/apps/website/src/images/tenantial-decision-review.avif new file mode 100644 index 00000000..ff4c46c9 Binary files /dev/null and b/apps/website/src/images/tenantial-decision-review.avif differ diff --git a/apps/website/src/images/tenantial-drift-workflow.avif b/apps/website/src/images/tenantial-drift-workflow.avif new file mode 100644 index 00000000..2d46e84f Binary files /dev/null and b/apps/website/src/images/tenantial-drift-workflow.avif differ diff --git a/apps/website/src/images/tenantial-evidence-intake.avif b/apps/website/src/images/tenantial-evidence-intake.avif new file mode 100644 index 00000000..01ba22f7 Binary files /dev/null and b/apps/website/src/images/tenantial-evidence-intake.avif differ diff --git a/apps/website/src/images/tenantial-evidence-panel.avif b/apps/website/src/images/tenantial-evidence-panel.avif new file mode 100644 index 00000000..9b684f9c Binary files /dev/null and b/apps/website/src/images/tenantial-evidence-panel.avif differ diff --git a/apps/website/src/images/tenantial-restore-plan.avif b/apps/website/src/images/tenantial-restore-plan.avif new file mode 100644 index 00000000..02c515a9 Binary files /dev/null and b/apps/website/src/images/tenantial-restore-plan.avif differ diff --git a/apps/website/src/images/tenantial-review-board.avif b/apps/website/src/images/tenantial-review-board.avif new file mode 100644 index 00000000..04e74104 Binary files /dev/null and b/apps/website/src/images/tenantial-review-board.avif differ diff --git a/apps/website/src/images/tenantial-rollout-plan.avif b/apps/website/src/images/tenantial-rollout-plan.avif new file mode 100644 index 00000000..c93f8691 Binary files /dev/null and b/apps/website/src/images/tenantial-rollout-plan.avif differ diff --git a/apps/website/src/images/under-construction.avif b/apps/website/src/images/under-construction.avif new file mode 100644 index 00000000..8c72d2f4 Binary files /dev/null and b/apps/website/src/images/under-construction.avif differ diff --git a/apps/website/src/images/using-tools.avif b/apps/website/src/images/using-tools.avif new file mode 100644 index 00000000..c1b08f03 Binary files /dev/null and b/apps/website/src/images/using-tools.avif differ diff --git a/apps/website/src/layouts/BaseLayout.astro b/apps/website/src/layouts/BaseLayout.astro deleted file mode 100644 index 32d1afcd..00000000 --- a/apps/website/src/layouts/BaseLayout.astro +++ /dev/null @@ -1,56 +0,0 @@ ---- -import '../styles/global.css'; - -import { siteMetadata } from '@/lib/site'; - -interface Props { - canonicalUrl?: string; - description?: string; - openGraphDescription?: string; - openGraphTitle?: string; - robots?: string; - title?: string; -} - -const { - canonicalUrl, - description = siteMetadata.siteDescription, - robots = 'index,follow', - title = `${siteMetadata.siteName} | ${siteMetadata.siteTagline}`, -} = Astro.props; - -const openGraphTitle = Astro.props.openGraphTitle ?? title; -const openGraphDescription = Astro.props.openGraphDescription ?? description; ---- - - - - - - - - - - - - - - {canonicalUrl && } - - - - {canonicalUrl && } - - - - - {title} - - - - - - diff --git a/apps/website/src/layouts/MainLayout.astro b/apps/website/src/layouts/MainLayout.astro new file mode 100644 index 00000000..847457f9 --- /dev/null +++ b/apps/website/src/layouts/MainLayout.astro @@ -0,0 +1,98 @@ +--- +// Importing necessary components +import Meta from '@components/Meta.astro'; +import Navbar from '@components/sections/navbar&footer/Navbar.astro'; +import FooterSection from '@components/sections/navbar&footer/FooterSection.astro'; +import { SITE } from '@data/constants'; +import '@styles/global.css'; + +// Setting expected props +const { + title = SITE.title, + meta, + structuredData, + lang = 'en', + customDescription = null, + customOgTitle = null, +} = Astro.props; + +// Interface to type-check the properties +interface Props { + title?: string; + meta?: string; + structuredData?: object; + lang?: string; + customDescription?: string | null; + customOgTitle?: string | null; +} +--- + + + + {/* Adding metadata to the HTML document */} + + {/* Define the title of the page */} + {title} + + + + + { + /* + Setting up the main structure of the page. + The Navbar is placed at the top, with a slot for the main content and FooterSection at the bottom. + */ + } +
    + +
    + +
    +
    + + + + + diff --git a/apps/website/src/lib/changelog.ts b/apps/website/src/lib/changelog.ts deleted file mode 100644 index e0fa2df5..00000000 --- a/apps/website/src/lib/changelog.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getCollection } from 'astro:content'; - -import type { ProgressTeaserEntry } from '@/types/site'; - -export async function getRecentChangelogEntries(limit = 3): Promise { - const changelog = await getCollection('changelog'); - - return changelog - .filter((entry) => entry.data.draft !== true) - .sort((a, b) => b.data.publishedAt.getTime() - a.data.publishedAt.getTime()) - .slice(0, limit) - .map((entry) => ({ - date: entry.data.publishedAt, - description: entry.data.description, - title: entry.data.title, - })); -} diff --git a/apps/website/src/lib/seo.ts b/apps/website/src/lib/seo.ts deleted file mode 100644 index cb4578fd..00000000 --- a/apps/website/src/lib/seo.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { getCanonicalPath, getPageDefinition, publishedSitemapRoutes, siteMetadata } from '@/lib/site'; -import type { PageFamily, PageRole, PageSeo, ShellTone } from '@/types/site'; - -export interface ResolvedSeo extends PageSeo { - canonicalUrl: string; - family: PageFamily; - ogDescription: string; - ogTitle: string; - pageRole: PageRole; - robots: string; - shellTone: ShellTone; -} - -export function buildCanonicalUrl(path: string): string { - return new URL(getCanonicalPath(path), siteMetadata.siteUrl).toString(); -} - -export function resolveSeo(seo: PageSeo): ResolvedSeo { - const definition = getPageDefinition(seo.path); - - return { - ...seo, - canonicalUrl: buildCanonicalUrl(seo.path), - family: definition.family, - ogDescription: seo.ogDescription ?? seo.description, - ogTitle: seo.ogTitle ?? seo.title, - pageRole: definition.pageRole, - robots: 'index,follow', - shellTone: definition.shellTone, - }; -} - -export async function sitemapEntries(): Promise { - return [...publishedSitemapRoutes].map((path) => buildCanonicalUrl(path)); -} diff --git a/apps/website/src/lib/site.ts b/apps/website/src/lib/site.ts deleted file mode 100644 index 6d979892..00000000 --- a/apps/website/src/lib/site.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { getCollection } from 'astro:content'; - -import type { - CollectionName, - CtaLink, - FooterLead, - FooterNavigationGroup, - NavigationItem, - PageDefinition, - PageFamily, - ShellTone, - SitePath, - SiteMetadata, - SurfaceAvailability, - VisualFoundationContract, -} from '@/types/site'; - -export const siteMetadata: SiteMetadata = { - siteName: 'Tenantial', - siteTagline: 'Evidence-first governance for Microsoft tenants.', - siteDescription: - 'Tenantial helps MSP and enterprise teams govern Microsoft tenant backup, restore, drift, evidence, audit trails, and structured reviews from one evidence-first surface.', - siteUrl: import.meta.env.PUBLIC_SITE_URL ?? 'https://tenantial.example', -}; - -export const visualFoundationContract: VisualFoundationContract = { - pageFamilies: ['landing', 'trust', 'content'], - ctaHierarchy: ['primary', 'secondary', 'ghost'], - requiredColorRoles: [ - 'background', - 'foreground', - 'muted', - 'muted-foreground', - 'card', - 'card-foreground', - 'border', - 'input', - 'primary', - 'primary-foreground', - 'secondary', - 'secondary-foreground', - 'accent', - 'accent-foreground', - 'success', - 'warning', - 'destructive', - 'info', - ], - accessibilityBaseline: [ - 'focus-visible', - 'readable-contrast', - 'non-color-only-semantics', - 'navigation-vs-cta-differentiation', - 'mobile-readable-density', - ], - surfaceLayers: ['page-background', 'default-content', 'card', 'elevated', 'muted-inset', 'highlighted'], -}; - -type CollectionGatedNavigationItem = NavigationItem & { - collection?: CollectionName; -}; - -interface FooterGroupSeed { - collection?: CollectionName; - items: CollectionGatedNavigationItem[]; - title: string; -} - -export const contactCta: CtaLink = { - href: '/contact', - label: 'Book a demo', - helper: 'Bring tenant governance questions, restore concerns, or audit-readiness goals.', - variant: 'primary', -}; - -const footerLeadByFamily: Record = { - landing: { - eyebrow: 'Next step', - title: 'Build tenant governance on evidence, not assumptions.', - description: - 'Use a focused demo conversation to map Tenantial against your Microsoft tenant backup, restore, drift, evidence, and review needs.', - intent: 'conversion', - primaryCta: contactCta, - }, - trust: { - eyebrow: 'Trust stays actionable', - title: 'Trust, legal context, and the next conversation should reinforce one another.', - description: - 'Trust-oriented pages should keep legal context, product posture, and the working-session route connected instead of turning diligence into friction.', - intent: 'guidance', - primaryCta: { - href: '/contact', - label: 'Book a demo', - helper: 'Bring current review, legal, or rollout questions into one working conversation.', - variant: 'primary', - }, - }, - content: { - eyebrow: 'Reading should still progress', - title: 'Supporting pages should still route visitors back into the core journey.', - description: - 'Changelog, contact, legal, privacy, imprint, and retained secondary routes should feel deliberate and connected to the evaluation path instead of behaving like detached documents.', - intent: 'legal', - primaryCta: { - href: '/contact', - label: 'Book a demo', - helper: 'Move from the reading surface back into a product or trust conversation.', - variant: 'primary', - }, - }, -}; - -const headerCtaByFamily: Record = { - landing: { - href: '/contact', - label: 'Book a demo', - helper: 'Discuss the tenant governance surface with the Tenantial team.', - variant: 'secondary', - }, - trust: { - href: '/contact', - label: 'Book a demo', - helper: 'Route trust, legal, or rollout questions into one conversation.', - variant: 'secondary', - }, - content: { - href: '/contact', - label: 'Book a demo', - helper: 'Turn the reading path into a concrete next step.', - variant: 'secondary', - }, -}; - -export const canonicalCoreRoutes: SitePath[] = [ - '/', - '/platform', - '/trust', - '/changelog', - '/contact', - '/privacy', - '/imprint', -]; - -export const retainedSecondaryRoutes: SitePath[] = ['/legal', '/terms', '/solutions', '/integrations']; -export const compatibilityRoutes: SitePath[] = ['/product', '/security-trust']; -export const primaryConversionRoute: SitePath = '/contact'; -export const unpublishedEditorialCollections: CollectionName[] = ['articles']; - -export async function getSurfaceAvailability(): Promise { - const changelog = await getCollection('changelog'); - - return { - articles: false, - changelog: changelog.some((entry) => entry.data.draft !== true), - resources: false, - }; -} - -const primaryNavigationSeeds: CollectionGatedNavigationItem[] = [ - { href: '/platform', label: 'Platform', description: 'Explore the evidence-first governance surface.' }, - { href: '/solutions', label: 'Solutions', description: 'Review MSP and enterprise governance fit.' }, - { href: '/changelog', label: 'Resources', description: 'Use the changelog as the current public resource baseline.' }, - { href: '/contact', label: 'Pricing', description: 'Pricing is handled through a scoped demo conversation.' }, - { href: '/contact', label: 'Company', description: 'Contact is the current company and team introduction path.' }, -]; - -const footerNavigationGroupSeeds: FooterGroupSeed[] = [ - { - title: 'Platform', - items: [{ href: '/platform', label: 'Explore the platform' }], - }, - { - title: 'Solutions', - items: [{ href: '/solutions', label: 'Solutions' }], - }, - { - title: 'Resources', - items: [{ href: '/changelog', label: 'Changelog' }], - }, - { - title: 'Pricing', - items: [{ href: '/contact', label: 'Book a demo' }], - }, - { - title: 'Company', - items: [{ href: '/contact', label: 'Contact' }], - }, - { - title: 'Contact', - items: [{ href: '/contact', label: 'Contact' }], - }, - { - title: 'Legal', - items: [ - { href: '/legal', label: 'Legal' }, - { href: '/imprint', label: 'Imprint' }, - ], - }, - { - title: 'Privacy', - items: [{ href: '/privacy', label: 'Privacy' }], - }, - { - title: 'Security', - items: [ - { href: '/trust', label: 'Trust' }, - { href: '/terms', label: 'Terms' }, - ], - }, -]; - -function filterCollectionGatedItems( - items: CollectionGatedNavigationItem[], - availability: SurfaceAvailability, -): NavigationItem[] { - return items - .filter((item) => { - if (!item.collection) { - return true; - } - - return availability[item.collection]; - }) - .map(({ collection: _collection, ...item }) => item); -} - -export async function getPrimaryNavigation(): Promise { - const availability = await getSurfaceAvailability(); - - return filterCollectionGatedItems(primaryNavigationSeeds, availability); -} - -export async function getFooterNavigationGroups(): Promise { - const availability = await getSurfaceAvailability(); - - return footerNavigationGroupSeeds - .filter((group) => (group.collection ? availability[group.collection] : true)) - .map(({ collection: _collection, items, title }) => ({ - title, - items: filterCollectionGatedItems(items, availability), - })) - .filter((group) => group.items.length > 0); -} - -export const pageDefinitions: Record = { - '/': { - path: '/', - canonicalPath: '/', - pageRole: 'home', - family: 'landing', - shellTone: 'brand', - priority: 'required', - journeyStage: 'entry', - surfaceGroup: 'core', - inSitemap: true, - }, - '/platform': { - path: '/platform', - canonicalPath: '/platform', - pageRole: 'platform', - family: 'landing', - shellTone: 'brand', - priority: 'required', - journeyStage: 'first-clarification', - surfaceGroup: 'core', - inSitemap: true, - }, - '/product': { - path: '/product', - canonicalPath: '/platform', - pageRole: 'product', - family: 'landing', - shellTone: 'brand', - priority: 'compatibility', - journeyStage: 'first-clarification', - surfaceGroup: 'compatibility', - inSitemap: false, - }, - '/trust': { - path: '/trust', - canonicalPath: '/trust', - pageRole: 'trust', - family: 'trust', - shellTone: 'trust', - priority: 'required', - journeyStage: 'deepening', - surfaceGroup: 'core', - inSitemap: true, - }, - '/changelog': { - path: '/changelog', - canonicalPath: '/changelog', - pageRole: 'changelog', - family: 'content', - shellTone: 'neutral', - priority: 'recommended', - journeyStage: 'deepening', - surfaceGroup: 'core', - inSitemap: true, - }, - '/contact': { - path: '/contact', - canonicalPath: '/contact', - pageRole: 'contact', - family: 'content', - shellTone: 'neutral', - priority: 'required', - journeyStage: 'action', - surfaceGroup: 'core', - inSitemap: true, - }, - '/privacy': { - path: '/privacy', - canonicalPath: '/privacy', - pageRole: 'privacy', - family: 'content', - shellTone: 'neutral', - priority: 'required', - journeyStage: 'deepening', - surfaceGroup: 'legal', - inSitemap: true, - }, - '/imprint': { - path: '/imprint', - canonicalPath: '/imprint', - pageRole: 'imprint', - family: 'content', - shellTone: 'neutral', - priority: 'required', - journeyStage: 'deepening', - surfaceGroup: 'legal', - inSitemap: true, - }, - '/legal': { - path: '/legal', - canonicalPath: '/legal', - pageRole: 'legal', - family: 'content', - shellTone: 'trust', - priority: 'secondary', - journeyStage: 'deepening', - surfaceGroup: 'legal', - inSitemap: true, - }, - '/terms': { - path: '/terms', - canonicalPath: '/terms', - pageRole: 'terms', - family: 'content', - shellTone: 'neutral', - priority: 'secondary', - journeyStage: 'deepening', - surfaceGroup: 'legal', - inSitemap: true, - }, - '/solutions': { - path: '/solutions', - canonicalPath: '/solutions', - pageRole: 'solutions', - family: 'content', - shellTone: 'neutral', - priority: 'secondary', - journeyStage: 'deepening', - surfaceGroup: 'supporting', - inSitemap: true, - }, - '/integrations': { - path: '/integrations', - canonicalPath: '/integrations', - pageRole: 'integrations', - family: 'content', - shellTone: 'neutral', - priority: 'secondary', - journeyStage: 'deepening', - surfaceGroup: 'supporting', - inSitemap: true, - }, - '/security-trust': { - path: '/security-trust', - canonicalPath: '/trust', - pageRole: 'trust', - family: 'trust', - shellTone: 'trust', - priority: 'compatibility', - journeyStage: 'deepening', - surfaceGroup: 'compatibility', - inSitemap: false, - }, -}; - -export const publishedSitemapRoutes = [...canonicalCoreRoutes, ...retainedSecondaryRoutes]; - -export function getPageDefinition(path: string): PageDefinition { - return pageDefinitions[path as SitePath] ?? pageDefinitions['/']; -} - -export function getCanonicalPath(path: string): SitePath { - return getPageDefinition(path).canonicalPath; -} - -export function getPageFamily(path: string): PageFamily { - return getPageDefinition(path).family; -} - -export function getShellTone(path: string): ShellTone { - return getPageDefinition(path).shellTone; -} - -export function getHeaderCta(path: string): CtaLink { - const definition = getPageDefinition(path); - - return { - ...headerCtaByFamily[definition.family], - ...definition.headerCta, - }; -} - -export function getFooterLead(path: string): FooterLead { - const definition = getPageDefinition(path); - - return { - ...footerLeadByFamily[definition.family], - ...definition.footerLead, - }; -} - -export function isActiveNavigationPath(currentPath: string, href: string): boolean { - if (href === '/') { - return currentPath === '/'; - } - - return currentPath === href || currentPath.startsWith(`${href}/`); -} diff --git a/apps/website/src/pages/404.astro b/apps/website/src/pages/404.astro new file mode 100644 index 00000000..5caaa964 --- /dev/null +++ b/apps/website/src/pages/404.astro @@ -0,0 +1,42 @@ +--- +import MainLayout from '@/layouts/MainLayout.astro'; +import Btn404 from '@components/ui/buttons/Btn404.astro'; +import { SITE } from '@data/constants'; + +const pageTitle = `Page Not Found | ${SITE.title}`; +--- + + +
    +
    +
    +

    + 404 +

    +

    + Page not found. +

    +

    + This public Tenantial route is not available. +

    + +
    +
    +
    +
    + + diff --git a/apps/website/src/pages/blog/index.astro b/apps/website/src/pages/blog/index.astro new file mode 100644 index 00000000..ebd99ac9 --- /dev/null +++ b/apps/website/src/pages/blog/index.astro @@ -0,0 +1,3 @@ +--- +return Astro.redirect('/platform', 302); +--- diff --git a/apps/website/src/pages/changelog.astro b/apps/website/src/pages/changelog.astro deleted file mode 100644 index 63cceb4f..00000000 --- a/apps/website/src/pages/changelog.astro +++ /dev/null @@ -1,61 +0,0 @@ ---- -import { getCollection } from 'astro:content'; - -import PageShell from '@/components/layout/PageShell.astro'; -import Card from '@/components/primitives/Card.astro'; -import Container from '@/components/primitives/Container.astro'; -import Section from '@/components/primitives/Section.astro'; -import SectionHeader from '@/components/primitives/SectionHeader.astro'; -import CTASection from '@/components/sections/CTASection.astro'; -import PageHero from '@/components/sections/PageHero.astro'; -import { changelogHero, changelogSeo } from '@/content/pages/changelog'; - -const formatter = new Intl.DateTimeFormat('en', { dateStyle: 'long' }); -const entries = (await getCollection('changelog')) - .filter((entry) => entry.data.draft !== true) - .sort((left, right) => right.data.publishedAt.valueOf() - left.data.publishedAt.valueOf()); ---- - - - - -
    - -
    - - -
    - {entries.map((entry) => ( - -

    - {formatter.format(entry.data.publishedAt)} -

    -

    - {entry.data.title} -

    -

    - {entry.data.description} -

    -
    - ))} -
    -
    -
    -
    - - -
    diff --git a/apps/website/src/pages/contact.astro b/apps/website/src/pages/contact.astro index dc16f424..65c1786f 100644 --- a/apps/website/src/pages/contact.astro +++ b/apps/website/src/pages/contact.astro @@ -1,85 +1,34 @@ --- -import ContactPanel from '@/components/content/ContactPanel.astro'; -import DemoPrompt from '@/components/content/DemoPrompt.astro'; -import SecondaryCTA from '@/components/content/SecondaryCTA.astro'; -import RichText from '@/components/content/RichText.astro'; -import PageShell from '@/components/layout/PageShell.astro'; -import Card from '@/components/primitives/Card.astro'; -import Cluster from '@/components/primitives/Cluster.astro'; -import Container from '@/components/primitives/Container.astro'; -import Grid from '@/components/primitives/Grid.astro'; -import Input from '@/components/primitives/Input.astro'; -import Section from '@/components/primitives/Section.astro'; -import SectionHeader from '@/components/primitives/SectionHeader.astro'; -import Textarea from '@/components/primitives/Textarea.astro'; -import CTASection from '@/components/sections/CTASection.astro'; -import PageHero from '@/components/sections/PageHero.astro'; -import { - contactHero, - contactLegalSections, - contactPreview, - contactPrompts, - contactSeo, - contactTopics, -} from '@/content/pages/contact'; +// Import the necessary components +import MainLayout from '@/layouts/MainLayout.astro'; +import ContactSection from '@components/sections/misc/ContactSection.astro'; +import { SITE } from '@data/constants'; + +const pageTitle: string = `Contact | ${SITE.title}`; +const metaDescription = + 'Request a Tenantial walkthrough or start a scoped rollout conversation. The public website does not collect live tenant data.'; +const ogTitle = 'Contact | Tenantial'; --- - - - -
    - - - - {contactPrompts.map((prompt) => )} - - -
    - -
    - -
    - - -
    - -