frontend-design
Skill1 starsChanged 8 months agoMITView on GitHub
Design system guide — CSS tokens, Tailwind v4, shadcn/ui components, theming, and UI conventions for consistent dark-themed dashboard interfaces.
187 other projects use a version of this.
Adopted by
Most recently taken up by
- RostislavDugin/postgresustheir own version, first seen Nov 8, 2026
- databasus/databasustheir own version, first seen Nov 8, 2026
- ceilf6/FrontAgenttheir own version, first seen Nov 8, 2026
- maxtrigify/Ottotheir own version, first seen Nov 8, 2026
- rvdbreemen/OTGW-firmwaretheir own version, first seen Nov 8, 2026
- open-slide/open-slidetheir own version, first seen Nov 8, 2026
Used with
Projects with it also use instantly-campaign, albert-dm and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
yawningwhaleAISkillinstantly-campaign
Create a new Instantly cold-email campaign in the proven 5-email structure of the user's top-performing campaign (~16% reply rate). Use when the user wants to launch a new outbound campaign, write a cold email sequence, create an Instantly campaign, draft outreach for a new service or niche, or set up a sales sequence.
Also in 6 projects that use this
yawningwhaleAISkillalbert-dm
Reply to DMs and messages the way Albert would. Use when the user asks "how would Albert reply to this", pastes a conversation and wants an Albert-style response, or asks you to draft/write a DM in Albert's voice. Albert sells AI voice agents / automations to local service businesses (Go High Level, lead follow-up, bookings).
Also in 5 projects that use this
naman10parikhSkillecosystem-reference
Quick-access directory of Claude Code ecosystem repos, skills, plugins, MCPs, and patterns. Use when improving the harness.
Also in 5 projects that use this
naman10parikhSkillfractal-delegation
Also in 5 projects that use this
julianoczkowskiSkillbrief-to-tasks
Break a design brief into an ordered checklist of independently buildable tasks using vertical slices. Saves as a markdown checklist. Use when user wants to break down work, create tasks from a brief, plan implementation order, or mentions "tasks" or "breakdown".
Also in 7 projects that use this
SeifBenayedSkillfile-reading
Use this skill when a file has been uploaded but its content is NOT in your context — only its path at /mnt/user-data/uploads/ is listed in an uploaded_files block. This skill is a router: it tells you which tool to use for each file type (pdf, docx, xlsx, csv, json, images, archives, ebooks) so you read the right amount the right way instead of blindly running cat on a binary. Triggers: any mention of /mnt/user-data/uploads/, an uploaded_files section, a file_path tag, or a user asking about an uploaded file you have not yet read. Do NOT use this skill if the file content is already visible in your context inside a documents block — you already have it.
Also in 6 projects that use this
- +6 more from naman10parikh
Other versions187 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 187
- anthropics/skills★ 189ksame name
- bytedance/deer-flow★ 85ksame name
- anthropics/claude-plugins-official★ 46ksame name
- novuhq/novu★ 40ksame name
- Dokploy/dokploy★ 38ksame name
- markmead/hyperui★ 12ksame name
- mengxi-ream/read-frog★ 10ksame name
- 1weiho/open-slide★ 9.7ksame name
- open-slide/open-slide★ 9.7ksame name
- basketikun/infinite-canvas★ 9.5ksame name
177 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository51 other files it gives its agents.
- algorithmic-artSkill
- audit-componentsSkill
- canvas-designSkill
- cascade-orchestrationSkill
- consultSkill
- data-reconciliationSkill
- debug-collaborateSkill
- deep-root-causeSkill
- deploy-allSkill
- design-reverse-engineerSkill
- design-showcaseSkill
- docxSkill
- env-auditSkill
- evolveSkill
- full-stack-buildSkill
- full-stack-traceSkill
- gh-repo-reconSkill
- grill-meSkill
- handoffSkill
- html-slidesSkill
- insightSkill
- internal-commsSkill
- isolation-testSkill
- mcp-builderSkill
- model-selectionSkill
- pdfSkill
- persistent-issueSkill
- pre-merge-reviewSkill
- premise-auditSkill
- propagate-featureSkill
- regression-bisectSkill
- research-gateSkill
- review-implSkill
- schema-checkSkill
- session-notesSkill
- skill-auditSkill
- skill-creatorSkill
- slack-gif-creatorSkill
- start-daySkill
- temporal-forensicsSkill
- theme-factorySkill
- throwaway-scriptSkill
- triage-ideasSkill
- verify-completeSkill
- webapp-testingSkill
- web-artifacts-builderSkill
- wisdomSkill
- worker-buildSkill
- worktree-guardSkill
- write-planSkill
- xlsxSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
22 rules. 0 are common, 12 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 181 edited versions we read keep these.
12
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 23
All colors, spacing, and visual properties use CSS custom properties.
- Distinctive: line 90
When migrating a component to Tailwind, remove its CSS rules to avoid conflicts
- Very specific: line 163
Add theme object to THEMES array in ThemeToggle.jsx
- Very specific: line 164
Add [data-theme="your-theme"] selector block in theme.css with all token overrides
- Very specific: line 171
Use a consistent KPICard component for metric cards across all projects:
- Distinctive: line 177
Use shared tooltip styles if your project exports them:
- Distinctive: line 219
If using a ratcheted lint gate: existing charts are grandfathered.
- Distinctive: line 224
Reference legends (a key to a table, not a chart): When a legend explains what the badges, marks or colours in a table mean, build it from …
- Very specific: line 231
Bundle split: Keep Recharts in manualChunks (vite.config.js)
- Distinctive: line 243
Use a shared modal component with:
- Distinctive: line 272
When rewriting a view to use Tailwind + shadcn:
- Distinctive: line 274
Use shadcn components for structure (Dialog, Table, Card, Tabs, Button)
- Distinctive: line 275
Use Tailwind utilities for layout and spacing
- Very specific: line 276
Remove the old CSS rules from App.css
- Distinctive: line 277
Keep domain-semantic styles (status colors, chart configs) in CSS or constants
- Distinctive: line 284
Grep the target for hardcoded drift: before editing:
- Very specific: line 320
After /design-showcase and the user picks a variant, porting it into the real component has a specific failure mode worth calling out.
- Very specific: line 324
Detection: before accepting an agent's port commit, check git log <worktree-base>..HEAD -- <target-file>.
- Very specific: line 327
If the CSS additions are purely additive (new scoped classes) — cherry-pick with git checkout --ours <target.jsx> to keep your current JSX …
- Distinctive: line 331
Prefer additive edits over reordering: If the showcase variant spec includes "reorder sections", save that for a separate follow-up — it's …
- Very specific: line 339
getDueDateCategory "this week" filter: must include late + today + tomorrow + thisWeek (not just thisWeek)
- Very specific: line 344
CSS pattern audit before adding styles: Before adding @keyframes or new CSS classes to a large App.css, grep existing patterns first to …
“Common” is measured: kept by at least 6 in 10 of the 181 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Frontend Design Guide
Automatically applies when working on frontend UI/UX tasks. Creates distinctive, production-grade interfaces with consistent styling.
Design System Stack
| Layer | Technology | Purpose |
| Tokens | shared/theme.css (CSS custom properties) | Color, spacing, typography, radius, shadows, z-index |
| Themes | shared/ThemeToggle.jsx (multiple presets) | Theme switching via data-theme attribute on <html> |
| Animations | shared/animations.css | Shared keyframes + reduced-motion support |
| Utilities | Tailwind CSS v4 (@tailwindcss/vite) | Utility-first classes, no preflight (coexists with vanilla CSS) |
| Components | shadcn/ui | Accessible primitives: Button, Dialog, Input, Badge, Table, etc. |
| Existing CSS | Per-project App.css | Unlayered vanilla CSS (wins specificity over Tailwind @layer) |
Design Tokens (shared/theme.css)
All colors, spacing, and visual properties use CSS custom properties. Never hardcode hex values — use tokens.
Color Tokens
| Token | Dark Value | Usage |
--bg-app | #111827 | Page/app background |
--bg-surface | #1F2937 | Card/panel backgrounds |
--bg-elevated | #374151 | Hover states, secondary bg |
--bg-inset | #0F172A | Inset/recessed areas |
--text-primary | #F9FAFB | Main content text |
--text-secondary | #9CA3AF | Labels, descriptions |
--text-muted | #6B7280 | Hints, timestamps |
--accent | #3B82F6 | Primary actions, links |
--accent-hover | #2563EB | Hover on accent |
--accent-muted | #60A5FA | Light accent variant |
--status-error | #EF4444 | Errors, late items |
--status-warning | #F59E0B | Warnings, approaching due |
--status-success | #10B981 | Success, on-time |
--status-info | #3B82F6 | Informational |
--border-default | #374151 | Standard borders |
--border-subtle | #1F2937 | Subtle dividers |
Spacing Scale
--space-xs (0.25rem) through --space-3xl (3rem). Use in CSS: padding: var(--space-md).
Typography Scale
--text-xs (0.75rem) through --text-3xl (1.875rem). Use: font-size: var(--text-sm).
Radius, Shadows, Z-Index
- Radius:
--radius-smthrough--radius-full - Shadows:
--shadow-smthrough--shadow-xl - Z-index:
--z-base(1) through--z-toast(9999)
Tailwind v4 Integration
Tailwind v4 is installed via @tailwindcss/vite plugin. No preflight — existing CSS is preserved.
@theme inline Mapping
The @theme inline block in index.css maps your tokens to Tailwind utilities:
shadcn/ui standard names (used by shadcn components internally):
bg-primary→var(--accent)(your accent color)text-primary-foreground→#ffffff(text on primary buttons)bg-background→var(--bg-app)text-foreground→var(--text-primary)bg-card→var(--bg-surface)bg-secondary/bg-muted/bg-accent→var(--bg-elevated)(shadcn "accent" = hover bg)text-muted-foreground→var(--text-muted)bg-destructive→var(--status-error)border(default) →var(--border-default)ring-ring→var(--accent)
Custom names (use in your own Tailwind code):
bg-app,bg-surface,bg-elevated,bg-inset— layout backgroundsbg-accent-primary,bg-accent-hover— accent color (distinct from shadcnbg-accent)bg-error,bg-warning,bg-success,bg-info— status colorstext-text-primary,text-text-secondary,text-text-muted— text colorsborder-border-subtle— subtle borders
Specificity Rules
- Unlayered CSS (existing
App.css) always wins over Tailwind's@layer utilities - When migrating a component to Tailwind, remove its CSS rules to avoid conflicts
rgba()values stay as-is until converted tooklch()or Tailwind opacity modifiers (bg-primary/15)
shadcn/ui Components
Setup
- Config:
components.json(style: new-york, jsx, zinc base) - Utility:
src/lib/utils.js—cn()function (clsx + tailwind-merge) - Path alias:
@/*→./src/*(in vite.config.js + jsconfig.json) - Components:
src/components/ui/*.jsx
Available Components
| Component | Import | Usage |
Button | @/components/ui/button | Actions, CTA. Variants: default, destructive, outline, secondary, ghost, link |
Dialog | @/components/ui/dialog | Modal dialogs. Use DialogContent, DialogHeader, DialogTitle, etc. |
Input | @/components/ui/input | Form text inputs |
Badge | @/components/ui/badge | Status badges. Variants: default, secondary, destructive, outline |
Table | @/components/ui/table | Data tables (Table, TableHeader, TableBody, TableRow, TableCell) |
DropdownMenu | @/components/ui/dropdown-menu | Context menus, action menus |
Tooltip | @/components/ui/tooltip | Hover tooltips (needs TooltipProvider) |
Sonner (Toast) | @/components/ui/sonner | Toast notifications via sonner |
Card | @/components/ui/card | Content cards (Card, CardHeader, CardTitle, CardContent) |
Tabs | @/components/ui/tabs | Tab navigation (Tabs, TabsList, TabsTrigger, TabsContent) |
Usage Pattern
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import { cn } from '@/lib/utils'
function MyComponent({ isLate }) {
return (
<div className="flex items-center gap-2">
<Badge variant={isLate ? 'destructive' : 'default'}>
{isLate ? 'Late' : 'On Time'}
</Badge>
<Button variant="outline" size="sm">
View Details
</Button>
</div>
)
}Adding New shadcn Components
npx shadcn@latest add <component-name> --yes --overwriteComponents generate as .jsx into src/components/ui/. No TypeScript cleanup needed.
Theme System
Theme Presets
Themes work by swapping CSS custom property values via [data-theme="X"] selectors in shared/theme.css. A ThemeToggle component persists the choice to localStorage.
Example presets to support:
| Group | Themes |
| Auto | System (follows OS) |
| Standard | Dark (default), Light, Dim, High Contrast |
| Popular | Midnight, Nord, Dracula, Catppuccin |
| Classic | Solarized Dark, Solarized Light |
Adding a New Theme
- Add theme object to
THEMESarray inThemeToggle.jsx - Add
[data-theme="your-theme"]selector block intheme.csswith all token overrides - Light themes: set
color-scheme: lightand ensure stronger contrast (--text-primary: #0F172A)
Component Patterns
KPI Cards
Use a consistent KPICard component for metric cards across all projects:
- Grid: 4 columns desktop, 2 mobile (
@media max-width: 768px) - Structure: label, value (large), unit/trend, optional delta
Charts (Recharts)
Use shared tooltip styles if your project exports them:
import { CHART_TOOLTIP } from '@your-shared/constants'
<Tooltip {...CHART_TOOLTIP} />Legend standard (enforced — e.g. via scripts/lint-chart-legends.mjs).
A multi-series chart (2+ bars/lines/areas, or a .map() that emits a series per
datum) MUST give the reader a labeled key for its colors, two ways:
- Visible legend — add
<Legend wrapperStyle={{ fontSize: 11 }} />(11px keeps it readable on compact cards). Every series needs aname=prop so the legend (and tooltip) labels it. - Color-aware tooltip — the popup must show each series' color, not a uniform gray.
A shared
CHART_TOOLTIPthat setsitemStyle:{color:'var(--text-secondary)'}flattens every row to one color. On a multi-series chart, pass a customcontent=that colors each row byentry.colorinstead:
// Color-aware tooltip: a mini legend in the popup (swatch + name + value).
function ChartTooltip({ active, payload, label }, fmt = (v) => v) {
if (!active || !payload?.length) return null
return (
<div className="chart-tooltip">
<p className="tooltip-label">{label}</p>
{payload.map((e, i) => (
<p key={i} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span style={{ width: 9, height: 9, borderRadius: '50%', background: e.color }} />
<span>{e.name}</span>
<span style={{ marginLeft: 'auto', fontWeight: 600 }}>{e.value != null ? fmt(e.value) : '—'}</span>
</p>
))}
</div>
)
}
// ...
<Tooltip content={<ChartTooltip />} />- Single-series charts are exempt — the card title names the one series; a legend is noise.
- Custom / non-
<Legend>key (e.g. a color-dot caption or a deliberately key-less chart): annotate it so lint skips it —{/* chart-legend-ok: <reason> */}on or just above the chart element. - If using a ratcheted lint gate: existing charts are grandfathered; it fails only on a NEW multi-series chart that lacks a legend or color-aware tooltip.
A lint that checks legend presence is satisfied by a bare <Legend />, so the check doesn't prove the legend is useful.
Reference legends (a key to a table, not a chart). When a legend explains what the badges, marks or colours in a table mean, build it from one shared panel component rather than per-view markup:
- Make the swatch the real component the table renders (or its real CSS class), so the key restyles itself when the table does. Deliberately offer no
items=[{color,label}]data prop: a hand-written hex is a copy that silently drifts from the CSS it describes. - Group with an eyebrow label and a hairline, not nested bordered cards, which read as separate panels inside a collapsible.
- Drive layout with one
auto-fitcolumn width, not a per-view column count, and persist open/closed state in storage with a safe fallback when storage throws.
Additional chart patterns:
- Dark tooltips require THREE props:
contentStyle,labelStyle,itemStyle - Bundle split: Keep Recharts in
manualChunks(vite.config.js) - ResponsiveContainer:
height={isMobile ? 200 : 250}standard
Tables
table-layout: fixed+<colgroup>for resizable columns- Column widths persist to localStorage
- Sticky headers:
position: sticky; top: 0; z-index: var(--z-sticky) - Alternate row coloring:
tr:nth-child(even)with subtle surface variation
Modals
Use a shared modal component with:
- Focus trap (
useModalA11yor native<dialog>+showModal()) - Overlay-click-to-close:
if (e.target === e.currentTarget) onClose()on the overlay — do NOT usestopPropagationon inner content (breaks children that render outside the DOM tree viaReactDOM.create*APIs) - Backdrop:
rgba(0, 0, 0, 0.5)with optional blur - Escape key close
- Scroll lock on body while open
Collapsible groups — Expand all / Collapse all
Any view that renders a list of collapsible sections/accordions/groups MUST offer bulk Expand all / Collapse all controls — don't re-implement per-group useState(open) with no bulk control, and don't let each new grouped view invent its own toggle shape.
- Extract a shared hook (
useExpandCollapseAll(defaultOpen)) that returns{ isOpen(id), toggle(id), expandAll(), collapseAll() }and tolerates a changing id set — newly-loaded groups should inherit the current default so it works before data loads and after the list grows. - Extract a paired control component for the toolbar/filter bar (
<ExpandCollapseControls onExpandAll={...} onCollapseAll={...} />). - Lift the per-group open state to the parent so the bulk controls actually drive every group, rather than each group owning its own isolated state.
Apply this to every new grouped/accordion view, not just the first one that needed it — it's cheap to reuse and expensive to reinvent per view.
CSS Architecture
| Location | Scope |
shared/theme.css | Design tokens (all projects) |
shared/animations.css | Keyframes (all projects) |
{project}/src/index.css | Tailwind imports + @theme mapping |
{project}/src/App.css | Vanilla CSS (view-specific styles) |
{project}/src/components/ui/ | shadcn/ui components |
Migration Path
When rewriting a view to use Tailwind + shadcn:
- Build the new version alongside the old (or in a test route)
- Use shadcn components for structure (Dialog, Table, Card, Tabs, Button)
- Use Tailwind utilities for layout and spacing
- Remove the old CSS rules from App.css
- Keep domain-semantic styles (status colors, chart configs) in CSS or constants
Aligning an Existing Component to the Design System
Lighter than a full rewrite — use this when reskinning a component that already works but has drifted off-token (hardcoded hex colors, arbitrary px values, transition: all). Observed working loop, confirmed across multiple sessions:
- Read the source of truth first — the token file (this doc's Color Tokens section, or wherever your project defines them) plus the reference primitives the rest of the app already uses (card/badge/button/modal components). Match those; don't invent a parallel style.
- Grep the target for hardcoded drift before editing:
grep -nE "#[0-9a-fA-F]{3,6}|rgba?\(" <target>.css # raw colors that should be tokens grep -nE "[0-9]+px" <target>.css # arbitrary sizes vs your spacing/type scale grep -n "transition: all" <target>.css # vague transitions — name the properties - Rewrite CSS to tokens — swap raw values for token references, arbitrary px for the spacing/type scale,
transition: allfor explicit named properties. Keep domain-semantic colors (status/category colors that are intentionally not themed) as-is. - Build and verify in a real browser — a token swap can silently change contrast or layout. Look at an actual screenshot, not bounding-box math or computed geometry.
Accessibility
- Color contrast: 4.5:1 body, 3:1 large text (High Contrast theme = WCAG AAA)
- Interactive targets: min 44x44px on mobile
- Focus indicators: visible ring via
focus-visible:ring-ring/50 - Reduced motion:
@media (prefers-reduced-motion: reduce)zeroes all animations - Status: never color-only — combine with icon/text
Anti-Patterns to Avoid (AI-Slop Signals)
These patterns appear in the majority of AI-generated UIs. Avoid them by default unless there is a specific, intentional reason.
| Anti-pattern | What it looks like | Better alternative |
| Purple/indigo gradients | background: linear-gradient(135deg, #6366F1, #8B5CF6) as a "hero" | Use your --accent token consistently; gradients only for data viz |
| Inter-by-default | Loading Inter because it's the AI default, not because it fits | Use fonts with discipline (defined scale, no arbitrary sizes) |
| Bento grids | 3x2 card grid where every card has a different height and an icon top-left | Grid layout with consistent card heights; icon choice driven by meaning, not decoration |
| Glass morphism | backdrop-filter: blur(12px) + background: rgba(255,255,255,0.1) + border: 1px solid rgba(255,255,255,0.2) | Solid surface elevation using --bg-elevated; blur only for modals over complex backgrounds |
| Spark lines everywhere | Tiny 40px sparklines added to every metric card to look "data-rich" | Sparklines only when the trend is the insight; use plain numbers when the current value is what matters |
| Side-tab indicator borders | Left border on active tab item as the only active state signal | Combine border with background color change; border-only fails on low contrast themes |
| Identical pill buttons | All buttons are border-radius: 999px regardless of context | Radius should match the component family — table action buttons at --radius-sm, modal CTAs at --radius-md |
| Decorative hero illustrations | 3D robot or abstract illustration as page header | Data visualization or functional illustration only; no illustration if it conveys no information |
| Shadow stacking | box-shadow on every card + every button + every input | Pick one elevation tier per component type and stick to it |
| Random animation | transition: all 0.3s ease added to every element | Only transition properties that actually change; explicit property names + durations matched to interaction type |
Porting a Showcase Variant to Real Code
After /design-showcase and the user picks a variant, porting it into the real component has a specific failure mode worth calling out.
The drift trap: Worktree agents dispatched via Agent({ isolation: "worktree" }) branch from a shared reference point, NOT current HEAD. If parallel sessions have been modifying the target file, the worktree agent ports against a stale base — cherry-picking then conflicts.
Detection: before accepting an agent's port commit, check git log <worktree-base>..HEAD -- <target-file>. If non-empty, the agent was working from stale context.
Resolution pattern:
- If the CSS additions are purely additive (new scoped classes) — cherry-pick with
git checkout --ours <target.jsx>to keep your current JSX and accept ONLY the CSS. - Apply the JSX design edits directly with the
Edittool against current HEAD. - Build, commit, push.
Prefer additive edits over reordering. If the showcase variant spec includes "reorder sections", save that for a separate follow-up — it's much riskier than adding a new pill or strip. Ship the high-signal additions first.
Tactical Patterns
- Recharts tooltips: Need THREE style props for dark theme (
contentStyle,labelStyle,itemStyle) - Recharts bundle: Split via
manualChunksin vite.config.js — always keep this config - Dropdown in scrollable tables:
position:fixed+getBoundingClientRect()—absolutegets clipped byoverflow-x:auto - localStorage validation: Cross-reference saved columns against
DEFAULT_COLUMNSto filter stale entries - getDueDateCategory "this week" filter: must include
late + today + tomorrow + thisWeek(not justthisWeek) - ISO date timezone shift:
new Date('2026-03-20')→ midnight UTC → day before in local timezone. Fix: parse YYYY-MM-DD asnew Date(year, month-1, day)for local display. Don't round-trip already-ISO strings throughtoISOString() - Unstable array/object deps + AbortController = infinite loop: When a
useEffectdepends on a prop-derived array (e.g.const ids = idsProp || []) and the parent passes a fresh literal each render, the effect re-fires every render. If that effect creates anAbortControllerwith a cleanup that callsabort(), every render aborts the in-flight fetch. Symptom: modal stuck on "Loading..." forever, network panel showscanceledrequests in a tight loop.react-hooks/exhaustive-depsdoes NOT catch it — the dep is listed correctly, just unstable. Fix: memoize the derived value against a primitive key (e.g.array.join('|')) or have the parent wrap inuseMemo. - CSS shorthand vs longhand override:
overflow: hidden(shorthand) is NOT reliably overridden by a lateroverflow-y: auto(longhand) in some cascade scenarios. Use the matching shorthand (overflow: hidden auto) to override. Also:overflow-y: autois a no-op when the container hasmin-heightinstead ofheight;min-heightis ignored on<td>elements per CSS spec. - Flex scroll chain requires every ancestor to be a flex container: For
overflow-y: autoon a deeply nested element to work, every ancestor must bedisplay: flex; flex-direction: columnwithmin-height: 0(orheight: 0). One plain block container breaksflex: 1on its children — content overflows without constraint. - CSS pattern audit before adding styles: Before adding
@keyframesor new CSS classes to a largeApp.css, grep existing patterns first to avoid duplicate keyframes and conflicting class names.
See Also
/design-showcase— for exploratory redesigns, run a showcase first. Dispatches a single Opus agent that builds a self-contained HTML page with 3-7 design variants side-by-side. User picks a direction, then implement using the tokens and patterns above./design-reverse-engineer— extract design tokens and component patterns from any URL; use when anchoring a new view to a proven reference before building/webapp-testing— Playwright visual verification after implementing a chosen variantreference-sites.md(in.claude/skills/design-reverse-engineer/) — curated list of high-quality reference sites by domain
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

