fix: polish copy, remove homepage icon from module cards, and tighten footer/link styles

- Drop `IconHome` anchor from `ModuleCard` header; only the `IconInfoCircle` details link remains (opacity toned down to `text-foreground/40`)
- Reword error messages (`describeError`), empty-state strings, route-boundary messages, and stats page copy for clarity and consistency
- Replace `rel="noreferrer"` with `rel="noopener noreferrer"` across header, footer, detail page, and stats
- Add external-link icon to footer GitHub anchor; add `hover:text-foreground` to footer nav links
- Fix `PreviewBlock` top spacing (`mt-4` moved to `pt-4` on the wrapper so the border-top sits flush)
- Add "audit the code" link to stats telemetry opt-out blurb pointing at the telemetry source file
This commit is contained in:
jake committed 2026-05-26 18:03:03 -04:00
1 parent 2bde308229
commit 3028165da4
12 files changed
+77 -91

No files matched your search

+2 -2
View File
@@ -26,7 +26,7 @@
"@tanstack/react-pacer": "^0.22.1", "@tanstack/react-pacer": "^0.22.1",
"@tanstack/react-router": "^1.170.8", "@tanstack/react-router": "^1.170.8",
"@tanstack/react-router-devtools": "^1.167.0", "@tanstack/react-router-devtools": "^1.167.0",
"@tanstack/react-start": "^1.168.13", "@tanstack/react-start": "^1.168.14",
"@vercel/functions": "^3.6.0", "@vercel/functions": "^3.6.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
@@ -42,7 +42,7 @@
"react-dom": "^19.2.6", "react-dom": "^19.2.6",
"react-resizable-panels": "^4.11.2", "react-resizable-panels": "^4.11.2",
"recharts": "^3.8.1", "recharts": "^3.8.1",
"shadcn": "^4.8.0", "shadcn": "^4.8.1",
"shiki": "^4.1.0", "shiki": "^4.1.0",
"sonner": "^2.0.7", "sonner": "^2.0.7",
"tailwind-merge": "^3.6.0", "tailwind-merge": "^3.6.0",
@@ -236,7 +236,7 @@ export function FilePreview({
function EmptyState() { function EmptyState() {
return ( return (
<div className="flex min-h-[280px] items-center justify-center px-6 py-10 text-center text-sm text-muted-foreground lg:min-h-0 lg:flex-1"> <div className="flex min-h-[280px] items-center justify-center px-6 py-10 text-center text-sm text-muted-foreground lg:min-h-0 lg:flex-1">
The file tree will populate as you pick modules. Files appear here as you add modules.
</div> </div>
); );
} }
@@ -257,7 +257,7 @@ function PreviewPane({
if (!preview || !path) { if (!preview || !path) {
return ( return (
<div className="flex h-full items-center justify-center px-6 py-10 text-sm text-muted-foreground"> <div className="flex h-full items-center justify-center px-6 py-10 text-sm text-muted-foreground">
Select a file Pick a file to preview
</div> </div>
); );
} }
@@ -7,7 +7,7 @@ import {
PEER_CATEGORIES, PEER_CATEGORIES,
resolveAdapter, resolveAdapter,
} from "@stanza/registry"; } from "@stanza/registry";
import { IconCheck, IconHome, IconInfoCircle } from "@tabler/icons-react"; import { IconCheck, IconInfoCircle } from "@tabler/icons-react";
import { Link } from "@tanstack/react-router"; import { Link } from "@tanstack/react-router";
import { memo, useCallback, useMemo } from "react"; import { memo, useCallback, useMemo } from "react";
@@ -187,45 +187,23 @@ const ModuleCard = memo(function ModuleCard({
<div className="flex items-start justify-between gap-2"> <div className="flex items-start justify-between gap-2">
<div className="flex min-w-0 items-center gap-2"> <div className="flex min-w-0 items-center gap-2">
<h3 className="truncate text-sm leading-tight font-medium">{m.label}</h3> <h3 className="truncate text-sm leading-tight font-medium">{m.label}</h3>
<span className="flex shrink-0 items-center gap-1.5"> <Tooltip>
{m.homepage && ( <TooltipTrigger
<Tooltip> nativeButton={false}
<TooltipTrigger render={
nativeButton={false} <Link
render={ to="/registry/$category/$id"
<a params={{ category: m.category, id: m.id }}
href={m.homepage} aria-label={`${m.label} details`}
target="_blank" onClick={(e) => e.stopPropagation()}
rel="noreferrer" className="inline-flex shrink-0 translate-y-[-2px] items-center justify-center text-foreground/40 transition-colors hover:text-foreground"
aria-label={`${m.label} website`} />
onClick={(e) => e.stopPropagation()} }
className="inline-flex shrink-0 translate-y-[-2px] items-center justify-center text-foreground/60 transition-colors hover:text-foreground" >
/> <IconInfoCircle className="size-3.5" aria-hidden />
} </TooltipTrigger>
> <TooltipContent sideOffset={8}>View details</TooltipContent>
<IconHome className="size-3.5" aria-hidden /> </Tooltip>
</TooltipTrigger>
<TooltipContent sideOffset={8}>Open website</TooltipContent>
</Tooltip>
)}
<Tooltip>
<TooltipTrigger
nativeButton={false}
render={
<Link
to="/registry/$category/$id"
params={{ category: m.category, id: m.id }}
aria-label={`${m.label} details`}
onClick={(e) => e.stopPropagation()}
className="inline-flex shrink-0 translate-y-[-2px] items-center justify-center text-foreground/60 transition-colors hover:text-foreground"
/>
}
>
<IconInfoCircle className="size-3.5" aria-hidden />
</TooltipTrigger>
<TooltipContent sideOffset={8}>View details</TooltipContent>
</Tooltip>
</span>
</div> </div>
{selected && <IconCheck className="size-4 shrink-0 text-foreground" aria-hidden />} {selected && <IconCheck className="size-4 shrink-0 text-foreground" aria-hidden />}
</div> </div>
@@ -255,9 +233,9 @@ function describeError(error: ResolveError): string {
case "missing-peer": case "missing-peer":
return `Pick a ${categoryLabel(error.category)} module first.`; return `Pick a ${categoryLabel(error.category)} module first.`;
case "incompatible-peer": case "incompatible-peer":
return `Doesn't pair with ${error.peer} (your ${categoryLabel(error.category)} pick).`; return `Not compatible with ${error.peer} (${categoryLabel(error.category)}).`;
case "no-adapter": case "no-adapter":
return "No adapter matches your current stack."; return "Not compatible with your current stack.";
default: default:
error satisfies never; error satisfies never;
throw new Error(`Unknown resolve error: ${String(error)}`); throw new Error(`Unknown resolve error: ${String(error)}`);
@@ -64,7 +64,7 @@ function PreviewBlock({ preview }: { preview: Preview }) {
); );
return ( return (
<div <div
className="mt-4 overflow-auto border-t border-border text-xs leading-relaxed [&_pre]:bg-transparent! [&_pre]:p-0!" className="overflow-auto border-t border-border pt-4 text-xs leading-relaxed [&_pre]:bg-transparent! [&_pre]:p-0!"
dangerouslySetInnerHTML={inner} dangerouslySetInnerHTML={inner}
/> />
); );
+10 -6
View File
@@ -1,3 +1,4 @@
import { IconExternalLink } from "@tabler/icons-react";
import { Link } from "@tanstack/react-router"; import { Link } from "@tanstack/react-router";
export function Footer() { export function Footer() {
@@ -9,8 +10,8 @@ export function Footer() {
<a <a
href="https://github.com/jakejarvis" href="https://github.com/jakejarvis"
target="_blank" target="_blank"
rel="noreferrer" rel="noopener noreferrer"
className="underline underline-offset-4 hover:text-foreground" className="underline underline-offset-1 hover:text-foreground"
> >
@jakejarvis @jakejarvis
</a> </a>
@@ -18,17 +19,20 @@ export function Footer() {
</p> </p>
<nav className="flex items-center gap-5"> <nav className="flex items-center gap-5">
<span>v{__APP_VERSION__ ?? "0.0.0"}</span> <span>v{__APP_VERSION__ ?? "0.0.0"}</span>
<Link to="/docs/$" params={{ _splat: "" }}> <Link to="/docs/$" params={{ _splat: "" }} className="hover:text-foreground">
Docs Docs
</Link> </Link>
<Link to="/stats">Stats</Link> <Link to="/stats" className="hover:text-foreground">
Stats
</Link>
<a <a
href="https://github.com/jakejarvis/stanza" href="https://github.com/jakejarvis/stanza"
className="hover:text-foreground" className="inline-flex items-center gap-1 hover:text-foreground"
target="_blank" target="_blank"
rel="noreferrer" rel="noopener noreferrer"
> >
GitHub GitHub
<IconExternalLink className="size-3" aria-hidden />
</a> </a>
</nav> </nav>
</div> </div>
+1 -1
View File
@@ -40,7 +40,7 @@ export function Header() {
<a <a
href="https://github.com/jakejarvis/stanza" href="https://github.com/jakejarvis/stanza"
target="_blank" target="_blank"
rel="noreferrer" rel="noopener noreferrer"
aria-label="GitHub" aria-label="GitHub"
/> />
} }
+2 -2
View File
@@ -42,7 +42,7 @@ function CenteredMessage({
} }
const GENERIC_ERROR_MESSAGE = const GENERIC_ERROR_MESSAGE =
"An unexpected error occurred while rendering this page. Try again, or head back to the builder."; "Something broke while loading this page. Try again, or head back to the builder.";
/** /**
* Default error component for the router. Re-runs the loader on Try again via * Default error component for the router. Re-runs the loader on Try again via
@@ -97,7 +97,7 @@ export function RouteNotFoundBoundary() {
return ( return (
<CenteredMessage <CenteredMessage
title="Page not found" title="Page not found"
description="That page doesn’t exist. It may have moved, or the URL might be wrong." description="We couldn’t find that page. It may have moved, or the URL might be wrong."
> >
<Button render={<Link to="/" />} nativeButton={false} variant="outline" size="sm"> <Button render={<Link to="/" />} nativeButton={false} variant="outline" size="sm">
<IconHome data-icon="inline-start" /> <IconHome data-icon="inline-start" />
+1 -1
View File
@@ -53,7 +53,7 @@ function Page() {
<Link <Link
to="/docs/$" to="/docs/$"
params={{ _splat: "" }} params={{ _splat: "" }}
className="text-primary underline underline-offset-4 hover:text-primary/80" className="text-primary underline underline-offset-3 hover:text-primary/80"
> >
Learn more… Learn more…
</Link> </Link>
@@ -124,7 +124,7 @@ function ModuleDetailPage() {
<a <a
href={module.homepage} href={module.homepage}
target="_blank" target="_blank"
rel="noreferrer" rel="noopener noreferrer"
className="inline-flex items-center gap-1 text-muted-foreground transition-colors hover:text-foreground" className="inline-flex items-center gap-1 text-muted-foreground transition-colors hover:text-foreground"
> >
Website Website
+23 -15
View File
@@ -80,8 +80,8 @@ function StatsPage() {
<header className="mb-8 max-w-2xl"> <header className="mb-8 max-w-2xl">
<h1 className="text-3xl font-semibold tracking-tight">Stats</h1> <h1 className="text-3xl font-semibold tracking-tight">Stats</h1>
<p className="mt-2 text-pretty text-muted-foreground"> <p className="mt-2 text-pretty text-muted-foreground">
What modules people actually pick, aggregated from anonymous CLI telemetry —{" "} What modules developers actually pick, aggregated from anonymous CLI telemetry —{" "}
<a href="#telemetry" className="text-primary underline underline-offset-4"> <a href="#telemetry" className="text-primary underline underline-offset-3">
see exactly what&rsquo;s collected see exactly what&rsquo;s collected
</a> </a>
. .
@@ -129,7 +129,9 @@ function StatsPage() {
</CardTitle> </CardTitle>
{!isLoading ? ( {!isLoading ? (
<span className="font-mono text-xs text-muted-foreground tabular-nums"> <span className="font-mono text-xs text-muted-foreground tabular-nums">
{activitySum > 0 ? `${numberFormatter.format(activitySum)} total` : "no runs yet"} {activitySum > 0
? `${numberFormatter.format(activitySum)} total`
: "No runs yet."}
</span> </span>
) : null} ) : null}
</div> </div>
@@ -196,13 +198,10 @@ function StatsPage() {
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ul className="list-disc space-y-1 pl-4 text-muted-foreground"> <ul className="list-disc space-y-1 pl-4 text-muted-foreground">
<li> <li>Which command you ran, how long it took, and whether it succeeded.</li>
Which command you ran (init, add, remove, list, search), how long it took, and
whether it succeeded.
</li>
<li>CLI version, Node version, OS, and architecture.</li> <li>CLI version, Node version, OS, and architecture.</li>
<li>For installs/removes: the module id and its category.</li> <li>For installs/removes, the module ID and its category.</li>
<li>An ephemeral UUID generated per process to deduplicate events.</li> <li>An ephemeral UUID generated per-process to deduplicate events.</li>
</ul> </ul>
</CardContent> </CardContent>
</Card> </Card>
@@ -215,7 +214,7 @@ function StatsPage() {
<CardContent> <CardContent>
<ul className="list-disc space-y-1 pl-4 text-muted-foreground"> <ul className="list-disc space-y-1 pl-4 text-muted-foreground">
<li>File paths, project names, environment variables, or template contents.</li> <li>File paths, project names, environment variables, or template contents.</li>
<li>Your IP address (PostHog ingest is server-proxied through this site).</li> <li>Your IP address (PostHog ingest is server-proxied).</li>
<li>Any persistent identifier — the process UUID is discarded on exit.</li> <li>Any persistent identifier — the process UUID is discarded on exit.</li>
<li> <li>
Anything from CI runs (telemetry auto-skips when <code>CI</code> is set). Anything from CI runs (telemetry auto-skips when <code>CI</code> is set).
@@ -226,17 +225,26 @@ function StatsPage() {
</div> </div>
<p className="mt-4 text-xs leading-5 text-muted-foreground"> <p className="mt-4 text-xs leading-5 text-muted-foreground">
<strong className="font-medium text-foreground">Opt out</strong> per-invocation with{" "} <strong className="font-medium text-foreground">Opt out</strong> per-invocation with{" "}
<code>--no-telemetry</code>, persistently with <code>STANZA_TELEMETRY=0</code> or{" "} <code>--no-telemetry</code>, or permanently with <code>STANZA_TELEMETRY=0</code> or{" "}
<code>DO_NOT_TRACK=1</code>. More in the{" "} <code>DO_NOT_TRACK=1</code>. Learn more in the{" "}
<Link <Link
to="/docs/$" to="/docs/$"
params={{ _splat: "cli" }} params={{ _splat: "cli" }}
hash="telemetry" hash="telemetry"
className="text-primary underline underline-offset-4" className="text-primary underline underline-offset-1"
> >
CLI docs CLI docs
</Link> </Link>{" "}
. or{" "}
<a
href="https://github.com/jakejarvis/stanza/blob/main/apps/cli/src/lib/telemetry.ts"
target="_blank"
rel="noopener noreferrer"
className="text-primary underline underline-offset-1"
>
audit the code
</a>{" "}
yourself.
</p> </p>
</section> </section>
</div> </div>
-1
View File
@@ -23,7 +23,6 @@
"devDependencies": { "devDependencies": {
"@changesets/changelog-github": "^0.7.0", "@changesets/changelog-github": "^0.7.0",
"@changesets/cli": "^2.31.0", "@changesets/cli": "^2.31.0",
"@stanza/registry": "workspace:*",
"@types/node": "^25.9.1", "@types/node": "^25.9.1",
"jiti": "^2.7.0", "jiti": "^2.7.0",
"typescript": "^6.0.3", "typescript": "^6.0.3",
+14 -17
View File
@@ -25,9 +25,6 @@ importers:
'@changesets/cli': '@changesets/cli':
specifier: ^2.31.0 specifier: ^2.31.0
version: 2.31.0(@types/node@25.9.1) version: 2.31.0(@types/node@25.9.1)
'@stanza/registry':
specifier: workspace:*
version: link:packages/registry
'@types/node': '@types/node':
specifier: ^25.9.1 specifier: ^25.9.1
version: 25.9.1 version: 25.9.1
@@ -132,8 +129,8 @@ importers:
specifier: ^1.167.0 specifier: ^1.167.0
version: 1.167.0(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.167.0(@tanstack/react-router@1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.171.6)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-start': '@tanstack/react-start':
specifier: ^1.168.13 specifier: ^1.168.14
version: 1.168.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.168.14(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@vercel/functions': '@vercel/functions':
specifier: ^3.6.0 specifier: ^3.6.0
version: 3.6.0 version: 3.6.0
@@ -180,8 +177,8 @@ importers:
specifier: ^3.8.1 specifier: ^3.8.1
version: 3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@17.0.2)(react@19.2.6)(redux@5.0.1) version: 3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@17.0.2)(react@19.2.6)(redux@5.0.1)
shadcn: shadcn:
specifier: ^4.8.0 specifier: ^4.8.1
version: 4.8.0(@types/node@25.9.1)(typescript@6.0.3) version: 4.8.1(@types/node@25.9.1)(typescript@6.0.3)
shiki: shiki:
specifier: ^4.1.0 specifier: ^4.1.0
version: 4.1.0 version: 4.1.0
@@ -2099,8 +2096,8 @@ packages:
react: '>=18.0.0 || >=19.0.0' react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start-client@1.168.4': '@tanstack/react-start-client@1.168.5':
resolution: {integrity: sha512-PDJ7xEuUKrlBiQz2PrVN9pD2ErmWeFpckYW1WUE8JCAeVi8U7C6rQNTQe4hQxBhycRfRdD53M6UfdWdQODIxyg==} resolution: {integrity: sha512-xRAGDhb81kvJa9lkr5CLt66HVMJWGh1iPZL/AYO8/wnPdbwFbRKSv5Yzx5SI+YQbB0qTgcYCyOPi4jrscAppag==}
engines: {node: '>=22.12.0'} engines: {node: '>=22.12.0'}
peerDependencies: peerDependencies:
react: '>=18.0.0 || >=19.0.0' react: '>=18.0.0 || >=19.0.0'
@@ -2130,8 +2127,8 @@ packages:
react: '>=18.0.0 || >=19.0.0' react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start@1.168.13': '@tanstack/react-start@1.168.14':
resolution: {integrity: sha512-E2pHQ92NiND1/HiD5Ax71xFXxiRZ2reOfU5W4BqxUL5plap3p8xSw1c6L8Np1E60vsxknuPCYRZESKkRy/LkOA==} resolution: {integrity: sha512-Y/CXqtufmZkUL6OCcxxDoGxDDnz/hqrYqCJQeiBHx4MUbn9mx3sZviFVDkFrsyi/8J+IKjXdV5LlNATAxHQzAQ==}
engines: {node: '>=22.12.0'} engines: {node: '>=22.12.0'}
peerDependencies: peerDependencies:
'@rsbuild/core': ^2.0.0 '@rsbuild/core': ^2.0.0
@@ -4764,8 +4761,8 @@ packages:
setprototypeof@1.2.0: setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
shadcn@4.8.0: shadcn@4.8.1:
resolution: {integrity: sha512-LAm3I/1FdoU/zu5GVG8Hbna4X9zlzEG5TeeCPXqsopkjvGk8QUF9OFhqeRN8oM6Oh/ynUI/yQHZxQAO3Ymcqsg==} resolution: {integrity: sha512-B2J63uYwqfLJPNzZk2AAlonXG1aJhwv8xmXlUag8OZdV61CQB6570nkXLjU1u9XN1qXm0LpJhSFQ0ZhlOruA4Q==}
hasBin: true hasBin: true
shebang-command@2.0.0: shebang-command@2.0.0:
@@ -6914,7 +6911,7 @@ snapshots:
react: 19.2.6 react: 19.2.6
react-dom: 19.2.6(react@19.2.6) react-dom: 19.2.6(react@19.2.6)
'@tanstack/react-start-client@1.168.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': '@tanstack/react-start-client@1.168.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies: dependencies:
'@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/router-core': 1.171.6 '@tanstack/router-core': 1.171.6
@@ -6958,10 +6955,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- crossws - crossws
'@tanstack/react-start@1.168.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': '@tanstack/react-start@1.168.14(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies: dependencies:
'@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-router': 1.170.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-start-client': 1.168.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-start-client': 1.168.5(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-start-rsc': 0.1.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-start-rsc': 0.1.13(@vitejs/plugin-rsc@0.5.26(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(typescript@6.0.3))(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-start-server': 1.167.9(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-start-server': 1.167.9(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/router-utils': 1.162.1 '@tanstack/router-utils': 1.162.1
@@ -9928,7 +9925,7 @@ snapshots:
setprototypeof@1.2.0: {} setprototypeof@1.2.0: {}
shadcn@4.8.0(@types/node@25.9.1)(typescript@6.0.3): shadcn@4.8.1(@types/node@25.9.1)(typescript@6.0.3):
dependencies: dependencies:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
'@babel/parser': 7.29.7 '@babel/parser': 7.29.7