diff --git a/next.config.mjs b/next.config.mjs index 219f24d..3b14852 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -6,6 +6,9 @@ const withMDX = createMDX(); const config = { output: 'export', reactStrictMode: true, + images: { + unoptimized: true, + }, }; export default withMDX(config); diff --git a/public/assets/hero-demo.mp4 b/public/assets/hero-demo.mp4 new file mode 100644 index 0000000..0aaa609 Binary files /dev/null and b/public/assets/hero-demo.mp4 differ diff --git a/public/assets/hero-poster.png b/public/assets/hero-poster.png new file mode 100644 index 0000000..e22fb65 Binary files /dev/null and b/public/assets/hero-poster.png differ diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 6a93521..cb14227 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -1,60 +1,73 @@ import Link from 'next/link'; -import { - Blocks, - Palette, - ShieldCheck, - Package, - Code, - ArrowRight, - LayoutGrid, -} from 'lucide-react'; +import type { Metadata } from 'next'; +import { Package, ArrowRight, LayoutGrid } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; -import { Card, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; -import { CopyCommand } from '@/components/copy-command'; +import { FaqAccordion } from '@/components/faq-accordion'; +import { InstallTabs } from '@/components/install-tabs'; import { pubDevUrl, showcaseUrl } from '@/lib/shared'; -const features = [ +export const metadata: Metadata = { + alternates: { canonical: '/' }, + openGraph: { images: '/og/home' }, + twitter: { images: '/og/home' }, +}; + +const installCommands = [ + { label: 'Flutter', command: 'flutter pub add fossui' }, { - icon: Package, - title: 'One import', - description: 'A full set of components from a single package. No per-widget imports.', + label: 'MCP', + command: 'claude mcp add --transport http fossui https://mcp.fossui.org/mcp', }, + { label: 'AI Skill', command: 'npx skills add fossui/ai' }, +]; + +const faqs = [ { - icon: Palette, - title: 'Themed', - description: 'A single FossThemeData drives color, type, radius, spacing, and motion.', + question: 'Does fossui lock me into MaterialApp or any app shell?', + answer: + 'No wrapper lock-in. FossTheme drops into any app, and context.fossTheme resolves identically under MaterialApp, CupertinoApp, or a bare WidgetsApp.', }, { - icon: Blocks, - title: 'Framework agnostic', - description: 'Works under MaterialApp, CupertinoApp, or a bare WidgetsApp.', + question: 'How lightweight is fossui?', + answer: + 'One runtime dependency, around 314 KB. Pure Dart, no native code, no bundled icon package.', }, { - icon: ShieldCheck, - title: 'Accessible', - description: 'Semantics, focus, and contrast built in, sized for touch.', + question: 'Does fossui work with AI coding assistants over MCP?', + answer: + 'Yes. The fossui MCP server at mcp.fossui.org works with any MCP client over Streamable HTTP, not just Claude Code. It serves the exact component API so an assistant looks up the real API instead of guessing it.', }, { - icon: Code, - title: 'Pure Dart', - description: 'No native code, one tiny dependency. Nothing else to pull in.', - wide: true, + question: 'Is there an AI coding skill for fossui?', + answer: + 'Yes. Install it with npx skills add fossui/ai, not just for Claude Code, it installs across many AI coding agents. It carries the same idioms as the MCP server so AI-written fossui code compiles and stays on-theme on the first try.', }, ]; +const faqJsonLd = { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: faqs.map((faq) => ({ + '@type': 'Question', + name: faq.question, + acceptedAnswer: { '@type': 'Answer', text: faq.answer }, + })), +}; + export default function HomePage() { return ( -
-
-
- Open source, MIT - v0.1.0 -
-

fossui

-

- A Flutter UI kit themed from one source. Framework-agnostic, - accessible, one import. +

+ {/* Hero: text-only for v1, no placeholder image */} +
+ Open source, MIT +

+ A Flutter UI kit with its own identity. +

+

+ A minimal, lightweight Flutter component set for developers tired of every + app looking like Material. Drops into any Flutter app, no heavy + dependencies.

- + +

+ Design inspired by coss.com/ui, Cal.com's design system: a clean, + minimal, modern web aesthetic. +

+
-
- {features.map((f) => ( - - -
- -
-
- {f.title} - - {f.description} - -
-
-
- ))} + {/* FAQ: answers the queries people actually search or ask a chatbot */} +
+ + +