agentsclimarketplace

Frontcraft

Skill Dragoon0x/frontcraft/skills/frontcraft

the frontend craft specification. 324 rules. 20 categories. every threshold is a number, not an opinion.

Install
npx -y skills add Dragoon0x/frontcraft --skill frontcraft

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 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.

What its author says it does

Copied from the file, not written here

The definitive frontend craft specification. 324 rules across 20 categories with measurable thresholds, covering motion, typography, accessibility, color, performance, layout, forms, and interaction design. Every rule has a name, priority level, and production code. Install with: npx skills add Dragoon0x/frontcraft

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

51.5 KB, as published. Nobody here has run it

frontcraft

The definitive frontend craft specification. 324 rules across 20 categories, each with a measurable threshold, priority level, and production code. Not opinions — standards.

How to Use This Skill

When implementing or reviewing frontend code, reference these rules by prefix (e.g., motion-duration-cap, a11y-contrast-aa). Each rule has:

  • Name: Kebab-case identifier for automated detection
  • Priority: CRITICAL (breaks UX if violated), HIGH (noticeable degradation), MEDIUM (polish issue), LOW (refinement)
  • Threshold: A measurable number or condition
  • Implementation: Production-ready code

Output format for findings: rule-name | priority | file:line | description


1. Motion & Timing

motion-duration-cap

Priority: CRITICAL Threshold: No transition or animation exceeds 500ms. Most should be 150-300ms.

/* PASS */ transition: transform 200ms ease-out;
/* FAIL */ transition: transform 800ms ease;

motion-duration-minimum

Priority: HIGH Threshold: No transition below 100ms. Below that, the eye cannot perceive the change and the animation wastes GPU cycles for nothing.

/* PASS */ transition: opacity 120ms ease-out;
/* FAIL */ transition: opacity 50ms ease;

motion-enter-exit-asymmetry

Priority: HIGH Threshold: Entry animations should be 1.5-2x longer than exits. Users wait for entrances but want exits instant.

.panel-enter { animation-duration: 250ms; }
.panel-exit { animation-duration: 150ms; }

motion-stagger-increment

Priority: MEDIUM Threshold: Stagger delay between list items: 30-80ms. Below 30ms looks simultaneous. Above 80ms feels sluggish.

.item:nth-child(1) { animation-delay: 0ms; }
.item:nth-child(2) { animation-delay: 50ms; }
.item:nth-child(3) { animation-delay: 100ms; }

motion-stagger-cap

Priority: HIGH Threshold: Total stagger sequence must not exceed 600ms regardless of item count. Cap at 8-10 items, then batch the rest.

const delay = Math.min(index * 50, 400);

motion-spring-stiffness

Priority: MEDIUM Threshold: Spring stiffness 100-300 for UI elements. Below 100 feels mushy. Above 300 feels mechanical.

{ type: "spring", stiffness: 200, damping: 20 }

motion-spring-damping-ratio

Priority: HIGH Threshold: Damping ratio 0.6-0.9 for UI. Below 0.6 bounces too much. Above 0.9 loses the spring character.

// damping ratio = damping / (2 * sqrt(stiffness * mass))
{ stiffness: 200, damping: 22 } // ratio ~ 0.78

motion-spring-for-gestures

Priority: CRITICAL Threshold: Always use spring animations for gesture-driven interactions (drag, swipe, pinch). Easing curves create jarring velocity discontinuities on release.

// PASS: spring continues from gesture velocity
animate(x, target, { type: "spring", velocity: gestureVelocity });
// FAIL: easing ignores release velocity
animate(x, target, { duration: 300, ease: "ease-out" });

motion-ease-out-for-entries

Priority: HIGH Threshold: Elements entering the viewport use ease-out (decelerating). Elements leaving use ease-in (accelerating). Never use ease-in for entries.

