Dot Pattern
BackgroundsA field of dots behind content, faded toward the edges, with an optional slow pulse.
A site footer: brand and blurb, link columns revealed with a stagger, a legal row, and a dot field fading up from the bottom edge. Pure CSS.
Live, from the library itself, at full size: scroll, hover, navigate away and back. The demo is never gated.
Variants · each row writes the attribute the prop writes; the section's own CSS answers
JavaScript of its own
0 B
Uses Reveal and the shared runtime (1.9 kB raw, once per site). With those included: 3.0 kB raw.
CSS 10.5 kB raw including the base tokens. Measured from a production build, and again in CI for every change that can move it.
Browser support
Chrome 120 · Firefox 53 · Safari 15.4; needs mask-image.
The demo above is never gated; the source is. With a key in components.json (see account), the registry serves it like any other item:
npx shadcn@latest add @moonarc-pro/footer-section---
import FooterSection from '@/components/moonarc/pro/FooterSection.astro';
---
<FooterSection
brand={{ label: 'Moonarc', blurb: 'Zero-runtime motion for Astro.' }}
columns={[
{ title: 'Product', links: [{ href: '/components/', label: 'Components' }, { href: '/pro/', label: 'Pro' }] },
{ title: 'Docs', links: [{ href: '/docs/', label: 'Docs' }, { href: '/setup/', label: 'Setup' }] },
]}
legal={[{ href: '/privacy/', label: 'Privacy' }, { href: '/terms/', label: 'Terms' }]}
note="MIT, forever."
/>Without a key the registry answers 401 with an upgrade message. Everything this section composes is free: reveal, dot-pattern.
| Prop | Type | Default | Description |
|---|---|---|---|
brand | { label, blurb?, href? } | none | Brand link and blurb. |
label | string | 'Footer' | Accessible name of the columns' nav. Make it unique per page. |
columns | { title, links: { href, label }[] }[] | none | Link columns. |
legal | { href, label }[] | none | Bottom-row links. |
note | string | none | Bottom-row text (copyright, licence). |
tone | 'surface' | 'muted' | 'ink' | 'brand' | unset (paints nothing) | The ground: the page surface, a muted band, an always-dark ink panel, or a deep brand panel. Each paints --background, --ma-tone-muted (over --muted, with a --border hairline), --ma-tone-ink or --ma-tone-brand (over --primary) with the matching text. With theme.css, a painted tone also re-declares --card, --border, --input and --ring inside the section, so cards and fields follow the ground. Decoration is strongest on brand. |
density | 'compact' | 'cozy' | 'roomy' | 'cozy' | Block padding ×0.8 / ×1 / ×1.25 through --ma-density. |
The section reads the theme contract (shadcn's variable names with the base tokens as fallback), so a pasted theme or one --ma-brand recolours it. Its class names are the override surface and stay stable; a named slot replaces the matching prop with your own markup.
.ma-footer.ma-footer__actions.ma-footer__aside.ma-footer__bottom.ma-footer__brand.ma-footer__columns.ma-footer__dots.ma-footer__inner.ma-footer__title
slot="headline"slot="copy"slot="actions"slot="aside"
Columns fade in without stagger; dots hold still.
ClientRouterInherits Reveal; nothing to rebind.
Replaces: Footers (Tailwind Plus) · Footer (shadcnblocks). See the migration table.
A field of dots behind content, faded toward the edges, with an optional slow pulse.
Entrance on scroll that plays once and stays, staggers its children, scrubs with the scroll position when asked, honours reduced motion, and keeps working after every ClientRouter navigation.
A sticky navigation bar that condenses over the first 120 px of scroll: the row tightens and a hairline appears, bound to the document's scroll timeline.
Also: view transitions · how costs are measured · browser support · accessibility policy · five-minute setup · MCP for agents · this page as Markdown