- Introduction
- Pitch
- Hogwarts
- Live Demo
- MVP
- Roadmap
- Launch Sprint
- PRD
- Get Started
- Localhost
- Architecture
- Structure
- Pattern
- Page
- Layout
- Content
- Types
- Config
- Actions
- Queries
- Authorization
- Validation
- Form
- Table
- Detail
- Card
- Util
- Hooks
- List Params
- Views
- README.md
- ISSUE.md
- Technology Stack
- Database
- File
- CDN Assets
- Entry Points
- Dashboard
- Authentication
- Credentials
- OAuth
- Flow Diagrams
- Multi-Tenancy
- Offline
- Onboarding
- Onboarding Videos
- Add Values
- Admission
- Application
- Attendance
- Compliance
- Profile
- Exams
- Exam Wizard
- Timetable
- Classrooms
- Notifications
- Conference
- LMS (Lumos)
- Finance
- Fee Management
- Invoice
- Wallet
- Salary
- Payroll
- Timesheet
- Expenses
- Budget
- Receipt
- Accounts
- Banking
- Reports
- Dashboard
- Permissions
- Messages
- Integration Flow
- Provision
- AI Document Processing
- Document Intelligence
- Internationalization
- Translation
- Translation Guide
- Icons
- Docs Factory
- Inspiration
- Listings
- Teachers
- Students
- Catalog
- Library
- Contributing
- Code of conduct
- GitHub Workflow
- Database Seeds
- Database Safety
- Test Accounts
- Playwright
- Prettier
- Block Rebound
We use Prettier with shadcn/ui's official patterns: no semicolons, double quotes, ES5 trailing commas, and automatic import + Tailwind class sorting.
Configuration
prettier.config.js mirrors shadcn/ui's prettier.config.cjs:
/** @type {import('prettier').Config} */
module.exports = {
semi: false,
singleQuote: false,
trailingComma: "es5",
tabWidth: 2,
printWidth: 80,
bracketSpacing: true,
endOfLine: "lf",
importOrder: [
"^(react/(.*)$)|^(react$)",
"^(next/(.*)$)|^(next$)",
"<THIRD_PARTY_MODULES>",
"",
"^types$",
"^@/env(.*)$",
"^@/types/(.*)$",
"^@/config/(.*)$",
"^@/lib/(.*)$",
"^@/hooks/(.*)$",
"^@/components/ui/(.*)$",
"^@/components/(.*)$",
"^@/styles/(.*)$",
"^@/app/(.*)$",
"",
"^[./]",
],
importOrderParserPlugins: ["typescript", "jsx", "decorators-legacy"],
plugins: [
"@ianvs/prettier-plugin-sort-imports",
"prettier-plugin-tailwindcss",
],
}Differences from defaults
| Option | shadcn/ui | Default | Why |
|---|---|---|---|
semi | false | true | Cleaner code, matches shadcn/ui components |
trailingComma | "es5" | "all" | Better compatibility, smaller diffs |
Commands
pnpm format # Format entire project
pnpm format:check # CI check
pnpm format:staged # Staged files only
pnpm format:cache # With caching (faster)Import groups
Imports auto-sort into logical groups: React/Next → third-party → internal (env, types, config, lib, hooks, ui, components, styles, app) → relative.
// 1. React + Next
import * as React from "react"
import Link from "next/link"
// 2. Third-party
import { useForm } from "react-hook-form"
import { z } from "zod"
// 3. Internal
import { env } from "@/env"
import type { Student } from "@/types/student"
import { db } from "@/lib/db"
import { Button } from "@/components/ui/button"
// 4. Relative
import { localHelper } from "./helpers"Tailwind class sorting
// Before
<div className="p-4 flex bg-blue-500 items-center text-white">
// After
<div className="flex items-center bg-blue-500 p-4 text-white">Plugins
| Plugin | Purpose |
|---|---|
| @ianvs/prettier-plugin-sort-imports | Intelligent import sorting via regex groups |
| prettier-plugin-tailwindcss | Sorts Tailwind classes |
The Tailwind plugin must be last in the plugins array.
ESLint integration
ESLint runs alongside Prettier with conflict rules disabled via eslint-config-prettier.
// eslint.config.mjs
import { dirname } from "path"
import { fileURLToPath } from "url"
import { FlatCompat } from "@eslint/eslintrc"
import eslintConfigPrettier from "eslint-config-prettier"
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const compat = new FlatCompat({ baseDirectory: __dirname })
export default [
...compat.extends("next/core-web-vitals", "next/typescript"),
eslintConfigPrettier, // must be last
]pnpm lint
pnpm lint --fixConventions: TypeScript-first (no any), server components by default, absolute aliases (@/components/ui/button).
IDE setup
VS Code
Install Prettier - Code formatter, then add to .vscode/settings.json:
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"prettier.requireConfig": true
}WebStorm
Settings → Languages & Frameworks → JavaScript → Prettier. Enable "On save" and "On 'Reformat Code' action". Set Prettier package to node_modules/prettier.
Pre-commit hook
# .husky/pre-commit
npx pretty-quick --stagedIgnored
# .prettierignore
dist
node_modules
.next
build
.contentlayer
pnpm-lock.yamlTroubleshooting
Import sorting not working — verify plugin order: sort-imports first, tailwindcss last.
VS Code not formatting — check Prettier extension installed, editor.defaultFormatter set, prettier.config.js exists in root.
Different formatting locally vs CI — pin Prettier version in package.json:
{
"devDependencies": {
"prettier": "3.7.4"
}
}