New in Pro11 GPU effects: smoke, ripples, silk, chromeOpen source / MIT · 0.1.0
Motion components for Astro that keep working after every navigation.
Text, scroll, pointer, backgrounds, UI and page transitions: 125 primitives, 83 of them at 0 B, each with its JavaScript cost measured from a real build and printed beside it. What most of them cost: 0 B, nothing, zero
Tune · custom properties on the fluid
WebGL2 · velocity 128², dye 512² · runs only on screen · 12.8 kB raw JS in all · this page 43.1 kB raw JS, router included
WebGL2 · wave equation on 220² · runs only on screen · 10.8 kB raw JS in all · this page 43.1 kB raw JS, router included
The components, running live.
125 primitives, MIT forever. Every tile is the component itself, not a recording, and under each one: the props and the price.
Page Transition
Name a region on two pages and it animates between them with a native view transition.
Five spring presets, switched with one attribute and no JavaScript.
No component hard-codes a curve. Pick a preset and every reveal, tab, dialog and tilt on this page retunes. The switch is a CSS :has() on the root, and consumers set data-ma-preset on <html>.
Switching effects on adds no JavaScript.
The counter reads the bytes this page actually loaded for the library, from the Performance API. Every switch adds an effect and adds nothing to it, because these are CSS with a shared runtime underneath (1.9 kB raw).
library JavaScript on this page
3.7 kB raw
runtime + Reveal + Tilt, read live from the Performance API
- primitives
- 125
- at 0 B
- 83
- own script
- 3233.0 kB raw in all
From a React library, the same effects run in a React island. React and ReactDOM cost 67 kB gzip and Motion for React 41 kB gzip, both measured on /compare/react/. React Bits' Aurora adds OGL, whose whole package is 33 kB gzip on Bundlephobia. The table.
Split on the server, revealed in view.
Ship less, nothing, CSS to the browser.
$ every byte, measured
- once
- stagger
- scrub
- reduced
Six tiles, six switches. Off is a tile with only its name; on adds the effect and not a byte.
Components keep working after every ClientRouter navigation.
Astro bundles a component's script once and never re-runs it after a ClientRouter swap. Every scripted component here binds through one runtime that re-attaches after each navigation, cleans up before it, and never double-binds. This is verified in a real browser on Astro 5, 6 and 7, every release.
this session
1 page views · 0 teardowns · 0 live bindings
Bindings equal the reveal elements on this page; teardowns equal navigations. Nothing accumulates.
This counter is the runtime's own bookkeeping. How it works.
Your GSAP works too
import { gsapPage } from '@moonarc/core/gsap';
gsapPage(gsap, () => {
gsap.from('.hero h1', { y: 24, opacity: 0 });
ScrollTrigger.create({ trigger: '.pinned', pin: true });
}, { scrollTrigger: ScrollTrigger });The adapters run gsap.context() per page view and revert it before the swap, and keep one Lenis for the life of the document.
Ten components running; nine of them load no JavaScript.
UI parts that CSS can now animate.
Accordion, tabs, popover, dialog, carousel, drawer. The browser owns open, close, focus, escape and position, and the motion is @starting-style, allow-discrete, anchor positioning and scroll markers, with the support stated on every card.
Zero JavaScript?
For this one, yes. The browser animates the height.
Keyboard?
Native: Tab, Enter, Space.
One at a time?
details name=, also native.
Accordion
Native <details> items whose height animates open and closed, with an optional one-at-a-time rule the browser enforces.
npx astro add moonarc
pnpm astro add moonarc
npx shadcn@latest add …/r/tabs.json
Raw bytes of JavaScript, from a production build, measured again for every change that can move them.
Popover
A popover that opens beside its trigger, flips when there is no room, closes on outside click or Escape, and animates in and out.
Dialog
A native modal that scales in over a blurred backdrop and scales out again, closes on Escape, the close button or a backdrop click, and traps focus, all handled by the browser.
Carousel
A scroll-snap strip with previous/next buttons and dot markers that the browser generates and keeps in sync.
Drawer
A bottom sheet that slides up over a scrim and can be dragged closed: it follows the finger, and on release springs back or leaves depending on distance and velocity, interruptible mid-flight.
Whole sections, composed from the same parts.
108 sections built from the free primitives, with the timings that read well and the cost of each printed. The demos are never gated; the source and the install command are.
Field Hero
ProA hero with a field of glyphs behind a panel in the brand colour (ink on a page without a theme) whose meta line, headline and actions wipe in one after another.
A hero for developer tools: split headline on the left, a terminal window on the right that types the install command and prints its output line by line, on a pulsing dot field.
Lays out features as a bento grid: one slab split by 1 px hairlines, with the page ground showing through the gaps.
Free
$0/yr
MIT, forever
- 125 primitives, no account, no token
- Runtime, GSAP and Lenis adapters
- Public shadcn registry
- MCP server
Pro
$129/yr
One person, billed yearly
- 108 sections and 11 GPU effects, demos never gated
- Every template: Waitlist, Launch, Agentic, Studio, Agency, Atelier, Gather, Creator, Endpoint, Homescreen, Estate, Practice, and Stay
- audit_motion and measure_budget, locally and in CI
- compose_section with a total cost
- New components monthly, dated changelog
- Email support within 2 working days
Team
$349/yr
Up to 10 people, one invoice
- Everything in Pro, for the whole team
- One key for the team, locally and in CI
- Move up from Pro at any time
- More than 10 people: email us
Shows pricing plans side by side, with an annual/monthly toggle that rolls every price digit by digit to the other period with zero JavaScript (radios, :has and NumberFlow), the highlighted plan wearing a travelling border beam, cards revealed with a stagger.
Stats Row
ProShows big numbers that count up when scrolled into view, 120 ms apart, with labels and an optional bar under each, in a hairline row.
Questions people actually ask
Short answers. The long ones are in the docs.
Is it really zero JS?
For 83 of 125, yes, measured from a build.
Does it survive View Transitions?
Yes, verified on Astro 5, 6 and 7.
Do I need Tailwind?
No.
FAQ
ProA heading and lead beside a native accordion: one question open at a time, heights animated by the browser, keyboard and screen reader handled by <details>.
A vertical timeline: the line draws itself down the page in step with the scroll, each step revealing from the line's side as it is reached, markers numbered or dated.
Endpoint, Homescreen, Estate, Practice and Stay, templates for developer products, mobile apps, estate agents, practices and places to stay, and thirty sections
Endpoint, a template for a product with an HTTP API: a console on the home page that sends a request and streams the response back with its status, its time and its region, an API reference written at build from your OpenAPI document, a quickstart and four guides, usage pricing with a slider, a status page, the regions on a map, a changelog with a feed, search and a contact page for sales.
This site in Plus Jakarta Sans and JetBrains Mono
The terms, privacy and refunds, checked against Indonesian law
Core and the MCP server on npm
Creator, a template for one person's work, and seven sections
Blog Grid
ProShows blog posts as cards, with the first post featured across two columns.
Coming from React Bits, Aceternity, Magic UI?
Each primitive names what it replaces. Click a library to see exactly which of your components map to one here, and what the byte delta is.
- Accordion
- Animated Beam
- Aurora Background
- Avatar Stack
- Border Beam
- Card Stack
- +38 more
- Animated Beam
- Animated List
- Arrow Button
- Avatar Stack
- Border Beam
- Browser Frame
- +37 more
- Animated List
- Aurora Background
- Border Beam
- Bubble Text
- Card Stack
- Carousel
- +36 more
- Accordion
- Animated Select
- Avatar Stack
- Carousel
- Check Draw
- Code Tabs
- +22 more
- Animated List
- Filter Grid
- Lightbox
- Motif
- Page Transition
- Pill Nav
- +6 more
- Card Stack
- Fill Text
- Horizontal Scroll
- Magnetic
- Parallax
- Scroll Scrub
- +2 more
Tools for your build, your agent and your CI.
- GSAP adaptergsap.context() per page view, reverted before the swap; ScrollTrigger refreshed after paint and fonts.
- Lenis adapterOne Lenis for the life of the document, resynced after every navigation.
- MCP serversearch_motion, get_component, get_install_command. Filter by JavaScript cost, for example max_js_bytes: 0.
- shadcn registryEvery primitive at /r/<name>.json; Pro sections behind a key on the same URL shape.
- Measured in CIA fixture build per component, inline scripts counted, ceilings enforced on every change that can move them.
- llms.txtThe whole catalogue as Markdown, for agents that read before they install.
The latest changelog entry.
2026-10-09 · 0.1.2 (unreleased): Endpoint, Homescreen, Estate, Practice and Stay, templates for developer products, mobile apps, estate agents, practices and places to stay, and thirty sections
125 primitives, 83 of them at zero bytes.
Endpoint, a template for a product with an HTTP API: a console on the home page that sends a request and streams the response back with its status, its time and its region, an API reference written at build from your OpenAPI document, a quickstart and four guides, usage pricing with a slider, a status page, the regions on a map, a changelog with a feed, search and a contact page for sales. Six kinds of product from one source (an email API, serverless Postgres, a search API, feature flags, a media API and a log API), six palettes, three of them dark, and three type pairings, each one line of config.
JavaScript on this page: 43.1 kB raw, 19.7 kB gzip, Astro's router included.