cta.risograph-tear-off · Tear-off flyer

A cta pattern from Risograph Print, drawn alone below with this design's tokens and sample copy. Used in this design on: home page, section 6. Give the section root data-pattern="cta.risograph-tear-off". A guide only: DESIGN.md and tokens.json are the source of truth.

Rule
A flyer on surfaceAlt: uppercase headline in 1–9, line and button in 10–12, a dashed cut line, then a row of tear-off tabs with the contact detail repeated.
Slots
headline, body, cta, items[6..8]
Grid areas
headline 1-9 · action 10-12 (12-column grid, 1-based inclusive spans)
Notes
The tabs are narrow boxes with a left rule; on desktop rotate their text 90° like a real tear-off flyer, flat at phone width (scroll-x).
Tokens
bg #FDF9F4 · text #241E16 · heading #150E06 · accent #FF48B0 · accent2 #00B790 · Bricolage Grotesque / Work Sans · radius 0px · space unit 8px (full list in design/tokens.json)
Section
background surfaceAlt

Pattern notes

  • On surfaceAlt. Uppercase headline (step 7) in 1–9, bottom-aligned with a short line at body size and a primary button in 10–12. A 2 px dashed cut line (style the divider `border-top-style: dashed`). Then six to eight tear-off tabs in a row, each a narrow box with a left rule holding the same mono contact detail rotated 90° on desktop. Tabs scroll horizontally, unrotated, on phones.

Have a hard thing to explain?

Each engagement starts with a two-week audit: interviews with customers, sales and the people who build the product. The brief writes itself after that.

Start a project

Discovery sprint

Positioning workshop

Identity design

Website

Launch support

Retainer

Layout tree (as in design/layout.json)
{
  "pattern": "cta.risograph-tear-off",
  "kind": "cta",
  "grid": {
    "headline": "1-9",
    "action": "10-12"
  },
  "slots": [
    "headline",
    "body",
    "cta",
    "items[6..8]"
  ],
  "notes": "The tabs are narrow boxes with a left rule; on desktop rotate their text 90° like a real tear-off flyer, flat at phone width (scroll-x).",
  "bg": "surfaceAlt",
  "tree": {
    "el": "box",
    "gap": 4,
    "children": [
      {
        "el": "grid",
        "gap": 3,
        "align": "end",
        "children": [
          {
            "el": "text",
            "span": "1-9",
            "slot": "headline",
            "role": "display",
            "step": 7,
            "transform": "uppercase",
            "leading": "tight",
            "maxCh": 16
          },
          {
            "el": "box",
            "span": "10-12",
            "gap": 2,
            "children": [
              {
                "el": "text",
                "slot": "body",
                "role": "body",
                "maxCh": 36
              },
              {
                "el": "button",
                "slot": "cta",
                "variant": "primary",
                "arrow": true
              }
            ]
          }
        ]
      },
      {
        "el": "divider",
        "weight": 2
      },
      {
        "el": "repeat",
        "mobile": "scroll-x",
        "slot": "items",
        "min": 6,
        "max": 8,
        "layout": "row",
        "gap": 0,
        "of": {
          "el": "box",
          "pad": [
            3,
            2
          ],
          "border": "left",
          "children": [
            {
              "el": "text",
              "slot": "title",
              "role": "label",
              "font": "mono"
            }
          ]
        }
      }
    ]
  }
}
Component example: reference/cta.risograph-tear-off.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>cta.risograph-tear-off — Risograph Print</title>
<link rel="stylesheet" href="base.css">
<style>
  section { background: var(--surface-alt); padding: var(--section) 0; }
  .head { align-items: end; row-gap: 24px; }
  .head h2 { grid-column: 1 / 10; font-size: var(--step-5); max-width: 16ch; }
  .head .action { grid-column: 10 / 13; display: grid; gap: 16px; }
  .cut { border-top: 2px dashed var(--heading); margin: calc(var(--unit) * 4) 0 0; }
  .tabs { display: flex; overflow-x: auto; }
  .tab { flex: 1 0 64px; border-left: var(--rule); padding: 24px 16px; min-height: 180px; display: grid; place-items: center; }
  .tab:last-child { border-right: var(--rule); }
  .tab span { writing-mode: vertical-rl; rotate: 180deg; white-space: nowrap; }
  @media (max-width: 640px) { .tab { min-height: 0; flex-basis: auto; } .tab span { writing-mode: horizontal-tb; rotate: 0deg; } }
</style>
</head>
<body>
<section>
  <div class="wrap">
    <div class="head grid">
      <h2 class="misreg">Start a zine with us</h2>
      <div class="action"><p class="small">Tuesday evenings, £5, all materials included. Bring words or pictures.</p><a class="btn btn-primary" href="#join">Book a place →</a></div>
    </div>
    <div class="cut" aria-hidden="true"></div>
    <div class="tabs">
      <div class="tab"><span class="mono">hello@basement.press</span></div><div class="tab"><span class="mono">hello@basement.press</span></div>
      <div class="tab"><span class="mono">hello@basement.press</span></div><div class="tab"><span class="mono">hello@basement.press</span></div>
      <div class="tab"><span class="mono">hello@basement.press</span></div><div class="tab"><span class="mono">hello@basement.press</span></div>
    </div>
  </div>
</section>
</body>
</html>

Other patterns in this design

Whole design · Spec bundle (JSON) · On the style page