Ui design craft
Skill F-e-u-e-r/opus-pack/design-pack/skills/ui-design-craft
Static visual judgment for generated or restyled UI. Load when you are about to produce or modify any user-facing surface - a landing/marketing page, product screen, mockup, or component styling - when a brief says "make it look good/premium/modern" with no design system attached, or when you notice generated UI converging on default AI aesthetics. NOT for motion decisions (motion-craft), for running a measured design review (design-review-gate), for charts (the environment's dataviz tooling), or for native mobile idiom questions (Apple HIG / Material directly).From its SKILL.md
npx -y skills add F-e-u-e-r/opus-pack --skill ui-design-craftAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
16.1 KB, ~3.9k tokens by cl100k_base, as published. Nobody here has run it
UI Design Craft
AI-generated UI fails in a recognizable direction: it optimizes for the safe average. The counter is not taste words - it is bans with exact signatures, budgets with numbers, and a mechanical gate. One meta-rule governs the whole file, learned from production tests upstream: "use sparingly" does not transfer to a generating model; binary phrasing and countable caps do.
0. Classify the surface before generating anything
First action, before any code or mockup:
- MARKETING (landing, portfolio, about, pricing): all sections below apply, §2 layout budgets included.
- APP UI (dashboard, admin, dense product screens - including the chrome AROUND embedded tables and editors): route the visual system to an established design system (Material, Fluent, Carbon, Polaris, or the project's own); from this file everything EXCEPT §2 applies - the §1 bans, §3 discipline, §4 states, §5 floors, §6 preservation on restyles, and §7's gate minus its MARKETING group. The §2 marketing budgets do NOT apply - a dashboard is allowed to be dense and repetitive.
- HYBRID (product site with embedded app screens): classify each section.
- Out of scope entirely - say so and route: the INTERNALS of data-grid and code-editor widgets (TanStack/AG Grid, Monaco/CodeMirror - theme them through their official APIs; the app chrome around them stays in scope above), native mobile idiom (HIG/Material), realtime collaboration surfaces.
- If the project has a governing design contract (DESIGN.md, tokens file,
brand guide), it outranks every default in this file - verify and consume
it per
design-review-gate("the design contract"); the bans below still apply to whatever the contract leaves open.
1. The ban list (AI tells, with signatures)
Hard bans by default; a ban yields only to an explicit brand fact or brief requirement, stated in writing ("the brand IS purple" unlocks purple - the override is the recorded reason, never silent).
Color tells
- Default indigo/violet accent:
#6366f1 #4f46e5 #8b5cf6 #7c3aedand their Tailwind neighbors. The single most reliable AI fingerprint. - The "premium consumer" beige+brass+espresso family applied to every luxury/artisan/wellness brief; same for olive/clay/terracotta earth tones as an unresearched default.
- Evenly distributed color with no accent hierarchy; semantic colors (error/success) reused decoratively.
Typography tells
- Fraunces or Instrument Serif as unjustified display defaults (the two LLM-favorite serifs); any serif repeated from your previous project.
- The decorative one-word swap: one headline word italicized, serif-ed, or color-shifted purely to feel "designed". Distinction comes from layout, scale, weight, or media - not a costume on one word.
- Em-dash in generated page copy: zero, everywhere on the page - headlines, body, captions, buttons, alt text. Upstream production tests found models ignore "limit em-dashes"; only the binary form holds. Use a hyphen or restructure. (Scope: copy on generated surfaces - not code, not prose documents.)
- ALL-CAPS or small labels without letter-spacing; italic descenders clipped by tight line-height (leading below ~1.1 with no padding).
Container tells
- Cards as the default grouping: if removing border+shadow+background+radius hurts nothing, it was never a card - use sections, columns, dividers.
- Decorative left accent stripe (
border-left: 4px solid <accent>): stripes carry meaning (status, priority, selection) or they go. - The 3-column icon-in-colored-circle feature grid, repeated symmetrically - the single most recognizable signature of generated marketing pages.
- "Split header" (huge left headline + small floating right paragraph) as a section-header default; stack vertically instead, max-width ~65ch.
- Hairline borders above AND below every row of a list or spec table.
- Standard emoji standing in for icons: use an icon set or a plain Unicode glyph (an arrow, a bullet, a diamond) - emoji as UI iconography reads as unfinished work.
Label and meta tells
- Eyebrow labels (small caps tracking-wide strings above headlines) above every section. Cap: at most 1 eyebrow per 3 sections, hero included - the check is a count, see §7.
- Section numbering (
001 · Capabilities), version stamps in heroes or footers (v0.6,BETA,Build 0048), pagination on tiles (01 / 4). - Locale/weather/time strips ("LIS 14:23 · 18°C"), scroll cues ("Scroll to explore"), decorative status dots, poetic section labels ("From the field", "Quietly trusted by"), generic step labels ("Step 1 / Step 2" - the verb is the label: "Install", "Configure", "Ship").
- Middle-dot separator chains ("foo · bar · baz · qux") - max one
·per metadata line.
Fake-content tells
- Div-built fake product UI in the hero (fake terminal, fake dashboard of styled divs) - use a real screenshot, a real component, or nothing.
- Placeholder people ("Jane Doe", "John Smith"), invented testimonials, fake logos, fake metrics. Absent real content, design the empty state.
- Image-led direction collapsed to text-only because no image was handy: preserve the media slot with honest dimensions and an art-direction note instead of faking imagery with CSS blobs.
Mode tells
- Dark mode as an unrequested default: light is the baseline unless the brief says otherwise (dark is a brand decision, not a vibe).
- "Calm editorial" autopilot (cream canvas + oversized serif + airy spacing) on products that need utility or proof. Before using it, write down why THIS product earns an editorial voice; no written reason, no serif system.
2. Layout budgets (MARKETING surfaces)
- Hero: headline max 2 lines desktop; subtext max 20 words; at most 4 text elements total (one eyebrow-or-brand-strip, headline, subtext, CTA row of 1 primary + max 1 secondary); CTAs visible without scrolling; top padding capped ~6rem. Trust logos, pricing teasers, and feature bullets live in sections BELOW the hero, never inside it. If the value proposition does not fit in 20 words, the proposition is unclear - fix that, not the rule.
- Headline scale is planned with the asset: 3-5 word headlines may take the largest scale; 6+ words step down one or two sizes. A hero headline wrapping to 4 lines is a font-size error, not a copy problem.
- Navigation: single line at desktop, height max 80px (default 64-72px). A two-line desktop nav is broken, not cozy.
- Section rhythm: a layout family (3-col cards, full-width quote, text+image split...) appears at most once per page - which itself forces variety, no separate diversity quota needed; max 2 consecutive alternating image/text "zigzag" sections - the third consecutive is a gate failure.
- Bento grids: exactly as many cells as there is content (3 items = a 1+2 or 2+1 composition, never a blank filler tile), and at least 2-3 cells carry real visual variation (image, tinted background, pattern) - not six white-on-white text tiles.
- Mobile collapse is declared per section in the same component; "the framework will handle it" is not a declaration.
3. Type and color discipline
- Hierarchy has 3-4 distinct levels, differentiated by weight and spacing, not size alone.
- Accent budget: at most 2 visible accent uses per screen. Spend them deliberately - a highlighted label plus the primary action is the usual allocation. Links draw from the same budget; once it is spent, style them as underlined foreground text instead.
- One lock each per page: ONE theme (no section flipping to inverted mid-page), ONE accent applied identically, ONE corner-radius system.
- Contrast floors (WCAG AA): text needs 4.5:1 at normal size and 3:1 only at large size (large = at least 24px, or 18.66px bold) - placeholder text and text over images or scrims included, with no exemption for either; non-text UI needs 3:1 where the visual carries identification or state (WCAG 1.4.11's scope - inactive controls and unmodified browser defaults are exempt, and a decorative boundary not needed to identify the control is too; this pack treats focus and state indicators as always in scope, a deliberately stricter pack floor); secondary BODY-size text needs 4.5:1 in both color modes - dark-mode secondary text is where this fails silently.
- Micro text is whitelisted, not vibes-based: the smallest size (11px and below) appears only in an enumerated role list you can state (timestamps, badge pills, axis labels...) - any other use upgrades a size.
4. State coverage - the most reliable generated-UI failure
Shipping only the populated state IS the failure mode. Every surface that fetches, accepts, or transforms data renders five states before it is done:
| State | Must contain |
|---|---|
| Loading | skeleton/spinner plus a "taking longer than expected" fallback after ~10-15s |
| Empty | headline, plain explanation, primary CTA - designed, not blank |
| Error | plain-language cause, recovery action, user input preserved |
| Populated | the case you actually designed |
| Edge | extreme volume, long unbroken strings, missing optional fields |
Edge matrix to actually try: 10,000-row table with sort+filter; 200-char title with no spaces; missing avatar/optional field; 0 results after a filter; offline mid-submit. Render each and look - reading the code is not rendering.
5. Platform floors (APP and touch surfaces)
- Touch targets: 44x44pt (iOS) / 48x48dp (Android) minimum - the vendors' published guidance (Apple phrases it as a rule, Android as a recommendation), adopted here as hard pack floors. Audits measure CSS px (~= pt/dp at 1x) and apply to touch-capable surfaces; a desktop-pointer-only UI may go smaller with the reason recorded.
- Modal scrims visibly isolate the foreground: content behind reads as inert, and any text sitting over the scrim still meets the §3 floors. Vendor anchor: Material defines scrim as a color ROLE, commonly rendered at a 32%-black component default (Compose drawers, container transform) - start there; heavier is a legitimate brand choice, while a missing or near-invisible scrim is a defect.
- Press/hover states never shift layout (no border-width or size jumps - swap colors/elevation instead).
- Every SUPPORTED color mode rendered and looked at before done, with every applicable §4 state checked in each. A single-mode product passes as single-mode - supporting dark is a product decision, and §1's tell is about DEFAULTING to dark unasked, not about supporting it. Dark-mode regressions hide in secondary text and disabled states.
6. Restyling an existing surface: preservation rules
A redesign is a visual change, not a silent content or interface change. Never modify without explicit approval: URL slugs and anchor IDs, primary nav labels, form field names and order (autofill + analytics depend on them), the logo/wordmark, legal and consent copy. Extract existing brand colors FIRST - a purple brand stays purple, overriding §1's indigo ban. Never regress accessibility already present (focus states, alt text, keyboard paths, contrast). These names are interfaces with hidden consumers
- operational-rigor's call-site sweep applies to them, verbatim: "Interfaces include observable output text and names." (canonical copy in operational-rigor §3; on disagreement that file wins).
7. The pre-flight gate (mechanical)
Run before delivering the surface. Every box, honestly; if a single box cannot be honestly ticked, the surface is not done. Counts are counted, not estimated. Boxes group by §0's surface class - an APP UI surface skips the MARKETING group because §0 scoped those budgets out, not as an escape hatch.
All surfaces:
- Surface classified (§0) and, for APP UI, a design system named?
- Zero em-dashes in page copy (search the output for the character)?
- Accent count per screen <= 2, and accent is none of the §1 hexes - or the §1 brand override is quoted in writing? Check the COMPUTED color (getComputedStyle), not only a hex grep - rgb()/hsl() spellings evade a literal search.
- One theme lock, one accent lock, one radius system?
- WCAG AA floors pass for text, CTAs, forms, placeholders, focus rings?
- §4 states: all five rendered and looked at on every surface that fetches, accepts, or transforms data; purely static surfaces get an explicit N/A (say so, don't skip silently)?
- No banned tell present without a written brand/brief override?
- Restyle only: §6 preservation list untouched or approval quoted?
MARKETING surfaces (and the marketing sections of a HYBRID):
- Eyebrow count <= ceil(sections / 3) (count uppercase-tracking labels)?
- Layout-family repetition within budget; zigzag run <= 2?
- Hero: <= 2-line headline, <= 20-word subtext, <= 4 text elements, CTA above the fold?
APP UI surfaces:
- Touch targets and scrim floors met (§5)?
Litmus checks when a box feels arguable:
- Card test: remove border/shadow/background - if nothing breaks, it was not a card.
- Identity test: hide the logo - if the first viewport could belong to any company, the design is not done.
- Editorial test: swap the logo for a boutique hotel's - if the hero still reads plausible, you built generic calm-editorial, not this brand.
When NOT to use this skill
- Motion decisions (durations, easing, springs) ->
motion-craft. - Running a measured review with a fix loop ->
design-review-gate; its static pass applies this file's gate. - Charts and data visualization -> the environment's dataviz tooling.
- Native mobile idiom -> Apple HIG / Material directly.
- Brand identity creation (naming, logo) - out of scope for this pack.
Provenance
Composed 2026-07-19 for design-pack 0.1.0. The ban corpus and layout budgets are curated - deliberately not imported wholesale - from three MIT sources verified in their repos at composition time: Leonxlnx/taste-skill (layout hard rules incl. hero/nav/zigzag/bento/eyebrow caps and their mechanical counts, the production-test tell corpus, the em-dash binary and its "use sparingly fails" lesson, preservation rules, the pre-flight if-one-box-fails framing; its full §9-10 corpus remains the deeper upstream reference), referodesign/refero_skill (indigo/cards/dark-default/calm- editorial/emoji/stripe tells, litmus tests, media-slot preservation), and Emil Kowalski's skills (context; his marketing directives stripped). From Apache-2.0 nexu-io/open-design: the accent-budget number and tiered-ban severity as ideas, and §4's five-state table as ADAPTED EXPRESSION carried under Apache-2.0 (notice in THIRD-PARTY-NOTICES) - not an ideas-only borrow. Ideas without text from MIT garrytan/gstack (surface classifier, icon-circle-grid tell - independently listed by taste-skill) and MIT creativetimofficial/ui (micro-text whitelist technique). WCAG/HIG/Material floors are vendor facts - re-verify on major vendor releases; hex lists and font-fashion bans are the fastest-decaying facts here (they track model training data - revisit each model generation). Probe status: probe-tested 2026-07-19 on a private planted-slop fixture (fresh weak-tier agent, n=1 per arm, smoke grade): the bare arm found 0 of 7 planted tells - returning CSS-engineering nits instead - while the ruled arm found 6 of 7 with rule citations plus budget catches beyond the plants; it missed the em-dash tell, recorded as the arm's one gap (rule retained - one miss is not yet a wrong rule, skill-authoring §7). A round-0 run was voided for a leaked in-fixture answer key, caught by the expected-before-actual discrepancy rather than the score. Trail in the design-pack PR.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most design frontend skills give in ~3.9k tokens
Counted across 1,169 of the 1,878 authors here whose files we hold, read 2026-08-07
- Use CSS variables for color consistencyin 72 of 1169, across 23 files
- Commit to one bold aesthetic direction before codingin 72 of 1169, across 27 files
- Match implementation complexity to the aesthetic visionin 70 of 1169, across 20 files
- Add atmospheric background effects and texturesin 57 of 1169, across 9 files
- Use unexpected spatial compositions and layoutsin 56 of 1169, across 8 files
- Implement real working codein 55 of 1169, across 7 files
- Vary themes and aesthetics across different designsin 48 of 1169, across 7 files
- Launch chromium in headless modein 47 of 1169, across 4 files
- Close the browser when donein 47 of 1169, across 4 files
- Run provided scripts with help flag firstin 47 of 1169, across 4 files
- Wait for network idle statein 47 of 1169, across 4 files
- Use descriptive selectors for elementsin 47 of 1169, across 4 files
Said here and by no other author read
- classify the surface before generating any code
- apply an existing design system for app surfaces
- obey a governing design contract over defaults
- use plain hyphens instead of em-dashes in copy
- allow at most two visible accent uses per screen
- use at most one layout family per page
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.