diff --git a/.env.example b/.env.example deleted file mode 100644 index 8bfcfd7..0000000 --- a/.env.example +++ /dev/null @@ -1,7 +0,0 @@ -# Admin credentials — générer via `npm run hash:password -- 'monMotDePasse'` -ADMIN_PASSWORD_HASH= -ADMIN_JWT_SECRET= - -# Port de production (Plesk Node.js) -PORT=3100 -HOST=0.0.0.0 diff --git a/.gitea/workflows/prod.yml b/.gitea/workflows/prod.yml new file mode 100644 index 0000000..6c0e01d --- /dev/null +++ b/.gitea/workflows/prod.yml @@ -0,0 +1,46 @@ +# Déploiement production — johanleroy.fr +# Push sur `main` → contrôle de types → build statique Astro → mirror FTP vers Plesk. +# Secrets requis dans Gitea (Settings → Actions → Secrets) : +# FTP_HOST, FTP_USER, FTP_PASSWORD, FTP_TARGET_DIR (chemin docroot, ex. /httpdocs/johanleroy/public) +name: Deploy production + +on: + push: + branches: + - main + +jobs: + build-deploy: + runs-on: ubuntu-latest + container: node:22-bullseye + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install dependencies + run: npm install --no-audit --no-fund + + - name: Type check + run: npm run check + + - name: Build static site + run: npm run build + + - name: Verify build output + run: ls -la dist + + - name: Deploy via FTPS (Plesk) + run: | + apt-get update && apt-get install -y lftp + # FTPS forcé (jamais de fallback en clair) + vérification du certificat (CA système). + # Si le déploiement échoue sur une erreur de certificat, c'est que le cert FTP ne + # correspond pas à FTP_HOST → préférer SFTP (clé SSH) plutôt que de désactiver la vérif. + lftp -e " + set ftp:ssl-force true; + set ftp:ssl-protect-data true; + set ssl:verify-certificate yes; + open ${{ secrets.FTP_HOST }}; + user ${{ secrets.FTP_USER }} ${{ secrets.FTP_PASSWORD }}; + mirror --reverse --delete --verbose dist/ ${{ secrets.FTP_TARGET_DIR }}; + bye + " diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml deleted file mode 100644 index c5169ce..0000000 --- a/.gitea/workflows/test.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Tests -on: - push: - branches: [main, dev] - pull_request: - -jobs: - test: - runs-on: ubuntu-latest - container: - image: node:22-bullseye - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install dependencies - run: npm ci --no-audit --no-fund - - - name: Astro check (types + lint hints) - run: npm run check - - - name: Vitest - run: npm test - - - name: Astro build (vérifie que le build prod passe) - run: npm run build diff --git a/.gitignore b/.gitignore index dd26266..7bea03f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,21 @@ -# build output +# build dist/ .astro/ -# deps +# dépendances node_modules/ -# env +# env / OS / éditeurs .env -.env.production -.env.local +.env.* +.DS_Store +.idea/ +.vscode/ # logs npm-debug.log* yarn-debug.log* yarn-error.log* -pnpm-debug.log* -# editors -.vscode/* -!.vscode/extensions.json -.idea/ - -# macOS -.DS_Store - -# temp -*.log - -# runtime data (uploads + JSON content edited via /admin) -# kept on the server, not deployed via FTP -data/ - -# test artifacts (coverage) -coverage/ +# instructions IA locales (gardées en local, hors repo public) +CLAUDE.md diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 22a1505..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "recommendations": ["astro-build.astro-vscode"], - "unwantedRecommendations": [] -} diff --git a/README.md b/README.md index 5a0ab85..b2ea110 100644 --- a/README.md +++ b/README.md @@ -1,161 +1,37 @@ -# Portfolio — Johan Leroy +# Portfolio — johanleroy.fr -Site vitrine personnel en **Astro 6 hybrid** (SSG public + SSR admin), déployé sur Plesk Node.js. - -🎧 Dev le jour, DJ la nuit — stack cyberpunk dark, contenu éditable sans recompilation. - ---- - -## Stack - -- **Astro 6** (`output: 'static'` + adapter Node standalone — hybrid via `prerender: false` sur `/admin/*` et `/api/*`) -- **React 19** (îlots interactifs) -- **Tailwind CSS 4** + custom design system cyberpunk -- **Framer Motion** + **GSAP** + **Lenis** (animations) -- **@react-three/fiber** (hero 3D disco ball) -- **Zod** (validation schémas de contenu) -- **jose** + **bcryptjs** (auth admin JWT cookie) - ---- +Site vitrine **one-page** de Johan Leroy, développeur fullstack. +Stack : **Astro 6** (sortie 100 % statique), TypeScript, CSS (variables de thème), zéro îlot +framework. Thème **clair/sombre** persistant, polices **auto-hébergées** (RGPD-friendly), icônes +de technos via **simple-icons** (SVG inline monochromes). ## Développement ```bash npm install -npm run dev +npm run dev # serveur de dev (http://localhost:4321) +npm run check # astro check (typage) +npm run build # build statique → dist/ +npm run preview # prévisualise le build ``` -→ http://localhost:3100 +## Modifier le contenu -## Édition du contenu +Tout le contenu (profil, projets, expériences, formation, stack, centres d'intérêt) vit dans +**un seul fichier typé** : [`src/data/content.ts`](src/data/content.ts). +L'URL du bouton « café » s'y trouve aussi (`coffeeUrl`). -Tout le contenu éditable est dans `public/content/*.json` : +## Assets -| Fichier | Rôle | -|---|---| -| `profile.json` | Profil, photo, CTA hero, réseaux sociaux | -| `skills.json` | Compétences techniques (primary + secondary) | -| `experiences.json` | Parcours pro + compétences techniques & transverses | -| `formations.json` | Diplômes et formations | -| `projects.json` | Portfolio de projets | -| `interests.json` | Centres d'intérêt | -| `site.json` | Meta SEO + flags features | +- `public/images/` — logo, photos de profil, logos d'entreprises, visuels de projets. +- `public/fonts/` — Inter + JetBrains Mono (`.woff2`, auto-hébergées). +- `public/cv.pdf` — CV téléchargeable depuis le hero. -Tu peux éditer : -- **Via `/admin`** (interface web protégée par mot de passe) — recommandé en prod -- **Manuellement** en éditant les JSON et en rechargeant la page +## Déploiement -**Aucune recompilation n'est nécessaire** : les fichiers sont servis statiquement côté site public, et relus au runtime côté admin. +**Automatique via Gitea Actions** (`.gitea/workflows/prod.yml`) : tout push sur `main` lance +`astro check` + `npm run build`, puis envoie `dist/` en FTP vers Plesk. +Secrets à définir dans Gitea (Settings → Actions → Secrets) : +`FTP_HOST`, `FTP_USER`, `FTP_PASSWORD`, `FTP_TARGET_DIR` (chemin docroot, ex. `/httpdocs/johanleroy/public`). ---- - -## Admin - -### Configuration initiale - -1. Générer un hash de mot de passe : - ```bash - npm run hash:password -- monMotDePasse - ``` -2. Copier les deux lignes générées (`ADMIN_PASSWORD_HASH` et `ADMIN_JWT_SECRET`) dans un fichier `.env` (local) ou dans les variables d'environnement Plesk (prod). - -### Accès - -→ http://localhost:3100/admin (ou https://johanleroy.fr/admin en prod) - -Login via mot de passe, cookie httpOnly 7 jours. - ---- - -## Déploiement Plesk Node.js - -### Variables d'environnement à définir sur Plesk - -| Variable | Valeur | -|---|---| -| `ADMIN_PASSWORD_HASH` | hash bcrypt généré | -| `ADMIN_JWT_SECRET` | secret JWT aléatoire | -| `PORT` | `3100` (ou ce que Plesk impose) | -| `HOST` | `0.0.0.0` | -| `NODE_ENV` | `production` | - -### Paramètres Plesk Node.js - -- **Node.js version** : 22+ (24.x OK) -- **Application root** : `/httpdocs/johanleroy` -- **Document root Apache** : `/httpdocs/johanleroy/dist/client` (Apache sert les statiques buildés, le reste passe en proxy vers Node) -- **Application startup file** : `dist/server/entry.mjs` -- **Application URL** : https://johanleroy.fr (SSL Let's Encrypt obligatoire pour les cookies admin) - -### Déploiement manuel - -1. **Build local** : `npm run build` (vérifier que `dist/server/entry.mjs` est généré) -2. **Upload FTP/SFTP** vers le répertoire de l'application Plesk (ex : `/httpdocs/johanleroy/`) : - - `dist/` (écrase l'existant) - - `public/` (écrase l'existant) - - `package.json` - - `package-lock.json` -3. **Plesk → Node.js → NPM install** (à faire si `package.json` a changé) -4. **Plesk → Node.js → Restart App** pour recharger le nouveau bundle - -**Ne JAMAIS écraser** : `data/`, `.env`, `node_modules/` côté serveur. - ---- - -## Structure - -``` -src/ -├── components/ -│ ├── Header.astro, Footer.astro, SEO.astro -│ ├── ProjectCard.astro -│ └── islands/ # composants React hydratés -│ ├── Hero3D.tsx -│ ├── RolesMorph.tsx -│ ├── Reveal.tsx -│ ├── SkillCard.tsx -│ ├── SmoothScroll.tsx -│ └── CustomCursor.tsx -├── content/schemas/ # schémas Zod (typages + validation) -├── lib/ -│ ├── auth.ts # JWT cookie admin -│ └── content.ts # lecture/écriture JSON -├── layouts/BaseLayout.astro -├── middleware.ts # protection routes /admin et /api -├── pages/ -│ ├── index.astro -│ ├── formations.astro -│ ├── experience.astro -│ ├── projets.astro -│ ├── 404.astro -│ ├── admin/ -│ │ ├── login.astro -│ │ ├── index.astro -│ │ └── edit/[section].astro -│ └── api/ -│ ├── auth/login.ts, logout.ts -│ ├── content/[section].ts -│ └── upload.ts -└── styles/global.css - -public/ -├── content/*.json # données éditables -├── img/ # images (icônes, entreprises, projets, photos) -└── assets/cv.pdf -``` - ---- - -## Direction artistique - -**Cyberpunk Dark** — noir profond + cyan/magenta néon. - -- Palette : `#0A0A0F / #00F0FF / #FF2A6D / #D1F7FF` -- Typographies : Space Grotesk (display), Inter (body), JetBrains Mono (mono) -- Effets : disco ball 3D, smooth scroll Lenis, curseur custom, glow néon, scanlines, glitch - ---- - -## Licence - -© 2026 Johan Leroy. +Déploiement manuel possible : `npm run build` → uploader le contenu de `dist/` sur l'hébergement statique. diff --git a/astro.config.mjs b/astro.config.mjs index 2f21d1c..5fe8031 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,19 +1,7 @@ -// @ts-check import { defineConfig } from 'astro/config'; -import react from '@astrojs/react'; -import tailwindcss from '@tailwindcss/vite'; -import node from '@astrojs/node'; +// Site vitrine statique (one-page). Sortie 100 % statique : `astro build` → dist/. export default defineConfig({ site: 'https://johanleroy.fr', output: 'static', - adapter: node({ mode: 'standalone' }), - integrations: [react()], - vite: { - plugins: [tailwindcss()], - }, - server: { - port: 3100, - host: true, - }, }); diff --git a/docs/01-analyse-et-plan.md b/docs/01-analyse-et-plan.md deleted file mode 100644 index bf02fe1..0000000 --- a/docs/01-analyse-et-plan.md +++ /dev/null @@ -1,513 +0,0 @@ -# Portfolio v2 — Analyse & plan d'action - -**Projet source :** `/home/johan/WebstormProjects/Portfolio_angular` -**URL live :** https://johanleroy.fr -**Date :** 20 avril 2026 - ---- - -## 1. Analyse de l'existant - -### Stack actuelle - -| Élément | Valeur | -|---|---| -| Framework | Angular 19.2 | -| Styling | TailwindCSS 4 | -| State / Data | Aucun (tout en dur dans les templates) | -| Animations | Particules vanilla JS maison (`home.component.ts`) | -| Icônes | PNG dans `/public/img/icon/` (pas de SVG, pas HiDPI) | -| Icônes UI | Classes FontAwesome (`fa-gamepad`, `fa-film`) **sans lib chargée → cassées** | -| Dark mode | Toggle manuel via `localStorage` | -| SEO | Service custom `seo.service.ts` (title, description, OG, canonical) | -| Router | Lazy-load `PublicModule`, view transitions activées | -| Hébergement | Statique (`.htaccess` Apache dans `/public/`) | -| Tests | Karma/Jasmine (0 test écrit) | - -### Structure - -``` -src/app/ -├── _models/ particule.ts, seo.ts -├── _services/ seo.service.ts -└── public/ - ├── public-layout/ header + dark toggle + nav - ├── public-routing.module.ts - ├── public.module.ts - └── pages/ - ├── home/ (448 lignes HTML — accueil + skills + centres d'intérêt) - ├── formations/ (169 lignes) - ├── experience/ (417 lignes — 6 entreprises Actemium, SNCF, Cerema, Novoferm, PivotPoint, Almeria) - ├── projets/ (104 lignes — 3 projets MonVoisinGeek, Techos, LPLV) - └── not-found/ -``` - -### Palette actuelle (`src/styles.css`) - -```css ---color-primary-dark: #181818 ---color-primary-blue: #0A2463 ---color-primary-light: #3E92CC ---color-primary-white: #FFFAFF ---color-primary-accent: #D8315B -``` - -### Problèmes identifiés - -1. **Stack disproportionnée** — Angular + Zone.js pour un portfolio statique = bundle lourd (warning 500 kB dans `angular.json`), overkill pour du contenu vitrine. -2. **Décalage avec ta stack actuelle** — tu bosses maintenant sur Next.js/Nuxt/NestJS, Angular n'est plus dans aucun de tes projets en mémoire. -3. **Contenu 100 % hardcodé dans les templates** — chaque modif de texte, techno, projet ou date d'expérience impose de recompiler + redéployer. -4. **Animations minimalistes** — juste des particules en `requestAnimationFrame`, pas d'effets wow (scroll reveal, parallax, 3D, text morphing, cursors custom…). -5. **Icônes PNG** — flou sur écrans HiDPI, poids réseau élevé, pas de teinte dynamique possible. -6. **FontAwesome référencé mais jamais chargé** → les 4 icônes des centres d'intérêt sont invisibles. -7. **Tests inexistants** malgré la config Karma — bruit dans `package.json`. -8. **Pas de PWA** (manifest.json, service worker) alors que c'est trivial sur du statique. - -### Ce qui marche bien et à conserver - -- La structure de navigation (Accueil / Formations / Expérience / Projets). -- La palette existante (tu peux la reprendre ou l'enrichir). -- Le `SeoService` et ses meta tags dynamiques. -- Dark mode par défaut selon préférence système. -- Export statique déployé sur Plesk via Apache. -- Le CV PDF téléchargeable. - ---- - -## 2. Choix techno recommandé - -### Option A — **Astro 5 + React islands** ⭐ recommandé - -**Pourquoi :** -- 0 JS par défaut → Lighthouse 100 presque gratuit. -- Islands pattern : tu charges React + Framer Motion uniquement sur les sections animées. -- Content Collections typées (Zod) → ton JSON devient un contrat validé au build. -- SSG pur, déploiement Plesk identique à l'actuel (export statique). -- Supporte nativement les endpoints SSR si tu veux un mini-admin. - -**Stack complète :** -- Astro 5 (router fichiers, layouts) -- React 19 (îlots interactifs) -- TailwindCSS 4 (continuité palette) -- Framer Motion (micro-interactions déclaratives) -- GSAP + ScrollTrigger (timelines paillettes) -- Lenis (smooth scroll) -- @react-three/fiber + @react-three/drei (effets 3D type scène accueil) -- Lucide React (icônes UI) + Simple Icons via iconify (logos techno vectoriels) -- TypeScript strict - -### Option B — **Next.js 15 + App Router** - -Pertinent si tu veux un vrai mini-back-office plus tard (auth JWT, API routes, ISR). Plus lourd qu'Astro pour un simple portfolio. - -### Option C — **Nuxt 4** - -Si tu préfères rester côté Vue. Excellent mais tu connais déjà Vue 3 (Amarea, TrackSniff), donc pas de challenge. - -### Recommandation - -**Astro 5** — le meilleur rapport puissance/légèreté pour un portfolio. Tu ajoutes Next.js à ton CV avec Techos, Astro te donne un 3e framework frontend moderne à afficher, et tu gagnes une killer app de perf. - ---- - -## 3. Système de contenu éditable sans rebuild - -### Architecture proposée - -``` -public/ -├── content/ -│ ├── profile.json (nom, titre, accroche, photo, CV) -│ ├── skills.json (catégories + items avec niveau, logo iconify) -│ ├── experiences.json (tableau d'expériences pro) -│ ├── formations.json (tableau de formations) -│ ├── projects.json (tableau de projets + images + liens) -│ ├── interests.json (centres d'intérêt) -│ └── site.json (meta SEO, couleurs, switches features) -└── img/ (assets éditables) -``` - -### Principe - -- Les fichiers JSON sont servis **en statique** par ton Plesk (pas dans le bundle). -- Côté client, un `ContentService` fait un `fetch('/content/profile.json')` au mount. -- Les composants React affichent les données via Suspense. -- **Modif en production = éditer le JSON sur le serveur → rechargement navigateur = MAJ immédiate. Zéro rebuild.** - -### Schémas typés (Zod) - -Les mêmes schémas servent : -- au build (validation SSG des données si tu veux injecter au build) -- au runtime (parsing des JSON fetchés) -- à l'admin (génération de formulaires) - -Exemple `content/profile.json` : -```json -{ - "name": "Johan Leroy", - "title": "Développeur Fullstack", - "tagline": "Dev le jour, DJ la nuit", - "hero": { - "photo": "/img/pp/pp3.png", - "cta": [ - { "label": "Télécharger mon CV", "href": "/assets/cv.pdf" }, - { "label": "Voir mes projets", "href": "/projets" } - ] - }, - "socials": { - "email": "leroyjohan3@gmail.com", - "github": "https://github.com/JohanLeroy", - "gitea": "https://git.lidge.fr/johanleroy", - "website": "https://johanleroy.fr" - } -} -``` - -### 3 niveaux d'édition (à choisir) - -| Niveau | Outil | Usage | -|---|---|---| -| **1. Terminal / SFTP** | FTP Plesk + éditeur texte | MAJ rapide, zéro surcouche. Le plus simple. | -| **2. Mini-admin web** | `/admin` protégé par mot de passe (cookie httpOnly côté endpoint Astro SSR) | Formulaire qui édite `content/*.json` en live sur le serveur | -| **3. Gitea as CMS** | Un repo `johan-portfolio-content` dédié. L'admin web pousse via l'API Gitea. | Historisation automatique, rollback possible, build-free par cron `git pull` côté Plesk. | - -**Reco pour toi :** niveau 2 ou 3. Le niveau 3 est le plus élégant car tu gardes un vrai git history sans polluer le repo code. - -### Ce que l'admin web permettrait - -- Édition inline du profil (nom, titre, bio) -- Ajout/édition/suppression de projets (drag-drop pour réordonner) -- Ajout d'une expérience pro -- Changement du thème de couleur (live preview) -- Toggle du mode "embauche disponible" (badge vert sur le site) -- Upload de nouvelles images (vers `/public/img/` via endpoint SSR) -- Export / import du JSON (backup) - ---- - -## 4. UX "paillettes dans les yeux" — direction créative - -### Accueil - -- **Hero 3D** avec @react-three/fiber : scène minimaliste type "disco ball" qui tourne lentement, sensible au mouvement de souris (parallax). Nod subtil à ton univers DJ. -- **Texte morphing** (GSAP SplitText) — "Dev" se transforme en "DJ" puis en "Dev" en boucle lente. -- **Curseur custom** qui suit la souris avec un léger lag, change de forme sur les liens. -- **Gradient animé** en arrière-plan type aurore boréale (shader ou CSS `conic-gradient` animé). - -### Scroll - -- **Lenis smooth scroll** partout. -- **Scroll-triggered animations** : sections qui révèlent leur contenu en cascade (fade + translate-y + blur-out). -- **Pin + horizontal scroll** sur la section Projets (GSAP ScrollTrigger, type showcase Awwwards). -- **Progress bar** en haut de page. - -### Section skills - -- Cards avec effet **hover 3D tilt** (vanilla-tilt ou React équivalent). -- Icônes SVG des technos avec **glow au survol**. -- Compteur de maîtrise animé (ring progress) au scroll. - -### Timeline expérience - -- Layout type **métro parisien** (une ligne verticale animée, stations = expériences). -- Cards qui s'ouvrent en accordéon au scroll. - -### Projets - -- Carousel horizontal pinned avec images **zoom parallax**. -- Badge techno avec micro-logos simple-icons colorés. -- Hover : overlay gradient + CTA "voir projet". - -### Detail bonus - -- **Mode "party"** (easter egg) : un bouton discret qui active un strobe + particles + glitch texts → clin d'œil DJ. -- **Konami code** → affiche ton set DJ en fond sonore discret. -- **Switch 3 thèmes** : Day, Night, Neon (le mode neon = pleine paillettes). - ---- - -## 5. Plan d'exécution - -### Phase 0 — Prérequis (décision utilisateur) - -- [ ] Valider le choix Astro vs Next.js vs Nuxt. -- [ ] Valider le niveau d'édition (SFTP / admin web / Gitea). -- [ ] Choisir nom de projet (`portfolio-v2`, `johanleroy-fr`, `portfolio-astro`, …). -- [ ] Palette : garder l'actuelle ou refaire ? (je peux proposer 3 palettes). - -### Phase 1 — Bootstrap (1 jour) - -- Scaffold Astro + TS strict + Tailwind 4 + React integration. -- Setup ESLint + Prettier + configs héritées de Techos (cohérence). -- Créer les 6 schémas Zod + JSON de contenu initial (repris du site actuel). -- Layout global + router fichier (`/`, `/formations`, `/experience`, `/projets`). -- Migrer `SeoService` vers un composant `` Astro. - -### Phase 2 — Contenu & structure (1–2 jours) - -- Extraire tout le contenu des templates actuels vers les JSON. -- Migrer les PNG d'icônes → Iconify (Simple Icons + Lucide). -- Migrer les images projets/entreprises (optimisation avec `astro:assets`). -- Pages statiques sans animations pour valider la structure. - -### Phase 3 — Animations & paillettes (2–3 jours) - -- Intégration Lenis + configuration smooth scroll globale. -- Installation Framer Motion + GSAP + ScrollTrigger. -- Hero 3D @react-three/fiber. -- Scroll-triggered reveals sur chaque section. -- Curseur custom + cards 3D tilt + timeline métro. -- Carousel projets pinned horizontal. -- Thèmes Day / Night / Neon. - -### Phase 4 — Admin d'édition (1–2 jours, optionnel selon niveau choisi) - -- Endpoint Astro SSR `/api/content/:file` (GET/PUT). -- Protection par mot de passe + cookie httpOnly. -- Page `/admin` : formulaires dynamiques générés depuis les schémas Zod. -- Upload d'images. -- Export / import JSON. -- (Variante Gitea) : intégration Gitea API pour push auto. - -### Phase 5 — Polish & deploy (1 jour) - -- PWA (manifest + service worker). -- Audit Lighthouse (objectif 100/100/100/100). -- Sitemap auto + robots.txt. -- Meta tags Open Graph + Twitter Cards. -- Build production. -- Déploiement Plesk (remplacement `/dist` existant). -- Redirections 301 si URLs changent. - -### Phase 6 — Extras plus tard - -- Blog MDX (écriture d'articles techniques). -- Page contact avec vrai formulaire (via endpoint SSR ou Formspree). -- Section "Now" (what I'm up to, mis à jour mensuel). -- Stats GitHub/Gitea live (commits, streaks). -- Page `/jeux` ou `/bacs` pour expériences DJ. - ---- - -## 6. Estimation totale - -| Phase | Charge | -|---|---| -| 0 — Décisions | 30 min | -| 1 — Bootstrap | 1 jour | -| 2 — Contenu & structure | 1–2 jours | -| 3 — Animations | 2–3 jours | -| 4 — Admin (optionnel) | 1–2 jours | -| 5 — Polish & deploy | 1 jour | -| **Total sans admin** | **5–7 jours** | -| **Total avec admin** | **6–9 jours** | - ---- - -## 7. Questions initiales — réponses validées ✅ - -| # | Question | Réponse | -|---|---|---| -| 1 | Framework | ✅ **Astro 5** | -| 2 | Système d'édition | ✅ **Admin web** (option 2) | -| 3 | Palette / identité | ✅ **Refonte DEV/DJ/Neon** | -| 4 | Hébergement | ✅ **Plesk** (stay put) — ISR à creuser selon contraintes | -| 5 | Niveau "paillettes" | ✅ **Wow mais pro** (pas d'effets dans tous les sens) | -| 6 | Contenu à rafraîchir | ✅ **Ajouter projets récents** (sauf Beehelp = pro/NDA) | -| 7 | Nom du repo | ✅ `portfolio` | - ---- - -## 8. Setup technique dérivé des choix - -| Élément | Valeur | -|---|---| -| Mode Astro | **Hybrid** — SSG pour pages publiques, SSR pour `/admin` et `/api` | -| Déploiement | **Plesk Node.js hosting** (même pattern que `techos_api`) | -| Persistance contenu | `/public/content/*.json` édités par endpoints SSR protégés | -| Auth admin | Mot de passe + cookie httpOnly (JWT ou session simple) | -| MAJ contenu en prod | Admin web → PUT JSON → **fetch runtime côté client, zéro rebuild** | -| ISR — note Plesk | Plesk = serveur Node permanent, on a l'équivalent d'ISR gratuit. Pas d'ISR Next.js-style mais re-fetch JSON runtime = effet identique | - ---- - -## 9. Direction artistique — 3 palettes néon à trancher - -### Option A — **Cyberpunk Dark** (blade-runner / tekno industrielle) -``` -bg: #0A0A0F (noir profond) -accent 1: #00F0FF (cyan électrique) -accent 2: #FF2A6D (rose magenta) -accent 3: #D1F7FF (blanc bleuté) -texte: #E0E0FF -``` - -### Option B — **Rave / Miami** (90's, fun, coloré) -``` -bg: #0D0221 (violet nuit) -accent 1: #FF00C8 (pink néon) -accent 2: #00FFC8 (mint laser) -accent 3: #FFD600 (jaune flash) -texte: #FFF8F0 -``` - -### Option C — **Tech Minimal + 1 néon** ⭐ reco pro -``` -bg: #0B0B0E (charbon) -surface: #16161D -accent: #39FF14 (vert néon strobe) — UN SEUL pop -texte: #EAEAEA -secondaire: #8A8F98 -``` - -**Reco :** Option C pour recruteurs (le plus pro), Option A si on assume la vibe DJ. - ---- - -## 10. Liste projets à afficher — proposition - -| # | Projet | Statut | Action | -|---|---|---|---| -| 1 | **Techos** (asso hébergement) | Live `techos-asso.fr` | ✅ Inclure | -| 2 | **TrackSniff** | Privé (invitation) | ⚠️ À trancher | -| 3 | **Amarea Tattoo** | Client (studio tatouage) | ✅ Inclure | -| 4 | **Lidge** | Perso, auto-hébergé | ✅ Inclure | -| 5 | **Portfolio v2** (méta) | En cours | ✅ Classique circulaire | -| 6 | **MonVoisinGeek / LPLV** (anciens) | Live actuellement | ⚠️ Keep or drop ? | -| ❌ | **Beehelp** | Pro / NDA | ❌ Exclu (validé) | - ---- - -## 11. Questions finales — réponses validées ✅ - -| # | Question | Réponse | -|---|---|---| -| 1 | **Palette** | ✅ **Option A — Cyberpunk Dark** (`#0A0A0F / #00F0FF / #FF2A6D / #D1F7FF / #E0E0FF`) | -| 2 | TrackSniff affiché ? | ❌ **Non** (privé, on n'affiche pas) | -| 3 | Portfolio v2 (self-reference) | ❌ **Non** | -| 4 | MonVoisinGeek / LPLV | ✅ **Garder** — mais marqués **"Projet fermé / archivé"**, infos présentes, liens morts | -| 5 | Projet supplémentaire | ✅ **Ajouter "Bot Discord KSauce"** | -| 6 | Nouvelle expérience/formation | — (à compléter au moment de migrer le contenu) | - -### Liste finale des projets affichés - -| # | Projet | État | Lien | -|---|---|---|---| -| 1 | **Techos** | Live | techos-asso.fr | -| 2 | **Amarea Tattoo** | Live | (à confirmer) | -| 3 | **Lidge** | Live perso | (à confirmer) | -| 4 | **Bot Discord KSauce** | (à préciser) | — | -| 5 | **MonVoisinGeek** | 🔒 Archivé | — | -| 6 | **LPLV** | 🔒 Archivé | — | - ---- - -## 12. Plan d'implémentation détaillé — GO - -**Répertoire cible :** `/home/johan/WebstormProjects/portfolio` (nouveau, à côté de l'ancien `Portfolio_angular`) - -### Étape 1 — Bootstrap Astro hybrid ⬜ - -- [ ] `npm create astro@latest portfolio` (template `minimal`, TS strict) -- [ ] Installer intégrations : `@astrojs/react`, `@astrojs/tailwind`, `@astrojs/node` (adapter SSR) -- [ ] Configurer `astro.config.mjs` mode `hybrid` + adapter Node standalone (Plesk) -- [ ] Setup Prettier + ESLint (aligné sur Techos) -- [ ] `.gitignore`, `.editorconfig`, `README.md` - -### Étape 2 — Design system Cyberpunk Dark ⬜ - -- [ ] `tailwind.config` + CSS custom properties (palette Option A) -- [ ] Typographies : **heading** = Space Grotesk / **body** = Inter / **mono accent** = JetBrains Mono -- [ ] Utilitaires `glow-cyan`, `glow-pink`, `neon-border`, `scanlines`, `noise-overlay` -- [ ] Cursor custom (composant React island) -- [ ] Dark only (pas de light mode — la vibe cyberpunk ne s'y prête pas) - -### Étape 3 — Schémas Zod + contenu JSON ⬜ - -- [ ] `src/content/schemas/` : `profile.ts`, `skills.ts`, `experiences.ts`, `formations.ts`, `projects.ts`, `interests.ts`, `site.ts` -- [ ] `public/content/*.json` : contenu extrait des templates Angular actuels + MAJ -- [ ] `ContentService` (fetch runtime) côté client -- [ ] Validation Zod au parsing (garde-fou si JSON mal formé) - -### Étape 4 — Pages publiques + layout ⬜ - -- [ ] Layout global : `Header` (nav + logo glitch), `Footer`, `CursorCustom`, `LenisProvider` -- [ ] `/` — Hero 3D disco-ball (R3F), scroll reveals, skills, centres d'intérêt -- [ ] `/formations` — Timeline métro verticale -- [ ] `/experience` — Timeline métro + cards accordéon (6 entreprises) -- [ ] `/projets` — Carousel pinned horizontal + badges techno Iconify -- [ ] `/404` — Page glitch 404 - -### Étape 5 — Animations paillettes ⬜ - -- [ ] Lenis smooth scroll global -- [ ] Framer Motion : reveals + micro-interactions -- [ ] GSAP + ScrollTrigger : timelines pinned -- [ ] Hero R3F : disco ball parallax souris -- [ ] SplitText : morphing "Dev / DJ / Dev" -- [ ] Cards skills : 3D tilt (hover) -- [ ] Gradient conic animé en bg - -### Étape 6 — Admin SSR ⬜ - -- [ ] `/admin/login` — form password → cookie httpOnly -- [ ] Middleware `src/middleware.ts` : protection route `/admin/*` -- [ ] `/admin` — dashboard, liste des sections éditables -- [ ] `/admin/edit/[section]` — formulaires générés depuis Zod schemas -- [ ] `/api/content/[section]` — GET/PUT (lecture + écriture JSON serveur) -- [ ] `/api/upload` — upload images vers `public/img/` -- [ ] `/api/export` + `/api/import` — backup/restore JSON - -### Étape 7 — SEO + PWA + déploiement ⬜ - -- [ ] Composant `` (title, description, OG, canonical, Twitter) -- [ ] `sitemap.xml` auto -- [ ] `manifest.json` + service worker (PWA) -- [ ] Redirections 301 depuis anciennes URLs si nécessaire -- [ ] Build prod + test local -- [ ] Script déploiement Plesk Node (équivalent Techos API) -- [ ] Remplacement sur `johanleroy.fr` - -### Étape 8 — Post-déploiement ⬜ - -- [ ] Audit Lighthouse (objectif 95+) -- [ ] Test admin web en prod -- [ ] Rédiger `docs/ADMIN.md` (comment éditer le contenu) -- [ ] Snapshot initial dans git du contenu actuel -- [ ] Mettre à jour `CLAUDE.md` du projet - ---- - -**GO ✅** — scaffold démarré. - ---- - -## 13. État d'implémentation (suivi) - -| Étape | Status | -|---|---| -| 1 — Bootstrap Astro hybrid (React + Tailwind 4 + Node adapter) | ✅ | -| 2 — Design system Cyberpunk Dark (palette, glow, néon, fonts) | ✅ | -| 3 — Schémas Zod + JSON contenu extrait | ✅ | -| 4 — Layout + pages publiques (/, /formations, /experience, /projets, /404) | ✅ | -| 5 — Animations (Lenis, Framer Motion, R3F hero disco, morph, curseur) | ✅ | -| 6 — Admin SSR protégé + API CRUD JSON + upload | ✅ | -| 7 — SEO + build prod + workflow Gitea + README déploiement | ✅ | - -### Livrables - -- `/home/johan/WebstormProjects/portfolio/` (projet Astro 6 + React 19 + Tailwind 4) -- Build production OK → `dist/server/entry.mjs` (startup Plesk Node) -- Dev testé sur **http://localhost:3100** -- Workflow `.gitea/workflows/deploy.yml` déclenché sur push `main` -- Contenu projets mis à jour : Techos, Amarea Tattoo, Lidge, Bot Discord KSauce, LPLV (archivé), MonVoisinGeek (archivé) - -### Prochaines étapes côté utilisateur - -1. `cd ~/WebstormProjects/portfolio && npm run dev` → vérifier sur http://localhost:3100 -2. `npm run hash:password -- monMotDePasse` → copier `ADMIN_PASSWORD_HASH` + `ADMIN_JWT_SECRET` dans un `.env` local -3. Tester `/admin/login` puis `/admin` -4. Initialiser git et pousser sur `main` vers Gitea -5. Configurer les secrets Gitea (`FTP_HOST`, `FTP_USER`, `FTP_PASSWORD`, `FTP_TARGET_DIR`) -6. Configurer Plesk Node.js : startup file `dist/server/entry.mjs`, variables d'env admin, Node 22 -7. Pousser sur `main` → CI déploie → redémarrer l'app Node dans Plesk diff --git a/docs/02-moodboard-freeparty.md b/docs/02-moodboard-freeparty.md deleted file mode 100644 index f593255..0000000 --- a/docs/02-moodboard-freeparty.md +++ /dev/null @@ -1,374 +0,0 @@ -# Portfolio v2 — Moodboard "Studio Live / Free Party" - -> Direction artistique : **tekno free party**. Vibe sound system / squat / rave illégale. Palette cyberpunk conservée mais **poussée en acid**, typographies plus brutes, vocabulaire underground, textures warehouse. - ---- - -## 1. Vocabulaire / mots-clés du site - -On oublie "cv", "profil", "vinyles", on skinne tout : - -| Concept générique | Version free party | -|---|---| -| Portfolio | **Sound system** | -| Mes projets | **Crate / Skeuds** | -| Téléchargez mon CV | **Dubplate `.pdf`** | -| Expérience pro | **Setlist** / **Warehouse log** | -| Formations | **Learning stack** / **BPM log** | -| Compétences | **Rack** / **Patch bay** | -| Centres d'intérêt | **Off-decks** | -| Contact | **Open mic** / **Frequencies** | -| Chargement | `BOOTING SOUND SYSTEM…` | -| 404 | `SIGNAL LOST` / `NO SKEUD FOUND` | -| Dispo pour boulot | `ON AIR` (LED verte clignotante) | - -Tu gardes le style "code + tekno" : classes `.mono`, tags `[BPM:174]`, `>> mix`, `//` partout. - ---- - -## 2. Palette ajustée (acid free party) - -On garde le cyberpunk mais on pousse **l'acid** et on ajoute du **jaune strobe** pour l'énergie rave. - -``` -bg: #0A0A0F (noir warehouse) -surface: #111118 -accent_cyan: #00F0FF (UV light principal) -accent_acid: #C6FF00 (⭐ NOUVEAU — jaune acid strobe pour accents forts) -accent_pink: #FF2A6D (magenta dubplate) -accent_red: #FF0040 (⭐ NOUVEAU — rouge LED clip) -texte: #E0E0FF -mute: #8A8FA8 -``` - -**Usages :** -- cyan = base UI (nav, borders) -- acid yellow = **CTA principal + "ON AIR"** (très rave flyer) -- pink/magenta = accents secondaires -- rouge LED = warnings, statut live, status en cours -- violet/ice → on réduit l'usage - ---- - -## 3. Typographies - -On pousse plus loin le contraste entre mono tech et display brut : - -| Usage | Font | Pourquoi | -|---|---|---| -| Display / titres | **Space Grotesk** (gardé) | Sharp, tech, se tient | -| Body | **Inter** (gardé) | Lisible | -| Mono | **JetBrains Mono** (gardé) | Code | -| ⭐ Accent "rave" | **Array** ou **Neue Haas Grotesk Display Black** | Stencil bâton, façon flyer free party / affiche underground | -| ⭐ Étiquettes stickées | **Monument Extended** ou équivalent | Giga bold pour les dates, BPM, codes | - -Suggestion alternative open source sur Google Fonts : **Bebas Neue** (stencil), **Anton** (poster), **Oswald** (condensé). - ---- - -## 4. Éléments communs à tout le site - -### 4.1 Header / nav = **console sound system** - -- En haut, fine barre noire avec : - - **Logo** : "JL" stylisé rave (stencil) avec **LED verte qui clignote** à côté = "ON AIR" - - **Nav** : les items `/crate`, `/setlist`, `/bpm-log`, `/open-mic` (ou versions FR : `/skeuds`, `/setlist`, `/formations`, `/contact`) - - **Scroll progress bar** fine en néon cyan en bas du header (indique où on en est) -- Au clic d'un item → **LED s'allume**, petit son *clic* de fader (togglable, off par défaut) - -### 4.2 Background ambient - -Derrière tout le site, couches superposées très subtiles : -1. **Gradient noir → surface** de base -2. **Grain / noise** fin (bruit vidéo warehouse) -3. **2-3 spots UV** (radial cyan + magenta) qui se **déplacent lentement** selon le scroll (fake parallax light) -4. **Optional :** **strobe flash** très bref (20ms, opacité 10%) toutes les 30-60s pour la vibe rave. **Respecte `prefers-reduced-motion`** - -### 4.3 Transition entre pages = **crossfade EQ** - -Quand tu cliques sur un lien de nav : -1. L'écran actuel reçoit un **léger blur + fade out** (simule un low-pass EQ qui ferme) -2. Le nouveau page **slide in** avec son contenu qui reveal (fade in + text split) -3. Durée totale : ~600ms -4. Réalisation : **Astro View Transitions API** (native) - -### 4.4 Scroll smooth = Lenis (déjà fait) - -### 4.5 Curseur - -- Curseur natif conservé -- **Sur les liens/boutons** : petit halo néon cyan/acid qui apparaît (au lieu d'un curseur custom qui dérange) -- **Boutons magnétiques** : le bouton se déplace légèrement vers le curseur à l'approche (spring physics, comme Vercel / Rauno) - -### 4.6 Text reveals - -- Tous les gros titres : **char-by-char reveal** avec effet blur → clear (Framer Motion SplitText) -- Sous-titres : **word-by-word** fade-up -- Trigger : `whileInView` - ---- - -## 5. Page / (Home) - -### 5.1 Hero - -**Couche 1 (background fixe)** : -- Gradient mesh animé noir → charbon -- 3 spots UV lents -- **Ligne de waveform audio** centrée en bas du hero, qui pulse doucement (fake audio reactive avec math `sin`). Couleur cyan/acid, épaisseur fine. - -**Couche 2 (texte)** : -- `> frequency: 174 BPM` (petit mono cyan tout en haut, stylé tag radio) -- **Titre** : `Johan Leroy` en **ultra large**, style poster free party. Le "Leroy" en **acid yellow** avec glow (au lieu de magenta). Effet **char-by-char reveal** au load. -- Sous-titre : `[ ` + **mot qui morph `dev → DJ → skeud-head → dev`** + ` ]` dans des brackets mono -- **Tagline acid** : _"code propre, sono sale"_ en italique mono -- **CTA principal** en **jaune acid** néon : `// grab the dubplate (cv.pdf)` -- **CTA ghost** : `>> browse the crate` - -**Couche 3 (stickers / details) :** -- En haut à droite, petit **badge "ON AIR"** avec LED verte (animée) -- En bas à gauche, petit tag style flyer `NANTES FR · 2019→now` -- Stickers collés style "free party sticker pack" éparpillés (logos fictifs en SVG) — très légers, opacité 20% - -### 5.2 Section Stack = **Sound system rack** - -**Métaphore : un rack de studio / sono.** Un panneau sombre façon plaque acier brossé, avec **modules empilés** verticalement (comme des modules Eurorack). - -Chaque module = une catégorie : -- En haut du module : **label LED** (LANGUAGES, FRAMEWORKS, DATABASES…) -- **VU meter vertical** à gauche qui bouge doucement (fake) -- **Pads / knobs** : chaque techno = un carré avec son icône + label, stylé "bouton pressoir" -- Au hover du pad → **pad s'enfonce** légèrement, LED cyan s'allume, **tooltip** apparaît `[ MASTERED ]` ou `[ KNOWS ]` -- **Indicateur BPM fictif** en haut à droite du rack : `BPM 174 · HARDTEK` - -**Deux racks empilés :** primary (plus gros) et secondary (plus compact). - -Effet paillette : le rack a une **jauge power** qui s'allume au scroll reveal. - -### 5.3 Section Off-decks (centres d'intérêt) - -Cards format **bande magnétique / cassette tape** : -- Chaque card = une mini-cassette stylisée avec étiquette -- Icône au centre, label en dessous façon marker -- Au hover : la bande **tourne** légèrement (CSS transform rotateY) - -### 5.4 Footer - -- Séparateur = **forme d'onde audio** -- 3 colonnes : Nav, Open mic (contact), Credits -- En bas, sticker collé `"// code propre, sono sale — JL 2026"` + **icônes sound system** (enceinte, platine, casque) en SVG - ---- - -## 6. Page /projets = **Crate / skeuds** - -**Métaphore : un bac à disques.** Les projets sont des **skeuds (records 12")** qu'on feuillette. - -### 6.1 Layout - -- **Horizontal pinned scroll** (GSAP ScrollTrigger) : quand tu scrolles verticalement, les skeuds **défilent horizontalement** comme si tu feuilletais un bac -- Chaque skeud = une **pochette vinyle** carrée, grand format (300-400px) - -### 6.2 Skeud / card projet - -- **Face A** par défaut visible : - - Image projet en center crop - - Cercle noir de vinyle qui **dépasse** à droite (comme un disque qui sort de sa pochette) - - Étiquette centrale du vinyle (label fictif) avec nom du projet - - Stickers overlay : - - `[LIVE]` en acid yellow si actif - - `[ARCHIVED]` en gris si fermé - - `[DUBPLATE]` si privé - - BPM fictif `[180 BPM]` -- Au hover : - - Le disque **sort complètement** de la pochette (translation X) - - Le disque **tourne** sur son axe (33⅓ rpm fake, lent) - - La pochette s'incline légèrement (3D tilt) - - Overlay apparaît avec stack + lien "play" -- Au clic : - - Transition fluide vers site externe, ou vers page détail - -### 6.3 Détails graphiques - -- Le bac a une texture **bois / plastique** (SVG pattern) -- **Numéro d'ordre** en gros chiffres stencil derrière chaque card `#01`, `#02` -- Filtres en haut : `[ ALL ]` `[ LIVE ]` `[ ARCHIVED ]` en petits pads -- **Compteur** en bas : `05 / 06 skeuds` - ---- - -## 7. Page /experience = **Setlist** - -**Métaphore : la tracklist d'un set DJ.** Chaque job = une track dans le set, avec durée, BPM, style. - -### 7.1 Layout : tracklist verticale stylisée - -Header de la page : -``` -> setlist.current = "10_years_of_code" -> duration: 10y 0m 0d -> tracks: 6 -> status: ON AIR -``` - -Ensuite, liste verticale où chaque expérience est **une ligne de tracklist** : - -``` -01 [NOW PLAYING] Almeria ████████████ Dev fullstack · 3y · [174 BPM] -02 CEREMA ████░░░░░░░░ Technicien · 2y · [160 BPM] -03 SNCF Réseau ████░░░░░░░░ Télécom · 2y · [140 BPM] -04 [INTRO] Novoferm █░░░░░░░░░░░ Stage · 7w · [120 BPM] -... -``` - -Au clic/hover d'une ligne → elle **s'expand** comme un accordéon, révèle missions + stack. Animation : expansion + le "BPM" pulse. - -### 7.2 Détails - -- Police mono partout dans la liste -- Ligne "NOW PLAYING" avec **fond jaune acid subtil** et **LED rouge clignotante** -- Progress bars = **waveforms** ASCII stylisées -- **Timeline header** : ligne horizontale avec années `2018 — 2026` - -### 7.3 Après la tracklist, 2 blocs : - -- **Patch bay** = compétences techniques (pattern rack, avec câbles SVG animés qui relient les modules) — visuellement unique -- **Soft skills** = liste simple en mono - ---- - -## 8. Page /formations = **BPM Log** - -**Métaphore : un journal de bord de crate-digging.** Tu as appris comme un DJ apprend — tu creuses, tu collectionnes, tu stockes. - -### 8.1 Layout - -Timeline verticale simple mais **affichage type carte d'entrée de rave** : - -Chaque formation = une "carte" façon **entrance ticket** : -- Fond carte papier beige/gris (distinct des autres sections, ambiance "ticket froissé") -- En-tête : `FREE PARTY INVITATION — EDU SYSTEM` -- Date / lieu : `2023 — NANTES — CAMPUS ENI` -- Titre : `CONCEPTEUR DEV. D'APPLICATIONS` -- Description -- Footer sticker : `ADMIT ONE` -- Card **rotationnée légèrement** (tilt 2-3°) pour l'effet "jeté" - -Au scroll, les tickets **glissent** depuis les côtés avec une légère rotation. - ---- - -## 9. Page 404 = **SIGNAL LOST** - -- Fond noir profond, scanlines CRT visibles -- Gros texte central : `SIGNAL LOST` + glitch chromatic aberration -- Sous-texte mono : `frequency not found — rejoin the main feed` -- CTA acid : `[<<] back to the sound system` -- En fond, petit **static noise** animé (SVG avec noise turbulence) - ---- - -## 10. Micro-détails / easter eggs - -- **Konami code** (↑↑↓↓←→←→BA) → active le **party mode** : strobe 1s + glitch généralisé + un émoji skeud qui traverse l'écran -- **Clic logo 5x** → affiche un **DJ set secret** (player audio caché, ton son si tu veux) -- **Boot sequence** au premier load : brève overlay `BOOTING SOUND SYSTEM… [OK]` avant de révéler le hero -- **Hover sur un lien** : léger *tick* (clic platine, togglable) - ---- - -## 11. Plan d'implémentation ordonné - -1. **Design system v2** — ajouter palette acid (`--color-acid: #C6FF00`, `--color-red: #FF0040`), ajouter font stencil (Anton ou Bebas Neue) -2. **View Transitions** activer côté Astro + transitions personnalisées entre pages -3. **Header skinné** — LED ON AIR, scroll progress bar, logo stencil -4. **Hero v2** — waveform SVG animée, text reveal char-by-char, tagline, stickers -5. **Sound system rack** (nouvelle UI skills) — remplace la grille actuelle -6. **Magnetic buttons + text reveals** — utilitaires globaux -7. **Crate / skeuds** (nouvelle UI projets) — horizontal pinned scroll, vinyle qui sort -8. **Setlist** (nouvelle UI experience) — tracklist, now playing, accordéons -9. **Patch bay** (nouveau bloc expérience) — rack + câbles SVG animés -10. **BPM log** (nouvelle UI formations) — tickets rave tiltés -11. **Footer skinné** — forme d'onde, stickers -12. **404 signal lost** -13. **Micro-interactions** — sons togglables, Konami, boot sequence -14. **Reduced motion** — vérifier tout se dégrade bien -15. **Perf** — audit Lighthouse - -**Effort total :** 4-5 jours de dev concentré. Livrable par blocs testables. - ---- - -## 12. Risques & arbitrages - -- **Risque kitsch :** si on en met trop, ça devient caricatural. Ligne de crête : **1 gimmick fort par section max**, le reste sobre. -- **Risque perf :** shader + vinyles 3D + scroll pinned = lourd. On reste sur du CSS/SVG/Canvas 2D léger, pas de WebGL sauf si nécessaire. -- **Risque recruteur :** certains vieux recruteurs ne comprendront pas la métaphore. Contre-mesure : **vocabulaire bilingue** (techos + jargon), CV toujours accessible en 1 clic. -- **Risque audio :** si on ajoute vraiment des sons, **off par défaut**, toggle visible. Jamais auto-play. - ---- - -## 13. Avant le GO : questions pour toi - -1. **Acid yellow `#C6FF00`** comme accent principal CTA, tu valides ? (tu peux aussi choisir `#D6FF00` plus doux) -2. **Font stencil** : Bebas Neue (gratuite, moderne) / Anton / Array (payante mais ultime) ? -3. **Sons** : on les implémente dès le début (togglables, off) ou on les laisse pour plus tard ? -4. **Boot sequence** au premier load : oui ou cringe ? -5. **Vocabulaire** : on garde bilingue (FR grand public + jargon en sous-texte), ou full jargon free party ? -6. **Horizontal pinned scroll** pour les projets : oui (plus wow, mais mobile = fallback grid) / non (grid partout) ? -7. Tu veux **rester sur cette doc** comme référence pendant l'implémentation ou tu veux qu'on épure avant ? - ---- - -Dis-moi tes choix + "GO" et je commence à skinner, par étapes (je te montre après chaque bloc). - ---- - -## 14. Décisions validées ✅ - -| # | Question | Réponse validée | -|---|---|---| -| 1 | Acid yellow `#C6FF00` en accent principal | ✅ Validé | -| 2 | Font stencil | ✅ **Bebas Neue** (Google Fonts, gratuite, moderne) | -| 3 | Sons (clic fader, tick platine) togglables off par défaut | ✅ Intégrés dès le début, **OFF par défaut**, toggle visible | -| 4 | Boot sequence au premier load | ✅ **On tente** — ajustable si cringe après retour | -| 5 | Vocabulaire | ✅ **FR grand public** — **rester pro**. Nav et URLs standards (`/projets`, `/formations`, `/experience`). Les skins free party **dressent** le site en accents déco (sous-titres mono `// crate v1.0`, stickers, BPM fictifs, `[NOW PLAYING]`, etc.) sans bloquer le recruteur | -| 6 | Horizontal pinned scroll projets | ✅ **OUI** — avec **fallback grid verticale sur mobile** (breakpoint `< md`) | -| 7 | Doc de référence | ✅ On la garde en référence | - -### Ligne éditoriale affinée - -- **Structure UX** = pro et accessible (nav FR, URLs lisibles, CTA clairs) -- **Habillage** = free party / studio (palette acid, stencil, stickers, BPM, waveforms, vinyles) -- **Sons** = **toggle** visible dans le header (icône speaker), off à l'arrivée -- **Boot sequence** = rapide (1.2s max), skippable en cliquant, n'apparaît **qu'au premier load** (stocké en `sessionStorage`), plus jamais en retour de page -- **Mobile** = fallback propre pour chaque wow-feature : - - Horizontal pinned scroll → grid verticale - - Magnetic buttons → classic hover - - Cursor halos → désactivés - - Spots UV parallax → statiques - -### Plan d'exécution — ordre de livraison - -| Bloc | Livrables | Effort | -|---|---|---| -| **0. Design system v2** | Palette acid (`--color-acid`, `--color-red`) + Bebas Neue chargée + utilities `glow-acid`, `stencil`, `sticker` | 0.5j | -| **1. View Transitions + transitions de page** | Crossfade EQ global entre pages | 0.25j | -| **2. Header v2** | Logo stencil "JL" + LED ON AIR + scroll progress bar + toggle sons | 0.5j | -| **3. Background ambient** | Gradient mesh + grain + 2 spots UV suivant le scroll | 0.5j | -| **4. Hero v2 + boot sequence** | Waveform, text reveal, tagline, stickers, CTA acid + boot 1re visite | 1j | -| **5. Sound system rack (skills)** | Remplace les grilles SkillCard actuelles | 1j | -| **6. Magnetic buttons + text reveals globaux** | Utilitaires réutilisables | 0.5j | -| **7. Crate (projets)** | Pinned horizontal scroll + skeuds qui sortent + fallback grid mobile | 1j | -| **8. Setlist (expérience)** | Tracklist, NOW PLAYING, accordéons, BPM | 1j | -| **9. Patch bay (compétences pro)** | Rack + câbles SVG animés | 0.5j | -| **10. BPM log (formations)** | Tickets rave tiltés | 0.5j | -| **11. Footer skinné + 404 Signal Lost** | Waveform séparateur, stickers, page 404 | 0.5j | -| **12. Easter eggs** | Konami, 5× logo, sons | 0.25j | -| **13. Audit perf + reduced motion** | Lighthouse, a11y | 0.5j | - -**Total :** ~8 jours de dev concentré, livrables testables bloc par bloc. - ---- - -## 15. GO ✅ — implémentation démarre au bloc 0 diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index dc5ec99..0000000 --- a/docs/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Docs — Portfolio v2 - -Documents de conception et décisions prises pendant la refonte du portfolio. - -## Sommaire - -| # | Fichier | Rôle | -|---|---|---| -| 01 | [Analyse & plan](./01-analyse-et-plan.md) | Audit de l'ancien site Angular + choix Astro hybrid + système d'édition JSON + stack déploiement Plesk Node.js | -| 02 | [Moodboard Free Party](./02-moodboard-freeparty.md) | Direction artistique "Studio Live / tekno free party" : palette acid, typos, vocabulaire, déclinaison page par page, plan d'implémentation 14 blocs | - -## Choix principaux validés - -- **Framework** : Astro 6 hybrid (SSG public + SSR `/admin` et `/api`) -- **Hébergement** : Plesk Node.js (startup `dist/server/entry.mjs`) -- **Contenu** : `public/content/*.json` éditables via `/admin`, runtime fetch (zéro rebuild) -- **Direction artistique** : Cyberpunk Dark + skin Free Party - - Palette : `#0A0A0F` / `#00F0FF` cyan / `#C6FF00` acid / `#FF2A6D` magenta / `#FF0040` LED red - - Typos : Inter, Space Grotesk, JetBrains Mono, Bebas Neue (stencil) -- **Animations** : Lenis smooth scroll, Framer Motion, View Transitions API, GSAP scroll-pinned manuel, islands React - -## Structure des 14 blocs implémentés - -Voir [02-moodboard-freeparty.md §11](./02-moodboard-freeparty.md) pour la liste ordonnée et [14](./02-moodboard-freeparty.md) pour le plan d'exécution détaillé. - -## Racines & contraintes - -- **Pro avant tout** : nav FR grand public, URLs standards, CV 1 clic -- **Jargon free party = déco** : stickers, BPM fictifs, LED, stencil — jamais bloquant -- **Responsive** : fallbacks propres pour chaque effet wow (pinned horizontal, magnetic, UV parallax) -- **A11y** : respect de `prefers-reduced-motion` partout -- **Sécurité** : admin JWT cookie httpOnly, middleware protégeant `/admin/*` et `/api/content/*` diff --git a/package-lock.json b/package-lock.json index 086fd94..d00f494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,41 +1,22 @@ { "name": "portfolio", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "portfolio", - "version": "1.0.0", + "version": "2.0.0", "dependencies": { - "@astrojs/node": "^10.0.5", - "@astrojs/react": "^5.0.3", - "@hookform/resolvers": "^5.2.2", - "@iconify-icon/react": "^3.0.3", - "@tailwindcss/vite": "^4.2.2", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", "astro": "^6.1.8", - "bcryptjs": "^3.0.3", - "framer-motion": "^12.38.0", - "jose": "^6.2.2", - "lenis": "^1.3.23", - "react": "^19.2.5", - "react-dom": "^19.2.5", - "react-hook-form": "^7.75.0", - "tailwindcss": "^4.2.2", - "zod": "^4.3.6" + "simple-icons": "^13.16.0" }, "devDependencies": { "@astrojs/check": "^0.9.8", - "@types/bcryptjs": "^2.4.6", - "@types/node": "^25.6.0", - "@vitest/coverage-v8": "^4.1.6", - "typescript": "^5.9.3", - "vitest": "^4.1.6" + "typescript": "^5.9.3" }, "engines": { - "node": ">=22.12.0" + "node": ">=18.20.8" } }, "node_modules/@astrojs/check": { @@ -57,36 +38,6 @@ "typescript": "^5.0.0 || ^6.0.0" } }, - "node_modules/@astrojs/check/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@astrojs/check/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@astrojs/compiler": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", @@ -95,23 +46,30 @@ "license": "MIT" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.8.0.tgz", - "integrity": "sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", + "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", "license": "MIT", "dependencies": { - "picomatch": "^4.0.3" + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" } }, "node_modules/@astrojs/language-server": { - "version": "2.16.8", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.8.tgz", - "integrity": "sha512-yg1pZF6hs9FaKr2fgXMOGbW7pDLgFexFjuhWilPAc8VybTU+WSnbfbhYaUL1exm6dAK4sM3aKXGcfVwss+HXbg==", + "version": "2.16.10", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.10.tgz", + "integrity": "sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w==", "dev": true, "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.1", - "@astrojs/yaml2ts": "^0.2.3", + "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", @@ -146,17 +104,16 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.1.tgz", - "integrity": "sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.0.tgz", + "integrity": "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.9.0", - "@astrojs/prism": "4.0.1", + "@astrojs/internal-helpers": "0.10.0", + "@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", @@ -164,9 +121,6 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.0", - "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", @@ -174,33 +128,10 @@ "vfile": "^6.0.3" } }, - "node_modules/@astrojs/markdown-remark/node_modules/@astrojs/internal-helpers": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.0.tgz", - "integrity": "sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==", - "license": "MIT", - "dependencies": { - "picomatch": "^4.0.4" - } - }, - "node_modules/@astrojs/node": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-10.0.5.tgz", - "integrity": "sha512-rgZiU9nD7zmM3fdmOVuobcNHAyXWx2HXXDLTuxjVCTQ+QmHmL5zkZZhNIL5NjlQtDRAU1i5fVaXp7nAKdET30w==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.8.0", - "send": "^1.2.1", - "server-destroy": "^1.0.1" - }, - "peerDependencies": { - "astro": "^6.0.0" - } - }, "node_modules/@astrojs/prism": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.1.tgz", - "integrity": "sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", "license": "MIT", "dependencies": { "prismjs": "^1.30.0" @@ -209,28 +140,6 @@ "node": ">=22.12.0" } }, - "node_modules/@astrojs/react": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-5.0.3.tgz", - "integrity": "sha512-z6JXjgADH4/7e0hqcRj+dO9UQlrKmsm2ZJoVT1GzOTYY0ThQ3Znpfr8tY8XKlEHWSTUlT9LP5u4v6QpEJwLz5A==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.8.0", - "@vitejs/plugin-react": "^5.2.0", - "devalue": "^5.6.4", - "ultrahtml": "^1.6.0", - "vite": "^7.3.1" - }, - "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", - "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", - "react": "^17.0.2 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/@astrojs/telemetry": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", @@ -248,222 +157,40 @@ } }, "node_modules/@astrojs/yaml2ts": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.3.tgz", - "integrity": "sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", + "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", "dev": true, "license": "MIT", "dependencies": { - "yaml": "^2.8.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "yaml": "^2.8.3" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -472,123 +199,57 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@capsizecss/unpack": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", - "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", "license": "MIT", "dependencies": { - "fontkitten": "^1.0.0" + "fontkitten": "^1.0.3" }, "engines": { "node": ">=18" } }, "node_modules/@clack/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.2.0.tgz", - "integrity": "sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.1.tgz", + "integrity": "sha512-FILJa1gGKEFTGZAJE9RpVhrjKz3c3h4ar60dSv6cGuDqufQ84YEIS3GAGvZiN+H6yaLbbvTFNejjCC4tXpZEuw==", "license": "MIT", "dependencies": { - "fast-wrap-ansi": "^0.1.3", + "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" } }, "node_modules/@clack/prompts": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.2.0.tgz", - "integrity": "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.5.1.tgz", + "integrity": "sha512-zccHj2z2oCCO4yrDiRSlFOxWerGqRiysP7a5jPK6uoI9URKAquwY42Dd/iUP8JWHxEzdRe4TlbvZCo8z1/mhrw==", "license": "MIT", "dependencies": { - "@clack/core": "1.2.0", - "fast-string-width": "^1.1.0", - "fast-wrap-ansi": "^0.1.3", + "@clack/core": "1.4.1", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" } }, "node_modules/@emmetio/abbreviation": { @@ -654,9 +315,9 @@ "license": "MIT" }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", "optional": true, "dependencies": { @@ -1079,39 +740,6 @@ "node": ">=18" } }, - "node_modules/@hookform/resolvers": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", - "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" - } - }, - "node_modules/@iconify-icon/react": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@iconify-icon/react/-/react-3.0.3.tgz", - "integrity": "sha512-i4N/J0+UZWQu5Ty9Z+SxsNsuNdY7w2TnSuI65Qw9UrWudvnRodKfTUMvyg0hvxSZolqAE1YJVZu1HqgfpgPX9w==", - "license": "MIT", - "dependencies": { - "iconify-icon": "^3.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "react": ">=18.0.0" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1578,67 +1206,22 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", - "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", - "license": "MIT" - }, "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -1658,9 +1241,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.1.tgz", + "integrity": "sha512-WUtumI+yIc7YXY3ZtN68V50CHEjgopo0rIZ90+ZqlZzIGroVn3qkfK7wkdl+HebaxenGQMrlB/KJs+aLMZg9lQ==", "cpu": [ "arm" ], @@ -1671,9 +1254,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.1.tgz", + "integrity": "sha512-ivTbxKROae184UB9SNQGOmXCwdgq1rb1OfDOXHOw9bHHVtoUSQoyLwAgxcd9zlef+vtPnyqN22HrYvaI7K12Zw==", "cpu": [ "arm64" ], @@ -1684,9 +1267,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.1.tgz", + "integrity": "sha512-+nRm4AIocYcaE5yP07KGybXGDGfBCXOSY7EE7GeGvA8rzK+eiZteAgn9VNkn8sw/+FWR+9FLyph0gUNuY75KuQ==", "cpu": [ "arm64" ], @@ -1697,9 +1280,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.1.tgz", + "integrity": "sha512-63zVs6JwE9i3BMhHm1Gi5+LP8dRKQVrD5UzgjDgZfptON38vfStA4iAK0DpxqTmI8udUzr1Qwk1tEhLRcj7PVA==", "cpu": [ "x64" ], @@ -1710,9 +1293,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.1.tgz", + "integrity": "sha512-uXASB7+/ZbR7q4RC35T/xTwQt4Qwt8e1my8E7hI6PxaQxuNiuvM+B/I58xvJLaVYOmCGy9cu3Ky1SSY4ia/G0Q==", "cpu": [ "arm64" ], @@ -1723,9 +1306,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.1.tgz", + "integrity": "sha512-BqeibWSAOg/6bwxDnJ1Z4806jc6kIuGYCDS52DY4u23EgcK3DMrm4rrODmPTltA8EFlvhz2gXGhs/RwgWuto/w==", "cpu": [ "x64" ], @@ -1736,9 +1319,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.1.tgz", + "integrity": "sha512-9ryebRuEJ1OcKl9ZWWyXZ84OrpqXl8qwa99ZwrVn1uzBu9TwNqpyoScK7yF/+WoHW0dBGUR3tAHem7nWP1ismQ==", "cpu": [ "arm" ], @@ -1749,9 +1332,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.1.tgz", + "integrity": "sha512-HOHv0qumBDTLxM/j5nE2X6SVHGK2F5r211WqFn0PB+lJL3o4HBP9CsjlcdwIk6aILYeRveltSVmvv9NSW3vnWg==", "cpu": [ "arm" ], @@ -1762,9 +1345,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.1.tgz", + "integrity": "sha512-jrDLxV5iWL8fdpj5N5+9ZAd2BjD3U6h1eiVhOCDQhvKG+C0uJt3phgIsS7sWKTk4LLaom87dMJCIXnakXEs4fA==", "cpu": [ "arm64" ], @@ -1775,9 +1358,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.1.tgz", + "integrity": "sha512-kaKe83aR+a5bvGTdXFlUzGUFPHoSm2zo1PFalUuwqj7+txbLm4jyXwM4IkmrEWK9yAWE9qO654XuBb8dqgSP4A==", "cpu": [ "arm64" ], @@ -1788,9 +1371,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.1.tgz", + "integrity": "sha512-tp+VgVhkZ9iNDGezXQnBx0h+ZraZJCKtbrsxGRSO3Y+Ta/YrUfLxlKXU4IiBm9AWlj9EDH1Djrvsl6ledeUdJg==", "cpu": [ "loong64" ], @@ -1801,9 +1384,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.1.tgz", + "integrity": "sha512-LN9invzRf8ejduiGlrtr46Gk08Uh/1eiMMLgo/CNPHeRpYH8EYW6YQuAqkoxItk+Rtmod1raQ8W49sO+hP+6hQ==", "cpu": [ "loong64" ], @@ -1814,9 +1397,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.1.tgz", + "integrity": "sha512-F2Abce1ndQR8UXEX8Bj3EFd5jlw/u0rlbjmsEzBPty/YJ8H57x3POPnBxr7Mbi8m7UNwukwFW6Z20I+hrQvWdQ==", "cpu": [ "ppc64" ], @@ -1827,9 +1410,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.1.tgz", + "integrity": "sha512-nmJq25UletS/fI3icrKsBH8KDkTf7cSGTY5bkWI9z3+4oHj1DxHQkWCP8uP7m+AEhc1fc73AcycZam4iViAoNQ==", "cpu": [ "ppc64" ], @@ -1840,9 +1423,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.1.tgz", + "integrity": "sha512-HqWXZHGXFrKmSs3qOmNBfLY34CzYDt3HU2oQq2cplmU1gEADa2dWf6xcjrQuHYbNYZpJY2+rLNAbHyXtrO/0PQ==", "cpu": [ "riscv64" ], @@ -1853,9 +1436,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.1.tgz", + "integrity": "sha512-xYDVRyJEbrzr14Z2hqe59C1pwosdl9Td0ik5gu5x85mVswTweg492as4Vzs/8zKkvvUgO5VdGRL7OzN+W9Z6+w==", "cpu": [ "riscv64" ], @@ -1866,9 +1449,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.1.tgz", + "integrity": "sha512-X6n4yZUYAGSZTsIRjHUFkRZy/ml+EyS5vsgnyUOfhflKros0TEjX9yAoFqiRdJSfmykStVUyfcFDy/tHJ64JuQ==", "cpu": [ "s390x" ], @@ -1879,9 +1462,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.1.tgz", + "integrity": "sha512-nVQGk/jStQc2V4rrkI+vPD2J+85boKqS4R4nOdPhc3eWw0kyW/b+AYRGoH8qo057XSVqaTx13AliH5qPeLTtgQ==", "cpu": [ "x64" ], @@ -1892,9 +1475,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.1.tgz", + "integrity": "sha512-Ae54IyMwpY3JsYjBH4k29vQ9FSoILwJdh7j7c9lmLOczKnU/WL5jMRL9epsgPrs+ph48YVTsy6PkQDq0nK8Kvg==", "cpu": [ "x64" ], @@ -1905,9 +1488,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.1.tgz", + "integrity": "sha512-7oOS0UqUXLRi2dVeEXdQxbml854xxQSx+6Pdnuo4G0iAIRiPBCIyzhLIv8oSmvqLkAftGaRk+ft70fVHXjsXsQ==", "cpu": [ "x64" ], @@ -1918,9 +1501,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.1.tgz", + "integrity": "sha512-e6kAhhmUK3pwICnBtsQFkg/czVxFlY5e4Ppi4fuXWvOwiHOXlgQMEvpg0H5ceuEh2T1nyI0U6SfhV3qojKWpAg==", "cpu": [ "arm64" ], @@ -1931,9 +1514,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.1.tgz", + "integrity": "sha512-xXRJSv00uVmj5DwS9DwIvS+Re5VdDnaspDfk7GzsnhP1IbTzFjJwhY+c3j3jr/2pP/prBrXvZ1OmjjhkkAOUlQ==", "cpu": [ "arm64" ], @@ -1944,9 +1527,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.1.tgz", + "integrity": "sha512-D3S8+6cSEW0QZZHcKKDQ/Fsz/eqvYmJbtkZZziFxEb4Fi4fyWTCaMs1p5siQ85/T6gNdYKJ3OIJ4M/phYQgICA==", "cpu": [ "ia32" ], @@ -1957,9 +1540,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.1.tgz", + "integrity": "sha512-CRVGPQKdEB/ujGfrq3SgITWc2N9iWM+sqaBKHh62Dc6xRLQGTVrqHpOVEitfly941kr244j14sswRw47bmMjjg==", "cpu": [ "x64" ], @@ -1970,9 +1553,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.1.tgz", + "integrity": "sha512-/N8QHE1y6A9nmN3HCIFZWr5FUu/rKcT/A7JgaMJH3dcvL5RS++o0brK5SitYVTis/dJFiasK7Xva0cqeWYmCzQ==", "cpu": [ "x64" ], @@ -1983,13 +1566,13 @@ ] }, "node_modules/@shikijs/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", - "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.2.0.tgz", + "integrity": "sha512-Hc87Ab1Ld/vEbZRCbwx344I5v+4RU8CVToUTRkqXL1+TjbuOp9U5Xa0M23V4GEWHxVn+yO5otb+HkQVm3ptWQQ==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.0.2", - "@shikijs/types": "4.0.2", + "@shikijs/primitive": "4.2.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" @@ -1999,26 +1582,26 @@ } }, "node_modules/@shikijs/engine-javascript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", - "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.2.0.tgz", + "integrity": "sha512-fjETeq1k5ffyXqRgS6+3hpvqseLalp1kjNfRbXpUgWR8FpZ1CmQfiNHovc5lncYjt/Vg5JK/WJEmLahjwMa0og==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" + "oniguruma-to-es": "^4.3.6" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", - "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.2.0.tgz", + "integrity": "sha512-hTorK1dffPkpbMUk6Z+828PgRo7d07HbnizoP0hNPFjhxMHctj0Px/qoHeGMYafc6ju+u9iMldN4JbVzNQM++g==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -2026,24 +1609,24 @@ } }, "node_modules/@shikijs/langs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", - "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.2.0.tgz", + "integrity": "sha512-bwrVRlJ0wUhZxAbVdvBbv2TTC9yLsh4C/IO5Ofz0T8MQntgDvyVnkbjw9vi50r1kx7RCIJdnJnjZAwmAsXFLZQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2" + "@shikijs/types": "4.2.0" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/primitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", - "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.2.0.tgz", + "integrity": "sha512-NOq+DtUkVBJtZMVXL5A0vI0Xk8nvDYaXetFHSJFlOqjDZIVhIPRYFdGkSoElDqNuegikcc3A76SNUa8dTqtAYA==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -2052,21 +1635,21 @@ } }, "node_modules/@shikijs/themes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", - "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.2.0.tgz", + "integrity": "sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2" + "@shikijs/types": "4.2.0" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/types": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", - "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.2.0.tgz", + "integrity": "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -2082,335 +1665,6 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", - "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", - "tailwindcss": "4.2.2" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7 || ^8" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2420,17 +1674,10 @@ "@types/ms": "*" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, "node_modules/@types/hast": { @@ -2466,34 +1713,6 @@ "@types/unist": "*" } }, - "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.19.0" - } - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -2501,185 +1720,11 @@ "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "license": "ISC" }, - "node_modules/@vitejs/plugin-react": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", - "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-rc.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.6.tgz", - "integrity": "sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.6", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "4.1.6", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.6", - "@vitest/utils": "4.1.6", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.6", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.6", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@volar/kit": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", @@ -2893,54 +1938,15 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-v8-to-istanbul": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/astro": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.3.1.tgz", - "integrity": "sha512-atz6dmkE3Gu24bDgb7g2RE/BYnKqPYIHd6hTUM1UXvu/i7qNZOKLAqEHvgYpv9PQVcgWsXpk4/OOXZ0E/FzvSQ==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/astro/-/astro-6.4.8.tgz", + "integrity": "sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^4.0.0", - "@astrojs/internal-helpers": "0.9.0", - "@astrojs/markdown-remark": "7.1.1", + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/markdown-remark": "7.2.0", "@astrojs/telemetry": "3.3.2", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", @@ -2952,7 +1958,7 @@ "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", - "devalue": "^5.6.3", + "devalue": "^5.8.1", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", @@ -3016,15 +2022,6 @@ "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==", "license": "MIT" }, - "node_modules/astro/node_modules/@astrojs/internal-helpers": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.0.tgz", - "integrity": "sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==", - "license": "MIT", - "dependencies": { - "picomatch": "^4.0.4" - } - }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -3044,86 +2041,12 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", - "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bcryptjs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", - "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", - "license": "BSD-3-Clause", - "bin": { - "bcrypt": "bin/bcrypt" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001788", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", - "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3134,16 +2057,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -3175,15 +2088,16 @@ } }, "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^5.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 20.19.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3276,12 +2190,6 @@ "node": ">= 18" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -3384,12 +2292,6 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3426,15 +2328,6 @@ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3455,14 +2348,15 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } }, "node_modules/devalue": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", - "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", "license": "MIT" }, "node_modules/devlop": { @@ -3563,18 +2457,6 @@ "node": ">=4" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz", - "integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==", - "license": "ISC" - }, "node_modules/emmet": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", @@ -3599,28 +2481,6 @@ "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -3634,9 +2494,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "license": "MIT" }, "node_modules/esbuild": { @@ -3684,17 +2544,12 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -3713,31 +2568,12 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3752,18 +2588,18 @@ "license": "MIT" }, "node_modules/fast-string-truncated-width": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-1.2.1.tgz", - "integrity": "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", "license": "MIT" }, "node_modules/fast-string-width": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-1.1.0.tgz", - "integrity": "sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", "license": "MIT", "dependencies": { - "fast-string-truncated-width": "^1.2.0" + "fast-string-truncated-width": "^3.0.2" } }, "node_modules/fast-uri": { @@ -3784,12 +2620,12 @@ "license": "BSD-3-Clause" }, "node_modules/fast-wrap-ansi": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.1.6.tgz", - "integrity": "sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "license": "MIT", "dependencies": { - "fast-string-width": "^1.1.0" + "fast-string-width": "^3.0.2" } }, "node_modules/fdir": { @@ -3839,42 +2675,6 @@ "node": ">=20" } }, - "node_modules/framer-motion": { - "version": "12.38.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", - "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.38.0", - "motion-utils": "^12.36.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3889,15 +2689,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3929,12 +2720,6 @@ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "license": "ISC" }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/h3": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", @@ -3952,16 +2737,6 @@ "uncrypto": "^0.1.3" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/hast-util-from-html": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", @@ -4161,44 +2936,6 @@ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconify-icon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/iconify-icon/-/iconify-icon-3.0.2.tgz", - "integrity": "sha512-DYPAumiUeUeT/GHT8x2wrAVKn1FqZJqFH0Y5pBefapWRreV1BBvqBVMb0020YQ2njmbR59r/IathL2d2OrDrxA==", - "license": "MIT", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -4293,80 +3030,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports/node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", - "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4375,18 +3052,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4394,18 +3059,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -4422,286 +3075,6 @@ "node": ">=6" } }, - "node_modules/lenis": { - "version": "1.3.23", - "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.23.tgz", - "integrity": "sha512-YxYq3TJqj9sJNv0V9SkyQHejt14xwyIwgDaaMK89Uf9SxQfIszu+gTQSSphh6BWlLTNVKvvXAGkg+Zf+oFIevg==", - "license": "MIT", - "workspaces": [ - "packages/*", - "playground", - "playground/*" - ], - "funding": { - "type": "github", - "url": "https://github.com/sponsors/darkroomengineering" - }, - "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 - } - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "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" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4713,9 +3086,9 @@ } }, "node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -4731,32 +3104,16 @@ } }, "node_modules/magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", + "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -5561,46 +3918,6 @@ ], "license": "MIT" }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/motion-dom": { - "version": "12.38.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", - "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.36.0" - } - }, - "node_modules/motion-utils": { - "version": "12.36.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", - "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", - "license": "MIT" - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -5624,9 +3941,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.13.tgz", + "integrity": "sha512-sPdqC6ByMVVGvF1ynvvMo0/o+oD1VX7DaHhijt1bFgjvBkHBib4t49GoNDhf2NDta4oeUNlaGbSt5K7qjZ955Q==", "funding": [ { "type": "github", @@ -5675,12 +3992,6 @@ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", - "license": "MIT" - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5703,14 +4014,17 @@ } }, "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } }, "node_modules/ofetch": { "version": "1.5.1", @@ -5729,18 +4043,6 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/oniguruma-parser": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", @@ -5774,12 +4076,12 @@ } }, "node_modules/p-queue": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.2.tgz", - "integrity": "sha512-ktsDOALzTYTWWF1PbkNVg2rOt+HaOaMWJMUnt7T3qf5tvZ1L8dBW3tObzprBcXNMKkwj+yFSLqHso0x+UFcJXw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", + "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" }, "engines": { @@ -5844,13 +4146,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -5876,9 +4171,9 @@ } }, "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -5895,7 +4190,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5904,9 +4199,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", "dev": true, "license": "MIT", "bin": { @@ -5929,9 +4224,9 @@ } }, "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", "funding": { "type": "github", @@ -5944,68 +4239,14 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.5" - } - }, - "node_modules/react-hook-form": { - "version": "7.75.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.75.0.tgz", - "integrity": "sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 20.19.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6276,12 +4517,12 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.62.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.1.tgz", + "integrity": "sha512-XTvxjHHM/0J/WZBg+ehDbAZgIpZoIZtWO+aImyuhjoyQa56NBX/bqnXw32rT27fkjSRrqthOgkLjRVtwXFI7jQ==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -6291,31 +4532,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@rollup/rollup-android-arm-eabi": "4.62.1", + "@rollup/rollup-android-arm64": "4.62.1", + "@rollup/rollup-darwin-arm64": "4.62.1", + "@rollup/rollup-darwin-x64": "4.62.1", + "@rollup/rollup-freebsd-arm64": "4.62.1", + "@rollup/rollup-freebsd-x64": "4.62.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.1", + "@rollup/rollup-linux-arm-musleabihf": "4.62.1", + "@rollup/rollup-linux-arm64-gnu": "4.62.1", + "@rollup/rollup-linux-arm64-musl": "4.62.1", + "@rollup/rollup-linux-loong64-gnu": "4.62.1", + "@rollup/rollup-linux-loong64-musl": "4.62.1", + "@rollup/rollup-linux-ppc64-gnu": "4.62.1", + "@rollup/rollup-linux-ppc64-musl": "4.62.1", + "@rollup/rollup-linux-riscv64-gnu": "4.62.1", + "@rollup/rollup-linux-riscv64-musl": "4.62.1", + "@rollup/rollup-linux-s390x-gnu": "4.62.1", + "@rollup/rollup-linux-x64-gnu": "4.62.1", + "@rollup/rollup-linux-x64-musl": "4.62.1", + "@rollup/rollup-openbsd-x64": "4.62.1", + "@rollup/rollup-openharmony-arm64": "4.62.1", + "@rollup/rollup-win32-arm64-msvc": "4.62.1", + "@rollup/rollup-win32-ia32-msvc": "4.62.1", + "@rollup/rollup-win32-x64-gnu": "4.62.1", + "@rollup/rollup-win32-x64-msvc": "4.62.1", "fsevents": "~2.3.2" } }, @@ -6328,16 +4569,10 @@ "node": ">=11.0.0" } }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6346,44 +4581,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "license": "ISC" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", @@ -6430,17 +4627,17 @@ } }, "node_modules/shiki": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", - "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.2.0.tgz", + "integrity": "sha512-hjNax6o/ylDy9lefQEaSDtzaT3iVNtZ3WmpQnbuQNoG4xvnSKf2kSKbihZVO4JRG1TTMejs7CmNRYlWgAL66pQ==", "license": "MIT", "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/core": "4.2.0", + "@shikijs/engine-javascript": "4.2.0", + "@shikijs/engine-oniguruma": "4.2.0", + "@shikijs/langs": "4.2.0", + "@shikijs/themes": "4.2.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -6448,12 +4645,18 @@ "node": ">=20" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" + "node_modules/simple-icons": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-13.21.0.tgz", + "integrity": "sha512-LI5pVJPBv6oc79OMsffwb6kEqnmB8P1Cjg1crNUlhsxPETQ5UzbCKQdxU+7MW6+DD1qfPkla/vSKlLD4IfyXpQ==", + "license": "CC0-1.0", + "engines": { + "node": ">=0.12.18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/simple-icons" + } }, "node_modules/sisteransi": { "version": "1.0.5", @@ -6492,29 +4695,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6557,19 +4737,6 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/svgo": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", @@ -6595,60 +4762,34 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyclip": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz", - "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.14.tgz", + "integrity": "sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ==", "license": "MIT", "engines": { "node": "^16.14.0 || >= 17.3.0" } }, "node_modules/tinyexec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", - "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -6661,25 +4802,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -6704,7 +4826,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/typesafe-path": { "version": "0.2.2", @@ -6738,9 +4861,9 @@ } }, "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "license": "MIT" }, "node_modules/ultrahtml": { @@ -6755,13 +4878,6 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, - "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", - "devOptional": true, - "license": "MIT" - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -7011,34 +5127,32 @@ } } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/unstorage/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "readdirp": "^5.0.0" }, - "bin": { - "update-browserslist-db": "cli.js" + "engines": { + "node": ">= 20.19.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/unstorage/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/vfile": { @@ -7084,9 +5198,9 @@ } }, "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", "license": "MIT", "dependencies": { "esbuild": "^0.27.0", @@ -7176,96 +5290,6 @@ } } }, - "node_modules/vitest": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz", - "integrity": "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.6", - "@vitest/mocker": "4.1.6", - "@vitest/pretty-format": "4.1.6", - "@vitest/runner": "4.1.6", - "@vitest/snapshot": "4.1.6", - "@vitest/spy": "4.1.6", - "@vitest/utils": "4.1.6", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.6", - "@vitest/browser-preview": "4.1.6", - "@vitest/browser-webdriverio": "4.1.6", - "@vitest/coverage-istanbul": "4.1.6", - "@vitest/coverage-v8": "4.1.6", - "@vitest/ui": "4.1.6", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, "node_modules/volar-service-css": { "version": "0.0.70", "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.70.tgz", @@ -7422,6 +5446,13 @@ "vscode-uri": "^3.1.0" } }, + "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, "node_modules/vscode-html-languageservice": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", @@ -7453,9 +5484,9 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0.tgz", + "integrity": "sha512-+VvMmQPJhtvJ+8O+zu2JKIRiLxXF8NW7krWgyMGeOHrp4Cn23T5hc0v2LknNeopDOB70wghHAds7mKtcZ0I4Sg==", "dev": true, "license": "MIT", "engines": { @@ -7476,14 +5507,14 @@ } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.0.tgz", + "integrity": "sha512-Zdz+kJ12Iz6tc11xfZyEo501bBATHXrCjmMfnaR3pMnf1CoqZBKIynba3P+/bi9VEdrMbNtAVKYpKhbODvqy+Q==", "dev": true, "license": "MIT", "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" + "vscode-jsonrpc": "9.0.0", + "vscode-languageserver-types": "3.18.0" } }, "node_modules/vscode-languageserver-textdocument": { @@ -7494,6 +5525,34 @@ "license": "MIT" }, "node_modules/vscode-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", @@ -7533,23 +5592,6 @@ "node": ">=4" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7584,16 +5626,10 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "devOptional": true, "license": "ISC", "bin": { @@ -7650,9 +5686,9 @@ } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { @@ -7700,9 +5736,9 @@ } }, "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index c29c936..a6cc680 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,23 @@ { "name": "portfolio", "type": "module", - "version": "1.0.0", + "version": "2.0.0", "engines": { - "node": ">=22.12.0" + "node": ">=18.20.8" }, "scripts": { "dev": "astro dev", "build": "astro build", "preview": "astro preview", - "start": "HOST=0.0.0.0 PORT=3100 node ./dist/server/entry.mjs", - "astro": "astro", "check": "astro check", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "hash:password": "node scripts/hash-password.mjs" + "astro": "astro" }, "dependencies": { - "@astrojs/node": "^10.0.5", - "@astrojs/react": "^5.0.3", - "@hookform/resolvers": "^5.2.2", - "@iconify-icon/react": "^3.0.3", - "@tailwindcss/vite": "^4.2.2", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", "astro": "^6.1.8", - "bcryptjs": "^3.0.3", - "framer-motion": "^12.38.0", - "jose": "^6.2.2", - "lenis": "^1.3.23", - "react": "^19.2.5", - "react-dom": "^19.2.5", - "react-hook-form": "^7.75.0", - "tailwindcss": "^4.2.2", - "zod": "^4.3.6" + "simple-icons": "^13.16.0" }, "devDependencies": { "@astrojs/check": "^0.9.8", - "@types/bcryptjs": "^2.4.6", - "@types/node": "^25.6.0", - "@vitest/coverage-v8": "^4.1.6", - "typescript": "^5.9.3", - "vitest": "^4.1.6" + "typescript": "^5.9.3" } } diff --git a/public/content/experiences.json b/public/content/experiences.json deleted file mode 100644 index 4627b15..0000000 --- a/public/content/experiences.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "items": [ - { - "id": "almeria", - "company": "Almeria", - "logo": "/api/files/img/company/almeria.png", - "role": "Développeur", - "period": "Depuis 2023", - "duration": "3 ans", - "description": "Conception et développement d'applications web et de logiciels d'intégration ERP.", - "missions": [ - "Analyse, conception et développement d'applications web", - "Création de logiciels d'intégration ERP", - "Maintenance et évolution des applications existantes" - ], - "stack": ["Angular", "Express.js", "NestJS", "SQL Server", "MariaDB"], - "type": "cdi", - "current": true - }, - { - "id": "cerema", - "company": "CEREMA", - "logo": "/api/files/img/company/cerema.png", - "role": "Technicien évaluation mesure trafic & mobilité", - "period": "2021 - 2023", - "duration": "2 ans", - "description": "Spécialisé dans l'installation de capteurs et l'analyse de données de mobilité.", - "missions": [ - "Installation de capteurs provisoires dans le secteur mobilité", - "Optimisation des données dans l'innovation d'outils numériques", - "Analyse et traitement des données de trafic et mobilité" - ], - "stack": ["Analyse de données", "PHP", "MariaDB"], - "type": "cdd", - "current": false - }, - { - "id": "sncf", - "company": "Réseau SNCF", - "logo": "/api/files/img/company/sncf.png", - "role": "Agent télécom", - "period": "2019 - 2021", - "duration": "2 ans", - "description": "Maintenance des équipements de sonorisation, d'affichage et de téléphonie sur le réseau ferroviaire.", - "missions": [ - "Maintenance préventive et corrective des équipements", - "Installation et réparation des systèmes d'affichage en gare", - "Gestion des équipements téléphoniques sur les voies ferrées" - ], - "stack": ["Télécommunications", "Maintenance", "Équipements audio", "Affichage dynamique"], - "type": "cdi", - "current": false - }, - { - "id": "novoferm", - "company": "Novoferm", - "logo": "/api/files/img/company/novoferm.png", - "role": "Stage développeur", - "period": "2019", - "duration": "7 semaines", - "description": "Stage de développement d'une application web qui permet de récupérer des fichiers stockés dans SharePoint. Réparation et configuration de PC, imprimantes et téléphones.", - "missions": [], - "stack": [], - "type": "stage", - "current": false - }, - { - "id": "pivotpoint", - "company": "Pivot Point", - "logo": "/api/files/img/company/pivotpoint.png", - "role": "Stage développeur", - "period": "2018", - "duration": "1 semaine", - "description": "Stage de développement d'un site internet en PHP.", - "missions": [], - "stack": ["PHP"], - "type": "stage", - "current": false - }, - { - "id": "actemium", - "company": "Actemium", - "logo": "/api/files/img/company/actemium.png", - "role": "Stage développeur", - "period": "2018", - "duration": "1 semaine", - "description": "Stage de développement d'applications Windows d'automatisation.", - "missions": [], - "stack": [], - "type": "stage", - "current": false - } - ], - "skills": { - "technical": [ - "Développement Frontend", - "Développement Backend", - "Analyse et traitement de données", - "Mise en production", - "Analyse de base de données", - "Modélisation UML", - "Maquettage", - "Sécurité" - ], - "soft": [ - "Gestion de projets", - "Travail en équipe", - "Analyse de projets", - "Communication", - "Autonomie", - "Organisation", - "Adaptation", - "Veille technologique" - ] - } -} diff --git a/public/content/formations.json b/public/content/formations.json deleted file mode 100644 index 3dcd46e..0000000 --- a/public/content/formations.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "items": [ - { - "id": "cda-eni", - "title": "Concepteur Développeur d'Applications", - "school": "Campus ENI Nantes", - "schoolUrl": "https://www.eni-ecole.fr", - "period": "Depuis 2023", - "description": "Formation sur la conception et le développement d'applications web et mobiles. Acquisition des compétences en architecture logicielle et gestion de projets informatiques." - }, - { - "id": "bts-sn", - "title": "BTS Systèmes Numériques", - "school": "Campus Saint Félix La Salle Nantes", - "schoolUrl": "https://stfelixlasalle.fr", - "period": "2021 - 2023", - "description": "Formation technique supérieure en systèmes électroniques et informatiques, avec une spécialisation en informatique industrielle et en réseaux." - }, - { - "id": "bac-pro-sn", - "title": "BAC PRO Systèmes Numériques", - "school": "Campus Saint Félix La Salle Nantes", - "schoolUrl": "https://stfelixlasalle.fr", - "period": "2018 - 2021", - "description": "Formation en systèmes électroniques et réseaux informatiques. Apprentissage des bases de l'installation et de la maintenance de systèmes numériques." - }, - { - "id": "brevet", - "title": "Diplôme National du Brevet", - "school": "Ensemble scolaire Saint Père en Retz", - "schoolUrl": "https://www.ensemble-scolaire-saint-pere.fr", - "period": "Avant 2018" - } - ] -} diff --git a/public/content/interests.json b/public/content/interests.json deleted file mode 100644 index 2507700..0000000 --- a/public/content/interests.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "items": [ - { "id": "gaming", "label": "Jeux vidéo", "icon": "lucide:gamepad-2", "color": "violet" }, - { "id": "movies", "label": "Films & Séries", "icon": "lucide:film", "color": "cyan" }, - { "id": "dj", "label": "DJing / Tekno", "icon": "lucide:disc-3", "color": "magenta" }, - { "id": "side", "label": "Projets personnels", "icon": "lucide:rocket", "color": "ice" } - ] -} diff --git a/public/content/profile.json b/public/content/profile.json deleted file mode 100644 index 8c1f9cc..0000000 --- a/public/content/profile.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "Johan Leroy", - "title": "Développeur", - "tagline": "Dev le jour, DJ la nuit", - "bio": "Développeur fullstack passionné par les technos modernes. J'aime créer des expériences web performantes, propres et scalables — et accessoirement mixer de la tekno quand l'écran s'éteint.", - "available": true, - "availableLabel": "Ouvert aux opportunités", - "hero": { - "photo": "/api/files/img/pp/pp3.png", - "photos": [ - "/api/files/img/pp/pp1.png", - "/api/files/img/pp/pp2.png", - "/api/files/img/pp/pp3.png" - ], - "roles": [ - "Dev", - "DJ", - "Dev" - ], - "cta": [ - { - "label": "Télécharger mon CV", - "href": "/api/files/assets/cv.pdf", - "variant": "primary", - "external": true - }, - { - "label": "Voir mes projets", - "href": "/projets", - "variant": "ghost", - "external": false - } - ] - }, - "socials": { - "email": "contact@johanleroy.fr", - "github": "https://github.com/JohanLeroy", - "gitea": "https://git.lidge.fr/johanleroy", - "linkedin": "https://www.linkedin.com/in/johan-leroy-472409180/", - "website": "https://johanleroy.fr" - }, - "cv": "/api/files/assets/cv.pdf" -} diff --git a/public/content/projects.json b/public/content/projects.json deleted file mode 100644 index 5f24ce4..0000000 --- a/public/content/projects.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "items": [ - { - "id": "techos", - "title": "Techos", - "subtitle": "Plateforme hébergement & domaines", - "description": "Plateforme client + admin de gestion d'hébergement web et de domaines pour une association, construite par-dessus WHMCS. Design system Liquid Glass dark + light mode.", - "image": "/api/files/img/projet/techos.png", - "category": "web", - "status": "live", - "url": "https://techos-asso.fr", - "stack": ["Next.js 16", "React 19", "NestJS 11", "TailwindCSS 4", "shadcn/ui", "Redis", "WHMCS API"], - "featured": true - }, - { - "id": "amarea", - "title": "Amarea Tattoo", - "subtitle": "Site du studio de tatouage Amarea", - "description": "Site vitrine et gestion pour un studio de tatouage. Architecture découplée SPA + REST API avec gestion de médias.", - "image": "", - "category": "web", - "status": "live", - "stack": ["Vue 3", "Vite", "NestJS 11", "TypeORM", "MariaDB", "Tailwind 4"], - "featured": true - }, - { - "id": "lidge", - "title": "Lidge", - "subtitle": "Portail abonnements services auto-hébergés", - "description": "Plateforme personnelle pour gérer les abonnements à mes services auto-hébergés (Jellyfin, Cloud, Vault, Mail, Messenger, Git…) avec SSO, tickets et workflow d'accès.", - "image": "", - "category": "web", - "status": "live", - "stack": ["Nuxt 3", "NestJS 11", "TypeORM", "MariaDB", "JWT", "Nodemailer"], - "featured": true - }, - { - "id": "ksauce-bot", - "title": "Bot Discord KSauce", - "subtitle": "Bot communautaire Discord", - "description": "Bot Discord développé pour la communauté KSauce. Gestion de commandes, modération et fonctionnalités sur-mesure.", - "image": "", - "category": "bot", - "status": "live", - "stack": ["Node.js", "TypeScript", "Discord.js"], - "featured": false - }, - { - "id": "lplv", - "title": "Liberty Pour La Vie", - "subtitle": "Site associatif (archivé)", - "description": "Développement d'un site web complet pour l'association Liberty Pour La Vie. Projet fermé, plus en ligne.", - "image": "/api/files/img/projet/lplv.png", - "category": "web", - "status": "archived", - "stack": ["Java Spring Boot", "Thymeleaf", "Bootstrap", "MariaDB"], - "featured": false - }, - { - "id": "monvoisingeek", - "title": "Mon Voisin Geek", - "subtitle": "Site vitrine (archivé)", - "description": "Développement d'un site web vitrine simple pour Mon Voisin Geek. Projet fermé, plus en ligne.", - "image": "/api/files/img/projet/monvoisingeek.png", - "category": "web", - "status": "archived", - "stack": ["Angular", "Tailwind CSS", "Express.js", "MariaDB"], - "featured": false - } - ] -} diff --git a/public/content/site.json b/public/content/site.json deleted file mode 100644 index e9d0c33..0000000 --- a/public/content/site.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "title": "Johan Leroy — Portfolio", - "description": "Développeur fullstack — NestJS, Nuxt, Next.js, Vue. Dev le jour, DJ la nuit.", - "url": "https://johanleroy.fr", - "keywords": [ - "johan leroy", - "développeur fullstack", - "nestjs", - "nuxt", - "nextjs", - "vue", - "angular", - "tailwindcss", - "portfolio", - "développeur web", - "freelance", - "nantes" - ], - "ogImage": "/api/files/img/logo/android-chrome-512x512.png", - "features": { - "hero3D": false, - "smoothScroll": true, - "customCursor": false, - "partyMode": true - } -} diff --git a/public/content/skills.json b/public/content/skills.json deleted file mode 100644 index 242054d..0000000 --- a/public/content/skills.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "primary": [ - { - "id": "languages", - "label": "Langages", - "items": [ - { "name": "TypeScript", "icon": "simple-icons:typescript", "level": "primary" }, - { "name": "JavaScript", "icon": "simple-icons:javascript", "level": "primary" }, - { "name": "Java", "icon": "simple-icons:openjdk", "level": "primary" }, - { "name": "Python", "icon": "simple-icons:python", "level": "primary" }, - { "name": "PHP", "icon": "simple-icons:php", "level": "primary" } - ] - }, - { - "id": "frameworks", - "label": "Frameworks", - "items": [ - { "name": "NestJS", "icon": "simple-icons:nestjs", "level": "primary" }, - { "name": "Nuxt", "icon": "simple-icons:nuxt", "level": "primary" }, - { "name": "Next.js", "icon": "simple-icons:nextdotjs", "level": "primary" }, - { "name": "Vue.js", "icon": "simple-icons:vuedotjs", "level": "primary" }, - { "name": "Angular", "icon": "simple-icons:angular", "level": "primary" }, - { "name": "Tailwind CSS", "icon": "simple-icons:tailwindcss", "level": "primary" }, - { "name": "Astro", "icon": "simple-icons:astro", "level": "primary" } - ] - }, - { - "id": "databases", - "label": "Bases de données", - "items": [ - { "name": "MariaDB", "icon": "simple-icons:mariadb", "level": "primary" }, - { "name": "MySQL", "icon": "simple-icons:mysql", "level": "primary" }, - { "name": "PostgreSQL", "icon": "simple-icons:postgresql", "level": "primary" }, - { "name": "Redis", "icon": "simple-icons:redis", "level": "primary" } - ] - }, - { - "id": "tools", - "label": "Outils & DevOps", - "items": [ - { "name": "Docker", "icon": "simple-icons:docker", "level": "primary" }, - { "name": "Git", "icon": "simple-icons:git", "level": "primary" }, - { "name": "AWS", "icon": "simple-icons:amazonwebservices", "level": "primary" }, - { "name": "Terraform", "icon": "simple-icons:terraform", "level": "primary" }, - { "name": "NGINX", "icon": "simple-icons:nginx", "level": "primary" }, - { "name": "Plesk", "icon": "simple-icons:plesk", "level": "primary" } - ] - }, - { - "id": "ide", - "label": "IDE & Éditeurs", - "items": [ - { "name": "WebStorm", "icon": "simple-icons:webstorm", "level": "primary" }, - { "name": "PhpStorm", "icon": "simple-icons:phpstorm", "level": "primary" }, - { "name": "PyCharm", "icon": "simple-icons:pycharm", "level": "primary" }, - { "name": "Claude Code", "icon": "simple-icons:claude", "level": "primary" } - ] - }, - { - "id": "os", - "label": "Systèmes", - "items": [ - { "name": "Debian", "icon": "simple-icons:debian", "level": "primary" }, - { "name": "Ubuntu", "icon": "simple-icons:ubuntu", "level": "primary" }, - { "name": "macOS", "icon": "simple-icons:macos", "level": "primary" } - ] - } - ], - "secondary": [ - { - "id": "languages-2", - "label": "Autres langages", - "items": [ - { "name": "C#", "icon": "simple-icons:dotnet", "level": "secondary" }, - { "name": "C++", "icon": "simple-icons:cplusplus", "level": "secondary" }, - { "name": "Dart", "icon": "simple-icons:dart", "level": "secondary" }, - { "name": "Kotlin", "icon": "simple-icons:kotlin", "level": "secondary" } - ] - }, - { - "id": "frameworks-2", - "label": "Autres frameworks", - "items": [ - { "name": "Spring", "icon": "simple-icons:spring", "level": "secondary" }, - { "name": "Symfony", "icon": "simple-icons:symfony", "level": "secondary" }, - { "name": "Express.js", "icon": "simple-icons:express", "level": "secondary" }, - { "name": "FastAPI", "icon": "simple-icons:fastapi", "level": "secondary" }, - { "name": "Flutter", "icon": "simple-icons:flutter", "level": "secondary" }, - { "name": "GraphQL", "icon": "simple-icons:graphql", "level": "secondary" }, - { "name": "Vuetify", "icon": "simple-icons:vuetify", "level": "secondary" }, - { "name": "Bootstrap", "icon": "simple-icons:bootstrap", "level": "secondary" } - ] - }, - { - "id": "databases-2", - "label": "Autres bases", - "items": [ - { "name": "MongoDB", "icon": "simple-icons:mongodb", "level": "secondary" }, - { "name": "SQLite", "icon": "simple-icons:sqlite", "level": "secondary" } - ] - }, - { - "id": "cloud", - "label": "Cloud & services", - "items": [ - { "name": "Firebase", "icon": "simple-icons:firebase", "level": "secondary" }, - { "name": "Swagger", "icon": "simple-icons:swagger", "level": "secondary" }, - { "name": "Postman", "icon": "simple-icons:postman", "level": "secondary" }, - { "name": "Stripe", "icon": "simple-icons:stripe", "level": "secondary" } - ] - } - ] -} diff --git a/public/assets/cv.pdf b/public/cv.pdf similarity index 100% rename from public/assets/cv.pdf rename to public/cv.pdf diff --git a/public/favicon.ico b/public/favicon.ico index 8e8353d..b004049 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index 1fbf328..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/fonts/inter-400.woff2 b/public/fonts/inter-400.woff2 new file mode 100644 index 0000000..33002f1 Binary files /dev/null and b/public/fonts/inter-400.woff2 differ diff --git a/public/fonts/inter-500.woff2 b/public/fonts/inter-500.woff2 new file mode 100644 index 0000000..03aaea1 Binary files /dev/null and b/public/fonts/inter-500.woff2 differ diff --git a/public/fonts/inter-600.woff2 b/public/fonts/inter-600.woff2 new file mode 100644 index 0000000..fb50a02 Binary files /dev/null and b/public/fonts/inter-600.woff2 differ diff --git a/public/fonts/inter-700.woff2 b/public/fonts/inter-700.woff2 new file mode 100644 index 0000000..12b51d7 Binary files /dev/null and b/public/fonts/inter-700.woff2 differ diff --git a/public/fonts/inter-800.woff2 b/public/fonts/inter-800.woff2 new file mode 100644 index 0000000..882bd18 Binary files /dev/null and b/public/fonts/inter-800.woff2 differ diff --git a/public/fonts/jetbrains-mono-400.woff2 b/public/fonts/jetbrains-mono-400.woff2 new file mode 100644 index 0000000..5858873 Binary files /dev/null and b/public/fonts/jetbrains-mono-400.woff2 differ diff --git a/public/fonts/jetbrains-mono-500.woff2 b/public/fonts/jetbrains-mono-500.woff2 new file mode 100644 index 0000000..be878e6 Binary files /dev/null and b/public/fonts/jetbrains-mono-500.woff2 differ diff --git a/public/fonts/jetbrains-mono-600.woff2 b/public/fonts/jetbrains-mono-600.woff2 new file mode 100644 index 0000000..59c24e7 Binary files /dev/null and b/public/fonts/jetbrains-mono-600.woff2 differ diff --git a/public/img/company/actemium.png b/public/images/entreprises/actemium.png similarity index 100% rename from public/img/company/actemium.png rename to public/images/entreprises/actemium.png diff --git a/public/img/company/almeria.png b/public/images/entreprises/almeria.png similarity index 100% rename from public/img/company/almeria.png rename to public/images/entreprises/almeria.png diff --git a/public/img/company/cerema.png b/public/images/entreprises/cerema.png similarity index 100% rename from public/img/company/cerema.png rename to public/images/entreprises/cerema.png diff --git a/public/img/company/novoferm.png b/public/images/entreprises/novoferm.png similarity index 100% rename from public/img/company/novoferm.png rename to public/images/entreprises/novoferm.png diff --git a/public/img/company/pivotpoint.png b/public/images/entreprises/pivotpoint.png similarity index 100% rename from public/img/company/pivotpoint.png rename to public/images/entreprises/pivotpoint.png diff --git a/public/img/company/sncf.png b/public/images/entreprises/sncf.png similarity index 100% rename from public/img/company/sncf.png rename to public/images/entreprises/sncf.png diff --git a/public/images/logo/LISEZMOI-logo.txt b/public/images/logo/LISEZMOI-logo.txt new file mode 100644 index 0000000..1258d79 --- /dev/null +++ b/public/images/logo/LISEZMOI-logo.txt @@ -0,0 +1,14 @@ +KIT LOGO — Johan Leroy (prêt pour le web) + +Logo détouré (vraie transparence) à partir de ../../logo.png, puis décliné aux bons formats. + +- logo.png Logo du header — JL vert, fond TRANSPARENT (392x320). OK thème clair ET sombre. +- logo-master.png Master carré 1024x1024 transparent (pour régénérer d'autres tailles). +- favicon-16x16.png Favicon 16 (transparent) +- favicon-32x32.png Favicon 32 (transparent) +- favicon.ico Favicon multi-tailles 16/32/48 (transparent) +- apple-touch-icon.png 180x180, fond sombre #09090b (iOS ignore la transparence) +- android-chrome-192x192.png 192, fond sombre #09090b (maskable, zone de sécurité) +- android-chrome-512x512.png 512, fond sombre #09090b (maskable) + +Source d'origine (fond damier non transparent) conservée à la racine du kit : ../../logo.png diff --git a/public/images/logo/android-chrome-192x192.png b/public/images/logo/android-chrome-192x192.png new file mode 100644 index 0000000..271f17b Binary files /dev/null and b/public/images/logo/android-chrome-192x192.png differ diff --git a/public/images/logo/android-chrome-512x512.png b/public/images/logo/android-chrome-512x512.png new file mode 100644 index 0000000..6194c15 Binary files /dev/null and b/public/images/logo/android-chrome-512x512.png differ diff --git a/public/images/logo/apple-touch-icon.png b/public/images/logo/apple-touch-icon.png new file mode 100644 index 0000000..491b1f3 Binary files /dev/null and b/public/images/logo/apple-touch-icon.png differ diff --git a/public/images/logo/favicon-16x16.png b/public/images/logo/favicon-16x16.png new file mode 100644 index 0000000..616661f Binary files /dev/null and b/public/images/logo/favicon-16x16.png differ diff --git a/public/images/logo/favicon-32x32.png b/public/images/logo/favicon-32x32.png new file mode 100644 index 0000000..cbc957c Binary files /dev/null and b/public/images/logo/favicon-32x32.png differ diff --git a/public/images/logo/favicon.ico b/public/images/logo/favicon.ico new file mode 100644 index 0000000..b004049 Binary files /dev/null and b/public/images/logo/favicon.ico differ diff --git a/public/images/logo/logo-master.png b/public/images/logo/logo-master.png new file mode 100644 index 0000000..9b9c3c9 Binary files /dev/null and b/public/images/logo/logo-master.png differ diff --git a/public/images/logo/logo.png b/public/images/logo/logo.png new file mode 100644 index 0000000..1ebceab Binary files /dev/null and b/public/images/logo/logo.png differ diff --git a/public/images/og.png b/public/images/og.png new file mode 100644 index 0000000..e72c861 Binary files /dev/null and b/public/images/og.png differ diff --git a/public/img/pp/origin.JPEG b/public/images/profil/origin.JPEG similarity index 100% rename from public/img/pp/origin.JPEG rename to public/images/profil/origin.JPEG diff --git a/public/img/pp/pp1.png b/public/images/profil/pp1.png similarity index 100% rename from public/img/pp/pp1.png rename to public/images/profil/pp1.png diff --git a/public/img/pp/pp2.png b/public/images/profil/pp2.png similarity index 100% rename from public/img/pp/pp2.png rename to public/images/profil/pp2.png diff --git a/public/img/pp/pp3.png b/public/images/profil/pp3.png similarity index 100% rename from public/img/pp/pp3.png rename to public/images/profil/pp3.png diff --git a/public/img/projet/lplv.png b/public/images/projets/lplv.png similarity index 100% rename from public/img/projet/lplv.png rename to public/images/projets/lplv.png diff --git a/public/img/projet/monvoisingeek.png b/public/images/projets/monvoisingeek.png similarity index 100% rename from public/img/projet/monvoisingeek.png rename to public/images/projets/monvoisingeek.png diff --git a/public/img/projet/techos.png b/public/images/projets/techos.png similarity index 100% rename from public/img/projet/techos.png rename to public/images/projets/techos.png diff --git a/public/img/icon/C.png b/public/images/tech-icons/C.png similarity index 100% rename from public/img/icon/C.png rename to public/images/tech-icons/C.png diff --git a/public/img/icon/CPP.png b/public/images/tech-icons/CPP.png similarity index 100% rename from public/img/icon/CPP.png rename to public/images/tech-icons/CPP.png diff --git a/public/img/icon/FastAPI.png b/public/images/tech-icons/FastAPI.png similarity index 100% rename from public/img/icon/FastAPI.png rename to public/images/tech-icons/FastAPI.png diff --git a/public/img/icon/PostgreSQL.png b/public/images/tech-icons/PostgreSQL.png similarity index 100% rename from public/img/icon/PostgreSQL.png rename to public/images/tech-icons/PostgreSQL.png diff --git a/public/img/icon/SQL-Server.png b/public/images/tech-icons/SQL-Server.png similarity index 100% rename from public/img/icon/SQL-Server.png rename to public/images/tech-icons/SQL-Server.png diff --git a/public/img/icon/SQLite.png b/public/images/tech-icons/SQLite.png similarity index 100% rename from public/img/icon/SQLite.png rename to public/images/tech-icons/SQLite.png diff --git a/public/img/icon/Typescript.png b/public/images/tech-icons/Typescript.png similarity index 100% rename from public/img/icon/Typescript.png rename to public/images/tech-icons/Typescript.png diff --git a/public/img/icon/WebStorm.png b/public/images/tech-icons/WebStorm.png similarity index 100% rename from public/img/icon/WebStorm.png rename to public/images/tech-icons/WebStorm.png diff --git a/public/img/icon/androidStudio.png b/public/images/tech-icons/androidStudio.png similarity index 100% rename from public/img/icon/androidStudio.png rename to public/images/tech-icons/androidStudio.png diff --git a/public/img/icon/angular.png b/public/images/tech-icons/angular.png similarity index 100% rename from public/img/icon/angular.png rename to public/images/tech-icons/angular.png diff --git a/public/img/icon/aws.png b/public/images/tech-icons/aws.png similarity index 100% rename from public/img/icon/aws.png rename to public/images/tech-icons/aws.png diff --git a/public/img/icon/azure.png b/public/images/tech-icons/azure.png similarity index 100% rename from public/img/icon/azure.png rename to public/images/tech-icons/azure.png diff --git a/public/img/icon/bootstrap.png b/public/images/tech-icons/bootstrap.png similarity index 100% rename from public/img/icon/bootstrap.png rename to public/images/tech-icons/bootstrap.png diff --git a/public/img/icon/dart.png b/public/images/tech-icons/dart.png similarity index 100% rename from public/img/icon/dart.png rename to public/images/tech-icons/dart.png diff --git a/public/img/icon/debian.png b/public/images/tech-icons/debian.png similarity index 100% rename from public/img/icon/debian.png rename to public/images/tech-icons/debian.png diff --git a/public/img/icon/docker.png b/public/images/tech-icons/docker.png similarity index 100% rename from public/img/icon/docker.png rename to public/images/tech-icons/docker.png diff --git a/public/img/icon/eclipse.png b/public/images/tech-icons/eclipse.png similarity index 100% rename from public/img/icon/eclipse.png rename to public/images/tech-icons/eclipse.png diff --git a/public/img/icon/expressjs.png b/public/images/tech-icons/expressjs.png similarity index 100% rename from public/img/icon/expressjs.png rename to public/images/tech-icons/expressjs.png diff --git a/public/img/icon/firebase.png b/public/images/tech-icons/firebase.png similarity index 100% rename from public/img/icon/firebase.png rename to public/images/tech-icons/firebase.png diff --git a/public/img/icon/flutter.png b/public/images/tech-icons/flutter.png similarity index 100% rename from public/img/icon/flutter.png rename to public/images/tech-icons/flutter.png diff --git a/public/img/icon/git.png b/public/images/tech-icons/git.png similarity index 100% rename from public/img/icon/git.png rename to public/images/tech-icons/git.png diff --git a/public/img/icon/java.png b/public/images/tech-icons/java.png similarity index 100% rename from public/img/icon/java.png rename to public/images/tech-icons/java.png diff --git a/public/img/icon/js.png b/public/images/tech-icons/js.png similarity index 100% rename from public/img/icon/js.png rename to public/images/tech-icons/js.png diff --git a/public/img/icon/kotlin.png b/public/images/tech-icons/kotlin.png similarity index 100% rename from public/img/icon/kotlin.png rename to public/images/tech-icons/kotlin.png diff --git a/public/img/icon/mariaDB.png b/public/images/tech-icons/mariaDB.png similarity index 100% rename from public/img/icon/mariaDB.png rename to public/images/tech-icons/mariaDB.png diff --git a/public/img/icon/mongo.png b/public/images/tech-icons/mongo.png similarity index 100% rename from public/img/icon/mongo.png rename to public/images/tech-icons/mongo.png diff --git a/public/img/icon/mysql.png b/public/images/tech-icons/mysql.png similarity index 100% rename from public/img/icon/mysql.png rename to public/images/tech-icons/mysql.png diff --git a/public/img/icon/php.png b/public/images/tech-icons/php.png similarity index 100% rename from public/img/icon/php.png rename to public/images/tech-icons/php.png diff --git a/public/img/icon/phpstorm.png b/public/images/tech-icons/phpstorm.png similarity index 100% rename from public/img/icon/phpstorm.png rename to public/images/tech-icons/phpstorm.png diff --git a/public/img/icon/postman.png b/public/images/tech-icons/postman.png similarity index 100% rename from public/img/icon/postman.png rename to public/images/tech-icons/postman.png diff --git a/public/img/icon/python.png b/public/images/tech-icons/python.png similarity index 100% rename from public/img/icon/python.png rename to public/images/tech-icons/python.png diff --git a/public/img/icon/sf.png b/public/images/tech-icons/sf.png similarity index 100% rename from public/img/icon/sf.png rename to public/images/tech-icons/sf.png diff --git a/public/img/icon/spring.png b/public/images/tech-icons/spring.png similarity index 100% rename from public/img/icon/spring.png rename to public/images/tech-icons/spring.png diff --git a/public/img/icon/studio_code.png b/public/images/tech-icons/studio_code.png similarity index 100% rename from public/img/icon/studio_code.png rename to public/images/tech-icons/studio_code.png diff --git a/public/img/icon/swagger.png b/public/images/tech-icons/swagger.png similarity index 100% rename from public/img/icon/swagger.png rename to public/images/tech-icons/swagger.png diff --git a/public/img/icon/tailwind.png b/public/images/tech-icons/tailwind.png similarity index 100% rename from public/img/icon/tailwind.png rename to public/images/tech-icons/tailwind.png diff --git a/public/img/icon/ubuntu.png b/public/images/tech-icons/ubuntu.png similarity index 100% rename from public/img/icon/ubuntu.png rename to public/images/tech-icons/ubuntu.png diff --git a/public/img/icon/windows.png b/public/images/tech-icons/windows.png similarity index 100% rename from public/img/icon/windows.png rename to public/images/tech-icons/windows.png diff --git a/public/img/color-palette.png b/public/img/color-palette.png deleted file mode 100644 index d4a3754..0000000 Binary files a/public/img/color-palette.png and /dev/null differ diff --git a/public/img/logo/android-chrome-192x192.png b/public/img/logo/android-chrome-192x192.png deleted file mode 100644 index 96ec30b..0000000 Binary files a/public/img/logo/android-chrome-192x192.png and /dev/null differ diff --git a/public/img/logo/android-chrome-512x512.png b/public/img/logo/android-chrome-512x512.png deleted file mode 100644 index 1bd29d9..0000000 Binary files a/public/img/logo/android-chrome-512x512.png and /dev/null differ diff --git a/public/img/logo/apple-touch-icon.png b/public/img/logo/apple-touch-icon.png deleted file mode 100644 index 51ccc60..0000000 Binary files a/public/img/logo/apple-touch-icon.png and /dev/null differ diff --git a/public/img/logo/favicon-16x16.png b/public/img/logo/favicon-16x16.png deleted file mode 100644 index fa2e32d..0000000 Binary files a/public/img/logo/favicon-16x16.png and /dev/null differ diff --git a/public/img/logo/favicon-32x32.png b/public/img/logo/favicon-32x32.png deleted file mode 100644 index f46518d..0000000 Binary files a/public/img/logo/favicon-32x32.png and /dev/null differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..7265a15 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://johanleroy.fr/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..af1e2c1 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,9 @@ + + + + https://johanleroy.fr/ + 2026-06-19 + monthly + 1.0 + + diff --git a/scripts/hash-password.mjs b/scripts/hash-password.mjs deleted file mode 100644 index e18fcaf..0000000 --- a/scripts/hash-password.mjs +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env node -import bcrypt from 'bcryptjs'; -import { randomBytes } from 'node:crypto'; - -const password = process.argv[2]; -if (!password) { - console.error('Usage: npm run hash:password -- '); - process.exit(1); -} - -const hash = bcrypt.hashSync(password, 12); -const jwtSecret = randomBytes(48).toString('base64'); - -console.log('\n✅ Copier ce bloc dans ton .env ou variables Plesk :\n'); -console.log(`ADMIN_PASSWORD_HASH=${hash}`); -console.log(`ADMIN_JWT_SECRET=${jwtSecret}\n`); diff --git a/src/components/About.astro b/src/components/About.astro new file mode 100644 index 0000000..702fc5a --- /dev/null +++ b/src/components/About.astro @@ -0,0 +1,30 @@ +--- +import { profile, stats } from "../data/content"; +--- +
+
+
+ Johan Leroy, développeur fullstack +
+
+
01 / à propos
+

