Designs React 19 + Next.js 16 + Tailwind CSS interfaces starting from user goals, then writes polished UI code. Triggers on requests for pages, dashboards, forms, or premium-feeling designs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pproenca-dot-skills-1:web-tasteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Taste doesn't start at the pixel level. It starts at "who is this
Taste doesn't start at the pixel level. It starts at "who is this person and what do they need?" The visual refinement is the LAST step. The first step is understanding the user's world deeply enough that the interface design feels inevitable — like it couldn't have been designed any other way.
Your default mode skips straight to layout. It produces technically correct React that looks generic because it was never grounded in a real person's needs — a stack of cards, a sidebar, a settings list. This skill changes the order of operations: think like a designer first, then write code.
Before designing anything, answer ONE question:
What does the user SEE in the first half-second — before they read a single word?
This is not about content. It's about the SHAPE of the screen. Close your eyes and picture it. What dominates?
If your answer is "a sidebar and some cards in a content area" → STOP. That's a CMS theme, not a product. Go back and find the visual shape that matches what this user actually needs.
Write the 0.5-second answer as the FIRST line of the experience brief, as a JSDoc comment on the route:
// 0.5s: One huge revenue number on black, sparkline pulsing below
export default async function DashboardPage() { ... }
This single sentence anchors every decision that follows. If the code you write doesn't produce that shape, something went wrong.
Before writing a single line of JSX, answer these questions. Write the answers down as comments or in your thinking. If you skip this phase, your output will look like every other AI-generated UI — correct but soulless.
Not "a SaaS admin." A real person with a context:
This shapes EVERYTHING. A user pasted into the page via a Slack deep-link needs a giant headline that reorients them. A user with the page open all day wants quiet chrome and big working space. A user evaluating during a demo wants the value proposition to be visible without scrolling.
This is the question that separates designed products from CRUD admin panels. Linear doesn't show you a kanban — it makes shipping feel like an obsession. Stripe doesn't show you payment forms — it makes commerce feel like a solved problem. Every design choice serves that emotional goal.
Before choosing components, decide the emotional intent:
The emotional intent drives every visual decision downstream: color tokens, scale, spacing, whether data is listed or visualized, whether the page feels dense or spacious.
For each page, identify:
A billing page: the primary goal isn't "see all billing info." It's "change the payment method that just expired" or "download last month's invoice for expense reports." The pain point is wading through plan summaries and feature comparisons to find the one action that needs doing.
Map goals to features. Not "what features could this page have?" but "what's the minimum set of features that makes the primary goal effortless?" Every feature that doesn't serve a goal is clutter.
Group features by priority:
This is information architecture — deciding what goes where in the App Router:
/settings →
/settings/billing is obvious. /admin/organizations/{org}/members/{member}/preferences/notifications
is six levels deep for something the user sets once. Use parallel
routes (@modal) and intercepting routes for "open as overlay"
patterns when full navigation is overkill.NOW you think about React — but through the lens of user intent:
'use client' only when interactivity is required. Don't ship a
hydration boundary for a list that doesn't need one.<form action={}>
for anything that mutates. Standalone fields with useOptimistic
for live-saving settings.The component choice IS the design. A <DataTable> with sticky
header for a financial dashboard feels precise and bureaucratic. A
gradient card grid for the same data feels exploratory and editorial.
Neither is wrong — the right choice depends on who the user is and
what moment they're in.
After Phase 1, you know who the user is, what they need, how they should feel, and what components serve those needs. Now make it beautiful. The emotional intent from Phase 1 drives every choice here.
Not just font weight — dramatic scale contrast. The most important thing on screen should be physically large, not just bold.
text-6xl or text-7xl
with font-semibold tracking-tight tabular-nums. Linear's
velocity charts use 64-72 px display numbers. Don't shrink
important data into a text-sm row.text-sm or text-xs in text-muted-foreground.
The contrast between the hero and the support IS the hierarchy.DataTable. Space communicates importance.// Hero metric — scale dominates, whisper labels
<section className="p-8">
<p className="text-sm text-muted-foreground">Net revenue · last 30 days</p>
<p className="mt-2 text-7xl font-semibold tracking-tight tabular-nums">
${(revenue / 100).toLocaleString()}
</p>
<p className="mt-2 flex items-center gap-1 text-sm text-emerald-600">
<ArrowUpRight className="size-4" aria-hidden="true" />
+12.4% vs prior period
</p>
</section>
NEVER pick colors by hand. Color harmony is a solved mathematical problem. This skill bundles a palette generator that computes every color from a single seed hue — analogous harmony, WCAG contrast validated, light and dark mode variants emitted as CSS custom properties and a Tailwind config snippet.
Before writing any view code, run the palette generator:
python scripts/generate_palette.py \
--seed <hue-degrees> \
--mode both \
--items <collection-count> \
--app "App Name"
Seed hue guide:
Paste the generated :root and .dark CSS custom properties into
app/globals.css, and use ONLY those tokens via Tailwind utilities
(bg-primary, text-muted-foreground, border-border). The
palette is computed — every color is mathematically related to the
seed, contrast ratios are pre-validated, and light/dark variants
are included.
Rules that never break:
--items flag),
not random hues. They sit together because they're ±30° of seed.bg-blue-500,
text-red-600, border-gray-200 — those don't theme and aren't
contrast-audited. Use semantic tokens.bg-background, text-foreground, border-border,
text-primary — not ad-hoc Color(...) calls or arbitrary
classes scattered through component code.When data is the content (analytics, financial stats, progress),
VISUALIZE it instead of putting it in a LabeledRow:
A <dl><dt>Revenue</dt><dd>$8,432</dd></dl> is information. A large
"$8,432" in text-6xl tabular-nums with a sparkline below it is an
experience. The emotional intent from Phase 1 tells you which one
to use.
Don't default to a single bordered container for everything. Compose
with rounded-xl border bg-card containers when the content is
heterogeneous:
rounded-xl border bg-card text-card-foreground p-6auto-rows-fr for equal-height card gridsTables are for homogeneous scannable data. Cards are for dashboards, overviews, and content-rich pages where each item has its own story.
The data IS the design. Every preview tells a coherent story:
"Item 1", "Lorem ipsum",
[email protected]), your design looks fakeGenerate seed data with a coherent narrative — even in fixtures.
What you leave out defines taste. No instruction headers ("Welcome to your dashboard"). No uniform icon decorations on every row. No tutorial overlays. No demo naming. For every element, ask: "what happens if I remove this?" If nothing — remove it.
The invisible details that feel right:
tabular-nums on changing numbers so digits don't reflowtracking-tight on display headingstransition-colors duration-150 on every interactive elementhover: + focus-visible: + active: states on every buttonmotion-safe: on transforms (see acc-reduce-motion)truncate + line-clamp-N instead of overflow hidden + ellipsis JSfont-variant-numeric: tabular-nums everywhere numbers tickEach page has a distinct personality. Character comes from:
If a user dropped into your page with the nav bar covered, would they know what app they're in? Linear's character is in its sharp chrome and cycle visualization. Stripe's is in its perfectly-aligned data tables and trust-blue accent. Find yours.
When asked to build a route, layout, or component:
Phase 1 — Think through the user, their goals, feature groupings, route structure, and component choices. Write brief notes (as code comments or in your response) showing your design reasoning. This is not optional — it's what separates a designed experience from a decorated layout.
Phase 2 — Write the React/Next.js/Tailwind code with all eight fundamentals applied. Start with realistic data and seed fixtures. Build minimal, add only what earns its place, then polish with craft details.
Self-check — Before finishing, ask: "Would a real user using this product in the moment I identified in Phase 1 feel like this page was designed for them?" If not, something in Phase 1 was wrong — go back.
For full before/after code (a generic AI-looking dashboard vs a
Stripe-inspired revenue page) and the Component Palette Quick
Reference table that maps reflex choices to taste-driven ones,
read references/code-examples.md.
The short version of the contrast: a "no taste" page jumps straight
to layout — instruction header, numbered placeholders, text-gray-*
and bg-blue-* hardcoded, generic component naming. A "taste" page
opens with a design comment naming the user and emotional intent,
puts the most important number at hero scale with tabular-nums,
uses semantic tokens (text-muted-foreground, bg-card), and lets
a sparkline support the hero rather than compete with it.
Reference apps worth studying: Linear, Stripe, Vercel, Notion, and high-craft consumer apps (Cash App, Things, Arc). Each has a distinct character driven by deliberate choices in chrome, typography, and data presentation.
Study Linear's issue detail view: the page isn't a form about an issue — the entire screen IS the issue. The title is the page heading at hero scale. The description IS the body. Actions live in chrome that fades away. There's no "Edit issue" page; editing happens in place.
This is the highest level of taste: the UI dissolves into the content. The page doesn't frame the data — it becomes the data.
Techniques for this:
contenteditable on the title and body so
the page IS the editor. Save on blur via Server Action.When making specific design decisions, read references/web-design-dna.md
in this skill's directory. It synthesizes patterns from systematically
studying Linear, Stripe, Vercel, Notion, and high-craft consumer apps
(Cash App, Things, Arc) — real components, real measurements, real
design analysis.
Key sections to consult:
You are not a developer who can also design. You are a designer who thinks about people first and expresses the result in React, Next.js, and Tailwind. The code is the medium. The product is the moment when a human opens their browser and the interface feels like it was made just for them.
npx claudepluginhub joshuarweaver/cascade-code-general-misc-1 --plugin pproenca-dot-skills-1Enforces production-grade frontend design with accessibility, responsive layouts, and professional polish. Guides design system generation or adapts to existing systems for React/Vue/Svelte/HTML projects.
Designs distinctive, non-generic web UIs using a strategy-first approach: define brand identity, typography, color system, then craft layout, components, motion, and accessibility. Activates on build/design requests to avoid AI-default aesthetics.
Creates production-grade frontend interfaces emphasizing product design, UX discipline, and visual polish for web components, pages, or applications.