prototype
MAmattpocock/skills318k近 7 天新增 9,301 个 star
Use when building or changing UI in apps/frontend. Covers the custom design system, component library (Button, Card, Badge, and more), design tokens, and styling conventions so UI stays consistent and on-brand.
Use this skill when working on UI in apps/frontend. It teaches you how to use our custom design system, component library, and style conventions so you produce consistent, on-brand UI without reinventing the wheel.
TRIGGER: any task involving JSX, styling, layout, new components, or visual changes in apps/frontend.
Before writing any new UI element, search the existing component library.
src/app/ui/ ← start here
Button.tsx ← variants: primary | secondary | danger
Card.tsx ← variants: default | bordered | subtle
Badge.tsx ← non-status labels (status chips use StatusPill)
Input.tsx ← base input with token borders
Stack.tsx ← flex layout helper
Text.tsx ← typography variants
inputs/ ← Datepicker, Dropdowns, Search, FileInput
cards/ ← Appointment, Inventory, Forms, etc.
tables/ ← DataTable variants
overlays/ ← Modal, Toast, Loader
layout/ ← Header, Sidebar, guards
primitives/Buttons/ ← Primary, Secondary, Delete (low-level)
primitives/StatusPill/ ← THE status pill (tone-coloured, uppercase)
primitives/SegmentedPill/ ← segmented pill controls (view/tab toggles)
filters/ ← Forms, Inventory, general filters
board/ ← kanban board components
widgets/ ← domain widgets
Import from the barrel: import { Button, Card, Badge } from '@/app/ui'
The design-token source of truth is apps/frontend/src/app/globals.css - the Tailwind @theme block PLUS the runtime layers below it: :root (the warm-bone light palette: --blue, --ink, --screen, --band, --hairline, ...) and html[data-theme="dark"]. The short-form tokens outnumber --color-* in app code roughly 3:1, so "use --color-*" is not the rule - match the token layer the surrounding code uses (apps/frontend/AGENTS.md has the full token-layer map). Never hardcode hex values or px sizes - always use tokens.
/* Colors */
--color-* (Tailwind @theme, e.g. --color-neutral-200)
--blue, --ink, --screen, --band, --hairline (warm-bone runtime layer: :root + html[data-theme="dark"])
/* Typography */
--font-satoshi (body/UI - all weights 300-900)
--font-newsreader (display serif - page titles, marketing moments)
Satoshi is the body/UI font; Newsreader (--font-newsreader, applied via .text-page-title / .font-newsreader) is the display serif for page titles and marketing moments. The durable rule: never re-add --font-grotesk or --grotesk-font (see src/app/ui/tokens.md).
Reference documentation: src/app/ui/tokens.md (derived guide, not source of truth)
clsx for conditional class composition - it's already in the project.style={{}} unless a value cannot be expressed as a token.w-[347px]) unless strictly required for pixel-perfect alignment from design specs.Layout → Spacing → Sizing → Typography → Colors → Borders → Effects → Responsive
Use the <Text> component for all copy, not bare <p> / <span> tags.
Body/UI font: Satoshi (300 Light → 900 Black). Display serif: Newsreader for page titles and marketing moments (.text-page-title in globals.css applies it). Never default to Inter, Roboto, or system fonts for new UI.
PAYMENT_AT_CLINIC, VET, PMS).Actor as a user-facing label. Use contextual labels such as Lead/Support, or neutral Updated by when role context is unknown.src/app/ui/ - if something similar exists, extend it.src/app/ui/ alongside its peers.features/ subdirectory.{ prop: type } in function signatures).// Always use the wrapper, not primitives directly.
// Omit href for actions - href renders an <a> (Next.js Link); use it only for navigation.
<Button variant="primary" text="Save" onClick={handleSave} />
<Button variant="secondary" text="Cancel" onClick={handleCancel} />
<Button variant="danger" text="Delete" onClick={handleDelete} />
Use Zustand stores in src/app/stores/. Each domain has its own store. Do not introduce new state management libraries.
Available stores: appointment, appointmentWorkspace, auth, availability, companion, counter, document, forms, fullscreenLoader, integration, inventory, invoice, org, parent, profile, revampCatalog, room, routeLoader, search, service, signingOverlay, speciality, subscription, task, team, universalSearch. Lists drift — enumerate src/app/stores/ before creating any store.
<button> inside <button> - invalid HTML, breaks tests.<button> mocks in tests - use <span> not <button> for react-icons mocks.--font-* values that don't exist in globals.css - check before using.src/app/stores/ before creating new state.clsx not cn, classnames, or template literals for conditional classes.references/components-api.mdMAmattpocock/skills318k近 7 天新增 9,301 个 star
AFaffaan-m/ECC299k近 7 天新增 5,106 个 star
FIfirecrawl/firecrawl200k近 7 天新增 2,106 个 star
ANanthropics/skills189k近 7 天新增 2,932 个 star
用 React、Tailwind 和 shadcn/ui 构建多组件页面。
ANanthropics/skills189k近 7 天新增 2,932 个 star