Code Review Skill — CalendarCN
When to Use
Invoke when reviewing PRs, diffs, or code changes in the CalendarCN project.
Checklist
1. Type Safety
- No
anytypes introduced - All shared types imported from
week-view-types.ts(not duplicated) -
import typeused for type-only imports - Props defined via
interface ComponentNameProps - Optional props use
?(not| undefined)
2. React Patterns
-
ref.currentnever assigned during render (always inuseEffect) - Hook dependencies are exhaustive (no eslint-disable for deps)
- Refs used to break circular dependencies (not skipped deps)
-
React.useCallbackfor handlers passed as props -
React.useMemofor expensive derived state - No state updates during render
3. Component Structure
-
"use client"directive present if component uses hooks/browser APIs - Import order: external →
@/lib/utils→@/hooks→@/components→@/lib - Constants in ALL_CAPS with JSDoc
- Early returns instead of deeply nested conditionals
- Props destructured in function params
4. Styling
- Uses
cn()for conditional classes (no string concatenation) - Tailwind for fixed styles, inline
stylefor computed layout - Color variants use
eventColorStyles[color]map - Z-index follows scale: events(0-2) < selected(20) < placeholder(25) < dragging(30) < portal(9999)
- Dark mode tested (uses CSS variables, not hardcoded colors)
5. Naming
- Files:
kebab-case - Components:
PascalCase - Hooks:
useCamelCase - Constants:
ALL_CAPS_SNAKE
6. Performance
- No unnecessary re-renders (check memoization)
- Event listeners cleaned up in
useEffectreturn - ResizeObserver disconnected on unmount
- Large computations memoized (e.g.,
calculatePositionedEvents)
7. Pre-submit
pnpm lint && pnpm typecheck && pnpm format:check
All three must pass before approving.
Red Flags
- Direct DOM mutation outside refs
anyoras unknown as Xtype casts- Missing cleanup for event listeners or observers
- Types defined in component files instead of
week-view-types.ts - Hardcoded pixel values that should be constants
console.logleft in production code
Source: vmnog/calendarcn — distributed by TomeVault.