feat: scaffold Next.js 16 web app with Tailwind v4

Sets up apps/web with Next.js 16, React 19, Tailwind CSS v4 (postcss plugin
config, @import syntax), Jest + Testing Library, App Router layout and home page.
2/2 tests passing, build verified.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-27 14:34:00 +05:30
parent c1efde757d
commit fe8eaf75fb
12 changed files with 1553 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
@import "tailwindcss";
+15
View File
@@ -0,0 +1,15 @@
import type { Metadata } from 'next';
import './globals.css';
export const metadata: Metadata = {
title: 'Insignia TOWER',
description: 'Community Knowledge Infrastructure Platform',
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body className="bg-white text-gray-900 antialiased">{children}</body>
</html>
);
}
+14
View File
@@ -0,0 +1,14 @@
import { render, screen } from '@testing-library/react';
import Home from './page';
describe('Home page', () => {
it('renders the TOWER heading', () => {
render(<Home />);
expect(screen.getByRole('heading', { name: /insignia tower/i })).toBeInTheDocument();
});
it('renders the platform tagline', () => {
render(<Home />);
expect(screen.getByText(/community knowledge infrastructure/i)).toBeInTheDocument();
});
});
+8
View File
@@ -0,0 +1,8 @@
export default function Home() {
return (
<main className="flex min-h-screen flex-col items-center justify-center gap-4">
<h1 className="text-4xl font-bold tracking-tight">Insignia TOWER</h1>
<p className="text-lg text-gray-500">Community Knowledge Infrastructure Platform</p>
</main>
);
}
+9
View File
@@ -0,0 +1,9 @@
const nextJest = require('next/jest');
const createJestConfig = nextJest({ dir: './' });
module.exports = createJestConfig({
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
testEnvironment: 'jest-environment-jsdom',
testMatch: ['**/*.test.tsx', '**/*.test.ts'],
});
+1
View File
@@ -0,0 +1 @@
import '@testing-library/jest-dom';
+6
View File
@@ -0,0 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
+7
View File
@@ -0,0 +1,7 @@
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
transpilePackages: ['@tower/ui'],
};
export default nextConfig;
+32
View File
@@ -0,0 +1,32 @@
{
"name": "@tower/web",
"version": "0.0.1",
"scripts": {
"build": "next build",
"dev": "next dev --port 3000",
"start": "next start",
"test": "jest",
"lint": "next lint"
},
"dependencies": {
"@tower/types": "workspace:*",
"@tower/ui": "workspace:*",
"next": "^16.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.0.0",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^16.0.0",
"@types/node": "^22.0.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"jest": "^29.0.0",
"jest-environment-jsdom": "^29.0.0",
"postcss": "^8.0.0",
"tailwindcss": "^4.0.0",
"ts-jest": "^29.0.0",
"typescript": "^5.7.0"
}
}
+5
View File
@@ -0,0 +1,5 @@
module.exports = {
plugins: {
'@tailwindcss/postcss': {},
},
};
+41
View File
@@ -0,0 +1,41 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": [
"./*"
]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}