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 && (
+
+ )
+}
+{/* Define the character set, description, author, and viewport settings */}
+
+
+
+
+
+
+{
+ Object.entries(languages).map(([lang, prefix]) => {
+ const cleanPath = fullPath.replace(/^\/(en)\//, '/');
+ const href = createHref(lang, prefix, cleanPath);
+ return ;
+ })
+}
+
+{/* Facebook Meta Tags */}
+
+
+
+
+
+
+
+
+
+
+
+{/* Twitter Meta Tags */}
+
+
+
+
+
+
+
+{/* Links to the webmanifest and sitemap */}
+
+{/* https://docs.astro.build/en/guides/integrations-guide/sitemap/ */}
+
+
+{/* Links for favicons */}
+
+
+
+
+
+{/* Set theme color */}
+
diff --git a/apps/website/src/components/ThemeIcon.astro b/apps/website/src/components/ThemeIcon.astro
new file mode 100644
index 00000000..be62f022
--- /dev/null
+++ b/apps/website/src/components/ThemeIcon.astro
@@ -0,0 +1,59 @@
+{/* Dark Theme Toggle Button */}
+{
+ /* This button is shown when the light theme is active, and when clicked, it switches the theme to dark */
+}
+
+ {
+ /* The SVG displayed shows an abstract icon that represents the moon (dark theme) */
+ }
+
+ {/* Light Theme Toggle Button */}
+ {
+ /* This button is hidden by default and only appears when the dark theme is active, when clicked, it switches to the light theme */
+ }
+
+
+ {
+ /* The SVG displayed shows a standard sun icon that stands for the light theme */
+ }
+
+
diff --git a/apps/website/src/components/content/AudienceRow.astro b/apps/website/src/components/content/AudienceRow.astro
deleted file mode 100644
index 7534da18..00000000
--- a/apps/website/src/components/content/AudienceRow.astro
+++ /dev/null
@@ -1,38 +0,0 @@
----
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import SecondaryCTA from '@/components/content/SecondaryCTA.astro';
-import Card from '@/components/primitives/Card.astro';
-import type { AudienceRowContent } from '@/types/site';
-
-interface Props {
- item: AudienceRowContent;
-}
-
-const { item } = Astro.props;
----
-
-
- {item.audience}
-
- {item.title}
-
-
- {item.description}
-
-
- {
- item.bullets.map((bullet) => (
-
- {bullet}
-
- ))
- }
-
- {item.cta && (
-
-
-
- )}
-
diff --git a/apps/website/src/components/content/Callout.astro b/apps/website/src/components/content/Callout.astro
deleted file mode 100644
index b55c0f89..00000000
--- a/apps/website/src/components/content/Callout.astro
+++ /dev/null
@@ -1,27 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { CalloutContent } from '@/types/site';
-
-interface Props {
- content: CalloutContent;
-}
-
-const { content } = Astro.props;
-const variant = content.tone === 'accent' ? 'accent' : content.tone === 'subtle' ? 'subtle' : 'default';
-const barTone = content.tone === 'accent' ? undefined : content.tone === 'subtle' ? 'trust' : undefined;
----
-
-
-
- {content.eyebrow && {content.eyebrow} }
-
- {content.title}
-
-
- {content.description}
-
-
-
diff --git a/apps/website/src/components/content/ContactPanel.astro b/apps/website/src/components/content/ContactPanel.astro
deleted file mode 100644
index d75dff3a..00000000
--- a/apps/website/src/components/content/ContactPanel.astro
+++ /dev/null
@@ -1,34 +0,0 @@
----
-import Button from '@/components/primitives/Button.astro';
-import Card from '@/components/primitives/Card.astro';
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import type { CtaLink } from '@/types/site';
-
-interface Props {
- cta: CtaLink;
- points: string[];
- title: string;
-}
-
-const { cta, points, title } = Astro.props;
----
-
-
- Qualified outreach
-
- {title}
-
-
- {
- points.map((point) => (
-
- {point}
-
- ))
- }
-
-
- {cta.label}
-
-
diff --git a/apps/website/src/components/content/DashboardPreview.astro b/apps/website/src/components/content/DashboardPreview.astro
deleted file mode 100644
index 8f7e9601..00000000
--- a/apps/website/src/components/content/DashboardPreview.astro
+++ /dev/null
@@ -1,1096 +0,0 @@
----
-import TenantialLogo from '@/components/content/TenantialLogo.astro';
-import { Icon } from 'astro-icon/components';
-
-const navigationItems = [
- { icon: 'lucide:layout-dashboard', label: 'Overview' },
- { icon: 'lucide:circle-alert', label: 'Findings' },
- { icon: 'lucide:file-check-2', label: 'Evidence' },
- { icon: 'lucide:git-branch', label: 'Drift' },
- { icon: 'lucide:archive-restore', label: 'Backups' },
- { icon: 'lucide:clipboard-check', label: 'Reviews' },
- { icon: 'lucide:history', label: 'Audit Trail' },
- { icon: 'lucide:building-2', label: 'Tenants' },
- { icon: 'lucide:settings', label: 'Settings' },
-];
-
-const metrics = [
- {
- label: 'Overall posture',
- value: '92%',
- status: 'Healthy',
- meta: 'Demo baseline',
- tone: 'healthy',
- },
- {
- label: 'Findings',
- value: '14',
- status: 'Review required',
- meta: 'Total',
- tone: 'warning',
- },
- {
- label: 'Drift detected',
- value: '7',
- status: 'Critical',
- meta: 'Resources',
- tone: 'critical',
- },
- {
- label: 'Evidence items',
- value: '1,248',
- status: 'Review-ready',
- meta: 'Collected',
- tone: 'evidence',
- },
- {
- label: 'Backup status',
- value: '98%',
- status: 'Healthy',
- meta: 'Successful',
- tone: 'healthy',
- },
-];
-
-const findings = [
- ['Critical', 'Guest user admin roles', 'Privileged Access', 'Sample signal'],
- ['High', 'CA policy not enforced', 'Identity', 'Sample signal'],
- ['Medium', 'SharePoint public sharing', 'Data Protection', 'Sample signal'],
- ['Low', 'Legacy auth enabled', 'Security Baseline', 'Sample signal'],
- ['Low', 'Mailbox auditing off', 'Audit & Compliance', 'Sample signal'],
-];
-
-const timeline = [
- ['Policy "Require MFA for admins" changed', 'Critical sample drift', 'Sample step 1', 'critical'],
- ['New guest user added to Global Admins', 'High sample drift', 'Sample step 2', 'warning'],
- ['Conditional Access policy updated', 'Medium sample drift', 'Sample step 3', 'warning'],
- ['SharePoint public sharing enabled', 'Low sample drift', 'Sample step 4', 'info'],
- ['MFA registration policy updated', 'No sample drift', 'Sample step 5', 'healthy'],
-];
-
-const evidenceItems = [
- { icon: 'lucide:shield-check', meta: 'Updated recently - demo value', title: 'Conditional Access policy' },
- { icon: 'lucide:user-check', meta: 'Sample admin change', title: 'Role assignment change' },
- { icon: 'lucide:share-2', meta: 'Updated recently - demo value', title: 'SharePoint sharing setting' },
- { icon: 'lucide:mail', meta: 'Updated recently - demo value', title: 'Mailbox audit configuration' },
- { icon: 'lucide:square-plus', meta: 'Sample new item', title: 'App registration added' },
-];
----
-
-
-
-
-
-
-
-
-
-
-
-
-
Governance overview
-
Static posture and activity across Microsoft tenant governance work.
-
-
Sample week
-
-
-
-
- Overall posture
-
- 92%
-
- 92%
- Healthy
-
-
-
- Findings
- 14
- Total
- Review required
- Critical 2
- High 5
- Medium 4
- Low 3
-
-
-
- Drift detected
- 7
- Resources
-
-
-
- Critical
-
-
-
- Evidence items
- 1,248
- Collected
- ▲ 18% vs sample week
- Review-ready
-
-
-
- Backup status
- 98%
- Successful
-
-
-
-
- Healthy
-
-
-
-
-
-
-
Recent findings
- Sample set
-
-
- {
- findings.map(([severity, title, area, time]) => (
-
-
-
-
{severity}
-
{time}
-
- ))
- }
-
-
-
-
-
-
Drift timeline
- Sample week
-
-
- {
- timeline.map(([title, description, time, tone]) => (
-
-
-
-
{title}
-
{description}
-
- {time}
-
- ))
- }
-
-
-
-
-
-
-
Backups and restores
- Sample values
-
-
-
-
Microsoft 365
-
Recent sample success
-
-
98%
-
-
-
-
-
-
-
-
Azure AD
-
Recent sample success
-
-
97%
-
-
-
-
-
-
-
-
-
-
Governance reviews
- Sample reviews
-
- Quarterly access review Due in 5 days
- Privileged roles review In progress
-
-
-
-
-
-
-
Evidence spotlight
- Sample evidence
-
-
- {
- evidenceItems.map((item) => (
-
-
-
-
-
{item.title}
-
{item.meta}
-
- ))
- }
-
-
-
-
-
-
-
-
-
diff --git a/apps/website/src/components/content/DemoPrompt.astro b/apps/website/src/components/content/DemoPrompt.astro
deleted file mode 100644
index 8dacf568..00000000
--- a/apps/website/src/components/content/DemoPrompt.astro
+++ /dev/null
@@ -1,23 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-
-interface Props {
- description: string;
- title: string;
-}
-
-const { description, title } = Astro.props;
----
-
-
- Conversation focus
-
- {title}
-
-
- {description}
-
-
diff --git a/apps/website/src/components/content/Eyebrow.astro b/apps/website/src/components/content/Eyebrow.astro
deleted file mode 100644
index a990b6fc..00000000
--- a/apps/website/src/components/content/Eyebrow.astro
+++ /dev/null
@@ -1,23 +0,0 @@
----
-interface Props {
- class?: string;
- tone?: 'accent' | 'neutral' | 'signal';
-}
-
-const { class: className = '', tone = 'accent' } = Astro.props;
-const toneClasses = {
- accent: 'text-[var(--color-brand)]',
- neutral: 'text-[var(--color-muted-foreground)]',
- signal: 'text-[var(--color-signal)]',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/content/FeatureItem.astro b/apps/website/src/components/content/FeatureItem.astro
deleted file mode 100644
index 77b1245b..00000000
--- a/apps/website/src/components/content/FeatureItem.astro
+++ /dev/null
@@ -1,66 +0,0 @@
----
-import { Icon } from 'astro-icon/components';
-import Card from '@/components/primitives/Card.astro';
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { FeatureItemContent } from '@/types/site';
-
-interface Props {
- item: FeatureItemContent;
-}
-
-const { item } = Astro.props;
-
-const lucideMap: Record = {
- 'shield': 'lucide:shield',
- 'database': 'lucide:database',
- 'refresh': 'lucide:refresh-cw',
- 'eye': 'lucide:eye',
- 'file-check': 'lucide:file-check',
- 'layers': 'lucide:layers',
- 'search': 'lucide:search',
- 'lock': 'lucide:lock',
- 'zap': 'lucide:zap',
- 'clipboard': 'lucide:clipboard-list',
- 'git-branch': 'lucide:git-branch',
- 'bar-chart': 'lucide:bar-chart-3',
- 'activity': 'lucide:activity',
- 'settings': 'lucide:settings',
- 'globe': 'lucide:globe',
- 'users': 'lucide:users',
- 'check-circle': 'lucide:check-circle',
- 'archive': 'lucide:archive',
- 'trending-up': 'lucide:trending-up',
- 'cpu': 'lucide:cpu',
-};
-
-const iconName = item.icon ? lucideMap[item.icon] : undefined;
----
-
-
-
- {iconName && (
-
-
-
- )}
- {item.eyebrow &&
{item.eyebrow} }
-
- {item.title}
-
-
- {item.description}
-
- {(item.meta || item.href) && (
-
- {item.meta &&
{item.meta} }
- {item.href && (
-
- Learn more
-
- )}
-
- )}
-
-
diff --git a/apps/website/src/components/content/Headline.astro b/apps/website/src/components/content/Headline.astro
deleted file mode 100644
index ca92fbbe..00000000
--- a/apps/website/src/components/content/Headline.astro
+++ /dev/null
@@ -1,22 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- size?: 'card' | 'display' | 'page' | 'section';
-}
-
-const { as = 'h2', class: className = '', size = 'section' } = Astro.props;
-const Tag = as;
-const sizeClasses = {
- display:
- 'font-[var(--font-display)] font-bold text-[length:var(--type-display-size)] leading-[var(--line-display)] tracking-[var(--tracking-display)]',
- page: 'font-[var(--font-display)] font-semibold text-[length:var(--type-page-size)] leading-[var(--line-heading)] tracking-[var(--tracking-tight)]',
- section:
- 'font-[var(--font-display)] font-semibold text-[length:var(--type-section-size)] leading-[var(--line-heading)] tracking-[var(--tracking-tight)]',
- card: 'font-medium text-[length:var(--type-card-size)] leading-[1.18] tracking-[var(--tracking-tight)]',
-};
----
-
-.accent]:text-[var(--color-primary)]', sizeClasses[size], className]}>
-
-
diff --git a/apps/website/src/components/content/IntegrationBadge.astro b/apps/website/src/components/content/IntegrationBadge.astro
deleted file mode 100644
index 0d9b1325..00000000
--- a/apps/website/src/components/content/IntegrationBadge.astro
+++ /dev/null
@@ -1,26 +0,0 @@
----
-import Badge from '@/components/primitives/Badge.astro';
-import Card from '@/components/primitives/Card.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { IntegrationEntry } from '@/types/site';
-
-interface Props {
- item: IntegrationEntry;
-}
-
-const { item } = Astro.props;
----
-
-
-
- {item.category}
-
- {item.name}
-
-
-
- {item.summary}
-
- {item.note && {item.note}
}
-
diff --git a/apps/website/src/components/content/Lead.astro b/apps/website/src/components/content/Lead.astro
deleted file mode 100644
index 847dbffc..00000000
--- a/apps/website/src/components/content/Lead.astro
+++ /dev/null
@@ -1,19 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- size?: 'body' | 'lead' | 'small';
-}
-
-const { as = 'p', class: className = '', size = 'lead' } = Astro.props;
-const Tag = as;
-const sizeClasses = {
- lead: 'text-[length:var(--type-body-size)] leading-[var(--line-body)] sm:text-lg',
- body: 'text-[length:var(--type-body-size)] leading-[var(--line-body)]',
- small: 'text-[length:var(--type-small-size)] leading-[1.65]',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/content/Metric.astro b/apps/website/src/components/content/Metric.astro
deleted file mode 100644
index 3fa32d70..00000000
--- a/apps/website/src/components/content/Metric.astro
+++ /dev/null
@@ -1,22 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { MetricItem } from '@/types/site';
-
-interface Props {
- item: MetricItem;
-}
-
-const { item } = Astro.props;
----
-
-
- {item.value}
-
- {item.label}
-
-
- {item.description}
-
-
diff --git a/apps/website/src/components/content/PrimaryCTA.astro b/apps/website/src/components/content/PrimaryCTA.astro
deleted file mode 100644
index edf7800e..00000000
--- a/apps/website/src/components/content/PrimaryCTA.astro
+++ /dev/null
@@ -1,20 +0,0 @@
----
-import Button from '@/components/primitives/Button.astro';
-import type { CtaLink } from '@/types/site';
-
-interface Props {
- cta: CtaLink;
- class?: string;
- showHelper?: boolean;
- size?: 'lg' | 'md' | 'sm';
-}
-
-const { cta, class: className = '', showHelper = false, size = 'md' } = Astro.props;
----
-
-
-
- {cta.label}
-
- {showHelper && cta.helper &&
{cta.helper}
}
-
diff --git a/apps/website/src/components/content/RichText.astro b/apps/website/src/components/content/RichText.astro
deleted file mode 100644
index 50b53d10..00000000
--- a/apps/website/src/components/content/RichText.astro
+++ /dev/null
@@ -1,32 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { LegalSection } from '@/types/site';
-
-interface Props {
- sections: LegalSection[];
-}
-
-const { sections } = Astro.props;
----
-
-
- {
- sections.map((section) => (
-
-
- {section.title}
-
-
- {section.body.map((paragraph) =>
{paragraph} )}
- {section.bullets && section.bullets.length > 0 && (
-
- {section.bullets.map((bullet) => {bullet} )}
-
- )}
-
-
- ))
- }
-
diff --git a/apps/website/src/components/content/SecondaryCTA.astro b/apps/website/src/components/content/SecondaryCTA.astro
deleted file mode 100644
index 3372f0b5..00000000
--- a/apps/website/src/components/content/SecondaryCTA.astro
+++ /dev/null
@@ -1,20 +0,0 @@
----
-import Button from '@/components/primitives/Button.astro';
-import type { CtaLink } from '@/types/site';
-
-interface Props {
- cta: CtaLink;
- class?: string;
- showHelper?: boolean;
- size?: 'lg' | 'md' | 'sm';
-}
-
-const { cta, class: className = '', showHelper = false, size = 'md' } = Astro.props;
----
-
-
-
- {cta.label}
-
- {showHelper && cta.helper &&
{cta.helper}
}
-
diff --git a/apps/website/src/components/content/TenantialLogo.astro b/apps/website/src/components/content/TenantialLogo.astro
deleted file mode 100644
index bb4b5ca1..00000000
--- a/apps/website/src/components/content/TenantialLogo.astro
+++ /dev/null
@@ -1,35 +0,0 @@
----
-interface Props {
- class?: string;
- imageClass?: string;
- invert?: boolean;
- label?: string;
- markClass?: string;
-}
-
-const {
- class: className = '',
- imageClass,
- invert = true,
- label = 'Tenantial',
- markClass = 'h-9 w-9',
-} = Astro.props;
-
-const resolvedImageClass = imageClass ?? markClass;
----
-
-
-
-
diff --git a/apps/website/src/components/content/TrustPrincipleCard.astro b/apps/website/src/components/content/TrustPrincipleCard.astro
deleted file mode 100644
index f1d542b3..00000000
--- a/apps/website/src/components/content/TrustPrincipleCard.astro
+++ /dev/null
@@ -1,24 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import type { TrustPrincipleContent } from '@/types/site';
-
-interface Props {
- item: TrustPrincipleContent;
-}
-
-const { item } = Astro.props;
----
-
-
-
-
- {item.title}
-
-
- {item.description}
-
- {item.note && {item.note} }
-
-
diff --git a/apps/website/src/components/layout/Footer.astro b/apps/website/src/components/layout/Footer.astro
deleted file mode 100644
index e1c9daa3..00000000
--- a/apps/website/src/components/layout/Footer.astro
+++ /dev/null
@@ -1,95 +0,0 @@
----
-import PrimaryCTA from '@/components/content/PrimaryCTA.astro';
-import TenantialLogo from '@/components/content/TenantialLogo.astro';
-import Container from '@/components/primitives/Container.astro';
-import { getFooterLead, getFooterNavigationGroups, siteMetadata } from '@/lib/site';
-
-interface Props {
- currentPath: string;
-}
-
-const { currentPath: _currentPath } = Astro.props;
-const currentYear = new Date().getFullYear();
-const footerLead = getFooterLead(_currentPath);
-const footerNavigationGroups = await getFooterNavigationGroups();
-const isQuietFooter = _currentPath === '/platform';
----
-
-
-
- {isQuietFooter ? (
-
-
-
-
- Evidence-first governance for Microsoft tenants.
-
-
-
-
- {
- footerNavigationGroups.map((group) => (
-
-
- {group.title}
-
-
- {group.items.map((item) => (
-
-
- {item.label}
-
-
- ))}
-
-
- ))
- }
-
-
- ) : (
-
-
-
- {footerLead.eyebrow}
-
-
- {footerLead.title}
-
-
- {footerLead.description}
-
-
-
-
-
- {
- footerNavigationGroups.map((group) => (
-
-
- {group.title}
-
-
- {group.items.map((item) => (
-
-
- {item.label}
-
-
- ))}
-
-
- ))
- }
-
-
- )}
-
-
-
© {currentYear} {siteMetadata.siteName}. Evidence-first governance for Microsoft tenants.
-
- Static public website with sample preview values only.
-
-
-
-
diff --git a/apps/website/src/components/layout/Navbar.astro b/apps/website/src/components/layout/Navbar.astro
deleted file mode 100644
index a4c08eab..00000000
--- a/apps/website/src/components/layout/Navbar.astro
+++ /dev/null
@@ -1,116 +0,0 @@
----
-import PrimaryCTA from '@/components/content/PrimaryCTA.astro';
-import TenantialLogo from '@/components/content/TenantialLogo.astro';
-import Container from '@/components/primitives/Container.astro';
-import { getHeaderCta, getPrimaryNavigation, isActiveNavigationPath, siteMetadata } from '@/lib/site';
-
-interface Props {
- currentPath: string;
-}
-
-const { currentPath } = Astro.props;
-const headerCta = getHeaderCta(currentPath);
-const primaryNavigation = await getPrimaryNavigation();
----
-
-
-
-
-
-
-
-
-
- {
- primaryNavigation.map((item) => (
-
- {item.label}
-
- ))
- }
-
-
-
-
-
-
- Open navigation menu
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/website/src/components/layout/PageShell.astro b/apps/website/src/components/layout/PageShell.astro
deleted file mode 100644
index 82ef0138..00000000
--- a/apps/website/src/components/layout/PageShell.astro
+++ /dev/null
@@ -1,55 +0,0 @@
----
-import Footer from '@/components/layout/Footer.astro';
-import Navbar from '@/components/layout/Navbar.astro';
-import { getPageDefinition } from '@/lib/site';
-import { resolveSeo } from '@/lib/seo';
-import BaseLayout from '@/layouts/BaseLayout.astro';
-
-interface Props {
- currentPath: string;
- description?: string;
- title?: string;
-}
-
-const { currentPath, description, title } = Astro.props;
-const seo =
- title && description
- ? resolveSeo({ description, path: currentPath, title })
- : undefined;
-const pageDefinition = getPageDefinition(currentPath);
----
-
-
-
-
- {
- pageDefinition.pageRole === 'home' && (
- <>
-
-
- >
- )
- }
-
-
-
-
-
-
-
diff --git a/apps/website/src/components/primitives/Badge.astro b/apps/website/src/components/primitives/Badge.astro
deleted file mode 100644
index db24ae0d..00000000
--- a/apps/website/src/components/primitives/Badge.astro
+++ /dev/null
@@ -1,26 +0,0 @@
----
-interface Props {
- class?: string;
- tone?: 'accent' | 'neutral' | 'signal' | 'warm';
-}
-
-const { class: className = '', tone = 'accent' } = Astro.props;
-
-const toneClasses = {
- accent: 'bg-[var(--color-accent)] text-[var(--color-accent-foreground)]',
- neutral: 'bg-white/78 text-[var(--color-ink-800)]',
- signal: 'bg-[var(--surface-trust)] text-[var(--color-signal)]',
- warm: 'bg-[rgba(175,109,67,0.14)] text-[var(--color-warm)]',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Button.astro b/apps/website/src/components/primitives/Button.astro
deleted file mode 100644
index 6876abba..00000000
--- a/apps/website/src/components/primitives/Button.astro
+++ /dev/null
@@ -1,72 +0,0 @@
----
-import type { ButtonVariant } from '@/types/site';
-
-interface Props {
- ariaLabel?: string;
- class?: string;
- href?: string;
- rel?: string;
- size?: 'lg' | 'md' | 'sm';
- target?: '_blank' | '_self';
- type?: 'button' | 'reset' | 'submit';
- variant?: ButtonVariant;
-}
-
-const {
- ariaLabel,
- class: className = '',
- href,
- rel,
- size = 'md',
- target,
- type = 'button',
- variant = 'primary',
-} = Astro.props;
-
-const baseClass =
- 'inline-flex items-center justify-center rounded-[var(--radius-pill)] border font-semibold tracking-[var(--tracking-tight)] transition-all duration-200 cursor-pointer';
-
-const sizeClasses = {
- sm: 'min-h-10 px-5 text-sm',
- md: 'min-h-12 px-6 text-[0.95rem]',
- lg: 'min-h-14 px-8 text-base',
-};
-
-const variantClasses = {
- primary:
- 'border-transparent bg-[var(--color-primary)] text-[var(--color-primary-foreground)] shadow-[0_2px_14px_rgba(111,229,191,0.2)] hover:bg-[var(--color-mint-300)] hover:shadow-[0_4px_20px_rgba(111,229,191,0.26)] active:scale-[0.98]',
- secondary:
- 'border-[color:var(--color-border)] bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:border-[var(--color-border-strong)] hover:bg-[var(--surface-muted-strong)] active:scale-[0.98]',
- ghost: 'border-transparent bg-transparent text-[var(--color-muted-foreground)] hover:bg-[var(--surface-muted)] hover:text-[var(--color-foreground)]',
-};
-
-const classes = [baseClass, sizeClasses[size], variantClasses[variant], className];
----
-
-{
- href ? (
-
-
-
- ) : (
-
-
-
- )
-}
diff --git a/apps/website/src/components/primitives/Card.astro b/apps/website/src/components/primitives/Card.astro
deleted file mode 100644
index e99c9c3f..00000000
--- a/apps/website/src/components/primitives/Card.astro
+++ /dev/null
@@ -1,27 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- hoverable?: boolean;
- variant?: 'accent' | 'default' | 'subtle';
- [key: string]: unknown;
-}
-
-const { as = 'article', class: className = '', hoverable = false, variant = 'default', ...rest } = Astro.props;
-
-const variantClasses = {
- default: 'surface-card',
- accent: 'surface-card-accent',
- subtle: 'surface-card-muted',
-};
-
-const Tag = as;
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Cluster.astro b/apps/website/src/components/primitives/Cluster.astro
deleted file mode 100644
index 14190565..00000000
--- a/apps/website/src/components/primitives/Cluster.astro
+++ /dev/null
@@ -1,30 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- gap?: 'lg' | 'md' | 'sm';
- justify?: 'between' | 'end' | 'start';
-}
-
-const {
- as = 'div',
- class: className = '',
- gap = 'md',
- justify = 'start',
-} = Astro.props;
-const Tag = as;
-const gapClasses = {
- sm: 'gap-[var(--space-cluster-sm)]',
- md: 'gap-[var(--space-cluster)]',
- lg: 'gap-[var(--space-cluster-lg)]',
-};
-const justifyClasses = {
- start: 'justify-start',
- between: 'justify-between',
- end: 'justify-end',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Container.astro b/apps/website/src/components/primitives/Container.astro
deleted file mode 100644
index cb9e64fd..00000000
--- a/apps/website/src/components/primitives/Container.astro
+++ /dev/null
@@ -1,32 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- width?: 'content' | 'measure' | 'wide';
- wide?: boolean;
-}
-
-const {
- as = 'div',
- class: className = '',
- width,
- wide = false,
-} = Astro.props;
-const Tag = as;
-const resolvedWidth = width ?? (wide ? 'wide' : 'content');
-const widthClasses = {
- content: 'max-w-[var(--content-max-width)]',
- measure: 'max-w-[var(--reading-max-width)]',
- wide: 'max-w-[var(--wide-max-width)]',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Grid.astro b/apps/website/src/components/primitives/Grid.astro
deleted file mode 100644
index 422e2450..00000000
--- a/apps/website/src/components/primitives/Grid.astro
+++ /dev/null
@@ -1,23 +0,0 @@
----
-interface Props {
- class?: string;
- cols?: '2' | '3' | '4';
- gap?: 'lg' | 'md';
-}
-
-const { class: className = '', cols = '3', gap = 'md' } = Astro.props;
-
-const colClasses = {
- '2': 'grid-cols-1 md:grid-cols-2',
- '3': 'grid-cols-1 md:grid-cols-2 xl:grid-cols-3',
- '4': 'grid-cols-1 md:grid-cols-2 xl:grid-cols-4',
-};
-const gapClasses = {
- md: 'gap-[var(--space-grid)] lg:gap-[var(--space-grid-lg)]',
- lg: 'gap-6 lg:gap-8',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Input.astro b/apps/website/src/components/primitives/Input.astro
deleted file mode 100644
index 055e9b22..00000000
--- a/apps/website/src/components/primitives/Input.astro
+++ /dev/null
@@ -1,33 +0,0 @@
----
-interface Props {
- class?: string;
- name?: string;
- placeholder?: string;
- readonly?: boolean;
- type?: string;
- value?: string;
-}
-
-const {
- class: className = '',
- name,
- placeholder,
- readonly = false,
- type = 'text',
- value,
-} = Astro.props;
----
-
-
diff --git a/apps/website/src/components/primitives/Section.astro b/apps/website/src/components/primitives/Section.astro
deleted file mode 100644
index a5a39f35..00000000
--- a/apps/website/src/components/primitives/Section.astro
+++ /dev/null
@@ -1,47 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- density?: 'base' | 'compact' | 'spacious';
- id?: string;
- layer?: '1' | '2' | '3';
- tone?: 'default' | 'emphasis' | 'muted' | 'tinted' | 'warm';
- [key: string]: unknown;
-}
-
-const {
- as = 'section',
- class: className = '',
- density = 'base',
- id,
- layer = '2',
- tone = 'default',
- ...rest
-} = Astro.props;
-const Tag = as;
-const densityClasses = {
- compact: 'section-density-compact',
- base: 'section-density-base',
- spacious: 'section-density-spacious',
-};
-const toneClasses = {
- default: '',
- muted: 'section-shell-muted px-3 sm:px-4',
- emphasis: 'section-shell-emphasis px-3 sm:px-4',
- tinted: 'section-tinted px-3 sm:px-4',
- warm: 'section-warm px-3 sm:px-4',
-};
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/SectionHeader.astro b/apps/website/src/components/primitives/SectionHeader.astro
deleted file mode 100644
index 50c8f4d2..00000000
--- a/apps/website/src/components/primitives/SectionHeader.astro
+++ /dev/null
@@ -1,36 +0,0 @@
----
-import Eyebrow from '@/components/content/Eyebrow.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-
-interface Props {
- align?: 'center' | 'left';
- class?: string;
- description?: string;
- eyebrow?: string;
- title: string;
- titleHtml?: string;
- width?: 'default' | 'measure' | 'wide';
-}
-
-const {
- align = 'left',
- class: className = '',
- description,
- eyebrow,
- title,
- titleHtml,
- width = 'default',
-} = Astro.props;
-const widthClasses = {
- default: 'max-w-3xl',
- measure: 'max-w-[var(--reading-max-width)]',
- wide: 'max-w-4xl',
-};
----
-
-
- {eyebrow && {eyebrow} }
- {titleHtml ? : {title} }
- {description && {description} }
-
diff --git a/apps/website/src/components/primitives/Stack.astro b/apps/website/src/components/primitives/Stack.astro
deleted file mode 100644
index 8f427fb4..00000000
--- a/apps/website/src/components/primitives/Stack.astro
+++ /dev/null
@@ -1,20 +0,0 @@
----
-interface Props {
- as?: keyof HTMLElementTagNameMap;
- class?: string;
- gap?: 'lg' | 'md' | 'sm' | 'xl';
-}
-
-const { as = 'div', class: className = '', gap = 'md' } = Astro.props;
-const gapClasses = {
- sm: 'flex flex-col gap-[var(--space-stack-sm)]',
- md: 'flex flex-col gap-[var(--space-stack)]',
- lg: 'flex flex-col gap-[var(--space-stack-lg)]',
- xl: 'flex flex-col gap-10',
-};
-const Tag = as;
----
-
-
-
-
diff --git a/apps/website/src/components/primitives/Textarea.astro b/apps/website/src/components/primitives/Textarea.astro
deleted file mode 100644
index 2955436e..00000000
--- a/apps/website/src/components/primitives/Textarea.astro
+++ /dev/null
@@ -1,32 +0,0 @@
----
-interface Props {
- class?: string;
- name?: string;
- placeholder?: string;
- readonly?: boolean;
- rows?: number;
- value?: string;
-}
-
-const {
- class: className = '',
- name,
- placeholder,
- readonly = false,
- rows = 5,
- value,
-} = Astro.props;
----
-
-
diff --git a/apps/website/src/components/sections/CTASection.astro b/apps/website/src/components/sections/CTASection.astro
deleted file mode 100644
index 4fc08568..00000000
--- a/apps/website/src/components/sections/CTASection.astro
+++ /dev/null
@@ -1,33 +0,0 @@
----
-import SecondaryCTA from '@/components/content/SecondaryCTA.astro';
-import PrimaryCTA from '@/components/content/PrimaryCTA.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 type { CtaLink } from '@/types/site';
-
-interface Props {
- description: string;
- eyebrow?: string;
- primary: CtaLink;
- secondary?: CtaLink;
- title: string;
-}
-
-const { description, eyebrow, primary, secondary, title } = Astro.props;
----
-
-
diff --git a/apps/website/src/components/sections/CapabilityGrid.astro b/apps/website/src/components/sections/CapabilityGrid.astro
deleted file mode 100644
index cc18609c..00000000
--- a/apps/website/src/components/sections/CapabilityGrid.astro
+++ /dev/null
@@ -1,60 +0,0 @@
----
-import Badge from '@/components/primitives/Badge.astro';
-import Card from '@/components/primitives/Card.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { CapabilityClusterContent } from '@/types/site';
-
-interface Props {
- description?: string;
- eyebrow?: string;
- items: CapabilityClusterContent[];
- title: string;
- titleHtml?: string;
-}
-
-const { description, eyebrow, items, title, titleHtml } = Astro.props;
----
-
-
-
-
-
-
- {items.map((cluster) => (
-
-
-
-
- {cluster.title}
-
- {cluster.meta && (
- {cluster.meta}
- )}
-
-
- {cluster.description}
-
-
- {cluster.capabilities.map((cap) => (
-
- {cap}
-
- ))}
-
- {cluster.href && (
-
- Learn more →
-
- )}
-
-
- ))}
-
-
-
-
diff --git a/apps/website/src/components/sections/FeatureGrid.astro b/apps/website/src/components/sections/FeatureGrid.astro
deleted file mode 100644
index 6a0a6e0c..00000000
--- a/apps/website/src/components/sections/FeatureGrid.astro
+++ /dev/null
@@ -1,30 +0,0 @@
----
-import FeatureItem from '@/components/content/FeatureItem.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { FeatureItemContent } from '@/types/site';
-
-interface Props {
- description?: string;
- eyebrow?: string;
- items: FeatureItemContent[];
- title: string;
- titleHtml?: string;
- tone?: 'default' | 'tinted';
-}
-
-const { description, eyebrow, items, title, titleHtml, tone = 'default' } = Astro.props;
----
-
-
-
-
-
-
- {items.map((item) => )}
-
-
-
-
diff --git a/apps/website/src/components/sections/FeaturePillars.astro b/apps/website/src/components/sections/FeaturePillars.astro
deleted file mode 100644
index 773fd80a..00000000
--- a/apps/website/src/components/sections/FeaturePillars.astro
+++ /dev/null
@@ -1,70 +0,0 @@
----
-import { Icon } from 'astro-icon/components';
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { FeatureItemContent } from '@/types/site';
-
-interface Props {
- items: FeatureItemContent[];
-}
-
-const { items } = Astro.props;
-
-const lucideMap: Record = {
- archive: 'lucide:archive',
- refresh: 'lucide:refresh-cw',
- 'git-branch': 'lucide:git-branch',
- 'file-check': 'lucide:file-check',
- clipboard: 'lucide:clipboard-list',
- shield: 'lucide:shield-check',
-};
----
-
-
-
-
-
-
-
- {
- items.map((item) => {
- const iconName = item.icon ? lucideMap[item.icon] : undefined;
-
- return (
-
-
- {iconName && (
-
-
-
- )}
-
-
- {item.title}
-
-
- {item.description}
-
- {item.meta && (
-
- {item.meta}
-
- )}
-
-
-
- );
- })
- }
-
-
-
-
diff --git a/apps/website/src/components/sections/LogoStrip.astro b/apps/website/src/components/sections/LogoStrip.astro
deleted file mode 100644
index 1f07b75f..00000000
--- a/apps/website/src/components/sections/LogoStrip.astro
+++ /dev/null
@@ -1,44 +0,0 @@
----
-import IntegrationBadge from '@/components/content/IntegrationBadge.astro';
-import Badge from '@/components/primitives/Badge.astro';
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import type { IntegrationEntry, LogoStripItem } from '@/types/site';
-
-interface Props {
- eyebrow?: string;
- items: (IntegrationEntry | LogoStripItem)[];
- title: string;
-}
-
-const { eyebrow, items, title } = Astro.props;
----
-
-
-
-
-
-
- {eyebrow && {eyebrow} }
-
- {title}
-
-
-
- {
- items.map((item) => (
-
- ))
- }
-
-
-
-
-
diff --git a/apps/website/src/components/sections/OutcomeSection.astro b/apps/website/src/components/sections/OutcomeSection.astro
deleted file mode 100644
index 9cf50cf2..00000000
--- a/apps/website/src/components/sections/OutcomeSection.astro
+++ /dev/null
@@ -1,42 +0,0 @@
----
-import Card from '@/components/primitives/Card.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { OutcomeSectionContent } from '@/types/site';
-
-interface Props {
- content: OutcomeSectionContent;
- titleHtml?: string;
-}
-
-const { content, titleHtml } = Astro.props;
----
-
-
-
-
-
-
- {content.outcomes.map((outcome) => (
-
-
- {outcome.title}
-
-
- {outcome.description}
-
-
- ))}
-
-
-
-
diff --git a/apps/website/src/components/sections/PageHero.astro b/apps/website/src/components/sections/PageHero.astro
deleted file mode 100644
index f9fc7683..00000000
--- a/apps/website/src/components/sections/PageHero.astro
+++ /dev/null
@@ -1,240 +0,0 @@
----
-import Badge from '@/components/primitives/Badge.astro';
-import Card from '@/components/primitives/Card.astro';
-import Cluster from '@/components/primitives/Cluster.astro';
-import Container from '@/components/primitives/Container.astro';
-import DashboardPreview from '@/components/content/DashboardPreview.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import Metric from '@/components/content/Metric.astro';
-import PrimaryCTA from '@/components/content/PrimaryCTA.astro';
-import SecondaryCTA from '@/components/content/SecondaryCTA.astro';
-import { Icon } from 'astro-icon/components';
-import type { HeroContent, MetricItem } from '@/types/site';
-
-interface Props {
- calloutDescription?: string;
- calloutTitle?: string;
- hero: HeroContent;
- metrics?: MetricItem[];
-}
-
-const { calloutDescription, calloutTitle, hero, metrics = [] } = Astro.props;
-const isHomepageHero = Astro.url.pathname === '/';
-const heroHeadlineSize = isHomepageHero ? 'page' : 'display';
-const heroLeadSize = isHomepageHero ? 'body' : 'lead';
-const heroPrimaryAnchor = hero.primaryAnchor ?? 'headline';
-const trustSignalIcons = ['lucide:shield-check', 'lucide:lock', 'lucide:check-circle'];
-const audienceLabels = ['MSP operators', 'Endpoint teams', 'Security reviewers', 'Audit owners', 'Cloud operations'];
----
-
-
-
- {isHomepageHero ? (
-
-
-
-
-
-
- {hero.eyebrow}
-
-
-
-
- {hero.titleHtml ? : hero.title}
-
-
-
-
- {hero.description}
-
-
-
-
- {(hero.primaryCta || hero.secondaryCta) && (
-
-
-
- {hero.secondaryCta && (
-
- )}
-
-
- )}
-
- {hero.trustSubclaims && hero.trustSubclaims.length > 0 && (
-
-
- {hero.trustSubclaims.map((claim, index) => (
-
-
- {claim}
-
- ))}
-
-
-
- Built for operator-led teams
-
-
- {audienceLabels.map((label) => (
-
- {label}
-
- ))}
-
-
-
- )}
-
-
-
-
-
-
- ) : (
-
-
-
-
-
-
- {hero.eyebrow}
-
-
-
-
- {hero.titleHtml ? : hero.title}
-
-
-
-
- {hero.description}
-
-
-
-
- {(hero.primaryCta || hero.secondaryCta) && (
-
-
-
- {hero.secondaryCta && (
-
- )}
-
-
- )}
- {hero.highlights && hero.highlights.length > 0 && !hero.trustSubclaims?.length && (
-
- {hero.highlights.map((highlight) => (
-
- {highlight}
-
- ))}
-
- )}
-
-
-
-
- {hero.productVisual && (
-
-
-
- )}
-
- {hero.trustSubclaims && hero.trustSubclaims.length > 0 && (
-
-
-
- Early trust
-
-
- {hero.trustSubclaims.map((claim) => (
-
- {claim}
-
- ))}
-
-
-
- )}
-
- {!hero.productVisual && (calloutTitle || calloutDescription) && (
-
-
- Trust-first launch surface
-
- {calloutTitle && (
-
- {calloutTitle}
-
- )}
- {calloutDescription && (
- {calloutDescription}
- )}
-
- )}
-
- {metrics.length > 0 && (
-
- {metrics.map((metric) => )}
-
- )}
-
-
- )}
-
-
diff --git a/apps/website/src/components/sections/ProgressTeaser.astro b/apps/website/src/components/sections/ProgressTeaser.astro
deleted file mode 100644
index 779a4404..00000000
--- a/apps/website/src/components/sections/ProgressTeaser.astro
+++ /dev/null
@@ -1,53 +0,0 @@
----
-import Badge from '@/components/primitives/Badge.astro';
-import Card from '@/components/primitives/Card.astro';
-import Container from '@/components/primitives/Container.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import PrimaryCTA from '@/components/content/PrimaryCTA.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { ProgressTeaserContent } from '@/types/site';
-
-interface Props {
- content: ProgressTeaserContent;
-}
-
-const { content } = Astro.props;
-
-function formatDate(date: Date): string {
- return date.toLocaleDateString('en-US', {
- year: 'numeric',
- month: 'short',
- day: 'numeric',
- });
-}
----
-
-
-
-
-
-
- {content.entries.map((entry) => (
-
- {formatDate(entry.date)}
-
-
- {entry.title}
-
-
- {entry.description}
-
-
-
- ))}
-
-
-
-
-
diff --git a/apps/website/src/components/sections/TrustBar.astro b/apps/website/src/components/sections/TrustBar.astro
deleted file mode 100644
index 875ba8fb..00000000
--- a/apps/website/src/components/sections/TrustBar.astro
+++ /dev/null
@@ -1,30 +0,0 @@
----
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import type { TrustPrincipleContent } from '@/types/site';
-
-interface Props {
- statements: TrustPrincipleContent[];
-}
-
-const { statements } = Astro.props;
----
-
-
-
-
- {
- statements.map((statement) => (
-
-
- {statement.title}
-
-
- {statement.description}
-
-
- ))
- }
-
-
-
diff --git a/apps/website/src/components/sections/TrustGrid.astro b/apps/website/src/components/sections/TrustGrid.astro
deleted file mode 100644
index 782f4f4e..00000000
--- a/apps/website/src/components/sections/TrustGrid.astro
+++ /dev/null
@@ -1,29 +0,0 @@
----
-import TrustPrincipleCard from '@/components/content/TrustPrincipleCard.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import type { TrustPrincipleContent } from '@/types/site';
-
-interface Props {
- description?: string;
- eyebrow?: string;
- items: TrustPrincipleContent[];
- title: string;
- titleHtml?: string;
-}
-
-const { description, eyebrow, items, title, titleHtml } = Astro.props;
----
-
-
-
-
-
-
- {items.map((item) => )}
-
-
-
-
diff --git a/apps/website/src/components/sections/features/FeaturesGeneral.astro b/apps/website/src/components/sections/features/FeaturesGeneral.astro
new file mode 100644
index 00000000..24b9015b
--- /dev/null
+++ b/apps/website/src/components/sections/features/FeaturesGeneral.astro
@@ -0,0 +1,80 @@
+---
+// Import the necessary dependencies
+import { Image } from 'astro:assets';
+import IconBlock from '@components/ui/blocks/IconBlock.astro';
+import Icon from '@components/ui/icons/Icon.astro';
+
+interface Feature {
+ heading: string;
+ content: string;
+ svg: string;
+}
+
+interface Props {
+ title?: string;
+ subTitle?: string;
+ features?: Feature[];
+ src?: any;
+ alt?: string;
+}
+// Define props from Astro
+const { title, subTitle, src, alt, features } = Astro.props;
+---
+
+
+ {/* Block to display the feature image */}
+
+ {
+ src && alt && (
+
+ )
+ }
+
+
+ {
+ /* Displaying the main content consisting of title, subtitle, and several `IconBlock` components */
+ }
+
+ {/* Block for title and subtitle */}
+
+ {/* Rendering title */}
+
+ {title}
+
+ {/* Rendering subtitle */}
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+
+
+ {/* Block to display the IconBlock components */}
+
+
+ {/* Injecting IconBlock components with different properties */}
+ {
+ features &&
+ features.map(feature => (
+
+
+
+ ))
+ }
+
+
+
+
diff --git a/apps/website/src/components/sections/features/FeaturesNavs.astro b/apps/website/src/components/sections/features/FeaturesNavs.astro
new file mode 100644
index 00000000..0ceed963
--- /dev/null
+++ b/apps/website/src/components/sections/features/FeaturesNavs.astro
@@ -0,0 +1,97 @@
+---
+// Import the necessary dependencies
+import TabNav from '@components/ui/blocks/TabNav.astro';
+import TabContent from '@components/ui/blocks/TabContent.astro';
+import Icon from '@components/ui/icons/Icon.astro';
+
+// Define props from Astro
+const { title, tabs } = Astro.props;
+
+// Define TypeScript interface for tab object
+interface Tab {
+ heading: string;
+ content: string;
+ svg: string;
+ src: any;
+ alt: string;
+ first?: boolean;
+ second?: boolean;
+}
+
+// Define TypeScript interface for props
+interface Props {
+ title?: string;
+ tabs: Tab[];
+}
+---
+
+
+
+
+ {/* Section's heading and tab navigation */}
+
+
+ {
+ /* About Fragment: https://docs.astro.build/en/basics/astro-syntax/#fragments */
+ }
+
+
+ {
+ /* Tab navigation - use the attribute 'first' in the first TabNav for the component to work */
+ }
+
+ {
+ tabs.map((tab, index) => (
+
+
+
+ ))
+ }
+
+
+
+ {
+ /* Contents for each tab - the 'first' attribute should be used in the first tab for that tab to be initially visible, 'second' changes the styles */
+ }
+
+
+
+ {
+ tabs.map((tab, index) => (
+
+ ))
+ }
+
+
+
+
+
+
+ {/* Decorative background and sizing */}
+
+
+
+
+
diff --git a/apps/website/src/components/sections/features/FeaturesStats.astro b/apps/website/src/components/sections/features/FeaturesStats.astro
new file mode 100644
index 00000000..2649b5e2
--- /dev/null
+++ b/apps/website/src/components/sections/features/FeaturesStats.astro
@@ -0,0 +1,62 @@
+---
+// Import the necessary components
+import StatsBig from '@components/ui/blocks/StatsBig.astro';
+import StatsSmall from '@components/ui/blocks/StatsSmall.astro';
+
+const { title, subTitle, stats, mainStatTitle, mainStatSubTitle } = Astro.props;
+
+interface Props {
+ title: string;
+ subTitle?: string;
+ mainStatTitle: string;
+ mainStatSubTitle: string;
+ stats?: Stat[];
+}
+
+// TypeScript type for the statistics
+type Stat = {
+ stat: string;
+ description: string;
+};
+---
+
+
+
+ {/* Main title */}
+
+ {/* Subtitle */}
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+
+ {/* Grid container for statistics */}
+
+ {/* First grid item, showing a big statistics */}
+
+
+
+ {/* Second grid item, showing multiple small statistics */}
+ {
+ stats && (
+
+
+ {/* Iterate over the 'stats' array and create a 'StatsSmall' component for each object in the array */}
+ {stats.map(stat => (
+
+ ))}
+
+
+ )
+ }
+
+
diff --git a/apps/website/src/components/sections/features/FeaturesStatsAlt.astro b/apps/website/src/components/sections/features/FeaturesStatsAlt.astro
new file mode 100644
index 00000000..0b80b092
--- /dev/null
+++ b/apps/website/src/components/sections/features/FeaturesStatsAlt.astro
@@ -0,0 +1,60 @@
+---
+import { Image } from 'astro:assets';
+import product5 from '@images/features-image.avif';
+
+// Define props from Astro
+const { title, subTitle, benefits } = Astro.props;
+
+// Define TypeScript interface for props
+interface Props {
+ title: string;
+ subTitle?: string;
+ benefits?: Array;
+}
+
+// Define SVG marker to be used in the component
+const ListItemMarker: string = ` `;
+---
+
+
+ {/* Grid */}
+
+
+
+
+
+
+
+
+ {title}
+
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+
+ {
+ benefits && (
+
+ {benefits.map(item => (
+
+
+
+ {item}
+
+
+ ))}
+
+ )
+ }
+
+
+
+
diff --git a/apps/website/src/components/sections/landing/ClientsSection.astro b/apps/website/src/components/sections/landing/ClientsSection.astro
new file mode 100644
index 00000000..33b0a3e4
--- /dev/null
+++ b/apps/website/src/components/sections/landing/ClientsSection.astro
@@ -0,0 +1,49 @@
+---
+// Define props from Astro
+const { title, subTitle, partners } = Astro.props;
+
+interface Partner {
+ icon: any;
+ name?: string;
+ href?: string;
+}
+
+// Define TypeScript interface for props
+interface Props {
+ title: string;
+ subTitle?: string;
+ partners: Partner[];
+}
+---
+
+
+ {/* Title and description */}
+
+
+ {title}
+
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+
+
+ {/* Clients Group SVGs */}
+ {
+ partners.map(partner => (
+
+
+
+ ))
+ }
+
+
diff --git a/apps/website/src/components/sections/landing/HeroSection.astro b/apps/website/src/components/sections/landing/HeroSection.astro
new file mode 100644
index 00000000..5ea47f48
--- /dev/null
+++ b/apps/website/src/components/sections/landing/HeroSection.astro
@@ -0,0 +1,112 @@
+---
+// Import the necessary dependencies
+import { Image } from 'astro:assets';
+import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro';
+import SecondaryCTA from '@components/ui/buttons/SecondaryCTA.astro';
+import ReviewComponent from '@components/ui/blocks/ReviewComponent.astro';
+
+// Define props from Astro
+const {
+ title,
+ subTitle,
+ primaryBtn,
+ primaryBtnURL,
+ secondaryBtn,
+ secondaryBtnURL,
+ withReview,
+ avatars,
+ starCount,
+ rating,
+ reviews,
+ src,
+ alt,
+} = Astro.props;
+
+// Define TypeScript interface for props
+interface Props {
+ title: string;
+ subTitle?: string;
+ primaryBtn?: string;
+ primaryBtnURL?: string;
+ secondaryBtn?: string;
+ secondaryBtnURL?: string;
+ withReview?: boolean;
+ avatars?: Array;
+ starCount?: number;
+ rating?: string;
+ reviews?: string;
+ src?: any;
+ alt?: string;
+}
+---
+
+{/* Defining a grid container that holds all the content */}
+
+ {/* Title and description */}
+
+ {
+ /* Each h1 and p tag renders a portion of the title and subTitle defined above */
+ }
+
+ {
+ /* About Fragment: https://docs.astro.build/en/basics/astro-syntax/#fragments */
+ }
+
+
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+ {
+ /* Action Button Section: This section includes two CTAs with their own styles and URL */
+ }
+
+ {primaryBtn &&
}
+ {
+ secondaryBtn && (
+
+ )
+ }
+
+
+ {
+ /* Review Section: This section presents avatars, review ratings and the number of reviews */
+ }
+ {
+ withReview ? (
+
+ ) : (
+ ''
+ )
+ }
+
+ {/* Hero Image Section */}
+
+
+ {
+ src && alt && (
+
+ )
+ }
+
+
+
diff --git a/apps/website/src/components/sections/landing/HeroSectionAlt.astro b/apps/website/src/components/sections/landing/HeroSectionAlt.astro
new file mode 100644
index 00000000..8609ca2c
--- /dev/null
+++ b/apps/website/src/components/sections/landing/HeroSectionAlt.astro
@@ -0,0 +1,148 @@
+---
+// Import the necessary dependencies
+import GithubBtn from '@components/ui/buttons/GithubBtn.astro';
+
+// Define props from Astro
+const { title, subTitle, url } = Astro.props;
+
+const btnTitle =
+ Astro.currentLocale === 'fr'
+ ? 'Continuer avec Github'
+ : 'Continue with Github';
+
+// Define TypeScript interface for props
+interface Props {
+ title: string;
+ subTitle?: string;
+ url?: string;
+}
+---
+
+
+ {/* Decorating SVG elements */}
+
+
+
+ {/* Hero Section Heading */}
+
+
+ {title}
+
+
+ {/* Hero Section Sub-heading */}
+
+ {
+ subTitle && (
+
+ {subTitle}
+
+ )
+ }
+
+ {/* Github Button */}
+ {
+ url && (
+
+
+
+ )
+ }
+
diff --git a/apps/website/src/components/sections/misc/Authentication.astro b/apps/website/src/components/sections/misc/Authentication.astro
new file mode 100644
index 00000000..537d9af6
--- /dev/null
+++ b/apps/website/src/components/sections/misc/Authentication.astro
@@ -0,0 +1,5 @@
+---
+import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro';
+---
+
+
diff --git a/apps/website/src/components/sections/misc/ContactSection.astro b/apps/website/src/components/sections/misc/ContactSection.astro
new file mode 100644
index 00000000..1d648a96
--- /dev/null
+++ b/apps/website/src/components/sections/misc/ContactSection.astro
@@ -0,0 +1,122 @@
+---
+// Import the necessary dependencies.
+import AuthBtn from '@components/ui/buttons/AuthBtn.astro';
+import ContactIconBlock from '@components/ui/blocks/ContactIconBlock.astro';
+import TextInput from '@components/ui/forms/input/TextInput.astro';
+import EmailContactInput from '@components/ui/forms/input/EmailContactInput.astro';
+import PhoneInput from '@components/ui/forms/input/PhoneInput.astro';
+import TextAreaInput from '@components/ui/forms/input/TextAreaInput.astro';
+import Icon from '@components/ui/icons/Icon.astro';
+
+// Define the variables that will be used in this component
+const title: string = 'Contact Tenantial';
+const subTitle: string =
+ 'Request a walkthrough or start a scoped rollout conversation. Do not send secrets, credentials, or tenant exports through this public website.';
+const formTitle: string = 'Prepare a walkthrough request';
+const formSubTitle: string =
+ 'The public website form is static; use email for business contact context.';
+---
+
+{/* Contact Us */}
+
+
+
+
+ {title}
+
+
+ {subTitle}
+
+
+
+
+
+
+ {formTitle}
+
+ {
+ /* Form for user input with various input fields.-->
+ {/* Each field utilizes a different input component for the specific type of input (text, email, phone, and textarea)*/
+ }
+
+
+
+ {
+ /*ContactIconBlocks are used to display different methods of contacting, including visiting office, email, browsing knowledgebase, and FAQ.*/
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/website/src/components/sections/misc/FAQ.astro b/apps/website/src/components/sections/misc/FAQ.astro
new file mode 100644
index 00000000..6217d0ea
--- /dev/null
+++ b/apps/website/src/components/sections/misc/FAQ.astro
@@ -0,0 +1,79 @@
+---
+// Import the necessary AccordionItem component and JSON data
+import AccordionItem from '@components/ui/blocks/AccordionItem.astro';
+
+// Define props from Astro
+const { title, faqs } = Astro.props;
+
+// Define TypeScript interface for props
+interface Faq {
+ question: string;
+ answer: string;
+}
+
+interface FaqGroup {
+ subTitle?: string;
+ faqs: Faq[];
+}
+
+interface Props {
+ title: string;
+ faqs: FaqGroup;
+}
+// Define a helper function to generate ids dynamically.
+const makeId = (base: any, index: any) => `${base}${index + 1}`;
+---
+
+{
+ /* Main container that holds all content. Customized for different viewport sizes. */
+}
+
+
+
+
+
+
+
+
+ {faqs.subTitle}
+
+
+
+ {/* FAQ accordion items */}
+
+
+ {
+ faqs.faqs.map((question, i) => {
+ {
+ /* Generate ids dynamically for each FAQ accordion item. */
+ }
+ let id = makeId(
+ 'hs-basic-with-title-and-arrow-stretched-heading-',
+ i
+ );
+ let collapseId = makeId(
+ 'hs-basic-with-title-and-arrow-stretched-collapse',
+ i
+ );
+
+ return (
+
+ );
+ })
+ }
+
+
+
+
diff --git a/apps/website/src/components/sections/navbar&footer/FooterSection.astro b/apps/website/src/components/sections/navbar&footer/FooterSection.astro
new file mode 100644
index 00000000..d65798ba
--- /dev/null
+++ b/apps/website/src/components/sections/navbar&footer/FooterSection.astro
@@ -0,0 +1,80 @@
+---
+// Import the necessary dependencies
+import EmailFooterInput from '@components/ui/forms/input/EmailFooterInput.astro';
+import enStrings from '@utils/navigation.ts';
+import BrandLogo from '@components/BrandLogo.astro';
+import { SITE } from '@data/constants';
+
+const strings = enStrings;
+
+// Define the variables that will be used in this component
+const sectionThreeTitle: string =
+ 'Start a scoped conversation';
+const sectionThreeContent: string =
+ 'Use email for business contact context only. Do not send secrets, credentials, or tenant exports through the public website.';
+---
+
+
+
+
+
+ {/* Brand Logo */}
+
+
+ {/* An array of links for Product and Company sections */}
+ {
+ strings.footerLinks.map(section => (
+
+
+ {section.section}
+
+
+
+ ))
+ }
+
+
+
+ {sectionThreeTitle}
+
+
+
+
+
+
+
+
+
+ ©
+ {SITE.title}. Public website content only.
+
+
+
+
+
+
+
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 */}
+
+
+ {/* Brand logo */}
+
+
+
+ {/* Collapse toggle for smaller screens */}
+
+ {/* ThemeIcon component specifically for smaller screens */}
+
+
+
+
+ {/* Contains navigation links */}
+
+ {/* Navigation links container */}
+
+ {/* Navigation links and Authentication component */}
+ {
+ strings.navBarLinks.map(link => (
+
+ ))
+ }
+
+
+ {/* ThemeIcon component specifically for larger screens */}
+
+
+
+
+
+
+
+{/* 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;
+}
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {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;
+}
+---
+
+
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'>;
+}
+---
+
+
+
+
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'>;
+}
+---
+
+
+
+
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;
+}
+---
+
+
+
+
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;
+}
+---
+
+
+
+
+
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 */}
+
+ {question}
+ {/* SVG Icon that is shown when the accordion is NOT active */}
+
+
+ {/* SVG Icon that is shown when the accordion is active */}
+
+
+ {/* 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 */}
+
+ {/* The container for title, subtitle, and optional CTA button */}
+
+ {/* The title of the section */}
+
+ {/* 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 */}
+
+ {/* 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 */}
+
+ {/* 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 */}
+
+
+ ) : (
+
+ {/* First image in a two-image layout */}
+
+ {/* Second image in a two-image layout */}
+
+
+ )
+ }
+
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 */}
+
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 */}
+
+
+
+
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 */
+}
+
+ {/* Slot for additional content */}
+
+
+ {/* Container for the heading and content of the tab */}
+
+ {/* Heading of the tab, changes color when active */}
+ {heading}
+ {/* Content of the tab, changes color when active */}
+ {content}
+
+
+
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 */}
+{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 */}
+
+ {title}
+ {/* Display the arrow based on the 'noArrow' property */}
+ {noArrow ? null : }
+
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 = `
+
+
+
+
+ `;
+---
+
+
+ {
+ /* About Fragment: https://docs.astro.build/en/basics/astro-syntax/#fragments */
+ }
+
+
+ {title}
+
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 = `
+
+
+ `;
+---
+
+
+ {
+ /* About Fragment: https://docs.astro.build/en/basics/astro-syntax/#fragments */
+ }
+
+
+ {title}
+
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 */}
+
+ {/* Tab text */}
+
+ {title}
+
+
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',
+ },
+];
+---
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copy link
+
+
+
+
+
+{/* 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 */
+ }
+
+
+
+ {
+ /* 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 */}
+
+ {
+ /* 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 */}
+
+ {/* 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. */}
+
+
+
+ {/* 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;
+}
+---
+
+
+
+
+ {/* 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 */}
+
+ {/* 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 */}
+
+ {/* 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}
+
+
+ {firstChoice}
+
+
+
+ {secondChoice}
+
+
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
+};
+---
+
+
+
+
+
+
+
+
+ {config.title}
+
+
+ {config.subTitle}
+
+ {config.registerBtn}
+
+
+
+
+
+
+
+ Or
+
+ {/* The container for the form */}
+
+
+
+
+
+
+
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 */}
+
+ {/* Modal content container */}
+
+
+ {/* Actual box for the modal elements */}
+
+
+
+
+ {config.title}
+
+
+ {config.subTitle}
+ {/* Button that, when clicked, opens the login modal */}
+
+ {config.loginBtn}
+
+
+
+
+
+ {/* The form for password recovery */}
+
+
+
+
+
+
+
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 */}
+
+
+
+
+
+
+
+ {config.title}
+
+
+ {config.subTitle}
+ {/* Button to toggle login modal */}
+
+ {config.loginBtn}
+
+
+
+ {/* The form for user registration */}
+
+ {/* Google signup button */}
+
+ {/* Dividing line with 'Or' text */}
+
+ Or
+
+ {/* Registration form */}
+
+
+
+
+
+
+
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 */}
+
+ {label}
+
+
+
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 */
+ }
+ {label}
+ {/* 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';
+---
+
+
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}
+ {/* Label for the email input field */}
+
+ {/* Email input field */}
+
+ {/* Hidden error icon */}
+
+
+ {/* Validation message which is hidden by default */}
+
+ Please include a valid email address so we can get back to you
+
+
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;
+}
+---
+
+
+
+ {label}
+ {
+ forgot ? (
+
+ Forgot password?
+
+ ) : (
+ ''
+ )
+ }
+
+
+
+ {content}
+
+
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;
+}
+---
+
+
+ {label}
+
+
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;
+}
+---
+
+
+ {label}
+
+
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;
+}
+---
+
+
+ {label}
+
+
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/';
+---
+
+
+ Tenantial
+ 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}
-
-
- Skip to content
-
-
-
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}`;
+---
+
+
+
+
+
+
+
+ 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) => )}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/apps/website/src/pages/favicon.ico.ts b/apps/website/src/pages/favicon.ico.ts
new file mode 100644
index 00000000..636fb1d8
--- /dev/null
+++ b/apps/website/src/pages/favicon.ico.ts
@@ -0,0 +1,24 @@
+import type { APIRoute } from 'astro';
+import sharp from 'sharp';
+import ico from 'sharp-ico';
+import path from 'node:path';
+
+const faviconSrc = path.resolve('src/images/icon.png');
+
+export const GET: APIRoute = async () => {
+ // Resize the image to multiple sizes
+ const sizes = [16, 32];
+
+ const buffers = await Promise.all(
+ sizes.map(async size => {
+ return await sharp(faviconSrc).resize(size).toFormat('png').toBuffer();
+ })
+ );
+
+ // Convert the image to an ICO file
+ const icoBuffer = ico.encode(buffers);
+
+ return new Response(new Uint8Array(icoBuffer), {
+ headers: { 'Content-Type': 'image/x-icon' },
+ });
+};
diff --git a/apps/website/src/pages/imprint.astro b/apps/website/src/pages/imprint.astro
index 1dd6649c..fcc59108 100644
--- a/apps/website/src/pages/imprint.astro
+++ b/apps/website/src/pages/imprint.astro
@@ -1,31 +1,16 @@
---
-import RichText from '@/components/content/RichText.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import { imprintHero, imprintSections, imprintSeo } from '@/content/pages/imprint';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import { SITE } from '@data/constants';
---
-
-
-
-
-
-
-
+
+
+
diff --git a/apps/website/src/pages/index.astro b/apps/website/src/pages/index.astro
index 42e5cbd6..815818dd 100644
--- a/apps/website/src/pages/index.astro
+++ b/apps/website/src/pages/index.astro
@@ -1,32 +1,74 @@
---
-import PageShell from '@/components/layout/PageShell.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import FeaturePillars from '@/components/sections/FeaturePillars.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import TrustBar from '@/components/sections/TrustBar.astro';
-import {
- homeCtaSection,
- homeFeaturePillars,
- homeHero,
- homeSeo,
- homeTrustBar,
-} from '@/content/pages/home';
+import MainLayout from '@/layouts/MainLayout.astro';
+import HeroSection from '@components/sections/landing/HeroSection.astro';
+import FeaturesGeneral from '@components/sections/features/FeaturesGeneral.astro';
+import FeaturesNavs from '@components/sections/features/FeaturesNavs.astro';
+import PricingSection from '@components/sections/pricing/PricingSection.astro';
+import FAQ from '@components/sections/misc/FAQ.astro';
+import heroImage from '@images/tenantial-dashboard.avif';
+import faqs from '@data/faqs.json';
+import features from '@data/features.json';
+import pricing from '@data/pricing.json';
+import featureImage from '@images/tenantial-review-board.avif';
+import reviewImage from '@images/tenantial-evidence-intake.avif';
+import evidenceImage from '@images/tenantial-decision-review.avif';
+import governanceImage from '@images/tenantial-restore-plan.avif';
---
-
-
+
+ Microsoft tenants`
+ subTitle="Tenantial helps administrators review policy evidence, snapshots, drift, findings, exceptions, and restore plans before high-impact changes move forward."
+ primaryBtn="Request walkthrough"
+ primaryBtnURL="/contact"
+ secondaryBtn="Explore platform"
+ secondaryBtnURL="/platform"
+ withReview={false}
+ src={heroImage}
+ alt="Static Tenantial governance dashboard preview"
+ />
-
+
-
+ stable website foundation adapted for Tenantial review workflows.`
+ tabs={[
+ {
+ heading: 'Evidence intake',
+ content:
+ 'Normalize inventory and snapshot context so reviews start from one readable view of observed policy state.',
+ svg: 'frame',
+ src: reviewImage,
+ alt: 'Static Tenantial evidence intake preview',
+ first: true,
+ },
+ {
+ heading: 'Decision review',
+ content:
+ 'Surface drift, findings, exceptions, and audit context before administrators choose the next action.',
+ svg: 'dashboard',
+ src: evidenceImage,
+ alt: 'Static Tenantial decision review preview',
+ second: true,
+ },
+ {
+ heading: 'Restore planning',
+ content:
+ 'Treat restore as preview-first work with validation, conflict awareness, selective scope, and explicit confirmation.',
+ svg: 'verified',
+ src: governanceImage,
+ alt: 'Static Tenantial restore planning preview',
+ },
+ ]}
+ />
-
-
-
-
+
+
+
+
diff --git a/apps/website/src/pages/insights/index.astro b/apps/website/src/pages/insights/index.astro
new file mode 100644
index 00000000..ebd99ac9
--- /dev/null
+++ b/apps/website/src/pages/insights/index.astro
@@ -0,0 +1,3 @@
+---
+return Astro.redirect('/platform', 302);
+---
diff --git a/apps/website/src/pages/integrations.astro b/apps/website/src/pages/integrations.astro
deleted file mode 100644
index 790231ef..00000000
--- a/apps/website/src/pages/integrations.astro
+++ /dev/null
@@ -1,55 +0,0 @@
----
-import IntegrationBadge from '@/components/content/IntegrationBadge.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import FeatureGrid from '@/components/sections/FeatureGrid.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import {
- integrationEntries,
- integrationRules,
- integrationsHero,
- integrationsSeo,
-} from '@/content/pages/integrations';
----
-
-
-
-
-
-
-
-
-
- {integrationEntries.map((item) => )}
-
-
-
-
-
-
-
-
-
diff --git a/apps/website/src/pages/legal.astro b/apps/website/src/pages/legal.astro
index d9910fd5..49c076da 100644
--- a/apps/website/src/pages/legal.astro
+++ b/apps/website/src/pages/legal.astro
@@ -1,93 +1,27 @@
---
-import RichText from '@/components/content/RichText.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Card from '@/components/primitives/Card.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.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 { legalHero, legalNoticeSections, legalSeo } from '@/content/pages/legal';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import PrimaryCTA from '@components/ui/buttons/PrimaryCTA.astro';
+import SecondaryCTA from '@components/ui/buttons/SecondaryCTA.astro';
+import { SITE } from '@data/constants';
+
+const pageTitle = `Legal | ${SITE.title}`;
---
-
-
-
-
-
-
-
-
-
- Trust
-
- Review the canonical public trust surface for tenant isolation, access boundaries, and operating discipline.
-
-
- Trust
-
-
-
- Privacy
-
- Review how the public contact path handles inquiry information and what this static website does not claim to process.
-
-
- Privacy
-
-
-
- Terms
-
- Read the website terms that explain the public-site scope and why marketing pages do not replace signed agreements.
-
-
- Terms
-
-
-
- Imprint
-
- Review the canonical notice baseline for publisher identity and jurisdiction-specific disclosure details.
-
-
- Imprint
-
-
-
- Terms
-
- Read the website terms that explain the public-site scope and why marketing pages do not replace signed agreements.
-
-
- Terms
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/apps/website/src/pages/manifest.json.ts b/apps/website/src/pages/manifest.json.ts
new file mode 100644
index 00000000..fbeaf177
--- /dev/null
+++ b/apps/website/src/pages/manifest.json.ts
@@ -0,0 +1,58 @@
+import type { APIRoute, ImageMetadata } from 'astro';
+import { getImage } from 'astro:assets';
+import icon from '@images/icon.png';
+import maskableIcon from '@images/icon-maskable.png';
+
+interface Favicon {
+ purpose: 'any' | 'maskable' | 'monochrome';
+ src: ImageMetadata;
+ sizes: number[];
+}
+
+const sizes = [192, 512];
+const favicons: Favicon[] = [
+ {
+ purpose: 'any',
+ src: icon,
+ sizes,
+ },
+ {
+ purpose: 'maskable',
+ src: maskableIcon,
+ sizes,
+ },
+];
+
+export const GET: APIRoute = async () => {
+ const icons = await Promise.all(
+ favicons.flatMap(favicon =>
+ favicon.sizes.map(async size => {
+ const image = await getImage({
+ src: favicon.src,
+ width: size,
+ height: size,
+ format: 'png',
+ });
+ return {
+ src: image.src,
+ sizes: `${image.options.width}x${image.options.height}`,
+ type: `image/${image.options.format}`,
+ purpose: favicon.purpose,
+ };
+ })
+ )
+ );
+
+ const manifest = {
+ short_name: 'Tenantial',
+ name: 'Tenantial',
+ icons,
+ display: 'minimal-ui',
+ id: '/',
+ start_url: '/',
+ theme_color: '#FFEDD5',
+ background_color: '#262626',
+ };
+
+ return new Response(JSON.stringify(manifest));
+};
diff --git a/apps/website/src/pages/platform.astro b/apps/website/src/pages/platform.astro
index ad665415..f66eade5 100644
--- a/apps/website/src/pages/platform.astro
+++ b/apps/website/src/pages/platform.astro
@@ -1,1826 +1,98 @@
---
-import { Icon } from 'astro-icon/components';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import LeftSection from '@components/ui/blocks/LeftSection.astro';
+import RightSection from '@components/ui/blocks/RightSection.astro';
+import FeaturesStats from '@components/sections/features/FeaturesStats.astro';
+import dashboard from '@images/tenantial-dashboard.avif';
+import evidenceImage from '@images/tenantial-evidence-panel.avif';
+import reviewImage from '@images/tenantial-drift-workflow.avif';
+import restoreImage from '@images/tenantial-rollout-plan.avif';
+import { SITE } from '@data/constants';
-import DashboardPreview from '@/components/content/DashboardPreview.astro';
-import Headline from '@/components/content/Headline.astro';
-import Lead from '@/components/content/Lead.astro';
-import PrimaryCTA from '@/components/content/PrimaryCTA.astro';
-import SecondaryCTA from '@/components/content/SecondaryCTA.astro';
-import Badge from '@/components/primitives/Badge.astro';
-import Container from '@/components/primitives/Container.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import {
- governanceLoop,
- governanceLoopIntro,
- operatingModelSteps,
- operatorWorkflows,
- platformBoundary,
- platformCapabilities,
- platformCapabilityPrimary,
- platformFinalCta,
- platformHero,
- platformHeroTrustSignals,
- platformSeo,
- truthLayers,
-} from '@/content/pages/platform';
-
-const iconFallbacks: Record = {
- clipboard: 'lucide:clipboard-list',
- 'file-check': 'lucide:file-check-2',
- flag: 'lucide:flag',
- 'git-branch': 'lucide:git-branch',
- search: 'lucide:search',
- users: 'lucide:users-round',
-};
-
-const resolveIcon = (icon: string): string => iconFallbacks[icon] ?? icon;
-const sourceNode = governanceLoop.find((item) => item.label === 'Source of truth') ?? governanceLoop[0];
-const diagramNodes = governanceLoop.filter((item) => item.label !== 'Source of truth');
-const diagramNodeClass = (label: string): string => `diagram-node-${label.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`;
-const diagramNodeIcons: Record = {
- 'Audit trail': 'lucide:shield-check',
- Diff: 'lucide:git-compare',
- Evidence: 'lucide:file-check-2',
- Exception: 'lucide:flag',
- Finding: 'lucide:triangle-alert',
- Review: 'lucide:users-round',
- Snapshot: 'lucide:camera',
-};
-const truthLayerIcons = [
- 'lucide:activity',
- 'lucide:file-stack',
- 'lucide:archive',
- 'lucide:refresh-cw',
- 'lucide:route',
-];
+const pageTitle: string = `Platform | ${SITE.title}`;
+const metaDescription =
+ 'Tenantial platform overview for Microsoft tenant evidence, snapshots, drift review, findings, audit context, exceptions, and restore planning.';
+const ogTitle = 'Platform | Tenantial';
---
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/website/src/pages/pricing.astro b/apps/website/src/pages/pricing.astro
new file mode 100644
index 00000000..cfb3aee7
--- /dev/null
+++ b/apps/website/src/pages/pricing.astro
@@ -0,0 +1,23 @@
+---
+import MainLayout from '@/layouts/MainLayout.astro';
+import PricingSection from '@components/sections/pricing/PricingSection.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import pricing from '@data/pricing.json';
+import { SITE } from '@data/constants';
+
+const pageTitle = `Pricing | ${SITE.title}`;
+const metaDescription =
+ 'Tenantial pricing is presented as conservative evaluation and rollout conversation paths, not unsupported self-serve billing.';
+---
+
+
+
+
+
diff --git a/apps/website/src/pages/privacy.astro b/apps/website/src/pages/privacy.astro
index 66d9c578..31ed1cd7 100644
--- a/apps/website/src/pages/privacy.astro
+++ b/apps/website/src/pages/privacy.astro
@@ -1,31 +1,16 @@
---
-import RichText from '@/components/content/RichText.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import { privacyHero, privacySections, privacySeo } from '@/content/pages/privacy';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import { SITE } from '@data/constants';
---
-
-
-
-
-
-
-
+
+
+
diff --git a/apps/website/src/pages/product.astro b/apps/website/src/pages/product.astro
new file mode 100644
index 00000000..e482d15b
--- /dev/null
+++ b/apps/website/src/pages/product.astro
@@ -0,0 +1,3 @@
+---
+return Astro.redirect('/platform', 301);
+---
diff --git a/apps/website/src/pages/products/index.astro b/apps/website/src/pages/products/index.astro
new file mode 100644
index 00000000..e482d15b
--- /dev/null
+++ b/apps/website/src/pages/products/index.astro
@@ -0,0 +1,3 @@
+---
+return Astro.redirect('/platform', 301);
+---
diff --git a/apps/website/src/pages/robots.txt.ts b/apps/website/src/pages/robots.txt.ts
new file mode 100644
index 00000000..99077674
--- /dev/null
+++ b/apps/website/src/pages/robots.txt.ts
@@ -0,0 +1,32 @@
+// https://docs.astro.build/en/guides/integrations-guide/sitemap/#usage
+import type { APIRoute } from 'astro';
+
+const robotsTxt = `
+User-agent: Googlebot
+Disallow:
+Allow: /
+Crawl-delay: 10
+
+User-agent: Yandex
+Disallow:
+Allow: /
+Crawl-delay: 2
+
+User-agent: archive.org_bot
+Disallow:
+Allow: /
+Crawl-delay: 2
+
+User-agent: *
+Allow: /
+
+Sitemap: ${new URL('sitemap-index.xml', import.meta.env.SITE).href}
+`.trim();
+
+export const GET: APIRoute = () => {
+ return new Response(robotsTxt, {
+ headers: {
+ 'Content-Type': 'text/plain; charset=utf-8',
+ },
+ });
+};
diff --git a/apps/website/src/pages/security-trust.astro b/apps/website/src/pages/security-trust.astro
deleted file mode 100644
index 50313c85..00000000
--- a/apps/website/src/pages/security-trust.astro
+++ /dev/null
@@ -1,3 +0,0 @@
----
-return Astro.redirect('/trust', 308);
----
diff --git a/apps/website/src/pages/services.astro b/apps/website/src/pages/services.astro
new file mode 100644
index 00000000..e482d15b
--- /dev/null
+++ b/apps/website/src/pages/services.astro
@@ -0,0 +1,3 @@
+---
+return Astro.redirect('/platform', 301);
+---
diff --git a/apps/website/src/pages/sitemap.xml.ts b/apps/website/src/pages/sitemap.xml.ts
deleted file mode 100644
index 25403b70..00000000
--- a/apps/website/src/pages/sitemap.xml.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { APIRoute } from 'astro';
-
-import { sitemapEntries } from '@/lib/seo';
-
-export const GET: APIRoute = async () => {
- const urls = (await sitemapEntries())
- .map((url) => ` ${url} `)
- .join('\n');
-
- const body = `
-
-${urls}
- `;
-
- return new Response(body, {
- headers: {
- 'Content-Type': 'application/xml; charset=utf-8',
- },
- });
-};
diff --git a/apps/website/src/pages/solutions.astro b/apps/website/src/pages/solutions.astro
deleted file mode 100644
index dc427bb4..00000000
--- a/apps/website/src/pages/solutions.astro
+++ /dev/null
@@ -1,55 +0,0 @@
----
-import AudienceRow from '@/components/content/AudienceRow.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.astro';
-import Section from '@/components/primitives/Section.astro';
-import SectionHeader from '@/components/primitives/SectionHeader.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import FeatureGrid from '@/components/sections/FeatureGrid.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import {
- solutionsAudiences,
- solutionsHero,
- solutionsSeo,
- solutionsSignals,
-} from '@/content/pages/solutions';
----
-
-
-
-
-
-
-
-
-
- {solutionsAudiences.map((item) => )}
-
-
-
-
-
-
-
-
-
diff --git a/apps/website/src/pages/terms.astro b/apps/website/src/pages/terms.astro
index 35833b87..ff3b5927 100644
--- a/apps/website/src/pages/terms.astro
+++ b/apps/website/src/pages/terms.astro
@@ -1,31 +1,16 @@
---
-import RichText from '@/components/content/RichText.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Section from '@/components/primitives/Section.astro';
-import CTASection from '@/components/sections/CTASection.astro';
-import PageHero from '@/components/sections/PageHero.astro';
-import { termsHero, termsSections, termsSeo } from '@/content/pages/terms';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import { SITE } from '@data/constants';
---
-
-
-
-
-
-
-
+
+
+
diff --git a/apps/website/src/pages/trust.astro b/apps/website/src/pages/trust.astro
index 4353c4e6..a6b871dc 100644
--- a/apps/website/src/pages/trust.astro
+++ b/apps/website/src/pages/trust.astro
@@ -1,50 +1,44 @@
---
-import Callout from '@/components/content/Callout.astro';
-import PageShell from '@/components/layout/PageShell.astro';
-import Container from '@/components/primitives/Container.astro';
-import Grid from '@/components/primitives/Grid.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 TrustGrid from '@/components/sections/TrustGrid.astro';
-import { trustHero, trustNotes, trustPrinciples, trustSeo } from '@/content/pages/trust';
+import MainLayout from '@/layouts/MainLayout.astro';
+import MainSection from '@components/ui/blocks/MainSection.astro';
+import FeaturesStats from '@components/sections/features/FeaturesStats.astro';
+import { SITE } from '@data/constants';
+
+const pageTitle = `Trust | ${SITE.title}`;
+const metaDescription =
+ 'Tenantial public trust posture with conservative claims and clear static preview boundaries.';
---
-
-
-
-
-
-
-
-
-
-
- {trustNotes.map((note) => )}
-
-
-
-
-
-
-
+
+
+
+
diff --git a/apps/website/src/styles/global.css b/apps/website/src/styles/global.css
deleted file mode 100644
index 37e8a3b1..00000000
--- a/apps/website/src/styles/global.css
+++ /dev/null
@@ -1,362 +0,0 @@
-@import "tailwindcss";
-@import "./tokens.css";
-
-html {
- overflow-x: clip;
- background: var(--color-background);
- scroll-behavior: smooth;
-}
-
-body {
- min-height: 100vh;
- overflow-x: clip;
- margin: 0;
- font-family: var(--font-sans);
- color: var(--color-foreground);
- background:
- linear-gradient(180deg, #050607 0%, #050607 58%, #07090d 100%);
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-a:not([data-button-variant]) {
- color: inherit;
-}
-
-img,
-svg {
- display: block;
- max-width: 100%;
-}
-
-code {
- font-family: var(--font-mono);
-}
-
-::selection {
- background: rgba(111, 229, 191, 0.28);
- color: var(--color-foreground);
-}
-
-:where(a, button, input, textarea, summary):focus-visible {
- outline: 3px solid rgba(111, 229, 191, 0.58);
- outline-offset: 4px;
-}
-
-main {
- display: block;
-}
-
-.foundation-page {
- position: relative;
- isolation: isolate;
- min-height: 100vh;
-}
-
-.foundation-page::before {
- content: none;
-}
-
-.foundation-page::after {
- content: none;
-}
-
-.home-ambient-wash,
-.home-dot-field {
- position: absolute;
- right: 0;
- left: 0;
- z-index: -1;
- pointer-events: none;
-}
-
-.home-ambient-wash {
- top: 4rem;
- height: 52rem;
- background:
- radial-gradient(ellipse 30rem 35rem at 62% 44%, rgba(255, 247, 225, 0.22), transparent 68%),
- linear-gradient(
- 90deg,
- transparent 0%,
- transparent 30%,
- rgba(255, 247, 225, 0.032) 40%,
- rgba(255, 247, 225, 0.2) 58%,
- rgba(255, 247, 225, 0.09) 74%,
- transparent 94%
- ),
- linear-gradient(180deg, transparent 0%, rgba(111, 229, 191, 0.052) 56%, transparent 100%);
- filter: blur(30px);
- mask-image:
- linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.88) 16%, rgba(0, 0, 0, 0.78) 76%, transparent 100%),
- linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, 0.95) 34%, rgba(0, 0, 0, 0.95) 88%, transparent 100%);
- mask-composite: intersect;
- opacity: 0.78;
-}
-
-.home-dot-field {
- top: clamp(37rem, 73vh, 45rem);
- height: 29rem;
- overflow: hidden;
-}
-
-.home-dot-field::before {
- position: absolute;
- top: -1rem;
- left: 50%;
- width: min(126rem, 158vw);
- height: 31rem;
- content: "";
- background-image: url("/images/tenantial-wave-mesh.svg");
- background-repeat: no-repeat;
- background-position: center top;
- background-size: 100% 100%;
- transform: translateX(-50%) perspective(44rem) rotateX(52deg) scaleX(1.18);
- transform-origin: top center;
- mask-image:
- linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.6) 14%, rgba(0, 0, 0, 0.96) 50%, transparent 100%),
- radial-gradient(86% 56% at 52% 42%, rgba(0, 0, 0, 0.98), transparent 80%);
- mask-composite: intersect;
- filter: drop-shadow(0 0 8px rgba(111, 229, 191, 0.06));
- opacity: 0.96;
-}
-
-.home-dot-field::after {
- position: absolute;
- top: 4.5rem;
- left: 50%;
- width: min(84rem, 112vw);
- height: 10rem;
- content: "";
- background: radial-gradient(ellipse at center, rgba(111, 229, 191, 0.12), transparent 68%);
- filter: blur(22px);
- transform: translateX(-50%) perspective(38rem) rotateX(52deg);
- opacity: 0.55;
-}
-
-.skip-link {
- position: absolute;
- top: 1rem;
- left: 1rem;
- z-index: 40;
- transform: translateY(-200%);
- border-radius: var(--radius-pill);
- background: var(--color-primary);
- padding: 0.75rem 1rem;
- color: var(--color-primary-foreground);
- text-decoration: none;
- transition: transform 140ms ease;
-}
-
-.skip-link:focus {
- transform: translateY(0);
-}
-
-.section-divider {
- border-top: 1px solid var(--color-border-subtle);
-}
-
-.site-shell {
- position: relative;
-}
-
-.shell-panel,
-.glass-panel {
- border: 1px solid var(--color-border);
- background: linear-gradient(180deg, var(--surface-shell-strong), var(--surface-shell));
- box-shadow: var(--shadow-panel-strong);
- backdrop-filter: blur(18px);
-}
-
-.surface-card,
-.surface-card-muted,
-.surface-card-accent {
- border: 1px solid var(--color-border);
- background: linear-gradient(180deg, var(--color-card), var(--surface-card-soft));
- box-shadow: var(--shadow-card);
-}
-
-.surface-card-muted {
- background: linear-gradient(180deg, var(--surface-muted-strong), var(--surface-muted));
-}
-
-.surface-card-accent {
- border-color: var(--color-border-strong);
- background: linear-gradient(180deg, rgba(111, 229, 191, 0.12), rgba(20, 28, 36, 0.9));
-}
-
-.section-density-compact {
- padding-block: var(--space-section-compact);
-}
-
-.section-density-base {
- padding-block: var(--space-section);
-}
-
-.section-density-spacious {
- padding-block: var(--space-section-spacious);
-}
-
-.section-shell-muted,
-.section-shell-emphasis,
-.section-tinted,
-.section-warm {
- border: 1px solid var(--color-border-subtle);
- border-radius: var(--radius-lg);
-}
-
-.section-shell-muted,
-.section-tinted {
- background: var(--surface-section-tinted);
-}
-
-.section-shell-emphasis {
- border-color: var(--color-border-strong);
- background: rgba(111, 229, 191, 0.08);
-}
-
-.section-warm {
- background: var(--surface-section-warm);
-}
-
-.text-link {
- color: var(--color-foreground);
- text-decoration: underline;
- text-decoration-color: rgba(111, 229, 191, 0.32);
- text-underline-offset: 0.3em;
- transition:
- color 140ms ease,
- text-decoration-color 140ms ease;
-}
-
-.text-link:hover {
- color: var(--color-primary);
- text-decoration-color: rgba(111, 229, 191, 0.7);
-}
-
-.legal-prose p {
- margin: 0;
- color: var(--color-copy);
- line-height: 1.8;
-}
-
-.legal-prose p + p {
- margin-top: 1rem;
-}
-
-.legal-prose ul {
- margin: 1rem 0 0;
- padding-left: 1.1rem;
- color: var(--color-copy);
- line-height: 1.75;
-}
-
-.legal-prose li + li {
- margin-top: 0.6rem;
-}
-
-.foundation-page [data-disclosure-layer='1'],
-.foundation-page [data-disclosure-layer='2'],
-.foundation-page [data-disclosure-layer='3'] {
- position: relative;
-}
-
-.foundation-page [data-disclosure-layer='1'] {
- z-index: 1;
-}
-
-.foundation-page [data-disclosure-layer='2'],
-.foundation-page [data-disclosure-layer='3'] {
- z-index: 0;
-}
-
-.motion-rise {
- animation: rise-in 520ms ease both;
-}
-
-@keyframes rise-in {
- from {
- opacity: 0;
- transform: translateY(16px);
- }
-
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@media (prefers-reduced-motion: reduce) {
- *,
- *::before,
- *::after {
- scroll-behavior: auto !important;
- animation-duration: 1ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 1ms !important;
- }
-}
-
-.hero-gradient {
- padding-bottom: var(--space-section);
-}
-
-.surface-card,
-.surface-card-muted,
-.surface-card-accent {
- transition:
- box-shadow 220ms ease,
- transform 220ms ease;
-}
-
-.card-hoverable:hover {
- box-shadow: var(--shadow-card-hover);
- transform: translateY(-2px);
-}
-
-.callout-bar {
- position: relative;
- padding-left: 1.25rem;
-}
-
-.callout-bar::before {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 3px;
- border-radius: 3px;
- background: var(--color-primary);
- content: "";
-}
-
-.callout-bar[data-bar-tone="trust"]::before {
- background: var(--color-success);
-}
-
-.callout-bar[data-bar-tone="warm"]::before {
- background: var(--color-warning);
-}
-
-.text-accent-word {
- color: var(--color-primary);
-}
-
-.feature-icon {
- display: flex;
- flex-shrink: 0;
- align-items: center;
- justify-content: center;
- width: 2.75rem;
- height: 2.75rem;
- border: 1px solid rgba(111, 229, 191, 0.24);
- border-radius: 50%;
- background: var(--surface-accent);
- color: var(--color-primary);
-}
diff --git a/apps/website/src/styles/tokens.css b/apps/website/src/styles/tokens.css
deleted file mode 100644
index 4db4f555..00000000
--- a/apps/website/src/styles/tokens.css
+++ /dev/null
@@ -1,132 +0,0 @@
-@theme {
- --font-sans: "Inter", "Avenir Next", "Segoe UI", sans-serif;
- --font-display: "Inter", "Avenir Next", "Segoe UI", sans-serif;
- --font-mono: "IBM Plex Mono", "SFMono-Regular", monospace;
-
- --color-obsidian-950: oklch(0.115 0.01 250);
- --color-obsidian-900: oklch(0.155 0.012 250);
- --color-obsidian-850: oklch(0.205 0.014 250);
- --color-obsidian-800: oklch(0.255 0.014 250);
- --color-ivory-50: oklch(0.982 0.012 88);
- --color-stone-200: oklch(0.87 0.014 80);
- --color-stone-400: oklch(0.69 0.014 80);
- --color-stone-500: oklch(0.6 0.014 80);
- --color-mint-300: oklch(0.86 0.09 170);
- --color-mint-500: oklch(0.72 0.105 170);
- --color-mint-700: oklch(0.56 0.095 170);
- --color-amber-300: oklch(0.84 0.11 72);
- --color-amber-500: oklch(0.72 0.13 68);
- --color-coral-400: oklch(0.7 0.16 30);
- --color-coral-500: oklch(0.64 0.18 28);
- --color-violet-300: oklch(0.77 0.1 305);
- --color-violet-500: oklch(0.62 0.13 300);
-}
-
-:root {
- color-scheme: dark;
-
- --color-background: var(--color-obsidian-950);
- --color-background-elevated: var(--color-obsidian-900);
- --color-foreground: var(--color-ivory-50);
- --color-muted: var(--color-obsidian-850);
- --color-muted-foreground: var(--color-stone-400);
- --color-card: rgba(18, 24, 32, 0.92);
- --color-card-foreground: var(--color-ivory-50);
- --color-border: rgba(255, 247, 225, 0.1);
- --color-border-strong: rgba(255, 247, 225, 0.18);
- --color-border-subtle: rgba(255, 247, 225, 0.07);
- --color-frame: rgba(255, 247, 225, 0.08);
- --color-input: rgba(18, 24, 32, 0.96);
- --color-primary: var(--color-mint-500);
- --color-primary-foreground: var(--color-obsidian-950);
- --color-secondary: rgba(255, 247, 225, 0.08);
- --color-secondary-foreground: var(--color-ivory-50);
- --color-accent: rgba(111, 229, 191, 0.12);
- --color-accent-foreground: var(--color-mint-300);
- --color-success: var(--color-mint-500);
- --color-warning: var(--color-amber-500);
- --color-destructive: var(--color-coral-500);
- --color-info: var(--color-violet-300);
-
- --surface-page: rgba(7, 10, 15, 0.94);
- --surface-shell: rgba(13, 18, 25, 0.88);
- --surface-shell-strong: rgba(17, 24, 32, 0.96);
- --surface-card-soft: rgba(20, 28, 36, 0.84);
- --surface-muted: rgba(255, 247, 225, 0.05);
- --surface-muted-strong: rgba(255, 247, 225, 0.075);
- --surface-accent: rgba(111, 229, 191, 0.1);
- --surface-accent-strong: rgba(111, 229, 191, 0.16);
- --surface-trust: rgba(175, 150, 255, 0.12);
- --surface-section-tinted: rgba(15, 21, 29, 0.62);
- --surface-section-warm: rgba(255, 188, 92, 0.08);
-
- --radius-sm: 0.5rem;
- --radius-md: 0.5rem;
- --radius-lg: 0.5rem;
- --radius-panel: 0.5rem;
- --radius-pill: 999px;
-
- --shadow-panel-strong: 0 28px 90px rgba(0, 0, 0, 0.32);
- --shadow-card: 0 20px 54px rgba(0, 0, 0, 0.24);
- --shadow-card-hover: 0 24px 64px rgba(0, 0, 0, 0.32);
- --shadow-soft: 0 12px 32px rgba(0, 0, 0, 0.18);
- --shadow-inline: 0 10px 24px rgba(0, 0, 0, 0.22);
-
- --space-page-x: clamp(1rem, 2vw, 2.25rem);
- --space-page-y: clamp(4rem, 7vw, 7rem);
- --space-section-compact: clamp(3rem, 5vw, 4.5rem);
- --space-section: clamp(4.5rem, 7vw, 6.5rem);
- --space-section-spacious: clamp(5.5rem, 8vw, 8rem);
- --space-cluster-sm: 0.75rem;
- --space-cluster: 1rem;
- --space-cluster-lg: 1.5rem;
- --space-stack-sm: 0.75rem;
- --space-stack: 1.25rem;
- --space-stack-lg: 1.75rem;
- --space-grid: 1rem;
- --space-grid-lg: 1.5rem;
-
- --content-max-width: 76rem;
- --wide-max-width: 88rem;
- --reading-max-width: 68rem;
-
- --type-display-size: 4rem;
- --type-page-size: 3rem;
- --type-section-size: 2.25rem;
- --type-card-size: 1.25rem;
- --type-body-size: 1.03rem;
- --type-small-size: 0.94rem;
- --type-eyebrow-size: 0.74rem;
- --type-helper-size: 0.82rem;
- --tracking-display: 0;
- --tracking-tight: 0;
- --tracking-eyebrow: 0;
- --line-display: 1;
- --line-heading: 1.06;
- --line-body: 1.7;
- --line-tight: 1.45;
-
- --color-copy: var(--color-muted-foreground);
- --color-line: var(--color-border);
- --color-panel: var(--surface-shell);
- --color-panel-strong: var(--surface-shell-strong);
- --color-panel-soft: var(--surface-muted);
- --color-brand: var(--color-primary);
- --color-brand-soft: var(--surface-accent);
- --color-signal: var(--color-success);
- --color-warm: var(--color-warning);
- --shadow-panel: var(--shadow-panel-strong);
-
- --color-ink-700: var(--color-stone-400);
- --color-ink-800: var(--color-stone-200);
- --color-ink-900: var(--color-foreground);
- --color-stone-50: var(--color-background);
- --color-stone-100: var(--color-background-elevated);
- --color-stone-150: var(--surface-muted);
- --color-stone-300: var(--color-stone-400);
- --color-brand-300: var(--color-mint-300);
- --color-brand-400: var(--color-mint-500);
- --color-brand-500: var(--color-primary);
- --color-brand-700: var(--color-mint-700);
- --color-red-500: var(--color-destructive);
-}
diff --git a/apps/website/src/types/site.ts b/apps/website/src/types/site.ts
deleted file mode 100644
index ecaed3ac..00000000
--- a/apps/website/src/types/site.ts
+++ /dev/null
@@ -1,226 +0,0 @@
-export type ButtonVariant = 'primary' | 'secondary' | 'ghost';
-export type PageFamily = 'landing' | 'trust' | 'content';
-export type PageRole =
- | 'home'
- | 'platform'
- | 'product'
- | 'trust'
- | 'changelog'
- | 'contact'
- | 'privacy'
- | 'imprint'
- | 'solutions'
- | 'integrations'
- | 'legal'
- | 'terms';
-export type SitePath =
- | '/'
- | '/platform'
- | '/product'
- | '/trust'
- | '/changelog'
- | '/integrations'
- | '/solutions'
- | '/contact'
- | '/legal'
- | '/privacy'
- | '/imprint'
- | '/terms'
- | '/security-trust';
-export type ShellTone = 'brand' | 'neutral' | 'trust';
-export type FooterIntent = 'conversion' | 'guidance' | 'legal';
-export type SurfacePriority = 'required' | 'recommended' | 'secondary' | 'compatibility';
-export type JourneyStage = 'entry' | 'first-clarification' | 'deepening' | 'action';
-export type SurfaceGroup = 'core' | 'supporting' | 'legal' | 'compatibility';
-export type CollectionName = 'articles' | 'changelog' | 'resources';
-
-export interface CtaLink {
- href: string;
- label: string;
- helper?: string;
- target?: '_blank' | '_self';
- variant?: ButtonVariant;
-}
-
-export interface NavigationItem {
- href: string;
- label: string;
- description?: string;
-}
-
-export interface SurfaceAvailability {
- articles: boolean;
- changelog: boolean;
- resources: boolean;
-}
-
-export interface FooterNavigationGroup {
- items: NavigationItem[];
- title: string;
-}
-
-export interface FooterLead {
- description: string;
- eyebrow: string;
- intent: FooterIntent;
- primaryCta: CtaLink;
- title: string;
-}
-
-export interface PageDefinition {
- canonicalPath: SitePath;
- family: PageFamily;
- footerLead?: Partial;
- headerCta?: Partial;
- inSitemap: boolean;
- journeyStage: JourneyStage;
- pageRole: PageRole;
- path: SitePath;
- priority: SurfacePriority;
- shellTone: ShellTone;
- surfaceGroup: SurfaceGroup;
-}
-
-export interface SiteMetadata {
- siteDescription: string;
- siteName: string;
- siteTagline: string;
- siteUrl: string;
-}
-
-export interface PageSeo {
- description: string;
- ogDescription?: string;
- ogTitle?: string;
- path: string;
- title: string;
-}
-
-export interface HeroContent {
- description: string;
- eyebrow: string;
- highlights?: string[];
- primaryAnchor?: HeroPrimaryAnchor;
- primaryCta: CtaLink;
- productVisual?: HeroVisualContent;
- secondaryCta?: CtaLink;
- title: string;
- titleHtml?: string;
- trustSubclaims?: string[];
- visualFocus?: HeroVisualFocusContent;
-}
-
-export interface MetricItem {
- description: string;
- label: string;
- value: string;
-}
-
-export interface FeatureItemContent {
- description: string;
- eyebrow?: string;
- href?: string;
- icon?: string;
- meta?: string;
- title: string;
-}
-
-export interface CalloutContent {
- description: string;
- eyebrow?: string;
- title: string;
- tone?: 'accent' | 'neutral' | 'subtle';
-}
-
-export interface AudienceRowContent {
- audience: string;
- bullets: string[];
- cta?: CtaLink;
- description: string;
- title: string;
-}
-
-export interface TrustPrincipleContent {
- description: string;
- note?: string;
- title: string;
-}
-
-export interface IntegrationEntry {
- category: string;
- name: string;
- note?: string;
- summary: string;
-}
-
-export interface LogoStripItem {
- label: string;
- note?: string;
-}
-
-export interface LegalSection {
- body: string[];
- bullets?: string[];
- title: string;
-}
-
-export interface HeroVisualContent {
- alt: string;
- src: string;
-}
-
-export type HeroPrimaryAnchor = 'headline' | 'product-visual' | 'composition';
-
-export interface HeroVisualFocusContent {
- eyebrow: string;
- points: string[];
- title: string;
-}
-
-export interface OutcomeItemContent {
- description: string;
- title: string;
-}
-
-export interface OutcomeSectionContent {
- audienceBias?: string;
- description: string;
- outcomes: OutcomeItemContent[];
- title: string;
-}
-
-export interface CapabilityClusterContent {
- capabilities: string[];
- description: string;
- href?: string;
- meta?: string;
- title: string;
-}
-
-export interface TrustSignalGroupContent {
- description: string;
- signals: TrustPrincipleContent[];
- supportRoute: string;
- title: string;
-}
-
-export interface ProgressTeaserEntry {
- date: Date;
- description: string;
- title: string;
-}
-
-export interface ProgressTeaserContent {
- cta: CtaLink;
- description: string;
- entries: ProgressTeaserEntry[];
- title: string;
-}
-
-export interface VisualFoundationContract {
- accessibilityBaseline: readonly string[];
- ctaHierarchy: readonly ButtonVariant[];
- pageFamilies: readonly PageFamily[];
- requiredColorRoles: readonly string[];
- surfaceLayers: readonly string[];
-}
diff --git a/apps/website/src/utils/navigation.ts b/apps/website/src/utils/navigation.ts
new file mode 100644
index 00000000..2df373fc
--- /dev/null
+++ b/apps/website/src/utils/navigation.ts
@@ -0,0 +1,42 @@
+const navBarLinks = [
+ { name: 'Home', url: '/' },
+ { name: 'Platform', url: '/platform' },
+ { name: 'Pricing', url: '/pricing' },
+ { name: 'Trust', url: '/trust' },
+ { name: 'Contact', url: '/contact' },
+];
+
+const footerLinks = [
+ {
+ section: 'Product',
+ links: [
+ { name: 'Platform', url: '/platform' },
+ { name: 'Pricing', url: '/pricing' },
+ { name: 'Trust', url: '/trust' },
+ { name: 'Docs', url: '/welcome-to-docs/' },
+ ],
+ },
+ {
+ section: 'Legal',
+ links: [
+ { name: 'Privacy', url: '/privacy' },
+ { name: 'Terms', url: '/terms' },
+ { name: 'Legal', url: '/legal' },
+ { name: 'Imprint', url: '/imprint' },
+ ],
+ },
+];
+
+const socialLinks = {
+ facebook: '#',
+ x: '#',
+ github: '#',
+ google: '#',
+ slack: '#',
+};
+
+export default {
+ navBarLinks,
+ footerLinks,
+ socialLinks,
+};
diff --git a/apps/website/src/utils/ui.ts b/apps/website/src/utils/ui.ts
new file mode 100644
index 00000000..b4cd8123
--- /dev/null
+++ b/apps/website/src/utils/ui.ts
@@ -0,0 +1,4 @@
+export const languages = {
+ en: 'English',
+ fr: 'Français',
+};
diff --git a/apps/website/src/utils/utils.ts b/apps/website/src/utils/utils.ts
new file mode 100644
index 00000000..5f611a46
--- /dev/null
+++ b/apps/website/src/utils/utils.ts
@@ -0,0 +1,19 @@
+// Format the date to a string
+function formatDate(date: Date): string {
+ const options: Intl.DateTimeFormatOptions = {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ };
+
+ return new Date(date).toLocaleDateString(undefined, options);
+}
+// Capitalize the first letter
+function capitalize(str: string): string {
+ if (typeof str !== 'string' || str.length === 0) {
+ return str;
+ }
+ return str.charAt(0).toUpperCase() + str.slice(1);
+}
+
+export { formatDate, capitalize };
diff --git a/apps/website/tests/smoke/changelog-core-ia.spec.ts b/apps/website/tests/smoke/changelog-core-ia.spec.ts
deleted file mode 100644
index 287eef68..00000000
--- a/apps/website/tests/smoke/changelog-core-ia.spec.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-import {
- expectDisclosureLayer,
- expectFooterLinks,
- expectNavigationVsCtaDifferentiation,
- expectPageFamily,
- expectPrimaryNavigation,
- expectShell,
- visitPage,
-} from './smoke-helpers';
-
-test('changelog publishes dated progress without displacing the contact path', async ({ page }) => {
- await visitPage(page, '/changelog');
- await expectShell(page, /changelog|product progress|visible progress/i);
- await expectPageFamily(page, 'content');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expect(page.getByText('Initial core pages and IA realignment')).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Start the working session' }).first()).toBeVisible();
-});
-
-test('core IA publishes Tenantial homepage navigation without dead template routes', async ({ page }) => {
- await visitPage(page, '/');
-
- const header = page.getByRole('banner');
- const footer = page.getByRole('contentinfo');
-
- await expect(header.getByRole('link', { name: 'Platform', exact: true })).toHaveAttribute('href', '/platform');
- await expect(header.getByRole('link', { name: 'Solutions', exact: true })).toHaveAttribute('href', '/solutions');
- await expect(header.getByRole('link', { name: 'Resources', exact: true })).toHaveAttribute('href', '/changelog');
- await expect(header.getByRole('link', { name: 'Pricing', exact: true })).toHaveAttribute('href', '/contact');
- await expect(header.getByRole('link', { name: 'Company', exact: true })).toHaveAttribute('href', '/contact');
- await expect(header.getByRole('link', { name: 'Book a demo', exact: true })).toHaveAttribute('href', '/contact');
- await expect(header.locator('[data-nav-state="deferred"]').filter({ hasText: 'Sign in' }).first()).toBeVisible();
- await expect(header.getByRole('link', { name: 'Security & Trust' })).toHaveCount(0);
-
- for (const group of ['Platform', 'Solutions', 'Resources', 'Pricing', 'Company', 'Contact', 'Legal', 'Privacy', 'Security']) {
- await expect(footer.getByText(group, { exact: true }).first()).toBeVisible();
- }
-
- await expect(footer.getByRole('link', { name: 'Articles' })).toHaveCount(0);
- await expect(footer.getByRole('link', { name: 'Security & Trust' })).toHaveCount(0);
-});
diff --git a/apps/website/tests/smoke/contact-legal.spec.ts b/apps/website/tests/smoke/contact-legal.spec.ts
deleted file mode 100644
index 85486968..00000000
--- a/apps/website/tests/smoke/contact-legal.spec.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-import {
- coreRoutePaths,
- expectDisclosureLayer,
- expectFooterLinks,
- expectNavigationVsCtaDifferentiation,
- expectPageFamily,
- expectPrimaryNavigation,
- expectShell,
- openMobileNavigation,
- visitPage,
-} from './smoke-helpers';
-
-test('contact page qualifies the conversation and keeps legal links reachable', async ({ page }) => {
- await visitPage(page, '/contact');
- await expectShell(page, /working session|contact path|qualified/i);
- await expectPageFamily(page, 'content');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expect(
- page.getByRole('heading', {
- name: 'Structure the first conversation before anyone shares sensitive context.',
- }),
- ).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Email the Tenantial team' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Review the trust posture' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Privacy' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Terms' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Imprint' }).first()).toBeVisible();
-});
-
-test('legal, privacy, imprint, and terms routes are published and linked', async ({ page }) => {
- await visitPage(page, '/legal');
- await expectShell(page, /Legal access should stay one click away from the trust and contact path\./);
- await expectPageFamily(page, 'content');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expect(
- page.getByRole('heading', { name: 'Keep the legal baseline explicit without promoting it into the main navigation.' }),
- ).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Trust' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Terms' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Imprint' }).first()).toBeVisible();
-
- await visitPage(page, '/privacy');
- await expectShell(page, /Public-site privacy overview|privacy/i);
- await expectPageFamily(page, 'content');
-
- await visitPage(page, '/imprint');
- await expectShell(page, /Imprint|legal notice/i);
- await expectPageFamily(page, 'content');
-
- await visitPage(page, '/terms');
- await expectShell(page, /Website terms|terms/i);
- await expectPageFamily(page, 'content');
-});
-
-test('core pages keep contact and legal paths within reach', async ({ page }) => {
- for (const path of coreRoutePaths) {
- await visitPage(page, path);
- await expectFooterLinks(page);
-
- if (path !== '/contact') {
- await expect(page.locator('main a[href="/contact"]').first()).toBeVisible();
- }
- }
-});
-
-test.describe('mobile navigation', () => {
- test.use({ viewport: { width: 390, height: 844 } });
-
- test('mobile menu exposes the published contact and legal paths', async ({ page }) => {
- await visitPage(page, '/');
- await openMobileNavigation(page);
- await expect(page.locator('[data-mobile-nav]').first()).toBeVisible();
- await expect(page.getByRole('banner').getByRole('link', { name: 'Book a demo' }).first()).toBeVisible();
- await expect(page.getByRole('banner').getByRole('link', { name: 'Platform' }).first()).toBeVisible();
- await expect(page.getByRole('banner').getByRole('link', { name: 'Resources' }).first()).toBeVisible();
- await expect(page.getByRole('contentinfo').getByRole('link', { name: 'Privacy' })).toBeVisible();
- await expect(page.getByRole('contentinfo').getByRole('link', { name: 'Terms' })).toBeVisible();
- await expect(page.getByRole('contentinfo').getByRole('link', { name: 'Imprint' })).toBeVisible();
- });
-});
diff --git a/apps/website/tests/smoke/home-product.spec.ts b/apps/website/tests/smoke/home-product.spec.ts
deleted file mode 100644
index 7eab363f..00000000
--- a/apps/website/tests/smoke/home-product.spec.ts
+++ /dev/null
@@ -1,391 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-import {
- expectCompatibilityRedirect,
- expectCtaHierarchy,
- expectDisclosureLayer,
- expectFooterLinks,
- expectHomepageHeroCtaPair,
- expectHomepageHeroOrder,
- expectHomepageHeroRouteTargets,
- expectHomepageHeroStructure,
- expectHomepageHeroVisibleOnMobile,
- expectHomepageSectionOrder,
- expectMobileReadability,
- expectNavigationVsCtaDifferentiation,
- expectNoBodyHorizontalOverflow,
- expectOnwardRouteReachable,
- expectPageFamily,
- expectPrimaryNavigation,
- expectShell,
- visitPage,
-} from './smoke-helpers';
-
-const forbiddenHomepageTerms = [
- 'AstroDeck',
- 'Open Source',
- 'MIT Licensed',
- 'TenantCTRL',
- 'TenantPilot',
- 'TenantAtlas',
-] as const;
-
-const forbiddenPlatformTerms: Array<[string, RegExp]> = [
- ['AstroDeck', /AstroDeck/i],
- ['TemplateDeck', /TemplateDeck/i],
- ['Open Source', /Open Source/i],
- ['MIT', /\bMIT\b/i],
- ['TenantAtlas', /TenantAtlas/i],
- ['TenantPilot', /TenantPilot/i],
- ['TenantCTRL', /TenantCTRL/i],
-] as const;
-
-const unsupportedPlatformClaims = [
- /SOC 2/i,
- /\bISO(?:\s?\d+)?\b/i,
- /HIPAA/i,
- /blanket GDPR/i,
- /end-to-end encryption/i,
- /guaranteed recovery/i,
- /guaranteed compliance/i,
- /zero drift/i,
- /real-time everywhere/i,
- /trusted by/i,
- /customer logos/i,
- /Microsoft certification/i,
- /Microsoft partnership/i,
-] as const;
-
-async function expectForbiddenHomepageResidueAbsent(page: import('@playwright/test').Page): Promise {
- const body = page.locator('body');
- const metadata = await page.locator('head').evaluate((head) => {
- const title = document.title;
- const meta = Array.from(head.querySelectorAll('meta'))
- .map((element) => element.getAttribute('content') ?? '')
- .join(' ');
- const canonical = head.querySelector('link[rel="canonical"]')?.getAttribute('href') ?? '';
-
- return `${title} ${meta} ${canonical}`;
- });
-
- for (const term of forbiddenHomepageTerms) {
- await expect(body).not.toContainText(new RegExp(term, 'i'));
- expect(metadata, `Homepage metadata should not contain ${term}`).not.toMatch(new RegExp(term, 'i'));
- }
-}
-
-async function expectPlatformResidueAbsent(page: import('@playwright/test').Page): Promise {
- const body = page.locator('body');
- const metadata = await page.locator('head').evaluate((head) => {
- const title = document.title;
- const meta = Array.from(head.querySelectorAll('meta'))
- .map((element) => element.getAttribute('content') ?? '')
- .join(' ');
- const canonical = head.querySelector('link[rel="canonical"]')?.getAttribute('href') ?? '';
-
- return `${title} ${meta} ${canonical}`;
- });
-
- for (const [term, pattern] of forbiddenPlatformTerms) {
- await expect(body).not.toContainText(pattern);
- expect(metadata, `Platform metadata should not contain ${term}`).not.toMatch(pattern);
- }
-}
-
-test('home first read positions Tenantial with one clear action hierarchy', async ({ page }) => {
- await visitPage(page, '/');
- await expectShell(page, 'Evidence-first governance for Microsoft tenants.');
- await expectPageFamily(page, 'landing');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expectCtaHierarchy(page, 'Book a demo', 'Explore the platform');
- await expect(page.getByRole('main').getByRole('link', { name: 'Book a demo' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Explore the platform' }).first()).toBeVisible();
- await expect(page.getByRole('heading', { level: 1 })).toHaveCount(1);
- await expectForbiddenHomepageResidueAbsent(page);
-
- const skipLink = page.getByRole('link', { name: 'Skip to content' });
-
- await page.keyboard.press('Tab');
- await expect(skipLink).toBeFocused();
-});
-
-test('homepage hero explains Tenantial, Microsoft tenant context, and platform CTA route', async ({ page }) => {
- await visitPage(page, '/');
- await expectHomepageHeroStructure(page);
- await expect(page.locator('[data-homepage-hero="true"] [data-hero-eyebrow]')).toContainText(
- /governance that earns trust/i,
- );
- await expect(
- page.locator('[data-homepage-hero="true"] [data-hero-heading]').getByRole('heading', {
- level: 1,
- name: 'Evidence-first governance for Microsoft tenants.',
- }),
- ).toBeVisible();
- await expect(page.locator('[data-homepage-hero="true"] [data-hero-supporting-copy]')).toContainText(
- /backup and restore with confidence\. detect drift before it becomes audit work\. preserve snapshot history/i,
- );
- await expectHomepageHeroCtaPair(page, 'Book a demo', 'Explore the platform');
- await expectHomepageHeroRouteTargets(page, ['/contact', '/platform']);
-});
-
-test('homepage uses neutral trust statements and the six required feature pillars', async ({ page }) => {
- await visitPage(page, '/');
- await expect(page.locator('[data-section="trustbar"]')).toBeVisible();
- await expect(page.locator('[data-section="trustbar"]')).toContainText(/Microsoft tenant focused/i);
- await expect(page.locator('[data-section="trustbar"]')).toContainText(/Evidence-oriented workflows/i);
- await expect(page.locator('[data-section="trustbar"]')).toContainText(/Designed for audit review/i);
- await expect(page.locator('[data-section="trustbar"]')).toContainText(/Operator-led governance/i);
-
- const pillars = page.locator('[data-section="feature-pillars"]');
- await expect(pillars).toBeVisible();
-
- for (const capability of ['Backup', 'Restore', 'Drift Detection', 'Evidence', 'Audit Trail', 'Governance Reviews']) {
- await expect(pillars.getByRole('heading', { name: capability, exact: true })).toBeVisible();
- }
-
- await expect(page.locator('body')).not.toContainText(/SOC 2|ISO\s?\d*|99\.9%|trusted by|customer logos/i);
-});
-
-test('homepage dashboard preview is static, responsive, and explains status without color alone', async ({
- page,
-}) => {
- await visitPage(page, '/');
-
- const preview = page.locator('[data-dashboard-preview]').first();
-
- await expect(preview).toBeVisible();
- await expect(preview).toContainText('Static demo preview');
- await expect(preview).toContainText('Demo values');
- await expect(preview).toContainText('92%');
- await expect(preview).toContainText('14');
- await expect(preview).toContainText('7');
- await expect(preview).toContainText('1,248');
- await expect(preview).toContainText('98%');
-
- for (const panel of [
- 'Recent findings',
- 'Drift timeline',
- 'Backups and restores',
- 'Governance reviews',
- 'Evidence spotlight',
- ]) {
- await expect(preview.getByText(panel, { exact: true })).toBeVisible();
- }
-
- for (const status of ['Healthy', 'Review required', 'Critical', 'Review-ready']) {
- await expect(preview.getByText(status, { exact: true }).first()).toBeVisible();
- }
-
- await expect(preview).not.toContainText(/real[- ]?time|streaming|live tenant feed|May 19|Updated 2m ago/i);
-});
-
-test('homepage keeps the final CTA and launch-readiness sections in order', async ({ page }) => {
- await visitPage(page, '/');
- await expectHomepageSectionOrder(page, ['hero', 'trustbar', 'feature-pillars', 'cta']);
- await expect(page.locator('[data-section="cta"]')).toContainText(
- 'Build tenant governance on evidence, not assumptions.',
- );
- await expectOnwardRouteReachable(page, ['/platform', '/contact']);
-});
-
-test.describe('homepage mobile', () => {
- test.use({ viewport: { width: 390, height: 844 } });
-
- test('homepage remains readable on narrow screens without body overflow', async ({ page }) => {
- await visitPage(page, '/');
- await expectMobileReadability(page);
- await expectNoBodyHorizontalOverflow(page);
- await expect(page.locator('[data-section="trustbar"]')).toBeVisible();
- await expect(page.locator('[data-section="feature-pillars"]')).toBeVisible();
- await expect(page.locator('[data-dashboard-preview]').first()).toBeVisible();
- });
-
- test('homepage hero preserves meaning order and hero route intent on narrow screens', async ({ page }) => {
- await visitPage(page, '/');
- await expectHomepageHeroOrder(page, [
- 'eyebrow',
- 'headline',
- 'supporting-copy',
- 'cta-pair',
- 'trust-subclaims',
- 'product-near-visual',
- ]);
- await expectHomepageHeroVisibleOnMobile(page);
- await expectHomepageHeroRouteTargets(page, ['/contact', '/platform']);
- });
-});
-
-test('platform hero explains Tenantial governance model', async ({ page }) => {
- await visitPage(page, '/platform');
- await expectShell(page, /govern Microsoft tenants through evidence/i);
- await expectPageFamily(page, 'landing');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
-
- const main = page.getByRole('main');
-
- await expect(main.locator('[data-hero-eyebrow]').first()).toContainText(/TENANTIAL PLATFORM/i);
- await expect(page.getByRole('heading', { level: 1 })).toHaveCount(1);
- await expect(page.getByRole('heading', { level: 1 })).toContainText(
- /govern Microsoft tenants through evidence/i,
- );
- await expect(main.locator('[data-hero-supporting-copy]').first()).toContainText(/backup records/i);
- await expect(main.locator('[data-hero-supporting-copy]').first()).toContainText(/configuration drift/i);
- await expect(main.locator('[data-hero-supporting-copy]').first()).toContainText(/structured reviews/i);
- await expectCtaHierarchy(page, 'Book a demo', 'See the governance loop');
- await expect(main.locator('a[href="/contact"]').filter({ hasText: 'Book a demo' }).first()).toBeVisible();
- await expect(main.locator('a[href="#governance-loop"]').filter({ hasText: 'See the governance loop' }).first()).toBeVisible();
- await expect(main.locator('[data-platform-dashboard-preview]').first()).toBeVisible();
- await expect(main.locator('[data-platform-dashboard-preview]').first()).toContainText(/Governance overview/i);
- await expect(main.locator('[data-platform-dashboard-preview]').first()).toContainText(/Static demo preview/i);
- await expect(main.locator('[data-platform-dashboard-preview]').first()).toContainText(/Evidence spotlight/i);
-
- for (const signal of [
- 'Microsoft tenant focused',
- 'Evidence-oriented workflows',
- 'Reviewable decisions',
- 'Operator-led governance',
- ]) {
- await expect(main.locator('[data-hero-trust-subclaims]').getByText(signal, { exact: true })).toBeVisible();
- }
-});
-
-test('platform metadata is Tenantial clean', async ({ page }) => {
- await visitPage(page, '/platform');
-
- await expect(page).toHaveTitle(/Tenantial Platform/i);
- await expect(page).toHaveTitle(/Evidence-first governance/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /backup/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /restore/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /drift detection/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /findings/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /evidence/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /audit trails/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /exceptions/i);
- await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /reviews/i);
- await expect(page.locator('link[rel="canonical"]')).toHaveAttribute('href', /\/platform$/);
- await expectPlatformResidueAbsent(page);
-});
-
-test('platform governance flow explains reviewable evidence', async ({ page }) => {
- await visitPage(page, '/platform');
-
- const operatingModel = page.locator('[data-section="operating-model"]');
- const governanceLoop = page.locator('[data-section="governance-loop"]');
-
- await expect(operatingModel).toBeVisible();
-
- await expect(operatingModel.locator('[data-operating-flow]')).toBeVisible();
-
- for (const step of ['Snapshot', 'Drift', 'Finding', 'Review', 'Evidence', 'Audit trail']) {
- await expect(operatingModel.getByText(step, { exact: true })).toBeVisible();
- }
-
- await expect(governanceLoop).toBeVisible();
- await expect(governanceLoop.locator('[data-governance-loop-diagram]')).toBeVisible();
-
- for (const label of [
- 'Source of truth',
- 'Snapshot',
- 'Diff',
- 'Finding',
- 'Exception',
- 'Review',
- 'Evidence',
- 'Audit trail',
- ]) {
- await expect(governanceLoop.getByText(label, { exact: true })).toBeVisible();
- }
-
- await expect(governanceLoop).toContainText(/operator reviews/i);
- await expect(governanceLoop).toContainText(/evidence/i);
- await expect(governanceLoop).toContainText(/auditability/i);
-});
-
-test('platform governance flow avoids automation guarantees', async ({ page }) => {
- await visitPage(page, '/platform');
-
- await expect(page.locator('body')).not.toContainText(
- /automatic remediation|guaranteed recovery|live device actions|real-time tenant operations/i,
- );
-});
-
-test('platform capabilities cover governance primitives', async ({ page }) => {
- await visitPage(page, '/platform');
-
- const capabilities = page.locator('[data-section="platform-capabilities"]');
-
- await expect(capabilities).toBeVisible();
-
- await expect(capabilities.locator('[data-capability-system-grid]')).toBeVisible();
- await expect(capabilities.locator('[data-capability-primary]')).toBeVisible();
- await expect(capabilities.getByRole('heading', { name: 'Backup & Restore', exact: true })).toBeVisible();
-
- for (const capability of [
- 'Drift Detection',
- 'Findings',
- 'Evidence',
- 'Audit Trail',
- 'Exceptions',
- 'Governance Reviews',
- ]) {
- await expect(capabilities.getByRole('heading', { name: capability, exact: true })).toBeVisible();
- }
-});
-
-test('platform boundaries keep claims conservative', async ({ page }) => {
- await visitPage(page, '/platform');
-
- const boundaries = page.locator('[data-section="platform-boundaries"]');
-
- await expect(boundaries).toBeVisible();
- await expect(boundaries).toContainText(/Built for governance of record/i);
- await expect(boundaries).toContainText(/do not take actions on your behalf/i);
- await expect(boundaries).toContainText(/do not manage devices/i);
- await expect(boundaries).toContainText(/do not replace your ITSM/i);
- await expect(boundaries).toContainText(/support reviewable decisions/i);
-
- for (const claim of unsupportedPlatformClaims) {
- await expect(page.locator('body')).not.toContainText(claim);
- }
-});
-
-test.describe('platform mobile', () => {
- test.use({ viewport: { width: 390, height: 844 } });
-
- test('platform mobile layout stays readable without overflow', async ({ page }) => {
- await visitPage(page, '/platform');
- await expectMobileReadability(page);
- await expectNoBodyHorizontalOverflow(page);
- await expect(page.locator('[data-section="platform-capabilities"]').first()).toBeVisible();
- await expect(page.locator('[data-section="platform-boundaries"]').first()).toBeVisible();
- await expect(page.locator('[data-section="platform-capabilities"]').first()).toContainText(/Backup/i);
- await expect(page.locator('[data-truth-layer-stack]').first()).toBeVisible();
- await expect(page.locator('[data-governance-loop-diagram]').first()).toBeVisible();
- await expect(page.locator('[data-section="platform-boundaries"]').first()).toContainText(/governance of record/i);
- expect(await page.locator('[data-color-meaning="with-text"]').count()).toBeGreaterThan(0);
- });
-});
-
-test('primary navigation and footer point Platform links to platform', async ({ page }) => {
- await visitPage(page, '/platform');
- await expectPrimaryNavigation(page);
- await expectFooterLinks(page);
- await expect(page.getByRole('contentinfo')).toHaveAttribute('data-footer-intent', 'quiet');
- await expect(page.locator('[data-section="platform-final-cta"]')).toBeVisible();
- await expect(page.getByRole('contentinfo')).not.toContainText(/Build tenant governance on evidence/i);
-});
-
-test('product redirects to platform', async ({ page }) => {
- await expectCompatibilityRedirect(page, '/product', '/platform');
- await expect(page.locator('body')).not.toContainText(
- /AstroDeck|TemplateDeck|Open Source|MIT Licensed|TenantAtlas|TenantPilot|TenantCTRL/i,
- );
-});
diff --git a/apps/website/tests/smoke/interaction.spec.ts b/apps/website/tests/smoke/interaction.spec.ts
new file mode 100644
index 00000000..1bc9b113
--- /dev/null
+++ b/apps/website/tests/smoke/interaction.spec.ts
@@ -0,0 +1,34 @@
+import { expect, test } from '@playwright/test';
+import { expectNoHorizontalOverflow } from './smoke-helpers';
+
+test('mobile navigation opens with vendored foundation behavior', async ({
+ page,
+ isMobile,
+}) => {
+ test.skip(!isMobile, 'mobile navigation is covered by the mobile project');
+
+ await page.goto('/');
+ await page.getByLabel('Toggle navigation').click();
+
+ const mobilePanel = page.locator('#navbar-collapse-with-animation');
+
+ await expect(
+ mobilePanel.getByRole('link', { name: 'Platform', exact: true }),
+ ).toBeVisible();
+ await expect(
+ mobilePanel.getByRole('link', { name: 'Request walkthrough' }),
+ ).toBeVisible();
+ await expectNoHorizontalOverflow(page);
+});
+
+test('theme toggle keeps page content visible', async ({ page }) => {
+ await page.goto('/');
+
+ await page.locator('button[aria-label="Dark Theme Toggle"]:visible').click();
+ await expect(page.getByRole('heading', { name: /Evidence-first governance/ }))
+ .toBeVisible();
+
+ await page.locator('button[aria-label="Light Theme Toggle"]:visible').click();
+ await expect(page.getByRole('heading', { name: /Evidence-first governance/ }))
+ .toBeVisible();
+});
diff --git a/apps/website/tests/smoke/public-routes.spec.ts b/apps/website/tests/smoke/public-routes.spec.ts
new file mode 100644
index 00000000..3da9b140
--- /dev/null
+++ b/apps/website/tests/smoke/public-routes.spec.ts
@@ -0,0 +1,42 @@
+import { expect, test } from '@playwright/test';
+import {
+ expectNoForbiddenPublicText,
+ expectNoHorizontalOverflow,
+ redirectRoutes,
+ renderedRoutes,
+} from './smoke-helpers';
+
+for (const route of renderedRoutes) {
+ test(`renders intentional route ${route}`, async ({ page }) => {
+ await page.goto(route);
+
+ await expect(page.locator('body')).toContainText('Tenantial');
+ await expectNoForbiddenPublicText(page);
+ await expectNoHorizontalOverflow(page);
+ });
+}
+
+for (const route of redirectRoutes) {
+ test(`redirects ${route} intentionally`, async ({ page }) => {
+ await page.goto(route);
+
+ await expect(page).toHaveURL(/\/platform\/?$/);
+ await expect(page.getByRole('heading', { name: /Platform review model/ }))
+ .toBeVisible();
+ });
+}
+
+test('robots and sitemap are available', async ({ page }) => {
+ await page.goto('/robots.txt');
+ await expect(page.locator('body')).toContainText('Sitemap:');
+
+ await page.goto('/sitemap-index.xml');
+ await expect(page.locator('body')).toContainText('sitemap-0.xml');
+
+ await page.goto('/sitemap-0.xml');
+ const sitemap = await page.locator('body').innerText();
+
+ for (const route of redirectRoutes) {
+ expect(sitemap).not.toContain(`https://tenantial.com${route}/`);
+ }
+});
diff --git a/apps/website/tests/smoke/smoke-helpers.ts b/apps/website/tests/smoke/smoke-helpers.ts
index 8db0e252..0220b342 100644
--- a/apps/website/tests/smoke/smoke-helpers.ts
+++ b/apps/website/tests/smoke/smoke-helpers.ts
@@ -1,381 +1,57 @@
import { expect, type Page } from '@playwright/test';
-export const coreRoutePaths = ['/', '/platform', '/trust', '/changelog', '/contact', '/privacy', '/imprint'] as const;
-export const secondaryRoutePaths = ['/legal', '/terms', '/solutions', '/integrations'] as const;
-
-export const primaryNavigationLabels = ['Platform', 'Solutions', 'Resources', 'Pricing', 'Company'] as const;
-export const hiddenPrimaryNavigationLabels = ['Product', 'Security & Trust', 'Articles'] as const;
-
-export const footerGroupLabels = [
- 'Platform',
- 'Solutions',
- 'Resources',
- 'Pricing',
- 'Company',
- 'Contact',
- 'Legal',
- 'Privacy',
- 'Security',
+export const renderedRoutes = [
+ '/',
+ '/platform',
+ '/pricing',
+ '/contact',
+ '/trust',
+ '/legal',
+ '/privacy',
+ '/terms',
+ '/imprint',
+ '/welcome-to-docs/',
] as const;
-export const footerLabels = [
- 'Explore the platform',
- 'Solutions',
- 'Changelog',
- 'Book a demo',
- 'Contact',
- 'Legal',
- 'Imprint',
- 'Privacy',
- 'Trust',
+
+export const redirectRoutes = [
+ '/product',
+ '/products',
+ '/services',
+ '/blog',
+ '/insights',
] as const;
-export const hiddenFooterLabels = ['Articles', 'Security & Trust', 'Contact / Demo'] as const;
-export async function visitPage(page: Page, path: string): Promise {
- await page.goto(path);
- await expect(page).toHaveURL(new RegExp(path === '/' ? '/?$' : `${path}$`));
+const forbiddenPublicText = [
+ 'ScrewFast',
+ 'construction',
+ 'hardware',
+ 'template',
+ 'open-source',
+ 'TenantAtlas',
+ 'TenantPilot',
+ 'TenantCTRL',
+ 'trusted by',
+ 'SOC 2',
+ 'ISO 27001',
+ '99.9%',
+ 'Microsoft endorsed',
+ 'guaranteed recovery',
+ 'guaranteed compliance',
+];
+
+export async function expectNoForbiddenPublicText(page: Page): Promise {
+ const text = await page.locator('body').innerText();
+
+ for (const term of forbiddenPublicText) {
+ expect(text.toLowerCase()).not.toContain(term.toLowerCase());
+ }
}
-export async function expectCompatibilityRedirect(page: Page, legacyPath: string, canonicalPath: string): Promise {
- await page.goto(legacyPath);
- await page.waitForURL(new RegExp(canonicalPath === '/' ? '/?$' : `${canonicalPath}$`));
- await expect(page).toHaveURL(new RegExp(canonicalPath === '/' ? '/?$' : `${canonicalPath}$`));
-}
-
-export async function expectShell(page: Page, heading: string | RegExp): Promise {
- await expect(page.getByRole('banner')).toBeVisible();
- await expect(page.getByRole('main')).toBeVisible();
- await expect(page.getByRole('contentinfo')).toBeVisible();
- await expect(page.getByRole('heading', { level: 1, name: heading })).toBeVisible();
-}
-
-export async function expectPageFamily(page: Page, family: 'content' | 'landing' | 'trust'): Promise {
- await expect(page.locator(`[data-page-family="${family}"]`).first()).toBeVisible();
-}
-
-export async function expectPrimaryNavigation(page: Page): Promise {
- const header = page.getByRole('banner');
- const expectedRoutes: Record<(typeof primaryNavigationLabels)[number], string> = {
- Platform: '/platform',
- Solutions: '/solutions',
- Resources: '/changelog',
- Pricing: '/contact',
- Company: '/contact',
- };
-
- for (const label of primaryNavigationLabels) {
- const link = header.getByRole('link', { name: label, exact: true }).first();
-
- await expect(link).toBeVisible();
- await expect(link).toHaveAttribute('data-nav-link');
- await expect(link).toHaveAttribute('href', expectedRoutes[label]);
- }
-
- for (const label of hiddenPrimaryNavigationLabels) {
- await expect(header.getByRole('link', { name: label, exact: true })).toHaveCount(0);
- }
-
- await expect(header.getByText('Sign in', { exact: true }).first()).toBeVisible();
- await expect(header.locator('[data-nav-state="deferred"]').filter({ hasText: 'Sign in' }).first()).toBeVisible();
- await expect(header.getByRole('link', { name: 'Book a demo', exact: true }).first()).toHaveAttribute(
- 'href',
- '/contact',
- );
-}
-
-export async function expectFooterLinks(page: Page): Promise {
- const footer = page.getByRole('contentinfo');
- const expectedRoutes: Partial> = {
- 'Explore the platform': '/platform',
- };
-
- for (const label of footerGroupLabels) {
- await expect(footer.getByText(label, { exact: true }).first()).toBeVisible();
- }
-
- for (const label of footerLabels) {
- const link = footer.getByRole('link', { name: label, exact: true }).first();
-
- await expect(link).toBeVisible();
-
- if (expectedRoutes[label]) {
- await expect(link).toHaveAttribute('href', expectedRoutes[label]);
- }
- }
-
- for (const label of hiddenFooterLabels) {
- await expect(footer.getByRole('link', { name: label, exact: true })).toHaveCount(0);
- }
-}
-
-export async function openMobileNavigation(page: Page): Promise {
- const menuTrigger = page.getByLabel('Open navigation menu');
-
- if (await menuTrigger.isVisible()) {
- await menuTrigger.click();
- }
-}
-
-export async function expectDisclosureLayer(page: Page, layer: '1' | '2' | '3'): Promise {
- await expect(page.locator(`[data-disclosure-layer="${layer}"]`).first()).toBeVisible();
-}
-
-export async function expectCtaHierarchy(
- page: Page,
- primaryLabel: string | RegExp,
- secondaryLabel: string | RegExp,
-): Promise {
- const main = page.getByRole('main');
-
- await expect(main.locator('[data-cta-weight="primary"]').filter({ hasText: primaryLabel }).first()).toBeVisible();
- await expect(
- main.locator('[data-cta-weight="secondary"]').filter({ hasText: secondaryLabel }).first(),
- ).toBeVisible();
-}
-
-export async function expectHomepageHeroStructure(page: Page): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
-
- await expect(hero).toBeVisible();
- await expect(hero.locator('[data-hero-text-core]').first()).toBeVisible();
- await expect(hero.locator('[data-hero-eyebrow]').first()).toBeVisible();
- await expect(hero.locator('[data-hero-heading]').getByRole('heading', { level: 1 })).toBeVisible();
- await expect(hero.locator('[data-hero-supporting-copy]').first()).toBeVisible();
- await expect(hero.locator('[data-hero-cta-pair]').first()).toBeVisible();
- await expect(hero.locator('[data-cta-slot="primary"]')).toHaveCount(1);
- await expect(hero.locator('[data-cta-slot="secondary"]')).toHaveCount(1);
- await expect(hero.locator('[data-hero-visual]').first()).toBeVisible();
-}
-
-export async function expectHomepageHeroCtaPair(
- page: Page,
- primaryLabel: string | RegExp,
- secondaryLabel: string | RegExp,
-): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
-
- await expect(hero.locator('[data-cta-weight="primary"]').filter({ hasText: primaryLabel }).first()).toBeVisible();
- await expect(
- hero.locator('[data-cta-weight="secondary"]').filter({ hasText: secondaryLabel }).first(),
- ).toBeVisible();
-}
-
-export async function expectHomepageHeroPrimaryAnchor(
- page: Page,
- anchor: 'headline' | 'product-visual' | 'composition',
-): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
-
- await expect(hero.locator(`[data-hero-primary-anchor="${anchor}"]`).first()).toBeVisible();
- await expect(hero.locator('[data-hero-primary-anchor]')).toHaveCount(1);
-}
-
-export async function expectHomepageHeroSupportingCopySubordination(page: Page): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const heading = hero.locator('[data-hero-heading]').getByRole('heading', { level: 1 }).first();
- const supportingCopy = hero.locator('[data-hero-supporting-copy] p').first();
-
- await expect(hero.locator('[data-hero-supporting-copy]').first()).toHaveAttribute('data-hero-copy-role', 'supporting');
-
- const [headingFontSize, supportingCopyFontSize] = await Promise.all([
- heading.evaluate((element) => Number.parseFloat(window.getComputedStyle(element).fontSize)),
- supportingCopy.evaluate((element) => Number.parseFloat(window.getComputedStyle(element).fontSize)),
- ]);
-
- expect(headingFontSize, 'Hero heading should remain larger than supporting copy').toBeGreaterThan(
- supportingCopyFontSize,
- );
-}
-
-export async function expectHomepageHeroAnchorCtaAlignment(page: Page): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const anchorGroup = hero.locator('[data-hero-anchor-group]').first();
-
- await expect(anchorGroup).toBeVisible();
- await expect(anchorGroup.locator('[data-hero-heading]').first()).toBeVisible();
- await expect(anchorGroup.locator('[data-hero-cta-pair]').first()).toBeVisible();
-}
-
-export async function expectHomepageHeroOrder(
- page: Page,
- segments: Array<'eyebrow' | 'headline' | 'supporting-copy' | 'cta-pair' | 'product-near-visual' | 'trust-subclaims'>,
-): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const actual = await hero.locator('[data-hero-segment]').evaluateAll((elements) =>
- elements
- .map((element) => element.getAttribute('data-hero-segment'))
- .filter(Boolean),
- );
-
- for (let i = 0; i < segments.length; i++) {
- expect(actual.indexOf(segments[i]), `Hero segment "${segments[i]}" should exist`).toBeGreaterThanOrEqual(0);
-
- if (i > 0) {
- expect(
- actual.indexOf(segments[i]),
- `Hero segment "${segments[i]}" should appear after "${segments[i - 1]}"`,
- ).toBeGreaterThan(actual.indexOf(segments[i - 1]));
- }
- }
-}
-
-export async function expectHomepageHeroTrustSignals(page: Page): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const trustSignals = hero.locator('[data-hero-trust-signals] li');
- const count = await trustSignals.count();
-
- await expect(hero.locator('[data-hero-trust-signals]').first()).toBeVisible();
- expect(count).toBeGreaterThan(0);
- expect(count).toBeLessThanOrEqual(3);
-}
-
-export async function expectHomepageHeroVisualSemantics(
- page: Page,
- terms: Array,
-): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const visual = hero.locator('[data-hero-visual]').first();
-
- await expect(visual).toBeVisible();
- await expect(visual).toHaveAttribute('data-hero-visual-style', 'governance-surface');
-
- for (const term of terms) {
- await expect(visual).toContainText(term);
- }
-}
-
-export async function expectHomepageHeroSplitLayout(page: Page): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
- const textPanel = hero.locator('[data-hero-panel="text"]').first();
- const visualPanel = hero.locator('[data-hero-panel="dashboard"]').first();
-
- await expect(textPanel).toBeVisible();
- await expect(visualPanel).toBeVisible();
-
- const [textBox, visualBox] = await Promise.all([textPanel.boundingBox(), visualPanel.boundingBox()]);
-
- expect(textBox, 'Hero text panel should have a bounding box').not.toBeNull();
- expect(visualBox, 'Hero visual panel should have a bounding box').not.toBeNull();
-
- if (!textBox || !visualBox) {
- return;
- }
-
- expect(
- textBox.x + textBox.width,
- 'Desktop hero text should end before the visual surface begins so both read as one split composition',
- ).toBeLessThanOrEqual(visualBox.x + 48);
- expect(
- Math.abs(textBox.y - visualBox.y),
- 'Desktop hero text and visual should share a horizontal composition instead of stacking far apart',
- ).toBeLessThan(140);
-}
-
-async function expectLocatorInInitialViewport(page: Page, selector: string, label: string): Promise {
- const locator = page.locator(selector).first();
- const box = await locator.boundingBox();
- const viewport = page.viewportSize();
-
- await expect(locator).toBeVisible();
-
- expect(box, `${label} should have a bounding box`).not.toBeNull();
- expect(viewport, 'Viewport should be available').not.toBeNull();
-
- if (!box || !viewport) {
- return;
- }
-
- expect(box.y, `${label} should start within the initial viewport`).toBeLessThan(viewport.height);
- expect(box.y + Math.min(box.height, 32), `${label} should remain on screen at first paint`).toBeGreaterThan(0);
-}
-
-export async function expectHomepageHeroVisibleOnMobile(page: Page): Promise {
- await expectLocatorInInitialViewport(
- page,
- '[data-homepage-hero="true"] [data-hero-primary-anchor]',
- 'Hero primary anchor',
- );
- await expectLocatorInInitialViewport(page, '[data-homepage-hero="true"] [data-hero-cta-pair]', 'Hero CTA pair');
- await expect(page.locator('[data-homepage-hero="true"] [data-hero-visual]').first()).toBeVisible();
-}
-
-export async function expectHomepageHeroRouteTargets(page: Page, routes: string[]): Promise {
- const hero = page.locator('[data-homepage-hero="true"]').first();
-
- for (const route of routes) {
- await expect(hero.locator(`a[href="${route}"]`).first(), `Route "${route}" should be reachable from hero`).toBeVisible();
- }
-}
-
-export async function expectNavigationVsCtaDifferentiation(page: Page): Promise {
- const header = page.getByRole('banner');
-
- await expect(header.locator('[data-nav-link]').first()).toBeVisible();
- await expect(header.locator('[data-header-cta]').first()).toBeVisible();
-}
-
-export async function expectHomepageSectionOrder(page: Page, sections: string[]): Promise {
- const main = page.getByRole('main');
- const sectionElements = main.locator('[data-section]');
- const count = await sectionElements.count();
- const actual: string[] = [];
-
- for (let i = 0; i < count; i++) {
- const name = await sectionElements.nth(i).getAttribute('data-section');
-
- if (name) {
- actual.push(name);
- }
- }
-
- for (let i = 0; i < sections.length; i++) {
- expect(actual.indexOf(sections[i]), `Section "${sections[i]}" should appear in order`).toBeGreaterThanOrEqual(0);
-
- if (i > 0) {
- expect(
- actual.indexOf(sections[i]),
- `Section "${sections[i]}" should appear after "${sections[i - 1]}"`,
- ).toBeGreaterThan(actual.indexOf(sections[i - 1]));
- }
- }
-}
-
-export async function expectProductNearVisual(page: Page, alt?: string | RegExp): Promise {
- const main = page.getByRole('main');
- const visual = main.locator('[data-hero-visual] img, [data-hero-visual]').first();
-
- await expect(visual).toBeVisible();
-
- if (alt) {
- await expect(main.getByRole('img', { name: alt }).first()).toBeVisible();
- }
-}
-
-export async function expectMobileReadability(page: Page): Promise {
- const main = page.getByRole('main');
-
- await expect(main).toBeVisible();
- await expect(page.getByRole('banner')).toBeVisible();
- await expect(page.getByRole('contentinfo')).toBeVisible();
-}
-
-export async function expectNoBodyHorizontalOverflow(page: Page): Promise {
- const overflow = await page.evaluate(() => {
- const documentElement = document.documentElement;
- const body = document.body;
-
- return Math.max(documentElement.scrollWidth, body.scrollWidth) - documentElement.clientWidth;
- });
-
- expect(overflow, 'Page should not create body-level horizontal overflow').toBeLessThanOrEqual(1);
-}
-
-export async function expectOnwardRouteReachable(page: Page, routes: string[]): Promise {
- const main = page.getByRole('main');
-
- for (const route of routes) {
- await expect(
- main.locator(`a[href="${route}"]`).first(),
- `Route "${route}" should be reachable from main content`,
- ).toBeVisible();
- }
+export async function expectNoHorizontalOverflow(page: Page): Promise {
+ const metrics = await page.evaluate(() => ({
+ clientWidth: document.documentElement.clientWidth,
+ scrollWidth: document.documentElement.scrollWidth,
+ }));
+
+ expect(metrics.scrollWidth).toBeLessThanOrEqual(metrics.clientWidth + 1);
}
diff --git a/apps/website/tests/smoke/solutions-trust-integrations.spec.ts b/apps/website/tests/smoke/solutions-trust-integrations.spec.ts
deleted file mode 100644
index 1dea8ac2..00000000
--- a/apps/website/tests/smoke/solutions-trust-integrations.spec.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-import {
- expectCompatibilityRedirect,
- expectDisclosureLayer,
- expectFooterLinks,
- expectNavigationVsCtaDifferentiation,
- expectPageFamily,
- expectPrimaryNavigation,
- expectShell,
- visitPage,
-} from './smoke-helpers';
-
-test('solutions keeps MSP and enterprise audience fit inside one landing-page rhythm', async ({ page }) => {
- await visitPage(page, '/solutions');
- await expectShell(page, /MSP|enterprise|outcome/i);
- await expectPageFamily(page, 'content');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expect(
- page.getByRole('heading', { name: 'Keep audience fit visible without promoting this page into the core route set.' }),
- ).toBeVisible();
- await expect(page.getByRole('heading', { name: 'MSP operating model' })).toBeVisible();
- await expect(page.getByRole('heading', { name: 'Enterprise IT operating model' })).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'See the product model' }).first()).toBeVisible();
-});
-
-test('security and trust stays grounded in substantiated product posture and layered disclosure', async ({
- page,
-}) => {
- await visitPage(page, '/trust');
- await expectShell(page, /trust posture|trust|operating discipline/i);
- await expectPageFamily(page, 'trust');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expect(
- page.getByRole('heading', { name: 'Ground public trust claims in operator safeguards and explicit boundaries.' }),
- ).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Start the working session' }).first()).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Read the imprint' }).first()).toBeVisible();
-});
-
-test('legacy security trust route redirects to the canonical trust surface', async ({ page }) => {
- await expectCompatibilityRedirect(page, '/security-trust', '/trust');
-});
-
-test('integrations shows real ecosystem direction without wishlist claims or shell drift', async ({ page }) => {
- await visitPage(page, '/integrations');
- await expectShell(page, /ecosystem fit|integrations/i);
- await expectPageFamily(page, 'content');
- await expectDisclosureLayer(page, '1');
- await expectDisclosureLayer(page, '2');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectFooterLinks(page);
- await expect(
- page.getByRole('heading', { name: 'Keep ecosystem fit visible without pretending it belongs in primary navigation.' }),
- ).toBeVisible();
- await expect(page.getByText('Microsoft Graph')).toBeVisible();
- await expect(page.getByText('Entra ID')).toBeVisible();
- await expect(page.getByRole('main').getByRole('link', { name: 'Plan the working session' }).first()).toBeVisible();
-});
diff --git a/apps/website/tests/smoke/visual-foundation-guardrails.spec.ts b/apps/website/tests/smoke/visual-foundation-guardrails.spec.ts
deleted file mode 100644
index 85bbc21b..00000000
--- a/apps/website/tests/smoke/visual-foundation-guardrails.spec.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-import {
- expectCtaHierarchy,
- expectNavigationVsCtaDifferentiation,
- expectPageFamily,
- expectPrimaryNavigation,
- expectShell,
- visitPage,
-} from './smoke-helpers';
-
-test('representative pages route CTA, badge, surface, and input semantics through shared primitives', async ({
- page,
-}) => {
- await visitPage(page, '/');
- await expectShell(page, 'Evidence-first governance for Microsoft tenants.');
- await expectPageFamily(page, 'landing');
- await expectPrimaryNavigation(page);
- await expectNavigationVsCtaDifferentiation(page);
- await expectCtaHierarchy(page, 'Book a demo', 'Explore the platform');
- await expect(page.locator('[data-interaction="button"]').filter({ hasText: 'Book a demo' }).first()).toBeVisible();
- await expect(page.locator('[data-badge-tone]').first()).toBeVisible();
- await expect(page.locator('[data-shell-surface="header"]').first()).toHaveAttribute('data-visual-tone', 'dark');
- await expect(page.locator('[data-section="feature-pillars"] [data-surface="tenantial-pillar"]').first()).toBeVisible();
-
- await visitPage(page, '/trust');
- await expectShell(page, /trust posture|trust/i);
- await expect(page.locator('[data-surface="accent"]').first()).toBeVisible();
- await expect(page.locator('[data-badge-tone]').first()).toBeVisible();
-
- await visitPage(page, '/contact');
- await expectShell(page, /contact path|working session|qualified/i);
- await expect(page.locator('[data-interaction="input"]').first()).toBeVisible();
- await expect(page.locator('[data-interaction="textarea"]').first()).toBeVisible();
- await expect(
- page.locator('[data-button-variant="secondary"]').filter({ hasText: 'Privacy' }).first(),
- ).toBeVisible();
-});
diff --git a/apps/website/tsconfig.json b/apps/website/tsconfig.json
index f4a9cdb2..e711d5e6 100644
--- a/apps/website/tsconfig.json
+++ b/apps/website/tsconfig.json
@@ -1,18 +1,17 @@
{
- "extends": "astro/tsconfigs/strict",
- "compilerOptions": {
- "baseUrl": ".",
- "paths": {
- "@/*": [
- "src/*"
- ]
- }
- },
- "include": [
- ".astro/types.d.ts",
- "**/*"
- ],
- "exclude": [
- "dist"
- ]
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"],
+ "@components/*": ["./src/components/*"],
+ "@content/*": ["./src/content/*"],
+ "@data/*": ["./src/data_files/*"],
+ "@images/*": ["./src/images/*"],
+ "@scripts/*": ["./src/assets/scripts/*"],
+ "@styles/*": ["./src/assets/styles/*"],
+ "@utils/*": ["./src/utils/*"]
+ }
+ },
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"]
}
diff --git a/apps/website/vercel.json b/apps/website/vercel.json
new file mode 100644
index 00000000..ffa6109e
--- /dev/null
+++ b/apps/website/vercel.json
@@ -0,0 +1,41 @@
+{
+ "headers": [
+ {
+ "source": "/(.*)",
+ "headers": [
+ {
+ "key": "Content-Security-Policy",
+ "value": "default-src 'self'; base-uri 'self'; form-action 'self'; frame-src 'self'; frame-ancestors 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://images.unsplash.com; connect-src 'self'; object-src 'none'; upgrade-insecure-requests; block-all-mixed-content"
+ },
+ {
+ "key": "Permissions-Policy",
+ "value": "interest-cohort=()"
+ },
+ {
+ "key": "Referrer-Policy",
+ "value": "no-referrer-when-downgrade"
+ },
+ {
+ "key": "X-Content-Type-Options",
+ "value": "nosniff"
+ },
+ {
+ "key": "X-Frame-Options",
+ "value": "SAMEORIGIN"
+ },
+ {
+ "key": "X-XSS-Protection",
+ "value": "1; mode=block"
+ },
+ {
+ "key": "Cache-Control",
+ "value": "public, max-age=0, must-revalidate"
+ },
+ {
+ "key": "Strict-Transport-Security",
+ "value": "max-age=31536000; includeSubDomains; preload"
+ }
+ ]
+ }
+ ]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e2126747..f3a265d1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,7 +12,7 @@ importers:
devDependencies:
'@tailwindcss/vite':
specifier: ^4.0.0
- version: 4.2.2(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))
+ version: 4.2.2(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))
axios:
specifier: ^1.11.0
version: 1.14.0
@@ -27,7 +27,7 @@ importers:
version: 0.45.2(pg@8.20.0)
laravel-vite-plugin:
specifier: ^2.0.0
- version: 2.1.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))
+ version: 2.1.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))
pg:
specifier: ^8.16.3
version: 8.20.0
@@ -39,61 +39,141 @@ importers:
version: 4.2.2
vite:
specifier: ^7.0.7
- version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)
+ version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
apps/website:
dependencies:
- '@iconify-json/lucide':
- specifier: ^1.2.102
- version: 1.2.102
+ '@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.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(typescript@6.0.3)
+ '@tailwindcss/vite':
+ specifier: ^4.3.0
+ version: 4.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))
astro:
- specifier: ^6.0.0
- version: 6.1.4(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(tsx@4.21.0)(typescript@5.9.3)
- astro-icon:
- specifier: ^1.1.5
- version: 1.1.5
+ specifier: ^6.3.3
+ version: 6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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:
'@playwright/test':
specifier: ^1.59.1
version: 1.59.1
- '@tailwindcss/vite':
- specifier: ^4.2.2
- version: 4.2.2(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))
- '@types/node':
- specifier: ^24.7.2
- version: 24.12.2
- tailwindcss:
- specifier: ^4.2.2
- version: 4.2.2
+ '@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: ^5.9.3
- version: 5.9.3
+ specifier: ^6.0.3
+ version: 6.0.3
packages:
- '@antfu/install-pkg@1.1.0':
- resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+ '@astrojs/check@0.9.9':
+ resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0 || ^6.0.0
- '@antfu/utils@8.1.1':
- resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+ '@astrojs/compiler@2.13.1':
+ resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==}
- '@astrojs/compiler@3.0.1':
- resolution: {integrity: sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==}
+ '@astrojs/compiler@4.0.0':
+ resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==}
- '@astrojs/internal-helpers@0.8.0':
- resolution: {integrity: sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w==}
+ '@astrojs/internal-helpers@0.9.1':
+ resolution: {integrity: sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ==}
- '@astrojs/markdown-remark@7.1.0':
- resolution: {integrity: sha512-P+HnCsu2js3BoTc8kFmu+E9gOcFeMdPris75g+Zl4sY8+bBRbSQV6xzcBDbZ27eE7yBGEGQoqjpChx+KJYIPYQ==}
+ '@astrojs/language-server@2.16.9':
+ resolution: {integrity: sha512-L9kddTg+ZSO3X0Pwfx0ZPO+Z+eSSq0/39jXRyIkHzcBICzusdn2T464R4P6K0WcDZ6pMkLlFpuGS73u1pOnMSw==}
+ hasBin: true
+ peerDependencies:
+ prettier: ^3.0.0
+ prettier-plugin-astro: '>=0.11.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ prettier-plugin-astro:
+ optional: true
- '@astrojs/prism@4.0.1':
- resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==}
+ '@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.2':
+ resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
engines: {node: '>=22.12.0'}
- '@astrojs/telemetry@3.3.0':
- resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==}
+ '@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.4':
+ resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==}
+
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
@@ -111,6 +191,9 @@ packages:
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'}
@@ -121,9 +204,34 @@ packages:
'@clack/prompts@1.2.0':
resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==}
+ '@ctrl/tinycolor@4.2.0':
+ resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==}
+ engines: {node: '>=14'}
+
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
+ '@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.9.2':
resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==}
@@ -579,17 +687,26 @@ packages:
cpu: [x64]
os: [win32]
- '@iconify-json/lucide@1.2.102':
- resolution: {integrity: sha512-Dm3EEqu5NrmzyDMB2U1+8yroEj2/dB9V4KlH0m/szwwF/ofSf0cPaGTZqkd1aExXjCor+vU53ttRMCGuXf+/cg==}
+ '@expressive-code/core@0.42.0':
+ resolution: {integrity: sha512-MN11+9nfmaC7sYu2BZJXAXqwkBRt8t1xTSqP+Ti1NfTEskgl6xUnzDxoaiQkg0BMzpglA0pys4dpDKquP/cyIw==}
- '@iconify/tools@4.2.0':
- resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==}
+ '@expressive-code/plugin-frames@0.42.0':
+ resolution: {integrity: sha512-XtkPm+941Uta7Y+81Acv+OA/20F1NJmJhCX6UYGKpqEIGqplNh3PTOhcURp6tcruhlzJcWcvpWy6Oigz3SrjqA==}
- '@iconify/types@2.0.0':
- resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+ '@expressive-code/plugin-shiki@0.42.0':
+ resolution: {integrity: sha512-PMKey/kLmewttAHQezL+Y5Fx3vVssfDi3+FJOYQQS2mXP3tQspFELtKKAfsXfmSXdToZYgwoO69HJndqfE+09g==}
- '@iconify/utils@2.3.0':
- resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+ '@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==}
@@ -744,10 +861,6 @@ packages:
cpu: [x64]
os: [win32]
- '@isaacs/fs-minipass@4.0.1':
- resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
- engines: {node: '>=18.0.0'}
-
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -758,15 +871,71 @@ packages:
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]
+
'@playwright/test@1.59.1':
resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==}
engines: {node: '>=18'}
@@ -950,39 +1119,109 @@ packages:
'@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.2.2':
resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==}
+ '@tailwindcss/node@4.3.0':
+ resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==}
+
'@tailwindcss/oxide-android-arm64@4.2.2':
resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
+ '@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.2.2':
resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
+ '@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.2.2':
resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==}
engines: {node: '>= 20'}
cpu: [x64]
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.2.2':
resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
+ '@tailwindcss/oxide-freebsd-x64@4.3.0':
+ resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2':
resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==}
engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
+ '@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.2.2':
resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==}
engines: {node: '>= 20'}
@@ -990,6 +1229,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@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.2.2':
resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==}
engines: {node: '>= 20'}
@@ -997,6 +1243,13 @@ packages:
os: [linux]
libc: [musl]
+ '@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.2.2':
resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==}
engines: {node: '>= 20'}
@@ -1004,6 +1257,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@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.2.2':
resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==}
engines: {node: '>= 20'}
@@ -1011,6 +1271,13 @@ packages:
os: [linux]
libc: [musl]
+ '@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.2.2':
resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==}
engines: {node: '>=14.0.0'}
@@ -1023,39 +1290,89 @@ packages:
- '@emnapi/wasi-threads'
- tslib
+ '@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.2.2':
resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
+ '@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.2.2':
resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==}
engines: {node: '>= 20'}
cpu: [x64]
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.2.2':
resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==}
engines: {node: '>= 20'}
+ '@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.2.2':
resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==}
peerDependencies:
vite: ^5.2.0 || ^6 || ^7 || ^8
+ '@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/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==}
@@ -1065,20 +1382,84 @@ packages:
'@types/node@24.12.2':
resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==}
+ '@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==}
- '@types/yauzl@2.10.3':
- resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
-
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+ deprecated: Potential CWE-502 - Update to 1.3.1 or higher
+
+ '@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'}
@@ -1091,6 +1472,12 @@ packages:
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==}
@@ -1101,11 +1488,20 @@ packages:
array-iterate@2.0.1:
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
- astro-icon@1.1.5:
- resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==}
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
- astro@6.1.4:
- resolution: {integrity: sha512-SRy1bONuCHkGWhI5JiWCQKVDVbeaXOikjAVZs/Nz+lvUvubtdLoZfnacmuZHQ9RL2IOkU54M8/qZYm9ypJDKrg==}
+ 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.6:
+ resolution: {integrity: sha512-lM30gGI/iASK9Z1WQVnBBYzxVwDv8slkXbJOF7FNJdZQeBrFETpsQvYoLRupM/adt2ObP5hkYAWEeCjofoqlRw==}
engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
@@ -1122,11 +1518,26 @@ packages:
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==}
- buffer-crc32@0.2.13:
- resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ 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==}
@@ -1135,6 +1546,9 @@ packages:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
+ camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -1151,25 +1565,28 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
- cheerio-select@2.1.0:
- resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
- cheerio@1.2.0:
- resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==}
- engines: {node: '>=20.18.1'}
+ 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'}
- chownr@3.0.0:
- resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
- engines: {node: '>=18'}
-
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'}
@@ -1178,6 +1595,9 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -1192,13 +1612,16 @@ packages:
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@7.2.0:
- resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
- engines: {node: '>= 10'}
+ 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==}
@@ -1209,12 +1632,6 @@ packages:
engines: {node: '>=18'}
hasBin: true
- confbox@0.1.8:
- resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
-
- confbox@0.2.4:
- resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
-
cookie-es@1.2.3:
resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
@@ -1228,14 +1645,13 @@ packages:
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@2.3.1:
- resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
- engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.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}
@@ -1244,10 +1660,25 @@ packages:
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'}
@@ -1257,6 +1688,14 @@ packages:
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==}
@@ -1267,6 +1706,9 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
+ delegate@3.2.0:
+ resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@@ -1288,8 +1730,9 @@ packages:
resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
engines: {node: '>=0.3.1'}
- dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ 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==}
@@ -1304,6 +1747,9 @@ packages:
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
drizzle-kit@0.31.10:
resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==}
hasBin: true
@@ -1400,6 +1846,9 @@ packages:
sqlite3:
optional: true
+ 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'}
@@ -1408,19 +1857,20 @@ packages:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
+ emmet@2.4.11:
+ resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
- encoding-sniffer@0.2.1:
- resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==}
-
- end-of-stream@1.4.5:
- resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
-
enhanced-resolve@5.20.1:
resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==}
engines: {node: '>=10.13.0'}
+ enhanced-resolve@5.21.6:
+ resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
+ engines: {node: '>=10.13.0'}
+
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@@ -1429,10 +1879,6 @@ packages:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
- entities@7.0.1:
- resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
- engines: {node: '>=0.12'}
-
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -1452,6 +1898,12 @@ packages:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
+ 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.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
@@ -1475,22 +1927,45 @@ packages:
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==}
- exsolve@1.0.8:
- resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+ expressive-code@0.42.0:
+ resolution: {integrity: sha512-V5DtJLEKuj4wf9O6IRtPtRObkMVy2ggR+S0MdjrTw6m58krZnDioyhW1si3Y04c5YPeooP4nd85Yq9NwEVHS4g==}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- extract-zip@2.0.1:
- resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
- engines: {node: '>= 10.17.0'}
- hasBin: true
+ 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@1.2.1:
resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==}
@@ -1498,11 +1973,14 @@ packages:
fast-string-width@1.1.0:
resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==}
+ fast-uri@3.1.2:
+ resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==}
+
fast-wrap-ansi@0.1.6:
resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==}
- fd-slicer@1.1.0:
- resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
@@ -1513,6 +1991,10 @@ packages:
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'}
@@ -1562,19 +2044,30 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
- get-stream@5.2.0:
- resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
- engines: {node: '>=8'}
-
get-tsconfig@4.13.7:
resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==}
+ 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==}
- globals@15.15.0:
- resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
- engines: {node: '>=18'}
+ 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==}
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
@@ -1583,6 +2076,9 @@ packages:
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==}
@@ -1602,27 +2098,57 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ 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==}
@@ -1635,36 +2161,88 @@ packages:
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==}
- htmlparser2@10.1.0:
- resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
+ 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==}
- iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
+ i18next@26.2.0:
+ resolution: {integrity: sha512-zwBHldHdTmwN7r6UNc7lC6GWNN+YYg3DrRSeHR5PRRBf5QnJZcYHrQc0uaU26qZeYxR7iFZD+Y315dPnKP47wA==}
+ 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'}
@@ -1677,12 +2255,32 @@ packages:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
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
- kolorist@1.8.0:
- resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+ 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'}
laravel-vite-plugin@2.1.0:
resolution: {integrity: sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==}
@@ -1691,6 +2289,20 @@ packages:
peerDependencies:
vite: ^7.0.0
+ 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'}
@@ -1765,13 +2377,12 @@ packages:
resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
engines: {node: '>= 12.0.0'}
- local-pkg@1.1.2:
- resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
- engines: {node: '>=14'}
-
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.2:
resolution: {integrity: sha512-wgWa6FWQ3QRRJbIjbsldRJZxdxYngT/dO0I5Ynmlnin8qy7tC6xYzbcJjtN4wHLXtkbVwHzk0C+OejVw1XM+DQ==}
engines: {node: 20 || >=22}
@@ -1782,6 +2393,10 @@ packages:
magicast@0.5.2:
resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==}
+ 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==}
@@ -1792,6 +2407,9 @@ packages:
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==}
@@ -1816,6 +2434,18 @@ packages:
mdast-util-gfm@3.1.0:
resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
mdast-util-phrasing@4.1.0:
resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
@@ -1831,15 +2461,19 @@ packages:
mdn-data@2.0.28:
resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
- mdn-data@2.0.30:
- resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
-
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==}
@@ -1861,12 +2495,30 @@ packages:
micromark-extension-gfm@3.0.0:
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+ micromark-extension-mdx-expression@3.0.1:
+ resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
+
+ micromark-extension-mdx-jsx@3.0.2:
+ resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
micromark-factory-destination@2.0.1:
resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
micromark-factory-label@2.0.1:
resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+ micromark-factory-mdx-expression@2.0.3:
+ resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
+
micromark-factory-space@2.0.1:
resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
@@ -1897,6 +2549,9 @@ packages:
micromark-util-encode@2.0.1:
resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+ micromark-util-events-to-acorn@2.0.3:
+ resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
+
micromark-util-html-tag-name@2.0.1:
resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
@@ -1921,6 +2576,10 @@ packages:
micromark@4.0.2:
resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
@@ -1929,17 +2588,18 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.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'}
- minizlib@3.1.0:
- resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
- engines: {node: '>= 18'}
-
- mlly@1.8.2:
- resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
-
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -1947,6 +2607,9 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -1959,6 +2622,9 @@ packages:
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==}
@@ -1969,6 +2635,9 @@ packages:
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==}
@@ -1981,9 +2650,6 @@ packages:
ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
oniguruma-parser@0.12.1:
resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
@@ -2002,26 +2668,37 @@ packages:
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-htmlparser2-tree-adapter@7.1.0:
- resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
-
- parse5-parser-stream@7.1.2:
- resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
-
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
- pend@1.2.0:
- resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+ 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}
pg-cloudflare@1.3.0:
resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==}
@@ -2071,12 +2748,6 @@ packages:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
- pkg-types@1.3.1:
- resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
-
- pkg-types@2.3.0:
- resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
-
playwright-core@1.59.1:
resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==}
engines: {node: '>=18'}
@@ -2087,6 +2758,20 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ 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.9:
resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
engines: {node: ^10 || ^12 || >=14}
@@ -2107,6 +2792,74 @@ packages:
resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
engines: {node: '>=0.10.0'}
+ 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'}
@@ -2118,19 +2871,34 @@ packages:
resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
engines: {node: '>=10'}
- pump@3.0.4:
- resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==}
-
- quansync@0.2.11:
- resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+ 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==}
@@ -2140,21 +2908,40 @@ packages:
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==}
@@ -2168,10 +2955,20 @@ packages:
remark-stringify@11.0.0:
resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+ request-light@0.5.8:
+ resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==}
+
+ request-light@0.7.0:
+ resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
+
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
@@ -2187,26 +2984,47 @@ packages:
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.1:
resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
- safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ 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.7.4:
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
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}
@@ -2222,6 +3040,15 @@ packages:
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'}
@@ -2237,6 +3064,10 @@ packages:
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==}
@@ -2244,6 +3075,9 @@ packages:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
+ 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'}
@@ -2255,6 +3089,15 @@ packages:
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==}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2263,11 +3106,6 @@ packages:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
- svgo@3.3.3:
- resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==}
- engines: {node: '>=14.0.0'}
- hasBin: true
-
svgo@4.0.1:
resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==}
engines: {node: '>=16'}
@@ -2276,13 +3114,24 @@ packages:
tailwindcss@4.2.2:
resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==}
+ tailwindcss@4.3.0:
+ resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==}
+
tapable@2.3.2:
resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==}
engines: {node: '>=6'}
- tar@7.5.13:
- resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==}
- engines: {node: '>=18'}
+ 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==}
@@ -2299,6 +3148,13 @@ packages:
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'}
+
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
@@ -2309,16 +3165,6 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- tsconfck@3.1.6:
- resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
- engines: {node: ^18 || >=20}
- hasBin: true
- peerDependencies:
- typescript: ^5.0.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -2327,8 +3173,14 @@ packages:
engines: {node: '>=18.0.0'}
hasBin: true
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ typesafe-path@0.2.2:
+ resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
+
+ typescript-auto-import-cache@0.3.6:
+ resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==}
+
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
@@ -2344,9 +3196,9 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
- undici@7.25.0:
- resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==}
- engines: {node: '>=20.18.1'}
+ unicorn-magic@0.4.0:
+ resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==}
+ engines: {node: '>=20'}
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -2363,6 +3215,9 @@ packages:
unist-util-modify-children@4.0.0:
resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
unist-util-position@5.0.0:
resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
@@ -2443,6 +3298,12 @@ packages:
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==}
@@ -2503,18 +3364,101 @@ packages:
vite:
optional: true
+ volar-service-css@0.0.70:
+ resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-emmet@0.0.70:
+ resolution: {integrity: sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-html@0.0.70:
+ resolution: {integrity: sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-prettier@0.0.70:
+ resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ prettier: ^2.2 || ^3.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+ prettier:
+ optional: true
+
+ volar-service-typescript-twoslash-queries@0.0.70:
+ resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-typescript@0.0.70:
+ resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-yaml@0.0.70:
+ resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ vscode-css-languageservice@6.3.10:
+ resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==}
+
+ vscode-html-languageservice@5.6.2:
+ resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==}
+
+ vscode-json-languageservice@4.1.8:
+ resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==}
+ engines: {npm: '>=7.0.0'}
+
+ vscode-jsonrpc@8.2.0:
+ resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
+
+ vscode-languageserver-protocol@3.17.5:
+ resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+ vscode-languageserver-textdocument@1.0.12:
+ resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+
+ vscode-languageserver-types@3.17.5:
+ resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ vscode-languageserver@9.0.1:
+ resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+ hasBin: true
+
+ vscode-nls@5.2.0:
+ resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
+
+ vscode-uri@3.1.0:
+ resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
- whatwg-encoding@3.1.1:
- resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
- engines: {node: '>=18'}
- deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
-
- whatwg-mimetype@4.0.0:
- resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
- engines: {node: '>=18'}
-
which-pm-runs@1.1.0:
resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
engines: {node: '>=4'}
@@ -2523,9 +3467,6 @@ packages:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
@@ -2537,9 +3478,19 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
- yallist@5.0.0:
- resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
- engines: {node: '>=18'}
+ 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==}
@@ -2553,9 +3504,6 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
- yauzl@2.10.0:
- resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
-
yocto-queue@1.2.2:
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
engines: {node: '>=12.20'}
@@ -2568,23 +3516,55 @@ packages:
snapshots:
- '@antfu/install-pkg@1.1.0':
+ '@astrojs/check@0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3)':
dependencies:
- package-manager-detector: 1.6.0
- tinyexec: 1.1.1
+ '@astrojs/language-server': 2.16.9(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
- '@antfu/utils@8.1.1': {}
+ '@astrojs/compiler@2.13.1': {}
- '@astrojs/compiler@3.0.1': {}
+ '@astrojs/compiler@4.0.0': {}
- '@astrojs/internal-helpers@0.8.0':
+ '@astrojs/internal-helpers@0.9.1':
dependencies:
picomatch: 4.0.4
- '@astrojs/markdown-remark@7.1.0':
+ '@astrojs/language-server@2.16.9(prettier-plugin-astro@0.14.1)(prettier@3.8.3)(typescript@6.0.3)':
dependencies:
- '@astrojs/internal-helpers': 0.8.0
- '@astrojs/prism': 4.0.1
+ '@astrojs/compiler': 2.13.1
+ '@astrojs/yaml2ts': 0.2.4
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@volar/kit': 2.4.28(typescript@6.0.3)
+ '@volar/language-core': 2.4.28
+ '@volar/language-server': 2.4.28
+ '@volar/language-service': 2.4.28
+ muggle-string: 0.4.1
+ tinyglobby: 0.2.16
+ volar-service-css: 0.0.70(@volar/language-service@2.4.28)
+ volar-service-emmet: 0.0.70(@volar/language-service@2.4.28)
+ volar-service-html: 0.0.70(@volar/language-service@2.4.28)
+ volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.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.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
@@ -2607,21 +3587,81 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@astrojs/prism@4.0.1':
+ '@astrojs/mdx@5.0.6(astro@6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))':
+ dependencies:
+ '@astrojs/markdown-remark': 7.1.2
+ '@mdx-js/mdx': 3.1.1
+ acorn: 8.16.0
+ astro: 6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
+ es-module-lexer: 2.0.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.2':
dependencies:
prismjs: 1.30.0
- '@astrojs/telemetry@3.3.0':
+ '@astrojs/sitemap@3.7.2':
dependencies:
- ci-info: 4.4.0
- debug: 4.4.3
- dlv: 1.1.3
- dset: 3.1.4
- is-docker: 3.0.0
- is-wsl: 3.1.1
- which-pm-runs: 1.1.0
+ sitemap: 9.0.1
+ stream-replace-string: 2.0.0
+ zod: 4.3.6
+
+ '@astrojs/starlight@0.39.2(astro@6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/markdown-remark': 7.1.2
+ '@astrojs/mdx': 5.0.6(astro@6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
+ astro-expressive-code: 0.42.0(astro@6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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.2.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.4':
+ dependencies:
+ yaml: 2.9.0
'@babel/helper-string-parser@7.27.1': {}
@@ -2636,6 +3676,8 @@ snapshots:
'@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
@@ -2652,8 +3694,33 @@ snapshots:
fast-wrap-ansi: 0.1.6
sisteransi: 1.0.5
+ '@ctrl/tinycolor@4.2.0': {}
+
'@drizzle-team/brocli@0.10.2': {}
+ '@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.9.2':
dependencies:
tslib: 2.8.1
@@ -2891,41 +3958,43 @@ snapshots:
'@esbuild/win32-x64@0.27.7':
optional: true
- '@iconify-json/lucide@1.2.102':
+ '@expressive-code/core@0.42.0':
dependencies:
- '@iconify/types': 2.0.0
+ '@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.9
+ postcss-nested: 6.2.0(postcss@8.5.9)
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
- '@iconify/tools@4.2.0':
+ '@expressive-code/plugin-frames@0.42.0':
dependencies:
- '@iconify/types': 2.0.0
- '@iconify/utils': 2.3.0
- cheerio: 1.2.0
- domhandler: 5.0.3
- extract-zip: 2.0.1
- local-pkg: 1.1.2
- pathe: 2.0.3
- svgo: 3.3.3
- tar: 7.5.13
- transitivePeerDependencies:
- - supports-color
+ '@expressive-code/core': 0.42.0
- '@iconify/types@2.0.0': {}
-
- '@iconify/utils@2.3.0':
+ '@expressive-code/plugin-shiki@0.42.0':
dependencies:
- '@antfu/install-pkg': 1.1.0
- '@antfu/utils': 8.1.1
- '@iconify/types': 2.0.0
- debug: 4.4.3
- globals: 15.15.0
- kolorist: 1.8.0
- local-pkg: 1.1.2
- mlly: 1.8.2
- transitivePeerDependencies:
- - supports-color
+ '@expressive-code/core': 0.42.0
+ shiki: 4.0.2
- '@img/colour@1.1.0':
- optional: true
+ '@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:
@@ -3021,10 +4090,6 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
- '@isaacs/fs-minipass@4.0.1':
- dependencies:
- minipass: 7.1.3
-
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -3037,6 +4102,11 @@ snapshots:
'@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':
@@ -3044,8 +4114,73 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@mdx-js/mdx@3.1.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ acorn: 8.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
+
'@playwright/test@1.59.1':
dependencies:
playwright: 1.59.1
@@ -3173,6 +4308,34 @@ snapshots:
'@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.2.2':
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -3183,42 +4346,88 @@ snapshots:
source-map-js: 1.2.1
tailwindcss: 4.2.2
+ '@tailwindcss/node@4.3.0':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.21.6
+ jiti: 2.6.1
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.0
+
'@tailwindcss/oxide-android-arm64@4.2.2':
optional: true
+ '@tailwindcss/oxide-android-arm64@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-darwin-arm64@4.2.2':
optional: true
+ '@tailwindcss/oxide-darwin-arm64@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-darwin-x64@4.2.2':
optional: true
+ '@tailwindcss/oxide-darwin-x64@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-freebsd-x64@4.2.2':
optional: true
+ '@tailwindcss/oxide-freebsd-x64@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2':
optional: true
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-gnu@4.2.2':
optional: true
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-musl@4.2.2':
optional: true
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-gnu@4.2.2':
optional: true
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-musl@4.2.2':
optional: true
+ '@tailwindcss/oxide-linux-x64-musl@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-wasm32-wasi@4.2.2':
optional: true
+ '@tailwindcss/oxide-wasm32-wasi@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-win32-arm64-msvc@4.2.2':
optional: true
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.0':
+ optional: true
+
'@tailwindcss/oxide-win32-x64-msvc@4.2.2':
optional: true
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.0':
+ optional: true
+
'@tailwindcss/oxide@4.2.2':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.2.2
@@ -3234,27 +4443,64 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.2.2
'@tailwindcss/oxide-win32-x64-msvc': 4.2.2
- '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))':
+ '@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.2.2(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))':
dependencies:
'@tailwindcss/node': 4.2.2
'@tailwindcss/oxide': 4.2.2
tailwindcss: 4.2.2
- vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)
+ vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
+
+ '@tailwindcss/vite@4.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.0
+ '@tailwindcss/oxide': 4.3.0
+ tailwindcss: 4.3.0
+ vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(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.8
+
'@types/estree@1.0.8': {}
'@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':
@@ -3265,17 +4511,95 @@ snapshots:
dependencies:
undici-types: 7.16.0
- '@types/unist@3.0.3': {}
-
- '@types/yauzl@2.10.3':
+ '@types/sax@1.2.7':
dependencies:
'@types/node': 24.12.2
- optional: true
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
'@ungap/structured-clone@1.3.0': {}
+ '@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:
@@ -3287,26 +4611,44 @@ snapshots:
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: {}
- astro-icon@1.1.5:
- dependencies:
- '@iconify/tools': 4.2.0
- '@iconify/types': 2.0.0
- '@iconify/utils': 2.3.0
- transitivePeerDependencies:
- - supports-color
+ astring@1.9.0: {}
- astro@6.1.4(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(tsx@4.21.0)(typescript@5.9.3):
+ astro-expressive-code@0.42.0(astro@6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)):
dependencies:
- '@astrojs/compiler': 3.0.1
- '@astrojs/internal-helpers': 0.8.0
- '@astrojs/markdown-remark': 7.1.0
- '@astrojs/telemetry': 3.3.0
+ astro: 6.3.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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.6(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.1)(terser@5.47.1)(tsx@4.21.0)(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.2.0
'@oslojs/encoding': 1.1.0
@@ -3319,16 +4661,17 @@ snapshots:
cookie: 1.1.1
devalue: 5.7.0
diff: 8.0.4
- dlv: 1.1.3
dset: 3.1.4
es-module-lexer: 2.0.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.2
mrmime: 2.0.1
@@ -3347,14 +4690,13 @@ snapshots:
tinyclip: 0.1.12
tinyexec: 1.1.1
tinyglobby: 0.2.16
- tsconfck: 3.1.6(typescript@5.9.3)
ultrahtml: 1.6.0
unifont: 0.7.4
unist-util-visit: 5.1.0
unstorage: 1.17.5
vfile: 6.0.3
- vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)
- vitefu: 1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))
+ vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
zod: 4.3.6
@@ -3391,7 +4733,6 @@ snapshots:
- supports-color
- terser
- tsx
- - typescript
- uploadthing
- yaml
@@ -3409,9 +4750,25 @@ snapshots:
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: {}
- buffer-crc32@0.2.13: {}
+ 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: {}
@@ -3420,6 +4777,11 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.8.1
+
ccount@2.0.1: {}
chalk@4.1.2:
@@ -3433,37 +4795,28 @@ snapshots:
character-entities@2.0.2: {}
- cheerio-select@2.1.0:
- dependencies:
- boolbase: 1.0.0
- css-select: 5.2.2
- css-what: 6.2.2
- domelementtype: 2.3.0
- domhandler: 5.0.3
- domutils: 3.2.2
+ character-reference-invalid@2.0.1: {}
- cheerio@1.2.0:
+ chokidar@4.0.3:
dependencies:
- cheerio-select: 2.1.0
- dom-serializer: 2.0.0
- domhandler: 5.0.3
- domutils: 3.2.2
- encoding-sniffer: 0.2.1
- htmlparser2: 10.1.0
- parse5: 7.3.0
- parse5-htmlparser2-tree-adapter: 7.1.0
- parse5-parser-stream: 7.1.2
- undici: 7.25.0
- whatwg-mimetype: 4.0.0
+ readdirp: 4.1.2
chokidar@5.0.0:
dependencies:
readdirp: 5.0.0
- chownr@3.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
@@ -3472,6 +4825,8 @@ snapshots:
clsx@2.1.1: {}
+ collapse-white-space@2.1.0: {}
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
@@ -3484,9 +4839,11 @@ snapshots:
comma-separated-tokens@2.0.3: {}
+ commander@10.0.1: {}
+
commander@11.1.0: {}
- commander@7.2.0: {}
+ commander@2.20.3: {}
common-ancestor-path@2.0.0: {}
@@ -3499,10 +4856,6 @@ snapshots:
tree-kill: 1.2.2
yargs: 17.7.2
- confbox@0.1.8: {}
-
- confbox@0.2.4: {}
-
cookie-es@1.2.3: {}
cookie@1.1.1: {}
@@ -3519,16 +4872,13 @@ snapshots:
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@2.3.1:
- dependencies:
- mdn-data: 2.0.30
- source-map-js: 1.2.1
-
css-tree@3.2.1:
dependencies:
mdn-data: 2.27.1
@@ -3536,14 +4886,38 @@ snapshots:
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
@@ -3552,6 +4926,8 @@ snapshots:
delayed-stream@1.0.0: {}
+ delegate@3.2.0: {}
+
dequal@2.0.3: {}
destr@2.0.5: {}
@@ -3566,7 +4942,7 @@ snapshots:
diff@8.0.4: {}
- dlv@1.1.3: {}
+ direction@2.0.1: {}
dom-serializer@2.0.0:
dependencies:
@@ -3586,6 +4962,11 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
drizzle-kit@0.31.10:
dependencies:
'@drizzle-team/brocli': 0.10.2
@@ -3597,6 +4978,11 @@ snapshots:
optionalDependencies:
pg: 8.20.0
+ dropzone@6.0.0-beta.2:
+ dependencies:
+ '@swc/helpers': 0.2.14
+ just-extend: 5.1.1
+
dset@3.1.4: {}
dunder-proto@1.0.1:
@@ -3605,28 +4991,27 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
+ emmet@2.4.11:
+ dependencies:
+ '@emmetio/abbreviation': 2.3.3
+ '@emmetio/css-abbreviation': 2.1.8
+
emoji-regex@8.0.0: {}
- encoding-sniffer@0.2.1:
- dependencies:
- iconv-lite: 0.6.3
- whatwg-encoding: 3.1.1
-
- end-of-stream@1.4.5:
- dependencies:
- once: 1.4.0
-
enhanced-resolve@5.20.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.2
+ enhanced-resolve@5.21.6:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
entities@4.5.0: {}
entities@6.0.1: {}
- entities@7.0.1: {}
-
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
@@ -3644,6 +5029,20 @@ snapshots:
has-tostringtag: 1.0.2
hasown: 2.0.2
+ 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.18.20:
optionalDependencies:
'@esbuild/android-arm': 0.18.20
@@ -3731,23 +5130,61 @@ snapshots:
escape-string-regexp@5.0.0: {}
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.6
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
estree-walker@2.0.2: {}
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
eventemitter3@5.0.4: {}
- exsolve@1.0.8: {}
+ 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: {}
- extract-zip@2.0.1:
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
dependencies:
- debug: 4.4.3
- get-stream: 5.2.0
- yauzl: 2.10.0
- optionalDependencies:
- '@types/yauzl': 2.10.3
- transitivePeerDependencies:
- - supports-color
+ '@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@1.2.1: {}
@@ -3755,18 +5192,24 @@ snapshots:
dependencies:
fast-string-truncated-width: 1.2.1
+ fast-uri@3.1.2: {}
+
fast-wrap-ansi@0.1.6:
dependencies:
fast-string-width: 1.1.0
- fd-slicer@1.1.0:
+ fastq@1.20.1:
dependencies:
- pend: 1.2.0
+ 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: {}
follow-redirects@1.15.11: {}
@@ -3815,22 +5258,45 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
- get-stream@5.2.0:
- dependencies:
- pump: 3.0.4
-
get-tsconfig@4.13.7:
dependencies:
resolve-pkg-maps: 1.0.0
+ get-tsconfig@5.0.0-beta.4:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
github-slugger@2.0.0: {}
- globals@15.15.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
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
+ gsap@3.15.0: {}
+
h3@1.15.11:
dependencies:
cookie-es: 1.2.3
@@ -3855,6 +5321,21 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ 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
@@ -3875,14 +5356,38 @@ snapshots:
vfile-location: 5.0.3
web-namespaces: 2.0.1
+ hast-util-has-property@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-body-ok-link@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
hast-util-is-element@3.0.0:
dependencies:
'@types/hast': 3.0.4
+ hast-util-minify-whitespace@1.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-is-element: 3.0.0
+ hast-util-whitespace: 3.0.0
+ unist-util-is: 6.0.1
+
hast-util-parse-selector@4.0.0:
dependencies:
'@types/hast': 3.0.4
+ hast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-has-property: 3.0.0
+ hast-util-is-body-ok-link: 3.0.1
+ hast-util-is-element: 3.0.0
+
hast-util-raw@9.1.0:
dependencies:
'@types/hast': 3.0.4
@@ -3899,6 +5404,45 @@ snapshots:
web-namespaces: 2.0.1
zwitch: 2.0.4
+ hast-util-select@6.0.4:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.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.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
hast-util-to-html@9.0.5:
dependencies:
'@types/hast': 3.0.4
@@ -3913,6 +5457,26 @@ snapshots:
stringify-entities: 4.0.4
zwitch: 2.0.4
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
hast-util-to-parse5@8.0.1:
dependencies:
'@types/hast': 3.0.4
@@ -3923,6 +5487,10 @@ snapshots:
web-namespaces: 2.0.1
zwitch: 2.0.4
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
hast-util-to-text@4.0.2:
dependencies:
'@types/hast': 3.0.4
@@ -3944,31 +5512,65 @@ snapshots:
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: {}
- htmlparser2@10.1.0:
- dependencies:
- domelementtype: 2.3.0
- domhandler: 5.0.3
- domutils: 3.2.2
- entities: 7.0.1
+ html-whitespace-sensitive-tag-names@3.0.1: {}
http-cache-semantics@4.2.0: {}
- iconv-lite@0.6.3:
- dependencies:
- safer-buffer: 2.1.2
+ i18next@26.2.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:
@@ -3977,18 +5579,32 @@ snapshots:
jiti@2.6.1: {}
+ jquery@4.0.0: {}
+
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
- kolorist@1.8.0: {}
+ json-schema-traverse@1.0.0: {}
- laravel-vite-plugin@2.1.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)):
+ jsonc-parser@2.3.1: {}
+
+ jsonc-parser@3.3.1: {}
+
+ just-extend@5.1.1: {}
+
+ kleur@4.1.5: {}
+
+ klona@2.0.6: {}
+
+ laravel-vite-plugin@2.1.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)):
dependencies:
picocolors: 1.1.1
- vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)
+ vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)
vite-plugin-full-reload: 1.2.0
+ lenis@1.3.23: {}
+
lightningcss-android-arm64@1.32.0:
optional: true
@@ -4038,14 +5654,12 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.32.0
lightningcss-win32-x64-msvc: 1.32.0
- local-pkg@1.1.2:
- dependencies:
- mlly: 1.8.2
- pkg-types: 2.3.0
- quansync: 0.2.11
-
longest-streak@3.1.0: {}
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
lru-cache@11.3.2: {}
magic-string@0.30.21:
@@ -4058,6 +5672,8 @@ snapshots:
'@babel/types': 7.29.0
source-map-js: 1.2.1
+ markdown-extensions@2.0.0: {}
+
markdown-table@3.0.4: {}
math-intrinsics@1.1.0: {}
@@ -4068,6 +5684,20 @@ snapshots:
'@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
@@ -4149,6 +5779,55 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.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
@@ -4184,10 +5863,10 @@ snapshots:
mdn-data@2.0.28: {}
- mdn-data@2.0.30: {}
-
mdn-data@2.27.1: {}
+ merge2@1.4.1: {}
+
micromark-core-commonmark@2.0.3:
dependencies:
decode-named-character-reference: 1.3.0
@@ -4207,6 +5886,16 @@ snapshots:
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
@@ -4265,6 +5954,57 @@ snapshots:
micromark-util-combine-extensions: 2.0.1
micromark-util-types: 2.0.2
+ micromark-extension-mdx-expression@3.0.1:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-jsx@3.0.2:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.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
@@ -4278,6 +6018,18 @@ snapshots:
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
+ micromark-factory-mdx-expression@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
micromark-factory-space@2.0.1:
dependencies:
micromark-util-character: 2.1.1
@@ -4330,6 +6082,16 @@ snapshots:
micromark-util-encode@2.0.1: {}
+ micromark-util-events-to-acorn@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
micromark-util-html-tag-name@2.0.1: {}
micromark-util-normalize-identifier@2.0.1:
@@ -4379,29 +6141,31 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
mime-db@1.52.0: {}
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
+ mini-svg-data-uri@1.4.4: {}
+
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.6
+
minipass@7.1.3: {}
- minizlib@3.1.0:
- dependencies:
- minipass: 7.1.3
-
- mlly@1.8.2:
- dependencies:
- acorn: 8.16.0
- pathe: 2.0.3
- pkg-types: 1.3.1
- ufo: 1.6.3
-
mrmime@2.0.1: {}
ms@2.1.3: {}
+ muggle-string@0.4.1: {}
+
nanoid@3.3.11: {}
neotraverse@0.6.18: {}
@@ -4410,12 +6174,19 @@ snapshots:
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
@@ -4430,10 +6201,6 @@ snapshots:
ohash@2.0.11: {}
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
oniguruma-parser@0.12.1: {}
oniguruma-to-es@4.3.5:
@@ -4453,8 +6220,35 @@ snapshots:
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
@@ -4464,22 +6258,21 @@ snapshots:
unist-util-visit-children: 3.0.0
vfile: 6.0.3
- parse5-htmlparser2-tree-adapter@7.1.0:
- dependencies:
- domhandler: 5.0.3
- parse5: 7.3.0
-
- parse5-parser-stream@7.1.2:
- dependencies:
- parse5: 7.3.0
-
parse5@7.3.0:
dependencies:
entities: 6.0.1
- pathe@2.0.3: {}
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
- pend@1.2.0: {}
+ path-browserify@1.0.1: {}
+
+ path-scurry@2.0.2:
+ dependencies:
+ lru-cache: 11.3.2
+ minipass: 7.1.3
pg-cloudflare@1.3.0:
optional: true
@@ -4524,18 +6317,6 @@ snapshots:
picomatch@4.0.4: {}
- pkg-types@1.3.1:
- dependencies:
- confbox: 0.1.8
- mlly: 1.8.2
- pathe: 2.0.3
-
- pkg-types@2.3.0:
- dependencies:
- confbox: 0.2.4
- exsolve: 1.0.8
- pathe: 2.0.3
-
playwright-core@1.59.1: {}
playwright@1.59.1:
@@ -4544,6 +6325,21 @@ snapshots:
optionalDependencies:
fsevents: 2.3.2
+ postcss-nested@6.2.0(postcss@8.5.9):
+ dependencies:
+ postcss: 8.5.9
+ 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.9:
dependencies:
nanoid: 3.3.11
@@ -4560,23 +6356,74 @@ snapshots:
dependencies:
xtend: 4.0.2
+ 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: {}
proxy-from-env@2.1.0: {}
- pump@3.0.4:
- dependencies:
- end-of-stream: 1.4.5
- once: 1.4.0
-
- quansync@0.2.11: {}
+ 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.8
+ 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.8
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
regex-recursion@6.0.2:
dependencies:
regex-utilities: 2.3.0
@@ -4587,6 +6434,15 @@ snapshots:
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
@@ -4599,6 +6455,14 @@ snapshots:
hast-util-raw: 9.1.0
vfile: 6.0.3
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+
rehype-stringify@10.0.1:
dependencies:
'@types/hast': 3.0.4
@@ -4612,6 +6476,17 @@ snapshots:
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
@@ -4623,6 +6498,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ remark-mdx@3.1.1:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
remark-parse@11.0.0:
dependencies:
'@types/mdast': 4.0.4
@@ -4653,8 +6535,14 @@ snapshots:
mdast-util-to-markdown: 2.1.2
unified: 11.0.5
+ request-light@0.5.8: {}
+
+ request-light@0.7.0: {}
+
require-directory@2.1.1: {}
+ require-from-string@2.0.2: {}
+
resolve-pkg-maps@1.0.0: {}
retext-latin@4.0.0:
@@ -4682,6 +6570,13 @@ snapshots:
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.1:
dependencies:
'@types/estree': 1.0.8
@@ -4713,16 +6608,32 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.60.1
fsevents: 2.3.3
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
- safer-buffer@2.1.2: {}
+ 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.7.4: {}
+ 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
@@ -4753,7 +6664,6 @@ snapshots:
'@img/sharp-win32-arm64': 0.34.5
'@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5
- optional: true
shell-quote@1.8.3: {}
@@ -4770,6 +6680,15 @@ snapshots:
sisteransi@1.0.5: {}
+ sitemap@9.0.1:
+ dependencies:
+ '@types/node': 24.12.2
+ '@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: {}
@@ -4781,10 +6700,14 @@ snapshots:
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
space-separated-tokens@2.0.2: {}
split2@4.2.0: {}
+ stream-replace-string@2.0.0: {}
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -4800,6 +6723,18 @@ snapshots:
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
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -4808,16 +6743,6 @@ snapshots:
dependencies:
has-flag: 4.0.0
- svgo@3.3.3:
- dependencies:
- commander: 7.2.0
- css-select: 5.2.2
- css-tree: 2.3.1
- css-what: 6.2.2
- csso: 5.0.5
- picocolors: 1.1.1
- sax: 1.6.0
-
svgo@4.0.1:
dependencies:
commander: 11.1.0
@@ -4830,15 +6755,20 @@ snapshots:
tailwindcss@4.2.2: {}
+ tailwindcss@4.3.0: {}
+
tapable@2.3.2: {}
- tar@7.5.13:
+ tapable@2.3.3: {}
+
+ terser@5.47.1:
dependencies:
- '@isaacs/fs-minipass': 4.0.1
- chownr: 3.0.0
- minipass: 7.1.3
- minizlib: 3.1.0
- yallist: 5.0.0
+ '@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: {}
@@ -4851,16 +6781,18 @@ snapshots:
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
+
tree-kill@1.2.2: {}
trim-lines@3.0.1: {}
trough@2.2.0: {}
- tsconfck@3.1.6(typescript@5.9.3):
- optionalDependencies:
- typescript: 5.9.3
-
tslib@2.8.1: {}
tsx@4.21.0:
@@ -4870,7 +6802,13 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
- typescript@5.9.3: {}
+ typesafe-path@0.2.2: {}
+
+ typescript-auto-import-cache@0.3.6:
+ dependencies:
+ semver: 7.7.4
+
+ typescript@6.0.3: {}
ufo@1.6.3: {}
@@ -4880,7 +6818,7 @@ snapshots:
undici-types@7.16.0: {}
- undici@7.25.0: {}
+ unicorn-magic@0.4.0: {}
unified@11.0.5:
dependencies:
@@ -4912,6 +6850,10 @@ snapshots:
'@types/unist': 3.0.3
array-iterate: 2.0.1
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
unist-util-position@5.0.0:
dependencies:
'@types/unist': 3.0.3
@@ -4951,6 +6893,10 @@ snapshots:
ofetch: 1.5.1
ufo: 1.6.3
+ util-deprecate@1.0.2: {}
+
+ vanilla-calendar-pro@3.1.0: {}
+
vfile-location@5.0.3:
dependencies:
'@types/unist': 3.0.3
@@ -4971,7 +6917,7 @@ snapshots:
picocolors: 1.1.1
picomatch: 2.3.2
- vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0):
+ vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0):
dependencies:
esbuild: 0.27.7
fdir: 6.5.0(picomatch@4.0.4)
@@ -4984,20 +6930,113 @@ snapshots:
fsevents: 2.3.3
jiti: 2.6.1
lightningcss: 1.32.0
+ terser: 5.47.1
tsx: 4.21.0
+ yaml: 2.9.0
- vitefu@1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)):
+ vitefu@1.1.3(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)):
optionalDependencies:
- vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)
+ vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(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.7.4
+ 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: {}
- whatwg-encoding@3.1.1:
- dependencies:
- iconv-lite: 0.6.3
-
- whatwg-mimetype@4.0.0: {}
-
which-pm-runs@1.1.0: {}
wrap-ansi@7.0.0:
@@ -5006,15 +7045,29 @@ snapshots:
string-width: 4.2.3
strip-ansi: 6.0.1
- wrappy@1.0.2: {}
-
xtend@4.0.2: {}
xxhash-wasm@1.1.0: {}
y18n@5.0.8: {}
- yallist@5.0.0: {}
+ 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: {}
@@ -5030,11 +7083,6 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
- yauzl@2.10.0:
- dependencies:
- buffer-crc32: 0.2.13
- fd-slicer: 1.1.0
-
yocto-queue@1.2.2: {}
zod@4.3.6: {}
diff --git a/specs/402-screwfast-website-rebuild/plan.md b/specs/402-screwfast-website-rebuild/plan.md
new file mode 100644
index 00000000..a17e5d83
--- /dev/null
+++ b/specs/402-screwfast-website-rebuild/plan.md
@@ -0,0 +1,77 @@
+# Implementation Plan: Tenantial ScrewFast Website Rebuild
+
+**Branch**: `402-screwfast-website-rebuild`
+**Date**: 2026-05-20
+**Spec**: `specs/402-screwfast-website-rebuild/spec.md`
+
+## Summary
+
+Delete `apps/website` and vendor the pinned ScrewFast application directly into that path. ScrewFast itself is the Astro app foundation. Adapt it in place only for Tenantial public content and monorepo contracts.
+
+## File-Level Structure
+
+The recreated `apps/website` keeps the ScrewFast app shape:
+
+```text
+apps/website/
+├── astro.config.mjs
+├── package.json
+├── process-html.mjs
+├── public/
+├── src/
+│ ├── assets/
+│ ├── components/
+│ │ ├── sections/
+│ │ └── ui/
+│ ├── content/
+│ │ └── docs/
+│ ├── data_files/
+│ ├── images/
+│ ├── layouts/
+│ ├── pages/
+│ └── utils/
+├── tests/smoke/
+└── tsconfig.json
+```
+
+## ScrewFast Source Areas Ported
+
+- Full pinned project from `mearashadowfax/ScrewFast@10718e4c68eca7887d8d82e207d9b394d7346ad3`.
+- `src/layouts/MainLayout.astro` with metadata, navbar/footer, Preline initialization, dark-mode bootstrap, and Lenis script loading.
+- `src/components/sections/navbar&footer/Navbar.astro` and `FooterSection.astro` with Preline collapse behavior and theme toggle placement.
+- `src/components/ThemeIcon.astro` with ScrewFast light/dark toggle behavior.
+- ScrewFast section/component families for hero, feature tabs, pricing, FAQ, contact, platform sections, Starlight docs, cards, buttons, hover states, focus-visible states, and responsive behavior.
+- `src/assets/styles/global.css`, `lenis.css`, `starlight.css`, and `starlight_main.css` with Tailwind v4, Preline, typography/forms plugins, dark handling, and motion behavior.
+
+## Public Routes
+
+- Render: `/`, `/platform`, `/pricing`, `/contact`, `/trust`, `/legal`, `/privacy`, `/terms`, `/imprint`, `/welcome-to-docs/`, `/guides/*`, `/platform/evidence-review/`
+- Redirect intentionally: `/product`, `/products`, `/services`, `/blog`, `/insights` to `/platform`
+- Static/generated: `/robots.txt`, `/manifest.json`, `/favicon.ico`, `/sitemap-index.xml`
+- Hidden/not exposed in navigation: localized routes and unready product/blog/insight detail families
+
+## Dependencies Required
+
+Retained from ScrewFast unless there is a concrete incompatibility:
+
+- `astro`, `@astrojs/check`, `@astrojs/mdx`, `@astrojs/sitemap`, `@astrojs/starlight`: ScrewFast Astro app and docs foundation.
+- `@tailwindcss/vite`, `tailwindcss`, `@tailwindcss/forms`, `@tailwindcss/typography`: ScrewFast Tailwind v4 styling stack.
+- `preline`: ScrewFast navigation, accordion, modal/collapse behavior.
+- `lenis`: ScrewFast smooth scrolling.
+- `gsap`: retained because the vendored foundation includes it.
+- `astro-vtbot`: retained for Starlight view-transition behavior.
+- `clipboard`, `globby`, `html-minifier-terser`, `sharp`, `sharp-ico`, `rimraf`, `prettier`, and Prettier plugins: retained from ScrewFast build/tooling.
+- `@playwright/test`: added for required website smoke validation.
+
+## Confirmed Boundary
+
+`apps/platform` will not be touched. The website does not import platform code and does not run Laravel, Filament, Livewire, Blade, migrations, policies, providers, queues, jobs, database, tenant/workspace/RBAC, or Microsoft Graph code.
+
+## Validation
+
+```bash
+corepack pnpm install
+corepack pnpm build:website
+WEBSITE_PORT=4321 corepack pnpm --filter @tenantatlas/website test:smoke
+git diff --check
+```
diff --git a/specs/402-screwfast-website-rebuild/research.md b/specs/402-screwfast-website-rebuild/research.md
new file mode 100644
index 00000000..8a56976f
--- /dev/null
+++ b/specs/402-screwfast-website-rebuild/research.md
@@ -0,0 +1,27 @@
+# Research: Tenantial ScrewFast Website Rebuild
+
+## Pinned Source
+
+Use `mearashadowfax/ScrewFast` at commit `10718e4c68eca7887d8d82e207d9b394d7346ad3`.
+
+## Decision: Direct Vendor, Not Recreation
+
+Delete `apps/website` and copy the pinned ScrewFast project directly into `apps/website`. This is not a new minimal Astro app creation task.
+
+## Decision: Preserve ScrewFast Behavior First
+
+Keep ScrewFast layouts, navbar, footer, Preline behavior, dark/light theme handling, Lenis scrolling, Starlight docs behavior, backgrounds, sections, buttons, cards, responsive behavior, hover/focus-visible states, and reduced-motion behavior unless a verified incompatibility exists.
+
+## Decision: Adapt Public Content In Place
+
+After the vendored app runs in the monorepo, replace public brand/content with Tenantial:
+
+- Tenantial name and metadata.
+- Tenantial homepage and `/platform` copy.
+- Conservative pricing/contact/trust/legal copy.
+- Static/demo product previews.
+- Intentional redirects for unready public families.
+
+## Decision: Remove Unready Localized/Public Families
+
+Localized pages and unready product/blog/insight detail routes are not exposed because translated, Tenantial-specific content is not available. Their canonical route families redirect intentionally or stay hidden from navigation.
diff --git a/specs/402-screwfast-website-rebuild/spec.md b/specs/402-screwfast-website-rebuild/spec.md
new file mode 100644
index 00000000..582892d2
--- /dev/null
+++ b/specs/402-screwfast-website-rebuild/spec.md
@@ -0,0 +1,64 @@
+# Feature Specification: Tenantial ScrewFast Website Rebuild
+
+**Feature Branch**: `402-screwfast-website-rebuild`
+**Created**: 2026-05-20
+**Status**: Draft
+**Input**: Restart Spec 402 from a clean base by deleting and recreating `apps/website` as a Tenantial public website using the pinned ScrewFast reference as the implementation substrate.
+
+## Spec Candidate Check
+
+- **Problem**: Prior website implementation attempts should not define the new public site foundation.
+- **Today's failure**: Incremental cleanup would preserve old route files, components, design tokens, and content assumptions that the user explicitly rejected.
+- **User-visible improvement**: Visitors see a coherent Tenantial public website with intentional homepage, platform, pricing, contact, trust, and legal routes.
+- **Smallest enterprise-capable version**: Recreate only `apps/website`, preserve monorepo website contracts, keep static/demo product previews, and validate with website build plus smoke tests.
+- **Explicit non-goals**: No `apps/platform` changes, no Laravel, Filament, Livewire, Blade, migrations, policies, providers, queues, jobs, database, tenant/workspace/RBAC, or Microsoft Graph code.
+- **Permanent complexity imported**: Website-local Astro structure, Tailwind theme, public navigation, static product preview components, and Playwright smoke coverage.
+- **Why now**: The user requested a clean restart of Spec 402 and a full public website replacement.
+- **Approval class**: Core Enterprise
+- **Score**: Nutzen 2 | Dringlichkeit 2 | Scope 2 | Komplexitaet 1 | Produktnaehe 2 | Wiederverwendung 2 | **Gesamt: 11/12**
+- **Decision**: approve
+
+## Scope
+
+This feature owns only the public Astro website at `apps/website`. In this feature, "platform" means the public website route `/platform`.
+
+The feature must not touch `apps/platform` and must not import from it.
+
+## Requirements
+
+- **FR-001**: `apps/website` MUST be deleted and recreated from a clean base.
+- **FR-002**: The recreated app MUST keep package name `@tenantatlas/website`.
+- **FR-003**: Root website scripts and the `WEBSITE_PORT` convention MUST remain compatible.
+- **FR-004**: The app MUST use the pinned ScrewFast reference `mearashadowfax/ScrewFast@10718e4c68eca7887d8d82e207d9b394d7346ad3` as the website substrate.
+- **FR-005**: ScrewFast-derived structure MUST cover layout, navigation, mobile navigation, theme toggle, light/dark handling, backgrounds, surfaces, cards, buttons, hover states, focus-visible states, responsive behavior, and reduced-motion behavior.
+- **FR-006**: Public copy and metadata MUST use Tenantial branding only.
+- **FR-007**: Public pages MUST NOT expose ScrewFast, construction, hardware, template, open-source, TenantPilot, TenantCTRL, or unsupported proof claims.
+- **FR-008**: Public product previews MUST be static/demo content and MUST NOT imply live tenant data or authenticated platform behavior.
+- **FR-009**: Pricing, contact, trust, and legal copy MUST stay conservative and avoid fake customers, endorsements, external assurance proof, uptime commitments, or restore/compliance promises.
+- **FR-010**: Public routes MUST render intentionally, redirect intentionally, or stay out of navigation.
+
+## Public Routes
+
+- Render: `/`, `/platform`, `/pricing`, `/contact`, `/trust`, `/legal`, `/privacy`, `/terms`, `/imprint`
+- Static: `/robots.txt`, `/sitemap-index.xml`
+- Redirect: `/product`, `/products`, `/services` to `/platform`
+- Not exposed in navigation: redirect aliases and `404`
+
+## Testing / Runtime Impact
+
+- **Classification**: Browser/static website.
+- **Validation commands**:
+ - `corepack pnpm install`
+ - `corepack pnpm build:website`
+ - `WEBSITE_PORT=4321 corepack pnpm --filter @tenantatlas/website test:smoke`
+ - `git diff --check`
+- **Platform impact**: None. No Laravel or product runtime lane is in scope.
+
+## Proportionality Review
+
+- **New source of truth**: Website-local public route/content structure only.
+- **New persisted entity/table/artifact**: No product runtime persistence.
+- **New abstraction**: No product abstraction. Website presentation components are local to `apps/website`.
+- **New enum/status family**: No.
+- **New cross-domain UI framework/taxonomy**: No.
+- **Narrowest correct implementation**: Delete/recreate only `apps/website`, keep root contracts, and prove with website smoke checks.
diff --git a/specs/402-screwfast-website-rebuild/tasks.md b/specs/402-screwfast-website-rebuild/tasks.md
new file mode 100644
index 00000000..4770c87a
--- /dev/null
+++ b/specs/402-screwfast-website-rebuild/tasks.md
@@ -0,0 +1,25 @@
+# Tasks: Tenantial ScrewFast Website Rebuild
+
+## Setup
+
+- [x] T001 Stash prior dirty website attempt and work from a clean session branch.
+- [x] T002 Inspect pinned ScrewFast reference commit.
+- [x] T003 Produce file-level plan, ScrewFast source-area list, route list, dependency list, and platform non-touch confirmation before coding.
+
+## Direct Vendor Implementation
+
+- [x] T004 Delete existing `apps/website`.
+- [x] T005 Vendor/copy pinned ScrewFast project directly into `apps/website`.
+- [x] T006 Preserve ScrewFast package structure, layouts, navbar/footer, Preline behavior, theme toggle, Starlight, Lenis, Tailwind v4 styles, sections, cards, buttons, hover states, focus-visible states, responsive behavior, and reduced-motion handling.
+- [x] T007 Adapt monorepo contract: package name, `WEBSITE_PORT` scripts, root build compatibility, and smoke command compatibility.
+- [x] T008 Replace public brand, metadata, navigation, footer, homepage, `/platform`, pricing, contact, trust, legal, docs, and static preview copy with Tenantial.
+- [x] T009 Remove or redirect unready localized/product/blog/insight public families so no public residue is exposed.
+- [x] T010 Add website smoke tests for rendered routes, redirects, public residue, mobile navigation, theme toggle, and overflow.
+
+## Validation
+
+- [x] T011 Run `corepack pnpm install`.
+- [x] T012 Run `corepack pnpm build:website`.
+- [x] T013 Run `WEBSITE_PORT=4321 corepack pnpm --filter @tenantatlas/website test:smoke`.
+- [x] T014 Run `git diff --check`.
+- [x] T015 Confirm `apps/platform` has no changes.