The index

All 180 rules.

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.

180 of 180 rules

  1. wcag-contrastContrast Ratiocritical[spec][measured]

    Body text clears 4.5:1 against what it actually renders on. Large text and any control that carries meaning clear 3:1.

  2. red-green-color-blindnessNever Color Alonecritical[spec][measured]

    Any state encoded in color carries a second signal: a label, an icon, a pattern, or a position.

  3. dark-mode-color-adaptationThree Axes, Three Jobshigh[spec][convention]

    Hold hue, cut chroma, raise tone until it measures. Never invert lightness and call it done.

  4. luminance-vs-lightnessLightness Is Not Luminancemedium

    Never reason about contrast in HSL.

  5. cielab-color-spacePerceptually Uniform Spacesmedium[convention]

    Use CIELAB or OKLCH for color difference; use luminance for contrast. They answer different questions.

  6. ramp-structureA System Is Ramps, Not Colorshigh

    One neutral ramp, one accent ramp, and only the status ramps the product actually renders.

  7. ramp-constructionHold the Huehigh

    Even perceived steps, constant hue, vividness peaking in the middle, and neither end reaching pure black or white.

  8. color-namingPrimitives Hold Values, Semantics Hold Jobsmedium

    A component never references a primitive.

  9. token-role-disciplineUse a Token Only in Its Rolehigh

    Never borrow a token because its value happens to be right today.

  10. one-color-one-meaningOne Color, One Meaninghigh

    Treat anything within 15° of hue as the same color, and give it one job across the whole interface.

  11. fill-one-actionFill Exactly One Action Per Viewhigh

    The color goes on the background, not on the label.

  12. color-scaleBuilding the Rampmedium

    Start at the middle, fix the ends, then fill in.

  13. greyscaleStructure Before Colormedium[convention]

    If the hierarchy fails in grey, color will not rescue it.

  14. 60-30-10Proportion the Palettemedium[convention]

    The accent works because it is rare.

  15. color-temperature-dominanceLet One Temperature Winmedium[measured][convention]

    Avoid a 50/50 warm/cool split at similar luminance.

  16. saturation-controlSaturation by Rolemedium

    Backgrounds calm, controls moderate, calls to action loud.

  17. simultaneous-contrastColor Is Read Relativelymedium

    Test brand colors on the surfaces they will actually sit on, never in isolation.

  18. color-constancyColors Move Under Real Lightmedium

    Check the palette under warm light before shipping it.

  19. color-psychologyAssociations Are Conventionsmedium[measured][convention]

    Treat color meaning as a Western market convention you are choosing to use, not a constant you can rely on.

  20. gradient-interpolationChoose the Interpolation Spacemedium

    The space is a look, not a correctness setting.

  21. rgb-vs-cmykEmitted and Reflected Are Different Gamutsmedium[spec][measured]

    CMYK without a named profile is undefined.

  22. type-hierarchyBuild the Scale From a Ratiohigh[spec][convention]

    Pick one ratio, generate every size from it, and never skip a heading level.

  23. line-lengthCap the Measurehigh[spec]

    max-width: 65ch on anything anyone will read a paragraph of.

  24. line-heightLeading Runs Inverse to Sizehigh[spec]

    Bigger text, tighter leading. Set it unitless.

  25. three-line-leadingLeading Floor for Wrapping Texthigh

    Anything that wraps to three lines or more gets at least 1.4, whatever the row height wants.

  26. text-alignmentLeft, With Few Exceptionshigh[spec][measured]

    Body copy is left-aligned in LTR. Centered text stops at three lines. Numbers go right.

  27. font-weight-contrastTwo Steps Between Levelshigh[spec][convention]

    Body 400, headings 600 or above. Adjacent weights do not read as rank.

  28. weight-size-floorWeight Floors by Sizehigh

    Nothing under 400 below 18px. Nothing under 300 outside display.

  29. x-heightPerceived Size Is X-Heightmedium[measured]

    Two faces at the same point size are not the same size.

  30. font-pairingMatch Proportion, Contrast Functionmedium[convention]

    Similar x-heights, clearly different jobs. Two faces, rarely three.

  31. wcag-typographyText Must Survive the Readerhigh[spec]

    The layout does not break when someone zooms to 200% or overrides spacing.

  32. text-wrapFour Declarations, Four Jobshigh

    Opens with a table. See Typography in the skill.

  33. letter-spacing-by-sizeTracking Follows Sizemedium

    Negative on large headings, positive on small caps labels, nothing on body.

  34. all-caps-fatigueCaps for Labels Onlymedium[measured][convention]

    Short labels, tags, single-line headings. Never a paragraph.

  35. ios-input-zoom16px Inputs on Mobilehigh

    Below 16px, iOS Safari zooms the entire page on focus.

  36. variable-fontsWorth It From Three Weightsmedium[convention]

    Below three weights, a subsetted static file is usually smaller.

  37. typeface-vs-fontThe Distinction That Matters in CSSmedium

    A typeface is the design; a font is one instance of it. CSS matches on the family name and picks the instance.

  38. font-synthesisLoad the Real Faceshigh

    Ship the cuts the design uses. Do not let the browser invent them.

  39. css-properties-over-tagsProperties Over Feature Tagsmedium

    If a CSS property exists for it, use the property.

  40. smart-punctuationReal Punctuation, Natural Casemedium

    Store text in natural case; control presentation in CSS.

  41. underline-metricsUnderlines From the Fontmedium

    Take position and thickness from the face's own metrics.

  42. small-capsTrue Small Caps Onlylow[convention]

    font-variant-caps: small-caps, plus tracking. Verify the face has smcp.

  43. ligaturesDefaults Are Right; Know When to Switch Offlow

    Standard ligatures stay on. Discretionary and historical stay off. Both are already the browser default.

  44. font-smoothingRoot-Level Rendering Settingslow

    Set smoothing once on the root. Never per component.

  45. proximityDistance Encodes Relationshiphigh

    Equal spacing everywhere means no hierarchy anywhere.

  46. padding-gap-ratioPadding Exceeds the Gaphigh[convention]

    Container padding ≥ 1.5× the gap to its siblings, at every nesting level.

  47. group-with-spaceSpace First, Lines Lasthigh

    Space groups. Background shapes group. Lines group only when space cannot.

  48. 8pt-gridOne Base Unit for Spacinghigh

    Multiples of 8 for spacing and sizing. Line heights use 4.

  49. 4pt-systemThe Half-Stepmedium

    8pt for structure, 4pt for type and detail.

  50. baseline-gridVertical Rhythm on Foursmedium

    Line heights are multiples of 4: 16, 20, 24, 28, 32.

  51. active-white-spaceEmptiness That Communicatesmedium[measured][convention]

    Space placed to direct attention is design. Space left over is not.

  52. controls-distinctControls Must Look Like Controlshigh

    Every interactive element gets a background, a border, or a consistent placement zone.

  53. align-to-shared-edgesFewer Edgeshigh

    Pick alignment edges and hold them. Every stray edge reads as noise.

  54. progressive-disclosure-cueHidden Needs a Hinthigh

    Content hidden with no cue may as well not exist.

  55. content-breakpointsBreak Where Content Breakshigh

    Breakpoints come from the layout failing, not from device presets.

  56. translation-growthText Growshigh

    No fixed width or height on a text container. A one-word button is the riskiest label on the screen.

  57. content-bleeds-controls-floatBleed and Insetmedium

    Backgrounds reach the edge. Controls and text do not.

  58. manuscript-gridOne Column, Four Marginsmedium

    Text-primary layouts need an explicit max-width or the measure runs away.

  59. twelve-column-gridTwelve Divides Wellmedium[convention]

    The advantage is arithmetic and interoperability, not perception.

  60. modular-gridColumns and Rowsmedium

    For layouts needing vertical and horizontal control at once.

  61. wcag-layoutReflow, Orientation, Drag, Target Sizehigh[spec]

    The layout works at 320px, in both orientations, without a mouse, at 24px minimum targets.

  62. touch-targetSize the Hit Area, Not the Glyphcritical[spec][measured]

    24×24 is the floor. 44×44 on touch and 40×40 on desktop is the target. Padding counts.

  63. button-designSix States, All Definedhigh[spec][measured][convention]

    A button with three states is a button that feels broken in the other three.

  64. button-paddingCompensate for the Icon's Masshigh[convention]

    Symmetric padding centres geometry, not visual weight.

  65. wcag-formsLabel, Describe, Don't Re-Askhigh[spec][measured]

    Opens with a table. See Controls & forms in the skill.

  66. wcag-navigationPredictability Across Pageshigh[spec]

    Opens with a table. See Controls & forms in the skill.

  67. wcag-imagesEquivalent Purpose, Not Descriptioncritical[spec][measured]

    The alternative serves the same purpose. For a control, that is the action.

  68. wcag-motionFlashing and Vestibular Safetycritical[spec][measured]

    Nothing flashes more than three times a second. Non-essential motion is disableable.

  69. concentric-radiusOuter Equals Inner Plus Paddinghigh

    outerRadius = innerRadius + padding

  70. shadow-as-borderShadows for Depth, Borders for Structurehigh

    Where a border exists only to create depth, replace it with a layered transparent shadow.

  71. image-outlinesA Neutral Hairline, Never Tintedmedium

    1px at 0.1 opacity. Pure black in light, pure white in dark.

  72. press-scale0.96 on Clickmedium

    Tactile confirmation that the interface registered the press.

  73. theme-switch-suppressionSuppress Transitions on the Fliphigh

    Inject transition: none, force a reflow, then remove it on the next frame.

  74. surface-elevationLayering Should Whisperhigh

    You should barely notice the system working.

  75. border-disciplineFindable, Not Visiblehigh

    If borders are the first thing you see, they are too strong.

  76. depth-strategyPick Onehigh

    Opens with a table. See System craft in the skill.

  77. token-architectureThe Roles a Product UI Actually Needshigh

    Every color traces to a primitive. No literal hex in a component.

  78. interactive-statesFive, Plus Three for Datahigh

    default · hover · active · focus · disabled, plus loading · empty · error for anything rendering data.

  79. tabular-numeralsFixed-Width Figures Wherever They Stackmedium

    font-variant-numeric: tabular-nums on tables, totals, counters, timers, badges and prices.

  80. icon-restraintIcons Clarify or Gomedium

    If removing the icon loses no meaning, remove it.

  81. default-tellsRecognise Your Own Defaultsmedium

    Ordinary is decided. Generic is undecided. They look different.

  82. shadow-fundamentalsOne Light, From Abovehigh[measured]

    Shadows point down. Depth starts at the edge, not at the shadow.

  83. elevation-systemFive or Six Levels, Tokenisedmedium

    Higher elevation means larger blur and offset, softer and lighter, because the light is further away.

  84. raised-vs-insetZ-Axis Is Not Decorationmedium

    Raised: shadow below, light top edge. Inset: shadow above, light bottom edge.

  85. icon-stroke-weightMatch the Adjacent Texthigh

    Icon weight is a function of the label beside it, not an independent choice.

  86. icon-bounding-boxOne Frame, Variable Paddingmedium

    Fixed frame across the set; padding varies by optical weight.

  87. icon-optical-balanceCentre by Mass, Not by Boxmedium[spec][measured][convention]

    Offset 1–3px toward the lighter side. No formula covers every shape.

  88. icon-alignmentAlign to Cap Heightmedium

    Not the baseline, and not the em box.

  89. icon-color-statesOne SVG, Recoloredhigh

    Never ship separate assets for hover, selected and disabled.

  90. icon-render-sizeDesign at the Size It Shipsmedium

    An icon that reads at 48px can be mush at 16px.

  91. icons-rtlFlip Only What Reading Direction Ownsmedium

    Opens with a table. See Depth & icons in the skill.

  92. animation-necessityAsk Whether, Before Asking Whichhigh

    Frequency decides. The first question is never the easing curve.

  93. animation-durationUnder 300mshigh[convention]

    Opens with a table. See Motion in the skill.

  94. easing-curvesEase-Out by Defaulthigh

    Opens with a table. See Motion in the skill.

  95. enter-exit-asymmetrySlow to Decide, Fast to Respondhigh

    Exit is faster than enter. The user has already committed.

  96. subtle-exitExits Do Not Fight for Attentionmedium

    Small fixed translateY, around −12px. Never the full container height.

  97. never-scale-zeroNothing Appears From Nothinghigh

    Start at scale(0.95) with opacity: 0.

  98. transform-originPopovers Scale From Their Triggermedium

    Opens with a table. See Motion in the skill.

  99. staggerCap the Runmedium[convention]

    30–80ms between items [convention], capped at about 6 items / 180ms. Everything after lands at once.

  100. staged-enterSplit Semantic Chunksmedium

    For an infrequent staged entrance where sequence communicates hierarchy.

  101. icon-transitionsContextual Icon Swapsmedium

    Animate opacity, scale and blur. Never toggle visibility.

  102. spring-physicsSprings for Interruptible Motionmedium

    Springs maintain velocity when interrupted. CSS animations restart from zero. That is the entire reason to reach for one.

  103. gesture-physicsDrag Should Obey Physicsmedium

    Opens with a table. See Motion in the skill.

  104. animation-performanceTransform and Opacity Onlyhigh

    They skip layout and paint and run on the GPU. Everything else triggers all three rendering steps.

  105. transition-specificityName the Propertieshigh

    Never transition: all, and never Tailwind's transition-all.

  106. will-change-disciplineA Hint, Not a Habitmedium

    Only transform, opacity and filter. Never all. Add it when you observe first-frame stutter, not before.

  107. hover-gatingGate Hover to Real Pointershigh

    Opens with a table. See Motion in the skill.

  108. motion-restraintMotion Is Never the Only Channelhigh

    Every animated state change also carries a static cue: color, an icon, or a label.

  109. reduced-motionGentler, Not Absentcritical[spec]

    prefers-reduced-motion: reduce means fewer and gentler. Never no feedback.

  110. seam-principleMost Transition Problems Are Layout Problemshigh

    Three ways to handle a cut, in order of preference.

  111. reveal-choreographyGroup by Perceptual Unithigh

    The staircase is the most common smoothness failure in an otherwise well-built page.

  112. state-transition-timingThe Reference Tablehigh[convention]

    Opens with a table. See Motion in the skill.

  113. numbers-in-motionChanging Values Jittermedium

    Opens with a table. See Motion in the skill.

  114. state-ledgerDecide Every State, in Writinghigh

    A missing state and a state you decided against look identical in a codebase. The difference is that one was a decision.

  115. empty-statesEmpty Is Three Stateshigh

    All three render zero rows, which is why they get one screen. That screen is wrong for two of them.

  116. loading-strategyChoose by Layout Knowabilityhigh

    Not by taste, and not by what the component library ships.

  117. partial-dataReal Records Have Holeshigh

    Null fields, 404 images, no avatar, a blank optional bio. All of these render.

  118. error-taxonomyKind First, Then Placementhigh

    Opens with a table. See Non-happy states in the skill.

  119. optimistic-rollbackThe Reverse Is the Hard Parthigh

    An invisible revert means the user believes their change stuck.

  120. overflow-pressureThe Layout Under Loadhigh

    Cheap to test, and it is what breaks in production.

  121. offline-staleIs This Screen Lying?medium

    For every value: if this is thirty minutes old, can the user act on it and be wrong?

  122. permission-states403 and 404 Are a Design Decisionmedium

    Revealing that a record exists to someone not allowed to see it is a leak.

  123. end-of-listTerminus, Settled, and Continuitymedium

    Opens with a table. See Non-happy states in the skill.

  124. native-elements-firstDon't Rebuild What Shipscritical

    The first rule of ARIA is not to use ARIA when a native element exists.

  125. focus-visibleStyle the Right Pseudo-Classcritical

    :focus-visible, not bare :focus. Prefer the browser's own indicator.

  126. keyboard-patternsFollow the APGcritical

    Opens with a table. See Accessibility in the skill.

  127. focus-trapTrap on Open, Restore on Closehigh

    Opens with a table. See Accessibility in the skill.

  128. hit-area-extensionGrow the Target, Not the Glyphhigh

    Opens with a table. See Accessibility in the skill.

  129. form-controlsLabel, Type, and Never Block Pastehigh

    Opens with a table. See Accessibility in the skill.

  130. error-announcementEnabled Until Submittedhigh

    Opens with a table. See Accessibility in the skill.

  131. live-regionsThree Mechanisms, Three Jobshigh

    Opens with a table. See Accessibility in the skill.

  132. alt-by-purposeDescribe the Job, Not the Picturecritical

    Opens with a table. See Accessibility in the skill.

  133. voice-and-toneOne Voice, Tone Flexes With Stakeshigh

    The product has one voice, established by its existing copy. A local edit does not get to invent a new one.

  134. consistent-vocabularyOne Noun, One Verb, Per Concepthigh

    If the empty state says "projects", the summary says "workspaces" and the button says "boards", the product has three mental models.

  135. verb-first-buttonsStart With the Verbhigh

    "Send", "Save draft", "Delete project". Never "OK!", "Let's go!", or a bare "Yes" on a consequential action.

  136. error-copySay How to Fix It, Where It Brokehigh

    An error is an instruction, and it belongs beside the field that failed.

  137. empty-state-copyOrientation Plus a Next Stephigh

    Say what this place is, how to fill it, and offer one clear action.

  138. toggle-labelsDescribe the ON Statemedium

    "Send read receipts", not "Don't send read receipts".

  139. capitalization-policyOne Policy Per Element Typemedium

    Pick title case or sentence case per element type, then apply it to every instance of that type.

  140. no-string-concatenationNever Assemble a Sentencehigh

    Opens with a table. See Interface copy in the skill.

  141. emphasisEmphasis Is Relativehigh[measured][convention]

    One primary focal point per functional layout. Everything else supports it.

  142. visual-weightSix Channels, Honestly Labelledhigh[measured][convention]

    Size, saturation, luminance contrast, position, isolation, shape.

  143. hierarchy-channelsSeparate Levels on More Than One Channelhigh

    Combine size, weight and letter-spacing. Never rely on size alone.

  144. rule-of-thirdsA Heuristic With Weak Evidencemedium[measured]

    Try it, then try centred, then decide. It is not a law and it has no normative backing.

  145. golden-ratioA Proportioning Start, Not a Guaranteelow[measured]

    61.8 / 38.2 is a reasonable place to begin a two-column split. That is the whole claim.

  146. rule-of-oddsOdd Groups Resolve Fasterlow[convention]

    Three is the smallest group that establishes a hierarchy.

  147. corner-radius-toneRadius Carries Tone, Consistency Carries Morelow[convention]

    Opens with a table. See Hierarchy in the skill.

  148. pie-chart-problemEncode on the Accurate Channelsmedium[measured]

    Angle and arc are near the bottom of the perceptual accuracy ranking. Use a bar chart on a shared baseline.

  149. handmade-vs-polishedRegister Is a Choice, Not a Quality Levelmedium[measured]

    Neither is better. Context decides which one earns trust.

  150. jakobs-lawConvention Is Accumulated Learninghigh

    People spend nearly all their time in other products. Yours is judged against the habits those built.

  151. millers-lawWorking Memory Is Small, and Chunks Are the Unithigh[measured]

    Structure beats count. Ten organised items beat five chaotic ones.

  152. chunkingGroup Before You Placehigh[convention]

    Three to five per group, and a gap between groups at least 1.5× the gap within.

  153. hicks-lawChoice Cost Is Logarithmichigh[measured]

    Doubling the options adds a constant, not a doubling.

  154. subitizingFour Is Instant; Five Is Countingmedium[measured]

    Keep anything meant to be grasped at a glance at four or fewer.

  155. von-restorff-effectOne Isolate Per Grouphigh[measured]

    A second highlight cancels the first.

  156. inattentional-blindnessVisible Is Not Seenhigh[measured]

    Salience is necessary and not sufficient. Match the alert to the task's features.

  157. default-effectPreselection Persistsmedium[spec][measured]

    Defaults are a design decision with a legal boundary.

  158. decoy-effectAsymmetric Dominance Shifts Choicemedium[measured]

    A third option that is clearly worse than the target makes the target win the comparison.

  159. peak-end-ruleMemory Keeps the Peak and the Endingmedium[measured]

    Design those two moments. The average is not remembered.

  160. picture-superiorityDistinctiveness, Not Imagerymedium[measured]

    An image beats a word when the image is distinctive and relevant. Otherwise it does not.

  161. stroop-effectKeep Color and Meaning Congruentmedium[measured][convention]

    Success is green, error is red, warning is amber. Do not recolor them for the palette.

  162. reward-anticipationAnticipation, With an Ethical Boundarymedium[spec][measured]

    Uncertainty before an outcome drives engagement. That is a reason to be careful with it, not a licence to use it.

  163. ebbinghaus-illusionSize Is Judged Against Neighboursmedium[measured][convention]

    Keep sibling elements the same size when their size means something.

  164. optical-centerThe Visual Centre Sits Highmedium[measured][convention]

    align-items: center reads as sagging.

  165. center-biasFirst Fixation Lands High of Centremedium[measured]

    Put the primary call to action at 45–48% of height, not 50%.

  166. muller-lyer-illusionCap Direction Biases Perceived Lengthlow[measured][convention]

    Keep arrow and chevron caps consistent across elements meant to compare.

  167. irradiation-illusionLight on Dark Reads Largerlow

    Reversed type and icons may need marginally less weight. Judge it visually.

  168. bouba-kiki-effectCurvature Carries Tonelow[measured]

    Round reads approachable, angular reads precise, until color and weight say otherwise.

  169. viewing-distanceDistance Sets Everything Elsehigh[convention]

    The distance a medium is read from determines its type size, contrast and detail density.

  170. visual-angle-arcminutesThe Eye Measures Anglehigh[spec][convention]

    Perceived size is physical size divided by viewing distance. Size on the page means nothing without a stated distance.

  171. aspect-ratiosRatio Belongs to Contextmedium[convention]

    Opens with a table. See Beyond the screen in the skill.

  172. logo-clearspaceA Protected Zone, Defined as a Ratiomedium

    Minimum 1× on all four sides, expressed as a ratio so it scales with the mark.

  173. logo-variationsSix Types, Three Lockupsmedium[convention]

    Opens with a table. See Beyond the screen in the skill.

  174. joint-croppingDo Not Cut at a Jointlow[convention]

    Crop through the middle of a limb segment, roughly 10% of its length from the nearest joint [convention].

  175. dieline-bleedErrors Become Physicalhigh[spec][measured]

    A 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.

  176. cmyk-vs-pantoneSpec Both, Alwayshigh[convention]

    A PMS-only spec on a 4-color press forces an uncontrolled conversion.

  177. iso-216The Only Self-Similar Ratiomedium[spec]

    Every A-series sheet is 1:√2, so halving along the long edge yields the next size at identical proportions.