.entering { animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
.exiting { animation-timing-function: cubic-bezier(0.4, 0, 1, 1); }

motion-no-linear-transitions

Priority: HIGH Threshold: Never use linear for UI state transitions. Linear has no acceleration curve and feels robotic. Reserve linear only for continuous animations like spinners or marquees.

/* PASS */ transition: opacity 200ms ease-out;
/* PASS - continuous rotation */ animation: spin 1s linear infinite;
/* FAIL */ transition: transform 300ms linear;

motion-opacity-with-transform

Priority: MEDIUM Threshold: Fade-ins should pair opacity with a subtle transform (translateY 8-16px or scale 0.95-0.98). Opacity alone feels flat.

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

motion-gpu-compositing

Priority: CRITICAL Threshold: Only animate transform and opacity. These run on the compositor thread. Animating width, height, top, left, margin, padding triggers layout/paint and drops frames.

/* PASS */ transition: transform 200ms, opacity 200ms;
/* FAIL */ transition: width 200ms, height 200ms;

motion-will-change-sparingly

Priority: MEDIUM Threshold: Only apply will-change to elements that will animate within the next 200ms. Never set it permanently. It forces GPU layer creation and eats VRAM.

.card:hover { will-change: transform; }

motion-no-layout-thrash

Priority: CRITICAL Threshold: Never read layout properties (offsetHeight, getBoundingClientRect) then write styles in the same synchronous block. Batch reads before writes.

// PASS - batched
const heights = elements.map(el => el.offsetHeight);
elements.forEach((el, i) => { el.style.height = heights[i] + 10 + 'px'; });

motion-cancel-on-interrupt

Priority: HIGH Threshold: If a user triggers a new animation on an already-animating element, cancel or blend the current animation. Never queue.

controller.cancel();
element.animate(newKeyframes, options);

motion-scroll-driven-performance

Priority: HIGH Threshold: Scroll-linked animations must use animation-timeline: scroll() or Intersection Observer. Never use scroll event listeners with direct style manipulation.

.hero { animation: parallax linear; animation-timeline: scroll(); }

motion-reduced-motion-override

Priority: CRITICAL Threshold: All animations must respect prefers-reduced-motion: reduce. Replace motion with instant state changes or subtle opacity fades (max 150ms).

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

motion-exit-before-enter

Priority: HIGH Threshold: When swapping content, exit old before entering new. Simultaneous exit/enter creates visual noise.

motion-transform-origin-intent

Priority: MEDIUM Threshold: Set transform-origin to match interaction source. Dropdown from button: origin top. Modal from center: origin center.

.dropdown { transform-origin: top center; }
.modal { transform-origin: center center; }

motion-skeleton-pulse-timing

Priority: MEDIUM Threshold: Skeleton pulse: 1.5-2s duration, ease-in-out, infinite. Faster feels anxious. Slower feels broken.

@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
.skeleton { animation: pulse 1.8s ease-in-out infinite; }

motion-spinner-minimum-display

Priority: HIGH Threshold: If a spinner is shown, display for minimum 400ms. Sub-400ms flash looks like a glitch.

await Promise.all([fetchData(), sleep(400)]);

motion-no-bounce-on-data

Priority: HIGH Threshold: Never use bouncy/elastic animations on data-carrying elements (numbers, charts, progress bars). Bounce implies imprecision.

motion-page-transition-direction

Priority: MEDIUM Threshold: Forward navigation slides left/up. Back navigation slides right/down. Consistent spatial mapping.

motion-hover-delay

Priority: MEDIUM Threshold: Hover-triggered tooltips: 200-400ms enter delay, 150ms exit delay. Prevents accidental triggers.

.tooltip { transition: opacity 150ms ease-out 300ms; }
.trigger:hover .tooltip { transition-delay: 0ms; }

motion-scroll-snap-deceleration

Priority: MEDIUM Threshold: scroll-snap-type: x mandatory for carousels, proximity for content. Mandatory on content pages traps users.

motion-progress-animation

Priority: HIGH Threshold: Progress bars must animate continuously during indeterminate states. Frozen progress bar signals crash.


2. Typography

type-body-size-minimum

Priority: CRITICAL Threshold: Body text minimum 16px (1rem). Below 16px fails readability on mobile.

body { font-size: 16px; }

type-line-height-ratio

Priority: CRITICAL Threshold: Body line-height: 1.5-1.7. Headings: 1.1-1.3. Below 1.4 for body causes line collision on mobile.

p { line-height: 1.6; } h1, h2, h3 { line-height: 1.2; }

type-measure-cap

Priority: HIGH Threshold: Maximum line length: 45-75 characters. Optimal: 65ch. Beyond 75ch, eye tracking fails.

.prose { max-width: 65ch; }

type-heading-scale

Priority: HIGH Threshold: Consistent type scale. 1.2 (minor third) for compact, 1.25 (major third) for general, 1.333 (perfect fourth) for editorial.

:root { --step-0: 1rem; --step-1: 1.25rem; --step-2: 1.563rem; --step-3: 1.953rem; --step-4: 2.441rem; }

type-paragraph-spacing

Priority: MEDIUM Threshold: Space between paragraphs: 0.75em-1.25em. Never margin-top on first paragraph.

p + p { margin-top: 1em; }

type-font-loading-swap

Priority: CRITICAL Threshold: Always use font-display: swap or optional. Never block rendering on font load.

@font-face { font-family: 'Custom'; src: url('font.woff2'); font-display: swap; }

type-font-loading-preload

Priority: HIGH Threshold: Preload critical fonts in head. Reduces FOUT by 200-500ms.

<link rel="preload" href="/fonts/body.woff2" as="font" type="font/woff2" crossorigin>

type-system-font-stack

Priority: MEDIUM Threshold: Full system font stack, not just sans-serif.

font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;

type-tabular-nums-for-data

Priority: CRITICAL Threshold: tabular-nums for changing numbers. Proportional figures cause layout shift.

.price, .timer, .stat, td { font-variant-numeric: tabular-nums; }

type-no-orphans

Priority: MEDIUM Threshold: Prevent single-word orphans on headings.

h1, h2, h3 { text-wrap: balance; }

type-truncation-with-title

Priority: HIGH Threshold: Truncated text must have full text via title attribute or tooltip.

<span class="truncate" title="Full text here">Full text h...</span>

type-responsive-sizing

Priority: HIGH Threshold: clamp() for fluid typography. Never viewport units alone.

h1 { font-size: clamp(1.75rem, 1.2rem + 2vw, 3rem); }

type-weight-hierarchy

Priority: HIGH Threshold: Maximum 3 font weights per page. More muddles hierarchy.

type-letter-spacing-uppercase

Priority: HIGH Threshold: Uppercase text needs 0.02em-0.08em letter-spacing.

.label { text-transform: uppercase; letter-spacing: 0.05em; }

type-no-justify

Priority: HIGH Threshold: Never text-align: justify without hyphens: auto. Creates rivers of whitespace.

type-code-font-size

Priority: MEDIUM Threshold: Inline code: 0.875em of surrounding text. Monospace renders optically larger.

type-subpixel-antialiasing

Priority: MEDIUM Threshold: -webkit-font-smoothing: antialiased for light text on dark backgrounds.

.dark-bg { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }

type-vertical-rhythm

Priority: MEDIUM Threshold: All spacing multiples of base line-height unit. Body 16px/1.5 = 24px unit.

type-heading-proximity

Priority: HIGH Threshold: Space above heading 1.5-2x space below. Headings connect to content they introduce.

h2 { margin-top: 2.5em; margin-bottom: 0.75em; }

type-small-text-minimum

Priority: CRITICAL Threshold: No text below 12px anywhere. Captions, footnotes, labels, all minimum 12px.

type-link-distinction

Priority: CRITICAL Threshold: Links distinguishable by more than color. Use underline or weight. Color-only fails for colorblind users.

a { text-decoration: underline; text-underline-offset: 2px; }

type-em-for-emphasis

Priority: LOW Threshold: Use em for stress emphasis, strong for importance. Never b or i for semantic emphasis.

type-font-subsetting

Priority: HIGH Threshold: Subset fonts to needed character sets. Latin-only can reduce 200KB to 20KB.

@font-face { unicode-range: U+0000-00FF, U+0131, U+0152-0153; }

type-variable-font-optimization

Priority: MEDIUM Threshold: 3+ weights of same family: switch to variable font. 40-70% payload reduction.

type-list-spacing

Priority: MEDIUM Threshold: Multi-line list items: 0.5em-0.75em spacing. Single-line: 0.25em-0.5em.


3. Accessibility

a11y-contrast-aa

Priority: CRITICAL Threshold: Normal text: 4.5:1 contrast ratio (WCAG AA). Large text (18px bold / 24px): 3:1.

a11y-contrast-aaa

Priority: HIGH Threshold: Target 7:1 for body text (WCAG AAA). Critical for long-form reading.

a11y-contrast-non-text

Priority: HIGH Threshold: UI components and graphical objects: 3:1 against adjacent colors.

a11y-focus-visible

Priority: CRITICAL Threshold: Every interactive element: visible focus indicator. Minimum 2px solid outline, 2px offset.

:focus-visible { outline: 2px solid var(--focus-color); outline-offset: 2px; }
:focus:not(:focus-visible) { outline: none; }

a11y-focus-order

Priority: CRITICAL Threshold: Focus order matches visual order. Never tabindex > 0.

a11y-skip-link

Priority: CRITICAL Threshold: First focusable element: skip-to-content link. Visible on focus.

<a href="#main-content" class="skip-link">Skip to content</a>

a11y-heading-hierarchy

Priority: CRITICAL Threshold: Heading levels never skip. H1 > H2 > H3. One H1 per page.

a11y-alt-text

Priority: CRITICAL Threshold: Every img has alt. Decorative: alt="". Informative: descriptive text.

<img alt="Bar chart showing Q3 revenue up 12%" src="chart.png">
<img alt="" src="divider.svg" role="presentation">

a11y-aria-labels

Priority: CRITICAL Threshold: Interactive elements without visible text: aria-label or aria-labelledby.

<button aria-label="Close dialog"><svg>...</svg></button>

a11y-form-labels

Priority: CRITICAL Threshold: Every input has a visible label with matching for/id. Placeholder is not a label.

<label for="email">Email</label>
<input id="email" type="email">

a11y-error-identification

Priority: CRITICAL Threshold: Form errors via text (not just color), linked via aria-describedby, announced via role="alert".

<input aria-describedby="email-err" aria-invalid="true">
<span id="email-err" role="alert">Enter a valid email</span>

a11y-color-not-sole-indicator

Priority: CRITICAL Threshold: Color never the only way to convey information. Add icons, text, or patterns.

a11y-touch-target-size

Priority: CRITICAL Threshold: Minimum 44x44px (WCAG 2.1). Recommended 48x48px. Includes padding.

a11y-touch-target-spacing

Priority: HIGH Threshold: Minimum 8px between adjacent touch targets.

a11y-keyboard-trap

Priority: CRITICAL Threshold: Users can navigate to AND away from every component via keyboard. Focus traps only in modals.

a11y-modal-focus-trap

Priority: CRITICAL Threshold: Open modals trap focus. Tab wraps. Escape closes. Focus returns to trigger.

a11y-live-regions

Priority: HIGH Threshold: Dynamic content uses aria-live. Polite for non-urgent, assertive for critical.

<div aria-live="polite">3 items added to cart</div>

a11y-landmark-roles

Priority: HIGH Threshold: Every page: header, nav, main, footer. Multiple navs need aria-label.

a11y-language-attribute

Priority: HIGH Threshold: html lang="en" set. Screen readers use this for pronunciation.

a11y-page-title

Priority: HIGH Threshold: Unique descriptive title per page. "Page Name - Site Name".

a11y-motion-reduced

Priority: CRITICAL Threshold: Respect prefers-reduced-motion. See motion-reduced-motion-override.

a11y-zoom-200

Priority: CRITICAL Threshold: Usable at 200% zoom. No clipping, no horizontal scroll, no overlap.

a11y-text-resize

Priority: HIGH Threshold: Text resizable to 200% without loss. Use rem/em, not fixed px.

a11y-autocomplete-attribute

Priority: HIGH Threshold: Personal data fields have autocomplete attribute.

<input type="email" autocomplete="email">

a11y-table-headers

Priority: HIGH Threshold: Data tables use th with scope="col" or scope="row".

a11y-svg-accessible

Priority: HIGH Threshold: Meaningful SVGs: role="img" aria-label. Decorative: aria-hidden="true".

a11y-no-autoplay

Priority: HIGH Threshold: No auto-playing media. If unavoidable: visible pause within 3 seconds.

a11y-animation-pause

Priority: HIGH Threshold: Animations > 5 seconds must have pause mechanism. WCAG 2.2.2.

a11y-timeout-warning

Priority: HIGH Threshold: Session timeouts: warn 60 seconds before. Provide extend option.

a11y-visible-state

Priority: HIGH Threshold: All states visually distinct: default, hover, focus, active, disabled, selected, error. Minimum 2 distinguishing properties.

a11y-disabled-semantics

Priority: HIGH Threshold: Disabled elements: disabled attribute, opacity 0.4-0.5, removed from tab order.

[disabled] { opacity: 0.45; cursor: not-allowed; pointer-events: none; }

a11y-screen-reader-only

Priority: MEDIUM Threshold: sr-only class for screen-reader-only content. Never display:none for this.

.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }

