Skip to content

Commit 417b63c

Browse files
Merge branch 'main' into fix-duplicate-mock-sponsors
2 parents e353c83 + 13f4d55 commit 417b63c

310 files changed

Lines changed: 31063 additions & 10579 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/index.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ TanStack.com marketing site built with TanStack Start.
55
## Essentials
66

77
- Package manager: `pnpm`
8-
- Run `pnpm test` before commits or after significant code changes, not after every tiny edit
9-
- Smoke tests live outside the default `pnpm test` path and are reserved for commit-hook validation
10-
- Don't run builds after every change. This is a visual site; assume changes work unless reported otherwise.
8+
- Run `pnpm test` before commits not after every tiny edit
9+
- Don't run builds or tests after every change. This is a visual site; assume changes work unless reported otherwise.
10+
- Rely on `tsc` or your built-in LSP integration (hopefully you have this)
1111
- **Typesafety is paramount.** Never cast types; fix at source instead. See [typescript.md](./typescript.md).
1212

1313
## Topic Guides

.github/workflows/autofix.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ jobs:
1818
runs-on: ubuntu-latest
1919
steps:
2020
- name: Checkout
21-
uses: actions/checkout@v5.0.0
21+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2222
with:
2323
fetch-depth: 0
24+
persist-credentials: false
2425
- name: Setup Tools
25-
uses: tanstack/config/.github/setup@main
26+
uses: tanstack/config/.github/setup@e4b48f16568324f76f467aa4c2aac2f05db632c3 # main
2627
- name: Fix formatting
2728
run: pnpm format
2829
- name: Apply fixes

.github/workflows/pr.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@ name: PR
33
on:
44
pull_request:
55

6+
permissions:
7+
contents: read
8+
69
jobs:
710
pr:
811
name: PR
912
runs-on: ubuntu-latest
1013
steps:
1114
- name: Checkout
12-
uses: actions/checkout@v5.0.0
15+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1316
with:
1417
fetch-depth: 0
18+
persist-credentials: false
1519
- name: Setup Tools
16-
uses: tanstack/config/.github/setup@main
20+
uses: tanstack/config/.github/setup@e4b48f16568324f76f467aa4c2aac2f05db632c3 # main
1721
- name: Run Build
1822
run: pnpm build
1923
- name: Run Tests

.github/workflows/update-tanstack-deps.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,20 @@ jobs:
1010
update-deps:
1111
name: Update TanStack Dependencies
1212
runs-on: ubuntu-latest
13+
permissions:
14+
contents: write
1315
steps:
1416
- name: Git Checkout
15-
uses: actions/checkout@v4
17+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1618
with:
17-
token: ${{ secrets.GITHUB_TOKEN }}
19+
# This scheduled job commits dependency updates back to the branch.
20+
persist-credentials: true
1821

1922
- name: Setup pnpm
20-
uses: pnpm/action-setup@v4
23+
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
2124

2225
- name: Setup Node
23-
uses: actions/setup-node@v4
26+
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
2427
with:
2528
node-version-file: .nvmrc
2629
cache: pnpm

.github/workflows/zizmor.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: GitHub Actions Security Analysis
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: ['**']
8+
9+
permissions: {}
10+
11+
jobs:
12+
zizmor:
13+
name: Run zizmor
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Checkout
17+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
18+
with:
19+
persist-credentials: false
20+
21+
- name: Run zizmor
22+
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
23+
with:
24+
advanced-security: false
25+
annotations: true

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ This starts your app in development mode, rebuilding assets on file changes.
2727

