Inazda MotionClean
Reduce motion

Quiet motion for real interfaces.

24 micro-interactions for buttons, forms, lists, overlays and navigation. Each one is feedback, not a show: 120–200 ms, ease-out, keyboard and screen-reader ready, and still usable with reduced motion. One CSS file, one small ES module, no dependencies.

24interactions
0dependencies
19 KBCSS + JS, minified, gzipped
4durations

Notifications

Stockroom · Main warehouse

WaitingSavingSyncedFailed

Email digest

Yesterday's orders and stock, at 08:00.

Frequency

Alert me about

A settings panel made only from this pack: switch, segmented control, checkbox, loading button and status chip. Try it.

Four durations, one curve

Everything eases out on cubic-bezier(.2, 0, 0, 1). Things that settle use a gentle spring written in CSS linear(), with 1.5 % overshoot and the same curve as fallback.

  • 120 msPress, hover, exits
  • 160 msState and colour changes
  • 200 msEnters and crossfades
  • 280 msSprings that settle

Controls

The pieces people press most. The response lands before the action does.

01

Button press

Every button. A 3 % press confirms the click; release springs back. Quick taps are held for 100 ms so they still show.

120 ms down · 280 ms spring up · scale .97

Reduced motion. No scale. The hover and press colours still mark the press.

02

Loading → success check

Buttons that save or send. The width never changes, loading shows for at least 400 ms so it never flickers, and the check draws once.

160 ms label swap · 280 ms check draw · 1.8 s hold

Reduced motion. Labels crossfade in place, the spinner holds still and the check appears without drawing. “Saving” and “Saved” are announced.

03

Toggle with thumb squash

Settings that apply at once. While pressed, the thumb stretches toward where it is about to go, then travels on a spring.

160 ms squash · 280 ms spring travel · 160 ms track colour

Reduced motion. The thumb jumps without squash; the track colour still fades.

Auto-reorder

Order again when stock drops below 10.

Share with team

Everyone in Main warehouse can edit.

04

Checkbox draw

Opt-ins and multi-select lists. The box fills, then the tick draws the way you would write it. A native input, so forms and labels just work.

120 ms fill · 200 ms draw · CSS only

Reduced motion. The tick appears at once.

Email me about
05

Segmented sliding indicator

Switching between two to five views of the same data. The raised indicator glides; arrow keys move the choice.

280 ms spring glide · 120 ms label colour

Reduced motion. The indicator jumps to the new option.

06

Tabs underline glide

Sections of one object that share a page. The underline glides (transform only); panels share one grid cell, so the page never jumps.

280 ms spring glide · 200 ms panel crossfade

Reduced motion. The underline jumps; panels crossfade without the rise.

Customer
Rina Hartono
Total
$1,240.00
Due
30 Oct

Sent on 21 Oct. Opened twice. Rina asked to split the delivery into two drops.

Carrier
JNE Regular
Weight
14.2 kg

Feedback

Confirmations and state changes. Each one is announced to screen readers through one polite live region.

07

Copy confirm

Values people paste somewhere else: keys, links, commands. The icon turns into a tick and the label says Copied, then both return.

120 ms swap · 280 ms spring tick · 1.6 s hold

Reduced motion. Icons and labels crossfade without scaling.

iz_live_4f9a2c81e7b3d6
08

Inline validation

Fields with a format. Errors wait until you leave the field and clear the moment the value is right. The message shares the hint's line, so nothing below moves.

120 ms border · 160 ms message · no shake

Reduced motion. The message fades in place; the valid tick appears without scaling.

We send invoices and receipts here.

09

Toast stack

Confirmations that need no action. New toasts push the stack back; hover or focus expands it and pauses the timers. Swipe sideways, press Escape or use the close button to dismiss.

200 ms enter · 280 ms spring restack · 5 s timer, paused on hover

Reduced motion. Toasts fade in and out in place; the stack still restacks, without sliding.

    10

    Status chip change

    A state that changes while people watch: builds, syncs, payments. Colour fades and the icon turns into the next one. Labels share one cell, so the chip keeps its width.

    200 ms colour · 280 ms spring icon morph

    Reduced motion. Icons crossfade without turning; the running ring holds still.

    QueuedRunningPassedFailed
    11

    Progress determinate → done

    Uploads and exports with a known size. The bar scales (never width), the number is tabular so it does not wobble, and the label turns into a quiet done state.

    280 ms per step · 200 ms done colour

    Reduced motion. The bar steps without easing; start and finish are announced, not every percent.

    report.pdf report.pdf uploaded

    Data

    Numbers and rows that change under people's eyes. Mono, tabular, and never shifting the layout.

    12

    Number roll

    Counters and totals that change while visible. Only changed digits roll, in the direction of the change, right-most first.

    280 ms spring · 14 ms stagger · tabular mono

    Reduced motion. Digits switch at once. Screen readers get the full number, not the digit strips.

    Orders this month
    13

    Stat delta flash

    KPI tiles that update live. A soft tint behind the number fades out, so the eye finds what changed; the arrow turns with the direction.

    900 ms tint fade · 280 ms roll · 280 ms arrow turn

    Reduced motion. The tint still fades (no movement); digits and arrow switch at once.

    Revenue today +4.2%
    14

    Skeleton → content crossfade

    First load of a known layout. Skeleton and content share one grid cell, so the box keeps its size and nothing shifts when data arrives.

    160 ms out · 200 ms in · 3 px rise

    Reduced motion. Crossfade only, and the skeleton does not pulse.

    Rina HartonoToko Rina · Banjarbaru
    Orders
    48
    Spent
    $9,320
    Since
    2024
    15

    Table row expand

    Rows with details people check now and then. The table stays scannable; the detail opens under its row with the real height, no measuring.

    280 ms height · 200 ms chevron · 60 ms content delay

    Reduced motion. Rows open and close at once.

    DetailsOrderCustomerTotal
    INV-1042Rina Hartono$1,240.00
    Customer
    Rina Hartono
    Items
    12 cartons
    Due
    30 Oct
    INV-1041Dimas Prakoso$386.50
    Customer
    Dimas Prakoso
    Items
    3 boxes
    Due
    27 Oct
    INV-1040Sari Wulandari$2,015.00
    Customer
    Sari Wulandari
    Items
    20 cartons
    Due
    24 Oct

    Lists

    Items that appear, leave and change places. Neighbours slide to make room instead of jumping.

    16

    List add, remove, reorder (FLIP)

    Lists people edit directly. One flip() helper measures, lets you change the DOM however you like, then plays the difference with transforms.

    200 ms enter · 120 ms exit · 200 ms FLIP · 280 ms sort

    Reduced motion. Items appear, leave and reorder in place. Every change is announced.

    • Review invoice batchWed
    • Update price listThu
    • Approve March payrollFri
    17

    Drag to reorder, card lift

    Priorities people rank by hand. The card lifts under the pointer, neighbours step aside, and it settles into its slot. Keyboard: Space to lift, arrows to move, Space to drop, Escape to cancel.

    160 ms lift · 200 ms step aside · 200 ms settle

    Reduced motion. No lift scale or settling glide; cards still follow the pointer and swap in place.

    Press Space to lift a card, the arrow keys to move it, Space to drop it, or Escape to cancel.

    1. Fix checkout bug2 h
    2. Reply to Rina15 m
    3. Draft October report1 h
    4. Order packing tape5 m
    18

    Accordion height without jank

    FAQs and settings groups. Height animates through CSS grid rows (0fr to 1fr), so there is no measuring and nothing to recalculate when content changes.

    280 ms height · 200 ms chevron · 60 ms content delay

    Reduced motion. Panels open and close at once.

    Yes. Changes apply from the next billing day, and unused days carry over.

    Only people you add to the workspace. Each person gets view or edit rights per site.

    Every night, kept for 30 days. You can restore a single record or a whole day.

    Overlays

    Things that open over the page. They come from where you clicked, leave faster than they arrive, and give focus back.

    19

    Popover, scale from origin

    Row actions and overflow menus. The panel grows out of the button that opened it, flips above when there is no room, and closes on Escape, Tab or an outside click.

    160 ms in · 120 ms out · scale .95 from the trigger

    Reduced motion. The menu fades without scaling.

    20

    Tooltip with hover intent

    Icon-only buttons. Waits 500 ms on the first hover, then switches at once between neighbours. Shows straight away on keyboard focus, stays while you hover it, and Escape hides it.

    500 ms intent · 120 ms fade · 300 ms warm window

    Reduced motion. Fade only, no rise. The delay stays: it is about intent, not motion.

    Bold
    Italic
    Comment
    21

    Dialog enter / exit + backdrop

    Confirmations that block. A native <dialog>: focus is trapped and returned for free. Escape, the backdrop and every close button leave with the same motion.

    200 ms in · 120 ms out · 6 px rise · scale .97

    Reduced motion. Panel and backdrop fade only.

    Delete “Stockroom”?

    Its 214 items and 3 sites go to the bin for 30 days, then they are gone.

    22

    Command palette

    Jumping and running commands from the keyboard. Opens like a dialog; one highlight glides between results as you type, arrow or hover. Press Ctrl K (⌘ K on Mac) anywhere on this page.

    200 ms open · 120 ms highlight glide

    Reduced motion. The palette fades in and the highlight jumps.

    New invoiceN I
    New customerN C
    InvoicesG I
    Stock levelsG S
    Team settingsG T

    Install

    1. Copy the files.Put motion-clean.css and motion-clean.js in your project (or the .min copies for production). Add fonts/ too if you do not load Geist yet.
    2. Link the CSS and start the module.
      <link rel="stylesheet" href="motion-clean.css">
      <script type="module">
        import { init } from "./motion-clean.js";
        init();
      </script>
    3. Paste an interaction.Open its Code panel and copy the HTML. CSS-only pieces (button press, checkbox) work without the module. On the Inazda Clean kit your --cl-* tokens win automatically; elsewhere, set --cl-accent on :root to rebrand.
    4. Stop the theme flash.Put this in <head>, before any stylesheet:
      <script>try{var t=localStorage.getItem("mc-theme");if(t)document.documentElement.dataset.theme=t}catch(e){}</script>

    API

    ExportWhat it does
    init(scope?)Binds every [data-mc] in scope. Safe to call again after you add markup.
    get(el, name?)The controller for an element, e.g. get(el, "toasts").add({...}).
    replay(el)Plays an element's interaction once.
    toast(opts)Adds a toast: { title, body, tone, duration }.
    flip(box, mutate)Measures children, runs your DOM change, animates the difference.
    announce(text)Says something through the shared polite live region.
    setTheme(t)Crossfades to "light" or "dark" and remembers it.
    reduced()True under reduced motion or html[data-motion="reduce"].
    pulse(el)Plays a button press once.

    Events

    All bubble. mc:change (switch, segmented, tabs, roll, list, sortable, accordion, status), mc:submit (loading button: call e.detail.waitUntil(promise)), mc:select (menu, palette), mc:open / mc:close (dialog), mc:navigate (page), mc:theme (document).

    Browser support

    FeatureChrome, EdgeSafariFirefox
    Everything111+16.4+113+
    Spring linear()113+17.2+112+
    View Transitions111+18+144+

    Without linear(), springs use the ease-out curve. Without View Transitions, page changes use a Web Animations crossfade and the theme switch fades colours for one beat. Nothing breaks; it only gets plainer.

    Licence

    Use the pack in unlimited personal and client projects, commercial ones included. Do not resell or share the pack itself as a kit. Geist and Geist Mono come with it as free extras under the SIL Open Font License 1.1 (fonts/OFL-Geist.txt); they are not sold.