a11y-dialog-semantics

Priority: CRITICAL Threshold: Use dialog element or role="dialog" with aria-modal="true" and aria-labelledby.

a11y-link-vs-button

Priority: HIGH Threshold: Links navigate. Buttons act. Never div onClick or a href="#" for actions.

a11y-no-tabindex-positive

Priority: CRITICAL Threshold: Never tabindex > 0. Use 0 or -1 only.


4. Color & Contrast

color-palette-limit

Priority: HIGH Threshold: Maximum 5-7 distinct hues.

color-semantic-mapping

Priority: CRITICAL Threshold: Red/destructive, green/success, yellow/warning, blue/info. Never red for positive.

color-neutral-range

Priority: HIGH Threshold: Minimum 9 neutral steps (50-900). Each visually distinguishable.

color-dark-mode-not-inverted

Priority: CRITICAL Threshold: Dark mode is NOT inverted light mode. Max white: #E0E0E0. Desaturate 10-20%.

--text-dark: #E0E0E0; --bg-dark: #121212;

color-dark-mode-elevation

Priority: HIGH Threshold: Higher elevation = lighter surface in dark mode. Each step: +3-5% white overlay.

--surface-0: #121212; --surface-1: #1E1E1E; --surface-2: #232323;

color-opacity-over-gray

Priority: MEDIUM Threshold: Text hierarchy: use opacity/alpha, not fixed grays. Adapts to any background.

--text-primary: rgba(0,0,0,0.87); --text-secondary: rgba(0,0,0,0.60);

color-state-tokens

Priority: HIGH Threshold: Define color tokens for states. Components reference tokens, never hex directly.

color-interactive-feedback

Priority: HIGH Threshold: Hover: darken 5-10%. Active: darken 10-15%. Focus: distinct outline.

.btn:hover { background: color-mix(in srgb, var(--primary) 90%, black); }

color-consistent-saturation

Priority: MEDIUM Threshold: Same-palette colors share similar saturation. Mixing vibrant/muted confuses hierarchy.

color-perceptual-uniformity

Priority: MEDIUM Threshold: Use OKLCH/OKLAB for palette generation. HSL produces uneven brightness across hues.

--primary: oklch(65% 0.15 240);

color-background-text-separation

Priority: CRITICAL Threshold: Never text directly on images/gradients without overlay or shadow to guarantee contrast.

color-brand-accent-ratio

Priority: MEDIUM Threshold: Brand color: 5-15% of visual area. More than 15% loses signal.

color-transparency-layering

Priority: MEDIUM Threshold: Never stack more than 2 semi-transparent layers.

color-forced-colors

Priority: HIGH Threshold: Support forced-colors: active (Windows High Contrast Mode).

@media (forced-colors: active) { .button { border: 2px solid ButtonText; } }

color-data-viz-palette

Priority: HIGH Threshold: Data viz: max 6-8 colors. Beyond 8, discrimination drops below 80%.

color-data-viz-colorblind

Priority: CRITICAL Threshold: Data palettes must pass deuteranopia, protanopia, tritanopia simulation.

color-gradient-direction

Priority: LOW Threshold: Gradients: top-to-bottom or left-to-right following reading direction.

color-shadow-hue

Priority: MEDIUM Threshold: Shadows tinted with surface hue at 5-10% opacity. Pure black shadows look flat.

box-shadow: 0 4px 12px oklch(25% 0.02 250 / 0.15);

color-sufficient-distinction

Priority: HIGH Threshold: Adjacent UI elements must have minimum 15% lightness difference in OKLCH to be perceived as separate.

color-status-redundancy

Priority: HIGH Threshold: Status colors always paired with icon or text. Green dot + "Online". Red badge + number.


5. Touch & Interaction

touch-target-48

Priority: CRITICAL Threshold: All tappable elements: minimum 48x48px touch area including padding.

touch-feedback-immediate

Priority: CRITICAL Threshold: Touch feedback within 100ms. Active state, ripple, or press animation.

button:active { transform: scale(0.97); }

touch-no-hover-dependency

Priority: CRITICAL Threshold: No critical functionality behind :hover. Touch devices have no hover.

touch-gesture-hint

Priority: HIGH Threshold: Custom gestures need visual hints on first encounter.

touch-swipe-threshold

Priority: HIGH Threshold: Swipe: 10-30px movement + velocity > 0.3px/ms.

const SWIPE_THRESHOLD = 20; const VELOCITY_THRESHOLD = 0.3;

touch-pull-to-refresh-distance

Priority: MEDIUM Threshold: Pull-to-refresh trigger: 60-80px.

touch-scroll-lock-on-gesture

Priority: HIGH Threshold: Lock page scroll during recognized gestures. touch-action: none on gesture target.

touch-momentum-scroll

Priority: HIGH Threshold: Custom scroll containers: -webkit-overflow-scrolling: touch or overscroll-behavior: contain.

touch-no-double-tap-zoom

Priority: MEDIUM Threshold: touch-action: manipulation on interactive areas eliminates 300ms delay.

touch-drag-cancel

Priority: HIGH Threshold: All drags support cancel. Escape or drag back to origin reverts.

touch-haptic-on-commit

Priority: MEDIUM Threshold: Haptic on commit actions only. Never on hover or scroll.

if ('vibrate' in navigator) navigator.vibrate(10);

touch-hold-delay

Priority: HIGH Threshold: Long-press: 400-600ms. Visual progress indicator during hold.

touch-rubber-band-feedback

Priority: MEDIUM Threshold: 30-50px elastic overscroll at container bounds.

touch-pinch-zoom-images

Priority: HIGH Threshold: Full-width images support pinch-to-zoom. No maximum-scale=1.

touch-edge-swipe-safety

Priority: HIGH Threshold: Reserve 20px from screen edges for system gestures.

touch-button-debounce

Priority: CRITICAL Threshold: Debounce taps: disable for 300ms or until action completes.

if (processing) return; setProcessing(true);

touch-input-font-size

Priority: CRITICAL Threshold: Input fields minimum 16px on iOS. Below 16px triggers auto-zoom.

touch-dismissible-overlays

Priority: HIGH Threshold: All overlays dismissible by tapping outside.

touch-scroll-direction-lock

Priority: MEDIUM Threshold: Lock to axis once scroll direction established.

touch-safe-area-respect

Priority: CRITICAL Threshold: Interactive elements never overlap with device safe areas (notch, home indicator).


6. Layout & Spacing

layout-spacing-scale

Priority: HIGH Threshold: Consistent spacing scale from base unit (4px or 8px). All values multiples.

:root { --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-6: 24px; --space-8: 32px; }

layout-content-width

Priority: HIGH Threshold: Max content: 1200-1440px for apps, 720-960px for reading.

.container { max-width: 1200px; margin-inline: auto; }

layout-padding-mobile

Priority: CRITICAL Threshold: Minimum horizontal padding on mobile: 16px.

layout-z-index-scale

Priority: HIGH Threshold: Named z-index tiers: base(0), dropdown(100), sticky(200), overlay(300), modal(400), toast(500), tooltip(600).

layout-gap-over-margin

Priority: HIGH Threshold: Use gap in flex/grid instead of margin on children.

.row { display: flex; gap: 16px; }

layout-logical-properties

Priority: MEDIUM Threshold: Use margin-inline, padding-block instead of margin-left. Required for RTL.

layout-border-box

Priority: CRITICAL Threshold: box-sizing: border-box globally.

*, *::before, *::after { box-sizing: border-box; }

layout-sticky-offset

Priority: MEDIUM Threshold: Sticky headers: top: 0 + z-index above content. Account for stacking.

layout-container-queries