2828
The documentation for all TanStack projects (except `React Charts`) is hosted on [tanstack.com](https://tanstack.com). In production, doc pages are fetched from GitHub. In development, they're read from your local file system.
2929

30-
Pre-commit hooks run smoke tests against these docs, so you'll need sibling repos cloned for commits to pass.
31-
3230
Create a `tanstack` parent directory and clone this repo alongside the projects:
3331

3432
```sh

docs-info.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,36 @@ becomes
204204
npm <command> <package>
205205
```
206206

207+
### Bundler tabs
208+
209+
Bundler tabs render a compact tab row (like package-manager tabs) but accept rich markdown content per bundler (like the framework component). The user's bundler choice is persisted to `localStorage` and synced across every bundler tab block on the page.
210+
211+
Inside `variant="bundler"`, each top-level heading whose text matches a known bundler starts a new section, and the following nodes (prose, code blocks, etc.) become that bundler's panel. The transformer uses the largest heading level present in the block, so `# Vite` / `# Rsbuild` and `## Vite` / `## Rsbuild` both work — just be consistent within a single block.
212+
213+
````md
214+
<!-- ::start:tabs variant="bundler" -->
215+
216+
# Vite
217+
218+
```ts title="vite.config.ts"
219+
import { defineConfig } from 'vite'
220+
221+
export default defineConfig({})
222+
```
223+
224+
# Rsbuild
225+
226+
```ts title="rsbuild.config.ts"
227+
import { defineConfig } from '@rsbuild/cli'
228+
229+
export default defineConfig({})
230+
```
231+
232+
<!-- ::end:tabs -->
233+
````
234+
235+
Supported bundlers: `vite`, `rsbuild`. Heading text is matched case-insensitively. Both sections should be defined; if the user's selected bundler isn't present in a particular block, the first defined panel is shown as a fallback.
236+
207237
## Framework component
208238

209239
Framework blocks let one markdown source contain React, Solid, or other framework-specific content. Internally, the transformer looks for h1 headings inside the framework block and treats each `# Heading` as a framework section boundary. It then stores framework metadata and rewrites the block into separate framework panels.

docs/partner-placement.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Partner Placement
2+
3+
Partner placement is split into three separate decisions:
4+
5+
- **Eligibility:** whether a partner can appear for a surface, category, library, feature, or user context.
6+
- **Tier:** the partner's commercial/display tier, which controls visual treatment and relative access to surfaces.
7+
- **Order:** the sequence used inside a surface once eligible partners are known.
8+
9+
The order policy should be explicit per surface. Avoid treating the partner array order or legacy score as the policy itself.
10+
11+
## Order Strategies
12+
13+
### `static-curated`
14+
15+
Use for surfaces where the order is editorially or commercially curated and should remain stable. These surfaces can preserve the existing order, use partner seniority, or use private commercial priority when seniority is unavailable.
16+
17+
Do not expose private commercial criteria in client-facing field names, comments, or API responses. If a private priority is required, keep the public/client value generic, such as `placementPriority` or an already-resolved ordered list.
18+
19+
### `tier-rotated`
20+
21+
Use for visible partner surfaces where partners in the same tier should cycle over time. Tier order remains fixed, but partners inside the same tier are selected with weighted-random ordering for each loaded app session and surface.
22+
23+
The root loader creates the session seed, so SSR and hydration receive the same value through loader data. Client placement hooks read the root loader data directly and do not refresh it during normal navigation. Each surface combines its stable surface id with the session seed; avoid runtime-generated component ids in the seed because they can diverge across server and client rendering. Partners default to equal probability within their tier; a future `placementWeight` can bias same-tier odds without changing the ordering API.
24+
25+
### `contextual-recommendation`
26+
27+
Use when a surface behaves like a product recommendation or builder suggestion. Product fit should be established before commercial weighting affects order. This strategy currently preserves the legacy tier/priority behavior while giving recommendation surfaces a separate policy label.
28+
29+
### `machine-readable`
30+
31+
Use for AI- or crawler-facing outputs such as `llms.txt` and JSON feeds. These should be deterministic and relevance-first. Do not rotate them merely for logo fairness unless the downstream behavior has been designed and disclosed as such.
32+
33+
## Reserved Rules
34+
35+
Reserved rules should be narrow. For example, Cloudflare is reserved as the first deployment/hosting partner in any list that contains Cloudflare and other deployment partners. That should not imply Cloudflare is globally first across every partner surface; non-deployment partners can still appear before Cloudflare when the surface is mixed-category.
36+
37+
Deployment action buttons are a deployment-only surface. Cloudflare remains first when present. Tier order is still preserved, and providers within the same tier can rotate by session.
38+
39+
## Current Surfaces
40+
41+
- Partner directory: `tier-rotated` for active partners, `static-curated` for previous partners.
42+
- Partner grids and embeds: `tier-rotated`.
43+
- Docs and blog rails: `tier-rotated`.
44+
- Mobile docs strip: `tier-rotated`.
45+
- Builder feature picker and starter partner suggestions: `contextual-recommendation`.
46+
- Deploy action buttons: `tier-rotated` with deployment provider tiers preserved.
47+
- `llms.txt` and `/api/data/partners`: `machine-readable`.
48+
49+
## Analytics
50+
51+
Partner impression and click events should include:
52+
53+
- `partner_id`
54+
- `placement`
55+
- `slot_index`
56+
- `partner_tier`
57+
- `order_strategy`
58+
- `rotation_seed` when the strategy rotates
59+
60+
This lets reporting distinguish partner performance from placement policy and makes under/over-exposure easier to debug.
61+
62+
## Contract Language
63+
64+
Suggested external framing:
65+
66+
> Partner tiers determine eligibility, visual treatment, reporting, and relative access to surfaces. Placement within the same tier may rotate or be curated depending on the surface. Some placements may include explicitly reserved rules for product, infrastructure, legal, or strategic reasons.
67+
68+
For AI-assisted selection:
69+
70+
> AI-assisted partner selection prioritizes user need and capability fit first. Partner tier may influence selection only among qualified options.

netlify.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
NODE_OPTIONS = "--max-old-space-size=4096"
33

44
[build]
5-
command = "vite build && cp src/instrument.server.mjs dist/server"
5+
command = "vite build --logLevel warn && cp src/instrument.server.mjs dist/server"
66
publish = "dist/client"
77

88
[functions]

package.json

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
"private": true,
44
"sideEffects": false,
55
"repository": "https://github.com/TanStack/tanstack.com.git",
6-
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
6+
"packageManager": "pnpm@11.1.0",
77
"type": "module",
88
"scripts": {
99
"dev": "pnpm run with-env vite dev",
1010
"with-env": "dotenv -e .env.local",
1111
"dev:frontend": "pnpm run with-env vite dev",
12-
"build": "vite build",
12+
"build": "vite build --logLevel warn",
1313
"start": "vite start",
1414
"start:prod": "pnpm run with-env node scripts/run-built-server.mjs",
1515
"content:build": "node scripts/build-content-collections.mjs",
@@ -21,17 +21,17 @@
2121
"db:studio": "drizzle-kit studio",
2222
"docs:webhooks:plan": "tsx scripts/sync-docs-webhooks.ts --dry-run",
2323
"docs:webhooks:sync": "tsx scripts/sync-docs-webhooks.ts",
24-
"husky": "pnpm run format && pnpm run test && pnpm run test:smoke",
24+
"husky": "pnpm run format && pnpm run test",
2525
"pretest": "pnpm run content:build",
2626
"test": "run-p test:tsc test:lint",
2727
"test:tsc": "tsc",
2828
"test:lint": "pnpm run lint",
29-
"test:smoke": "tsx tests/smoke.ts",
30-
"test:e2e": "playwright test",
3129
"prepare": "husky"
3230
},
3331
"dependencies": {
32+
"@fingerprintjs/fingerprintjs-pro-react": "^2.7.1",
3433
"@floating-ui/react": "^0.27.19",
34+
"@kapaai/react-sdk": "^0.9.10",
3535
"@modelcontextprotocol/sdk": "^1.29.0",
3636
"@netlify/functions": "^5.1.5",
3737
"@netlify/vite-plugin-tanstack-start": "^1.3.2",
@@ -52,20 +52,20 @@
5252
"@takumi-rs/core": "^1.1.2",
5353
"@takumi-rs/helpers": "^1.1.2",
5454
"@takumi-rs/image-response": "^1.1.2",
55-
"@tanstack/ai": "^0.10.2",
56-
"@tanstack/ai-anthropic": "^0.7.3",
57-
"@tanstack/ai-client": "^0.7.9",
58-
"@tanstack/ai-openai": "^0.7.4",
59-
"@tanstack/create": "^0.63.4",
60-
"@tanstack/pacer": "^0.20.1",
61-
"@tanstack/react-hotkeys": "^0.9.1",
62-
"@tanstack/react-pacer": "^0.21.1",
63-
"@tanstack/react-query": "^5.96.2",
64-
"@tanstack/react-router": "1.168.24",
65-
"@tanstack/react-router-devtools": "1.166.13",
66-
"@tanstack/react-router-ssr-query": "1.166.12",
67-
"@tanstack/react-start": "1.167.49",
68-
"@tanstack/react-start-server": "1.166.43",
55+
"@tanstack/ai": "^0.20.1",
56+
"@tanstack/ai-anthropic": "^0.10.1",
57+
"@tanstack/ai-client": "^0.11.3",
58+
"@tanstack/ai-openai": "^0.9.5",
59+
"@tanstack/create": "^0.68.0",
60+
"@tanstack/pacer": "^0.21.1",
61+
"@tanstack/react-hotkeys": "^0.10.0",
62+
"@tanstack/react-pacer": "^0.22.1",
63+
"@tanstack/react-query": "^5.100.11",
64+
"@tanstack/react-router": "1.170.7",
65+
"@tanstack/react-router-devtools": "1.167.0",
66+
"@tanstack/react-router-ssr-query": "1.167.0",
67+
"@tanstack/react-start": "1.168.10",
68+
"@tanstack/react-start-client": "1.168.2",
6969
"@tanstack/react-table": "^8.21.3",
7070
"@types/d3": "^7.4.3",
7171
"@uploadthing/react": "^7.3.3",
@@ -81,15 +81,19 @@
8181
"diff": "^8.0.4",
8282
"discord-interactions": "^4.4.0",
8383
"drizzle-orm": "^0.45.2",
84+
"encoding-sniffer": "^0.2.1",
8485
"gray-matter": "^4.0.3",
8586
"hast-util-is-element": "^3.0.0",
8687
"hast-util-to-string": "^3.0.1",
88+
"iconv-lite": "^0.7.2",
8789
"jszip": "^3.10.1",
8890
"lru-cache": "^11.2.7",
8991
"lucide-react": "^1.7.0",
9092
"maath": "^0.10.8",
9193
"match-sorter": "^8.2.0",
9294
"mermaid": "^11.14.0",
95+
"parse5": "^7.3.0",
96+
"parse5-parser-stream": "^7.1.2",
9397
"postgres": "^3.4.8",
9498
"react": "19.2.3",
9599
"react-colorful": "^5.6.1",
@@ -108,6 +112,7 @@
108112
"remove-markdown": "^0.6.3",
109113
"resend": "^6.10.0",
110114
"shiki": "^4.0.2",
115+
"streamdown": "^2.5.0",
111116
"tailwind-merge": "^3.5.0",
112117
"tar-stream": "^3.1.8",
113118
"three": "^0.183.2",
@@ -124,12 +129,11 @@
124129
"devDependencies": {
125130
"@content-collections/core": "^0.14.3",
126131
"@content-collections/vite": "^0.2.9",
127-
"@playwright/test": "^1.59.0",
128132
"@shikijs/transformers": "^4.0.2",
129-
"@tanstack/devtools-vite": "^0.6.0",
130-
"@tanstack/react-devtools": "^0.10.2",
131-
"@tanstack/react-query-devtools": "^5.99.0",
132-
"@tanstack/redact": "^0.0.6",
133+
"@tanstack/devtools-vite": "^0.7.0",
134+
"@tanstack/react-devtools": "^0.10.5",
135+
"@tanstack/react-query-devtools": "^5.100.11",
136+
"@tanstack/redact": "^0.0.17",
133137
"@types/hast": "^3.0.4",
134138
"@types/node": "^25.5.0",
135139
"@types/pg": "^8.20.0",
@@ -150,23 +154,9 @@
150154
"tailwindcss": "^4.2.2",
151155
"tsx": "^4.21.0",
152156
"typescript": "^6.0.2",
153-
"vite": "^8.0.3"
157+
"vite": "^8.0.13"
154158
},
155159
"engines": {
156160
"node": ">=22.0.0"
157-
},
158-
"pnpm": {
159-
"overrides": {
160-
"cross-spawn": ">=6.0.6",
161-
"glob": ">=10.5.0",
162-
"node-forge": ">=1.3.2",
163-
"jws": ">=3.2.3",
164-
"qs": ">=6.14.1",
165-
"tunnel-rat>zustand": "5.0.12",
166-
"js-yaml": "^3.14.2",
167-
"minimatch@3.1.5>brace-expansion": "1.1.12",
168-
"minimatch@5.1.9>brace-expansion": "2.0.3",
169-
"minimatch@10.2.5>brace-expansion": "5.0.5"
170-
}
171161
}
172162
}

0 commit comments

Comments
 (0)