Skip to content

Components / Sections

Press Kit

What a writer needs on one page: the app's icon, the fact sheet (a description list a reader can copy from), the files to download with their format and size, the colours with their values, a few words from the people who make it, and who to write to. Every part is plain HTML; the downloads are links with the download attribute, and the colours are written out beside their swatches. The parts arrive in turn. Zero JavaScript.

Live demo

Press

Press kit

An imaginary app's press kit. Everything here may be used in writing about it.

Fact sheet

Launched
March 2025
Platforms
iPhone, iPad, Android, Apple Watch
Price
Free for three habits, or $3.99 a month
Made by
Two people in Lisbon
Languages
English, Portuguese, Spanish

Colours

  • Coral#ff6a4d
  • Night#1d1b26
  • Mint#b8f0d8

We wanted the smallest daily habit there is: one tap, and the app gets out of the way.

Ada ParkCo-founder

Press contact

press@example.com

We answer within a working day.

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

tone
density

Measured

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 11.1 kB raw including the base tokens. Measured from a production build, and again in CI for every change that can move it.

Browser support

Baseline · widely available

every browser. Elsewhere: nothing to fall back from.

Install Pro

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:

terminal
npx shadcn@latest add @moonarc-pro/press-kit
src/pages/index.astro
---
import PressKit from '@/components/moonarc/pro/PressKit.astro';
---
<PressKit
  headline="Press kit"
  copy="Everything here may be used in writing about the app."
  icon={{ src: '/press/icon.svg', alt: 'The app icon' }}
  facts={[
    { term: 'Launched', value: 'March 2025' },
    { term: 'Platforms', value: 'iPhone, iPad, Android, Apple Watch' },
    { term: 'Price', value: 'Free, or $3.99 a month' },
  ]}
  downloads={[{ label: 'App icon', href: '/press/icon.svg', meta: 'SVG' }]}
  colors={[{ name: 'Coral', value: '#ff6a4d' }]}
  quote={{ text: 'We wanted the smallest possible daily habit.', name: 'Ada Park', role: 'Founder' }}
  contact={{ email: 'press@example.com', note: 'We answer within a working day.' }}
/>

Without a key the registry answers 401 with an upgrade message. Everything this section composes is free: reveal.

Props

PropTypeDefaultDescription
facts{ term: string; value: string }[]noneThe fact sheet, in order.
contact{ email: string; name?: string; note?: string }noneWho to write to; the address is a mailto link.
downloads{ label: string; href: string; meta?: string }[]noneThe files. meta is the format and size as words ("a 180 kB PNG, 1024 px").
colors{ name: string; value: string }[]noneThe colours, each a swatch with its name and value written out.
quote{ text: string; name: string; role?: string }noneA few words from the people who make it.
icon{ src: string; alt: string }noneThe app's icon, drawn in a rounded square. Slot "icon" wins (an <svg> or an <Image>).
words{ facts?; downloads?; colors?; contact? }Fact sheet, Downloads, Colours, Press contactThe parts' headings, in the page's language.
headlinestringnoneThe heading. Slot "headline" wins.
eyebrowstringnoneA short line above the heading.
copystringnoneA line under the heading: what the material may be used for.
level1 | 2 | 32Heading level of the heading: 1 when the kit opens its own page; the parts' headings are one below.
tone'surface' | 'muted' | 'ink' | 'brand'unset (paints nothing)The section's ground.
density'compact' | 'cozy' | 'roomy''cozy'Block padding ×0.8 / ×1 / ×1.25 through --ma-density.

Theming and overrides

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.

Classes

.ma-press.ma-press__cname.ma-press__colors.ma-press__contact.ma-press__copy.ma-press__eyebrow.ma-press__facts.ma-press__file.ma-press__files.ma-press__grid.ma-press__head.ma-press__headline.ma-press__icon.ma-press__inner.ma-press__meta.ma-press__part.ma-press__qname.ma-press__quote.ma-press__side.ma-press__swatch.ma-press__title

Slots

slot="icon"slot="headline"

Reduced motion

The parts are there at once.

With ClientRouter

CSS and Reveal.

Why it is built this way

Replaces: Press kit pages built as PDFs · Media kit pages in site builders. See the migration table.

Contact · sample page

Write to the team.

Sample channels on the left. The form on the right is real and sends nothing here: fill it in and watch the button.

Email (sample)
hello@studio.example
Phone (sample)
+1 555 0100
Office (sample)
1 Sample Street, Springfield

Demo: nothing is sent.

A contact section in two columns: the ways to reach you (email, phone, office) on one side, a form that really sends on the other.

Chrome 135 · not Firefox · Safari 27click

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

Pro

A 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>.

newly · Chrome 131 · Firefox 143 · Safari 18.4scrollclick

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.

every browserscroll

Also: view transitions · how costs are measured · browser support · accessibility policy · five-minute setup · MCP for agents · this page as Markdown