diff --git a/src/components/landing/AiLanding.tsx b/src/components/landing/AiLanding.tsx index 90f250a7..0b04d67f 100644 --- a/src/components/landing/AiLanding.tsx +++ b/src/components/landing/AiLanding.tsx @@ -264,7 +264,7 @@ export default function AiLanding({
A useful AI layer has to cross clients, servers, providers, tools, streaming events, approvals, and observability. AI keeps those - seams explicit so teams can swap pieces without rewriting the + boundaries explicit so teams can swap pieces without rewriting the product.
@@ -888,11 +888,15 @@ function RuntimePanel() {
- agent.run({'{'} provider, model, tools {'}'})
+ const {'{'} messages, addToolApprovalResponse {'}'} = useChat({'{'}
- stream.on("tool.call", requestApproval)
+ connection: fetchServerSentEvents("/api/chat"),
- devtools.record(event)
+ tools,
+
+ devtools: {'{'} name: "Support Chat" {'}'}
+
+ {'}'})
- CLI brings together commands, MCP docs access, modular + CLI brings together project commands, docs search, modular integrations, and the Builder so TanStack Start apps can be - scaffolded and customized with the same context the docs use. + scaffolded and customized with current TanStack context.
- npx @tanstack/cli mcp
+ npx @tanstack/cli create --list-add-ons --json
{activeCommandPreview}
- npx @tanstack/cli build-plan
+ npx @tanstack/cli doc query framework/react/overview --json
Config is the opinionated toolchain TanStack uses to keep - JavaScript packages linted, built, tested, versioned, - changelogged, and published with minimal per-package ceremony. + JavaScript packages linted, built, tested in CI, versioned with + Changesets, and published with minimal per-package ceremony.
Every library needs the same boring promises: exports resolve, - types ship, tests pass, changelogs make sense, and npm publishes - what consumers expect. Config turns that repetition into shared - defaults. + types ship, tests pass, release branches are configured, and npm + publishes what consumers expect. Config turns that repetition into + shared defaults.
The consumer sees your package boundary: exports, module formats, - types, metadata, changelog, and version. Config keeps that + types, metadata, release branch, and version. Config keeps that boundary part of the workflow.
- pnpm lint
+ vite build && publint --strict
- pnpm test
+ nx affected
- pnpm build --verify {completedCount}/{releaseRows.length}
+ changesets {completedCount}/{releaseRows.length}
- pnpm release{' '}
+ publish config: branchConfigs, packages, npm, github{' '}
{completedCount === releaseRows.length ? '--ready' : '--blocked'}
- liveQuery({'{'} projects, issues, members {'}'})
+ useLiveQuery((q) =>
- .where(({`{`} issue, project {`}`}) => issue.projectId
- === project.id)
+ q.from({'{'} issue: issuesCollection {'}'})
- .orderBy(({`{`} issue {`}`}) => issue.updatedAt,
- "desc")
+ .join({'{'} project: projectsCollection {'}'},
+ ({`{`} issue, project {`}`}) =>
+
+ eq(issue.projectId, project.id))
+
+ .orderBy(({`{`} issue {`}`}) =>
+ issue.updatedAt, "desc"))
- registerDevtoolsPanel({'{'}
+ <TanStackDevtools
+
+ plugins={'{'}[{'{'}
- id: "jobs",
+ name: "Background Jobs",
- title: "Background Jobs",
+ render: <JobsPanel />,
- render: JobsPanel,
+ {'}'}]{'}'}
- {'}'})
+ />
- form.Subscribe({'{'} selector: state => state.canSubmit {'}'})
+ useStore(form.store, state => state.values.profile.email)
- field.Subscribe({'{'} selector: field => field.meta.errors {'}'})
+ form.Subscribe({'{'} selector: state => state.canSubmit {'}'})
- useHotkeys("{activeShortcut}", runCommand, {'{'} scope {'}'} - ) + useHotkey("{activeShortcut}", runCommand, {'{'} enabled:{' '} + isPanelOpen {'}'})
- queue.add(uploadFile)
+ const queue = new AsyncQueuer(uploadFile, {'{'} concurrency: 3 {'}'})
- queue.setOptions({'{'} concurrency: 3, order: "fifo" {'}'})
+ queue.addItem(file)
- queue.subscribe(state => state.status)
+ queue.store.subscribe(state => syncStatus(state.status))
- useRanger({'{'} min: 0, max: 1000, step: 10, values: [
- {values.join(', ')}] {'}'})
+ useRanger({'{'} getRangerElement: () => rangerRef.current,
+
+ min: 0, max: 1000,
+
+ stepSize: 10, values: [{values.join(', ')}],
+
+ onChange: instance => setValues(instance.sortedValues){' '}
+ {'}'})
- search: z.object({'{'}
+ validateSearch: z.object(
+ {'{'}
q: z.string().optional(),
diff --git a/src/components/landing/StoreLanding.tsx b/src/components/landing/StoreLanding.tsx
index 202bdad4..8e5fa1b4 100644
--- a/src/components/landing/StoreLanding.tsx
+++ b/src/components/landing/StoreLanding.tsx
@@ -93,7 +93,7 @@ const lifecycleSteps = [
const subscriptionExamples = [
{
label: 'component',
- value: 'useStore(appStore, state => state.filters)',
+ value: 'useSelector(appStore, state => state.filters)',
},
{
label: 'derived',
@@ -101,7 +101,7 @@ const subscriptionExamples = [
},
{
label: 'effect',
- value: 'store.subscribe(selector, listener)',
+ value: 'store.subscribe(listener)',
},
{
label: 'adapter',
@@ -533,9 +533,9 @@ function SubscriptionPanel() {
- const filters = useStore(store, state => state.filters)
+ const filters = useSelector(store, state => state.filters)
- const canSave = useStore(store, state => state.draft.isDirty)
+ const canSave = useSelector(store, state => state.draft.isDirty)
- Workflow models approvals, retries, fan-out, slow external - systems, and resumable state as durable TypeScript workflows + Workflow is for modeling approvals, retries, fan-out, slow + external systems, and visible run state as TypeScript workflows instead of one-off background jobs scattered across the app.
@@ -236,9 +236,9 @@ export default function WorkflowLanding({ Start, step, wait, resume.- Durable workflows let process state move through time deliberately - instead of hoping a single request, queue worker, or deploy window - keeps everything together. + Typed workflows let process state move through time deliberately + instead of hoping a single request or queue worker keeps + everything together.
- workflow.step("reserve inventory")
+ step: "reserve inventory"
- .retry({'{'} attempts: 5, backoff: "exponential"{' '}
- {'}'})
+ attempts: 2 / 5
- .waitForApproval("manager")
+ next: "manager approval"
| - {flexRender(header.column.columnDef.header, header.getContext())} + {flexRender( + header.column.columnDef.header, + header.getContext(), + )} | ))}
|---|
|
- |
- }
-
|---|
|
- |
- }
-
| {flexRender(header.column.columnDef.header, header.getContext())} | - ))} -
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | - ))} -
| - {{ flexRender(header.column.columnDef.header, header.getContext()) }} - | -
|---|
| - {{ flexRender(cell.column.columnDef.cell, cell.getContext()) }} - | -
| {flexRender(header.column.columnDef.header, header.getContext())} | - {/each} -
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | - {/each} -
| \${flexRender(header.column.columnDef.header, header.getContext())} | \`)} -
|---|
| \${flexRender(cell.column.columnDef.cell, cell.getContext())} | \`)} -
| {flexRender(header.column.columnDef.header, header.getContext())} | - ))} -
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | - ))} -