From b38c8370d3b4fbe611af1dbba7778a63ae7e100b Mon Sep 17 00:00:00 2001 From: Antoine BERNIER Date: Sun, 16 Aug 2026 12:20:48 +0200 Subject: [PATCH 1/7] feat: take the MD3 colour layer from pmndrs/design-system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs stops maintaining its own copy of the colour system. The ~60-line hand-written @theme mapping and the 33-line shadcn remap in globals.css are replaced by one registry item, pmndrs/design-system/md3, which carries both plus the config they map — so they can no longer drift from each other. react-mcu gives way to material-theme-builder, which is what that item installs. Mostly a rename: --mcu-* becomes --md-sys-color-*. The --color-* names in the @theme mapping are identical either way, so every bg-surface, bg-primary-container and text-on-surface-variant keeps working untouched. Two components referenced the raw variables rather than a utility — Code and Sandpack — and those are the only component edits. The seed moves to poimandres mint. It also stops being restated: it lived in the layout, in build.yml's input defaults and hard-coded again in ci.yml, three copies free to disagree. Now src/lib/md3.ts holds it and the workflow inputs default to empty, so a site overrides the seed by setting one and inherits the pmndrs default by leaving it alone. Also applies the poimandres preset. It is close to a no-op here by design: radius already matched, the colour half is overridden by the remap, and the font half is deliberately not applied because docs self-hosts Inter and Inconsolata. What it does land is the identity in components.json and a --sidebar* block in oklch rather than hsl. Verified: no token lost — all 67 --color-* names the old mapping defined are in the 191 the new one does — and a full build renders mint, with bg-surface-dim, bg-note-container and text-primary-fixed all emitting. Refs pmndrs/design-system#1 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01EDvnsrory1aJsoNALn5aLB --- .changeset/md3-tier1.md | 7 +++ .github/workflows/build.yml | 19 ++++---- .github/workflows/ci.yml | 8 ---- components.json | 3 ++ package.json | 2 +- pnpm-lock.yaml | 16 +++---- src/app/globals.css | 88 +++++++++++++++++++++++-------------- src/app/layout.tsx | 31 ++----------- src/lib/md3.ts | 38 ++++++++++++++++ 9 files changed, 122 insertions(+), 90 deletions(-) create mode 100644 .changeset/md3-tier1.md create mode 100644 src/lib/md3.ts diff --git a/.changeset/md3-tier1.md b/.changeset/md3-tier1.md new file mode 100644 index 000000000..b5ff48b42 --- /dev/null +++ b/.changeset/md3-tier1.md @@ -0,0 +1,7 @@ +--- +'@pmndrs/docs': minor +--- + +Take the Material Design 3 colour layer from `pmndrs/design-system` instead of maintaining it here. The hand-written `@theme` mapping and the shadcn remap — around 105 lines that had to be kept in step with the colour package by hand — are replaced by one registry item, `pmndrs/design-system/md3`, which brings its own Tailwind mapping and the config it maps. `react-mcu` gives way to `material-theme-builder`, so the CSS variables are now `--md-sys-color-*`; every `bg-surface` / `text-on-surface-variant` utility keeps working untouched, because the `--color-*` names on top of them are identical. + +The seed moves to poimandres mint (`#5de4c7`) — this is the visible change — and it now lives in exactly one place, `src/lib/md3.ts`, rather than being restated in the layout and in two workflows. `THEME_PRIMARY`, `THEME_SCHEME`, `THEME_CONTRAST` and the five alert colours still override it per deployment; a site that wants its own seed sets the workflow input, and one that doesn't inherits the pmndrs default. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 99cbf4159..fe35e3742 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,30 +34,33 @@ on: type: string discord: type: string + # Left empty on purpose: the pmndrs defaults live in src/lib/md3.ts, installed + # from pmndrs/design-system. Set one of these only to override the seed for a + # site — an empty value falls through to the shared default. theme_primary: type: string - default: '#323e48' + default: '' theme_scheme: type: string - default: 'tonalSpot' + default: '' theme_contrast: type: string - default: '0' + default: '' theme_note: type: string - default: '#1f6feb' + default: '' theme_tip: type: string - default: '#238636' + default: '' theme_important: type: string - default: '#8957e5' + default: '' theme_warning: type: string - default: '#d29922' + default: '' theme_caution: type: string - default: '#da3633' + default: '' docker_tag: type: string default: '3' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d9040247..d512085aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -114,14 +114,6 @@ jobs: --build-env LOGO=gutenberg.jpg \ --build-env GITHUB="https://github.com/${{ github.repository }}" \ --build-env DISCORD="${{ secrets.DISCORD }}" \ - --build-env THEME_PRIMARY="#323e48" \ - --build-env THEME_SCHEME="tonalSpot" \ - --build-env THEME_CONTRAST="0" \ - --build-env THEME_NOTE="#1f6feb" \ - --build-env THEME_TIP="#238636" \ - --build-env THEME_IMPORTANT="#8957e5" \ - --build-env THEME_WARNING="#d29922" \ - --build-env THEME_CAUTION="#da3633" \ --build-env CONTRIBUTORS_PAT="${{ secrets.GITHUB_TOKEN }}" \ > deployment-url.txt diff --git a/components.json b/components.json index f826c543e..806fffde8 100644 --- a/components.json +++ b/components.json @@ -18,5 +18,8 @@ "lib": "@/lib", "hooks": "@/hooks" }, + "rtl": false, + "menuColor": "default", + "menuAccent": "subtle", "registries": {} } diff --git a/package.json b/package.json index c5db147f9..e6a3521ea 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "lodash-es": "^4.17.21", "lucide-react": "^0.563.0", "match-sorter": "^6.3.4", - "material-theme-builder": "^5.0.0", + "material-theme-builder": "^3.2.0", "mcp-handler": "^1.0.7", "mermaid": "^11.12.2", "next": "^16.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f512c7442..f1495224b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,8 +63,8 @@ importers: specifier: ^6.3.4 version: 6.4.0 material-theme-builder: - specifier: ^5.0.0 - version: 5.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18) + specifier: ^3.2.0 + version: 3.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) mcp-handler: specifier: ^1.0.7 version: 1.0.7(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(next@16.1.3(@babel/core@7.28.6)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) @@ -4631,16 +4631,12 @@ packages: resolution: {integrity: sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q==} deprecated: This was arguably a breaking change. Not in API, but more results can be returned. Upgrade to the next major when you are ready for that - material-theme-builder@5.0.0: - resolution: {integrity: sha512-Ixhl1ugmIGIQsHOpimCIjZV/FJIMTbPKKZfWonrTCUV4ZjUiVNTinfYVUjWDMbN2GzUT+rKXyp1nomGB5W129Q==} + material-theme-builder@3.2.0: + resolution: {integrity: sha512-w0mKUYs2u6C3vnZ5lYV4/dpTvutdhhMc6cebhPOiFJvmKb++wCTlvEDk8nvYtcANI2KzM2isupU80A3zx6oKPg==} hasBin: true peerDependencies: react: ^19.2.3 react-dom: ^19.2.3 - tailwindcss: ^4.0.0 - peerDependenciesMeta: - tailwindcss: - optional: true math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -11425,7 +11421,7 @@ snapshots: '@babel/runtime': 7.28.6 remove-accents: 0.5.0 - material-theme-builder@5.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18): + material-theme-builder@3.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@material/material-color-utilities': 0.3.0 commander: 14.0.3 @@ -11433,8 +11429,6 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) zod: 4.4.3 - optionalDependencies: - tailwindcss: 4.1.18 math-intrinsics@1.1.0: {} diff --git a/src/app/globals.css b/src/app/globals.css index 15909b771..102c1fda8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -283,17 +283,16 @@ pre[class*='language-'] { @custom-variant dark (&:is(.dark *)); :root { - --radius: 0.625rem; --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); + --primary: oklch(0.511 0.096 186.391); + --primary-foreground: oklch(0.984 0.014 180.72); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); --muted: oklch(0.97 0 0); --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); @@ -302,19 +301,20 @@ pre[class*='language-'] { --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: hsl(0 0% 98%); - --sidebar-foreground: hsl(240 5.3% 26.1%); - --sidebar-primary: hsl(240 5.9% 10%); - --sidebar-primary-foreground: hsl(0 0% 98%); - --sidebar-accent: hsl(240 4.8% 95.9%); - --sidebar-accent-foreground: hsl(240 5.9% 10%); - --sidebar-border: hsl(220 13% 91%); - --sidebar-ring: hsl(217.2 91.2% 59.8%); + --chart-1: oklch(0.855 0.138 181.071); + --chart-2: oklch(0.704 0.14 182.503); + --chart-3: oklch(0.6 0.118 184.704); + --chart-4: oklch(0.511 0.096 186.391); + --chart-5: oklch(0.437 0.078 188.216); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.6 0.118 184.704); + --sidebar-primary-foreground: oklch(0.984 0.014 180.72); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); } @theme inline { @@ -356,6 +356,26 @@ pre[class*='language-'] { --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); + --color-note: var(--md-sys-color-note); + --color-on-note: var(--md-sys-color-on-note); + --color-note-container: var(--md-sys-color-note-container); + --color-on-note-container: var(--md-sys-color-on-note-container); + --color-tip: var(--md-sys-color-tip); + --color-on-tip: var(--md-sys-color-on-tip); + --color-tip-container: var(--md-sys-color-tip-container); + --color-on-tip-container: var(--md-sys-color-on-tip-container); + --color-important: var(--md-sys-color-important); + --color-on-important: var(--md-sys-color-on-important); + --color-important-container: var(--md-sys-color-important-container); + --color-on-important-container: var(--md-sys-color-on-important-container); + --color-warning: var(--md-sys-color-warning); + --color-on-warning: var(--md-sys-color-on-warning); + --color-warning-container: var(--md-sys-color-warning-container); + --color-on-warning-container: var(--md-sys-color-on-warning-container); + --color-caution: var(--md-sys-color-caution); + --color-on-caution: var(--md-sys-color-on-caution); + --color-caution-container: var(--md-sys-color-caution-container); + --color-on-caution-container: var(--md-sys-color-on-caution-container); } .dark { @@ -365,9 +385,9 @@ pre[class*='language-'] { --card-foreground: oklch(0.985 0 0); --popover: oklch(0.205 0 0); --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); + --primary: oklch(0.437 0.078 188.216); + --primary-foreground: oklch(0.984 0.014 180.72); + --secondary: oklch(0.274 0.006 286.033); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); --muted-foreground: oklch(0.708 0 0); @@ -377,19 +397,19 @@ pre[class*='language-'] { --border: oklch(1 0 0 / 10%); --input: oklch(1 0 0 / 15%); --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: hsl(240 5.9% 10%); - --sidebar-foreground: hsl(240 4.8% 95.9%); - --sidebar-primary: hsl(224.3 76.3% 48%); - --sidebar-primary-foreground: hsl(0 0% 100%); - --sidebar-accent: hsl(240 3.7% 15.9%); - --sidebar-accent-foreground: hsl(240 4.8% 95.9%); - --sidebar-border: hsl(240 3.7% 15.9%); - --sidebar-ring: hsl(217.2 91.2% 59.8%); + --chart-1: oklch(0.855 0.138 181.071); + --chart-2: oklch(0.704 0.14 182.503); + --chart-3: oklch(0.6 0.118 184.704); + --chart-4: oklch(0.511 0.096 186.391); + --chart-5: oklch(0.437 0.078 188.216); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.704 0.14 182.503); + --sidebar-primary-foreground: oklch(0.277 0.046 192.524); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); } @layer base { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 7f18a7fa4..b43cd0032 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,10 +1,11 @@ import cn from '@/lib/cn' +import { pmndrsMtb } from '@/lib/md3' import { svg } from '@/utils/icon' import resolveMdxUrl from '@/utils/resolveMdxUrl' +import { Mtb } from 'material-theme-builder/react' import type { Metadata } from 'next' import { ThemeProvider } from 'next-themes' import localFont from 'next/font/local' -import { Mtb } from 'material-theme-builder/react' import './globals.css' import { SandpackCSS } from './sandpack-styles' @@ -102,21 +103,6 @@ export default function RootLayout({ }: Readonly<{ children: React.ReactNode }>) { - const primary = process.env.THEME_PRIMARY || '#323e48' - const note = process.env.THEME_NOTE || '#1f6feb' - const tip = process.env.THEME_TIP || '#238636' - const important = process.env.THEME_IMPORTANT || '#8957e5' - const warning = process.env.THEME_WARNING || '#d29922' - const caution = process.env.THEME_CAUTION || '#da3633' - const scheme = (process.env.THEME_SCHEME || 'tonalSpot') as - | 'content' - | 'expressive' - | 'fidelity' - | 'monochrome' - | 'neutral' - | 'tonalSpot' - | 'vibrant' - const contrast = Number(process.env.THEME_CONTRAST) || 0 const basePath = process.env.BASE_PATH || '' return ( @@ -131,18 +117,7 @@ export default function RootLayout({ - + {children} diff --git a/src/lib/md3.ts b/src/lib/md3.ts new file mode 100644 index 000000000..33200681e --- /dev/null +++ b/src/lib/md3.ts @@ -0,0 +1,38 @@ +import type { MtbConfig } from 'material-theme-builder' + +/** + * The pmndrs Material Design 3 seed. + * + * This is Tier 1: the colours every pmndrs site derives from. The shadcn preset + * carries radius and typography, not colour — moving `source` here is what + * actually moves the rendered palette. + * + * Every value is overridable per deployment through a `THEME_*` env var, so a + * site can reseed without forking the file. + * + * Read from a React Server Component (a Next.js root layout, typically): the + * non-`NEXT_PUBLIC_` vars below are only substituted on the server. + */ +export const pmndrsMtb = { + /** poimandres mint. */ + source: process.env.THEME_PRIMARY || '#5de4c7', + scheme: (process.env.THEME_SCHEME || 'tonalSpot') as MtbConfig['scheme'], + contrast: Number(process.env.THEME_CONTRAST) || 0, + + /** + * GitHub's alert palette, harmonized against the seed (`blend: true`). + * + * Each one emits `--md-sys-color-`, `-on-`, `--container` + * and `-on--container`. The Tailwind `@theme` mapping for those four + * ships in this item's `css` — the package's `tailwind.css` covers standard + * M3 roles only, so custom colours have to be mapped by hand. Add a colour + * here and you must add its four lines there too. + */ + customColors: [ + { name: 'note', hex: process.env.THEME_NOTE || '#1f6feb', blend: true }, + { name: 'tip', hex: process.env.THEME_TIP || '#238636', blend: true }, + { name: 'important', hex: process.env.THEME_IMPORTANT || '#8957e5', blend: true }, + { name: 'warning', hex: process.env.THEME_WARNING || '#d29922', blend: true }, + { name: 'caution', hex: process.env.THEME_CAUTION || '#da3633', blend: true }, + ], +} satisfies MtbConfig From 150f8e667dfc2f5b7aed060b1deff6bf92dbc183 Mon Sep 17 00:00:00 2001 From: Antoine BERNIER Date: Sun, 16 Aug 2026 12:35:45 +0200 Subject: [PATCH 2/7] refactor: keep the alert colours here, take only the seed from Tier 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follows pmndrs/design-system#3. note, tip, important, warning and caution are GitHub's palette, and this generator is the only thing rendering markdown alerts — they were never the design system's to carry. Tier 1 now ships the seed alone, at v0.2.0. src/lib/mtb.ts spreads pmndrsMtb and adds the five, so src/lib/md3.ts stays a verbatim copy of the installed item and updating it remains a clean overwrite. blend: true still harmonizes them against the seed, and THEME_NOTE and its four siblings still override them. Their twenty @theme lines move out of the shadcn-managed block into one of our own, commented, next to nothing else — the config and the mapping have to be read together, since a name declared in one and missing from the other makes Tailwind emit no rule at all, without an error. Refs pmndrs/design-system#1 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01EDvnsrory1aJsoNALn5aLB --- .changeset/md3-tier1.md | 4 +++- src/app/globals.css | 51 +++++++++++++++++++++++++---------------- src/app/layout.tsx | 4 ++-- src/lib/md3.ts | 35 ++++++++++++++-------------- src/lib/mtb.ts | 37 ++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 40 deletions(-) create mode 100644 src/lib/mtb.ts diff --git a/.changeset/md3-tier1.md b/.changeset/md3-tier1.md index b5ff48b42..1c5c8798d 100644 --- a/.changeset/md3-tier1.md +++ b/.changeset/md3-tier1.md @@ -4,4 +4,6 @@ Take the Material Design 3 colour layer from `pmndrs/design-system` instead of maintaining it here. The hand-written `@theme` mapping and the shadcn remap — around 105 lines that had to be kept in step with the colour package by hand — are replaced by one registry item, `pmndrs/design-system/md3`, which brings its own Tailwind mapping and the config it maps. `react-mcu` gives way to `material-theme-builder`, so the CSS variables are now `--md-sys-color-*`; every `bg-surface` / `text-on-surface-variant` utility keeps working untouched, because the `--color-*` names on top of them are identical. -The seed moves to poimandres mint (`#5de4c7`) — this is the visible change — and it now lives in exactly one place, `src/lib/md3.ts`, rather than being restated in the layout and in two workflows. `THEME_PRIMARY`, `THEME_SCHEME`, `THEME_CONTRAST` and the five alert colours still override it per deployment; a site that wants its own seed sets the workflow input, and one that doesn't inherits the pmndrs default. +The seed moves to poimandres mint (`#5de4c7`) — this is the visible change — and it now lives in exactly one place, the installed `src/lib/md3.ts`, rather than being restated in the layout and in two workflows. `THEME_PRIMARY`, `THEME_SCHEME` and `THEME_CONTRAST` still override it per deployment; a site that wants its own seed sets the workflow input, and one that doesn't inherits the pmndrs default. + +The five alert colours stay here, in `src/lib/mtb.ts`, which spreads the pmndrs seed and adds them. They are GitHub's palette and only this generator renders markdown alerts, so they are not the design system's to carry — but they are still harmonized against the seed, and `THEME_NOTE`, `THEME_TIP`, `THEME_IMPORTANT`, `THEME_WARNING` and `THEME_CAUTION` still work. diff --git a/src/app/globals.css b/src/app/globals.css index 102c1fda8..840954125 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -19,6 +19,37 @@ --animate-collapsible-up: collapsible-up var(--collapsible-up-duration, 0s) ease-out; } +/* + * Alert colours — GitHub's palette, harmonized against the pmndrs seed. + * + * One entry here per `customColors` name in src/lib/mtb.ts, four lines each. + * material-theme-builder maps the standard M3 roles only, so these are ours to + * keep in step: drop one and Tailwind emits no rule for `bg-note-container` at + * all — no error, no warning, the element just renders unstyled. + */ +@theme inline { + --color-note: var(--md-sys-color-note); + --color-on-note: var(--md-sys-color-on-note); + --color-note-container: var(--md-sys-color-note-container); + --color-on-note-container: var(--md-sys-color-on-note-container); + --color-tip: var(--md-sys-color-tip); + --color-on-tip: var(--md-sys-color-on-tip); + --color-tip-container: var(--md-sys-color-tip-container); + --color-on-tip-container: var(--md-sys-color-on-tip-container); + --color-important: var(--md-sys-color-important); + --color-on-important: var(--md-sys-color-on-important); + --color-important-container: var(--md-sys-color-important-container); + --color-on-important-container: var(--md-sys-color-on-important-container); + --color-warning: var(--md-sys-color-warning); + --color-on-warning: var(--md-sys-color-on-warning); + --color-warning-container: var(--md-sys-color-warning-container); + --color-on-warning-container: var(--md-sys-color-on-warning-container); + --color-caution: var(--md-sys-color-caution); + --color-on-caution: var(--md-sys-color-on-caution); + --color-caution-container: var(--md-sys-color-caution-container); + --color-on-caution-container: var(--md-sys-color-on-caution-container); +} + @keyframes collapsible-down { from { height: 0; @@ -356,26 +387,6 @@ pre[class*='language-'] { --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); - --color-note: var(--md-sys-color-note); - --color-on-note: var(--md-sys-color-on-note); - --color-note-container: var(--md-sys-color-note-container); - --color-on-note-container: var(--md-sys-color-on-note-container); - --color-tip: var(--md-sys-color-tip); - --color-on-tip: var(--md-sys-color-on-tip); - --color-tip-container: var(--md-sys-color-tip-container); - --color-on-tip-container: var(--md-sys-color-on-tip-container); - --color-important: var(--md-sys-color-important); - --color-on-important: var(--md-sys-color-on-important); - --color-important-container: var(--md-sys-color-important-container); - --color-on-important-container: var(--md-sys-color-on-important-container); - --color-warning: var(--md-sys-color-warning); - --color-on-warning: var(--md-sys-color-on-warning); - --color-warning-container: var(--md-sys-color-warning-container); - --color-on-warning-container: var(--md-sys-color-on-warning-container); - --color-caution: var(--md-sys-color-caution); - --color-on-caution: var(--md-sys-color-on-caution); - --color-caution-container: var(--md-sys-color-caution-container); - --color-on-caution-container: var(--md-sys-color-on-caution-container); } .dark { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b43cd0032..fd67e2937 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ import cn from '@/lib/cn' -import { pmndrsMtb } from '@/lib/md3' +import { docsMtb } from '@/lib/mtb' import { svg } from '@/utils/icon' import resolveMdxUrl from '@/utils/resolveMdxUrl' import { Mtb } from 'material-theme-builder/react' @@ -117,7 +117,7 @@ export default function RootLayout({ - + {children} diff --git a/src/lib/md3.ts b/src/lib/md3.ts index 33200681e..c56b7639e 100644 --- a/src/lib/md3.ts +++ b/src/lib/md3.ts @@ -12,27 +12,28 @@ import type { MtbConfig } from 'material-theme-builder' * * Read from a React Server Component (a Next.js root layout, typically): the * non-`NEXT_PUBLIC_` vars below are only substituted on the server. + * + * Need colours M3 has no role for — alert levels, a status palette? Extend this + * rather than editing it, so the next update of this item stays a clean + * overwrite: + * + * ```ts + * export const myMtb = { + * ...pmndrsMtb, + * customColors: [{ name: 'note', hex: '#1f6feb', blend: true }], + * } satisfies MtbConfig + * ``` + * + * `blend: true` harmonizes them against the seed above, so they stay yours and + * still belong to the pmndrs palette. One catch, and it fails silently: the + * package's Tailwind mapping covers standard M3 roles only. Every custom colour + * needs four `@theme` lines of your own — `--color-note`, `--color-on-note`, + * `--color-note-container`, `--color-on-note-container` — or Tailwind emits no + * rule at all for `bg-note-container`, with no error. */ export const pmndrsMtb = { /** poimandres mint. */ source: process.env.THEME_PRIMARY || '#5de4c7', scheme: (process.env.THEME_SCHEME || 'tonalSpot') as MtbConfig['scheme'], contrast: Number(process.env.THEME_CONTRAST) || 0, - - /** - * GitHub's alert palette, harmonized against the seed (`blend: true`). - * - * Each one emits `--md-sys-color-`, `-on-`, `--container` - * and `-on--container`. The Tailwind `@theme` mapping for those four - * ships in this item's `css` — the package's `tailwind.css` covers standard - * M3 roles only, so custom colours have to be mapped by hand. Add a colour - * here and you must add its four lines there too. - */ - customColors: [ - { name: 'note', hex: process.env.THEME_NOTE || '#1f6feb', blend: true }, - { name: 'tip', hex: process.env.THEME_TIP || '#238636', blend: true }, - { name: 'important', hex: process.env.THEME_IMPORTANT || '#8957e5', blend: true }, - { name: 'warning', hex: process.env.THEME_WARNING || '#d29922', blend: true }, - { name: 'caution', hex: process.env.THEME_CAUTION || '#da3633', blend: true }, - ], } satisfies MtbConfig diff --git a/src/lib/mtb.ts b/src/lib/mtb.ts new file mode 100644 index 000000000..15f18439c --- /dev/null +++ b/src/lib/mtb.ts @@ -0,0 +1,37 @@ +import { pmndrsMtb } from '@/lib/md3' +import type { MtbConfig } from 'material-theme-builder' + +/** + * GitHub's alert palette, the colours `rehype-github-alerts` renders. + * + * These are ours, not the design system's: nothing outside this generator draws + * markdown alerts, and the hexes are GitHub's rather than poimandres'. Tier 1 + * owns the seed; this owns what the seed has no M3 role for. + * + * `blend: true` harmonizes each one against that seed, so they shift with the + * theme instead of sitting on top of it. + * + * Each name here needs four `@theme` lines in globals.css — `--color-note`, + * `--color-on-note`, `--color-note-container`, `--color-on-note-container`. + * material-theme-builder maps standard M3 roles only, and a name declared here + * but unmapped there fails silently: Tailwind emits no rule for + * `bg-note-container` at all, no error, no warning. + */ +const alertColors = [ + { name: 'note', hex: process.env.THEME_NOTE || '#1f6feb', blend: true }, + { name: 'tip', hex: process.env.THEME_TIP || '#238636', blend: true }, + { name: 'important', hex: process.env.THEME_IMPORTANT || '#8957e5', blend: true }, + { name: 'warning', hex: process.env.THEME_WARNING || '#d29922', blend: true }, + { name: 'caution', hex: process.env.THEME_CAUTION || '#da3633', blend: true }, +] + +/** + * The theme this site mounts: the pmndrs seed, plus our alert colours. + * + * Spread rather than edited, so `src/lib/md3.ts` stays a verbatim copy of the + * Tier 1 item and re-installing it is a clean overwrite. + */ +export const docsMtb = { + ...pmndrsMtb, + customColors: alertColors, +} satisfies MtbConfig From 52d570036be39a2d98a144c1a6541f33afcd58f5 Mon Sep 17 00:00:00 2001 From: Antoine BERNIER Date: Sun, 16 Aug 2026 12:56:49 +0200 Subject: [PATCH 3/7] refactor: standardize on the components.json `cn` alias `src/lib/cn.ts` and `src/lib/utils.ts` were byte-equivalent implementations of the same helper, differing only in export style. `components.json` points its `utils` alias at the latter, so anything installed by `shadcn add` imports the named export while everything hand-written imported the default one. Keep the aliased file, drop the other. Prerequisite for extracting a block: a distributed component has to import through the alias the CLI rewrites. --- src/app/[...slug]/Burger.tsx | 2 +- src/app/[...slug]/layout.tsx | 2 +- src/app/[...slug]/page.tsx | 2 +- src/app/layout.tsx | 2 +- src/components/Icon.tsx | 2 +- src/components/Layout.tsx | 2 +- src/components/Nav/Nav.tsx | 2 +- src/components/Nav/NavCategory.tsx | 2 +- src/components/Nav/NavCategoryCollapsible.tsx | 2 +- src/components/Search/SearchItem.tsx | 2 +- src/components/Search/SearchModalContainer.tsx | 2 +- src/components/Search/index.tsx | 2 +- src/components/mdx/Code/Code.tsx | 2 +- src/components/mdx/Codesandbox/Codesandbox.tsx | 2 +- src/components/mdx/Details/Details.tsx | 2 +- src/components/mdx/Gha/Gha.tsx | 2 +- src/components/mdx/Grid.tsx | 2 +- src/components/mdx/Img/Img.tsx | 2 +- src/components/mdx/Intro/Intro.tsx | 2 +- src/components/mdx/Keypoints/Keypoints.tsx | 2 +- src/components/mdx/People/People.tsx | 2 +- src/components/mdx/Sandpack/Sandpack.tsx | 2 +- src/components/mdx/Summary/Summary.tsx | 2 +- src/components/mdx/Toc/Toc.tsx | 2 +- src/components/mdx/index.tsx | 2 +- src/lib/cn.ts | 13 ------------- 26 files changed, 25 insertions(+), 38 deletions(-) delete mode 100644 src/lib/cn.ts diff --git a/src/app/[...slug]/Burger.tsx b/src/app/[...slug]/Burger.tsx index 4739d3d6d..298dccff6 100644 --- a/src/app/[...slug]/Burger.tsx +++ b/src/app/[...slug]/Burger.tsx @@ -1,7 +1,7 @@ 'use client' import Icon from '@/components/Icon' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' export function Burger({ opened, className }: { opened: boolean } & ComponentProps<'span'>) { diff --git a/src/app/[...slug]/layout.tsx b/src/app/[...slug]/layout.tsx index 3c6499916..69f0690b7 100644 --- a/src/app/[...slug]/layout.tsx +++ b/src/app/[...slug]/layout.tsx @@ -4,7 +4,7 @@ import { Layout, LayoutAside, LayoutContent, LayoutHeader, LayoutNav } from '@/c import { Nav } from '@/components/Nav' import Search from '@/components/Search' import { Toc } from '@/components/mdx/Toc' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { getData } from '@/utils/docs' import Link from 'next/link' import { PiDiscordLogoLight } from 'react-icons/pi' diff --git a/src/app/[...slug]/page.tsx b/src/app/[...slug]/page.tsx index 92c29e785..6d88775d0 100644 --- a/src/app/[...slug]/page.tsx +++ b/src/app/[...slug]/page.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { getData, getDocs } from '@/utils/docs' export type Props = { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index fd67e2937..17913c63c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { docsMtb } from '@/lib/mtb' import { svg } from '@/utils/icon' import resolveMdxUrl from '@/utils/resolveMdxUrl' diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index b8bdf9a51..320f4e98c 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import * as React from 'react' type SVGProps = Partial> diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index bc2409917..73ff4da0b 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' // diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx index c855d2bec..f91696714 100644 --- a/src/components/Nav/Nav.tsx +++ b/src/components/Nav/Nav.tsx @@ -1,5 +1,5 @@ import { Doc } from '@/app/[...slug]/DocsContext' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import * as React from 'react' import { NavCategory } from './NavCategory' import { NavCategoryCollapsible } from './NavCategoryCollapsible' diff --git a/src/components/Nav/NavCategory.tsx b/src/components/Nav/NavCategory.tsx index d290e9316..40ddea8ac 100644 --- a/src/components/Nav/NavCategory.tsx +++ b/src/components/Nav/NavCategory.tsx @@ -1,5 +1,5 @@ import { Doc } from '@/app/[...slug]/DocsContext' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import Link from 'next/link' import { ComponentProps } from 'react' diff --git a/src/components/Nav/NavCategoryCollapsible.tsx b/src/components/Nav/NavCategoryCollapsible.tsx index ac5f752b5..22ed0e5f2 100644 --- a/src/components/Nav/NavCategoryCollapsible.tsx +++ b/src/components/Nav/NavCategoryCollapsible.tsx @@ -1,7 +1,7 @@ 'use client' import { Doc } from '@/app/[...slug]/DocsContext' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import * as Collapsible from '@radix-ui/react-collapsible' import { ComponentProps, useEffect, useState } from 'react' import { IoIosArrowDown } from 'react-icons/io' diff --git a/src/components/Search/SearchItem.tsx b/src/components/Search/SearchItem.tsx index 95cbe33a4..f9559c7b7 100644 --- a/src/components/Search/SearchItem.tsx +++ b/src/components/Search/SearchItem.tsx @@ -1,5 +1,5 @@ import Icon from '@/components/Icon' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { highlight } from '@/utils/text' import Link from 'next/link' import { ComponentProps } from 'react' diff --git a/src/components/Search/SearchModalContainer.tsx b/src/components/Search/SearchModalContainer.tsx index 54aac71da..14a14df41 100644 --- a/src/components/Search/SearchModalContainer.tsx +++ b/src/components/Search/SearchModalContainer.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { useDocs } from '@/app/[...slug]/DocsContext' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { escape } from '@/utils/text' import { Command } from 'cmdk' import { useRouter } from 'next/navigation' diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index e6b5ff7b8..1bfdd8fc4 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -1,7 +1,7 @@ 'use client' import Icon from '@/components/Icon' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import * as Dialog from '@radix-ui/react-dialog' import * as VisuallyHidden from '@radix-ui/react-visually-hidden' import { ComponentProps, useEffect, useState } from 'react' diff --git a/src/components/mdx/Code/Code.tsx b/src/components/mdx/Code/Code.tsx index 4dd4cfab2..abf6f7e77 100644 --- a/src/components/mdx/Code/Code.tsx +++ b/src/components/mdx/Code/Code.tsx @@ -1,6 +1,6 @@ 'use client' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps, isValidElement, ReactNode, useEffect, useState } from 'react' import { TbClipboard, TbClipboardCheck } from 'react-icons/tb' diff --git a/src/components/mdx/Codesandbox/Codesandbox.tsx b/src/components/mdx/Codesandbox/Codesandbox.tsx index 757ddec96..8c290c78e 100644 --- a/src/components/mdx/Codesandbox/Codesandbox.tsx +++ b/src/components/mdx/Codesandbox/Codesandbox.tsx @@ -1,6 +1,6 @@ import { Img } from '@/components/mdx/Img' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' export type CSB = { diff --git a/src/components/mdx/Details/Details.tsx b/src/components/mdx/Details/Details.tsx index a3706c63b..b3fd37928 100644 --- a/src/components/mdx/Details/Details.tsx +++ b/src/components/mdx/Details/Details.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { type ComponentProps } from 'react' export function Details({ className, ...props }: ComponentProps<'details'>) { diff --git a/src/components/mdx/Gha/Gha.tsx b/src/components/mdx/Gha/Gha.tsx index 79abe6d5a..c61a83060 100644 --- a/src/components/mdx/Gha/Gha.tsx +++ b/src/components/mdx/Gha/Gha.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ReactNode } from 'react' import { BiCommentError } from 'react-icons/bi' import { CgInfo } from 'react-icons/cg' diff --git a/src/components/mdx/Grid.tsx b/src/components/mdx/Grid.tsx index 04bc8fa09..b5530546a 100644 --- a/src/components/mdx/Grid.tsx +++ b/src/components/mdx/Grid.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' /** * @deprecated diff --git a/src/components/mdx/Img/Img.tsx b/src/components/mdx/Img/Img.tsx index 785fcda26..34674cf36 100644 --- a/src/components/mdx/Img/Img.tsx +++ b/src/components/mdx/Img/Img.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' import sizeOf from 'image-size' diff --git a/src/components/mdx/Intro/Intro.tsx b/src/components/mdx/Intro/Intro.tsx index 4c0dc334c..670d012c6 100644 --- a/src/components/mdx/Intro/Intro.tsx +++ b/src/components/mdx/Intro/Intro.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { VisuallyHidden } from '@radix-ui/react-visually-hidden' import { ComponentProps } from 'react' diff --git a/src/components/mdx/Keypoints/Keypoints.tsx b/src/components/mdx/Keypoints/Keypoints.tsx index 8f2516148..fb158b43d 100644 --- a/src/components/mdx/Keypoints/Keypoints.tsx +++ b/src/components/mdx/Keypoints/Keypoints.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' import { ul as Ul, li as Li } from '../index' diff --git a/src/components/mdx/People/People.tsx b/src/components/mdx/People/People.tsx index b10473a8a..93bb2013b 100644 --- a/src/components/mdx/People/People.tsx +++ b/src/components/mdx/People/People.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { initials } from '@/utils/text' import { Octokit } from '@octokit/core' import Image from 'next/image' diff --git a/src/components/mdx/Sandpack/Sandpack.tsx b/src/components/mdx/Sandpack/Sandpack.tsx index 70639c5d2..944fc168e 100644 --- a/src/components/mdx/Sandpack/Sandpack.tsx +++ b/src/components/mdx/Sandpack/Sandpack.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { crawl } from '@/utils/docs' import { SandpackCodeEditor, diff --git a/src/components/mdx/Summary/Summary.tsx b/src/components/mdx/Summary/Summary.tsx index af0b9db0d..cd6fb91e6 100644 --- a/src/components/mdx/Summary/Summary.tsx +++ b/src/components/mdx/Summary/Summary.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { type ComponentProps } from 'react' export function Summary({ className, ...props }: ComponentProps<'summary'>) { diff --git a/src/components/mdx/Toc/Toc.tsx b/src/components/mdx/Toc/Toc.tsx index 5982e0bbe..f56274da3 100644 --- a/src/components/mdx/Toc/Toc.tsx +++ b/src/components/mdx/Toc/Toc.tsx @@ -1,7 +1,7 @@ 'use client' import type { DocToC } from '@/app/[...slug]/DocsContext' -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps, useCallback, useEffect, useState } from 'react' export function Toc({ className, toc }: ComponentProps<'div'> & { toc: DocToC[] }) { diff --git a/src/components/mdx/index.tsx b/src/components/mdx/index.tsx index 527bb4950..c810f11ea 100644 --- a/src/components/mdx/index.tsx +++ b/src/components/mdx/index.tsx @@ -1,4 +1,4 @@ -import cn from '@/lib/cn' +import { cn } from '@/lib/utils' import { ComponentProps } from 'react' const MARKDOWN_REGEX = /\.mdx?/ diff --git a/src/lib/cn.ts b/src/lib/cn.ts deleted file mode 100644 index 12597e401..000000000 --- a/src/lib/cn.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { clsx, type ClassValue } from 'clsx' -import { twMerge } from 'tailwind-merge' - -// -// Properly merge tailwind classes (even conflicting ones) -// -// https://www.youtube.com/watch?v=tfgLd5ZSNPc -// https://www.youtube.com/watch?v=re2JFITR7TI -// - -export default function cn(...args: ClassValue[]) { - return twMerge(clsx(args)) -} From e4d0c1f5cb887a5b5b4ca3ece66ca1a0d47c79e4 Mon Sep 17 00:00:00 2001 From: Antoine BERNIER Date: Sun, 16 Aug 2026 13:02:19 +0200 Subject: [PATCH 4/7] feat: extract `Keypoints` into a registry block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First Tier 2 block of the pmndrs UI distribution, and the first thing to resolve a dependency across registries: `bg-surface-dim` has no shadcn equivalent, so the item declares `pmndrs/design-system/md3#v0.3.0` and the install pulls Tier 1 with it. That path is what the whole architecture rests on, and nothing else exercises it. The component moves to `registry/keypoints/`, at the root where shadcn looks for registry items, and this app imports it back through a `@/registry/*` alias — so what ships is the file the site renders, not a copy of it. Three changes were needed to make it standalone: - it pulled `ul` and `li` from this app's MDX component map. Both are trivial wrappers and no second block needs them yet, so they are inlined; the rule is to promote them to their own item at n=2. - `className` now merges after the defaults rather than before, so a consumer can override them, and `title` is optional in the type as it already was in practice. - `border-outline-variant` becomes `border-border`. The two are 1:1, and the stock token is the one a consumer who skipped Tier 1 still has. `bg-surface-dim` stays: it is the deliberate reach, and the reason for the dependency. `registry.json` is validated by `pnpm check-registry`. That validator never parses TSX, so it cannot see a missing token — an install into a scratch app outside this repo remains the only check that would. --- .changeset/keypoints-block.md | 9 + .storybook/main.ts | 6 +- package.json | 6 +- pnpm-lock.yaml | 966 ++++++++++++++++++ registry.json | 22 + .../keypoints/keypoints.stories.tsx | 4 +- .../keypoints/keypoints.tsx | 12 +- src/components/mdx/Keypoints/index.ts | 1 - src/utils/compileMdxContent.tsx | 2 +- tsconfig.json | 4 +- vitest.config.ts | 1 + 11 files changed, 1019 insertions(+), 14 deletions(-) create mode 100644 .changeset/keypoints-block.md create mode 100644 registry.json rename src/components/mdx/Keypoints/Keypoints.stories.tsx => registry/keypoints/keypoints.stories.tsx (87%) rename src/components/mdx/Keypoints/Keypoints.tsx => registry/keypoints/keypoints.tsx (54%) delete mode 100644 src/components/mdx/Keypoints/index.ts diff --git a/.changeset/keypoints-block.md b/.changeset/keypoints-block.md new file mode 100644 index 000000000..1970367ac --- /dev/null +++ b/.changeset/keypoints-block.md @@ -0,0 +1,9 @@ +--- +'@pmndrs/docs': minor +--- + +`Keypoints` is now a shadcn registry block, installable into any app with `npx shadcn@latest add pmndrs/docs/keypoints`. It is the first pmndrs block to be distributed this way, and the first to depend on the shared colour layer across registries — `pmndrs/design-system/md3`, for the one MD3 role it uses that shadcn has no equivalent for. + +Being distributable is what drove the three changes to it. It reached into this app's MDX component map for the list wrappers, so those are inlined; it imported `cn` through a path `components.json` does not alias, so the whole app is standardized on `@/lib/utils` and the duplicate `src/lib/cn.ts` is gone; and it painted its border with `border-outline-variant`, which is `border-border` by another name, so it now uses the stock token and keeps `bg-surface-dim` as the single deliberate MD3 reach. + +Nothing changes for authors: the same `` / `` in the same MDX, rendering the same. The source moved from `src/components/mdx/Keypoints/` to `registry/keypoints/`, alongside `registry.json` at the root. diff --git a/.storybook/main.ts b/.storybook/main.ts index 87cf8f18b..f82d77d6e 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,7 +1,11 @@ import type { StorybookConfig } from '@storybook/nextjs-vite' const config: StorybookConfig = { - stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)', '../src/**/*.mdx'], + stories: [ + '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)', + '../src/**/*.mdx', + '../registry/**/*.stories.@(js|jsx|mjs|ts|tsx)', + ], addons: ['@storybook/addon-docs', '@storybook/addon-themes'], framework: '@storybook/nextjs-vite', staticDirs: ['../public'], diff --git a/package.json b/package.json index e6a3521ea..f6ef0a0e6 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "prettier-plugin-tailwindcss": "^0.7.2", "rehype-parse": "^9.0.1", "rehype-stringify": "^10.0.1", + "shadcn": "^4.18.0", "storybook": "^10.2.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", @@ -89,8 +90,9 @@ "dev": "NODE_OPTIONS='--inspect' next", "start": "next start", "build": "./next-build.sh", - "format": "prettier -w src/", - "lint": "eslint src/**/*.{ts,tsx} && prettier . --check", + "format": "prettier -w src/ registry/", + "lint": "eslint src/**/*.{ts,tsx} registry/ && prettier . --check", + "check-registry": "shadcn registry validate ./registry.json", "prepare": "husky && (test -f scripts/copy-fonts.sh && sh scripts/copy-fonts.sh || true)", "release": "changeset publish", "changeset": "changeset", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1495224b..1629550cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,6 +210,9 @@ importers: rehype-stringify: specifier: ^10.0.1 version: 10.0.1 + shadcn: + specifier: ^4.18.0 + version: 4.18.0(typescript@5.9.3) storybook: specifier: ^10.2.0 version: 10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -251,6 +254,10 @@ packages: resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.6': resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} @@ -263,36 +270,98 @@ packages: resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} @@ -302,6 +371,41 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -310,14 +414,26 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.6': resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} @@ -445,6 +561,13 @@ packages: react: ^16.8.0 || ^17 || ^18 || ^19 react-dom: ^16.8.0 || ^17 || ^18 || ^19 + '@dotenvx/dotenvx@1.75.1': + resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} + hasBin: true + + '@dotenvx/primitives@0.8.0': + resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -1119,6 +1242,16 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@mswjs/interceptors@0.41.0': resolution: {integrity: sha512-edAo9bW53BLYeSK+UPRr2Iz1Fj9DeGMjytvVM0HXRoo750ElWUgPsZPAOTQa12EUiwgDErH2PsFNTLvk1jBxjQ==} engines: {node: '>=18'} @@ -1657,6 +1790,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@segment/analytics-core@1.7.0': resolution: {integrity: sha512-0DHSriS/oAB/2bIgOMv3fFV9/ivp39ibdOTTf+dDOhf+vlciBv0+MHw47k/6PRobbuls27cKkKZAKc4DDC2+gw==} @@ -1667,6 +1803,10 @@ packages: resolution: {integrity: sha512-xwMkyXgr7xgPsP0w79nzCwRHYi9jzj9ps4Im7xWGK8AKKE4eox39tMZOdRtpDbvXQlrs9fh64ZC0w/yZZDM/9g==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2017,6 +2157,9 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2232,6 +2375,9 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@typescript-eslint/eslint-plugin@8.53.1': resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2661,6 +2807,10 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + autoprefixer@10.4.23: resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} @@ -2870,6 +3020,10 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -2899,6 +3053,9 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -2941,6 +3098,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -2984,6 +3145,15 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -3205,6 +3375,10 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3225,6 +3399,14 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -3285,6 +3467,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3335,10 +3521,18 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -3407,6 +3601,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -3687,10 +3885,18 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -3701,6 +3907,12 @@ packages: peerDependencies: express: '>= 4.11' + express-rate-limit@8.6.2: + resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -3756,6 +3968,10 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -3768,6 +3984,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3813,6 +4033,10 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -3844,6 +4068,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -3872,14 +4099,26 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -4060,10 +4299,18 @@ packages: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -4137,6 +4384,10 @@ packages: resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. + ip-address@10.5.0: + resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4241,11 +4492,19 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -4265,6 +4524,14 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4280,6 +4547,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -4288,10 +4559,18 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -4308,6 +4587,14 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -4338,6 +4625,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -4399,6 +4690,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + json-schema-typed@8.0.2: resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} @@ -4438,6 +4732,14 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} @@ -4553,6 +4855,10 @@ packages: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4576,6 +4882,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -4850,6 +5160,14 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -4989,10 +5307,18 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -5008,6 +5334,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -5038,6 +5368,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -5050,6 +5384,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.1: + resolution: {integrity: sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==} + engines: {node: '>=20'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -5058,6 +5396,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -5083,6 +5425,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5122,6 +5468,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -5150,6 +5500,10 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5197,6 +5551,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -5213,6 +5571,10 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + playwright-core@1.57.0: resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} engines: {node: '>=18'} @@ -5280,6 +5642,14 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + powershell-utils@0.2.0: + resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5366,10 +5736,18 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -5701,6 +6079,11 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shadcn@4.18.0: + resolution: {integrity: sha512-tUFZgkYmfVNQVm3xX7lhSzOvDsp+O14ac5dwgXIr5mIsr79ISueb/Mu+ZtWMz0DH6v77u4eYyvbQ9TTMpSn3aw==} + engines: {node: '>=20.18.1'} + hasBin: true + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -5732,6 +6115,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -5740,6 +6126,9 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5752,6 +6141,14 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -5792,6 +6189,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -5862,6 +6263,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5878,10 +6283,18 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -5937,6 +6350,12 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + systeminformation@5.33.1: + resolution: {integrity: sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==} + engines: {node: '>=10.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -6049,6 +6468,9 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -6133,6 +6555,14 @@ packages: resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} engines: {node: '>=20.18.1'} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -6247,6 +6677,10 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6447,6 +6881,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -6491,6 +6930,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@1.0.0: + resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} + engines: {node: '>=20'} + xmlbuilder2@3.1.1: resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} engines: {node: '>=12.0'} @@ -6530,10 +6973,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-spinner@1.2.2: + resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==} + engines: {node: '>=18.19'} + yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: @@ -6571,6 +7022,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.6': {} '@babel/core@7.28.6': @@ -6601,6 +7058,18 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.28.6 @@ -6609,8 +7078,30 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.28.6 @@ -6618,6 +7109,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -6627,12 +7125,49 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} + '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 @@ -6642,6 +7177,50 @@ snapshots: dependencies: '@babel/types': 7.28.6 + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -6650,6 +7229,12 @@ snapshots: '@babel/parser': 7.28.6 '@babel/types': 7.28.6 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@babel/traverse@7.28.6': dependencies: '@babel/code-frame': 7.28.6 @@ -6662,11 +7247,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@braintree/sanitize-url@7.1.1': {} '@changesets/apply-release-plan@7.0.14': @@ -6982,6 +7584,27 @@ snapshots: react-dom: 19.2.3(react@19.2.3) react-is: 17.0.2 + '@dotenvx/dotenvx@1.75.1': + dependencies: + '@dotenvx/primitives': 0.8.0 + commander: 11.1.0 + conf: 10.2.0 + dotenv: 17.4.2 + enquirer: 2.4.1 + env-paths: 2.2.1 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.5) + ignore: 5.3.2 + object-treeify: 1.1.33 + open: 8.4.2 + picomatch: 4.0.5 + systeminformation: 5.33.1 + undici: 7.29.0 + which: 4.0.0 + yocto-spinner: 1.2.2 + + '@dotenvx/primitives@0.8.0': {} + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -7522,6 +8145,28 @@ snapshots: - hono - supports-color + '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.9(hono@4.11.7) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.6.2(express@5.2.1) + hono: 4.11.7 + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@mswjs/interceptors@0.41.0': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -7963,6 +8608,8 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@sec-ant/readable-stream@0.4.1': {} + '@segment/analytics-core@1.7.0': dependencies: '@lukeed/uuid': 2.0.1 @@ -7986,6 +8633,8 @@ snapshots: transitivePeerDependencies: - encoding + '@sindresorhus/merge-streams@4.0.0': {} + '@standard-schema/spec@1.1.0': {} '@stitches/core@1.2.8': {} @@ -8438,6 +9087,12 @@ snapshots: dependencies: '@testing-library/dom': 10.4.1 + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.1.1 + path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -8681,6 +9336,8 @@ snapshots: '@types/uuid@9.0.8': {} + '@types/validate-npm-package-name@4.0.2': {} + '@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -9166,6 +9823,8 @@ snapshots: async-function@1.0.0: {} + atomically@1.7.0: {} + autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.1 @@ -9389,6 +10048,8 @@ snapshots: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -9420,6 +10081,8 @@ snapshots: - '@types/react' - '@types/react-dom' + code-block-writer@13.0.3: {} + collapse-white-space@2.1.0: {} color-convert@2.0.1: @@ -9446,6 +10109,19 @@ snapshots: concat-map@0.0.1: {} + conf@10.2.0: + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + atomically: 1.7.0 + debounce-fn: 4.0.0 + dot-prop: 6.0.1 + env-paths: 2.2.1 + json-schema-typed: 7.0.3 + onetime: 5.1.2 + pkg-up: 3.1.0 + semver: 7.7.3 + confbox@0.1.8: {} constants-browserify@1.0.0: {} @@ -9483,6 +10159,15 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cosmiconfig@9.0.2(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + crelt@1.0.6: {} cross-spawn@7.0.6: @@ -9741,6 +10426,10 @@ snapshots: dayjs@1.11.19: {} + debounce-fn@4.0.0: + dependencies: + mimic-fn: 3.1.0 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -9753,6 +10442,8 @@ snapshots: dependencies: character-entities: 2.0.2 + dedent@1.7.2: {} + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -9800,6 +10491,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -9863,8 +10556,14 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + dotenv@16.6.1: {} + dotenv@17.4.2: {} + dotenv@8.6.0: {} dset@3.1.4: {} @@ -9916,6 +10615,8 @@ snapshots: entities@7.0.1: {} + env-paths@2.2.1: {} + environment@1.1.0: {} error-ex@1.3.4: @@ -10414,6 +11115,18 @@ snapshots: dependencies: eventsource-parser: 3.0.6 + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -10426,12 +11139,35 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.2.0 + expect-type@1.3.0: {} express-rate-limit@7.5.1(express@5.2.1): dependencies: express: 5.2.1 + express-rate-limit@8.6.2(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.5.0 + transitivePeerDependencies: + - supports-color + express@5.2.1: dependencies: accepts: 2.0.0 @@ -10511,9 +11247,17 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + fflate@0.8.2: optional: true + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -10533,6 +11277,10 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10588,6 +11336,12 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -10621,6 +11375,8 @@ snapshots: functions-have-names@1.2.3: {} + fuzzysort@3.1.0: {} + generator-function@2.0.1: {} generic-pool@3.9.0: {} @@ -10646,13 +11402,22 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -10917,8 +11682,12 @@ snapshots: human-id@4.1.3: {} + human-signals@2.1.0: {} + human-signals@5.0.0: {} + human-signals@8.0.1: {} + husky@9.1.7: {} iconv-lite@0.6.3: @@ -10970,6 +11739,8 @@ snapshots: intersection-observer@0.10.0: {} + ip-address@10.5.0: {} + ipaddr.js@1.9.1: {} is-alphabetical@2.0.1: {} @@ -11070,10 +11841,14 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -11087,6 +11862,10 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + + is-obj@3.0.0: {} + is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} @@ -11100,14 +11879,20 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-regexp@3.1.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -11127,6 +11912,10 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -11152,6 +11941,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.5: {} + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -11207,6 +11998,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@7.0.3: {} + json-schema-typed@8.0.2: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -11246,6 +12039,10 @@ snapshots: kind-of@6.0.3: {} + kleur@3.0.3: {} + + kleur@4.1.5: {} + langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -11354,6 +12151,11 @@ snapshots: emojis-list: 3.0.0 json5: 2.2.3 + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -11372,6 +12174,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-update@6.1.0: dependencies: ansi-escapes: 7.2.0 @@ -11924,6 +12731,10 @@ snapshots: dependencies: mime-db: 1.54.0 + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -12060,10 +12871,19 @@ snapshots: normalize-path@3.0.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -12074,6 +12894,8 @@ snapshots: object-keys@1.1.1: {} + object-treeify@1.1.33: {} + object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -12120,6 +12942,10 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -12135,6 +12961,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.1: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.2.0 + wsl-utils: 1.0.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -12150,6 +12985,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + outdent@0.5.0: {} outvariant@1.4.0: {} @@ -12174,6 +13021,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -12220,6 +13071,8 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-ms@4.0.0: {} + parse-numeric-range@1.3.0: {} parse-srcset@1.0.2: {} @@ -12248,6 +13101,8 @@ snapshots: path-data-parser@0.1.0: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -12277,6 +13132,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.5: {} + pidtree@0.6.0: {} pify@4.0.1: {} @@ -12289,6 +13146,10 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + playwright-core@1.57.0: {} playwright@1.57.0: @@ -12355,6 +13216,10 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + + powershell-utils@0.2.0: {} + prelude-ls@1.2.1: {} prettier-plugin-organize-imports@4.3.0(prettier@3.8.0)(typescript@5.9.3): @@ -12383,8 +13248,17 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process@0.11.10: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -12873,6 +13747,47 @@ snapshots: setprototypeof@1.2.0: {} + shadcn@4.18.0(typescript@5.9.3): + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.28.6) + '@babel/preset-typescript': 7.29.7(@babel/core@7.28.6) + '@dotenvx/dotenvx': 1.75.1 + '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 + browserslist: 4.28.1 + commander: 14.0.3 + cosmiconfig: 9.0.2(typescript@5.9.3) + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.4 + execa: 9.6.1 + fast-glob: 3.3.3 + fs-extra: 11.4.0 + fuzzysort: 3.1.0 + kleur: 4.1.5 + open: 11.0.1 + ora: 8.2.0 + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + prompts: 2.4.2 + recast: 0.23.11 + socks: 2.8.9 + stringify-object: 5.0.0 + tailwind-merge: 3.4.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + undici: 7.29.0 + validate-npm-package-name: 7.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - babel-plugin-macros + - supports-color + - typescript + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -12941,6 +13856,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sirv@3.0.2: @@ -12950,6 +13867,8 @@ snapshots: totalist: 3.0.1 optional: true + sisteransi@1.0.5: {} + slash@3.0.0: {} slice-ansi@5.0.0: @@ -12962,6 +13881,13 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + smart-buffer@4.2.0: {} + + socks@2.8.9: + dependencies: + ip-address: 10.5.0 + smart-buffer: 4.2.0 + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -12997,6 +13923,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -13114,6 +14042,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13126,8 +14060,12 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -13169,6 +14107,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + systeminformation@5.33.1: {} + tagged-tag@1.0.0: {} tailwind-merge@3.4.0: {} @@ -13249,6 +14189,11 @@ snapshots: ts-dedent@2.2.0: {} + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -13347,6 +14292,10 @@ snapshots: undici@7.19.2: {} + undici@7.29.0: {} + + unicorn-magic@0.3.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -13498,6 +14447,8 @@ snapshots: uuid@9.0.1: {} + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} vfile-location@5.0.3: @@ -13736,6 +14687,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.5 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -13775,6 +14730,11 @@ snapshots: dependencies: is-wsl: 3.1.0 + wsl-utils@1.0.0: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + xmlbuilder2@3.1.1: dependencies: '@oozcitak/dom': 1.15.10 @@ -13812,8 +14772,14 @@ snapshots: yocto-queue@0.1.0: {} + yocto-spinner@1.2.2: + dependencies: + yoctocolors: 2.2.0 + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.2.0: {} + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/registry.json b/registry.json new file mode 100644 index 000000000..8557e0683 --- /dev/null +++ b/registry.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "pmndrs-docs", + "homepage": "https://github.com/pmndrs/docs", + "items": [ + { + "name": "keypoints", + "type": "registry:block", + "title": "Keypoints", + "description": "A titled panel listing the main points an article covers — one bullet per `KeypointsItem`. Usually sits right after the intro.", + "author": "pmndrs", + "registryDependencies": ["pmndrs/design-system/md3#v0.3.0"], + "files": [ + { + "path": "registry/keypoints/keypoints.tsx", + "type": "registry:block" + } + ], + "docs": "Renders on stock shadcn tokens apart from `bg-surface-dim`, which is why it depends on `pmndrs/design-system/md3` — MD3 has a surface role shadcn has no equivalent for. Installing it without that dependency resolved leaves the panel with no background at all, and Tailwind reports nothing." + } + ] +} diff --git a/src/components/mdx/Keypoints/Keypoints.stories.tsx b/registry/keypoints/keypoints.stories.tsx similarity index 87% rename from src/components/mdx/Keypoints/Keypoints.stories.tsx rename to registry/keypoints/keypoints.stories.tsx index 483488d8b..cd3409542 100644 --- a/src/components/mdx/Keypoints/Keypoints.stories.tsx +++ b/registry/keypoints/keypoints.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/nextjs-vite' -import { Keypoints, KeypointsItem } from './Keypoints' -import { allModes } from '../../../../.storybook/modes' +import { allModes } from '../../.storybook/modes' +import { Keypoints, KeypointsItem } from './keypoints' const meta = { component: Keypoints, diff --git a/src/components/mdx/Keypoints/Keypoints.tsx b/registry/keypoints/keypoints.tsx similarity index 54% rename from src/components/mdx/Keypoints/Keypoints.tsx rename to registry/keypoints/keypoints.tsx index fb158b43d..a2b0ccb08 100644 --- a/src/components/mdx/Keypoints/Keypoints.tsx +++ b/registry/keypoints/keypoints.tsx @@ -1,26 +1,26 @@ import { cn } from '@/lib/utils' import { ComponentProps } from 'react' -import { ul as Ul, li as Li } from '../index' - export function Keypoints({ title = 'Keypoints', children, className, ...props -}: { title: string } & ComponentProps<'section'>) { +}: { title?: string } & ComponentProps<'section'>) { return (

