diff --git a/app/(marketing)/components/build-timeline.tsx b/app/(marketing)/components/build-timeline.tsx index 0874b6a..7da3bbf 100644 --- a/app/(marketing)/components/build-timeline.tsx +++ b/app/(marketing)/components/build-timeline.tsx @@ -226,7 +226,7 @@ export const BuildTimeline = ({ data }: BuildTimelineProps) => { {/* Achievements */} {week.achievements.length > 0 && ( -
+

Achievements

@@ -239,6 +239,17 @@ export const BuildTimeline = ({ data }: BuildTimelineProps) => {
)} + + {/* Link to detailed release notes */} + + Bekijk gedetailleerde release notes + + + +
))} diff --git a/app/(marketing)/releases/[category]/page.tsx b/app/(marketing)/releases/[category]/page.tsx new file mode 100644 index 0000000..e005c93 --- /dev/null +++ b/app/(marketing)/releases/[category]/page.tsx @@ -0,0 +1,130 @@ +/** + * Release Detail Page + * + * Renders individual release note from MDX file + */ + +import { notFound } from 'next/navigation' +import { MDXRemote } from 'next-mdx-remote/rsc' +import { getRelease, getAllReleases } from '@/lib/mdx/releases' +import { mdxComponents } from '../components/mdx-components' + +interface ReleasePageProps { + params: Promise<{ + category: string + }> +} + +// Generate static params for all releases +export async function generateStaticParams() { + const releases = await getAllReleases() + + return releases.map((release) => ({ + category: release.slug, + })) +} + +// Generate metadata for SEO +export async function generateMetadata({ params }: ReleasePageProps) { + const { category } = await params + const release = await getRelease(category) + + if (!release) { + return { + title: 'Release Not Found', + } + } + + return { + title: `${release.frontmatter.title} - Release Notes`, + description: release.frontmatter.description, + } +} + +export default async function ReleasePage({ params }: ReleasePageProps) { + const { category } = await params + const release = await getRelease(category) + + if (!release) { + notFound() + } + + const { frontmatter, content } = release + + return ( +
+
+ {/* Header */} +
+
+ + v{frontmatter.version} + β€’ + +
+ +

+ {frontmatter.title} +

+ +

+ {frontmatter.description} +

+
+ + {/* MDX Content */} +
+ +
+ + {/* Footer Navigation */} + +
+
+ ) +} + +function StatusBadge({ status }: { status: 'completed' | 'in_progress' | 'planned' }) { + const styles = { + completed: 'bg-teal-100 text-teal-700 border-teal-200', + in_progress: 'bg-amber-100 text-amber-700 border-amber-200', + planned: 'bg-slate-100 text-slate-600 border-slate-200', + } + + const labels = { + completed: 'Voltooid', + in_progress: 'Bezig', + planned: 'Gepland', + } + + return ( + + {labels[status]} + + ) +} diff --git a/app/(marketing)/releases/components/mdx-components.tsx b/app/(marketing)/releases/components/mdx-components.tsx new file mode 100644 index 0000000..a8ea07e --- /dev/null +++ b/app/(marketing)/releases/components/mdx-components.tsx @@ -0,0 +1,153 @@ +/** + * Custom MDX Components + * + * Styled components for rendering MDX content + */ + +import Image from 'next/image' +import Link from 'next/link' + +type MDXComponents = { + [key: string]: React.ComponentType +} + +export const mdxComponents: MDXComponents = { + // Headings with anchor links + h1: ({ children, ...props }) => ( +

+ {children} +

+ ), + h2: ({ children, ...props }) => ( +

+ {children} +

+ ), + h3: ({ children, ...props }) => ( +

+ {children} +

+ ), + h4: ({ children, ...props }) => ( +

+ {children} +

+ ), + + // Paragraphs + p: ({ children, ...props }) => ( +

+ {children} +

+ ), + + // Lists + ul: ({ children, ...props }) => ( + + ), + ol: ({ children, ...props }) => ( +
    + {children} +
