Skip to content

Quick Reference

This page consolidates the key numbers, thresholds, and specifications from across Human Standards. Use it for quick lookup during design and development.


ContextMinimumRecommendedMaximum
Body text16px18–20px24px
Small text12px14px16px
Captions11px12–14px16px
Large text (WCAG)18px (24px bold)
ContextMinimumOptimalMaximum
Body text45 characters65 characters75 characters
Narrow columns35 characters45 characters55 characters
Wide screens90 characters
Text TypeMinimumRecommended
Body text1.41.5–1.8
Headings1.11.2–1.3
Captions/small1.31.4–1.5
Text TypeAdjustment
Body text0 (default)
All caps+0.05em to +0.1em
Small text+0.01em to +0.02em

Validation rule:

typography:
body_font_size:
minimum: 16
unit: px
wcag: "1.4.4 AA"
line_length:
minimum: 45
maximum: 75
unit: characters
line_height:
minimum: 1.4
wcag: "1.4.12 AA"

Content TypeAA LevelAAA Level
Normal text (<18px, <14px bold)4.5:17:1
Large text (≥18px, ≥14px bold)3:14.5:1
UI components3:1
Graphical objects3:1
Focus indicators3:1
ForegroundBackgroundRatioPasses
#000000#FFFFFF21:1AAA
#333333#FFFFFF12.6:1AAA
#595959#FFFFFF7:1AAA
#767676#FFFFFF4.5:1AA
#949494#FFFFFF3:1Large only
RequirementValue
Minimum area1px solid outline OR equivalent
Contrast with adjacent3:1 minimum
Contrast with background3:1 minimum
WCAG 2.2 enhanced2px outline with 3:1 contrast

Validation rule:

contrast:
normal_text:
minimum: 4.5
wcag: "1.4.3 AA"
large_text:
minimum: 3.0
wcag: "1.4.3 AA"
ui_components:
minimum: 3.0
wcag: "1.4.11 AA"
focus_visible:
minimum: 3.0
wcag: "2.4.13 AAA"

PlatformMinimum SizeRecommendedSpacing
iOS44×44pt44×44pt8pt
Android48×48dp48×48dp8dp
Web (WCAG)24×24px44×44px
Web (best practice)44×44px48×48px8px
ContextMinimum Size
Primary actions48×48px
Secondary actions44×44px
Dense UI (expert users)32×32px
Inline links44px tall, width varies
Spacing TypeMinimumRecommended
Adjacent buttons8px12px
Touch-only targets8px16px
Dense interfaces4px8px

Validation rule:

touch_targets:
minimum_size:
ios: "44×44pt"
android: "48×48dp"
web: "44×44px"
wcag: "2.5.8 AA (24×24px)"
spacing:
minimum: 8
unit: px

ThresholdUser PerceptionExample
0–100msInstantButton press feedback
100–300msFastMenu open, simple action
300ms–1sNoticeable delayPage transition, search
1–10sWaitingComplex operation, needs progress
>10sAbandonment riskMust show detailed progress
Animation TypeDurationEasing
Micro-interactions100–200msease-out
State changes150–250msease-in-out
Entrances200–300msease-out
Exits150–200msease-in
Page transitions300–500msease-in-out
Complex animations400–700mscustom
ContextMinimumRecommendation
Session timeout20 minutesExtendable with warning
Inactivity warning2 minutes beforeWith option to extend
Form auto-save30 secondsAfter last change
Toast notifications4 secondsOr user dismissal

Validation rule:

timing:
instant_feedback:
maximum: 100
unit: ms
noticeable_delay:
threshold: 1000
unit: ms
requires: progress_indicator
session_timeout:
minimum: 1200
unit: seconds
wcag: "2.2.1 AA"

MeasureTraditionalCurrent Research
Chunk capacity7±2 items3–4 items
Duration (unrehearsed)15–30 seconds15–30 seconds
Visual items3–4 items3–4 items
Verbal items4–7 items4–5 items
GuidelineValueRationale
Menu items≤7 itemsScannable without overwhelming
Steps in process≤5 stepsTrackable progress
Options in dropdown≤10 visibleManageable selection
Form fields per screen≤7 fieldsReduced cognitive load
Tabs in navigation≤6 tabsEasy mental mapping

Validation rule:

cognitive_load:
menu_items:
maximum: 7
recommendation: 5
wizard_steps:
maximum: 5
recommendation: 3-4
form_fields_per_view:
maximum: 7
recommendation: 5

RangeFrequenciesContent
Sub-bass20–60 HzRumble, impact
Bass60–250 HzVoice fundamentals
Midrange250 Hz–4 kHzSpeech clarity
High-mid4–8 kHzPresence, detail
High8–20 kHzAir, brilliance
ParameterValue
Critical speech band300–3400 Hz
Extended speech band125–8000 Hz
Optimal speech level60–70 dB
Speech-to-noise ratio≥15 dB for clarity
DurationMaximum Level
8 hours85 dB
4 hours88 dB
2 hours91 dB
1 hour94 dB
15 minutes100 dB

Validation rule:

audio:
safe_continuous_level:
maximum: 85
unit: dB
duration: 8_hours
speech_frequency_range:
minimum: 300
maximum: 3400
unit: Hz

