The index
Every ruling as the skill states it, with the area it lives in, how hard it is, and what the number rests on. Parsed from the reference files at build time, so this list is the skill rather than a copy of it.
wcag-contrastContrast RatioBody text clears 4.5:1 against what it actually renders on. Large text and any control that carries meaning clear 3:1.
red-green-color-blindnessNever Color AloneAny state encoded in color carries a second signal: a label, an icon, a pattern, or a position.
dark-mode-color-adaptationThree Axes, Three JobsHold hue, cut chroma, raise tone until it measures. Never invert lightness and call it done.
luminance-vs-lightnessLightness Is Not LuminanceNever reason about contrast in HSL.
cielab-color-spacePerceptually Uniform SpacesUse CIELAB or OKLCH for color difference; use luminance for contrast. They answer different questions.
ramp-structureA System Is Ramps, Not ColorsOne neutral ramp, one accent ramp, and only the status ramps the product actually renders.
ramp-constructionHold the HueEven perceived steps, constant hue, vividness peaking in the middle, and neither end reaching pure black or white.
color-namingPrimitives Hold Values, Semantics Hold JobsA component never references a primitive.
token-role-disciplineUse a Token Only in Its RoleNever borrow a token because its value happens to be right today.
one-color-one-meaningOne Color, One MeaningTreat anything within 15° of hue as the same color, and give it one job across the whole interface.
fill-one-actionFill Exactly One Action Per ViewThe color goes on the background, not on the label.
color-scaleBuilding the RampStart at the middle, fix the ends, then fill in.
greyscaleStructure Before ColorIf the hierarchy fails in grey, color will not rescue it.
60-30-10Proportion the PaletteThe accent works because it is rare.
color-temperature-dominanceLet One Temperature WinAvoid a 50/50 warm/cool split at similar luminance.
saturation-controlSaturation by RoleBackgrounds calm, controls moderate, calls to action loud.
simultaneous-contrastColor Is Read RelativelyTest brand colors on the surfaces they will actually sit on, never in isolation.
color-constancyColors Move Under Real LightCheck the palette under warm light before shipping it.
color-psychologyAssociations Are ConventionsTreat color meaning as a Western market convention you are choosing to use, not a constant you can rely on.
gradient-interpolationChoose the Interpolation SpaceThe space is a look, not a correctness setting.
rgb-vs-cmykEmitted and Reflected Are Different GamutsCMYK without a named profile is undefined.
type-hierarchyBuild the Scale From a RatioPick one ratio, generate every size from it, and never skip a heading level.
line-lengthCap the Measuremax-width: 65ch on anything anyone will read a paragraph of.
line-heightLeading Runs Inverse to SizeBigger text, tighter leading. Set it unitless.
three-line-leadingLeading Floor for Wrapping TextAnything that wraps to three lines or more gets at least 1.4, whatever the row height wants.
text-alignmentLeft, With Few ExceptionsBody copy is left-aligned in LTR. Centered text stops at three lines. Numbers go right.
font-weight-contrastTwo Steps Between LevelsBody 400, headings 600 or above. Adjacent weights do not read as rank.
weight-size-floorWeight Floors by SizeNothing under 400 below 18px. Nothing under 300 outside display.
x-heightPerceived Size Is X-HeightTwo faces at the same point size are not the same size.
font-pairingMatch Proportion, Contrast FunctionSimilar x-heights, clearly different jobs. Two faces, rarely three.
wcag-typographyText Must Survive the ReaderThe layout does not break when someone zooms to 200% or overrides spacing.
text-wrapFour Declarations, Four JobsOpens with a table. See Typography in the skill.
letter-spacing-by-sizeTracking Follows SizeNegative on large headings, positive on small caps labels, nothing on body.
all-caps-fatigueCaps for Labels OnlyShort labels, tags, single-line headings. Never a paragraph.
ios-input-zoom16px Inputs on MobileBelow 16px, iOS Safari zooms the entire page on focus.
variable-fontsWorth It From Three WeightsBelow three weights, a subsetted static file is usually smaller.
typeface-vs-fontThe Distinction That Matters in CSSA typeface is the design; a font is one instance of it. CSS matches on the family name and picks the instance.
font-synthesisLoad the Real FacesShip the cuts the design uses. Do not let the browser invent them.
smart-punctuationReal Punctuation, Natural CaseStore text in natural case; control presentation in CSS.
underline-metricsUnderlines From the FontTake position and thickness from the face's own metrics.
small-capsTrue Small Caps Onlyfont-variant-caps: small-caps, plus tracking. Verify the face has smcp.
ligaturesDefaults Are Right; Know When to Switch OffStandard ligatures stay on. Discretionary and historical stay off. Both are already the browser default.
font-smoothingRoot-Level Rendering SettingsSet smoothing once on the root. Never per component.
proximityDistance Encodes RelationshipEqual spacing everywhere means no hierarchy anywhere.
padding-gap-ratioPadding Exceeds the GapContainer padding ≥ 1.5× the gap to its siblings, at every nesting level.
group-with-spaceSpace First, Lines LastSpace groups. Background shapes group. Lines group only when space cannot.
8pt-gridOne Base Unit for SpacingMultiples of 8 for spacing and sizing. Line heights use 4.
4pt-systemThe Half-Step8pt for structure, 4pt for type and detail.
baseline-gridVertical Rhythm on FoursLine heights are multiples of 4: 16, 20, 24, 28, 32.
active-white-spaceEmptiness That CommunicatesSpace placed to direct attention is design. Space left over is not.
controls-distinctControls Must Look Like ControlsEvery interactive element gets a background, a border, or a consistent placement zone.
progressive-disclosure-cueHidden Needs a HintContent hidden with no cue may as well not exist.
content-breakpointsBreak Where Content BreaksBreakpoints come from the layout failing, not from device presets.
translation-growthText GrowsNo fixed width or height on a text container. A one-word button is the riskiest label on the screen.
content-bleeds-controls-floatBleed and InsetBackgrounds reach the edge. Controls and text do not.
manuscript-gridOne Column, Four MarginsText-primary layouts need an explicit max-width or the measure runs away.
twelve-column-gridTwelve Divides WellThe advantage is arithmetic and interoperability, not perception.
modular-gridColumns and RowsFor layouts needing vertical and horizontal control at once.
wcag-layoutReflow, Orientation, Drag, Target SizeThe layout works at 320px, in both orientations, without a mouse, at 24px minimum targets.
touch-targetSize the Hit Area, Not the Glyph24×24 is the floor. 44×44 on touch and 40×40 on desktop is the target. Padding counts.
link-designThe Underline Is the AffordanceInline links are underlined. Removing it on hover is backwards.
wcag-formsLabel, Describe, Don't Re-AskOpens with a table. See Controls & forms in the skill.
wcag-imagesEquivalent Purpose, Not DescriptionThe alternative serves the same purpose. For a control, that is the action.
wcag-motionFlashing and Vestibular SafetyNothing flashes more than three times a second. Non-essential motion is disableable.
concentric-radiusOuter Equals Inner Plus PaddingouterRadius = innerRadius + padding
shadow-as-borderShadows for Depth, Borders for StructureWhere a border exists only to create depth, replace it with a layered transparent shadow.
image-outlinesA Neutral Hairline, Never Tinted1px at 0.1 opacity. Pure black in light, pure white in dark.
press-scale0.96 on ClickTactile confirmation that the interface registered the press.
theme-switch-suppressionSuppress Transitions on the FlipInject transition: none, force a reflow, then remove it on the next frame.
surface-elevationLayering Should WhisperYou should barely notice the system working.
border-disciplineFindable, Not VisibleIf borders are the first thing you see, they are too strong.
depth-strategyPick OneOpens with a table. See System craft in the skill.
token-architectureThe Roles a Product UI Actually NeedsEvery color traces to a primitive. No literal hex in a component.
interactive-statesFive, Plus Three for Datadefault · hover · active · focus · disabled, plus loading · empty · error for anything rendering data.
tabular-numeralsFixed-Width Figures Wherever They Stackfont-variant-numeric: tabular-nums on tables, totals, counters, timers, badges and prices.
icon-restraintIcons Clarify or GoIf removing the icon loses no meaning, remove it.
default-tellsRecognise Your Own DefaultsOrdinary is decided. Generic is undecided. They look different.
shadow-fundamentalsOne Light, From AboveShadows point down. Depth starts at the edge, not at the shadow.
elevation-systemFive or Six Levels, TokenisedHigher elevation means larger blur and offset, softer and lighter, because the light is further away.
raised-vs-insetZ-Axis Is Not DecorationRaised: shadow below, light top edge. Inset: shadow above, light bottom edge.
icon-stroke-weightMatch the Adjacent TextIcon weight is a function of the label beside it, not an independent choice.
icon-bounding-boxOne Frame, Variable PaddingFixed frame across the set; padding varies by optical weight.
icon-optical-balanceCentre by Mass, Not by BoxOffset 1–3px toward the lighter side. No formula covers every shape.
icon-alignmentAlign to Cap HeightNot the baseline, and not the em box.
icon-color-statesOne SVG, RecoloredNever ship separate assets for hover, selected and disabled.
icon-render-sizeDesign at the Size It ShipsAn icon that reads at 48px can be mush at 16px.
icons-rtlFlip Only What Reading Direction OwnsOpens with a table. See Depth & icons in the skill.
animation-necessityAsk Whether, Before Asking WhichFrequency decides. The first question is never the easing curve.
animation-durationUnder 300msOpens with a table. See Motion in the skill.
easing-curvesEase-Out by DefaultOpens with a table. See Motion in the skill.
enter-exit-asymmetrySlow to Decide, Fast to RespondExit is faster than enter. The user has already committed.
subtle-exitExits Do Not Fight for AttentionSmall fixed translateY, around −12px. Never the full container height.
never-scale-zeroNothing Appears From NothingStart at scale(0.95) with opacity: 0.
transform-originPopovers Scale From Their TriggerOpens with a table. See Motion in the skill.
staggerCap the Run30–80ms between items [convention], capped at about 6 items / 180ms. Everything after lands at once.
staged-enterSplit Semantic ChunksFor an infrequent staged entrance where sequence communicates hierarchy.
icon-transitionsContextual Icon SwapsAnimate opacity, scale and blur. Never toggle visibility.
spring-physicsSprings for Interruptible MotionSprings maintain velocity when interrupted. CSS animations restart from zero. That is the entire reason to reach for one.
gesture-physicsDrag Should Obey PhysicsOpens with a table. See Motion in the skill.
animation-performanceTransform and Opacity OnlyThey skip layout and paint and run on the GPU. Everything else triggers all three rendering steps.
transition-specificityName the PropertiesNever transition: all, and never Tailwind's transition-all.
will-change-disciplineA Hint, Not a HabitOnly transform, opacity and filter. Never all. Add it when you observe first-frame stutter, not before.
hover-gatingGate Hover to Real PointersOpens with a table. See Motion in the skill.
motion-restraintMotion Is Never the Only ChannelEvery animated state change also carries a static cue: color, an icon, or a label.
reduced-motionGentler, Not Absentprefers-reduced-motion: reduce means fewer and gentler. Never no feedback.
seam-principleMost Transition Problems Are Layout ProblemsThree ways to handle a cut, in order of preference.
reveal-choreographyGroup by Perceptual UnitThe staircase is the most common smoothness failure in an otherwise well-built page.
state-transition-timingThe Reference TableOpens with a table. See Motion in the skill.
numbers-in-motionChanging Values JitterOpens with a table. See Motion in the skill.
state-ledgerDecide Every State, in WritingA missing state and a state you decided against look identical in a codebase. The difference is that one was a decision.
empty-statesEmpty Is Three StatesAll three render zero rows, which is why they get one screen. That screen is wrong for two of them.
loading-strategyChoose by Layout KnowabilityNot by taste, and not by what the component library ships.
partial-dataReal Records Have HolesNull fields, 404 images, no avatar, a blank optional bio. All of these render.
error-taxonomyKind First, Then PlacementOpens with a table. See Non-happy states in the skill.
optimistic-rollbackThe Reverse Is the Hard PartAn invisible revert means the user believes their change stuck.
overflow-pressureThe Layout Under LoadCheap to test, and it is what breaks in production.
offline-staleIs This Screen Lying?For every value: if this is thirty minutes old, can the user act on it and be wrong?
permission-states403 and 404 Are a Design DecisionRevealing that a record exists to someone not allowed to see it is a leak.
end-of-listTerminus, Settled, and ContinuityOpens with a table. See Non-happy states in the skill.
native-elements-firstDon't Rebuild What ShipsThe first rule of ARIA is not to use ARIA when a native element exists.
focus-visibleStyle the Right Pseudo-Class:focus-visible, not bare :focus. Prefer the browser's own indicator.
keyboard-patternsFollow the APGOpens with a table. See Accessibility in the skill.
focus-trapTrap on Open, Restore on CloseOpens with a table. See Accessibility in the skill.
hit-area-extensionGrow the Target, Not the GlyphOpens with a table. See Accessibility in the skill.
form-controlsLabel, Type, and Never Block PasteOpens with a table. See Accessibility in the skill.
error-announcementEnabled Until SubmittedOpens with a table. See Accessibility in the skill.
live-regionsThree Mechanisms, Three JobsOpens with a table. See Accessibility in the skill.
alt-by-purposeDescribe the Job, Not the PictureOpens with a table. See Accessibility in the skill.
voice-and-toneOne Voice, Tone Flexes With StakesThe product has one voice, established by its existing copy. A local edit does not get to invent a new one.
consistent-vocabularyOne Noun, One Verb, Per ConceptIf the empty state says "projects", the summary says "workspaces" and the button says "boards", the product has three mental models.
link-textMake Sense Out of ContextScreen reader users navigate by a list of the page's links, stripped of surrounding prose.
error-copySay How to Fix It, Where It BrokeAn error is an instruction, and it belongs beside the field that failed.
empty-state-copyOrientation Plus a Next StepSay what this place is, how to fill it, and offer one clear action.
toggle-labelsDescribe the ON State"Send read receipts", not "Don't send read receipts".
capitalization-policyOne Policy Per Element TypePick title case or sentence case per element type, then apply it to every instance of that type.
no-string-concatenationNever Assemble a SentenceOpens with a table. See Interface copy in the skill.
emphasisEmphasis Is RelativeOne primary focal point per functional layout. Everything else supports it.
visual-weightSix Channels, Honestly LabelledSize, saturation, luminance contrast, position, isolation, shape.
hierarchy-channelsSeparate Levels on More Than One ChannelCombine size, weight and letter-spacing. Never rely on size alone.
rule-of-thirdsA Heuristic With Weak EvidenceTry it, then try centred, then decide. It is not a law and it has no normative backing.
golden-ratioA Proportioning Start, Not a Guarantee61.8 / 38.2 is a reasonable place to begin a two-column split. That is the whole claim.
rule-of-oddsOdd Groups Resolve FasterThree is the smallest group that establishes a hierarchy.
corner-radius-toneRadius Carries Tone, Consistency Carries MoreOpens with a table. See Hierarchy in the skill.
pie-chart-problemEncode on the Accurate ChannelsAngle and arc are near the bottom of the perceptual accuracy ranking. Use a bar chart on a shared baseline.
handmade-vs-polishedRegister Is a Choice, Not a Quality LevelNeither is better. Context decides which one earns trust.
jakobs-lawConvention Is Accumulated LearningPeople spend nearly all their time in other products. Yours is judged against the habits those built.
millers-lawWorking Memory Is Small, and Chunks Are the UnitStructure beats count. Ten organised items beat five chaotic ones.
chunkingGroup Before You PlaceThree to five per group, and a gap between groups at least 1.5× the gap within.
hicks-lawChoice Cost Is LogarithmicDoubling the options adds a constant, not a doubling.
subitizingFour Is Instant; Five Is CountingKeep anything meant to be grasped at a glance at four or fewer.
von-restorff-effectOne Isolate Per GroupA second highlight cancels the first.
inattentional-blindnessVisible Is Not SeenSalience is necessary and not sufficient. Match the alert to the task's features.
default-effectPreselection PersistsDefaults are a design decision with a legal boundary.
decoy-effectAsymmetric Dominance Shifts ChoiceA third option that is clearly worse than the target makes the target win the comparison.
peak-end-ruleMemory Keeps the Peak and the EndingDesign those two moments. The average is not remembered.
picture-superiorityDistinctiveness, Not ImageryAn image beats a word when the image is distinctive and relevant. Otherwise it does not.
stroop-effectKeep Color and Meaning CongruentSuccess is green, error is red, warning is amber. Do not recolor them for the palette.
reward-anticipationAnticipation, With an Ethical BoundaryUncertainty before an outcome drives engagement. That is a reason to be careful with it, not a licence to use it.
ebbinghaus-illusionSize Is Judged Against NeighboursKeep sibling elements the same size when their size means something.
optical-centerThe Visual Centre Sits Highalign-items: center reads as sagging.
center-biasFirst Fixation Lands High of CentrePut the primary call to action at 45–48% of height, not 50%.
muller-lyer-illusionCap Direction Biases Perceived LengthKeep arrow and chevron caps consistent across elements meant to compare.
irradiation-illusionLight on Dark Reads LargerReversed type and icons may need marginally less weight. Judge it visually.
bouba-kiki-effectCurvature Carries ToneRound reads approachable, angular reads precise, until color and weight say otherwise.
viewing-distanceDistance Sets Everything ElseThe distance a medium is read from determines its type size, contrast and detail density.
visual-angle-arcminutesThe Eye Measures AnglePerceived size is physical size divided by viewing distance. Size on the page means nothing without a stated distance.
aspect-ratiosRatio Belongs to ContextOpens with a table. See Beyond the screen in the skill.
logo-clearspaceA Protected Zone, Defined as a RatioMinimum 1× on all four sides, expressed as a ratio so it scales with the mark.
logo-variationsSix Types, Three LockupsOpens with a table. See Beyond the screen in the skill.
joint-croppingDo Not Cut at a JointCrop through the middle of a limb segment, roughly 10% of its length from the nearest joint [convention].
dieline-bleedErrors Become PhysicalA dieline is a vector 2D document defining every cut, crease, perforation and glue line in the flat unfolded state. Not a mockup, not a render.
cmyk-vs-pantoneSpec Both, AlwaysA PMS-only spec on a 4-color press forces an uncontrolled conversion.
iso-216The Only Self-Similar RatioEvery A-series sheet is 1:√2, so halving along the long edge yields the next size at identical proportions.