Un développeur qui livre, du code à la prod.

+

{profile.bio}

+
+
+ +
+ {stats.map((s) => ( +
+
{s.n}
+
{s.l}
+
+ ))} +
+
diff --git a/src/components/Ambient.astro b/src/components/Ambient.astro deleted file mode 100644 index af11d9f..0000000 --- a/src/components/Ambient.astro +++ /dev/null @@ -1,81 +0,0 @@ ---- -// Background ambient fixed behind all content -// Layers: gradient mesh base (from body .warehouse-bg) + grain SVG + 3 UV spots parallaxed on scroll ---- - - - - diff --git a/src/components/Contact.astro b/src/components/Contact.astro new file mode 100644 index 0000000..3cac9be --- /dev/null +++ b/src/components/Contact.astro @@ -0,0 +1,45 @@ +--- +import Icon from "./Icon.astro"; +import { social, coffeeUrl } from "../data/content"; +--- +
+
+
06 / contact
+

Une idée, un poste, un projet ? Parlons-en.

+

+ Disponible pour de nouvelles opportunités. Le plus simple, c'est un email — je réponds vite. +

+ + + +
+ + + + +
+ +
$ echo "écris-moi"
+ +
+

+ Mes projets open-source ou ce portfolio vous sont utiles ? Vous pouvez m'offrir un café pour + soutenir le travail. +

+ + Offrez-moi un café + +
// merci 🙏
+
+
+
diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 49203b8..fdf7a22 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,160 +1,11 @@ --- -import type { Profile } from '../content/schemas'; -import Waveform from './islands/Waveform'; - -interface Props { - profile: Profile; -} -const { profile } = Astro.props; -const year = new Date().getFullYear(); --- - -