Cognitive Load
Reducing extraneous cognitive load through smart automation and defaults.
Smart Defaults: Use intelligent automation to eliminate unnecessary decisions, reducing cognitive load while maintaining user control for those who need it.
A camera interface can expose technical choices such as:
Requiring all of these choices before capture would create barriers:
The design opportunity is to supply a useful initial choice automatically while keeping controls available for cases where the default is unsuitable.
Apple’s current iPhone User Guide documents a layered camera experience: Photo mode is selected when Camera first opens, a single Shutter control captures the image, focus and exposure are automatic, and manual controls remain available (iPhone camera basics, Camera tools).
1. A capture-ready default
These behaviors are documented in Apple’s iPhone camera basics.
2. One-Tap Capture
Apple documents the automatic behavior and the tap/drag overrides in Use iPhone camera tools to set up your shot.
3. Automatic processing where context supports it
Primary evidence: HDR settings, Night mode, and Apple’s iPhone 12 Pro announcement.
4. Advanced controls remain available
Apple documents these paths in Camera tools and Advanced camera settings.
5. Defaults can yield to remembered preferences
This is documented in Save camera settings on iPhone.
6. Contextual guidance during constrained capture
The following are design inferences from the documented interaction, not Apple-published outcome findings.
Apple’s documentation establishes the default modes, automatic behavior, available controls, and supported-device qualifications above. It does not establish the comparative time, success-rate, per-user volume, or “95% of users” figures previously shown on this page. Those figures have been removed.
An evaluation of this pattern could measure:
| Measure | Method |
|---|---|
| Time to first photo | Same capture task on defined devices, starting from a locked or home-screen state |
| Required adjustments | Count deliberate setting changes before capture |
| Exposure acceptability | Blind rating with a stated rubric and lighting conditions |
| Override discoverability | Task success for focus, exposure, Night mode, and Preserve Settings controls |
| Default recovery | Whether users can predict what persists between sessions |
Cognitive Load
Reducing extraneous cognitive load through smart automation and defaults.
Decision-Making Errors
Eliminating choice overload through intelligent defaults.
Recognition Over Recall
Design principles that minimize memory burden through automation.
User Control & Freedom
Balancing automation with control - defaults for novices, options for experts.
When you use the Human Standards MCP server, these rules enforce smart defaults:
cognitive-smart-defaults
// Triggered when forms/interfaces lack intelligent defaults{ severity: 'info', rule: 'cognitive-smart-defaults', message: 'Consider providing smart defaults instead of empty fields', recommendation: 'Use intelligent defaults based on context, history, or common choices', reference: '/cognition/cognitive-load/'}forms-optional-fields-hidden
// Checks if optional advanced fields are hidden by default{ severity: 'warning', rule: 'forms-optional-fields-hidden', message: 'Advanced/optional fields should be hidden by default', recommendation: 'Use progressive disclosure to hide complexity from novice users', reference: '/interaction-patterns/forms/'}decision-choice-overload
// Validates that choices are limited to prevent paralysis{ severity: 'warning', rule: 'decision-choice-overload', message: 'Too many options can cause decision paralysis', recommendation: 'Provide smart default, limit initial choices to 3-5 options', reference: '/decision-making-errors/biases-heuristics/'}// Get relevant heuristics for smart defaultsconst recognition = await mcp.callTool('get_heuristic', { id: 'H6' });// Returns: Recognition rather than recall - use intelligent defaults
const minimalist = await mcp.callTool('get_heuristic', { id: 'H8' });// Returns: Aesthetic and minimalist design - hide complexity
const flexibility = await mcp.callTool('get_heuristic', { id: 'H7' });// Returns: Flexibility and efficiency - shortcuts for power users
// Search for cognitive load and defaults patternsconst cogLoadDocs = await mcp.callTool('search_standards', { query: 'cognitive load' });// Returns: Choice overload, decision fatigue, working memory
const biasesDocs = await mcp.callTool('search_standards', { query: 'biases defaults' });// Returns: Status quo bias, default effect, nudge theory
// Example results inform implementation:// - H6 (Recognition): Set intelligent defaults, eliminate decisions// - H8 (Minimalist): Show 3-5 options, hide 20 advanced settings// - H7 (Flexibility): "Advanced" section for expert users// - Cognitive load docs: Context-aware defaults (time of day, device)// - Biases docs: Conservative defaults for privacy-sensitive settingsimport { useState, useEffect } from 'react';
interface CameraSettings { hdr: 'auto' | 'on' | 'off'; flash: 'auto' | 'on' | 'off'; livePhoto: boolean; gridLines: boolean; aspectRatio: '4:3' | '16:9' | '1:1'; timer: 0 | 3 | 10; filters: 'none' | 'vivid' | 'dramatic' | 'mono';}
// Smart defaults based on contextfunction getSmartDefaults(context: { timeOfDay: 'day' | 'night'; previousSettings?: Partial<CameraSettings>;}): CameraSettings { const { timeOfDay, previousSettings } = context;
return { // Auto-HDR: smart default with a manual override hdr: 'auto',
// Flash: Auto during day, more aggressive at night flash: timeOfDay === 'night' ? 'auto' : 'off',
// Live Photo: Remember user preference, default on livePhoto: previousSettings?.livePhoto ?? true,
// Grid lines: Remember user preference, default off for simplicity gridLines: previousSettings?.gridLines ?? false,
// Standard 4:3 aspect ratio (best quality) aspectRatio: '4:3',
// No timer by default (immediate capture) timer: 0,
// No filter (natural look) filters: 'none' };}
export function CameraApp() { const [settings, setSettings] = useState<CameraSettings>( getSmartDefaults({ timeOfDay: 'day' }) ); const [showAdvanced, setShowAdvanced] = useState(false); const [isCapturing, setIsCapturing] = useState(false);
// Update smart defaults based on time of day useEffect(() => { const updateDefaults = () => { const hour = new Date().getHours(); const timeOfDay = hour >= 6 && hour < 20 ? 'day' : 'night';
setSettings(prev => ({ ...prev, // Only auto-adjust if user hasn't manually changed flash: prev.flash === 'auto' ? (timeOfDay === 'night' ? 'auto' : 'off') : prev.flash })); };
updateDefaults(); const interval = setInterval(updateDefaults, 60000); // Check every minute
return () => clearInterval(interval); }, []);
// Save preferences for next session useEffect(() => { localStorage.setItem('cameraSettings', JSON.stringify({ livePhoto: settings.livePhoto, gridLines: settings.gridLines })); }, [settings.livePhoto, settings.gridLines]);
const handleCapture = () => { setIsCapturing(true); // Simulate capture setTimeout(() => { console.log('Photo captured with settings:', settings); setIsCapturing(false); }, 300); };
return ( <div className="camera-app"> {/* Live preview - shows result in real-time */} <div className="camera-preview"> <div className="preview-overlay"> {/* Grid lines (optional, hidden by default) */} {settings.gridLines && <GridLines />}
{/* Auto-detected scene info (non-intrusive) */} <div className="scene-detection"> <small>Portrait Mode</small> </div>
{/* Status indicators (minimal) */} <div className="camera-status"> {settings.hdr === 'auto' && <span title="Auto HDR">HDR</span>} {settings.livePhoto && <span title="Live Photo">LIVE</span>} </div> </div> </div>
{/* Simple interface: One button to capture */} <div className="camera-controls"> <button onClick={handleCapture} disabled={isCapturing} className="capture-button" aria-label="Take photo" > {/* Large, obvious capture button */} </button>
{/* Progressive disclosure: Advanced controls */} <button onClick={() => setShowAdvanced(!showAdvanced)} className="advanced-toggle" aria-expanded={showAdvanced} aria-label={showAdvanced ? 'Hide advanced controls' : 'Show advanced controls'} > {showAdvanced ? '▼' : '▲'} Options </button> </div>
{/* Advanced controls (hidden by default) */} {showAdvanced && ( <div className="advanced-controls" role="region" aria-label="Advanced camera settings"> <div className="control-group"> <label>Flash</label> <SegmentedControl options={[ { value: 'auto', label: 'Auto' }, { value: 'on', label: 'On' }, { value: 'off', label: 'Off' } ]} value={settings.flash} onChange={(flash) => setSettings({ ...settings, flash: flash as any })} /> </div>
<div className="control-group"> <label> <input type="checkbox" checked={settings.livePhoto} onChange={(e) => setSettings({ ...settings, livePhoto: e.target.checked })} /> Live Photo </label> </div>
<div className="control-group"> <label> <input type="checkbox" checked={settings.gridLines} onChange={(e) => setSettings({ ...settings, gridLines: e.target.checked })} /> Grid Lines </label> </div>
<div className="control-group"> <label>Timer</label> <SegmentedControl options={[ { value: 0, label: 'Off' }, { value: 3, label: '3s' }, { value: 10, label: '10s' } ]} value={settings.timer} onChange={(timer) => setSettings({ ...settings, timer: timer as any })} /> </div> </div> )} </div> );}
function GridLines() { return ( <svg className="grid-lines" aria-hidden="true"> {/* Rule of thirds grid */} <line x1="33.33%" y1="0" x2="33.33%" y2="100%" /> <line x1="66.66%" y1="0" x2="66.66%" y2="100%" /> <line x1="0" y1="33.33%" x2="100%" y2="33.33%" /> <line x1="0" y1="66.66%" x2="100%" y2="66.66%" /> </svg> );}
function SegmentedControl<T extends string | number>({ options, value, onChange}: { options: Array<{ value: T; label: string }>; value: T; onChange: (value: T) => void;}) { return ( <div className="segmented-control" role="radiogroup"> {options.map(option => ( <button key={option.value} onClick={() => onChange(option.value)} className={value === option.value ? 'active' : ''} role="radio" aria-checked={value === option.value} > {option.label} </button> ))} </div> );}/* Camera app - full screen, immersive */.camera-app { display: flex; flex-direction: column; height: 100vh; background: #000; color: #fff;}
/* Live preview - takes most of screen */.camera-preview { flex: 1; position: relative; background: #1a1a1a; /* Placeholder for video feed */ overflow: hidden;}
.preview-overlay { position: absolute; inset: 0; pointer-events: none;}
/* Grid lines (optional, non-intrusive) */.grid-lines { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0.3;}
.grid-lines line { stroke: #fff; stroke-width: 1;}
/* Scene detection (subtle, top center) */.scene-detection { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.5); padding: 6px 12px; border-radius: 12px; font-size: 12px; font-weight: 600;}
/* Status indicators (top right, minimal) */.camera-status { position: absolute; top: 20px; right: 20px; display: flex; gap: 8px; font-size: 11px; font-weight: 600;}
.camera-status span { background: rgba(255, 215, 0, 0.9); color: #000; padding: 4px 8px; border-radius: 8px;}
/* Camera controls - bottom bar */.camera-controls { padding: 24px; display: flex; align-items: center; justify-content: center; gap: 24px; background: rgba(0, 0, 0, 0.8);}
/* Capture button - large, obvious */.capture-button { /* Ergonomics: Large touch target (80px) */ width: 80px; height: 80px;
/* Visual: Iconic camera button design */ background: #fff; border: 6px solid rgba(255, 255, 255, 0.3); border-radius: 50%; cursor: pointer; transition: all 0.1s ease;
/* Remove default button styling */ padding: 0; margin: 0;}
.capture-button:active:not(:disabled) { transform: scale(0.9); background: #e0e0e0;}
.capture-button:disabled { opacity: 0.5; cursor: not-allowed;}
/* Advanced toggle - small, secondary */.advanced-toggle { background: transparent; border: none; color: #fff; font-size: 13px; padding: 8px 12px; cursor: pointer; border-radius: 8px; transition: background 0.2s;}
.advanced-toggle:hover { background: rgba(255, 255, 255, 0.1);}
/* Advanced controls (progressive disclosure) */.advanced-controls { background: rgba(0, 0, 0, 0.95); padding: 20px; border-top: 1px solid rgba(255, 255, 255, 0.1); animation: slideUp 0.3s ease-out;}
@keyframes slideUp { from { transform: translateY(100%); opacity: 0; } to { transform: translateY(0); opacity: 1; }}
.control-group { margin-bottom: 20px;}
.control-group:last-child { margin-bottom: 0;}
.control-group label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 8px; color: rgba(255, 255, 255, 0.7);}
.control-group input[type="checkbox"] { /* Ergonomics: 24px touch target */ width: 24px; height: 24px; margin-right: 8px; vertical-align: middle;}
/* Segmented control (iOS-style) */.segmented-control { display: flex; background: rgba(255, 255, 255, 0.1); border-radius: 8px; padding: 2px;}
.segmented-control button { flex: 1; /* Ergonomics: 44px minimum touch target */ min-height: 44px; padding: 10px 16px;
background: transparent; border: none; color: #fff; font-size: 14px; font-weight: 600; border-radius: 6px; cursor: pointer; transition: all 0.2s;}
.segmented-control button.active { background: rgba(255, 255, 255, 0.3);}
.segmented-control button:hover:not(.active) { background: rgba(255, 255, 255, 0.05);}| Setting Type | Approach | Example |
|---|---|---|
| Technical, complex | ✅ Smart default | HDR, white balance, ISO |
| Personal preference | ⚠️ Ask with default | Language (detect, allow change) |
| Legal/compliance | ❌ Must ask | Terms acceptance, age verification |
| Privacy-sensitive | ⚠️ Conservative default | Location = off, analytics = opt-in |
| Question | Product evidence |
|---|---|
| Is the primary task ready without configuration? | Camera opens in Photo mode and exposes a Shutter control |
| Are technical defaults applied automatically? | Focus and exposure are automatic; supported models automate HDR and Night mode |
| Can users override the system? | Focus, exposure, flash, Night mode, and other controls are available |
| Can repeat users preserve choices? | Preserve Settings stores selected modes and controls when enabled |
| Are model differences acknowledged? | Apple’s documentation qualifies hardware-dependent behavior as “on supported models” |
These are documented product behaviors, not outcome benchmarks. Teams adopting the pattern should measure task speed, image acceptability, and override discoverability in their own context.
Human Standards Integration: Analysis updated against cited primary documentation, August 2026