diff --git a/package.json b/package.json index 645b9431d..5bbe9e136 100644 --- a/package.json +++ b/package.json @@ -89,8 +89,8 @@ "@tanstack/ai-openrouter": "^0.19.9", "@tanstack/charts": "1.0.0", "@tanstack/create": "^0.70.1", - "@tanstack/highlight": "^0.0.9", - "@tanstack/markdown": "^0.0.16", + "@tanstack/highlight": "^1.0.0", + "@tanstack/markdown": "^1.0.0", "@tanstack/pacer": "^0.21.1", "@tanstack/react-db": "0.4.1", "@tanstack/react-hotkeys": "^0.10.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aaf98aa26..c2bb127a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,11 +170,11 @@ importers: specifier: ^0.70.1 version: 0.70.1 '@tanstack/highlight': - specifier: ^0.0.9 - version: 0.0.9 + specifier: ^1.0.0 + version: 1.0.0 '@tanstack/markdown': - specifier: ^0.0.16 - version: 0.0.16(octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3) + specifier: ^1.0.0 + version: 1.0.0(octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3) '@tanstack/pacer': specifier: ^0.21.1 version: 0.21.1 @@ -4058,8 +4058,8 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/highlight@0.0.9': - resolution: {integrity: sha512-vWuVpuSprbsEq5gle5vp2CEBNVue65m09idkbv0rcCPFn3XnxzZg1Q9kownk24iCag6tJdfd/gtKSwllPbQvSA==} + '@tanstack/highlight@1.0.0': + resolution: {integrity: sha512-nrg2iZSQUZlDZGTPKh/CNlg6Orm3vFHIaIi/9DqPC1rUpfe/M6rD2iokrckWTc2Z5jYDz185BK76GUh9VIjQRw==} engines: {node: '>=18'} '@tanstack/history@1.162.4': @@ -4081,8 +4081,8 @@ packages: react: optional: true - '@tanstack/markdown@0.0.16': - resolution: {integrity: sha512-2fGZd4VMBwV85lH5AA+Iad9DXU4/Cz+sb/P3honzrh/zqqoSYV/rXuJrG4cC7XJcpofhjbOWBL74AHf4WZrqTw==} + '@tanstack/markdown@1.0.0': + resolution: {integrity: sha512-zE07RepFMbSQlHdnE82twgiVOKy50rP6a/X9UPOOBt8Z8x9lzaPvGpn2zioCnjXMvNt/IQkW5sSalXQ25C/FKw==} peerDependencies: octane: '>=0.1.12' react: '>=18' @@ -11734,7 +11734,7 @@ snapshots: - csstype - utf-8-validate - '@tanstack/highlight@0.0.9': {} + '@tanstack/highlight@1.0.0': {} '@tanstack/history@1.162.4': {} @@ -11747,7 +11747,7 @@ snapshots: octane: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) react: 19.2.3 - '@tanstack/markdown@0.0.16(octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)': + '@tanstack/markdown@1.0.0(octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)': optionalDependencies: octane: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) react: 19.2.3 diff --git a/src/blog/introducing-tanstack-markdown-and-highlight.md b/src/blog/introducing-tanstack-markdown-and-highlight.md index 141242a5c..68423e78e 100644 --- a/src/blog/introducing-tanstack-markdown-and-highlight.md +++ b/src/blog/introducing-tanstack-markdown-and-highlight.md @@ -20,7 +20,7 @@ RSC gave us a good way to keep that system on the server, and it worked, but the So we made the expensive part small. -Today we're releasing the first alphas of [TanStack Markdown](/markdown) and [TanStack Highlight](/highlight), two deliberately narrow libraries built around the content contract we actually need for technical blogs, documentation, and streamed AI output. The last post was about the architecture we could remove, this one is about what we built to remove it. +Today we're releasing the first releases of [TanStack Markdown](/markdown) and [TanStack Highlight](/highlight), two deliberately narrow libraries built around the content contract we actually need for technical blogs, documentation, and streamed AI output. The last post was about the architecture we could remove, this one is about what we built to remove it. ## Parsing and highlighting are different jobs @@ -136,7 +136,7 @@ Coding agents made it practical for us to explore purpose-built parsers and scan TanStack Highlight's committed corpus currently samples **333 fixtures from 2,940 TanStack documentation files**. Release checks cover token fidelity, deterministic HTML, package exports, bundle profiles, focused parser regressions, and a roughly 10,000-block throughput budget. Markdown tracks its supported CommonMark examples explicitly, checks renderer parity, and audits real TanStack and external content corpora. -The first tanstack.com migrations found edge cases in tight lists and image handling almost immediately. That's exactly what alpha software should surface, and every fix has to leave behind a focused regression test instead of another clever branch nobody can explain six months later. +The first tanstack.com migrations found edge cases in tight lists and image handling almost immediately. That's exactly what an early release should surface, and every fix has to leave behind a focused regression test instead of another clever branch nobody can explain six months later. The cost of going tiny is owning the contract. We want that cost in the repositories where everyone can inspect it. @@ -148,7 +148,7 @@ Our RSC content pipeline existed largely to keep the old Markdown and highlighti The [RSC post](/blog/we-removed-rsc-from-tanstack-com) has the measurements and caveats behind that decision. For this announcement, the important part is that these aren't tiny libraries built around a benchmark toy, they're already carrying the messiest content corpus we own. -## Alpha means the contract can still move +## Try them on your own content Both libraries are available now: diff --git a/src/libraries/libraries.ts b/src/libraries/libraries.ts index c4835b9e8..9b7375b4f 100644 --- a/src/libraries/libraries.ts +++ b/src/libraries/libraries.ts @@ -627,7 +627,6 @@ export const markdown: LibrarySlim = { tagline: 'A serializable document model for docs and AI streams', description: 'A deliberately bounded Markdown parser with a public serializable AST, safe defaults, deterministic React, HTML, and Octane output, and a stateless profile for accumulated AI streams.', - badge: 'alpha', bgStyle: 'bg-fuchsia-500', borderStyle: 'border-fuchsia-500/50', textStyle: 'text-fuchsia-500 dark:text-fuchsia-400', @@ -658,7 +657,6 @@ export const highlight: LibrarySlim = { tagline: 'Web-first syntax highlighting with compact, themeable HTML', description: 'A synchronous syntax highlighter with selective language imports, context-aware web scanners, semantic CSS themes, precise annotations, and compact deterministic output.', - badge: 'alpha', bgStyle: 'bg-amber-500', borderStyle: 'border-amber-500/50', textStyle: 'text-amber-500 dark:text-amber-400', diff --git a/src/utils/builder-environment.ts b/src/utils/builder-environment.ts index 23f1e237e..2f2c988be 100644 --- a/src/utils/builder-environment.ts +++ b/src/utils/builder-environment.ts @@ -19,12 +19,12 @@ export const builderImports = { 'https://esm.sh/@tanstack/charts@0.16.1/octane/core?external=octane', '@tanstack/charts-data/': 'https://esm.sh/gh/TanStack/charts@b8690671d677244848cff0eebd3d5dd0d5825b18/packages/charts-demo-data/src/', - '@tanstack/highlight': 'https://esm.sh/@tanstack/highlight@0.0.10', - '@tanstack/highlight/': 'https://esm.sh/@tanstack/highlight@0.0.10/', - '@tanstack/markdown': 'https://esm.sh/@tanstack/markdown@0.0.13', + '@tanstack/highlight': 'https://esm.sh/@tanstack/highlight@1.0.0', + '@tanstack/highlight/': 'https://esm.sh/@tanstack/highlight@1.0.0/', + '@tanstack/markdown': 'https://esm.sh/@tanstack/markdown@1.0.0', '@tanstack/markdown/react': - 'https://esm.sh/@tanstack/markdown@0.0.13/react?external=react', - '@tanstack/markdown/': 'https://esm.sh/@tanstack/markdown@0.0.13/', + 'https://esm.sh/@tanstack/markdown@1.0.0/react?external=react', + '@tanstack/markdown/': 'https://esm.sh/@tanstack/markdown@1.0.0/', '@tanstack/pacer': 'https://esm.sh/@tanstack/pacer@0.21.1', '@tanstack/react-pacer': 'https://esm.sh/@tanstack/react-pacer@0.22.1?external=react', diff --git a/tests/builder-environment.test.ts b/tests/builder-environment.test.ts index 37a9d9146..75729502b 100644 --- a/tests/builder-environment.test.ts +++ b/tests/builder-environment.test.ts @@ -128,23 +128,23 @@ test('provides hidden entry modules for every example environment', () => { test('exposes current Highlight and Markdown modules', () => { assert.equal( builderImports['@tanstack/highlight'], - 'https://esm.sh/@tanstack/highlight@0.0.10', + 'https://esm.sh/@tanstack/highlight@1.0.0', ) assert.equal( builderImports['@tanstack/highlight/'], - 'https://esm.sh/@tanstack/highlight@0.0.10/', + 'https://esm.sh/@tanstack/highlight@1.0.0/', ) assert.equal( builderImports['@tanstack/markdown'], - 'https://esm.sh/@tanstack/markdown@0.0.13', + 'https://esm.sh/@tanstack/markdown@1.0.0', ) assert.equal( builderImports['@tanstack/markdown/'], - 'https://esm.sh/@tanstack/markdown@0.0.13/', + 'https://esm.sh/@tanstack/markdown@1.0.0/', ) assert.equal( builderImports['@tanstack/markdown/react'], - 'https://esm.sh/@tanstack/markdown@0.0.13/react?external=react', + 'https://esm.sh/@tanstack/markdown@1.0.0/react?external=react', ) const guide = generateBuilderLlmsTxt() diff --git a/tests/markdown-highlight-versions.test.ts b/tests/markdown-highlight-versions.test.ts index 182f9a337..7518247db 100644 --- a/tests/markdown-highlight-versions.test.ts +++ b/tests/markdown-highlight-versions.test.ts @@ -1,10 +1,11 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { getBranch, highlight, markdown } from '../src/libraries' +import { charts, getBranch, highlight, markdown } from '../src/libraries' import { validateLibraryVersion } from '../src/routes/-library-landing' -for (const library of [markdown, highlight]) { +for (const library of [markdown, highlight, charts]) { test(`${library.id} v1 picker uses the current docs branch and retires v0`, () => { + assert.equal(library.badge, undefined) assert.equal(library.latestVersion, 'v1') assert.deepEqual(library.availableVersions, ['v1']) assert.equal(getBranch(library, 'v1'), 'main') @@ -29,13 +30,13 @@ for (const library of [markdown, highlight]) { const baseUrl = process.env.TANSTACK_DOCS_SMOKE_BASE_URL test( - 'Markdown and Highlight v0 and v1 docs aliases preserve paths and query strings', + 'Markdown, Highlight, and Charts v0 and v1 docs aliases preserve paths and query strings', { skip: baseUrl ? false : 'Set TANSTACK_DOCS_SMOKE_BASE_URL for route checks', }, async () => { assert.ok(baseUrl) - for (const library of [markdown, highlight]) { + for (const library of [markdown, highlight, charts]) { for (const version of ['v0', 'v1']) { const response: Response = await fetch( new URL(