Priority: MEDIUM Threshold: Component-level responsiveness: container queries over media queries.

.card-container { container-type: inline-size; }

layout-grid-auto-fill

Priority: HIGH Threshold: Auto-flowing grids: auto-fill with minmax().

.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; }

layout-aspect-ratio

Priority: HIGH Threshold: Media containers: aspect-ratio to prevent layout shift.

.video { aspect-ratio: 16 / 9; } .thumb { aspect-ratio: 1; }

layout-scroll-margin

Priority: MEDIUM Threshold: Anchor targets: scroll-margin-top equals fixed header height.

[id] { scroll-margin-top: 80px; }

layout-overflow-clip

Priority: MEDIUM Threshold: Use overflow: clip over overflow: hidden when no scroll container needed.

layout-min-height-dvh

Priority: HIGH Threshold: Full-height: min-height: 100dvh not 100vh. Accounts for mobile browser chrome.

layout-safe-area-inset

Priority: CRITICAL Threshold: Devices with notches: env(safe-area-inset-*) padding.

body { padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); }

layout-no-horizontal-scroll

Priority: CRITICAL Threshold: No unintentional horizontal scroll. Test at 320px width.

layout-whitespace-proportion

Priority: HIGH Threshold: Larger components need proportionally larger surrounding whitespace.

layout-grid-gutter-responsive

Priority: MEDIUM Threshold: Grid gutters scale: 16px mobile, 24px tablet, 32px desktop.

layout-centering-method

Priority: MEDIUM Threshold: Use place-items: center for single-element centering. Flexbox for multi-element.


7. Responsive Design

responsive-breakpoints

Priority: HIGH Threshold: Standard: 320, 375, 768, 1024, 1280, 1536. Mobile-first.

responsive-mobile-first

Priority: HIGH Threshold: Base styles for mobile, add with min-width. Never max-width as primary.

responsive-fluid-over-fixed

Priority: HIGH Threshold: Fluid values (%, vw, clamp()) over fixed where possible.

responsive-image-srcset

Priority: HIGH Threshold: Every image: srcset with 2-3 variants and sizes attribute.

<img srcset="photo-400.jpg 400w, photo-800.jpg 800w" sizes="(max-width: 768px) 100vw, 50vw">

responsive-picture-art-direction

Priority: MEDIUM Threshold: picture with source for different crops at breakpoints.

responsive-viewport-meta

Priority: CRITICAL Threshold: viewport meta tag. Never maximum-scale=1 or user-scalable=no.

<meta name="viewport" content="width=device-width, initial-scale=1">

responsive-font-scaling

Priority: HIGH Threshold: clamp() for headings. No fixed sizes.

responsive-hide-with-purpose

Priority: HIGH Threshold: Hidden elements still accessible or alternative path exists.

responsive-table-overflow

Priority: HIGH Threshold: Tables on mobile: overflow-x: auto or convert to stacked cards below 768px.

responsive-modal-fullscreen-mobile

Priority: HIGH Threshold: Modals below 480px go full-screen or bottom sheet.

responsive-nav-hamburger-threshold

Priority: MEDIUM Threshold: Collapse nav when items dont fit at touch target size. Never collapse 3-item nav.

responsive-input-sizing

Priority: HIGH Threshold: Mobile inputs: full-width. Side-by-side only above 768px.

responsive-sticky-bottom-mobile

Priority: MEDIUM Threshold: Primary mobile CTAs in sticky bottom bar within thumb reach.

responsive-landscape-consideration

Priority: MEDIUM Threshold: Test landscape. Fixed headers + footers can consume >50% in landscape.

responsive-test-320

Priority: CRITICAL Threshold: Test at 320px minimum. iPhone SE is 320px.

responsive-container-query-components

Priority: MEDIUM Threshold: Reusable components: container queries over media queries.


8. Performance

perf-lcp-under-2500

Priority: CRITICAL Threshold: LCP under 2.5s. Core Web Vital.

perf-inp-under-200

Priority: CRITICAL Threshold: INP under 200ms. Under 100ms is good.

perf-cls-under-01

Priority: CRITICAL Threshold: CLS under 0.1. Set dimensions on images/videos.

perf-ttfb-under-800

Priority: HIGH Threshold: TTFB under 800ms. Use CDN, edge caching, SSG.

perf-js-bundle-budget

Priority: CRITICAL Threshold: Initial JS: <100KB gzipped. Each 100KB costs 350ms parse on mid-tier phone.

perf-critical-css-inline

Priority: HIGH Threshold: Inline critical CSS in head. Max 14KB (TCP congestion window).

perf-lazy-load-images

Priority: HIGH Threshold: Below-fold images: loading="lazy". LCP image: eager + fetchpriority="high".

perf-preconnect-origins

Priority: HIGH Threshold: Preconnect to critical third-party origins. Saves 100-300ms.

<link rel="preconnect" href="https://fonts.googleapis.com">

perf-image-format

Priority: HIGH Threshold: WebP or AVIF for raster images. WebP: 25-35% smaller. AVIF: 50% smaller.

perf-font-subset

Priority: HIGH Threshold: Subset fonts. Latin-only: 200KB to 20KB.

perf-third-party-async

Priority: HIGH Threshold: All third-party scripts: async or defer.

perf-no-render-blocking-css

Priority: HIGH Threshold: Non-critical CSS: media attribute or async load.

perf-code-splitting

Priority: HIGH Threshold: Route-based splitting minimum. Dynamic import() for heavy components.

perf-prefetch-likely-routes

Priority: MEDIUM Threshold: Prefetch likely next pages on hover/visibility.

perf-debounce-scroll-resize

Priority: HIGH Threshold: Throttle scroll/resize to 100ms or use rAF.

perf-virtual-list

Priority: HIGH Threshold: Lists >50 items: virtualize.

perf-image-dimensions

Priority: CRITICAL Threshold: All img/video: explicit width and height or aspect-ratio.

perf-service-worker-cache

Priority: MEDIUM Threshold: Cache static assets with service worker.

perf-dns-prefetch

Priority: LOW Threshold: DNS-prefetch for third-party domains.

perf-long-task-break

Priority: HIGH Threshold: No JS task >50ms on main thread. Break with rIC or setTimeout(0).

perf-react-memo-threshold

