Get my meeting plan
Design system · Version 2

The Meeting, Dylan's design system

Start from the end. The only thing a client pays for is a held meeting, so everything here is built from a week calendar: time sets the spacing, day columns make the grid, and event blocks are the components.

  • Start from the end.Show the held meeting first, then work backwards to the screen that gets there.
  • The calendar is the system.Day columns are the grid. Blocks, and the states they are in, carry the meaning.
  • The 15-minute slot is the unit.12px, then 24, 36 and 48 for an hour. Nothing is spaced by taste.
  • Red means now.The now line and the one primary action. If it is red, it is happening or it needs you.
Principles

Five rules every screen follows.

They decide what goes on a screen before anything is drawn. When two good ideas disagree, the one that keeps the calendar readable wins.

  1. The calendar is the system.

    A held meeting lives in a calendar, so the calendar is where everything starts. Day columns are the grid, the hour sets the rhythm and event blocks are the components. If a screen cannot be read as a week filling up, it is the wrong screen.

    Example: a work week from Monday to Friday with two held meetings, a blocked offsite on Wednesday, today, a booked meeting on Thursday and a forecast slot on Friday.
  2. Block states carry meaning.

    Hatched is a forecast, solid is booked, a check means held, a strike means nobody came. The state is the message: a client pays only when a block turns solid and holds. Hue only tells one meeting from another.

    Four block states: a hatched forecast, a solid booked block that is not billed yet, a held block with a check that is billed 500 dollars, and a struck-through no-show that is not billed and gets rebooked.
  3. Motion explains a step. It never decorates.

    A block settles when it is booked, a stamp lands when you approve, a check draws when a meeting is held. If nothing happened, nothing moves. With reduced motion every end state is already on screen.

    A toast that says a meeting was booked, and the seven motion words: settle, rise, tick, type, toast, stamp and check.
  4. Honest labels.

    Invented data says Example. Dylan says he is an AI agent in his first sentence. Figures name their source and their date. Nothing on a screen pretends to be more real than it is.

    An example first email from Dylan, AI agent for Harrow Line, whose first sentence says he is an AI agent, and a source line under a figure.
  5. One ask per screen.

    One primary action, in the one red, with the same words everywhere: Get my meeting plan. Everything else is secondary, outlined or a plain link, so nobody has to choose between two red buttons.

Color

Paper, ink, five calm hues and one red.

Two designed themes, Paper by day and Charcoal by night. Surfaces and ink stay quiet so the week can speak; hues tell meetings apart, states say what they cost, and red only ever means now. Click a hex or a token name to copy it.

Surfaces

Paper is the page, the sheet is the calendar on it, off-hours shades what sits outside working hours. Chrome is the window bar and the app sidebar.

  • The page. Bright warm paper by day, warm charcoal by night.

    Ink on it: 16.5:1 and 15.0:1
  • The calendar sheet: week grids, cards, the composer, inputs.

    Ink on it: 17.4:1 and 13.9:1
  • Outside working hours. Secondary surfaces, chip backgrounds, table heads.

    Ink on it: 15.3:1 and 14.5:1
  • The window chrome bar and the app sidebar.

    Ink on it: 16.0:1 and 13.2:1

Ink

Three steps of ink. Text uses the first, supporting copy the second, times, captions and small print the third.

  • Text.

    Lowest on paper, sheet and off-hours: 15.3:1 and 13.9:1
  • Secondary text. 7.4:1 or better on paper.

    Lowest on paper, sheet and off-hours: 6.9:1 and 7.8:1
  • Muted text: time labels, captions, small print. 4.5:1 or better on every surface.

    Lowest on paper, sheet and off-hours: 4.7:1 and 5.4:1

Lines

Hour lines stay quiet so the blocks can speak. Anything a person has to find, like an input or an outlined button, gets the rule color.

  • Hour lines and borders.

    Decorative: 1.3:1 on the sheet, quiet on purpose
  • Half-hour lines, dotted.

    Decorative: dotted half hours and the hero grid
  • Edges that must be seen: input borders, outlined buttons. 3:1 on the sheet.

    Edges: 3.3:1 and 3.1:1 on the sheet

The now red

The only saturated color in the system. It marks the present and the one thing to do next, so it never has to compete with anything.

Red means now.

If something is red, it is happening right now or it needs you right now. Nothing decorative is ever red, which is why a red button needs no arrow and no exclamation mark.

  • The now line
  • Today's date
  • The primary action
  • Focus
  • A field to fix
  • A count waiting for you
  • The now line and primary actions. The only saturated accent.

    As text: 4.5:1 and 5.7:1 at the lowest
  • Text on the accent. 5.2:1 light, 6.2:1 dark.

    On the accent: 5.2:1 and 6.2:1
  • Selection, focus halo, the now label background.

    Ink on it: 14.8:1 and 12.5:1
  • The red as small text on the tint: the Example tag and counts waiting for you. A shade deeper by day to keep 4.5:1.

    On the tint: 5.2:1 and 5.1:1

Event hues

Five calm hues tell meetings apart and stone is the client's own time. Each hue is a pair: a tinted fill with a deep ink by day, a luminous fill with charcoal ink by night.

  • Sage
    Paper
    / · 6.5:1
    Charcoal
    / · 9.2:1
    Meetings, the held check, the Lite tier.
  • Slate
    Paper
    / · 7.2:1
    Charcoal
    / · 8.6:1
    Meetings, the Standard tier.
  • Plum
    Paper
    / · 7.3:1
    Charcoal
    / · 8.3:1
    Meetings, the Enterprise tier.
  • Amber
    Paper
    / · 6.7:1
    Charcoal
    / · 9.9:1
    Meetings, and anything handed to you.
  • Teal
    Paper
    / · 6.6:1
    Charcoal
    / · 9.3:1
    Meetings.
  • Stone
    Paper
    / · 7.1:1
    Charcoal
    / · 7.9:1
    The client's own time, blocked time, no-shows. Line #8A857A / #7B766C

Block states

Live, in the theme you are viewing. The recipe for each state is fixed; only the hue changes between meetings.

  • ForecastNot billed

    A dashed edge and a hatch in the hue line, mixed at mtg-hatch-alpha. The label sits on a small sheet chip so it reads over the hatch.

  • BookedBilled only if held

    The hue fill, the hue ink and a 30% hue edge. In Charcoal the fill drops to 26% and the text takes the luminous hue line.

  • HeldBilled

    The solid hue line with sheet text and a drawn check. In Charcoal, the luminous fill with charcoal ink. The only state that costs money.

  • No-showNot billed

    Stone fill and stone edge at 80% opacity, the time and the name struck through. Dylan rebooks it.

  • Your ownNot Dylan's

    Stone fill and stone ink with a 40% stone edge: the client's own meetings. Dylan books around them.

  • BlockedNever booked

    A dense stone hatch inside a solid stone edge. Busy time, or a company on the do-not-contact list.

Overlays

Three translucent tokens, each with one job. They sit over the page, never over text.

  • The page behind the intake sheet.

    Paperrgba(27, 26, 23, 0.42)Charcoalrgba(0, 0, 0, 0.6)
  • The sticky nav once you scroll, under a 10px blur.

    Paperrgba(251, 249, 245, 0.9)Charcoalrgba(27, 26, 24, 0.9)
  • The very soft warm glow under product windows.

    Paperrgba(204, 52, 23, 0.07)Charcoalrgba(255, 107, 74, 0.06)

Contrast

WCAG 2 ratios, computed from the hex values when this page is built. Text pairs clear 4.5:1 and the edges of controls clear 3:1, in both themes.

PairPaperCharcoalUsed for
mtg-inkon paper, sheet and off-hours15.3:113.9:1All text
mtg-ink-2on paper, sheet and off-hours6.9:17.8:1Leads, supporting copy
mtg-ink-3on paper, sheet and off-hours4.7:15.4:1Times, captions, small print
mtg-now-inkon mtg-now5.2:16.2:1Primary buttons, the now label, pressed chips
mtg-nowon paper, sheet and off-hours4.5:15.7:1A field to fix, the you are here label
mtg-now-texton mtg-now-tint5.2:15.1:1The Example tag, counts waiting for you
Hue inkon its fill, five hues6.5:18.3:1Event blocks, avatars, tier cards
mtg-stone-inkon mtg-stone-fill7.1:17.9:1Your own meetings, no-shows
mtg-ruleon mtg-sheet3.3:13.1:1Input and button edges: 3:1 for parts of a control
Type

A warm display face, a calm text face, tabular numbers.

Bricolage Grotesque sets titles, prices and the wordmark. Hanken Grotesk sets everything you read. Every time, price and count is tabular, so columns line up like a calendar's gutter.

Bricolage Grotesque

Role
Display: titles, row titles, prices, big figures, the wordmark.
In use
600 for titles, 700 at 90% width for numerals, 500 for quotes.
Axes
Optical size 12 to 96 (automatic), width 75 to 100, weight 200 to 800.
Figures
Proportional by default, so the system always turns on tabular figures.
License
SIL Open Font License 1.1

Hanken Grotesk

Role
Text: leads, body, small print, captions, labels, buttons and everything inside the app.
In use
400 to read, 500 for times and captions, 600 for labels and buttons.
Axes
Weight 100 to 900.
Figures
Already one width, so times and counts line up as they are.
License
SIL Open Font License 1.1

The scale

Live samples, in the classes the site uses. Sizes are font size over line height in pixels.

heroOne per page

Your week, booked by an agent.

Bricolage 600 · 88/88Tracking -0.025emUnder 1100: 64/66 · Phones: 44/46
titleSection titles

Three steps. Only the last one costs money.

Bricolage 600 · 48/52Tracking -0.03emPhones: 34/38
h3Row and step titles

Your domain never sends a cold email.

Bricolage 600 · 28/34Tracking -0.02emPhones: 24/30
h4Questions, tiers, card heads

What counts as a held meeting?

Bricolage 600 · 20/26Tracking -0.01em
numeralPrices and big figures

$500

Bricolage 700 · 44/48Tracking -0.025em · width 90%Phones: 36/40
leadUnder titles

Dylan finds the people who buy what you sell.

Hanken 400 · 20/30Tracking 0Phones: 18/27
bodyEverything readable

You pay only for meetings that happen.

Hanken 400 · 17/28Tracking 0
smallSmall print, hints, cells

Figures as published on belkins.io

Hanken 400 · 14/20Tracking 0
captionLabels on cards

Example plan built from your answers

Hanken 500 · 12/16Tracking 0.01em
labelDay headers, field labels

MON TUE WED

Hanken 600 · 12/12Tracking 0.06em · caps
appInside product windows

Oct 19 to 23, 2026

Hanken 400 · 13/18Tracking 0
blockLine one of a block
10:30MayaVP Operations
Hanken 600 · 12/13Tracking 0

Tabular figures, always

Times, prices and counts sit in columns. Bricolage draws a narrow 1, so its proportional figures drag a column out of line; every number set in the display face turns tabular figures on. Below, the same rows in Bricolage, both ways.

Proportional: the columns wobble
  1. 09:00Priya, held$500
  2. 10:00Leo, held$500
  3. 11:40Now1,810
  4. 14:00Tomas, no-show$0
  5. WeekBilled$1,000
Tabular: every time, price and count
  1. 09:00Priya, held$500
  2. 10:00Leo, held$500
  3. 11:40Now1,810
  4. 14:00Tomas, no-show$0
  5. WeekBilled$1,000
  • One hero per page. Titles balance with text-wrap; leads wrap pretty.
  • Width only for numerals. 90% width at weight 700, for prices and big figures.
  • No italics. Emphasis is weight or the accent, never a slant.
  • Caps only as labels. 12px, weight 600, 0.06em tracking: day headers and field labels.
  • Lowercase subjects. Dylan's subject lines are written the way a person types them.
  • Times in 24 hours. 10:30 to 11:00 EDT, with the zone wherever a meeting is booked.
Space and grid

Time is the spacing unit.

One 15-minute slot is 12px, so an hour is 48px. Padding, gaps and section rhythm are all counted in slots, the page is a working week, and a page reads top to bottom as one working day.

The slot ruler

True size. Each tick is one 15-minute slot.

mtg-half-slot6px · Half a slot
mtg-slot12px · 15 minutes
mtg-2slot24px · 30 minutes
mtg-3slot36px · 45 minutes
mtg-hour48px · 1 hour
mtg-2h96px · 2 hours
mtg-sec120px · Section padding
mtg-3h144px · 3 hours

One hour, four slots

On the page an hour is 48px, and a 30-minute block holds one line. Inside the app an hour grows to 80px, so the same block holds two.

The grid is a working week

The content column is 1200px: a 60px time gutter and five day columns of 228px. Pages keep 24px edges on desktop and 16px on phones, and a product shot is never narrower than 560px on desktop.

Two columns1fr, 64, 1fr
Step rows5 to 7, gap 64
Questions4 to 8, gap 64
Section head760 at most
1100+The time gutter shows
< 1024Rows stack
< 768Phones: day views, 16px edges
320Smallest: no sideways scroll

A page is one working day

Sections are hours: 08:00 at the hero, 18:00 at the footer, with the time in the gutter and a now dot that travels as you scroll. Each section pads 120px (ten slots) on desktop and 72px (six) on phones. Off-hours sections alternate with paper to keep the rhythm. This page keeps the same day.

Hero
Demo
How it works
Four reasons
Comparison
Pricing
Built by Belkins
FAQ
Heard from Dylan
Final call
Footer

Radius and depth

Blocks round like every calendar's blocks, cards a little more, windows most. Shadows lift things in slots and stay warm by day, deeper by night.

mtg-block6px · Blocks, inputs, buttons
mtg-card12px · Cards, invites, toasts
mtg-win16px · Product windows
sheet18px · The intake sheet
mtg-pill999px · Chips, today, avatars
mtg-d50% · The right side of the mark
mtg-shadow-cardLifted one slot
mtg-shadow-popOver the week
mtg-shadow-toastToasts and invites
mtg-shadow-winProduct windows
Components

Every example here is the live component.

Built from the same classes as meetdylan.ai and the product shots, shown at rest. Hover, tab and click them. Anything that shows data is the Harrow Line story and says Example.

Event blocks in five hues, sage, slate, plum, amber and teal, each as a forecast, booked and held, then the stone states: a no-show that is not billed, the client's own meeting and blocked time.

Event block Example

The signature component. One shape, six states, five hues: the state says what the meeting costs, the hue only tells meetings apart. The last row shows the stone states: a no-show, the client's own meeting and blocked time.

PlacementBy minutes: --s start and --d duration, against --h0 and the --row hour.
Line oneA 6px dot, the time in tabular figures and the name, 12/13 at 600.
Line twoThe title, 11/12 at 500, under the name. Hidden on forecasts.
Edges6px radius, 3px in from the column, a 1px gap above and below.
Event block, HTML
<div class="ev sage booked" style="--s:630;--d:30">
  <span class="l1"><span class="tm">10:30</span><span class="nm">Maya</span></span>
  <span class="l2">VP Operations</span>
</div>
<!-- states: forecast, booked, held, noshow, own, blocked -->
<!-- hues: sage, slate, plum, amber, teal -->
.ev.forecast.booked.held.noshow.own.blocked.l1.l2.ck
Example: the app window on its calendar screen. Harrow Line's week with two held meetings, a no-show that is not billed, booked meetings, forecast slots, the client's own meetings, the now line on Wednesday at 11:40, a toast for Maya's new meeting and her detail panel.
  1. Chrome bar, 44px. Three muted dots, the URL pill with the screen's path, and the Example tag on the right.
  2. Sidebar, 200px. Today, Plan, Approvals and Inbox with counts, Calendar, Billing, the client at the foot. A 64px rail under 1200px.
  3. Toolbar, 48px. The week range, Today, the time zone, then the week summary in block states.
  4. The week, 80px an hour. Today's column is tinted, the now line crosses it in red, blocks sit by minutes.
  5. Detail panel, 268px. When, who, the company, why now, what they expect, billed when held. Hidden under 900px.
  6. Toast. What just happened and when, top right of the window. On phones the window becomes a day view.

The app window

Every product shot is this one window, so the site reads as one product: the white sheet with a 1px line, 16px corners, the 44px chrome bar and a layered warm shadow, with the soft glow underneath.

.win-wrap.win.chrome.app.side.tbar.cal.nowline.panel.dayv

Controls

Buttons, fields and chips. The red appears once per screen; everything else is outlined, quiet and 48px tall where a thumb has to find it.

Primary, secondary, ghost
Small 36, large 52, disabled

Buttons

Primary is the one ask, in the now red, and reads the same everywhere. Secondary carries a rule-color edge, ghost turns red only on hover. Hover darkens, a press drops one pixel, focus draws a 2px ring.

.btn.primary.btn.secondary.btn.ghost.btn.sm.btn.lg

Free preview in 30 seconds · No card · Nothing is sent without your approval

That does not look like an email address. Could you check it?

Inputs and the site form

48px tall, 6px corners, a rule-color edge. Focus turns the edge red with a 3px tint halo. Errors say what to do next, in a full sentence. The site form is one field and the one ask: the smallest possible start.

.site-form.field.input.textarea.hint.err.micro
Choice chips, picked like open time slots
Chapter chips
In the app: chips, states and the Example tag
OperationsFinanceForecastBookedHeldNo-showExample

Chips

A choice chip carries a small dashed square, an open slot, that fills in when chosen. Chapter chips number the steps of the film and hold their timecode; the current one wears the red. Inside the app, states use the block legend and anything invented carries the Example tag.

.chips.chip.chapters.chip-s.state.sw.ex

Product pieces

The parts that tell the story of a meeting: it lands, you approve, it is billed. Shown as they rest at the end of their motion.

Toast

Something happened somewhere else. A bold line says what, a muted line says when and who. Top right of a window, 12px corners, the toast shadow; it slides 16px in and leaves on its own.

.toast

Stamp: Approved by you

The mark of a decision only a person makes: a plan, the first email of an angle, new spend. Sage edge and ink, caps, a 4 degree tilt and a soft shadow. Nothing goes out until it lands.

.stampx.approve-wrap.mini-btn

Ledger row Example

Every line is a meeting, never effort. A held line carries its block's hue and the price; a no-show is struck from the bill and rebooked. The total sits under a 2px rule in the display face.

.ledger.sw.held.amt.when.tot

Approval card Example

What is approved wears the stamp; what waits for you gets the only red button. Protections are locked switches Dylan keeps on his own. Every launch has an ink toast with a ring that drains over 60 real seconds.

.rowlist.stampx.lockrow.switch.on.undo.ring

Intake sheet, the step header

Four steps, one at a time: Website, Buyers, Your plan, Hold your place. The current step wears the red, finished steps turn to ink with a check, and only the current label shows on phones. Back sits left, close right; Esc closes and the answers are kept. The plan is built before the email is asked for.

.sh-head.sh-stepsli.curli.done.sh-back.sh-x.plan-label

Invitation card

What the meeting owner reads before every call: who, why now, what they expect and who booked it. An off-hours head with the hue dot and the time, then rows that line up on an 84px label column.

.invite.iv-h.iv-t.iv-r

First email and thread Example

Lowercase subject, the AI disclosure first and highlighted in review. Dylan answers routine replies and hands pricing, legal and complaints to you with an amber chip. His avatar is the mark on red; people are initials.

.mail.mail-h.mail-b mark.thread.msg.handchip.typing

People and companies

People are initials in soft hue circles: no photos, no faces. Companies are monogram squares, never a real logo. Dylan is the only avatar with a mark, on the red.

.av.av.dylan.mono

Plan tiles and the credit meter Example

Counts sit in tiles at 24px, tabular, at 90% width. Credit is three slots: used ones are solid with a check, the one left is hatched like a forecast.

.tiles.tile.meter.slot.used.slot.left
Motion

Motion explains a step. It never decorates.

Seven motions, one vocabulary, each one a beat in the story of a meeting. Only transform and opacity animate, loops pause off screen, and with reduced motion every end state is already there.

settle

A block drops one slot, 12px, into place with a small overshoot, 70ms after the one before it. It says: this is on your calendar now.

520msstagger 70mscubic-bezier(.2, 1.2, .35, 1)

rise

Content enters 16px lower at zero opacity and rises into place, row by row. It says: this panel just filled in for you.

420msstagger 70mscubic-bezier(.2, .8, .2, 1)

tick

Numbers count up and ease out, in tabular figures so nothing jitters while they run. It says: this was counted, not typed in.

900msease out, cubictabular figures

type

Dylan types after 600 to 900ms of typing dots, with small seeded variation and a beat after punctuation, so it reads the same way every time.

38 chars per seconddots 600 to 900msseeded

toast

Slides 16px and fades in, holds long enough to read, then fades out. It says: something happened somewhere else, and here is what.

280ms in220ms outcubic-bezier(.2, .8, .2, 1)

stamp

The approval mark lands from 1.15 to full size with a short press and a soft shadow. It says: you decided, and nothing went out before you did.

140msscale 1.15 to 1cubic-bezier(.2, .8, .2, 1)

check

A held block draws its check with stroke-dashoffset, and the credit meter follows. It says: the meeting happened, so now it is billed.

360msstroke-dashoffsetcubic-bezier(.2, .8, .2, 1)

creep, the one loop

The now line moves one minute per second while it is on screen, stops after forty minutes, and pauses the moment you scroll away.

1s a minute40 minutes, then restpauses off screen

Your device asks for reduced motion, so every demo shows its end state and the replay buttons rest.

Easing

Three curves. The spring overshoots a little, like a block dropped into its slot; everything else starts fast and lands softly.

mtg-springcubic-bezier(.2, 1.2, .35, 1)Settle: the small overshoot of a block landing.
mtg-ease-outcubic-bezier(.2, .8, .2, 1)Rise, toast, stamp, check and tick.
mtg-easecubic-bezier(.2, 0, 0, 1)Hover and focus, at mtg-tick (120ms).

The rules

  • Transform and opacity only. And stroke-dashoffset for a check. Never width, height, position or color, so it holds 60 frames a second.
  • Entrances run once. When the thing scrolls into view, never again on the way back up, and never in front of something you are reading.
  • Loops pause off screen. And stop on their own: the now line rests after forty minutes, the undo ring when its minute is up.
  • Reduced motion shows the end state. Nothing moves and nothing waits: the stamp has landed, the check is drawn, the numbers are counted.
  • Complete at rest. Things are hidden before their entrance only once JavaScript has run and motion is allowed, so the page reads fine without either.
  • Timed by tokens. Every duration and curve above is a token; nothing is timed by eye.
Voice and writing

Plain words, real numbers, and he says he is an AI.

Dylan's voice is plain, confident and specific: short sentences, American spelling, no hype. Dylan is he, and he writes in the first person. When a sentence sells instead of describes, cut it.

Plain and specific.

Say what happens and what it costs, in the words a sales lead uses on a Tuesday.

DoDylan books sales meetings into your calendar. You pay $500 for each one that happens.
Don'tSupercharge your pipeline with seamless, AI-powered outreach.

Numbers over adjectives.

A range you can check beats a promise you cannot. Forecasts are ranges and say so.

Do6 to 13 held meetings per pass. A forecast, not a promise.
Don'tTons of qualified meetings, fast, guaranteed.

Label what is invented.

Every invented company, person and number says Example. Real figures name their source and their month.

DoHarrow Line Example
Figures as published on belkins.io, September 2026.
Don'tTrusted by 500 revenue teams.

Dylan says he is an AI, first.

In the first sentence of every first email, on the page and in replies. Never a fake name, never a fake person.

DoHi Maya, I'm Dylan, an AI agent working with Harrow Line.
Don'tHi Maya, Sam here from the team. Quick question about your fleet.

No em or en dashes. Ever.

Ranges use "to". A break in a sentence is a comma, a colon or a period. Hyphens inside words are fine.

DoOct 19 to 23. He writes, you approve.
Don'tOct 1923. He writesyou approve.

One ask per screen.

The same four words everywhere, in the one red button. Everything else is a link or an outline.

Do
Don't

Write times like a calendar.

24-hour times, the day and the date, the zone wherever a meeting is booked. Subject lines are lowercase, the way a person types them.

DoBooked: Thursday, Oct 22, 10:30 Eastern. Subject: fuel across your ohio sites
Don'tNext Thursday at 10.30am-ish? Subject: Quick Question About Your Fleet!!

Words we use

  • held
  • booked
  • no-show
  • forecast
  • brief
  • plan
  • approve
  • pause
  • per held meeting
  • Example

Words we cut

  • revolutionary
  • supercharge
  • unleash
  • game-changer
  • seamless
  • cutting-edge
  • leverage
  • 10x
  • AI-powered
  • the future of
  • fully autonomous
The mark

A 30-minute block that turned into a D.