{title}

-
    {children}
+
+
    {children}
+
) } export function KeypointsItem(props: ComponentProps<'li'>) { - return
  • + return
  • } diff --git a/src/components/mdx/Keypoints/index.ts b/src/components/mdx/Keypoints/index.ts deleted file mode 100644 index 2d7c64c57..000000000 --- a/src/components/mdx/Keypoints/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Keypoints' diff --git a/src/utils/compileMdxContent.tsx b/src/utils/compileMdxContent.tsx index 4ff5c3ac5..857604061 100644 --- a/src/utils/compileMdxContent.tsx +++ b/src/utils/compileMdxContent.tsx @@ -33,7 +33,7 @@ import { Img } from '@/components/mdx/Img' import { rehypeImg } from '@/components/mdx/Img/rehypeImg' import { Intro } from '@/components/mdx/Intro' import { rehypeLink } from '@/components/mdx/Link/rehypeLink' -import { Keypoints, KeypointsItem } from '@/components/mdx/Keypoints' +import { Keypoints, KeypointsItem } from '@/registry/keypoints/keypoints' import { Mermaid } from '@/components/mdx/Mermaid' import { rehypeMermaid } from '@/components/mdx/Mermaid/rehypeMermaid' import { Backers, Contributors } from '@/components/mdx/People' diff --git a/tsconfig.json b/tsconfig.json index e77249a62..44122c25b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,9 @@ ], "paths": { "@/*": ["./*"], - "@/package.json": ["../package.json"] + "@/package.json": ["../package.json"], + // Registry items sit at the repo root, outside `src`, where `shadcn` looks for them. + "@/registry/*": ["../registry/*"] } }, "include": [ diff --git a/vitest.config.ts b/vitest.config.ts index a09b15352..9d0757422 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ // Mirrors the tsconfig `paths`. Must come before the `@` prefix alias, which // would otherwise resolve this to src/package.json and fail to import ./route. '@/package.json': path.resolve(__dirname, './package.json'), + '@/registry': path.resolve(__dirname, './registry'), '@': path.resolve(__dirname, './src'), }, }, From 057c11bbe70b351659b4d38a46609250d1821d18 Mon Sep 17 00:00:00 2001 From: Antoine BERNIER Date: Sun, 16 Aug 2026 13:43:37 +0200 Subject: [PATCH 5/7] refactor: compute the palette on the server, take the shared layer without its bake MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `` carries `'use client'`, so this site shipped material-theme-builder's palette code to every visitor and recomputed identical values on each load. The package's root export holds `builder` alone and carries no directive, so the root layout calls it and emits `toCss()` itself. Nothing about the rendered result changes; the computation moves off the client. That costs ~2 kB brotli of repeated `