Priority: MEDIUM Threshold: Memoize components rendering >16ms with stable props. Profile first.

perf-reflow-batch

Priority: HIGH Threshold: Batch DOM reads before writes.

perf-css-containment

Priority: MEDIUM Threshold: contain: layout on independent components.

perf-resource-hints-order

Priority: MEDIUM Threshold: Resource hint priority: preload > preconnect > prefetch > dns-prefetch.


9. Loading States

loading-skeleton-shape

Priority: HIGH Threshold: Skeletons match shape/layout of replaced content. No generic rectangles.

loading-skeleton-animation

Priority: MEDIUM Threshold: Shimmer gradient (left-to-right wave) implies progress.

.skeleton { background: linear-gradient(90deg, #e0e0e0 25%, #f0f0f0 50%, #e0e0e0 75%); background-size: 200% 100%; animation: shimmer 1.5s ease-in-out infinite; }

loading-instant-feedback

Priority: CRITICAL Threshold: Visual feedback within 100ms of user action.

loading-spinner-delay

Priority: HIGH Threshold: Show spinner after 300-500ms delay. Most operations complete before it appears.

loading-progress-determinate

Priority: HIGH Threshold: Known progress: use determinate bar. Indeterminate spinner for unknown.

loading-optimistic-update

Priority: HIGH Threshold: Binary actions (toggle, like): update UI immediately, reconcile async.

setLiked(!liked); // optimistic
try { await api.toggleLike(id); } catch { setLiked(liked); }

loading-content-priority

Priority: HIGH Threshold: Load order: text > above-fold images > below-fold > non-critical.

loading-error-recovery

Priority: HIGH Threshold: Every loading state has error state with retry. Timeout after 10-15s.

loading-empty-state-helpful

Priority: HIGH Threshold: Empty states explain WHY and provide primary action. Not just "No results."

loading-pagination-infinite

Priority: MEDIUM Threshold: Infinite scroll: loading indicator, scroll-to-top after 3 pages, virtualize after 100 items.

loading-skeleton-reduced-motion

Priority: MEDIUM Threshold: prefers-reduced-motion: static gray blocks instead of animated skeletons.

loading-placeholder-image

Priority: MEDIUM Threshold: Images show BlurHash, LQIP, or dominant color during load.

loading-stream-long-content

Priority: MEDIUM Threshold: Stream long content as it arrives. Users read while loading.


10. Error States

error-message-human

Priority: CRITICAL Threshold: Human language, not technical codes.

error-message-specific

Priority: HIGH Threshold: Explain what went wrong AND what to do.

error-message-no-blame

Priority: HIGH Threshold: Never blame the user. "We could not find" not "You entered invalid."

error-inline-not-modal

Priority: HIGH Threshold: Validation errors inline next to field, not in modal/alert.

error-real-time-validation

Priority: MEDIUM Threshold: Validate on blur for text, immediately for toggles/selects.

error-persistent-until-fixed

Priority: HIGH Threshold: Errors visible until corrected. Never auto-dismiss.

error-404-helpful

Priority: HIGH Threshold: 404 includes search, home link, suggested pages.

error-network-offline

Priority: HIGH Threshold: Detect offline, show persistent banner, cache last content.

window.addEventListener('offline', () => showBanner('You are offline'));

error-retry-exponential

Priority: MEDIUM Threshold: Auto-retry: 1s, 2s, 4s, 8s, max 30s. Stop after 5 attempts.

error-boundary-react

Priority: CRITICAL Threshold: Error boundaries at route level and around risky components.

error-form-preserve-input

Priority: CRITICAL Threshold: Failed submission: preserve all input. Never clear on failure.

error-rate-limit-messaging

Priority: MEDIUM Threshold: Rate limit errors: tell when to retry with countdown.

error-destructive-confirmation

Priority: CRITICAL Threshold: Destructive actions: confirm with specific item name.

error-undo-over-confirm

Priority: HIGH Threshold: Prefer undo over confirmation dialogs. Undo is a real safety net.


11. Dark Mode

dark-surface-elevation

Priority: HIGH Threshold: Lighter surfaces = higher elevation. 4-5 steps.

dark-no-pure-black

Priority: HIGH Threshold: No #000000. Use #121212-#1A1A1A. Pure black causes OLED smearing.

dark-no-pure-white-text

Priority: HIGH Threshold: No #FFFFFF text. Use #E0E0E0-#EBEBEB. Pure white causes halation.

dark-desaturate-colors

Priority: HIGH Threshold: Reduce accent saturation 10-20% in dark mode.

dark-increase-lightness

Priority: HIGH Threshold: Accent L value +15-25% in OKLCH for dark mode.

dark-shadow-alternative

Priority: MEDIUM Threshold: Replace shadows with subtle borders (1px, 5-10% white opacity).

/* Dark */ border: 1px solid rgba(255,255,255,0.08);

dark-image-brightness

Priority: MEDIUM Threshold: Reduce image brightness 10-15% in dark mode. Not user content.

@media (prefers-color-scheme: dark) { img:not(.user-content) { filter: brightness(0.88); } }

dark-system-preference

Priority: HIGH Threshold: Default to prefers-color-scheme. Manual toggle persists.

dark-transition-smooth

Priority: MEDIUM Threshold: Theme switch: 200-300ms transition on background/color.

dark-code-block-theme

Priority: MEDIUM Threshold: Dark syntax theme in dark mode. Light in light mode.

dark-favicon-variant

Priority: LOW Threshold: Dark-mode favicon if logo disappears on dark chrome.

dark-meta-theme-color

Priority: MEDIUM Threshold: meta theme-color matches dark mode background on mobile.

<meta name="theme-color" content="#121212" media="(prefers-color-scheme: dark)">

12. Keyboard Navigation

keyboard-all-interactive-reachable

Priority: CRITICAL Threshold: Every interactive element reachable by Tab.

keyboard-escape-closes

Priority: CRITICAL Threshold: Escape closes topmost overlay. Focus returns to trigger.

keyboard-enter-activates

Priority: HIGH Threshold: Enter activates buttons/links. Space toggles checkboxes/buttons.

keyboard-arrow-keys

Priority: HIGH Threshold: Arrows navigate within composite widgets. Tab exits widget.

keyboard-visible-focus

Priority: CRITICAL Threshold: 2px outline, 3:1 contrast against adjacent backgrounds.

keyboard-roving-tabindex

Priority: HIGH Threshold: Composite widgets: one child in tab order. Arrows move between children.

keyboard-shortcut-discoverable

Priority: MEDIUM Threshold: Shortcuts shown in tooltips or ? dialog. Undocumented shortcuts do not exist.

keyboard-no-override-browser

Priority: HIGH Threshold: Custom shortcuts must not override browser defaults (Ctrl+F, Ctrl+S).

keyboard-search-focus

Priority: MEDIUM Threshold: Search focusable with / or Cmd+K.

keyboard-type-ahead

Priority: MEDIUM Threshold: Lists/selects support type-ahead character jump.


13. Sound Design

sound-action-feedback

Priority: MEDIUM Threshold: Success/error/warning sounds: distinct, under 200ms. Reserve for important state changes.

sound-volume-control

Priority: CRITICAL Threshold: Mute toggle that persists. Default 30-50% system volume.

sound-no-autoplay-audio

Priority: CRITICAL Threshold: Never autoplay audio. User must initiate.

sound-system-sounds

Priority: LOW Threshold: Native platforms: prefer system sounds for common actions.

sound-haptic-pairing

Priority: MEDIUM Threshold: Mobile: pair sounds with haptic for important actions.

sound-spatial-audio

Priority: LOW Threshold: Spatial interfaces: subtle spatial audio reinforces position.

sound-frequency-meaning

Priority: MEDIUM Threshold: Higher pitch = success. Lower = error. Ascending = progress. Descending = regression.

sound-click-debounce

Priority: HIGH Threshold: Debounce sound triggers within 50ms.


14. Micro-interactions

micro-toggle-state

Priority: HIGH Threshold: Toggles show state via position, color, and optionally icon.

micro-button-press

Priority: MEDIUM Threshold: Buttons: scale(0.97) or translateY(1px) on :active. 100ms.

micro-input-focus

Priority: HIGH Threshold: Focus: border color + ring/glow. 150ms transition.

input:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-alpha-20); }

