xiaohongshu
xiaohongshu
building-with-nextjs
Use when building web UIs with Next.js 15+ and React 19 - covers Server Components, App Router, testing with Vitest and Playwright, and accessibility standards
Full skill instructions
Modern web UI with Next.js 15+ (App Router) + React 19 (Server Components) + TypeScript (strict mode).
Extends configuring-javascript-stack with web-specific patterns.
pnpm add -D @playwright/test @axe-core/playwright
pnpm add -D @testing-library/react @testing-library/jest-dom jsdom
pnpm exec playwright install
app/ # Next.js App Router
├── page.tsx # Homepage
├── layout.tsx # Root layout
├── globals.css # Global styles
└── [route]/page.tsx # Additional pages
components/
├── layout/ # Nav, footer, container
├── sections/ # Hero, CTA, features
├── ui/ # Buttons, headings, cards
├── forms/ # Form components
└── providers/ # Context providers
lib/ # Utility functions
types/ # TypeScript definitions
public/ # Static assets
tests/
├── e2e/ # Playwright tests
└── components/ # Component tests
Server Components (default):
// app/page.tsx - Server Component
export default function HomePage() {
// Can use Node.js APIs, database queries
return <div>Server-rendered content</div>
}
Client Components (only when needed):
// components/ui/Button.tsx
'use client'
import { useState } from 'react'
export default function Button() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}
Component tests (Vitest + React Testing Library):
import { render, screen } from '@testing-library/react'
import { describe, it, expect } from 'vitest'
import Button from './Button'
describe('Button', () => {
it('renders with primary variant', () => {
render(<Button>Click me</Button>)
expect(screen.getByRole('button')).toBeInTheDocument()
})
})
E2E tests (Playwright):
import { test, expect } from '@playwright/test'
test('navigation works', async ({ page }) => {
await page.goto('/')
await page.click('text=About')
await expect(page).toHaveURL('/about')
})
Accessibility tests:
import AxeBuilder from '@axe-core/playwright'
test('homepage has no a11y violations', async ({ page }) => {
await page.goto('/')
const results = await new AxeBuilder({ page }).analyze()
expect(results.violations).toEqual([])
})
vitest.config.ts:
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
setupFiles: ['./tests/setup.ts'],
coverage: {
thresholds: { lines: 80, functions: 80, branches: 80 },
},
},
})
playwright.config.ts:
import { defineConfig } from '@playwright/test'
export default defineConfig({
testDir: './tests/e2e',
use: {
baseURL: 'http://localhost:3000',
},
webServer: {
command: 'pnpm dev',
url: 'http://localhost:3000',
},
})
All from configuring-javascript-stack plus:
dev:
pnpm install
pnpm dev
build:
pnpm build
test-e2e:
pnpm playwright test
a11y:
pnpm playwright test accessibility.spec.ts
check-all: format lint typecheck test coverage test-e2e a11y
@echo "✅ All checks passed"
Data fetching in Server Components:
async function getPosts() {
const res = await fetch('https://api.example.com/posts')
return res.json()
}
export default async function BlogPage() {
const posts = await getPosts()
return <div>{posts.map(post => <article key={post.id}/>)}</div>
}
Client/Server composition:
// Navigation.tsx (Server Component)
import NavigationClient from './NavigationClient'
export default function Navigation() {
const links = [{ href: '/', label: 'Home' }]
return <NavigationClient links={links} />
}
// NavigationClient.tsx
'use client'
import { useState } from 'react'
export default function NavigationClient({ links }) {
const [isOpen, setIsOpen] = useState(false)
// Interactive UI
}
<Image> componentnext/fontdynamic() for heavy components<button>, <nav>, etc.xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience