diff --git a/.eslintrc.json b/.eslintrc.json index 4cd83ec..8f4ed9d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": ["next/core-web-vitals"], + "extends": ["next/core-web-vitals", "next/typescript"], "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" @@ -10,5 +10,15 @@ "node": true, "jest": true }, - "rules": {} + "rules": {}, + "ignorePatterns": [ + "node_modules/", + ".next/", + "out/", + "build/", + "dist/", + "coverage/", + "*.config.js", + "*.config.mjs" + ] } diff --git a/src/app/landing.css b/src/app/landing.css new file mode 100644 index 0000000..79fe82c --- /dev/null +++ b/src/app/landing.css @@ -0,0 +1,343 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap'); + +:root { + --purple: #8B5CF6; + --amber: #F59E0B; + --bg: #0F172A; + --surface: #1E293B; + --border: #334155; + --text: #F1F5F9; + --text-secondary: #CBD5E1; + --text-tertiary: #94A3B8; +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; + color: var(--text); + background: var(--bg); + line-height: 1.5; + margin: 0; + padding: 0; +} + +.landing-container { + max-width: 1280px; + margin: 0 auto; + padding: 0 32px; +} + +/* Header */ +.landing-header { + padding: 24px 0; + border-bottom: 1px solid var(--border); + background: rgba(15, 23, 42, 0.8); + backdrop-filter: blur(10px); + position: sticky; + top: 0; + z-index: 100; +} + +.landing-nav { + display: flex; + justify-content: space-between; + align-items: center; +} + +.landing-logo { + display: flex; + align-items: center; + gap: 12px; + font-size: 20px; + font-weight: 700; + color: var(--text); + text-decoration: none; +} + +.logo-mark { + width: 32px; + height: 32px; + background: linear-gradient(135deg, var(--purple) 0%, var(--amber) 100%); + border-radius: 6px; +} + +.nav-links { + display: flex; + gap: 32px; + list-style: none; + margin: 0; + padding: 0; +} + +.nav-links a { + color: var(--text-secondary); + text-decoration: none; + font-weight: 500; + transition: color 0.2s; +} + +.nav-links a:hover { + color: var(--text); +} + +.btn { + padding: 12px 24px; + border-radius: 8px; + font-weight: 600; + font-size: 16px; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; + display: inline-block; + border: none; +} + +.btn-primary { + background: var(--purple); + color: white; +} + +.btn-primary:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(139, 92, 246, 0.4); +} + +/* Hero */ +.hero { + padding: 100px 0; + position: relative; +} + +.hero-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 60px; + align-items: center; +} + +.hero-content h1 { + font-size: 48px; + line-height: 1.2; + font-weight: 700; + letter-spacing: -0.02em; + margin-bottom: 20px; +} + +.gradient-text { + background: linear-gradient(135deg, var(--purple) 0%, var(--amber) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.hero-content p { + font-size: 18px; + color: var(--text-secondary); + margin-bottom: 32px; + line-height: 1.6; +} + +.stats { + display: flex; + gap: 32px; + margin-top: 40px; +} + +.stat { + border-left: 2px solid var(--purple); + padding-left: 16px; +} + +.stat-number { + font-size: 32px; + font-weight: 700; + color: var(--purple); + display: block; +} + +.stat-label { + font-size: 14px; + color: var(--text-secondary); +} + +/* Terminal */ +.terminal { + background: #0A0F1E; + border: 1px solid var(--border); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3); +} + +.terminal-header { + background: #1A1F2E; + padding: 12px 16px; + border-bottom: 1px solid var(--border); + display: flex; + align-items: center; + gap: 8px; +} + +.terminal-dot { + width: 12px; + height: 12px; + border-radius: 50%; +} + +.dot-red { background: #EF4444; } +.dot-yellow { background: #F59E0B; } +.dot-green { background: #10B981; } + +.terminal-body { + padding: 24px; + font-family: 'JetBrains Mono', monospace; + font-size: 14px; + line-height: 1.8; +} + +.terminal-line { + margin-bottom: 8px; +} + +.prompt { + color: #10B981; +} + +.command { + color: #F59E0B; +} + +.output { + color: #94A3B8; +} + +.success { + color: #10B981; +} + +/* Features */ +.features { + padding: 80px 0; +} + +.features h2 { + text-align: center; + font-size: 36px; + font-weight: 700; + margin-bottom: 16px; +} + +.features-subtitle { + text-align: center; + color: var(--text-secondary); + font-size: 18px; + margin-bottom: 60px; +} + +.tech-stack { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 24px; + margin-top: 60px; +} + +.tech-item { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 20px; + text-align: center; +} + +.tech-item h4 { + font-size: 16px; + font-weight: 600; + margin-bottom: 8px; +} + +.tech-item p { + font-size: 14px; + color: var(--text-secondary); + margin: 0; +} + +/* Comparison */ +.comparison { + padding: 80px 0; + background: var(--surface); +} + +.comparison h2 { + text-align: center; + font-size: 36px; + font-weight: 700; + margin-bottom: 60px; +} + +.comparison-table { + max-width: 900px; + margin: 0 auto; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 12px; + overflow: hidden; +} + +.comparison-row { + display: grid; + grid-template-columns: 2fr 1fr 1fr 1fr; + border-bottom: 1px solid var(--border); +} + +.comparison-row:last-child { + border-bottom: none; +} + +.comparison-header { + background: #1A1F2E; + font-weight: 600; +} + +.comparison-cell { + padding: 16px 20px; + border-right: 1px solid var(--border); +} + +.comparison-cell:last-child { + border-right: none; +} + +.check { + color: #10B981; + font-weight: 600; +} + +.cross { + color: #EF4444; +} + +/* Footer */ +.landing-footer { + padding: 60px 0; + text-align: center; + border-top: 1px solid var(--border); +} + +.landing-footer p { + color: var(--text-secondary); + margin: 0; +} + +@media (max-width: 768px) { + .hero-grid { + grid-template-columns: 1fr; + } + + .tech-stack { + grid-template-columns: 1fr 1fr; + } + + .comparison-row { + grid-template-columns: 1.5fr 1fr 1fr 1fr; + font-size: 14px; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d54a1f2..e41698f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,11 +1,9 @@ import './globals.css'; import type { Metadata } from 'next/types'; -import { Header } from '@/components/Header'; -import { SearchPalette } from '@/components/SearchPalette'; export const metadata: Metadata = { - title: 'EmberDocs', - description: 'Modern documentation framework with Git-native versioning and instant search.' + title: 'EmberDocs - Build docs that developers actually use', + description: 'Zero-config documentation framework for indie developers. Beautiful, fast, and maintainable.' }; export default function RootLayout({ @@ -23,20 +21,8 @@ export default function RootLayout({ rel="stylesheet" /> - -
- -
- {children} -
- - - - + + {children} ); diff --git a/src/app/page.tsx b/src/app/page.tsx index e1b151b..7cc41bd 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,160 +1,164 @@ -import Link from 'next/link'; -import { EMBERDOCS_BASE_ROUTE } from '@/lib/config'; - -const stats = [ - { number: '<50ms', label: 'Search latency' }, - { number: '30s', label: 'Setup time' }, - { number: '100%', label: 'Free OSS' }, -]; - -const techStack = [ - { name: 'Next.js 14', description: 'App Router, Edge Functions' }, - { name: 'TypeScript', description: 'Full type safety' }, - { name: 'FlexSearch', description: 'Client-side, <50ms' }, - { name: 'Tailwind CSS', description: 'Utility-first styling' }, -]; +import './landing.css'; export default function HomePage() { return ( -
- {/* Hero Section */} -
-
- {/* Hero Content */} -
-

- Build docs that
- - developers actually use - -

-

- Zero-config documentation framework for indie developers. Beautiful, fast, and maintainable. Deploy in 30 seconds, customize when you need to. -

- - npx emberdocs init → - - {/* Stats */} -
- {stats.map((stat, idx) => ( -
-
- {stat.number} + <> +
+ +
+ +
+
+
+
+
+

+ Build docs that
+ developers actually use +

+

+ Zero-config documentation framework for indie developers. + Beautiful, fast, and maintainable. Deploy in 30 seconds, + customize when you need to. +

+ npx emberdocs init → + +
+
+ <50ms + Search latency
-
- {stat.label} +
+ 30s + Setup time +
+
+ 100% + Free OSS
- ))} -
-
- - {/* Terminal Demo */} -
-
-
-
-
-
-
-
- ${' '} - npx emberdocs init my-docs
-
Creating EmberDocs project...
-
✓ Created docs/ directory
-
✓ Generated example pages
-
✓ Installed dependencies
-
✓ Ready to go!
-

-
- ${' '} - cd my-docs &&{' '} - npm run dev + +
+
+
+
+
+
+
+
+ ${' '} + npx emberdocs init my-docs +
+
Creating EmberDocs project...
+
✓ Created docs/ directory
+
✓ Generated example pages
+
✓ Installed dependencies
+
✓ Ready to go!
+

+
+ ${' '} + cd my-docs &&{' '} + npm run dev +
+
Starting development server...
+
✓ Server running at http://localhost:3000
+
-
Starting development server...
-
✓ Server running at http://localhost:3000
-
-
- - {/* Features Section */} -
-

Built for developers

-

- Modern stack, zero complexity -

- - {/* Tech Stack */} -
- {techStack.map((tech, idx) => ( -
-

{tech.name}

-

{tech.description}

-
- ))} -
-
+
- {/* Comparison Section */} -
-
-

Why EmberDocs?

+
+
+

Built for developers

+

Modern stack, zero complexity

-
- {/* Table Header */} -
-
Feature
-
EmberDocs
-
Docusaurus
-
GitBook
-
- - {/* Table Rows */} -
-
Setup time
-
30 seconds
-
15 minutes
-
5 minutes
-
- -
-
Zero config
-
-
-
Partial
-
- -
-
Self-hosted (free)
-
-
-
+
+
+

Next.js 14

+

App Router, Edge Functions

+
+
+

TypeScript

+

Full type safety

+
+
+

FlexSearch

+

Client-side, <50ms

+
+
+

Tailwind CSS

+

Utility-first styling

+
+
+
-
-
Privacy-first
-
-
-
-
+
+
+

Why EmberDocs?

-
-
Drop-in integration
-
-
-
+
+
+
Feature
+
EmberDocs
+
Docusaurus
+
GitBook
+
+
+
Setup time
+
30 seconds
+
15 minutes
+
5 minutes
+
+
+
Zero config
+
+
+
Partial
+
+
+
Self-hosted (free)
+
+
+
+
+
+
Privacy-first
+
+
+
+
+
+
Drop-in integration
+
+
+
+
+
+
+ + + ); }