micro-count-animate

Priority: MEDIUM Threshold: Changing numbers: animate roll or fade. 200-400ms.

micro-checkbox-animation

Priority: MEDIUM Threshold: Checkmark draw animation (stroke-dasharray). 200ms.

micro-switch-inertia

Priority: MEDIUM Threshold: Toggle switch: spring curve, slight overshoot. 300ms total.

micro-copy-confirmation

Priority: HIGH Threshold: Copy: icon changes to checkmark for 2s, tooltip "Copied!"

micro-like-burst

Priority: LOW Threshold: Like/favorite: particle burst or scale pop. 400ms.

micro-link-hover

Priority: MEDIUM Threshold: Links on hover: underline slide-in or color shift. 150ms.

micro-card-hover-lift

Priority: MEDIUM Threshold: Card hover: translateY(-2px) + shadow increase. 200ms.

.card:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(0,0,0,0.12); }

micro-drag-shadow

Priority: MEDIUM Threshold: Dragged elements: larger shadow, scale(1.02-1.05), reduced opacity at origin.

micro-notification-dot

Priority: HIGH Threshold: Notification badge: scale-in with bounce (300ms). New: pulse once (400ms).

micro-tab-underline

Priority: MEDIUM Threshold: Active tab indicator slides (translateX). 250ms ease-out.

micro-accordion-icon

Priority: MEDIUM Threshold: Accordion icon rotates 180deg or morphs. 200ms. Synced with content.

micro-scroll-indicator

Priority: LOW Threshold: Scroll progress bar at top. Width scales with scroll percentage.


15. Forms & Input

form-label-always-visible

Priority: CRITICAL Threshold: Labels visible with content. Floating labels OK. Placeholder-only: never.

form-required-indicator

Priority: HIGH Threshold: Required: asterisk + aria-required. If most required, mark optional instead.

form-input-types

Priority: HIGH Threshold: Correct HTML types: email, tel, url, number, search.

form-autofill-style

Priority: MEDIUM Threshold: Style autofilled fields to match design.

input:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px var(--bg) inset; }

form-password-visibility

Priority: HIGH Threshold: Show/hide toggle on password fields.

form-submit-loading

Priority: CRITICAL Threshold: Submit button shows loading, prevents double-submission.

form-success-feedback

Priority: HIGH Threshold: Clear success: checkmark, message, what happens next.

form-field-width-meaning

Priority: MEDIUM Threshold: Width hints at input length. Zip: narrow. Name: wide.

form-date-format-hint

Priority: HIGH Threshold: Date format in placeholder/helper. Better: date picker.

form-multiline-auto-resize

Priority: MEDIUM Threshold: Textarea auto-grows with content.

textarea.style.height = 'auto'; textarea.style.height = textarea.scrollHeight + 'px';

form-inline-help

Priority: MEDIUM Threshold: Complex fields: helper text always visible, not just on error.

form-step-indicator

Priority: HIGH Threshold: Multi-step: progress indicator with current/total.

form-field-grouping

Priority: MEDIUM Threshold: Related fields: fieldset + legend.

form-enter-to-submit

Priority: HIGH Threshold: Single-field forms submit on Enter.

form-clear-affordance

Priority: MEDIUM Threshold: Search/filter: clear (x) button when populated.


16. Navigation

nav-current-indicator

Priority: CRITICAL Threshold: Active nav item visually distinct + aria-current="page".

nav-breadcrumb-structure

Priority: HIGH Threshold: 3+ levels deep: breadcrumbs with nav aria-label="Breadcrumb".

nav-back-predictable

Priority: HIGH Threshold: Browser back works predictably. SPA pushes history states.

nav-depth-limit

Priority: HIGH Threshold: Max 3 levels deep. Flatten architecture beyond.

nav-mobile-bottom-bar

Priority: HIGH Threshold: 3-5 primary destinations: bottom bar with icons AND labels.

nav-search-global

Priority: HIGH Threshold: 10+ pages or 100+ content: global search with Cmd+K.

nav-sidebar-collapse

Priority: MEDIUM Threshold: Collapsible to icons-only. 48-64px collapsed width.

nav-link-underline

Priority: HIGH Threshold: In-content links: underlined. Nav links: distinct styling without underline.

