From darkroom
Creates React UI components following Darkroom conventions, detecting Next.js or React Router stacks from package.json. Outputs TSX with CSS modules, props interface, and stack-specific wrappers.
npx claudepluginhub darkroomengineering/cc-settingsThis skill uses the workspace's default tool permissions.
Create a React component following Darkroom conventions. **Detect the stack first** — satus (Next.js) and novus (React Router) have different conventions for client/server boundaries, image/link wrappers, and path aliases.
Generates React/Vue components with TypeScript props interfaces, React Testing Library tests, CSS modules/Tailwind/styled-components styles, and barrel exports. Validates names and confirms designs before writing files.
Writes modern React components using TypeScript, hooks, Tailwind CSS, and best practices. Generates functional components, custom hooks, and composition patterns for performant UIs.
Scaffolds production-ready React and React Native components with TypeScript types, tests, styles (CSS Modules/Tailwind/styled-components), accessibility, and Storybook stories.
Share bugs, ideas, or general feedback.
Create a React component following Darkroom conventions. Detect the stack first — satus (Next.js) and novus (React Router) have different conventions for client/server boundaries, image/link wrappers, and path aliases.
Read package.json:
dependencies.next present → Next.js / satus conventionsdependencies["react-router"] or devDependencies["@react-router/dev"] → React Router / novus conventions| Stack | Component path | CSS module path | Image wrapper | Link wrapper | Path alias |
|---|---|---|---|---|---|
| satus (Next.js) | components/<name>/index.tsx | components/<name>/<name>.module.css | import { Image } from '@/components/image' | import { Link } from '@/components/link' | @/ |
| novus (React Router) | components/<name>/index.tsx | components/<name>/<name>.module.css | Native <img> (or project's wrapper if it exists) | import { Link } from 'react-router' | ~/ |
// components/<name>/index.tsx
// 'use client' — only add if component needs:
// - useState, useEffect, or other hooks
// - Event handlers (onClick, onChange, etc.)
// - Browser APIs (window, document, etc.)
import s from './<name>.module.css'
interface <Name>Props {
children?: React.ReactNode
className?: string
}
export function <Name>({ children, className }: <Name>Props) {
return (
<div className={`${s.<name>} ${className ?? ''}`}>
{children}
</div>
)
}
// components/<name>/index.tsx
// React Router components are isomorphic — no directive needed.
// They run on server during SSR and on client after hydration.
import s from './<name>.module.css'
interface <Name>Props {
children?: React.ReactNode
className?: string
}
export function <Name>({ children, className }: <Name>Props) {
return (
<div className={`${s.<name>} ${className ?? ''}`}>
{children}
</div>
)
}
.<name> {
/* Component styles */
}
If this component wraps or uses an external library (Radix, Framer Motion, GSAP, etc.):
/docs <library> to get current API via context7.bun info <package> before installing.Never implement against external library APIs from memory.
s — always import as s for consistency.className for composition.export function, not export default.'use client' if needed.import { Image } from '@/components/image'.import { Link } from '@/components/link'.'use client' directive.~/, not @/.import { Link } from 'react-router' (declarative routing).<img> with explicit width/height/fetchPriority. No project-level wrapper unless the project added one.$ARGUMENTS — Component name (e.g., "Button", "Header")--client flag (Next.js only) — Force client componentUser: "create a Button component"
→ detect stack → satus → creates components/button/index.tsx + button.module.css with @/-aliased imports
User: "create a Button component" (in novus repo)
→ detect stack → novus → creates same files but with ~/-aliased imports and no 'use client' directive