526 cards · 424 live examples. Each card has a link of its own; tap an example to replay it, hold it to slow it down.
Element appears or disappears by changing opacity.
Element enters by sliding in from off-screen (left, right, top, or bottom).
Element grows from smaller to full size as it appears, often paired with a fade.
Element appears with a slight overshoot, like it bounces into place.
Content is uncovered gradually, often by animating a clip-path or mask.
The animation an element plays when it's added to or removed from the screen.
Defined points in an animation (0%, 50%, 100%) that the browser fills the gaps between.
Generating all the in-between frames between a start and end value.
Animate several items one after another with a small delay between each.
Deliberately timing multiple animations so they feel like one coordinated motion.
Time before an animation starts.
How long an animation takes.
Whether an element keeps its first or last frame's styles before the animation starts or after it ends.
An animation divided into discrete steps, like a countdown timer.
Move an element along the X or Y axis.
Make an element bigger or smaller.
Spin an element around a point.
Slant an element along the X or Y axis, shearing it out of rectangular shape.
Rotate in 3D space (rotateX / rotateY) to add depth.
How strong the 3D effect looks - lower values exaggerate depth.
The anchor point a scale or rotation grows or spins from.
An element animates out of its trigger, like a popover growing from the button.
One element fades out as another fades in, in the same spot.
A change that keeps users oriented by visually connecting before and after.
One shape smoothly turns into another shape, e.g. Dynamic Island.
An element travels and transforms from one position into another.
When an element's size or position changes, it animates to the new spot instead of snapping.
A section smoothly expands and collapses its height to show or hide content.
Content slides one way going forward and the opposite way going back.
Elements fade or slide into place as they enter the viewport.
An animation whose progress is tied directly to scroll position.
Background and foreground move at different speeds while scrolling, creating depth.
An animation that plays when navigating from one page or route to another.
The browser morphs between two states or pages, connecting shared elements.
Visual change when the cursor moves over an element.
A subtle scale-down when an element is clicked, so it feels physical.
A progress effect that fills up while the user holds a button.
Moving an element by grabbing it, often with momentum when released.
Dragging items in a list to rearrange them while others shift to make room.
Dragging an element off-screen to close it, like a drawer or toast.
Resistance and snap-back when you drag past a boundary.
A quick side-to-side jitter signaling an error or rejected input.
A circle expanding from the point of a tap, confirming the press.
The rate at which an animation speeds up or slows down.
Starts fast, ends slow. The default for most UI and anything responding to the user.
Starts slow, ends fast. Usually avoided; can feel sluggish.
Slow, fast, slow. Good for elements already on screen moving from A to B.
Constant speed. Avoid for UI; reserve for spinners or marquees.
A custom easing curve you define for precise control.
A curve that accelerates and decelerates at different rates.
Motion driven by physics (tension, mass, damping) rather than a set duration.
How strongly the spring pulls toward its target. Higher feels snappier.
How quickly a spring settles. Lower damping means more bounce.
How heavy the animated element feels. More mass makes it slower.
A spring that overshoots and settles, adding playfulness.
How long a spring feels finished, even though it keeps micro-settling.
Motion that carries velocity, especially after a drag or interruption.
How fast and in which direction an element is moving.
An animation that can be smoothly redirected mid-flight.
Text or content that scrolls continuously in a loop.
An animation that repeats, a set number of times or infinitely.
A loop that plays forward then reverses each iteration.
An element circling around another in a continuous path.
A gentle repeating scale or opacity change to draw attention.
A gentle, continuous up-and-down drift that makes a static element feel alive.
Subtle motion that plays while an element is just sitting there.
A blur filter used to soften an element or mask tiny imperfections.
Clipping an element to a shape, used for reveals, masks, and sliders.
Hiding or revealing parts of an element using a shape or gradient.
A draggable divider that wipes between two overlaid images.
An SVG path that draws itself in, like an invisible pen tracing it.
Text that animates character by character when it changes.
A placeholder with a moving sheen shown while content loads.
Digits rolling or counting up to a value.
Fixed-width digits so numbers don't shift around as they change.
Text appearing one character at a time, as if being typed.
Frames drawn per second. 60fps is the baseline; 120fps on newer displays.
Visible stutter when the browser drops frames because it can't keep up.
A frame the browser missed its deadline to draw.
Letting the GPU move or fade an element on its own layer.
A CSS hint that an element is about to animate.
Animating properties like width, height, top, or left that force recalculation.
Motion should serve a function - orient, give feedback, show relationships.
A small wind-up in the opposite direction before a move.
Parts of an element keep moving and settle slightly after the main motion stops.
Deforming an element as it moves to convey weight, speed, and flexibility.
The right animation makes an interface feel faster, even when it isn't.
The more often a user sees an animation, the shorter and subtler it should be.
Animating so an element keeps its identity across states.
Animating transform and opacity lets the GPU keep motion smooth.
Respecting the user's prefers-reduced-motion setting by toning down motion.
Which CSS properties animate. Opacity and transform are the safe pair.
A moving gradient that sweeps across a skeleton loader to suggest activity.
The coordination of multiple elements animating at the same time.
Entering and exiting animations should not mirror - entrances decelerate into place; exits accelerate away.
When navigating between two related views, the motion direction should reflect the spatial relationship between them.
Using animation to confirm that something happened: a button that compresses on press, a form field that shakes on invalid input.
The space between two specific characters, adjusted manually. Different from tracking, which affects all characters equally.
Letter-spacing applied uniformly across a word or block of text. Uppercase labels almost always need more of it.
The vertical space between lines of text. Too tight and text suffocates. Too loose and it stops reading as a paragraph.
Space adjustments made by eye rather than font metrics to eliminate awkward gaps between letter pairs.
A predetermined set of font sizes that work together, usually based on a ratio.
How thick or thin a typeface's strokes are. Bold is for UI emphasis and hierarchy.
The height of a lowercase letter like x, relative to the cap height.
The height of a capital letter. Along with x-height, it determines how large a font feels on screen.
Two characters that merge into a single glyph to avoid awkward collisions. fi and fl are the most common.
How browsers render font edges; antialiased rendering appears thinner and crisper.
What happens when text is longer than its container. Truncation with an ellipsis is the most common solution.
Breaking a word across lines with a hyphen. Helps with narrow columns and justified text.
A technique for fluid type sizing that sets a minimum, preferred, and maximum value.
A single word left alone on the last line of a paragraph. text-wrap: balance can fix it automatically.
A single line of a paragraph stranded at the top of a new column or page.
The ordered list of fonts the browser tries before giving up.
How wide a column of text runs. Around 65 characters is comfortable.
A single font file containing a range of weights, widths, or other axes.
Raised characters for footnotes or exponents. The HTML sup element is too large by default.
Lowered characters for formulas or notation. The HTML sub element has the same problem as sup.
The standard color space most screens have used for decades. All hex values live here.
A wider color space supported by most modern screens. Allows more vivid colors, particularly greens and reds.
A color space that matches how humans perceive brightness. Unlike HSL, two colors at the same lightness value actually look the same brightness.
The transparency component of a color, from fully opaque to fully invisible.
A color variable named for its purpose rather than its value.
The luminance difference between a foreground and background color. WCAG requires 4.5:1 for body text, 3:1 for large text and UI components.
A grey with a slight hue bias. Pure #808080 looks like a placeholder.
How vivid or muted a color is.
The OKLCH equivalent of saturation, but perceptually accurate.
A transition between two or more colors.
Two distinct hiding methods - opacity maintains space and pointer events; visibility hidden removes interaction but preserves space.
An interface built on dark surfaces. The brightest surface should sit at the top of the layering hierarchy.
How a layer interacts with what's beneath it. Multiply darkens, Screen lightens, Overlay does both depending on the base color.
How thick the lines of an icon are. Thin strokes disappear at small sizes.
Where something looks centred versus where it mathematically is.
Two icon styles for communicating state. Filled often signals active or selected.
Whether stroke ends are square or round. Round caps feel finished in most UI contexts.
Adjusting icon paths to sit cleanly on a pixel grid at small sizes.
A set of icons drawn at the same size, weight, and radius.
The defined sizes an icon is designed to appear at, typically 12, 16, 20, 24, and 48px.
When the same icon is used for two different actions in the same product.
Switching from an outlined icon to a filled one (or vice versa) to signal a state change.
The space between an icon and its label inside a button or list item.
When icons and surrounding text share the same visual weight.
Whether the icon actually represents what it's supposed to.
The rounding on a corner. An inner element inside a rounded container needs a smaller radius.
Space between flex or grid children, set on the parent.
The empty area around and between elements. It defines shape, creates breathing room, and guides the eye.
A CSS layout model for arranging elements in a row or column.
Figma's implementation of flexbox: elements that space themselves, resize with their content, and respond to direction and alignment rules.
When elements move unexpectedly as a page loads: images popping in, fonts swapping, content reordering.
What happens when content is larger than its container. Hidden clips silently. Scroll adds a scrollbar.
An element that scrolls normally until it hits a threshold, then fixes in place.
The proportional relationship between width and height.
Units relative to browser dimensions; dvh accounts for mobile browser chrome that shows/hides on scroll.
The part of a screen not obscured by notches or home indicators.
A cap on how wide a container gets. Without one, text lines stretch to unreadable lengths on wide screens.
The point at which a layout changes to suit a different screen size.
A design that adapts to different screen sizes rather than being fixed.
A system of columns that organises layout. 12 columns is conventional.
A layout where columns or elements are intentionally unequal. Creates tension and visual interest.
A horizontal rhythm built from the line-height of body text.
The stacking order of elements on the same plane.
The visual signal that tells you how something can be used.
The visual change when a cursor moves over an interactive element.
The visible indicator that an element is keyboard-focused.
The visual change when an element is pressed.
A non-interactive element. Using opacity alone is unreliable since it can pass or fail contrast checks unpredictably.
The pointer icon that signals what an element does. Pointer means clickable.
Whether an element can receive mouse or touch input.
Updating the UI before the server confirms the action. Feels instant.
A delay before firing a function, reset each time it is triggered.
The tappable area of an interactive element. The minimum is 44x44px.
A button that copies text. Needs visible confirmation, typically a checkmark for a second or two.
A visually hidden link that jumps to the main content.
Web Content Accessibility Guidelines. The standard most teams use for color contrast. AA requires 4.5:1 for body text, 3:1 for large text and UI components.
Advanced Perceptual Contrast Algorithm. A newer contrast model that accounts for font size and weight.
Software that reads interface content aloud for blind or low-vision users.
The sequence keyboard focus moves through when pressing Tab.
A media query that detects the user's system theme preference.
An accessible name for an element with no visible text.
Keeping keyboard focus inside an open modal or dialog.
The sequence of elements in the HTML. Screen readers follow this, not visual order.
Using the right element for the job. A button handles keyboard events, focus, and role for free.
Linking a label to its input via matching for and id attributes.
Using color as the sole signal for a state change.
Showing only what is needed at each step, revealing complexity as the user goes deeper.
The system for moving between areas of a product.
The user's internal picture of how something works.
The ranking of elements by importance.
The view when there is no content yet. Should explain why and offer a next step.
What the UI shows when something fails. Should say what went wrong and offer a specific way to recover.
Introducing a new user to a product.
A prompt before a destructive or irreversible action.
The system of signals that help users understand where they are, how they got there, and where they can go.
A UI element whose only job is to orient the user.
The words used for navigation items, section headers, and categories.
How many levels of navigation a user must traverse to reach content. Three levels is generally the limit.
When users resort to search because navigation has failed them.
A complete list of everything in a product or site.
A research method where users group topics or features into categories that make sense to them.
Short UI text: labels, error messages, placeholders, tooltips.
Call to action. The label on the primary action. Save changes builds more trust than Submit.
Text explaining what went wrong and how to fix it.
Hint text inside an input that disappears when the user starts typing.
Capitalising only the first word and proper nouns.
Putting the most important word first.
An error message next to the field that caused it.
The consistent personality behind all the words in a product.
How the voice adapts to the moment.
Confirmation that an action completed.
The copy on actions that cannot be undone. Delete, remove, disconnect, revoke.
Text written to be read quickly rather than thoroughly.
Deciding where and how text gets cut when it overflows.
Explanatory text placed close to the thing it explains, at the moment the user needs it.
How numbers are written in the interface. 1,000 vs 1000.
A shared set of components, tokens, patterns, and guidelines.
The single place a team defers to for design decisions.
Named containers for values like colors, spacing, or type sizes that can be reused and updated from one place.
Design decisions stored as named variables that both design tools and code can reference.
The cohesive set of decisions covering color, type, shape, motion, and tone that makes a product recognisable.
A named canvas in a design file representing a screen, view, or component.
An interactive mockup used to test or communicate a flow before it's built.
The moment design moves to engineering.
Measurements and notes added to designs to communicate intent to developers.
A collection of visual references to explore or communicate a direction before committing.
Screens with twice or more the pixel density of a standard display.
The metadata controlling how a link previews when shared.
Two design variants running simultaneously to measure which performs better.
A visualisation of where users click, tap, or scroll on a page.
Video of individual user sessions through a product.
The path users take toward a conversion goal.
The moment a visitor takes the desired action.
The percentage of visitors who leave without taking any action.
How many users come back after their first visit.
Users who stop using the product. The inverse of retention.
Net Promoter Score. A measure of how likely users are to recommend a product, on a scale of 0 to 10.
How far down a page users actually read.
The primary action trigger. Needs distinct default, hover, active, focus, disabled, and loading states.
A text entry field. Needs a persistent label above it, not just a placeholder.
A multi-line input. Needs the same state treatment as a single-line input.
A dropdown for choosing one option from a list.
A toggle for a binary choice. Clicking the label should toggle it.
A set of options where exactly one can be selected.
A toggle for an on/off state. Implies an immediate effect.
A control for selecting a value within a range.
An overlay that interrupts the current flow to require attention.
A panel that slides in from the screen edge.
A bottom sheet that pulls up from the base of the screen.
A small overlay anchored to an element, triggered by click.
A small label on hover that explains an element. Cannot contain interactive content.
A temporary notification that auto-dismisses.
A small label attached to another element. Implies a count when numeric.
A label that categorises content. Tags are standalone, selectable, or removable.
Switches between related views in the same space.
A multi-step flow that shows progress through a sequence.
A horizontally scrollable row of items.
A top-level or flyout structure for moving between major sections.
Persistent navigation anchored to an edge.
A trail showing location within a hierarchy.
Controls for moving between pages of content.
An indeterminate loading indicator.
A small image representing a user or entity.
A contained surface grouping related content.
A structured grid of rows and columns.
An input that filters a dropdown as you type.
A keyboard-triggered search interface for navigating or executing actions.
A bar showing completion through a determinate process.
A visual divider between items or sections.
The single place JavaScript runs function calls. It's LIFO: the last function pushed on is the first to finish and pop off. While it has frames on it, nothing else can run.
Browser-provided features (timers, fetch, DOM events) that run outside the JS engine. You hand them work and a callback; they run it on their own and hand the callback back when done — so the stack stays free.
Where finished callbacks (setTimeout, DOM events) wait their turn. It's FIFO — first in, first out. One task runs to completion before the next is picked up.
A higher-priority queue for promise callbacks and queueMicrotask. It's drained completely — every microtask runs — before the next macrotask or a render.
The loop that ties it together: whenever the call stack is empty, it drains all microtasks, then takes one task from the queue and runs it. Repeat forever.
All microtasks drain before the next macrotask — always. A promise scheduled after a timer still runs first, because microtasks jump the queue.
0 ms is a minimum delay, not 'run now'. The callback still waits for the stack to clear and all microtasks to drain first — so it runs last, not immediately.
Syntactic sugar over promises. Code before await runs synchronously; everything after await is queued as a microtask that resumes once the awaited value settles.
After microtasks drain, the browser may paint. requestAnimationFrame callbacks run right before that paint — the right place for visual updates so they land in the next frame.
Long synchronous work keeps a frame on the stack, so the loop can't reach queued tasks or repaint. Clicks, animations, and rendering all freeze until it finishes.
Because microtasks fully drain before anything else, a microtask that keeps scheduling more microtasks never lets the loop reach the task queue or a render — starving them.
The browser is the whole app; the rendering (or 'browser') engine is the part that turns HTML and CSS into pixels. Each major browser ships its own: Chrome and Edge use Blink, Safari uses WebKit, Firefox uses Gecko.
Modern browsers split work across separate OS processes — browser, renderer, GPU, network, and utility — so one crashed or busy tab can't take down the whole browser.
The privileged process that owns the UI you interact with — address bar, tabs, back and forward — and coordinates the network and renderer processes. It's the only one with broad access to your machine.
The process (often one per site) responsible for everything inside a tab: parsing, styling, layout, paint, and running the page's JavaScript on its main thread.
Renderer processes run with restricted privileges — no direct file or network access — so a compromised page can't touch your system. They ask the browser process to act on their behalf.
Each site is given its own renderer process, so a malicious page can't read another site's memory. A defense hardened after the Spectre CPU attacks.
Typing a URL kicks off a chain: DNS lookup, then connect (TCP + TLS), then an HTTP request, then the response — and only then does the browser hand the HTML to a renderer to display.
Translating a human domain name into the numeric IP address of a server. The browser checks its caches first, then asks a DNS resolver.
Before any data flows, the browser opens a TCP connection (a three-step handshake) and, for HTTPS, negotiates TLS encryption — extra round trips before the first byte arrives.
The browser sends an HTTP request (method, URL, headers); the server replies with a status code, headers, and a body — the HTML document to render.
Once the response's first bytes and content type confirm it's a page to display, the browser process tells a renderer to take over — the URL bar updates and the old page is gone.
The browser reads HTML top to bottom, tokenizes the tags, and builds the DOM — a tree of nodes representing the page's structure and content.
The tree-shaped model of all CSS rules, with every node's styles resolved after the cascade and inheritance. The style half of what gets rendered.
DOM and CSSOM combined into a tree of only the nodes that will actually be painted, each with its computed style. Invisible nodes (display:none, <head>) are left out.
Walking the render tree to compute the exact geometry — position and size — of every box on the page. Also called reflow, and it runs again whenever geometry changes.
Filling in the actual pixels — text, colors, borders, shadows, images — for each box, often onto separate layers. Turns geometry into a picture.
The browser won't paint until the CSSOM is ready, so CSS blocks the first render. It's fetched at high priority to unblock the page as fast as possible.
A plain <script> tag pauses HTML parsing until it's fetched and run, because a script can change the DOM. The `async` and `defer` attributes let parsing continue.
A secondary parser that races ahead of the main one while it's blocked, spotting and pre-fetching resources — images, scripts, stylesheets — before they're formally reached.
Browsers match CSS selectors right to left, starting from the rightmost 'key' selector. Rejecting non-matching elements early is far faster than searching left to right.
Anything that changes geometry — resizing, editing text, adding elements, or even reading a layout property like offsetHeight — forces a reflow. Reflows are expensive.
Interleaving DOM reads that force layout with writes, in a loop, so the browser recomputes layout over and over. Batch all reads, then all writes, to avoid it.
A repaint redraws pixels without moving anything (like a color change); a reflow recomputes geometry and is costlier because it can cascade to surrounding elements.
The page is split into layers painted separately, then the compositor stitches them together. Moving a layer with transform or opacity skips layout and paint entirely.
A separate thread that moves and combines already-painted layers without the main thread. It can keep scrolling and running transform/opacity animations even while JS is busy.
Converting painted layers into actual bitmaps of pixels — usually in tiles and on the GPU — so the compositor has something concrete to put on screen.
To hit 60 frames per second, the browser has roughly 16 ms per frame for JS, style, layout, paint, and composite combined. Overrun it and frames drop.
Visible stutter when the browser misses frames — usually because a long main-thread task pushed style, layout, or paint past the frame deadline.
Calling a function that runs on another machine as if it were local: the arguments are serialized, sent over the network, executed on a server, and the return value is sent back.
Apple's first principle: make something meaningful and decide what NOT to build. Every feature spends the user's time, attention, and trust, so each one must earn its place.
Let people do things their own way: offer choices instead of forcing one path, and back it with forgiveness (easy undo). Recovering from the unexpected shouldn't cost people their work.
Act in people's best interest: collect only what's needed, be transparent about why, keep data safe, and anticipate misuse.
Build on what people already know. Use consistent visuals and interactions and give clear feedback on state changes; break a familiar pattern only if you can prove the new one is better.
Adapt to diverse contexts, devices, inputs, and abilities. Accessibility is designed in from the start, not bolted on; supporting more input methods lets more people use the product.
Be clear and direct. Simplicity isn't minimalism — include just what's necessary and establish a hierarchy so the most important thing is the most obvious.
Care about every detail — nothing is random. Every spacing, timing, and alignment value is a deliberate, defensible choice, and shipping isn't the finish line.
Apple's eighth design principle — 'make it human'. People remember how a product makes them feel, so decide the emotion right for the experience and deliver it deliberately. Delight is an intended feeling, not decoration sprinkled on top.
A named color that carries a meaning (label, separator, surface) rather than a raw value. It resolves to different values per appearance — light, dark, increased contrast — so one reference adapts everywhere.
Four decreasing levels of text emphasis — primary, secondary, tertiary, quaternary — used to signal importance with color instead of size alone.
Layered surface levels — primary, secondary, tertiary — whose relative lightness conveys nesting and grouping without borders.
A single, sparingly-used color that draws the eye to the most important action. Putting accent on many controls at once makes them compete and dilutes it.
The minimum luminance difference for legibility: 4.5:1 for body text, 3:1 for large (≥18pt/24px or bold) text. Dark mode aims higher — around 7:1 for small custom text.
A higher-contrast variant shipped for people who ask the system for it. You provide the stronger pairing rather than computing it from the default.
Never let color be the only thing that carries meaning. Pair it with an icon, shape, position, or text so it survives color-blindness, glare, and grayscale.
Colors defined in a wider gamut (Display P3) that render more saturated on capable screens, with an sRGB fallback for the rest.
A dark appearance driven by the system setting, not an in-app toggle as the source of truth. You honor prefers-color-scheme first; a manual override is secondary.
Light and dark are independently designed pairs, not one computed from the other. Never produce dark mode by inverting the light palette.
In dark mode, closer surfaces are lighter. Elevation is conveyed by luminance — modals and popovers sit brighter than the receded base — rather than by heavy shadow.
Soften pure-white embedded content in dark mode; a white image or block 'glows' against dark chrome. Tint or dim it slightly so it sits in the surface.
A translucent, blurred layer that lets the content behind it show through, used for functional chrome (bars, sheets) so the interface feels layered rather than opaque.
Foreground content on a material that adapts to what's behind it for legibility, instead of a hard-coded white or black. It picks up tone from the blurred backdrop.
The mental model behind materials: a floating controls/chrome layer above a content layer that visibly scrolls underneath. Translucency shows the relationship between the two.
The trade-off in a material's opacity: a thicker (more opaque) material gives better contrast for text-heavy overlays; a thinner (more transparent) one keeps more context over rich media.
A semi-transparent dark (or light) wash placed behind text over a busy or bright background so the text stays legible.
When the user requests reduced transparency, materials fall back to a solid, opaque background and the blur is dropped.
Instead of a permanent 1px divider, a fixed header gains a subtle blur or shadow only once content scrolls behind it — the separation appears when it's needed.
Text that respects the reader's chosen text size, scaling up or down with the system/browser setting instead of a fixed pixel size. On the web this means sizing in rem, not px.
A named style from a semantic scale (Large Title, Title, Headline, Body, Caption…) that bundles size, weight, and line-height together — you apply the role, not raw font values.
Line height set relative to the font size — roughly 1.25–1.3× across the scale — so lines have room to breathe and large text doesn't collide.
Letter-spacing depends on size: tighten large display text (negative tracking) and keep body near zero. A single fixed letter-spacing is wrong somewhere on the scale.
Keep body text at a legible minimum — never below about 11pt (≈15px equivalent) — and avoid ultralight/thin weights for body, especially at small sizes.
Limit the interface to about one display face plus one body face. Prefer the system font, which ships optical sizing and legibility tuning, before reaching for a custom typeface.
At large text sizes, let labels wrap and switch inline rows to stacked layouts rather than truncating with an ellipsis. Support 200% enlargement without losing content or function.
The region guaranteed clear of notches, rounded corners, and the home indicator. Content extends edge-to-edge, but interactive and essential content stays within the safe area.
Consistent margins that hold content at a comfortable reading width and keep it aligned across views, rather than letting it run to the raw screen edges.
Using space, shared backgrounds, and separators to show which elements belong together. Related items sit close; unrelated items are pushed apart.
The most important content goes to the top and leading (start) edge, because that's where reading begins — and this flips in right-to-left languages, so never hard-code 'important = left'.
Design the full layout first and collapse to a compact arrangement only when the content no longer fits, rather than guessing a device by viewport width.
Signal that more content exists — a peek, a 'show more', a scroll affordance — instead of silently truncating it. Reveal complexity gradually as people ask for it.
Never stretch or squash media to fit a box; preserve its aspect ratio with contain or cover so nothing distorts.
A consistent spacing rhythm built on a base unit (Apple's precedent: 8pt-style steps, with values like 12 and 24 for control padding) so gaps feel intentional and aligned.
Apple's system icon set, designed to sit alongside text like a font — the same glyph comes in multiple weights and scales, and aligns to the text baseline.
An icon's stroke weight should match the weight of the text beside it, and its size should scale with that text (sized in em), so glyph and label read as one unit.
Outline vs filled is a legitimate state axis: outline for the default/inactive state, filled for the selected/active one — used consistently across a set like a tab bar.
Aligning glyphs by how they look, not by their bounding box. Asymmetric shapes (a play triangle, a download arrow) need nudging so they appear centered.
An app/home-screen icon expresses one core concept in minimal shapes — no screenshots, no photos, no text — and keeps its identity consistent across every size and surface.
When a status glyph animates, the motion should match its meaning: pulse for ongoing activity, rotation for in-progress, a bounce/scale for something just completed.
Ship raster images at multiple pixel densities (1x/2x/3x) so they stay crisp on high-DPI screens, and pick the format by content (photos → AVIF/WebP, flat art → SVG).
The single most important motion principle: never lock out input during a transition. A moving element must be grabbable and reversible mid-flight — a closing sheet the user catches should follow the finger.
Always start an animation from the element's current on-screen value, not its target. On interruption you read the live transform and continue from there, so there's no jump.
A physics model that settles toward a target and is inherently interruptible and velocity-aware. Apple describes springs by two designer-friendly params — damping ratio and response — not by a fixed duration.
How much a spring overshoots. 1.0 is critically damped — a smooth settle with no bounce; below 1.0 overshoots, and lower means bouncier.
How quickly a spring reaches its target, in seconds. Lower is snappier. It's a feel parameter, not a fixed duration the animation must last.
Continuing an animation at the exact velocity the finger had at release, so there's no visible seam between the drag and the motion that follows.
Predicting where a flicked element would come to rest from its release velocity (like scroll deceleration), then snapping to the nearest target — this is what makes a flick feel like a throw.
Progressive resistance at a boundary instead of a hard stop. The content moves less and less as you pull past the edge, then springs back — a hard stop reads as frozen.
Enter and exit along the same path: a panel that slides in from the right dismisses back to the right. Reversible transitions mirror their easing.
A menu, popover, or sheet originates from the control that triggered it, not from the screen center — its transform-origin is the trigger.
Show feedback the instant a control is pressed (pointer-down), not on release. Waiting for the click event to highlight feels dead.
Dragged content stays glued to the finger 1:1 and respects the grab offset — it doesn't snap to center when grabbed — and it updates continuously throughout the gesture.
When the user asks for reduced motion, replace positional slides/springs with fades, drop parallax and z-axis/blur animation, and keep opacity/color changes that aid comprehension.
Interactive targets are at least 44×44px, with spacing around them (roughly 12px near bezeled controls, more around icon-only ones) to prevent mis-taps. Grow the hit area, not necessarily the visual.
Every meaningful image, icon, and control has a text alternative screen readers can announce; purely decorative ones are hidden from assistive tech.
Essential information is never conveyed through a single channel — color, motion, or sound alone. Always pair it with a second cue (icon, shape, text).
Don't dismiss important messages on a timer — some people need more time to read. Prefer explicit dismissal, or timing that's generous and adjustable.
Nothing flashes more than three times per second (a seizure risk), and audio/video never autoplays without a visible stop or pause control.
Provide full text alternatives for media at parity — captions and subtitles plus transcripts and audio descriptions — not captions alone.
One consistent voice across the product, with tone adjusted to the moment — calm and plain for a health alert, lighter for a celebration.
Action labels start with a verb that names the outcome ('Send', 'Add to Cart'), not a vague or cute phrase ('Let's go!').
Link and control text describes its destination or action, never 'Click here' — screen-reader users navigate by a list of links out of context.
An error states the actionable fix, not the rule that was broken — no blame, no 'oops'. Tell people what to do next.
A placeholder shows a concrete example of the expected input, not an instruction — and it's a hint, never the label (it vanishes on typing).
An empty state offers a clear next action, not a bare 'Nothing here' — it tells people how to fill it.
Address people as 'you', define or avoid jargon, and skip idioms — inclusive, plain copy is also easier to translate.
Let the content lead — resist stamping your logo throughout the chrome. People already know which app they're in; branding shows through craft, not repetition.
A splash screen is too brief to be a branding moment. If you want a welcome, build a real onboarding screen; don't hold up first use with a logo.
Request access to a sensitive resource only when the feature that needs it is invoked — at that moment, with the reason — not preemptively on launch.
The justification shown in a permission prompt is a specific, complete sentence saying exactly why access is needed — not a vague 'for a better experience'.
A custom pre-permission screen must not use dark patterns — no fake 'Allow' button, no arrows pointing at the real dialog, no false incentives. One neutral 'Continue'.
Collect only the data a feature needs, process it on-device where feasible, and never store secrets in plaintext — prefer secure cookies or passkeys over custom password schemes.
Launch straight into a usable state instead of showing a startup or marketing screen, and get people to content as fast as possible.
Return people exactly where they left off — restoring navigation, scroll position, selection, and in-progress input — so the app feels continuous.
A short, skippable introduction that teaches only what someone needs to start, using the app's real content rather than abstract tutorials.
Teach a feature at the moment it first becomes relevant instead of front-loading every instruction before people can begin.
Let people experience core value before requiring an account, permission, or purchase, so the ask is justified by something they've already seen.
Make help discoverable and contextual — available on demand near the task — rather than interrupting people who don't need it.
After an update, briefly highlight meaningful new features in a skippable screen; don't recap minor or bug-fix changes.
Show the screen's layout with neutral placeholder shapes while data loads, so the interface feels immediate and its structure is predictable.
Use a filling bar when the remaining time or amount of work is known, so people can gauge how long they'll wait.
Use a spinner or activity indicator when duration is unknown; switch to a determinate bar as soon as you can estimate progress.
Acknowledge every action the instant it happens — a press state, highlight, or motion — even when the underlying result takes time.
Pair meaningful moments with a matching system haptic to reinforce feedback through touch; keep it purposeful, never decorative.
A brief, self-dismissing confirmation that a background action succeeded, shown without blocking what the person is doing.
Reserve alerts for essential, actionable information that people must see; frequent or non-critical alerts train people to dismiss them.
Keep the interface responsive during work by showing partial results and letting people keep interacting instead of freezing the screen.
A focused mode that temporarily takes over to complete a self-contained task or make a decision, then returns people to where they were.
A card that slides up over the current context for a focused, dismissible task; it can be resized or swiped down to dismiss.
A small modal reserved for critical information or a decision that requires acknowledgement before continuing.
A set of choices related to the current task, presented from the bottom edge on iPhone or as a popover on iPad and Mac.
An immersive mode that hides surrounding chrome to focus on content; always keep an obvious, discoverable way to exit.
Prefer letting people keep interacting with surrounding content instead of trapping them in a mode; use modality only when focus is essential.
Sheets can be dismissed by dragging downward; when there are unsaved changes, confirm before discarding rather than losing work silently.
Ask for the least information possible, and infer or pre-fill whatever you can, because every field is a chance to abandon the task.
Match the on-screen keyboard to the expected value — email, number, phone, or URL — so the right keys are available immediately.
Let the system fill saved names, addresses, passwords, and one-time codes so people rarely have to type known information.
Check input as people type and explain how to fix a problem in place, rather than rejecting everything only on submit.
Offer a sensible default value so most people can accept it and move on without touching the field.
Format values such as phone numbers and card numbers automatically as they're entered so people don't manage punctuation.
Clearly indicate which fields are required and which are optional so people aren't surprised by an error at the end.
Present data visually with clearly labeled, accessible charts; support VoiceOver descriptions and Audio Graphs for the same information.
Delay account creation until it's genuinely required for a feature, letting people build investment before committing.
If your app lets people create an account, it must also let them delete that account and its data from within the app.
Prefer passkeys over passwords for sign-in: they're phishing-resistant, need nothing to memorize, and sync securely across devices.
Use the system share sheet so people share content through familiar, extensible destinations and actions instead of a custom menu.
Show who's present and provide clear controls for who can view or edit shared content, with visible activity and permissions.
Request ratings sparingly and only after a positive moment, using the system prompt so it never blocks the current task.
Provide search wherever content is large, and show results progressively as people type rather than only after they submit.
Let people narrow results to a category or section when a single result list would be too broad to scan.
Offer recent and suggested searches so repeat queries take a tap instead of retyping.
Choose good defaults so most people never need to open Settings; a large settings screen is a sign of unmade decisions.
Put options people change often within reach in context, and keep rarely changed configuration in Settings.
Apply a settings change immediately so people see its effect, rather than requiring a separate save or apply step.
Send only notifications that are timely, relevant, and actionable; noise erodes trust and leads people to turn them off entirely.
Ask for notification permission in context, after people have seen why alerts would help, not on first launch by reflex.
Deliver notifications quietly to Notification Center first, letting people opt into prominent alerts once they've seen the value.
Group related notifications together so a burst of updates reads as one thread instead of flooding the Lock Screen.
Offer relevant actions directly on a notification so people can respond without opening the app.
Reserve interruption levels like Time Sensitive and Critical for genuinely urgent items; most notifications should be passive.
Honor the person's Focus, Do Not Disturb, and scheduled-summary settings instead of forcing notifications through.
Let people reverse and reapply actions; prefer offering undo over interrupting with a confirmation dialog for reversible changes.
Support the system shake-to-undo gesture on iPhone and iPad where a text or editing context makes it meaningful.
Ask before an action that can't be undone, and label the confirming button with the specific action — Delete, Discard — not just OK.
Save people's work automatically and continuously so a manual Save step — and the risk of losing changes — disappears.
Use the system document browser and Files integration so people open, organize, and store documents in familiar, shared locations.
Expose your documents through the Files app and iCloud Drive so people can access them alongside everything else.
Support AirPrint with the standard print flow whenever a paper copy is a reasonable output for your content.
Let people move or copy content by dragging it to a valid destination, within your app and between apps that accept the content.
Highlight valid destinations as an item is dragged over them so people can tell where a drop will be accepted.
Show a lightweight representation of the dragged item that follows the finger or pointer throughout the drag.
Pausing a dragged item over a folder, tab, or button activates it after a moment, so people can navigate mid-drag.
Indicate whether a drop will copy or move the item, following platform conventions and modifier keys on Mac.
Let people add several items to a single drag session, then drop them all at once on a valid target.
A control that performs an action when activated; its label and style communicate what happens and how important it is.
A button's role shapes its appearance: the prominent (filled) style marks the primary action, and a destructive role uses red to warn.
A bar of controls for actions that apply to the current screen or selection, placed along the top or bottom edge.
A menu of actions relevant to a specific item, revealed by long-pressing (or right-clicking) that item.
The Cut / Copy / Paste callout that appears above selected text or content when people tap it.
A list of actions or options that appears on demand and dismisses as soon as someone makes a choice.
A button that reveals a menu of actions related to it; the button's label stays fixed regardless of what's chosen.
A button that shows the current selection and opens a menu to change it; the label updates to the chosen value.
On Mac, the always-present bar of commands grouped by category (File, Edit, View) at the top of the screen.
A nested group of related choices within a menu, revealed by hovering or tapping a parent item.
Transient content anchored to the control that summoned it, with a pointer to its source; common on iPad and Mac.
A row of dots indicating how many pages exist and which one is current, as in a paged carousel.
On Mac, an auxiliary window such as an inspector or panel that floats alongside the main content.
A scrollable region that shows content larger than its frame, revealing scroll indicators as people move through it.
A container for a distinct piece of app content, resizable and movable on Mac and iPad, with standard controls.
A single-line control for entering and editing short text, with a clear label and appropriate keyboard.
A control for a binary on/off choice that takes effect immediately, styled as a sliding switch.
A control for choosing a value from a continuous range by dragging a thumb along a track.
A two-part control that increments or decrements a discrete value in small, precise steps.
A horizontal set of two to five mutually exclusive options, showing the current choice as selected.
A scrollable wheel of values for choosing one option, such as a unit, category, or time.
A specialized picker for choosing a date, a time, or both, using calendar and wheel interfaces.
A control showing the current color as a swatch that opens the system color picker when tapped.
A text field combined with a list of suggestions, letting people type freely or pick a known value.
The bar at the top of a screen holding the title, a back control, and actions for the current view.
A bar of top-level destinations along the bottom edge, letting people switch sections with one tap.
A persistent navigation column for larger screens, listing top-level destinations beside the content.
The control that returns to the previous screen; label it with the prior screen's name where possible.
Rows of content shown in a scrolling column, often grouped into sections with headers and disclosure.
A control that expands or collapses a section of content, revealing detail only when it's wanted.
A layout for larger screens that shows a list and its selected detail side by side, keeping context visible.
A text field specialized for search, with a magnifier icon, clear button, and results shown as people type.
Concentric closed rings that represent progress toward daily goals, as seen in Fitness and on Apple Watch.
A control that shows a value within a range along an arc or line, useful for readings like speed or capacity.
A row of symbols, usually stars, that displays a score and can let people set one.
A small overlay on an icon showing a count or status, such as unread messages on an app icon.
Static, non-editable text that presents information or names a control; distinct from an interactive field.
A glanceable, ongoing status shown on the Lock Screen and in the Dynamic Island, updated in real time.
A single touch that activates a control or selects an item. The most common gesture — make tap targets large enough to hit reliably.
A touch held in place that reveals contextual actions, such as a context menu or a preview, without leaving the current screen.
A quick drag in one direction that scrolls content, reveals actions, or navigates between views.
Two taps in quick succession that typically zoom content or select a word. Reserve it for zoom or a clear secondary action.
A two-finger gesture that moves fingers apart or together to zoom in or out on content.
A two-finger gesture that turns content around a point, used for rotating photos, maps, or objects.
A one-finger drag that moves content within a view or repositions an object directly under the finger.
A swipe inward from the edge of the screen. The system reserves edge swipes for navigation and Control Center — don't override them.
The gestures people expect everywhere — tap, swipe, pinch, edge swipe. Use them consistently and never repurpose a system-reserved gesture for something else.
Key combinations that trigger frequent commands quickly. Offer them for common actions and match platform conventions like Command-S to save.
An accessibility mode that lets people operate every control using only the keyboard. Ensure all interactive elements are reachable and actionable.
The Command-key combination shown beside a menu item that invokes it directly. Assign them to your most-used commands.
The onscreen keyboard's primary key, labeled to match the action it performs so people know what happens next.
Pressing Escape cancels the current action or dismisses a transient view like a popover or sheet. Support it wherever people expect to back out.
Arrow keys move selection or focus through lists, grids, and pickers. Support them so keyboard users can navigate without a pointer.
The order in which the Tab key moves focus between controls. Make it follow the visual reading order so traversal feels logical.
On iPad and Mac, the pointer changes shape to fit the content beneath it — an I-beam over text, a resize arrow at an edge — signaling what it can do.
A subtle highlight or lift that appears when the pointer rests over an interactive element, confirming it responds before a click.
As the pointer nears a control, it gently snaps to and morphs into the target, making small elements easier to hit.
A right-click or Control-click that opens a context menu of actions for the item under the pointer.
Brief explanatory text that appears when the pointer hovers over a control on Mac, clarifying its purpose without cluttering the interface.
A clear visual indicator showing which control currently has keyboard focus, so people always know where their input will go.
When a screen opens, place focus on the control people are most likely to use first, saving a step for keyboard and remote users.
Focus should move predictably in the direction people expect. On tvOS the focus engine shifts focus toward the swipe direction on the remote.
Make text selectable and provide draggable handles so people can adjust the range precisely to copy, look up, or share it.
A selection mode that lets people choose several items at once to act on them together, with clear affordances for entering and leaving the mode.
A fast, private way to sign in using an existing Apple Account, with no new password to create and no personal data shared beyond what people approve.
The standard system button for Sign in with Apple. Use the provided styles, sizes, and localized titles — don't recreate or restyle it.
An option that lets people share a unique, random relay address instead of their real email, protecting privacy while still receiving your messages.
When you offer several sign-in options, present Sign in with Apple prominently alongside the others so people can choose the private path easily.
A fast, secure, private way to pay for goods and services using cards already stored in Wallet, authenticated with Face ID or Touch ID.
The standard system button that starts an Apple Pay transaction. Use the official styles and types (Buy, Pay, Subscribe) rather than a custom button.
When you support Apple Pay, present it as a primary, prominent option for physical goods and services so people can check out with a glance and a touch.
The system sheet that summarizes the order — amount, shipping, and contact details — and lets people confirm payment with authentication.
Be clear when content is generated by AI. Label generated results so people can weigh them appropriately and aren't misled about their origin.
Keep people in control of AI features. Let them review, edit, accept, or discard generated output rather than applying it automatically.
Give people an easy way to report inaccurate, offensive, or unexpected AI results, and use that feedback to improve the experience.
Set honest expectations that AI can make mistakes. Communicate limitations up front and handle wrong or empty results gracefully.
Prefer processing data on device to protect privacy and work offline, keeping personal information off remote servers whenever possible.