ApproachImplementation
Disable non-essentialRemove decorative animations
Reduce, don’t removeShorter durations, simpler easing
Provide alternativesFade instead of slide
Preserve functionKeep loading indicators
Motion TypeThreshold
Parallax scrolling>1/3 viewport movement
Auto-playing videoLarge-scale motion
Zoom transitions>400% scale change
RotationAny significant rotation
Bouncing/oscillationRepetitive motion

CSS implementation:

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

TypeAffected PopulationConfusion Pairs
Deuteranomaly5% of malesGreen/red
Protanomaly1% of malesRed/green, dark reds
Tritanomaly0.01%Blue/yellow
Achromatopsia0.003%All colors
Do UseAvoid
Blue + OrangeRed + Green
Blue + YellowGreen + Brown
Purple + YellowGreen + Blue (tritanopia)
High contrast pairsLow saturation pairs

Never rely on color alone to convey:

  • Error states (add icon + text)
  • Success states (add icon + text)
  • Required fields (add asterisk + text)
  • Links (add underline)
  • Data series (add patterns)

Validation rule:

color:
never_alone_for:
- error_states
- success_states
- required_fields
- link_identification
- data_differentiation
wcag: "1.4.1 A"

RuleImplementation
Logical sequenceMatch visual order
No focus trapsEscape always works
Skip linksProvide for main content
Visible focusClear indication
KeyExpected Action
TabMove to next focusable
Shift+TabMove to previous focusable
EnterActivate button/link
SpaceActivate button, toggle checkbox
EscapeClose modal, cancel
Arrow keysNavigate within component
RequirementImplementation
Focus trapKeep focus within modal
Initial focusFirst focusable or close button
Return focusTo trigger element on close
Escape to closeAlways

ElementRequirement
LabelsAlways visible, associated
Error messagesSpecific, actionable
Required indicatorsAsterisk + text explanation
Input modesMatch expected data type
Data TypeInput TypeInput Mode
Emailemailemail
Phoneteltel
Numbertextnumeric
URLurlurl
Searchsearchsearch
Passwordpassword
WhenApproach
On submitValidate all, show summary
On blurValidate field, show inline error
On inputShow success, not error
Real-timeFormat hints only

CriterionQuick Check
1.1.1 Non-textAll images have alt text
1.3.1 Info/relationshipsHeadings, lists, tables marked up
1.4.1 Use of colorColor not sole indicator
2.1.1 KeyboardAll functions keyboard accessible
2.4.1 Bypass blocksSkip link provided
3.1.1 LanguagePage language declared
4.1.1 ParsingValid HTML
4.1.2 Name, Role, ValueCustom controls have ARIA
CriterionQuick Check
1.4.3 Contrast4.5:1 for text
1.4.4 Resize text200% zoom works
1.4.10 Reflow400% zoom, no horizontal scroll
2.4.6 Headings/labelsDescriptive text
2.4.7 Focus visibleClear focus indicator
3.3.1 Error identificationErrors clearly indicated
3.3.2 Labels/instructionsLabels present

:root {
--space-xs: 4px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 24px;
--space-xl: 32px;
--space-2xl: 48px;
--space-3xl: 64px;
}
:root {
--text-xs: 0.75rem; /* 12px */
--text-sm: 0.875rem; /* 14px */
--text-base: 1rem; /* 16px */
--text-lg: 1.125rem; /* 18px */
--text-xl: 1.25rem; /* 20px */
--text-2xl: 1.5rem; /* 24px */
--text-3xl: 1.875rem; /* 30px */
}
:root {
--touch-target-min: 44px;
--touch-target-comfortable: 48px;
--touch-spacing-min: 8px;
--touch-spacing-comfortable: 12px;
}
:root {
--duration-instant: 100ms;
--duration-fast: 200ms;
--duration-normal: 300ms;
--duration-slow: 500ms;
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}

FUNCTION evaluateTouchTarget(element):
width = element.computedWidth
height = element.computedHeight
IF width < 44 OR height < 44:
RETURN error("Touch target too small: {width}×{height}px")
nearbyTargets = findTargetsWithin(element, 8px)
IF nearbyTargets.length > 0:
RETURN warning("Targets within 8px: risk of mis-tap")
RETURN pass
FUNCTION evaluateContrast(foreground, background, textSize):
ratio = calculateContrastRatio(foreground, background)
isLargeText = textSize >= 18 OR (textSize >= 14 AND isBold)
IF isLargeText:
IF ratio < 3.0: RETURN error("Large text below 3:1")
IF ratio < 4.5: RETURN warning("Large text below AAA")
ELSE:
IF ratio < 4.5: RETURN error("Text below 4.5:1")
IF ratio < 7.0: RETURN warning("Text below AAA")
RETURN pass
FUNCTION evaluateCognitiveLoad(component):
IF component.type == "menu":
IF component.items.length > 7:
RETURN warning("Menu has {count} items; consider grouping")
IF component.type == "wizard":
IF component.steps.length > 5:
RETURN warning("Wizard has {count} steps; consider combining")
IF component.type == "form":
visibleFields = countVisibleFields(component)
IF visibleFields > 7:
RETURN warning("Form shows {count} fields; consider progressive disclosure")
RETURN pass

Typography:

Contrast:

Touch Targets:

Response Times:

Working Memory:

Accessibility:


Last updated: