feat(homepage): update positioning to "Infinite Toolspace"
Rebrand homepage messaging around toolspace virtualization concept: - Hero: "INFINITE TOOLSPACE" with "A million tools. Zero configuration." - New ToolspaceSection explaining the three-stage pipeline - FeaturesSection emphasizes retrieval layer and selection at scale - Integration section: "MCP is the socket, TPMJS is the OS" - Publish section: "Join the Infinite Toolspace"
This commit is contained in:
parent
1675e6ce6c
commit
ce44aeab3a
4 changed files with 190 additions and 52 deletions
|
|
@ -7,6 +7,7 @@ import Link from 'next/link';
|
||||||
import { AppHeader } from '../components/AppHeader';
|
import { AppHeader } from '../components/AppHeader';
|
||||||
import { FeaturesSection } from '../components/home/FeaturesSection';
|
import { FeaturesSection } from '../components/home/FeaturesSection';
|
||||||
import { HeroSection } from '../components/home/HeroSection';
|
import { HeroSection } from '../components/home/HeroSection';
|
||||||
|
import { ToolspaceSection } from '../components/home/ToolspaceSection';
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic';
|
export const dynamic = 'force-dynamic';
|
||||||
|
|
||||||
|
|
@ -135,6 +136,9 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
{/* Hero Section - Dithered Design */}
|
{/* Hero Section - Dithered Design */}
|
||||||
<HeroSection stats={data.stats} />
|
<HeroSection stats={data.stats} />
|
||||||
|
|
||||||
|
{/* Toolspace Virtualization Concept */}
|
||||||
|
<ToolspaceSection />
|
||||||
|
|
||||||
{/* Features Section */}
|
{/* Features Section */}
|
||||||
<FeaturesSection />
|
<FeaturesSection />
|
||||||
|
|
||||||
|
|
@ -158,11 +162,14 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
<section className="py-16 bg-background">
|
<section className="py-16 bg-background">
|
||||||
<Container size="xl" padding="lg">
|
<Container size="xl" padding="lg">
|
||||||
<div className="text-center mb-12">
|
<div className="text-center mb-12">
|
||||||
<h2 className="text-3xl md:text-4xl font-bold mb-4 text-foreground">
|
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
||||||
Featured Tools
|
from the toolspace
|
||||||
|
</p>
|
||||||
|
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
||||||
|
top quality tools
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-lg text-foreground-secondary max-w-2xl mx-auto mb-8">
|
<p className="text-base text-foreground-secondary max-w-2xl mx-auto mb-8 font-sans">
|
||||||
Production-ready tools you can use today. Add to your AI agent in one line.
|
Surfaced by quality signals: health checks, downloads, documentation richness.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -358,13 +365,14 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
{/* Section Header */}
|
{/* Section Header */}
|
||||||
<div className="text-center mb-16">
|
<div className="text-center mb-16">
|
||||||
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
||||||
universal compatibility
|
mcp is the socket
|
||||||
</p>
|
</p>
|
||||||
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
||||||
works everywhere
|
plug into the toolspace
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-base text-foreground-secondary max-w-xl mx-auto font-sans">
|
<p className="text-base text-foreground-secondary max-w-xl mx-auto font-sans">
|
||||||
Use TPMJS tools with any MCP-compatible AI client. One URL, instant access.
|
Any MCP client becomes a window into the infinite toolspace. One URL unlocks
|
||||||
|
everything.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -422,7 +430,7 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
{/* Code Example - Fieldset Style */}
|
{/* Code Example - Fieldset Style */}
|
||||||
<fieldset className="border border-dashed border-border p-8 max-w-2xl mx-auto">
|
<fieldset className="border border-dashed border-border p-8 max-w-2xl mx-auto">
|
||||||
<legend className="font-mono text-sm text-foreground-secondary px-3 lowercase">
|
<legend className="font-mono text-sm text-foreground-secondary px-3 lowercase">
|
||||||
quick start
|
connect to the toolspace
|
||||||
</legend>
|
</legend>
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<p className="font-mono text-xs text-foreground-tertiary uppercase tracking-wider mb-2">
|
<p className="font-mono text-xs text-foreground-tertiary uppercase tracking-wider mb-2">
|
||||||
|
|
@ -458,8 +466,8 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
<div className="flex items-center gap-3 pt-4 border-t border-dashed border-border">
|
<div className="flex items-center gap-3 pt-4 border-t border-dashed border-border">
|
||||||
<div className="w-2 h-2 bg-success rounded-full animate-pulse" />
|
<div className="w-2 h-2 bg-success rounded-full animate-pulse" />
|
||||||
<p className="font-mono text-xs text-foreground-secondary">
|
<p className="font-mono text-xs text-foreground-secondary">
|
||||||
add to config → instant access to{' '}
|
one url → infinite toolspace →{' '}
|
||||||
<span className="text-primary font-medium">170+ tools</span>
|
<span className="text-primary font-medium">tools load on-demand</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
@ -471,11 +479,11 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
<Container size="xl" padding="lg">
|
<Container size="xl" padding="lg">
|
||||||
<div className="text-center max-w-3xl mx-auto">
|
<div className="text-center max-w-3xl mx-auto">
|
||||||
<h2 className="text-3xl md:text-4xl font-bold mb-4 text-foreground">
|
<h2 className="text-3xl md:text-4xl font-bold mb-4 text-foreground">
|
||||||
Publish Your AI Tool
|
Join the Infinite Toolspace
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-lg text-foreground-secondary mb-8">
|
<p className="text-lg text-foreground-secondary mb-8">
|
||||||
Share your tool with the AI community. Automatic discovery, quality scoring, and
|
Publish to npm, reach every agent. Your tool becomes discoverable to any AI that
|
||||||
integration with Vercel AI SDK, LangChain, and more.
|
needs it, without manual integration.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Generator Highlight Box */}
|
{/* Generator Highlight Box */}
|
||||||
|
|
@ -486,11 +494,11 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h3 className="text-xl font-bold mb-2 text-foreground">
|
<h3 className="text-xl font-bold mb-2 text-foreground">
|
||||||
Start with Our Package Generator
|
One Command. Infinite Reach.
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-foreground-secondary mb-4">
|
<p className="text-sm text-foreground-secondary mb-4">
|
||||||
Create a production-ready TPMJS tool package in seconds with our CLI
|
Generate a production-ready tool package in seconds. Once published, your tool
|
||||||
generator. Includes 2-3 tools, complete setup, and best practices.
|
is discoverable by every agent in the toolspace.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row gap-3">
|
<div className="flex flex-col sm:flex-row gap-3">
|
||||||
<code className="text-sm bg-surface px-4 py-2 rounded text-foreground border border-border">
|
<code className="text-sm bg-surface px-4 py-2 rounded text-foreground border border-border">
|
||||||
|
|
@ -515,27 +523,27 @@ export default async function HomePage(): Promise<React.ReactElement> {
|
||||||
<div className="text-3xl mb-2" aria-hidden="true">
|
<div className="text-3xl mb-2" aria-hidden="true">
|
||||||
🚀
|
🚀
|
||||||
</div>
|
</div>
|
||||||
<h3 className="font-semibold mb-1 text-foreground">Quick Setup</h3>
|
<h3 className="font-semibold mb-1 text-foreground">Publish Once</h3>
|
||||||
<p className="text-sm text-foreground-secondary">
|
<p className="text-sm text-foreground-secondary">
|
||||||
Add one keyword to package.json and publish to NPM
|
Add one keyword. Publish to npm. Done.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<div className="text-3xl mb-2" aria-hidden="true">
|
<div className="text-3xl mb-2" aria-hidden="true">
|
||||||
⚡
|
⚡
|
||||||
</div>
|
</div>
|
||||||
<h3 className="font-semibold mb-1 text-foreground">Auto Discovery</h3>
|
<h3 className="font-semibold mb-1 text-foreground">Reach All Agents</h3>
|
||||||
<p className="text-sm text-foreground-secondary">
|
<p className="text-sm text-foreground-secondary">
|
||||||
Your tool appears on tpmjs.com within 15 minutes
|
Discoverable by every agent using the toolspace
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<div className="text-3xl mb-2" aria-hidden="true">
|
<div className="text-3xl mb-2" aria-hidden="true">
|
||||||
📊
|
📊
|
||||||
</div>
|
</div>
|
||||||
<h3 className="font-semibold mb-1 text-foreground">Quality Metrics</h3>
|
<h3 className="font-semibold mb-1 text-foreground">Surface Quality</h3>
|
||||||
<p className="text-sm text-foreground-secondary">
|
<p className="text-sm text-foreground-secondary">
|
||||||
Automatic scoring based on docs, downloads, and stars
|
Health checks and metrics help tools get discovered
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import { Badge } from '@tpmjs/ui/Badge/Badge';
|
import { Badge } from '@tpmjs/ui/Badge/Badge';
|
||||||
import { Button } from '@tpmjs/ui/Button/Button';
|
import { Button } from '@tpmjs/ui/Button/Button';
|
||||||
import { Container } from '@tpmjs/ui/Container/Container';
|
import { Container } from '@tpmjs/ui/Container/Container';
|
||||||
|
import type { IconName } from '@tpmjs/ui/Icon/Icon';
|
||||||
import { Icon } from '@tpmjs/ui/Icon/Icon';
|
import { Icon } from '@tpmjs/ui/Icon/Icon';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
|
||||||
|
|
@ -11,20 +12,26 @@ import Link from 'next/link';
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
interface FeatureCardProps {
|
interface FeatureCardProps {
|
||||||
icon: string;
|
icon: IconName;
|
||||||
title: string;
|
title: string;
|
||||||
description: string;
|
description: string;
|
||||||
badge?: string;
|
badge?: string;
|
||||||
href?: string;
|
href?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FeatureCard({ icon, title, description, badge, href }: FeatureCardProps): React.ReactElement {
|
function FeatureCard({
|
||||||
|
icon,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
badge,
|
||||||
|
href,
|
||||||
|
}: FeatureCardProps): React.ReactElement {
|
||||||
const content = (
|
const content = (
|
||||||
<div className="group h-full p-6 border border-dashed border-border bg-surface hover:border-primary hover:bg-primary/5 transition-all duration-200">
|
<div className="group h-full p-6 border border-dashed border-border bg-surface hover:border-primary hover:bg-primary/5 transition-all duration-200">
|
||||||
{/* Icon */}
|
{/* Icon */}
|
||||||
<div className="w-12 h-12 flex items-center justify-center mb-4 border border-dashed border-border bg-background group-hover:border-primary group-hover:bg-primary/10 transition-all duration-200">
|
<div className="w-12 h-12 flex items-center justify-center mb-4 border border-dashed border-border bg-background group-hover:border-primary group-hover:bg-primary/10 transition-all duration-200">
|
||||||
<Icon
|
<Icon
|
||||||
icon={icon as any}
|
icon={icon}
|
||||||
size="md"
|
size="md"
|
||||||
className="text-foreground-secondary group-hover:text-primary transition-colors duration-200"
|
className="text-foreground-secondary group-hover:text-primary transition-colors duration-200"
|
||||||
/>
|
/>
|
||||||
|
|
@ -61,28 +68,34 @@ function FeatureCard({ icon, title, description, badge, href }: FeatureCardProps
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
export function FeaturesSection(): React.ReactElement {
|
export function FeaturesSection(): React.ReactElement {
|
||||||
const features = [
|
const features: Array<{
|
||||||
|
icon: IconName;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
badge: string;
|
||||||
|
href?: string;
|
||||||
|
}> = [
|
||||||
{
|
{
|
||||||
icon: 'search',
|
icon: 'search',
|
||||||
title: 'tool registry',
|
title: 'semantic retrieval',
|
||||||
description:
|
description:
|
||||||
'Browse 1M+ AI tools from npm. Auto-discovered within minutes of publication with quality scoring and health monitoring.',
|
'Agent describes what it needs, TPMJS returns the right tools. Selection at scale through semantic search and quality scoring.',
|
||||||
badge: 'auto-sync',
|
badge: 'core',
|
||||||
href: '/tool/tool-search',
|
href: '/tool/tool-search',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'puzzle',
|
icon: 'puzzle',
|
||||||
title: 'omega agent',
|
title: 'omega agent',
|
||||||
description:
|
description:
|
||||||
'Chat with an AI that dynamically discovers and executes tools based on your requests. No configuration needed.',
|
'See toolspace virtualization in action. Omega discovers and executes from 1M+ tools on-demand. No pre-configuration.',
|
||||||
badge: 'live',
|
badge: 'demo',
|
||||||
href: '/omega',
|
href: '/omega',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'folder',
|
icon: 'folder',
|
||||||
title: 'collections',
|
title: 'collections',
|
||||||
description:
|
description:
|
||||||
'Curate tool sets for specific use cases. Add test scenarios to validate behavior and generate living documentation.',
|
'Curate domain-specific toolsets. Collections become instant MCP servers with stable URLs and progressive tool loading.',
|
||||||
badge: 'shareable',
|
badge: 'shareable',
|
||||||
href: '/collections',
|
href: '/collections',
|
||||||
},
|
},
|
||||||
|
|
@ -90,7 +103,7 @@ export function FeaturesSection(): React.ReactElement {
|
||||||
icon: 'user',
|
icon: 'user',
|
||||||
title: 'custom agents',
|
title: 'custom agents',
|
||||||
description:
|
description:
|
||||||
'Build AI agents with your choice of LLM, custom prompts, and curated tool collections. Share publicly or keep private.',
|
'Build agents with any LLM and custom prompts. The toolspace scales independently of agent complexity.',
|
||||||
badge: 'unlimited',
|
badge: 'unlimited',
|
||||||
href: '/agents',
|
href: '/agents',
|
||||||
},
|
},
|
||||||
|
|
@ -98,22 +111,22 @@ export function FeaturesSection(): React.ReactElement {
|
||||||
icon: 'link',
|
icon: 'link',
|
||||||
title: 'mcp protocol',
|
title: 'mcp protocol',
|
||||||
description:
|
description:
|
||||||
'Works with Claude Desktop, Cursor, Windsurf, and any MCP-compatible client. One URL, instant access to all tools.',
|
'MCP is the socket. TPMJS is the operating system. Works with Claude, Cursor, Windsurf, and any MCP client.',
|
||||||
badge: 'universal',
|
badge: 'universal',
|
||||||
href: '/integrations',
|
href: '/integrations',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'key',
|
icon: 'key',
|
||||||
title: 'secure execution',
|
title: 'sandboxed execution',
|
||||||
description:
|
description:
|
||||||
'Every tool runs in an isolated sandbox with rate limiting and timeout handling. Your credentials are encrypted at rest.',
|
'Every tool runs isolated with timeouts and rate limits. npm is storage, TPMJS is the secure runtime.',
|
||||||
badge: 'sandboxed',
|
badge: 'secure',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'checkCircle',
|
icon: 'checkCircle',
|
||||||
title: 'test scenarios',
|
title: 'quality signals',
|
||||||
description:
|
description:
|
||||||
'AI-generated test scenarios validate tool behavior. Track pass rates, execution times, and quality scores.',
|
'Health checks, test scenarios, and usage metrics. Surface the best tools from the infinite toolspace.',
|
||||||
badge: 'automated',
|
badge: 'automated',
|
||||||
href: '/scenarios',
|
href: '/scenarios',
|
||||||
},
|
},
|
||||||
|
|
@ -121,15 +134,15 @@ export function FeaturesSection(): React.ReactElement {
|
||||||
icon: 'message',
|
icon: 'message',
|
||||||
title: 'living skills',
|
title: 'living skills',
|
||||||
description:
|
description:
|
||||||
'Documentation that evolves from real usage. Skills emerge from question patterns and proven behaviors.',
|
'Documentation emerges from real usage. Tools teach agents how to use them through proven patterns.',
|
||||||
badge: 'new',
|
badge: 'evolving',
|
||||||
href: '/docs/skills',
|
href: '/docs/skills',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'terminal',
|
icon: 'terminal',
|
||||||
title: 'developer sdk',
|
title: 'publish once',
|
||||||
description:
|
description:
|
||||||
'Publish tools with one keyword. Full TypeScript support, Vercel AI SDK integration, and automatic schema extraction.',
|
'Add one keyword to package.json. Your tool joins the infinite toolspace within minutes. Zero configuration.',
|
||||||
badge: 'npm',
|
badge: 'npm',
|
||||||
href: '/publish',
|
href: '/publish',
|
||||||
},
|
},
|
||||||
|
|
@ -141,14 +154,14 @@ export function FeaturesSection(): React.ReactElement {
|
||||||
{/* Section Header */}
|
{/* Section Header */}
|
||||||
<div className="text-center mb-16">
|
<div className="text-center mb-16">
|
||||||
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
||||||
platform capabilities
|
toolspace virtualization
|
||||||
</p>
|
</p>
|
||||||
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
||||||
everything you need
|
the retrieval layer
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-base text-foreground-secondary max-w-2xl mx-auto font-sans">
|
<p className="text-base text-foreground-secondary max-w-2xl mx-auto font-sans">
|
||||||
From discovery to execution, TPMJS provides the complete infrastructure for AI tool
|
npm stores the tools. TPMJS retrieves the right ones. Agents get infinite capabilities
|
||||||
development and deployment.
|
without infinite context windows.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,14 +62,19 @@ export function HeroSection({ stats }: HeroSectionProps): React.ReactElement {
|
||||||
{/* Main Heading */}
|
{/* Main Heading */}
|
||||||
<div className="max-w-7xl">
|
<div className="max-w-7xl">
|
||||||
<h1
|
<h1
|
||||||
className="mb-8 font-bold leading-none tracking-tight text-foreground"
|
className="mb-4 font-bold leading-none tracking-tight text-foreground"
|
||||||
style={{ fontSize: 'clamp(48px, 10vw, 96px)' }}
|
style={{ fontSize: 'clamp(48px, 10vw, 96px)' }}
|
||||||
>
|
>
|
||||||
THE NPM FOR AI TOOLS
|
INFINITE TOOLSPACE
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
{/* Tagline */}
|
||||||
|
<p className="mb-8 font-mono text-lg md:text-xl text-brutalist-accent uppercase tracking-wide">
|
||||||
|
A million tools. Zero configuration.
|
||||||
|
</p>
|
||||||
|
|
||||||
{/* Live Metrics Strip */}
|
{/* Live Metrics Strip */}
|
||||||
<div className="mb-12 flex flex-wrap items-center gap-3 border-l-[6px] border-brutalist-accent pl-6 font-mono text-base md:text-lg font-bold uppercase tracking-wider">
|
<div className="mb-10 flex flex-wrap items-center gap-3 border-l-[6px] border-foreground/20 pl-6 font-mono text-base md:text-lg font-bold uppercase tracking-wider">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="text-foreground">{formatNumber(stats.packageCount)}</span>
|
<span className="text-foreground">{formatNumber(stats.packageCount)}</span>
|
||||||
<span className="text-foreground-secondary">PACKAGES</span>
|
<span className="text-foreground-secondary">PACKAGES</span>
|
||||||
|
|
@ -79,12 +84,17 @@ export function HeroSection({ stats }: HeroSectionProps): React.ReactElement {
|
||||||
<span className="text-foreground">{formatNumber(stats.toolCount)}</span>
|
<span className="text-foreground">{formatNumber(stats.toolCount)}</span>
|
||||||
<span className="text-foreground-secondary">TOOLS</span>
|
<span className="text-foreground-secondary">TOOLS</span>
|
||||||
</div>
|
</div>
|
||||||
|
<span className="text-foreground-tertiary">/</span>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="text-foreground">1M+</span>
|
||||||
|
<span className="text-foreground-secondary">ON NPM</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Subheading */}
|
{/* Subheading */}
|
||||||
<p className="mb-12 max-w-3xl text-xl md:text-2xl font-medium leading-relaxed text-foreground-secondary tracking-tight">
|
<p className="mb-12 max-w-3xl text-xl md:text-2xl font-medium leading-relaxed text-foreground-secondary tracking-tight">
|
||||||
Discover and use npm packages as AI agent tools. Works with Claude, GPT, LangChain, and
|
Any agent can use a million tools without loading a million tools. TPMJS is the
|
||||||
any MCP-compatible client.
|
retrieval layer between npm and AI agents.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Brutalist Search Interface */}
|
{/* Brutalist Search Interface */}
|
||||||
|
|
|
||||||
107
apps/web/src/components/home/ToolspaceSection.tsx
Normal file
107
apps/web/src/components/home/ToolspaceSection.tsx
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
'use client';
|
||||||
|
|
||||||
|
import { Container } from '@tpmjs/ui/Container/Container';
|
||||||
|
import type { IconName } from '@tpmjs/ui/Icon/Icon';
|
||||||
|
import { Icon } from '@tpmjs/ui/Icon/Icon';
|
||||||
|
|
||||||
|
const stages: Array<{
|
||||||
|
number: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
icon: IconName;
|
||||||
|
color: string;
|
||||||
|
}> = [
|
||||||
|
{
|
||||||
|
number: '01',
|
||||||
|
title: 'npm stores everything',
|
||||||
|
description: '1M+ packages. Every tool ever published. Too many for any context window.',
|
||||||
|
icon: 'box',
|
||||||
|
color: 'text-foreground-tertiary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: '02',
|
||||||
|
title: 'TPMJS retrieves what matters',
|
||||||
|
description:
|
||||||
|
'Semantic search + quality signals surface the right tools for any task. Selection at scale.',
|
||||||
|
icon: 'search',
|
||||||
|
color: 'text-primary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: '03',
|
||||||
|
title: 'Agent uses what it needs',
|
||||||
|
description:
|
||||||
|
'Progressive disclosure. Tools load on-demand. Infinite capabilities, finite tokens.',
|
||||||
|
icon: 'puzzle',
|
||||||
|
color: 'text-brutalist-accent',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export function ToolspaceSection(): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<section className="py-20 bg-surface border-t border-border">
|
||||||
|
<Container size="xl" padding="lg">
|
||||||
|
{/* Section Header */}
|
||||||
|
<div className="text-center mb-16">
|
||||||
|
<p className="font-mono text-xs text-primary uppercase tracking-widest mb-3">
|
||||||
|
how it works
|
||||||
|
</p>
|
||||||
|
<h2 className="font-mono text-3xl md:text-4xl font-semibold mb-4 text-foreground lowercase">
|
||||||
|
toolspace virtualization
|
||||||
|
</h2>
|
||||||
|
<p className="text-base text-foreground-secondary max-w-2xl mx-auto font-sans">
|
||||||
|
Use a million tools without loading a million tools. TPMJS is the retrieval layer
|
||||||
|
between npm and your agent.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Pipeline Visualization */}
|
||||||
|
<div className="max-w-4xl mx-auto">
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 md:gap-4">
|
||||||
|
{stages.map((stage, index) => (
|
||||||
|
<div key={stage.number} className="relative">
|
||||||
|
{/* Connector Line (hidden on mobile, between cards on desktop) */}
|
||||||
|
{index < stages.length - 1 && (
|
||||||
|
<div className="hidden md:block absolute top-1/2 -right-2 w-4 h-[2px] bg-border" />
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="p-6 border border-dashed border-border bg-background h-full">
|
||||||
|
{/* Stage Number */}
|
||||||
|
<div className="flex items-center gap-4 mb-4">
|
||||||
|
<span className={`font-mono text-3xl font-bold ${stage.color}`}>
|
||||||
|
{stage.number}
|
||||||
|
</span>
|
||||||
|
<div
|
||||||
|
className={`w-10 h-10 flex items-center justify-center border border-dashed border-border ${stage.color}`}
|
||||||
|
>
|
||||||
|
<Icon icon={stage.icon} size="sm" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Content */}
|
||||||
|
<h3 className="font-mono text-lg font-semibold text-foreground mb-2 lowercase">
|
||||||
|
{stage.title}
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-foreground-secondary leading-relaxed">
|
||||||
|
{stage.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom Tagline */}
|
||||||
|
<div className="mt-12 text-center">
|
||||||
|
<div className="inline-flex items-center gap-4 px-6 py-4 border border-dashed border-primary bg-primary/5">
|
||||||
|
<Icon icon="star" size="md" className="text-primary" />
|
||||||
|
<p className="font-mono text-sm text-foreground">
|
||||||
|
<span className="text-primary font-semibold">npm</span> is storage.{' '}
|
||||||
|
<span className="text-primary font-semibold">TPMJS</span> is the operating system
|
||||||
|
for tool access.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue