Skip to content
On this page

Text Formatting


Bold Text

To make text bold, use ** or __ around the word or phrase:
Example: This text is bold or This text is bold

Italic Text

To italicize text, use * or _ around the word or phrase:
Example: This text is italic or This text is italic

Underline Text

To underline text, use HTML <u> tags:

Example:

<u>This text is underlined</u>

Result:

This text is underlined

Strikethrough

To strike through text, use ~~ around the word or phrase:
Example: This text is struck through

Button


jsx
// This button has creative-fill hover animation

<Button
  hoverEffect="creative-fill"
  label="Creative Fill"
  url="/"
/>

// This button has magnetic hover animation

<Button hoverEffect="magnetic" label="Magnetic" url="/" />

// This button has text-flip hover animation

<Button hoverEffect="text-flip" label="Text Flip" url="/" />

// This button combines the magnetic and text-flip hover animations

<Button
  hoverEffect="magnetic-text-flip"
  label="Magnetic With Text Flip"
  url="/"
/>
<Button
  variant="circle"
  hoverEffect="magnetic-text-flip"
  label="Magnetic With Text Flip"
  url="/"
/>

This button has creative-fill hover animation

Creative Fill

This button has magnetic hover animation

Magnetic

This button has text-flip hover animation

Text Flip

This button combines the magnetic and text-flip hover animations

Magnetic With Text Flip

Button Variants

Pick a look with variant: fill (the default), outline, fill-white, text, or circle.

jsx
<Button variant="circle" label="Example Button" url="/" />
<Button label="Example Button" url="/" />
<Button variant="outline" label="Example Button" url="/" />
<Button
  variant="outline"
  label="With External Link"
  url="https://astro.build"
/>
<Button variant="text" label="Example Button" url="/" />
Example Button Example Button Example Button

Accordion


jsx
<Accordion label="Example Accordion Label 01" group="accordion-01" expanded="true">

Every project starts with a short call and a written brief. Pick the scope that fits the work.

- **Identity**: Logo, type, and colour, with a short guide for the people who use them.
- **Packaging**: Labels, boxes, and tape for small runs, with print files checked against your printer's specs.
- **Art direction**: A shot list, set styling, and a day on set with the photographer.

</Accordion>

<Accordion label="Example Accordion Label 02" group="accordion-01" expanded="false">

Every project starts with a short call and a written brief. Pick the scope that fits the work.

- **Identity**: Logo, type, and colour, with a short guide for the people who use them.
- **Packaging**: Labels, boxes, and tape for small runs, with print files checked against your printer's specs.
- **Art direction**: A shot list, set styling, and a day on set with the photographer.

</Accordion>

---

<Accordion label="Example Accordion Label 03" group="accordion-01" expanded="false">

Every project starts with a short call and a written brief. Pick the scope that fits the work.

- **Identity**: Logo, type, and colour, with a short guide for the people who use them.
- **Packaging**: Labels, boxes, and tape for small runs, with print files checked against your printer's specs.
- **Art direction**: A shot list, set styling, and a day on set with the photographer.

</Accordion>

Every project starts with a short call and a written brief. Pick the scope that fits the work.

  • Identity: Logo, type, and colour, with a short guide for the people who use them.
  • Packaging: Labels, boxes, and tape for small runs, with print files checked against your printer’s specs.
  • Art direction: A shot list, set styling, and a day on set with the photographer.

Tab


jsx
<Tabs>
  <Tab name="Overview">
    **What do I work on?** Identities, packaging, print, and art direction for
    small makers. Pick a tab to see how a project runs. - Discovery - Design -
    Hand-off
  </Tab>

  <Tab name="Discovery">
    **Discovery: Start where the work is made** I spend time with the product
    before I draw anything. You get: - A written brief - A reference board - A
    list of every place the brand appears
  </Tab>
</Tabs>

What do I work on?

Identities, packaging, print, and art direction for small makers. Pick a tab to see how a project runs.

  • Discovery
  • Design
  • Hand-off

YouTube Video


jsx
<VideoInline src="rFVpSwgCkCo" provider="youtube" />

Custom Video


jsx
<VideoInline
  src="/videos/test-video.mp4"
  provider="html5"
  poster="/images/home/studio-reel.jpg"
/>

Callout


Use a callout to pull a note, tip, warning, or danger out of the text. type is note (default), tip, warning, or danger. Without a title, the type name is shown.

jsx
<Callout type="note">
  A project card takes its cover from the `image` field in the project frontmatter.
</Callout>

<Callout type="tip" title="Check proofs at real size">
  Print a page at 100% before you sign off. Type that reads well on screen can be too small on a label.
</Callout>

<Callout type="warning">
  Colours print duller on uncoated paper than they look on screen. Ask for a printed proof before the full run.
</Callout>

<Callout type="danger" title="Before the plates are made">
  After this point every change costs a new set of plates. Check names, prices, and barcodes on the final proof.
</Callout>

Note

A project card takes its cover from the image field in the project frontmatter.

Check proofs at real size

Print a page at 100% before you sign off. Type that reads well on screen can be too small on a label.

Warning

Colours print duller on uncoated paper than they look on screen. Ask for a printed proof before the full run.

Before the plates are made

After this point every change costs a new set of plates. Check names, prices, and barcodes on the final proof.

<Notice> still works and renders the same callout: info → note, success → tip, warning → warning, error → danger.

Steps


Wrap headings in <Steps> to number them. Each ## or ### heading starts a step, and everything below it belongs to that step.

jsx
<Steps>

### Install the dependencies

```bash
npm install
```

### Run the site locally

Run `npm run dev` and open the local address it prints. Pages reload as you edit files in `src/content/`.

### Build the site

Run `npm run build`. The finished site is written to `dist/`, ready to upload to any static host.

</Steps>

Install the dependencies

bash
npm install

Run the site locally

Run npm run dev and open the local address it prints. Pages reload as you edit files in src/content/.

Build the site

Run npm run build. The finished site is written to dist/, ready to upload to any static host.

File Tree


Write a nested list inside <FileTree>. A name that ends in / (or has children) is a folder, bold highlights an entry, and text after the name is a comment.

jsx
<FileTree>

- src/
  - config/
    - config.toml site settings
  - content/
    - projects/
      - english/
        - **ceramic-forms.md** one case study
      - french/
- package.json

</FileTree>
  • src/
    • config/
      • config.tomlsite settings
    • content/
      • projects/
        • english/
          • ceramic-forms.mdone case study
        • french/
  • package.json

Keyboard Keys


jsx
Press <Kbd>⌘</Kbd> <Kbd>K</Kbd> to open search, or <Kbd keys={["Ctrl", "K"]} /> on Windows and Linux.

Press ⌘ K to open search, or CtrlK on Windows and Linux.

Blockquote


To create a blockquote, start the line with a >:
Example:

I keep a notebook of every glaze, paper, and proof from a project.
The answer to the next brief is often already in it.

Hugo Merrin

Code


To format inline code, use backticks (`):
Example: This is inline code

For multi-line code blocks, use triple backticks (```):
Example:

astro
---
import type { z } from "astro/zod";
import config from ".astro/config.generated.json";
import SectionIntro from "@/components/widgets/SectionIntro.astro";
import SubscriptionForm from "@/components/widgets/SubscriptionForm.astro";
import { getEntryCTM } from "@/lib/contentParser.astro";
import overrideObjects from "@/lib/utils/overrideObjects.ts";
import type { newsletterSectionSchema } from "@/sections.schema";

export type NewsletterSection = z.infer<typeof newsletterSectionSchema>;

type Props = {
  content?: Partial<NewsletterSection>;
};

const defaultContent = (
  await getEntryCTM("sections", "newsletter-section", Astro.currentLocale)
)?.data as NewsletterSection;

const {
  enable = true,
  eyebrow,
  title,
  description,
  note,
} = overrideObjects(
  { ...defaultContent },
  Astro.props.content,
) as NewsletterSection;

// The form posts to `[settings.subscription]` in config.toml
const { subscription } = config.settings;

if (!enable || !subscription?.enable) return;
---

<section class="newsletter-section">
  <div class="frame">
    <div
      class="flex flex-col gap-8 lg:flex-row lg:items-end lg:justify-between">
      <SectionIntro eyebrow={eyebrow} title={title} description={description} />
      <div class="w-full lg:max-w-md" data-reveal="up">
        <SubscriptionForm
          id="newsletter"
          enable={true}
          layout="inline"
          formAction={subscription.formAction}
          mailchimpTagValue={subscription.mailchimpTagValue}
          note={note}
        />
      </div>
    </div>
  </div>
</section>

Add a title to the fence to label the block:

src/content/projects/english/ceramic-forms.md
---
title: "Marrow Kiln"
description: "A label system for a small ceramics studio whose glazes change with every firing."
client: "Marrow Kiln"
year: "2025"
services: ["Brand identity", "Packaging"]
image: "/images/projects/ceramic-forms/cover.jpg"
---

Code Tabs

Wrap fences in <CodeTabs> to show alternatives, such as package managers. The selected tab is remembered across blocks and pages.

jsx
<CodeTabs>

```bash title="npm"
npm install
```

```bash title="pnpm"
pnpm install
```

</CodeTabs>
npm install
npm run build

Horizontal Rule


To create a horizontal rule, use three or more dashes (---), asterisks (***), or underscores (___) on a new line:
Example:


Headings


Create headings by adding # symbols before your text. Add custom classes in brackets [.class-name].
Example:

txt
# Heading 1 [.custom-class .mt-0! .another-class]
## Heading 2 [.custom-class .mt-0! .another-class4]
### Heading 3 [.custom-class .mt-0! .another-class]
#### Heading 4 [.custom-class .mt-0! .another-class]
##### Heading 5 [.custom-class .mt-0! .another-class]
###### Heading 6 [.custom-class .mt-0! .another-class]

Table


Create tables using pipes (|) and dashes (-):

Example:

ClientProjectServices
Marrow KilnLabel systemBranding, packaging
Werrin PaperEnvelope systemPrint

Images


Local Image A ribbed mustard vase holding dried grass, with blush and oat vases and a black marbled bottle behind it

Components

Styled List


md
<ListCheck>

- **One label per colour**: Every new product needed its own label, so it took a week to reach the shelf.
- **A mark that filled in**: The old logo lost its detail on stamps, tape, and swing tags.
- **Files in one inbox**: Print files lived with one person, so every reorder waited for them.

</ListCheck>
  • One label per colour: Every new product needed its own label, so it took a week to reach the shelf.
  • A mark that filled in: The old logo lost its detail on stamps, tape, and swing tags.
  • Files in one inbox: Print files lived with one person, so every reorder waited for them.

Information Block Card


jsx
<CardWrapper>
  <Card
    title="Brand identity"
    description="Logo, type, and colour, with a short guide for the people who use them every day."
    icon="PenTool"
    buttonLabel="Start a project"
    buttonUrl="/contact/"
  />
  <Card
    title="Packaging"
    description="Labels, boxes, and tape for small runs, with print files checked before they go to press."
    icon="Package"
    buttonLabel="Start a project"
    buttonUrl="/contact/"
  />
</CardWrapper>

Brand identity

Logo, type, and colour, with a short guide for the people who use them every day.

Packaging

Labels, boxes, and tape for small runs, with print files checked before they go to press.

Image List With Video


jsx
<ImageList>
  <ImageItem
    imageSrc="/images/projects/ceramic-forms/gallery-1.jpg"
    imageAlt="Ten stacked ring-shaped vessels in mustard, blue, blush, sage, and white glazes in a row on linen."
    videoSrc="rFVpSwgCkCo"
  />
  <ImageItem
    imageSrc="/images/projects/envelope-system/gallery-1.jpg"
    imageAlt="Kraft and vermilion envelopes arranged on the diagonal in a tight grid on black."
    videoSrc="/videos/test-video.mp4"
    videoProvider="html5"
  />
  <ImageItem
    width="1/2"
    imageSrc="/images/projects/colour-fan/gallery-1.jpg"
    imageAlt="Pastel swatch cards fanned into a ring on a white surface, running from yellow through blue to pink."
  />
  <ImageItem
    width="1/2"
    imageSrc="/images/projects/screen-print/gallery-1.jpg"
    imageAlt="A yellow squeegee pushing bright green ink across a screen, seen up close."
  />
</ImageList>
Ten stacked ring-shaped vessels in mustard, blue, blush, sage, and white glazes in a row on linen.
Kraft and vermilion envelopes arranged on the diagonal in a tight grid on black.
Pastel swatch cards fanned into a ring on a white surface, running from yellow through blue to pink.
A yellow squeegee pushing bright green ink across a screen, seen up close.

Testimonial


The following code generates the testimonial shown below.

jsx
<Testimonial
  customerImage="/images/people/client-1.jpg"
  customerName="Joel Ashcombe"
  customerRole="Founder"
  customerCompanyLogo="/images/logos/marrow-kiln.svg"
  customerCompanyName="Marrow Kiln"
>
  Hugo spent a morning in the kiln room before he drew anything. The labels
  read like our glaze notebook, and our stockists noticed straight away.
</Testimonial>
Marrow Kiln
Marrow Kiln

Hugo spent a morning in the kiln room before he drew anything. The labels read like our glaze notebook, and our stockists noticed straight away.

Joel Ashcombe
Joel Ashcombe

Founder

4.9 from 86 reviews

Every project starts with a short call.

Tell me what you are making and when it should launch. You get a reply within a day.

Buy NowTheme Details

Type a word to find a project, a service, or a journal entry.