feat: initialize Next.js 16 project with TypeScript and Tailwind CSS 4

Set up complete Next.js 16 development environment:
- Next.js 16.0.1 with App Router and Turbopack
- React 19.2.0 with TypeScript 5.9
- Tailwind CSS 4.1.17 with custom category colors
- ESLint 9 with Next.js config
- Static site generation enabled (output: 'export')

Project structure:
- app/ directory with layout, page, and globals.css
- Tailwind config with 23 category-specific colors
- TypeScript config with strict mode and path aliases
- Complete .gitignore for Next.js projects

Dependencies installed:
- convert-units 2.3.4 for unit conversions
- All React 19 and Next.js 16 dependencies
- Development tooling (TypeScript, ESLint, Tailwind)

Ready for Phase 2: Core conversion engine implementation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-08 09:21:56 +01:00
parent 5c0b8d668e
commit 48b75b9755
11 changed files with 4129 additions and 0 deletions

3
.eslintrc.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}

43
.gitignore vendored Normal file
View File

@@ -0,0 +1,43 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
# turbopack
.turbo

83
README.md Normal file
View File

@@ -0,0 +1,83 @@
# Unit Converter
A spectacular, innovative unit conversion application built with modern web technologies to provide the best user experience for converting between various measurement units.
## Tech Stack
- **Next.js 16** - React framework with App Router and static export
- **TypeScript** - Type-safe development
- **Tailwind CSS 4** - Modern utility-first CSS framework
- **convert-units** - Comprehensive unit conversion library
## Features
### Supported Units
23 measurement categories with 187 individual units:
- Angle, Apparent Power, Area, Current, Digital
- Each, Energy, Frequency, Illuminance, Length
- Mass, Pace, Parts Per, Power, Pressure
- Reactive Energy, Reactive Power, Speed, Temperature
- Time, Voltage, Volume, Volume Flow Rate
### Innovative UX Features
- Real-time bidirectional conversion
- Smart context-aware interface with fuzzy search
- Visual comparison with color-coded categories
- Keyboard shortcuts for power users
- Mobile-first responsive design
- Conversion history with localStorage
- Dark mode support
## Getting Started
### Prerequisites
- Node.js 18+ or 20+
- pnpm (recommended) or npm
### Installation
```bash
# Install dependencies
pnpm install
# Run development server
pnpm dev
# Build for production
pnpm build
# Start production server
pnpm start
```
Open [http://localhost:3000](http://localhost:3000) to see the app.
## Project Structure
```
units-ui/
├── app/ # Next.js App Router
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Home page
│ └── globals.css # Global styles
├── components/ # React components (coming soon)
├── lib/ # Utility functions (coming soon)
├── public/ # Static assets
└── IMPLEMENTATION_PLAN.md # Detailed implementation plan
```
## Development
See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for the complete development roadmap.
## License
MIT
---
Built with Next.js 16, Tailwind CSS 4, and convert-units

1
app/globals.css Normal file
View File

@@ -0,0 +1 @@
@import "tailwindcss";

21
app/layout.tsx Normal file
View File

@@ -0,0 +1,21 @@
import type { Metadata } from 'next';
import './globals.css';
export const metadata: Metadata = {
title: 'Unit Converter - Convert Any Unit Instantly',
description: 'A spectacular, innovative unit conversion app supporting 23 measurement categories with 187 units. Real-time conversion with the best UX.',
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body className="antialiased">
{children}
</body>
</html>
);
}

24
app/page.tsx Normal file
View File

@@ -0,0 +1,24 @@
export default function Home() {
return (
<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800">
<main className="container mx-auto px-4 py-8">
<div className="max-w-4xl mx-auto">
<header className="text-center mb-12">
<h1 className="text-5xl font-bold mb-4 bg-gradient-to-r from-blue-600 to-indigo-600 bg-clip-text text-transparent">
Unit Converter
</h1>
<p className="text-lg text-gray-600 dark:text-gray-300">
Convert between 187 units across 23 measurement categories
</p>
</header>
<div className="bg-white dark:bg-gray-800 rounded-2xl shadow-2xl p-8">
<p className="text-center text-gray-500 dark:text-gray-400">
Coming soon: Real-time bidirectional conversion with innovative UX
</p>
</div>
</div>
</main>
</div>
);
}

8
next.config.ts Normal file
View File

@@ -0,0 +1,8 @@
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
output: 'export',
reactStrictMode: true,
};
export default nextConfig;

26
package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "units-ui",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0",
"next": "^16.0.0",
"convert-units": "^2.3.4"
},
"devDependencies": {
"typescript": "^5",
"@types/node": "^22",
"@types/react": "^19",
"@types/react-dom": "^19",
"tailwindcss": "^4.0.0",
"eslint": "^9",
"eslint-config-next": "^16.0.0"
}
}

3849
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

44
tailwind.config.ts Normal file
View File

@@ -0,0 +1,44 @@
import type { Config } from 'tailwindcss';
const config: Config = {
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {
colors: {
// Category colors for 23 unit types
category: {
angle: '#0EA5E9',
'apparent-power': '#8B5CF6',
area: '#F59E0B',
current: '#F59E0B',
digital: '#06B6D4',
each: '#64748B',
energy: '#EAB308',
frequency: '#A855F7',
illuminance: '#84CC16',
length: '#3B82F6',
mass: '#10B981',
pace: '#14B8A6',
'parts-per': '#EC4899',
power: '#F43F5E',
pressure: '#6366F1',
'reactive-energy': '#D946EF',
'reactive-power': '#E879F9',
speed: '#10B981',
temperature: '#EF4444',
time: '#7C3AED',
voltage: '#FB923C',
volume: '#8B5CF6',
'volume-flow-rate': '#22D3EE',
},
},
},
},
plugins: [],
};
export default config;

27
tsconfig.json Normal file
View File

@@ -0,0 +1,27 @@
{
"compilerOptions": {
"target": "ES2020",
"lib": ["DOM", "DOM.Iterable", "ES2020"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "ESNext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}