The straight left edge is where a block meets the time gutter; the fully rounded right side turns the block into a D. Inside, a check: the meeting held. The check is cut out, not drawn on, so the mark works on any surface.

421321r 9r 32.4
Grid
24 units. The block spans 4 to 21 across and 3 to 21 down.
Corners
Left corners round by 3; the right side by 9, half the height, which makes the D.
Check
(8.5, 12.4) to (11.2, 15.1) to (16.1, 9.8), stroke 2.4, round caps and join, cut out.
Color
The now red: #CC3417 on Paper, #FF6B4A on Charcoal. Ink or white when only one color is possible.

Clear space

Keep a quarter of the mark's height clear on every side. At 48px that is 12px: one slot. In the lockup, the name sits a little over a quarter away.

Sizes

  • 16
  • 20
  • 24
  • 32
  • 48
  • 72

Smallest with the check: 16px, as in the eyebrow chip. Smaller than that, use the plain block, mk-plain. The lockup sets the mark beside the word Dylan in Bricolage 600 at the same size.

On light and dark

Introduce Dylan with the lockup. The mark alone is for places that already say Dylan: the app, his avatar, toasts and the browser tab.

Paper
Charcoal
One color, ink
On the accent

Don't

The mark is a block in the calendar, so it follows the block's rules: it never stretches, tilts or changes hue.

  • Don't stretch or squash it.

  • Don't tilt it. Only the stamp tilts.

  • Don't recolor it with an event hue.

  • Don't add shadows, outlines or glows.

  • Don't set the name in another typeface.

  • Don't crowd its clear space.

Downloads

Take the system with you.

The same files this page is built from. Use them for a deck, a partner page, a mockup or your own code, and keep the rules above: one red, honest labels, time as the unit.

tokens.json

Every token with its light and dark value and what it is for: 32 colors, 12 type styles, 12 spacing steps, radii, shadows and 15 motion tokens.

Version 2 · synced 2026-10-05 · 19 KB

the-meeting.css

The tokens as CSS custom properties, prefixed mtg. Paper by default, Charcoal with the visitor's system or data-theme, phone sizes for type and edges, and zero durations under reduced motion.

Generated from tokens.json · 8 KB

The mark

One path with the check cut out, so it survives any design tool. Red for Paper, coral for Charcoal, and ink or white for one-color work.

Four SVG files · under 1 KB each

How to use it

Four steps from a blank page to the system.

  1. Load the two fonts. Both are free under the SIL Open Font License, from Google Fonts: Bricolage Grotesque and Hanken Grotesk.
  2. Link the-meeting.css, or copy the variables you need into your own stylesheet.
  3. Build with the tokens, never with raw values. Spacing comes in slots: 12, 24, 36, 48.
  4. Leave the theme to the visitor, or set data-theme on the html element to pin one.

On meetdylan.ai the same values go by short names in the site's own base stylesheet, like --now, --paper and --slot. The downloads use the full token names, prefixed mtg, so they never collide with yours.

HTML: fonts and tokens
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wdth,wght@12..96,75..100,200..800&family=Hanken+Grotesk:wght@100..900&display=swap">
<link rel="stylesheet" href="https://meetdylan.ai/design/the-meeting.css">
CSS: a card with one ask
.card {
  background: var(--mtg-sheet);
  color: var(--mtg-ink);
  border: 1px solid var(--mtg-line);
  border-radius: var(--mtg-card);
  padding: var(--mtg-2slot); /* 24px: half an hour */
  box-shadow: var(--mtg-shadow-card);
  font: var(--mtg-type-body);
}
.card h3 {
  font: var(--mtg-type-h4);
  letter-spacing: var(--mtg-type-h4-tracking);
}
/* the one red button */
.card .ask {
  background: var(--mtg-now);
  color: var(--mtg-now-ink);
  border-radius: var(--mtg-block);
  transition: background-color var(--mtg-tick) var(--mtg-ease);
}
HTML: themes
<!-- no attribute: follows the visitor's system -->
<html>
<!-- always Charcoal -->
<html data-theme="dark">
<!-- always Paper -->
<html data-theme="light">
tokens.json: one token
{
  "name": "mtg-now",
  "value": { "light": "#CC3417", "dark": "#FF6B4A" },
  "usage": "The now line and primary actions. The only saturated accent."
}