diff --git a/.changeset/add-ascii-plugin.md b/.changeset/add-ascii-plugin.md new file mode 100644 index 00000000..2bf516da --- /dev/null +++ b/.changeset/add-ascii-plugin.md @@ -0,0 +1,5 @@ +--- +"@streamdown/ascii": minor +--- + +Add `@streamdown/ascii`, a new plugin package that renders agent-generated ASCII and Unicode box-drawing diagrams (`┌─┐`, `│ │`, `└─┘`, `──►`) as stable preformatted blocks. It binds to ```ascii, ```diagram, and ```chart code fences by default, disables font ligatures so sequences like `-->` don't collapse into a stylized arrow glyph, uses an advance-consistent monospace font stack, and renders each block as a single unbroken text node with no per-line span wrappers so streaming appends never reflow existing rows. Plugs into the existing `plugins.renderers` extension point (`import { ascii } from "@streamdown/ascii"`) with no core changes required. diff --git a/apps/website/content/docs/plugins/ascii.mdx b/apps/website/content/docs/plugins/ascii.mdx new file mode 100644 index 00000000..87d3d58f --- /dev/null +++ b/apps/website/content/docs/plugins/ascii.mdx @@ -0,0 +1,123 @@ +--- +title: "@streamdown/ascii" +description: Render ASCII and Unicode box-drawing diagrams without breaking alignment. +type: reference +summary: Preformatted rendering for agent-generated ASCII/box-drawing diagrams and flowcharts. +prerequisites: + - /docs/plugins +related: + - /docs/plugins/mermaid + - /docs/custom-renderers +--- + +The `@streamdown/ascii` plugin renders ASCII and Unicode box-drawing diagrams (`┌─┐`, `│ │`, `└─┘`, `──►`) as stable preformatted blocks, so they don't break in the browser the way they do with typical web typography. + +- Binds to ```ascii, ```diagram, and ```chart code fences by default +- Disables font ligatures so sequences like `-->` are never collapsed into a stylized arrow glyph +- Renders a single, unbroken text node with no per-line span wrappers or syntax highlighting, so streaming appends never reflow existing rows +- Uses an advance-consistent monospace font stack so box-drawing characters line up with plain ASCII + +## The problem + +LLMs and coding agents default to ASCII and Unicode box-drawing characters for architecture diagrams and flowcharts instead of Mermaid. Rendered as regular Markdown code, these break in a few common ways: + +- **Font ligatures** collapse ASCII sequences — `-->` renders as a single stylized arrow glyph, destroying column alignment +- **Line-by-line span wrappers** (common in syntax highlighters) disrupt vertical alignment between rows +- **Standard web monospace fonts** don't guarantee uniform advance widths for box-drawing characters (`─│┌┐└┘`) versus plain ASCII + +`@streamdown/ascii` renders these fences as plain `
` blocks with ligatures disabled and an advance-consistent font stack, so the diagram looks the same as it did when the model generated it.
+
+## Install
+
+```package-install
+npm install @streamdown/ascii
+```
+
+## Usage
+
+```tsx title="chat.tsx" lineNumbers
+import { Streamdown } from "streamdown";
+import { ascii } from "@streamdown/ascii";
+
+
+  {markdown}
+
+```
+
+For advanced configuration, use `createAsciiPlugin`:
+
+```tsx title="app/page.tsx"
+import { Streamdown } from "streamdown";
+import { createAsciiPlugin } from "@streamdown/ascii";
+
+const ascii = createAsciiPlugin({
+  languages: ["ascii", "diagram", "chart", "box"],
+  className: "my-ascii-block",
+  fontFamily: "Menlo, Consolas, monospace",
+});
+
+export default function Page() {
+  return (
+    
+      {markdown}
+    
+  );
+}
+```
+
+Your AI can then output diagrams using any of the bound fences:
+
+````markdown
+```ascii
+┌─────────┐     ┌─────────┐
+│  Client │────►│  Server │
+└─────────┘     └─────────┘
+```
+````
+
+## Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `languages` | `string[]` | `["ascii", "diagram", "chart"]` | Code fence languages bound to the renderer |
+| `className` | `string` | — | Extra class names applied to the rendered `
` element |
+| `fontFamily` | `string` | `ui-monospace, "SF Mono", "Cascadia Mono", "DejaVu Sans Mono", "Liberation Mono", Menlo, Consolas, monospace` | Override the monospace font stack |
+
+## Streaming safety
+
+Diagrams stream in one character at a time along with the rest of the response. `@streamdown/ascii` keeps this stable in two ways:
+
+- The rendered `
` always contains exactly one text child (`{code}`) — no per-line `` wrappers, no syntax highlighting — so appending characters never causes existing rows to reflow.
+- The component's tree shape does not change between an incomplete and a complete fence. Incompleteness is only ever surfaced through a stable `data-incomplete` attribute, never by adding, removing, or swapping elements, so React never remounts the block mid-stream.
+
+## Styling
+
+The rendered `
` sets:
+
+- `font-variant-ligatures: none` and `font-feature-settings: "liga" 0, "calt" 0` — prevents ASCII arrow sequences (`-->`, `<--`) from being collapsed into ligature glyphs
+- `white-space: pre` — preserves whitespace exactly as generated, without wrapping (wrapping destroys ASCII art column alignment)
+- `overflow-x: auto` — wide diagrams scroll horizontally instead of wrapping
+- `tab-size: 2` — consistent tab rendering
+
+## Plugin interface
+
+The ASCII plugin implements Streamdown's `CustomRenderer` shape, so it plugs into the existing `plugins.renderers` extension point with no core changes required:
+
+```tsx
+interface AsciiPlugin {
+  component: React.ComponentType;
+  language: string[];
+}
+
+interface AsciiRendererProps {
+  code: string;
+  isIncomplete: boolean;
+  language: string;
+  meta?: string;
+}
+```
+
+## Related features
+
+- [Custom renderers](/docs/custom-renderers) - The general-purpose extension point this plugin uses
+- [Mermaid](/docs/plugins/mermaid) - Interactive diagram rendering for Mermaid syntax
diff --git a/apps/website/content/docs/plugins/meta.json b/apps/website/content/docs/plugins/meta.json
index 1561e34b..a485ca6e 100644
--- a/apps/website/content/docs/plugins/meta.json
+++ b/apps/website/content/docs/plugins/meta.json
@@ -1,4 +1,4 @@
 {
   "title": "Plugins",
-  "pages": ["index", "code", "mermaid", "math", "cjk"]
+  "pages": ["index", "code", "mermaid", "math", "cjk", "ascii"]
 }
diff --git a/packages/streamdown-ascii/__tests__/index.test.tsx b/packages/streamdown-ascii/__tests__/index.test.tsx
new file mode 100644
index 00000000..bddc9d42
--- /dev/null
+++ b/packages/streamdown-ascii/__tests__/index.test.tsx
@@ -0,0 +1,120 @@
+import { render } from "@testing-library/react";
+import { describe, expect, it } from "vitest";
+import { ascii, createAsciiPlugin } from "../index";
+
+describe("ascii", () => {
+  describe("plugin properties", () => {
+    it("binds the default languages", () => {
+      expect(ascii.language).toEqual(["ascii", "diagram", "chart"]);
+    });
+
+    it("exposes a component", () => {
+      expect(typeof ascii.component).toBe("function");
+    });
+  });
+});
+
+describe("createAsciiPlugin", () => {
+  it("creates a plugin with default options", () => {
+    const plugin = createAsciiPlugin();
+    expect(plugin.language).toEqual(["ascii", "diagram", "chart"]);
+    expect(typeof plugin.component).toBe("function");
+  });
+
+  it("binds custom languages", () => {
+    const plugin = createAsciiPlugin({ languages: ["box-drawing"] });
+    expect(plugin.language).toEqual(["box-drawing"]);
+  });
+
+  it("creates independent plugin instances", () => {
+    const plugin1 = createAsciiPlugin({ languages: ["ascii"] });
+    const plugin2 = createAsciiPlugin({ languages: ["diagram"] });
+
+    expect(plugin1.language).toEqual(["ascii"]);
+    expect(plugin2.language).toEqual(["diagram"]);
+  });
+
+  describe("rendered output", () => {
+    const code = "┌─────┐\n│ box │\n└─────┘";
+
+    it("renders a single 
 element containing exactly one text child", () => {
+      const plugin = createAsciiPlugin();
+      const Component = plugin.component;
+      const { container } = render(
+        
+      );
+
+      const pre = container.querySelector("pre");
+      expect(pre).toBeTruthy();
+      expect(pre?.childNodes.length).toBe(1);
+      expect(pre?.childNodes[0]?.nodeType).toBe(Node.TEXT_NODE);
+      expect(pre?.textContent).toBe(code);
+    });
+
+    it("applies ligature/white-space/overflow-safe styling", () => {
+      const plugin = createAsciiPlugin();
+      const Component = plugin.component;
+      const { container } = render(
+        
+      );
+
+      const pre = container.querySelector("pre");
+      expect(pre?.style.whiteSpace).toBe("pre");
+      expect(pre?.style.overflowX).toBe("auto");
+      expect(pre?.style.fontVariantLigatures).toBe("none");
+      expect(pre?.style.fontFeatureSettings).toBe('"liga" 0, "calt" 0');
+      expect(pre?.style.fontFamily).toContain("ui-monospace");
+    });
+
+    it("keeps the tree shape stable across isIncomplete true -> false", () => {
+      const plugin = createAsciiPlugin();
+      const Component = plugin.component;
+      const { container, rerender } = render(
+        
+      );
+
+      const preBefore = container.querySelector("pre");
+      expect(preBefore?.getAttribute("data-incomplete")).toBe("true");
+      expect(preBefore?.childNodes.length).toBe(1);
+
+      rerender();
+
+      const preAfter = container.querySelector("pre");
+      expect(preAfter).toBe(preBefore);
+      expect(preAfter?.getAttribute("data-incomplete")).toBe("false");
+      expect(preAfter?.childNodes.length).toBe(1);
+    });
+
+    it("does not throw when isIncomplete is true with partial content", () => {
+      const plugin = createAsciiPlugin();
+      const Component = plugin.component;
+      expect(() =>
+        render(
+          
+        )
+      ).not.toThrow();
+    });
+
+    it("applies a custom className", () => {
+      const plugin = createAsciiPlugin({ className: "my-ascii-block" });
+      const Component = plugin.component;
+      const { container } = render(
+        
+      );
+
+      const pre = container.querySelector("pre");
+      expect(pre?.className).toBe("my-ascii-block");
+    });
+
+    it("applies a custom fontFamily", () => {
+      const plugin = createAsciiPlugin({ fontFamily: "Menlo, monospace" });
+      const Component = plugin.component;
+      const { container } = render(
+        
+      );
+
+      const pre = container.querySelector("pre");
+      expect(pre?.style.fontFamily).toBe("Menlo, monospace");
+    });
+  });
+});
diff --git a/packages/streamdown-ascii/index.tsx b/packages/streamdown-ascii/index.tsx
new file mode 100644
index 00000000..c7ac3ac1
--- /dev/null
+++ b/packages/streamdown-ascii/index.tsx
@@ -0,0 +1,133 @@
+"use client";
+
+import type { ComponentType, CSSProperties } from "react";
+
+/**
+ * Monospace stack chosen for uniform, box-drawing-safe character advances.
+ * Standard web monospace fonts (e.g. the system default) frequently give
+ * `┌─┐│└┘` characters a different advance width than plain ASCII, which
+ * breaks column alignment in agent-generated diagrams.
+ */
+const DEFAULT_FONT_FAMILY =
+  'ui-monospace, "SF Mono", "Cascadia Mono", "DejaVu Sans Mono", "Liberation Mono", Menlo, Consolas, monospace';
+
+/**
+ * Code fence languages bound to the ASCII renderer by default.
+ */
+const DEFAULT_LANGUAGES = ["ascii", "diagram", "chart"];
+
+/**
+ * Props passed to the ASCII renderer component.
+ */
+export interface AsciiRendererProps {
+  /**
+   * The raw text content inside the code fence
+   */
+  code: string;
+  /**
+   * `true` while the code fence is still being streamed
+   */
+  isIncomplete: boolean;
+  /**
+   * The language identifier from the code fence
+   */
+  language: string;
+  /**
+   * Raw metastring from the code fence, if present
+   */
+  meta?: string;
+}
+
+/**
+ * Options for creating an ASCII plugin
+ */
+export interface AsciiPluginOptions {
+  /**
+   * Extra class names applied to the rendered `
` element
+   */
+  className?: string;
+  /**
+   * Override the monospace font stack used for the rendered block
+   * @default 'ui-monospace, "SF Mono", "Cascadia Mono", "DejaVu Sans Mono", "Liberation Mono", Menlo, Consolas, monospace'
+   */
+  fontFamily?: string;
+  /**
+   * Code fence languages bound to this renderer
+   * @default ["ascii", "diagram", "chart"]
+   */
+  languages?: string[];
+}
+
+/**
+ * Plugin for rendering ASCII / Unicode box-drawing diagrams.
+ *
+ * Structurally compatible with Streamdown's `CustomRenderer` type, so it can
+ * be passed directly into `plugins.renderers` without a core dependency on
+ * this package.
+ */
+export interface AsciiPlugin {
+  /**
+   * The React component that renders matching code fences
+   */
+  component: ComponentType;
+  /**
+   * Code fence languages bound to this renderer
+   */
+  language: string[];
+}
+
+const createAsciiRenderer = (
+  fontFamily: string,
+  className?: string
+): ComponentType => {
+  const AsciiRenderer = ({
+    code,
+    isIncomplete,
+    language,
+  }: AsciiRendererProps) => {
+    const style: CSSProperties = {
+      fontFamily,
+      fontFeatureSettings: '"liga" 0, "calt" 0',
+      fontVariantLigatures: "none",
+      overflowX: "auto",
+      tabSize: 2,
+      whiteSpace: "pre",
+    };
+
+    return (
+      
+        {code}
+      
+ ); + }; + + AsciiRenderer.displayName = "AsciiRenderer"; + + return AsciiRenderer; +}; + +/** + * Create an ASCII plugin with optional configuration + */ +export function createAsciiPlugin( + options: AsciiPluginOptions = {} +): AsciiPlugin { + const fontFamily = options.fontFamily ?? DEFAULT_FONT_FAMILY; + const languages = options.languages ?? DEFAULT_LANGUAGES; + + return { + component: createAsciiRenderer(fontFamily, options.className), + language: languages, + }; +} + +/** + * Pre-configured ASCII plugin with default settings + */ +export const ascii = createAsciiPlugin(); diff --git a/packages/streamdown-ascii/package.json b/packages/streamdown-ascii/package.json new file mode 100644 index 00000000..c513a6cd --- /dev/null +++ b/packages/streamdown-ascii/package.json @@ -0,0 +1,45 @@ +{ + "name": "@streamdown/ascii", + "version": "1.0.0", + "description": "ASCII and Unicode box-drawing diagram rendering plugin for Streamdown", + "repository": { + "type": "git", + "url": "git+https://github.com/vercel/streamdown.git", + "directory": "packages/streamdown-ascii" + }, + "license": "Apache-2.0", + "author": "Hayden Bleasel ", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "test": "vitest run", + "test:coverage": "vitest --coverage run" + }, + "devDependencies": { + "@testing-library/react": "^16.3.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.2", + "@vitest/coverage-v8": "^4.1.10", + "jsdom": "^27.3.0", + "react-dom": "^19.2.3", + "tsup": "^8.5.1", + "typescript": "^5.9.3", + "vitest": "^4.1.10" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } +} diff --git a/packages/streamdown-ascii/tsconfig.json b/packages/streamdown-ascii/tsconfig.json new file mode 100644 index 00000000..17da37c9 --- /dev/null +++ b/packages/streamdown-ascii/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es2018", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "noEmit": true + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules", "build", "dist"] +} diff --git a/packages/streamdown-ascii/tsup.config.ts b/packages/streamdown-ascii/tsup.config.ts new file mode 100644 index 00000000..4278607c --- /dev/null +++ b/packages/streamdown-ascii/tsup.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + dts: true, + entry: ["index.tsx"], + format: ["esm"], + minify: true, + outDir: "dist", + sourcemap: false, + treeshake: true, + platform: "browser", + external: ["react", "react-dom"], +}); diff --git a/packages/streamdown-ascii/vitest.config.ts b/packages/streamdown-ascii/vitest.config.ts new file mode 100644 index 00000000..20d86d1e --- /dev/null +++ b/packages/streamdown-ascii/vitest.config.ts @@ -0,0 +1,10 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [react()], + test: { + environment: "jsdom", + globals: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96d45570..ff65954d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,7 +158,7 @@ importers: version: 1.6.1(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) '@vercel/geistdocs': specifier: 1.23.1 - version: 1.23.1(@svta/cml-cta@1.0.1(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1))(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1)(@tanstack/react-router@1.151.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(micromark-util-types@2.0.2)(micromark@4.0.2)(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.23.1(@svta/cml-cta@1.0.1(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1))(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1)(@tanstack/react-router@1.151.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@vercel/speed-insights': specifier: ^1.3.1 version: 1.3.1(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) @@ -381,6 +381,43 @@ importers: specifier: ^4.1.10 version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@25.0.9)(@vitest/coverage-v8@4.1.10)(jsdom@27.4.0)(vite@7.3.1(@types/node@25.0.9)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + packages/streamdown-ascii: + dependencies: + react: + specifier: ^18.0.0 || ^19.0.0 + version: 19.2.3 + devDependencies: + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@types/react': + specifier: ^19.2.7 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.7) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.2(vite@7.3.1(@types/node@25.0.9)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/coverage-v8': + specifier: ^4.1.10 + version: 4.1.10(vitest@4.1.10) + jsdom: + specifier: ^27.3.0 + version: 27.4.0 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + tsup: + specifier: ^8.5.1 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.26)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.1.10 + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@25.0.9)(@vitest/coverage-v8@4.1.10)(jsdom@27.4.0)(vite@7.3.1(@types/node@25.0.9)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + packages/streamdown-cjk: dependencies: react: @@ -577,10 +614,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.28.6': - 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'} @@ -619,18 +652,10 @@ packages: resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} 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'} @@ -643,11 +668,6 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.8': resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} @@ -665,10 +685,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -681,10 +697,6 @@ packages: resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} 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'} @@ -3329,277 +3341,139 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.62.5': resolution: {integrity: sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.62.5': resolution: {integrity: sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.62.5': resolution: {integrity: sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.62.5': resolution: {integrity: sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.62.5': resolution: {integrity: sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.62.5': resolution: {integrity: sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-gnueabihf@4.62.5': resolution: {integrity: sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} - cpu: [arm] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm-musleabihf@4.62.5': resolution: {integrity: sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.62.5': resolution: {integrity: sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-musl@4.62.5': resolution: {integrity: sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} - cpu: [loong64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-loong64-gnu@4.62.5': resolution: {integrity: sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} - cpu: [loong64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-loong64-musl@4.62.5': resolution: {integrity: sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.62.5': resolution: {integrity: sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} - cpu: [ppc64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-ppc64-musl@4.62.5': resolution: {integrity: sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.62.5': resolution: {integrity: sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-riscv64-musl@4.62.5': resolution: {integrity: sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.62.5': resolution: {integrity: sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.62.5': resolution: {integrity: sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} - cpu: [x64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-x64-musl@4.62.5': resolution: {integrity: sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} - cpu: [x64] - os: [openbsd] - '@rollup/rollup-openbsd-x64@4.62.5': resolution: {integrity: sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.62.5': resolution: {integrity: sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.62.5': resolution: {integrity: sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.62.5': resolution: {integrity: sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-gnu@4.62.5': resolution: {integrity: sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.62.5': resolution: {integrity: sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==} cpu: [x64] @@ -6448,11 +6322,6 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.62.5: resolution: {integrity: sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -7324,12 +7193,6 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.28.6': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -7340,15 +7203,15 @@ snapshots: '@babel/core@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.7 '@babel/generator': 7.28.6 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.8 '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7360,8 +7223,8 @@ snapshots: '@babel/generator@7.28.6': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@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 @@ -7379,7 +7242,7 @@ snapshots: '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7387,19 +7250,15 @@ snapshots: dependencies: '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-plugin-utils@7.28.6': {} - '@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': {} @@ -7407,11 +7266,7 @@ snapshots: '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - - '@babel/parser@7.28.6': - dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.8 '@babel/parser@7.29.8': dependencies: @@ -7427,33 +7282,26 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.7': {} '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@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 + '@babel/code-frame': 7.29.7 '@babel/generator': 7.28.6 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.8 '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@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 @@ -8021,14 +7869,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -8037,7 +7885,7 @@ snapshots: '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdx': 2.0.14 @@ -10040,153 +9888,78 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rollup/rollup-android-arm-eabi@4.55.1': - optional: true - '@rollup/rollup-android-arm-eabi@4.62.5': optional: true - '@rollup/rollup-android-arm64@4.55.1': - optional: true - '@rollup/rollup-android-arm64@4.62.5': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': - optional: true - '@rollup/rollup-darwin-arm64@4.62.5': optional: true - '@rollup/rollup-darwin-x64@4.55.1': - optional: true - '@rollup/rollup-darwin-x64@4.62.5': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': - optional: true - '@rollup/rollup-freebsd-arm64@4.62.5': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': - optional: true - '@rollup/rollup-freebsd-x64@4.62.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.62.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.62.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.62.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': - optional: true - '@rollup/rollup-linux-arm64-musl@4.62.5': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.62.5': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': - optional: true - '@rollup/rollup-linux-loong64-musl@4.62.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.62.5': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': - optional: true - '@rollup/rollup-linux-ppc64-musl@4.62.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.62.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.62.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.62.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-x64-gnu@4.62.5': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': - optional: true - '@rollup/rollup-linux-x64-musl@4.62.5': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': - optional: true - '@rollup/rollup-openbsd-x64@4.62.5': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': - optional: true - '@rollup/rollup-openharmony-arm64@4.62.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.62.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.62.5': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': - optional: true - '@rollup/rollup-win32-x64-gnu@4.62.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': - optional: true - '@rollup/rollup-win32-x64-msvc@4.62.5': optional: true @@ -10277,7 +10050,7 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@streamdown/cjk@1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.3)(unified@11.0.5)': + '@streamdown/cjk@1.0.3(@types/mdast@4.0.4)(react@19.2.3)(unified@11.0.5)': dependencies: react: 19.2.3 remark-cjk-friendly: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) @@ -10538,7 +10311,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -10550,7 +10323,7 @@ snapshots: dependencies: minimatch: 10.2.6 path-browserify: 1.0.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 '@turbo/darwin-64@2.10.10': optional: true @@ -10574,24 +10347,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.8 '@types/chai@5.2.3': dependencies: @@ -10723,7 +10496,7 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree@1.0.8': {} @@ -10803,13 +10576,13 @@ snapshots: dependencies: execa: 5.1.1 - '@vercel/geistdocs@1.23.1(@svta/cml-cta@1.0.1(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1))(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1)(@tanstack/react-router@1.151.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(micromark-util-types@2.0.2)(micromark@4.0.2)(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vercel/geistdocs@1.23.1(@svta/cml-cta@1.0.1(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1))(@svta/cml-structured-field-values@1.0.1(@svta/cml-utils@1.0.1))(@svta/cml-utils@1.0.1)(@tanstack/react-router@1.151.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@ai-sdk/react': 3.0.201(react@19.2.3)(zod@4.4.3) '@clack/prompts': 0.11.0 '@icons-pack/react-simple-icons': 13.15.1(react@19.2.3) '@orama/tokenizers': 3.1.18 - '@streamdown/cjk': 1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.3)(unified@11.0.5) + '@streamdown/cjk': 1.0.3(@types/mdast@4.0.4)(react@19.2.3)(unified@11.0.5) '@streamdown/code': 1.1.1(react@19.2.3) '@vercel/agent-readability': 0.6.0(next@16.3.1(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@vercel/oidc': 3.8.2 @@ -11064,9 +10837,9 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) - bundle-require@5.1.0(esbuild@0.27.2): + bundle-require@5.1.0(esbuild@0.27.7): dependencies: - esbuild: 0.27.2 + esbuild: 0.27.7 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -11579,7 +11352,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -11592,7 +11365,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -11603,7 +11376,7 @@ snapshots: estree-util-value-to-estree@3.5.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-visit@2.0.0: dependencies: @@ -11612,7 +11385,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 eventsource-parser@3.0.6: {} @@ -11666,10 +11439,6 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -11691,7 +11460,7 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.0 - rollup: 4.55.1 + rollup: 4.62.5 foreground-child@3.3.1: dependencies: @@ -11935,7 +11704,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 @@ -12373,7 +12142,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 markdown-extensions@2.0.0: {} @@ -13488,7 +13257,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -13503,14 +13272,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -13558,7 +13327,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/hast': 3.0.5 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -13679,37 +13448,6 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.55.1: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 - fsevents: 2.3.3 - rollup@4.62.5: dependencies: '@types/estree': 1.0.9 @@ -13989,7 +13727,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 super-media-element@1.4.2: {} @@ -14046,8 +13784,8 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyglobby@0.2.17: dependencies: @@ -14097,22 +13835,22 @@ snapshots: tsup@8.5.1(jiti@2.7.0)(postcss@8.5.26)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0): dependencies: - bundle-require: 5.1.0(esbuild@0.27.2) + bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.27.2 + esbuild: 0.27.7 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.26)(tsx@4.21.0)(yaml@2.9.0) resolve-from: 5.0.0 - rollup: 4.55.1 + rollup: 4.62.5 source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.26 @@ -14299,7 +14037,7 @@ snapshots: vega-expression@6.1.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 vega-util: 2.1.0 vega-expression@6.2.2: @@ -14598,11 +14336,11 @@ snapshots: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.7 std-env: 4.2.0 tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 tinyrainbow: 3.1.1 vite: 7.3.1(@types/node@25.0.9)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0