ss-review
Review UI code for design system compliance, accessibility, and best practices
By bitjaru · 746 installs
npx skills add bitjaru/styleseed --skill ss-review
Source repository · Upstream listing
UI Design Review
Registry first artifact boundary
When .styleseed/project.json and .styleseed/artifacts/index.json exist, resolve the requested artifact ID first, then read only .styleseed/bundles/<artifact id .md and .styleseed/manifests/<artifact id .json . Never fall back to the global legacy bundle for a registry project. Legacy projects may use .styleseed/effective rules.md only when no registry exists.
Read .styleseed/effective rules.md and .styleseed/manifest.json . If missing or stale, invoke
/ss resolve or $ss resolve from STYLESEED.md first. Review task fitness and grammar
coherence before framework conventions. For non web artifacts, replace React/Tailwind only
checks with the active adapter's render/export checks.
When NOT to use
For accessibility only issues → use /ss a11y
For Nielsen UX heuristics → use /ss audit
For a quick automated check → use /ss lint
For non UI code (data fetching, business rules)
Review the file: $ARGUMENTS
Checklist
1. Design Token and Recipe Compliance
[ ] No hardcoded hex colors (use semantic tokens: text foreground , bg brand , etc.)
[ ] No hardcoded px spacing in Tailwind (use p 6 not p [24px] )
[ ] Pattern geometry/elevation uses the selected recipe or explicit semantic variables
[ ] No hardcoded universal rounded 2xl + shadow + mx 6 language across unrelated recipes
2. Component Conventions
[ ] Uses data slot attribute
[ ] Uses cn() for className merging
[ ] Props typed with React.ComponentProps<
[ ] Supports className prop override
[ ] Named export (not default export for components)
[ ] No wrapper components that only add a className
3. Accessibility (a11y)
[ ] Touch targets = 44x44px for interactive elements
[ ] focus visible styles on all interactive elements
[ ] Proper aria attributes where needed
[ ] Color contrast meets WCAG AA (4.5:1 for text, 3:1 for large text)
[ ] Animations respect prefers reduced motion
[ ] Images have alt text
[ ] Form inputs have associated labels
4. Surface Best Practices
[ ] No horizontal overflow
[ ] Touch friendly spacing between interactive elements
[ ] Mobile safe area insets handled when the adapter requires them
[ ] Desktop density/type and non web canvas/export rules follow the selected adapter
[ ] Text sizes = 12px for readability
[ ] Scrollable containers have webkit overflow scrolling: touch
5. Performance
[ ] No unnecessary re renders (stable references, memoization where needed)
[ ] Images are lazy loaded
[ ] Heavy components are code split
6. Typography
[ ] Uses the locked type family and recipe fit type roles
[ ] Font sizes from the 14 step scale (10 48px, see CLAUDE.md)
[ ] Proper font weights (400, 500, 600, 700)
[ ] Display text (36 48px): leading none + tracking [ 0.02em]
[ ] Heading text (18 24px): leading snug + tracking [ 0.01em]
[ ] Body text (14 17px): leading normal (no custom tracking)
[ ] Caption uppercase (10 13px): tracking [0.05em] or tracking wide
[ ] No line height: 1.5 on display/heading text (too loose)
7. Spacing Consistency
[ ] Spacing uses one maintained token scale and the selected recipe's major rhythm
[ ] Off scale values have an optical, canvas, or platform reason
[ ] Uses size shorthand instead of w h
[ ] Uses ms /me instead of ml /mr (logical properties)
[ ] Motion transitions use design tokens ( duration [var( duration fast)] )
8. Coherence (VISUAL CRAFT.md §C0 — the "one choice per axis" laws)
The biggest reason a UI reads as "AI generated" isn't ugly parts — it's mixed
parts. Check that each axis below uses ONE value system wide; flag a mix as a real
issue, not a nitpick.
[ ] One radius personality — sharp (0 4px) OR soft (8 12px) OR pill, applied to every card/button/input/modal. No mixing (e.g. a rounded none panel with rounded full buttons).
[ ] One identifiable primary action plus only the selected grammar's stable semantic,
categorical, or brand roles — no competing decorative emphasis hues.
[ ] No emoji as UI icons (🚗🧺⭐ as list/nav/status/category markers) — they inject many uncontrolled hues; use one line icon set in currentColor .
[ ] Status color = severity, not decoration — a normal/OK/"보통" state is neutral grey (not colored); color marks only the minority of rows that need attention; same value → same color.
[ ] No decorative hues — favorite stars, category dots, avatars use the accent or grey, not a new color each.
[ ] One shadow language — same light direction, same scale/tint; not some black + some tinted, some up lit + some down lit.
[ ] One icon family / fill mode / stroke weight across the file.
[ ] Nested radius law — an element inside a rounded container uses inner = outer − padding , not the same radius (which bulges).
[ ] Consistent control heights — buttons, inputs, selects share a height set (e.g. 40px).
[ ] Errors/states never rely on color alone (icon + text too).
Output Format
Provide:
1. Score : Pass / Needs Improvement / Fail
2. Issues : List each violation with file:line reference
3. Fixes : Concrete code changes for each issue