Review and enforce frontend design standards. Use when creating components, reviewing UI code, fixing styling issues, or scaffolding new views.
When reviewing or generating frontend code, enforce all of the following rules.
zinc-950. Panels/sidebars: zinc-900.zinc-800. Primary text: zinc-100/zinc-200. Secondary text: zinc-400. Muted: zinc-500/zinc-600.indigo-400/violet-400 family (#818cf8, #a78bfa).white, gray-50, etc.) outside of dark-mode overrides..ProseMirror in for TipTap editor styling.globals.csstransition-colors for hover/focus states.!important. If specificity is an issue, restructure the component.flex-shrink-0 with border-r/border-l border-zinc-800.h-screen on the root flex container.overflow-y-auto), never on the body."use client" unless they are pure layout with no hooks.useQuery, useMutation, useAction) for data — never fetch() or API routes.font-sans (Geist Sans) for UI, font-mono (Geist Mono) for code.ease-out easing.AnimatePresence for mount/unmount animations (AI panel toggle, modals).When creating a new component:
Place it in the correct directory:
components/editor/ — TipTap editor, toolbar, selection menucomponents/ai/ — Chat panel, inline suggestions, command palettecomponents/sidebar/ — Note list, folder treecomponents/shared/ — Reusable primitives (buttons, modals, tooltips)Use this template:
"use client";
// External imports
// Internal imports (convex, components)
interface MyComponentProps {
// typed props
}
export default function MyComponent({ ...props }: MyComponentProps) {
// hooks first, then handlers, then render
return (
<div className="...">
{/* content */}
</div>
);
}
When reviewing frontend code, verify:
@keyframes)fetch() calls — Convex hooks only