+ ), + li: ({ children, ...props }) => ( +
  • + {children} +
  • + ), + + // Links + a: ({ href, children, ...props }) => ( + + {children} + + ), + + // Images + img: ({ src, alt, ...props }) => { + if (!src) return null + + return ( +
    +
    + {alt +
    + {alt && ( +
    + {alt} +
    + )} +
    + ) + }, + + // Code blocks + pre: ({ children, ...props }) => ( +
    +      {children}
    +    
    + ), + code: ({ children, ...props }) => ( + + {children} + + ), + + // Blockquote + blockquote: ({ children, ...props }) => ( +
    + {children} +
    + ), + + // Horizontal rule + hr: (props) => ( +
    + ), + + // Table + table: ({ children, ...props }) => ( +
    + + {children} +
    +
    + ), + th: ({ children, ...props }) => ( + + {children} + + ), + td: ({ children, ...props }) => ( + + {children} + + ), + + // Strong/Bold + strong: ({ children, ...props }) => ( + + {children} + + ), + + // Emphasis/Italic + em: ({ children, ...props }) => ( + + {children} + + ), +} diff --git a/app/(marketing)/releases/components/release-sidebar.tsx b/app/(marketing)/releases/components/release-sidebar.tsx new file mode 100644 index 0000000..fe3a9dd --- /dev/null +++ b/app/(marketing)/releases/components/release-sidebar.tsx @@ -0,0 +1,171 @@ +'use client' + +/** + * Release Sidebar Navigation + * + * Fixed sidebar with grouped list of all releases + * Auto-generated from MDX files + */ + +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { ChevronRight, ChevronDown } from 'lucide-react' +import { useState } from 'react' +import type { ReleaseNote, GroupMetadata, CategoryMetadata } from '@/lib/mdx/releases' + +interface ReleaseSidebarProps { + releases: ReleaseNote[] + metadata: { + groups: GroupMetadata[] + categories: CategoryMetadata[] + } +} + +export function ReleaseSidebar({ releases, metadata }: ReleaseSidebarProps) { + const pathname = usePathname() + const [expandedGroups, setExpandedGroups] = useState>({ + foundation: true, + features: true, + infrastructure: true, + }) + + const toggleGroup = (groupId: string) => { + setExpandedGroups(prev => ({ + ...prev, + [groupId]: !prev[groupId], + })) + } + + // Group releases by their group + const releasesByGroup = releases.reduce((acc, release) => { + const group = release.frontmatter.group + if (!acc[group]) acc[group] = [] + acc[group].push(release) + return acc + }, {} as Record) + + // Check if we're on a specific release page + const isReleaseDetail = pathname.startsWith('/releases/') && pathname !== '/releases' + + return ( + <> + {/* Mobile: Horizontal scroll menu */} +
    +
    + + Overzicht + + {releases.map((release) => ( + + {release.frontmatter.title} + + ))} +
    +
    + + {/* Desktop: Fixed sidebar */} + + + ) +} + +function StatusDot({ status }: { status: 'completed' | 'in_progress' | 'planned' }) { + const colors = { + completed: 'bg-teal-500', + in_progress: 'bg-amber-500', + planned: 'bg-slate-300', + } + + return ( +
    + ) +} diff --git a/app/(marketing)/releases/layout.tsx b/app/(marketing)/releases/layout.tsx new file mode 100644 index 0000000..7ced41a --- /dev/null +++ b/app/(marketing)/releases/layout.tsx @@ -0,0 +1,34 @@ +/** + * Releases Layout + * + * Layout for release notes pages with sidebar navigation + */ + +import type { ReactNode } from 'react' +import { getAllReleases, getCategoryMetadata } from '@/lib/mdx/releases' +import { ReleaseSidebar } from './components/release-sidebar' + +interface ReleasesLayoutProps { + children: ReactNode +} + +export default async function ReleasesLayout({ children }: ReleasesLayoutProps) { + const releases = await getAllReleases() + const metadata = await getCategoryMetadata() + + return ( +
    +
    +
    + {/* Sidebar - hidden on mobile, fixed on desktop */} + + + {/* Main Content */} +
    + {children} +
    +
    +
    +
    + ) +} diff --git a/app/(marketing)/releases/page.tsx b/app/(marketing)/releases/page.tsx new file mode 100644 index 0000000..81173d6 --- /dev/null +++ b/app/(marketing)/releases/page.tsx @@ -0,0 +1,155 @@ +/** + * Releases Overview Page + * + * Landing page for all release notes grouped by category + */ + +import Link from 'next/link' +import { getAllReleases } from '@/lib/mdx/releases' + +export const metadata = { + title: 'Release Notes - AI Speedrun', + description: 'Volledige changelog van het Mini-ECD prototype. Transparant build-in-public overzicht van features, fixes en improvements.', +} + +export default async function ReleasesPage() { + const releases = await getAllReleases() + + // Group by status for better overview + const completed = releases.filter(r => r.frontmatter.status === 'completed') + const inProgress = releases.filter(r => r.frontmatter.status === 'in_progress') + const planned = releases.filter(r => r.frontmatter.status === 'planned') + + return ( +
    +
    + {/* Header */} +
    +

    + Release Notes +

    +

    + Volledige changelog van het Mini-ECD prototype. Build in public met transparantie over features, tijd en kosten. +

    +
    + + {/* Stats */} +
    +
    +
    {completed.length}
    +
    Voltooid
    +
    +
    +
    {inProgress.length}
    +
    In Progress
    +
    +
    +
    {planned.length}
    +
    Gepland
    +
    +
    + + {/* Completed Releases */} + {completed.length > 0 && ( +
    +

    + βœ… Voltooid +

    +
    + {completed.map((release) => ( + + ))} +
    +
    + )} + + {/* In Progress Releases */} + {inProgress.length > 0 && ( +
    +

    + πŸ”„ In Progress +

    +
    + {inProgress.map((release) => ( + + ))} +
    +
    + )} + + {/* Planned Releases */} + {planned.length > 0 && ( +
    +

    + ⏳ Gepland +

    +
    + {planned.map((release) => ( + + ))} +
    +
    + )} +
    +
    + ) +} + +function ReleaseCard({ release }: { release: any }) { + return ( + +
    +
    +
    +

    + {release.frontmatter.title} +

    + +
    +

    + {release.frontmatter.description} +

    +
    + {release.frontmatter.group.replace('-', ' ')} + β€’ + v{release.frontmatter.version} + β€’ + {new Date(release.frontmatter.releaseDate).toLocaleDateString('nl-NL', { + year: 'numeric', + month: 'long', + day: 'numeric' + })} +
    +
    +
    + + + +
    +
    + + ) +} + +function StatusBadge({ status }: { status: 'completed' | 'in_progress' | 'planned' }) { + const styles = { + completed: 'bg-teal-100 text-teal-700 border-teal-200', + in_progress: 'bg-amber-100 text-amber-700 border-amber-200', + planned: 'bg-slate-100 text-slate-600 border-slate-200', + } + + const labels = { + completed: 'Voltooid', + in_progress: 'Bezig', + planned: 'Gepland', + } + + return ( + + {labels[status]} + + ) +} diff --git a/content/nl/navigation.json b/content/nl/navigation.json index e67bd84..5103855 100644 --- a/content/nl/navigation.json +++ b/content/nl/navigation.json @@ -1,6 +1,10 @@ { "logo": "AI SPEEDRUN", "links": [ + { + "label": "Releases", + "href": "/releases" + }, { "label": "Contact", "href": "/contact" diff --git a/content/nl/releases/_index.json b/content/nl/releases/_index.json new file mode 100644 index 0000000..49fa281 --- /dev/null +++ b/content/nl/releases/_index.json @@ -0,0 +1,87 @@ +{ + "groups": [ + { + "id": "foundation", + "title": "Foundation", + "description": "Basis setup en infrastructuur", + "order": 1 + }, + { + "id": "features", + "title": "Core Features", + "description": "EPD functionaliteit", + "order": 2 + }, + { + "id": "infrastructure", + "title": "Infrastructure", + "description": "Ondersteunende systemen", + "order": 3 + } + ], + "categories": [ + { + "slug": "authentication", + "title": "Authentication", + "group": "foundation", + "description": "Login, signup en password reset", + "order": 1 + }, + { + "slug": "database", + "title": "Database & Schema", + "group": "foundation", + "description": "PostgreSQL schema en RLS policies", + "order": 2 + }, + { + "slug": "environment", + "title": "Environment Setup", + "group": "foundation", + "description": "Development en deployment configuratie", + "order": 3 + }, + { + "slug": "dashboard", + "title": "Dashboard & Navigation", + "group": "features", + "description": "EPD layout en navigatie", + "order": 4 + }, + { + "slug": "client-management", + "title": "Client Management", + "group": "features", + "description": "CRUD operations voor cliΓ«nten", + "order": 5 + }, + { + "slug": "ai-features", + "title": "AI Integrations", + "group": "features", + "description": "AI-gestuurde workflows", + "order": 6 + }, + { + "slug": "hosting", + "title": "Hosting & Deployment", + "group": "infrastructure", + "description": "Vercel deployment en CI/CD", + "order": 7 + }, + { + "slug": "design-system", + "title": "Design System", + "group": "infrastructure", + "description": "UI components en styling", + "order": 8 + }, + { + "slug": "performance", + "title": "Performance", + "group": "infrastructure", + "description": "Optimalisaties en monitoring", + "order": 9 + } + ] +} diff --git a/content/nl/releases/authentication.mdx b/content/nl/releases/authentication.mdx new file mode 100644 index 0000000..6a6b058 --- /dev/null +++ b/content/nl/releases/authentication.mdx @@ -0,0 +1,198 @@ +--- +title: "Authentication & User Management" +category: "authentication" +group: "foundation" +version: "0.1.0" +releaseDate: "2024-11-15" +status: "completed" +description: "Login, signup en password reset functionaliteit via Supabase Auth" +--- + +## Overview + +De authentication flow vormt de basis van het Mini-ECD systeem. Gebruikers kunnen nu veilig inloggen, accounts aanmaken en wachtwoorden resetten via Supabase Auth integratie. + +**Key features:** +- Email/password authentication +- Demo account voor quick testing +- Password reset flow +- Session management met JWT tokens +- Security via RLS policies + +--- + +## Features + +### Login Flow + +![Login screen](/releases/authentication/login-screen.png) +*Login formulier met email/password fields en demo account optie* + +De login pagina biedt twee opties: +- **Handmatige login:** Email en wachtwoord +- **Demo account:** One-click toegang met `demo@mini-ecd.demo` + +**Functionaliteit:** +- Client-side validatie (email format, min 8 characters) +- Server-side authenticatie via Supabase +- Error handling met user-friendly messages +- Redirect naar `/epd/clients` na succesvolle login + +**Demo:** +1. Ga naar `/login` +2. Klik op "Demo Account Proberen" +3. Automatisch ingelogd en doorgestuurd + +### Signup Flow + +Nieuwe gebruikers kunnen zich registreren met: +- Email adres (moet uniek zijn) +- Wachtwoord (min 8 karakters) +- Wachtwoord confirmatie + +**Auto-login functionaliteit:** +- Email confirmation is uitgeschakeld voor development +- Direct ingelogd na signup +- Redirect naar EPD applicatie + +**Duplicate email handling:** +- Auth hook detecteert bestaande emails +- Automatische login als email al bestaat +- User-friendly message: "Dit emailadres bestaat al. Je bent nu ingelogd!" + +### Password Reset + +*Coming soon - gepland voor volgende release* + +--- + +## Technical Notes + +### Architecture + +**Stack:** +- Supabase Auth voor user management +- Next.js 15 Server Components +- Client-side auth helpers in `/lib/auth/client.ts` + +**Security:** +- PKCE flow voor OAuth (toekomst) +- JWT tokens in httpOnly cookies +- RLS policies voor data isolatie +- No API keys in frontend code + +### File Structure + +``` +app/ +β”œβ”€β”€ login/ +β”‚ └── page.tsx # Login/signup form +└── auth/ + └── callback/ + └── route.ts # OAuth callback (future) + +lib/ +β”œβ”€β”€ auth/ +β”‚ β”œβ”€β”€ client.ts # loginWithPassword, signUpWithPassword +β”‚ └── server.ts # createClient for server components + +supabase/ +└── functions/ + └── auth-hook/ + └── index.ts # Duplicate email detection +``` + +### Key Functions + +```tsx +// Login function +export async function loginWithPassword(email: string, password: string) { + const supabase = createClient() + const { data, error } = await supabase.auth.signInWithPassword({ + email, + password, + }) + + if (error) throw error + return data +} + +// Signup with auto-login +export async function signUpWithPassword(email: string, password: string) { + const supabase = createClient() + const { data, error } = await supabase.auth.signUp({ + email, + password, + options: { + emailRedirectTo: `${origin}/auth/callback`, + }, + }) + + if (error) throw error + return data +} +``` + +### Auth Hook + +Edge Function voor duplicate email detection: + +```typescript +// Prevents duplicate signups by auto-logging in existing users +if (event === 'signup' && existingUser) { + return new Response( + JSON.stringify({ + error: { + message: 'Dit emailadres is al geregistreerd. Je wordt automatisch ingelogd.', + code: 'user_already_registered', + data: { shouldAutoLogin: true } + } + }), + { status: 400 } + ) +} +``` + +--- + +## Metrics + +**Development:** +- ⏱️ Build tijd: 6 uur +- πŸ“ Lines of code: ~380 +- πŸ§ͺ Tests: Manual testing (geautomatiseerde tests komen later) + +**Performance:** +- πŸš€ Login response: < 500ms +- πŸ“¦ Bundle size: +15kb (auth client) +- πŸ’Ύ Database queries: 1 per login + +**Cost:** +- πŸ’° Supabase: €0 (free tier) +- πŸ’° Edge Functions: €0 (within limits) + +--- + +## What's Next + +Geplande verbeteringen voor volgende releases: + +- πŸ”œ Password reset flow +- πŸ”œ Email verification (production) +- πŸ”œ OAuth providers (Google, GitHub) +- πŸ”œ Multi-factor authentication +- πŸ”œ Session management dashboard + +--- + +## Related Links + +**Timeline:** +- [Week 1 - Foundation & Marketing](#timeline) + +**Code:** +- [Authentication client library](https://github.com/yourusername/mini-ecd/blob/main/lib/auth/client.ts) +- [Auth hook function](https://github.com/yourusername/mini-ecd/blob/main/supabase/functions/auth-hook) + +**Documentation:** +- [Supabase Auth Docs](https://supabase.com/docs/guides/auth) diff --git a/docs/specs/releasepage/bouwplan-release-notes-v1.0.md b/docs/specs/releasepage/bouwplan-release-notes-v1.0.md new file mode 100644 index 0000000..78d1852 --- /dev/null +++ b/docs/specs/releasepage/bouwplan-release-notes-v1.0.md @@ -0,0 +1,329 @@ +# πŸš€ Bouwplan: Release Notes Feature + +**Projectnaam:** Release Notes Pagina +**Versie:** v1.0 +**Datum:** 19-11-2024 +**Auteur:** Colin + AI + +--- + +## 1. Doel en Context + +Toevoegen van een dedicated release notes pagina aan de AI Speedrun website om transparantie te bieden over ontwikkelvoortgang. De pagina past in de "build in public" filosofie en biedt: + +- **Overzichtspagina** met lijst van alle releases +- **Detail paginas** per week met uitgebreide release notes +- **Sidebar navigatie** (standard software docs stijl) +- **Links vanuit timeline** naar release details + +--- + +## 2. Uitgangspunten + +### 2.1 Technische Stack +- **Frontend:** Next.js 15 (bestaand) + TailwindCSS +- **Content:** MDX bestanden in `/content/nl/releases/` met frontmatter +- **Content Parser:** `next-mdx-remote` of `@next/mdx` voor MDX rendering +- **Routing:** `/releases` (overview) + `/releases/[category]` (detail per functionaliteit) +- **Components:** ReleaseSidebar, MDXContent wrapper +- **Layout:** Marketing layout met sidebar +- **Navigatie:** Thematisch op functionaliteit (niet chronologisch op weken) +- **Images:** `/public/releases/[category]/` voor screenshots en visuals + +### 2.2 Projectkaders +- **Tijd:** 2-3 uur implementatie +- **Budget:** €0 (bestaande stack) +- **Scope:** MVP - basis release notes zonder fancy features +- **Design:** Standard docs-stijl (links sidebar + content) + +### 2.3 Programmeer Uitgangspunten +- **DRY:** Hergebruik bestaande timeline data waar mogelijk +- **KISS:** Simpele layout, geen onnodige animaties +- **SOC:** Content schemas apart, components herbruikbaar +- **Mobile-first:** Horizontal scroll nav op mobile, sidebar op desktop + +--- + +## 3. Epics & Stories Overzicht + +| Epic ID | Titel | Doel | Status | Stories | Geschatte tijd | +|---------|-------|------|--------|---------|----------------| +| E1 | Content Schema | Release data structuur | ⏳ | 2 | 30 min | +| E2 | Route Structure | Pages en layouts | ⏳ | 3 | 45 min | +| E3 | Components | Sidebar + content | ⏳ | 2 | 45 min | +| E4 | Integration | Timeline links + nav | ⏳ | 2 | 30 min | + +**Totaal geschat:** 2.5 uur + +--- + +## 4. Epics & Stories (Uitwerking) + +### Epic 1 β€” Content Schema + +| Story | Beschrijving | Acceptatie | Status | +|-------|--------------|------------|--------| +| E1.S1 | MDX template maken | Release note template met frontmatter + content secties | ⏳ | +| E1.S2 | Content categories definiΓ«ren | Logische indeling functionaliteiten (Auth, Dashboard, AI, etc.) | ⏳ | +| E1.S3 | MDX parser setup | next-mdx-remote configureren voor content rendering | ⏳ | + +**MDX Template:** +```mdx +--- +title: "Authentication & User Management" +category: "authentication" +group: "foundation" +version: "0.1.0" +releaseDate: "2024-11-15" +status: "completed" +description: "Login, signup en password reset functionaliteit" +--- + +## Overview +Korte beschrijving van wat er is gebouwd in deze release... + +## Features + +### Login Flow +![Login screenshot](/releases/authentication/login-screen.png) + +Beschrijving van de login functionaliteit: +- Email/password login +- Demo account optie +- Error handling + +Code voorbeeld (optioneel): +```tsx +const handleLogin = async (email, password) => { + // implementation +} +``` + +### Signup Flow +[Details over signup...] + +## Technical Notes +- Supabase Auth integratie +- RLS policies voor security +- Client-side validation + +## Related Links +- [Timeline Week 1](/timeline#week-1) +- [Database Schema](/docs/schema) +``` + +**Voorbeeld categorieΓ«n:** +- `authentication` - Login, signup, password reset +- `client-management` - CRUD operations voor cliΓ«nten +- `dashboard` - EPD dashboard en navigatie +- `ai-features` - AI integraties (samenvatting, classificatie, plannen) +- `infrastructure` - Database, hosting, performance +- `design-system` - UI components en styling + +--- + +### Epic 2 β€” Route Structure + +| Story | Beschrijving | Acceptatie | Status | +|-------|--------------|------------|--------| +| E2.S1 | Layout maken | `app/(marketing)/releases/layout.tsx` met sidebar | ⏳ | +| E2.S2 | Overview page | `app/(marketing)/releases/page.tsx` met lijst (read MDX frontmatter) | ⏳ | +| E2.S3 | Detail pages | `app/(marketing)/releases/[category]/page.tsx` met MDX rendering | ⏳ | + +**Structuur:** +``` +# Code structuur +app/(marketing)/releases/ +β”œβ”€β”€ layout.tsx # Sidebar wrapper +β”œβ”€β”€ page.tsx # Overview (lijst van alle MDX files) +β”œβ”€β”€ [category]/ +β”‚ └── page.tsx # MDX content renderer +└── components/ + β”œβ”€β”€ release-sidebar.tsx + └── mdx-components.tsx # Custom components voor MDX + +# Content structuur +content/nl/releases/ +β”œβ”€β”€ authentication.mdx +β”œβ”€β”€ client-management.mdx +β”œβ”€β”€ dashboard.mdx +β”œβ”€β”€ ai-features.mdx +β”œβ”€β”€ infrastructure.mdx +└── design-system.mdx + +# Assets structuur +public/releases/ +β”œβ”€β”€ authentication/ +β”‚ β”œβ”€β”€ login-screen.png +β”‚ └── signup-flow.png +β”œβ”€β”€ ai-features/ +β”‚ β”œβ”€β”€ summary-demo.gif +β”‚ └── classification.png +└── ... +``` + +**URL voorbeelden:** +- `/releases` - Overview alle functionaliteiten (parsed MDX frontmatter) +- `/releases/authentication` - Renders `authentication.mdx` +- `/releases/ai-features` - Renders `ai-features.mdx` +- `/releases/dashboard` - Renders `dashboard.mdx` + +--- + +### Epic 3 β€” Components + +| Story | Beschrijving | Acceptatie | Status | +|-------|--------------|------------|--------| +| E3.S1 | ReleaseSidebar | Fixed sidebar desktop, horizontal scroll mobile, reads MDX files | ⏳ | +| E3.S2 | MDX Components | Custom components voor images, code blocks, callouts | ⏳ | +| E3.S3 | Typography styling | Prose styling voor MDX content (tailwindcss/typography) | ⏳ | + +**Features:** +- Sidebar auto-generated from MDX files in `/content/nl/releases/` +- Active state in sidebar +- Mobile-responsive +- Status indicators (completed/in progress/planned) from frontmatter +- Custom MDX components: + - Images met caption + - Code blocks met syntax highlighting + - Callout boxes (info, warning, success) + - YouTube/video embeds (optional) + +--- + +### Epic 4 β€” Integration + +| Story | Beschrijving | Acceptatie | Status | +|-------|--------------|------------|--------| +| E4.S1 | Timeline links | "Release notes β†’" link per week in timeline | ⏳ | +| E4.S2 | Nav menu | "Releases" link in header nav | ⏳ | + +**Changes:** +- `timeline.tsx`: Add link per week +- `navigation.json`: Add releases link +- Test navigation flow + +--- + +## 5. Design Specs (Compact) + +**Layout:** +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Header (existing) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Sidebar β”‚ Main Content β”‚ +β”‚ β”‚ β”‚ +β”‚ Overview β”‚ # Release Notes β”‚ +β”‚ ────── β”‚ β”‚ +β”‚ Foundation β”‚ [Category cards...] β”‚ +β”‚ β”œβ”€ Auth β”‚ β”‚ +β”‚ β”œβ”€ Database β”‚ β”‚ +β”‚ Features β”‚ β”‚ +β”‚ β”œβ”€ Dashboard β”‚ β”‚ +β”‚ β”œβ”€ Clients β”‚ β”‚ +β”‚ β”œβ”€ AI β”‚ β”‚ +β”‚ Infrastructure β”‚ +β”‚ β”œβ”€ Hosting β”‚ β”‚ +β”‚ β”œβ”€ Design β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**Sidebar structuur (thematisch):** +- **Foundation** (basis setup) + - Authentication + - Database & Schema + - Environment Setup +- **Core Features** (EPD functionaliteit) + - Dashboard & Navigation + - Client Management + - AI Integrations +- **Infrastructure** (ondersteunend) + - Hosting & Deployment + - Design System + - Performance + +**Mobile:** Horizontal scroll tabs boven content + +**Content styling:** +- `@tailwindcss/typography` plugin voor prose content +- Custom MDX components styled met Tailwind +- Images responsive met captions +- Code blocks met syntax highlighting (shiki/prism) +- Heading anchors voor deep linking + +**Colors:** +- Teal accents (consistent met brand) +- Slate backgrounds for code blocks +- White background for main content +- Prose styles voor text readability + +--- + +## 6. Acceptatiecriteria + +### Must Have: +- [ ] `/releases` toont overzicht gegroepeerd per categorie +- [ ] `/releases/[category]` toont detail van specifieke functionaliteit +- [ ] Sidebar heeft thematische grouping (Foundation, Features, Infrastructure) +- [ ] Sidebar werkt op desktop (fixed) met collapsible sections +- [ ] Mobile heeft horizontal scroll nav met categorieΓ«n +- [ ] Timeline linkt naar relevante release categories +- [ ] "Releases" link in header nav +- [ ] Active states in navigatie + +### Nice to Have (later): +- RSS feed +- Search functie +- Filters (features/fixes/improvements) +- Changelog syntax highlighting + +--- + +## 7. Risico's & Mitigatie + +| Risico | Kans | Impact | Mitigatie | +|--------|------|--------|-----------| +| Content duplicatie met timeline | Middel | Laag | Hergebruik timeline data, extend met extra fields | +| Mobile nav niet intuΓ―tief | Middel | Middel | Test met gebruiker, voeg tooltips toe indien nodig | +| SEO voor individuele releases | Laag | Laag | Metadata per release page toevoegen | + +--- + +## 8. Implementatie Volgorde + +1. **E1.S1:** MDX template maken + voorbeeld content +2. **E1.S2:** CategorieΓ«n definiΓ«ren (authentication, dashboard, ai-features, etc.) +3. **E1.S3:** MDX parser setup (next-mdx-remote of @next/mdx) +4. **E2.S1:** Layout component met sidebar (thematische grouping) +5. **E3.S1:** ReleaseSidebar component (auto-generated from MDX files) +6. **E3.S2:** Custom MDX components (images, code, callouts) +7. **E3.S3:** Typography styling (@tailwindcss/typography) +8. **E2.S2:** Overview page (list van MDX frontmatter) +9. **E2.S3:** Detail page (MDX renderer) +10. **E4.S1:** Timeline integration (link naar relevante categories) +11. **E4.S2:** Navigation update (releases link) + +--- + +## 9. Referenties + +**Bestaande Componenten:** +- `app/(marketing)/components/build-timeline.tsx` - Timeline component +- `content/nl/timeline.json` - Timeline data +- `app/(marketing)/layout.tsx` - Marketing layout + +**Design Inspiratie:** +- Next.js docs (https://nextjs.org/docs) +- Vercel changelog (https://vercel.com/changelog) +- Linear releases (https://linear.app/releases) + +--- + +## 10. Versiehistorie + +| Versie | Datum | Auteur | Wijziging | +|--------|-------|--------|-----------| +| v1.0 | 19-11-2024 | Colin + AI | InitiΓ«le versie - compact bouwplan | +| v1.1 | 19-11-2024 | Colin + AI | Update: thematische indeling ipv chronologisch | +| v1.2 | 19-11-2024 | Colin + AI | Update: MDX/Markdown content ipv JSON/cards | diff --git a/docs/templates/release-note-template.mdx b/docs/templates/release-note-template.mdx new file mode 100644 index 0000000..eed33e1 --- /dev/null +++ b/docs/templates/release-note-template.mdx @@ -0,0 +1,231 @@ +--- +title: "[Feature Name] - Descriptive Title" +category: "category-slug" +group: "foundation | features | infrastructure" +version: "0.1.0" +releaseDate: "2024-11-15" +status: "completed | in_progress | planned" +description: "Korte beschrijving (1-2 zinnen) voor overview pagina" +--- + +## Overview + +Korte introductie van wat er is gebouwd. Waarom is dit belangrijk? Welk probleem lost het op? + +Bijvoorbeeld: +> "De authentication flow is de basis van het EPD systeem. Gebruikers kunnen nu veilig inloggen, accounts aanmaken en wachtwoorden resetten via Supabase Auth." + +--- + +## Features + +### Feature 1: [Naam] + +![Screenshot beschrijving](/releases/[category]/[image].png) +*Caption: Beschrijf wat je in de screenshot ziet* + +Beschrijving van de feature: +- Belangrijkste functionaliteit +- User benefits +- Edge cases afgehandeld + +**Demo:** +- Stap 1: Open `/login` +- Stap 2: Vul credentials in +- Stap 3: Klik op login knop +- Resultaat: Redirect naar `/epd/clients` + +**Code voorbeeld** (optioneel): +```tsx +// Relevante code snippet +const handleLogin = async (email: string, password: string) => { + const { data, error } = await supabase.auth.signInWithPassword({ + email, + password + }) + + if (error) throw error + return data +} +``` + +### Feature 2: [Naam] + +[Herhaal bovenstaande structuur...] + +--- + +## Improvements + +Verbeteringen aan bestaande functionaliteit: + +- **Performance:** Login response tijd van 2s naar 500ms +- **UX:** Error messages nu user-friendly +- **Accessibility:** Keyboard navigation toegevoegd + +--- + +## Bug Fixes + +Opgeloste bugs (indien van toepassing): + +- βœ… Fixed: Wachtwoord reset email kwam niet aan +- βœ… Fixed: Session expiry handling +- βœ… Fixed: Redirect loop bij logout + +--- + +## Technical Notes + +### Architecture + +Technische details voor developers: + +- **Stack:** Supabase Auth + Next.js 15 + Server Actions +- **Database:** RLS policies voor user isolation +- **Security:** PKCE flow voor OAuth +- **Session:** JWT tokens in httpOnly cookies + +### File Structure + +``` +app/ +β”œβ”€β”€ login/ +β”‚ └── page.tsx # Login form +β”œβ”€β”€ signup/ +β”‚ └── page.tsx # Signup form +└── auth/ + └── callback/ + └── route.ts # OAuth callback handler + +lib/ +β”œβ”€β”€ auth/ +β”‚ β”œβ”€β”€ client.ts # Client-side auth functions +β”‚ └── server.ts # Server-side auth helpers +``` + +### Database Schema + +```sql +-- Relevant tables/policies +CREATE POLICY "Users can only read own data" + ON profiles FOR SELECT + USING (auth.uid() = id); +``` + +### Configuration + +Environment variables vereist: +```bash +NEXT_PUBLIC_SUPABASE_URL=your_url +NEXT_PUBLIC_SUPABASE_ANON_KEY=your_key +``` + +--- + +## Breaking Changes + +⚠️ **Let op:** Breaking changes voor developers (indien van toepassing): + +- `loginUser()` functie hernoemd naar `signInWithPassword()` +- `UserSession` type nu `Session` (import van @supabase/supabase-js) + +**Migration guide:** +```tsx +// ❌ Oud +import { loginUser } from '@/lib/auth' +const session = await loginUser(email, password) + +// βœ… Nieuw +import { signInWithPassword } from '@/lib/auth/client' +const { data } = await signInWithPassword(email, password) +``` + +--- + +## Testing + +### Manual Test Checklist + +- [ ] Login met valid credentials werkt +- [ ] Login met invalid credentials toont error +- [ ] Signup flow compleet doorlopen +- [ ] Password reset email ontvangen +- [ ] Session persists na page reload +- [ ] Logout werkt correct + +### Automated Tests + +```bash +# Run tests +npm run test:auth + +# Coverage +npm run test:coverage +``` + +--- + +## Metrics + +**Development:** +- ⏱️ Build tijd: 8 uur +- πŸ“ Lines of code: ~450 +- πŸ§ͺ Test coverage: 85% + +**Performance:** +- πŸš€ Login response: < 500ms (was 2s) +- πŸ“¦ Bundle size: +12kb (auth client) +- πŸ’Ύ Database queries: 2 per login + +**Cost:** +- πŸ’° Supabase: €0 (free tier) +- πŸ’° Vercel: €0 (hobby plan) + +--- + +## Screenshots + +### Login Screen +![Login screen](/releases/authentication/login-screen.png) +*Login formulier met email/password en demo account optie* + +### Signup Flow +![Signup screen](/releases/authentication/signup-flow.png) +*Signup formulier met password confirmation* + +### Error States +![Error handling](/releases/authentication/error-states.png) +*User-friendly error messages voor verschillende scenarios* + +--- + +## Related Links + +**Timeline:** +- [Week 1 - Foundation](/timeline#week-1) + +**Documentation:** +- [Database Schema](/docs/database-schema) +- [API Documentation](/docs/api) + +**External:** +- [Supabase Auth Docs](https://supabase.com/docs/guides/auth) +- [Next.js Auth Guide](https://nextjs.org/docs/authentication) + +--- + +## What's Next + +Geplande verbeteringen voor volgende releases: + +- πŸ”œ OAuth providers (Google, GitHub) +- πŸ”œ Multi-factor authentication (MFA) +- πŸ”œ Magic link login +- πŸ”œ Session management dashboard + +--- + +## Feedback + +Vragen of feedback? [Open een issue](https://github.com/[org]/[repo]/issues) of [stuur een email](mailto:contact@example.com). diff --git a/lib/mdx/releases.ts b/lib/mdx/releases.ts new file mode 100644 index 0000000..6a03ff5 --- /dev/null +++ b/lib/mdx/releases.ts @@ -0,0 +1,122 @@ +/** + * Release Notes MDX Utilities + * + * Functions for loading and parsing release note MDX files + */ + +import fs from 'fs' +import path from 'path' +import matter from 'gray-matter' +import { MDXRemote } from 'next-mdx-remote/rsc' + +const RELEASES_DIR = path.join(process.cwd(), 'content/nl/releases') + +export interface ReleaseFrontmatter { + title: string + category: string + group: 'foundation' | 'features' | 'infrastructure' + version: string + releaseDate: string + status: 'completed' | 'in_progress' | 'planned' + description: string +} + +export interface ReleaseNote { + slug: string + frontmatter: ReleaseFrontmatter + content: string +} + +/** + * Get all release note files + */ +export async function getAllReleases(): Promise { + const files = fs.readdirSync(RELEASES_DIR) + + const releases = files + .filter(file => file.endsWith('.mdx') && !file.startsWith('_')) + .map(file => { + const slug = file.replace('.mdx', '') + const filePath = path.join(RELEASES_DIR, file) + const fileContent = fs.readFileSync(filePath, 'utf-8') + const { data, content } = matter(fileContent) + + return { + slug, + frontmatter: data as ReleaseFrontmatter, + content, + } + }) + + // Sort by group order and then by category + return releases.sort((a, b) => { + const groupOrder = { foundation: 1, features: 2, infrastructure: 3 } + const aOrder = groupOrder[a.frontmatter.group] + const bOrder = groupOrder[b.frontmatter.group] + + if (aOrder !== bOrder) return aOrder - bOrder + return a.frontmatter.category.localeCompare(b.frontmatter.category) + }) +} + +/** + * Get a single release by slug + */ +export async function getRelease(slug: string): Promise { + const filePath = path.join(RELEASES_DIR, `${slug}.mdx`) + + if (!fs.existsSync(filePath)) { + return null + } + + const fileContent = fs.readFileSync(filePath, 'utf-8') + const { data, content } = matter(fileContent) + + return { + slug, + frontmatter: data as ReleaseFrontmatter, + content, + } +} + +/** + * Get releases grouped by their group (foundation, features, infrastructure) + */ +export async function getReleasesGrouped() { + const releases = await getAllReleases() + + return { + foundation: releases.filter(r => r.frontmatter.group === 'foundation'), + features: releases.filter(r => r.frontmatter.group === 'features'), + infrastructure: releases.filter(r => r.frontmatter.group === 'infrastructure'), + } +} + +/** + * Get category metadata from index file + */ +export interface CategoryMetadata { + slug: string + title: string + group: string + description: string + order: number +} + +export interface GroupMetadata { + id: string + title: string + description: string + order: number +} + +interface IndexData { + groups: GroupMetadata[] + categories: CategoryMetadata[] +} + +export async function getCategoryMetadata(): Promise { + const indexPath = path.join(RELEASES_DIR, '_index.json') + const indexContent = fs.readFileSync(indexPath, 'utf-8') + return JSON.parse(indexContent) +} diff --git a/package.json b/package.json index c92318c..52b499d 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,10 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.24", + "gray-matter": "^4.0.3", "lucide-react": "^0.553.0", "next": "16.0.1", + "next-mdx-remote": "^5.0.0", "next-themes": "^0.4.6", "react": "19.2.0", "react-dom": "19.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d78229..6968d4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,12 +35,18 @@ importers: framer-motion: specifier: ^12.23.24 version: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 lucide-react: specifier: ^0.553.0 version: 0.553.0(react@19.2.0) next: specifier: 16.0.1 version: 16.0.1(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next-mdx-remote: + specifier: ^5.0.0 + version: 5.0.0(@types/react@19.2.2)(react@19.2.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -55,7 +61,7 @@ importers: version: 3.4.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.18(tsx@4.20.6)) + version: 1.0.7(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) three: specifier: ^0.181.1 version: 0.181.1 @@ -98,7 +104,7 @@ importers: version: 8.5.6 tailwindcss: specifier: ^3.4.18 - version: 3.4.18(tsx@4.20.6) + version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) typescript: specifier: ^5 version: 5.9.3 @@ -559,6 +565,15 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + '@mediapipe/tasks-vision@0.10.17': resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} @@ -832,18 +847,36 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/draco3d@1.4.10': resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.19.24': resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} @@ -877,6 +910,12 @@ packages: '@types/three@0.181.0': resolution: {integrity: sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webxr@0.5.24': resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} @@ -942,6 +981,9 @@ packages: resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -1087,6 +1129,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1129,6 +1174,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -1152,6 +1201,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1216,10 +1268,25 @@ packages: caniuse-lite@1.0.30001754: resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1234,6 +1301,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1241,6 +1311,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1304,6 +1377,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1315,6 +1391,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-gpu@5.0.70: resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} @@ -1322,6 +1402,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1391,6 +1474,12 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -1504,6 +1593,11 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1516,10 +1610,38 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1674,6 +1796,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1701,6 +1827,15 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -1732,10 +1867,19 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1775,6 +1919,13 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1795,6 +1946,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -1811,6 +1965,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} @@ -1879,6 +2037,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1913,6 +2075,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2011,6 +2177,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2035,10 +2204,41 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2051,6 +2251,90 @@ packages: meshoptimizer@0.22.0: resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2094,6 +2378,12 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + next-mdx-remote@5.0.0: + resolution: {integrity: sha512-RNNbqRpK9/dcIFZs/esQhuLA8jANqlH694yqoDBK8hkVdJUndzzGmnPHa2nyi90N4Z9VmzuSWNRpr5ItT3M7xQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16' + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -2191,6 +2481,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2293,6 +2586,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2334,6 +2630,20 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2342,6 +2652,18 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2387,6 +2709,10 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2444,6 +2770,16 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -2491,6 +2827,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2499,6 +2838,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2507,6 +2850,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -2586,6 +2935,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + troika-three-text@0.52.4: resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} peerDependencies: @@ -2599,6 +2951,9 @@ packages: troika-worker-utils@0.52.0: resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -2661,6 +3016,36 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove@3.1.1: + resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -2685,6 +3070,15 @@ packages: resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} engines: {node: '>= 4'} + vfile-matter@5.0.1: + resolution: {integrity: sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + webgl-constants@1.1.1: resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} @@ -2739,6 +3133,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2785,6 +3184,9 @@ packages: use-sync-external-store: optional: true + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -3169,6 +3571,42 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.2 + react: 19.2.0 + '@mediapipe/tasks-vision@0.10.17': {} '@monogrid/gainmap-js@3.1.0(three@0.181.1)': @@ -3426,14 +3864,34 @@ snapshots: tslib: 2.8.1 optional: true + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/draco3d@1.4.10': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + '@types/node@20.19.24': dependencies: undici-types: 6.21.0 @@ -3470,6 +3928,10 @@ snapshots: fflate: 0.8.2 meshoptimizer: 0.22.0 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/webxr@0.5.24': {} '@types/ws@8.18.1': @@ -3569,6 +4031,8 @@ snapshots: '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -3669,6 +4133,10 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-query@5.3.2: {} @@ -3742,6 +4210,8 @@ snapshots: ast-types-flow@0.0.8: {} + astring@1.9.0: {} + async-function@1.0.0: {} autoprefixer@10.4.22(postcss@8.5.6): @@ -3762,6 +4232,8 @@ snapshots: axobject-query@4.1.0: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -3827,11 +4299,21 @@ snapshots: caniuse-lite@1.0.30001754: {} + ccount@2.0.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3852,12 +4334,16 @@ snapshots: clsx@2.1.1: {} + collapse-white-space@2.1.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@4.1.1: {} concat-map@0.0.1: {} @@ -3908,6 +4394,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + deep-is@0.1.4: {} define-data-property@1.1.4: @@ -3922,12 +4412,18 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + dequal@2.0.3: {} + detect-gpu@5.0.70: dependencies: webgl-constants: 1.1.1 detect-libc@2.1.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + didyoumean@1.2.2: {} dlv@1.1.3: {} @@ -4060,6 +4556,20 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -4284,6 +4794,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -4294,8 +4806,47 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -4452,6 +5003,13 @@ snapshots: graphemer@1.4.0: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.2 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -4474,6 +5032,51 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -4497,12 +5100,21 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.7: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4551,6 +5163,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} + + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -4571,6 +5187,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -4582,6 +5200,8 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-promise@2.2.2: {} is-regex@1.2.1: @@ -4655,6 +5275,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -4684,6 +5309,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -4758,6 +5385,8 @@ snapshots: lodash.merge@4.6.2: {} + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -4781,8 +5410,109 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + markdown-extensions@2.0.0: {} + math-intrinsics@1.1.0: {} + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + merge2@1.4.1: {} meshline@3.3.1(three@0.181.1): @@ -4791,6 +5521,212 @@ snapshots: meshoptimizer@0.22.0: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -4828,6 +5764,19 @@ snapshots: natural-compare@1.4.0: {} + next-mdx-remote@5.0.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + '@babel/code-frame': 7.27.1 + '@mdx-js/mdx': 3.1.1 + '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + unist-util-remove: 3.1.1 + vfile: 6.0.3 + vfile-matter: 5.0.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: react: 19.2.0 @@ -4935,6 +5884,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -4970,13 +5929,14 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.6 tsx: 4.20.6 + yaml: 2.8.1 postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -5017,6 +5977,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.1.0: {} + punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -5049,6 +6011,35 @@ snapshots: dependencies: picomatch: 2.3.1 + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -5069,6 +6060,38 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -5116,6 +6139,11 @@ snapshots: scheduler@0.27.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@6.3.1: {} semver@7.7.3: {} @@ -5212,6 +6240,12 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + stable-hash@0.0.5: {} stats-gl@2.4.2(@types/three@0.181.0)(three@0.181.1): @@ -5288,6 +6322,11 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5296,10 +6335,20 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.0): dependencies: client-only: 0.0.1 @@ -5329,11 +6378,11 @@ snapshots: tailwind-merge@3.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.18(tsx@4.20.6)): + tailwindcss-animate@1.0.7(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)): dependencies: - tailwindcss: 3.4.18(tsx@4.20.6) + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) - tailwindcss@3.4.18(tsx@4.20.6): + tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5352,7 +6401,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.11 @@ -5398,6 +6447,8 @@ snapshots: dependencies: is-number: 7.0.0 + trim-lines@3.0.1: {} + troika-three-text@0.52.4(three@0.181.1): dependencies: bidi-js: 1.0.3 @@ -5412,6 +6463,8 @@ snapshots: troika-worker-utils@0.52.0: {} + trough@2.2.0: {} + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -5501,6 +6554,58 @@ snapshots: undici-types@6.21.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.4 @@ -5543,6 +6648,21 @@ snapshots: utility-types@3.11.0: {} + vfile-matter@5.0.1: + dependencies: + vfile: 6.0.3 + yaml: 2.8.1 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + webgl-constants@1.1.1: {} webgl-sdf-generator@1.1.1: {} @@ -5610,6 +6730,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.8.1: {} + yocto-queue@0.1.0: {} zod-validation-error@4.0.2(zod@4.1.12): @@ -5630,3 +6752,5 @@ snapshots: '@types/react': 19.2.2 react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) + + zwitch@2.0.4: {}