nav-external-link-indicator

Priority: MEDIUM Threshold: New-tab links: external icon + target="_blank" rel="noopener noreferrer".

nav-scroll-position-restore

Priority: HIGH Threshold: Restore scroll position on back navigation.

nav-pagination-context

Priority: MEDIUM Threshold: Pagination: current page, total, first/last, ellipsis for gaps.

nav-404-recovery

Priority: HIGH Threshold: Dead links are trust killers. See error-404-helpful.


17. Icons & Imagery

icon-consistency

Priority: HIGH Threshold: Same stroke width, corner radius, visual weight, style across all icons.

icon-size-minimum

Priority: HIGH Threshold: 16px inline, 20px standalone, 24px primary actions.

icon-label-pairing

Priority: HIGH Threshold: Icon-only: aria-label. Icon+text: icon gets aria-hidden="true".

icon-filled-active

Priority: MEDIUM Threshold: Outlined = inactive. Filled = active.

icon-no-ambiguity

Priority: HIGH Threshold: Ambiguous icon? Add text label. When in doubt, add text.

icon-svg-over-font

Priority: HIGH Threshold: Inline SVG, not icon fonts. Better scaling, accessibility, multicolor.

icon-optical-alignment

Priority: MEDIUM Threshold: Play/triangle: 1-2px right offset for optical center.

image-lazy-loading

Priority: HIGH Threshold: Below-fold images: loading="lazy".

image-alt-descriptive

Priority: CRITICAL Threshold: Alt describes what image SHOWS. Not filename.

image-fallback-on-error

Priority: HIGH Threshold: Error fallback: placeholder or user initial. Never broken image icon.

<img onerror="this.src='/placeholder.svg'" alt="Profile">

image-decorative-performance

Priority: MEDIUM Threshold: Decorative images: CSS backgrounds or loading="lazy" + alt="".


18. Scroll Behavior

scroll-smooth-native

Priority: MEDIUM Threshold: scroll-behavior: smooth for anchor navigation.

scroll-to-top

Priority: HIGH Threshold: Pages >3 viewports: scroll-to-top button. Appears after 1 viewport scroll.

scroll-indicator-long-content

Priority: LOW Threshold: Content >5 viewports: scroll progress indicator.

scroll-snap-alignment

Priority: MEDIUM Threshold: Carousels: CSS scroll-snap for native pagination.

.gallery { scroll-snap-type: x mandatory; } .gallery-item { scroll-snap-align: center; }

scroll-overscroll-contain

Priority: MEDIUM Threshold: Modal/drawer: overscroll-behavior: contain. Prevents background scroll chaining.

scroll-infinite-sentinel

Priority: MEDIUM Threshold: Infinite scroll: Intersection Observer on sentinel 200-300px from bottom.

scroll-parallax-performance

Priority: HIGH Threshold: Parallax: CSS transform in 3D context or animation-timeline: scroll(). Never JS listeners.

scroll-anchor-offset

Priority: HIGH Threshold: Account for fixed headers on anchor jumps. See layout-scroll-margin.

scroll-restoration-spa

Priority: HIGH Threshold: SPA scroll restoration per route.


19. Content & Copy

copy-action-verbs

Priority: HIGH Threshold: Button labels: action verbs. Save, Send, Create. Never Submit or OK.

copy-error-actionable

Priority: HIGH Threshold: Errors: what happened + what to do.

copy-confirmation-specific

Priority: HIGH Threshold: Name specific item: "Delete 'Project Alpha'?" Include consequences.

copy-placeholder-example

Priority: MEDIUM Threshold: Placeholder shows example, not label: "[email protected]".

copy-microcopy-reassurance

Priority: MEDIUM Threshold: Sensitive fields: add reassurance. "We never share your email."

copy-loading-context

Priority: MEDIUM Threshold: Loading messages explain what is happening: "Uploading 3 photos..."

copy-empty-state-encouraging

Priority: HIGH Threshold: Empty states guide, not dead-end.

copy-cta-single-focus

Priority: HIGH Threshold: One primary CTA per section. Multiple competing CTAs cause paralysis.

copy-tooltip-concise

Priority: MEDIUM Threshold: Tooltips: 1-2 sentences max.

copy-notification-format

Priority: MEDIUM Threshold: Format: "[Who] [did what] [when]." Lead with subject.


20. Performance Perception

perception-optimistic-render

Priority: HIGH Threshold: Show UI structure immediately. Skeleton > real content feels faster than spinner > complete page.

perception-above-fold-priority

Priority: CRITICAL Threshold: Above the fold renders in under 1 second.

perception-progress-over-spinner

Priority: HIGH Threshold: Determinate progress > indeterminate > spinner > nothing. Each step up: -20% perceived wait.

perception-instant-navigation

Priority: HIGH Threshold: Page navigation feels instant (<200ms). Preload on hover.

perception-content-shift-zero

Priority: CRITICAL Threshold: No visible content shift after initial render. Reserve space for everything.

perception-time-display

Priority: MEDIUM Threshold: Relative times for <7 days. Absolute times after.

perception-operation-feedback

Priority: HIGH Threshold: Every action gets feedback within 100ms. Silence = broken.

perception-preload-prediction

Priority: MEDIUM Threshold: Predict next action and preload. Mouse near link: prefetch.

perception-skeleton-timing

Priority: MEDIUM Threshold: Skeletons for content >300ms load time only.

perception-chunked-rendering

Priority: HIGH Threshold: Large datasets: first 20 items immediately, batch-render rest.


Rule Index

Total rules: 324

CategoryCount
Motion & Timing26
Typography25
Accessibility35
Color & Contrast20
Touch & Interaction20
Layout & Spacing19
Responsive Design16
Performance24
Loading States13
Error States14
Dark Mode12
Keyboard Navigation10
Sound Design8
Micro-interactions15
Forms & Input15
Navigation12
Icons & Imagery11
Scroll Behavior9
Content & Copy10
Performance Perception10

Priority Distribution

PriorityCountAction
CRITICAL65Must fix. Breaks UX, accessibility, or performance.
HIGH152Should fix. Noticeable degradation.
MEDIUM98Polish. Difference between good and great.
LOW9Refinement. The last 5% of craft.

License

MIT License - Dragoon0x (https://github.com/Dragoon0x)

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.