STYLE.md ·
How Tableau works. Every rule, written down.
The menu board: a black split-flap board that clatters through today's menu, cream price tickets, tall signage capitals and one brass accent.
Straight · warm · on the board
Best for
- US adult-use dispensaries (state-legal, 21+), with the compliance pieces built in: the age check, licence line, required warnings, lab results and no health claims (see "Cannabis retail in the US")
- Anything with a changing list people read from across a room: taphouses and breweries (Copperline), cinemas (Rialto), coffee bars, bakeries with a daily list, food halls, departure-board brands
- Audiences: adults choosing from a list, often on a phone in a car park, who want the price, the size and what's in it
Less suited to: quiet luxury (Atelier), clinical or medical services (Remedy, Vigil, Candour), anything without a list.
Personality and voice
Straight and warm, like a good budtender or barkeep: what's on, what it costs, what's in it. Never pushy, never clever about intoxication.
- Headlines: "Today's menu, on the board." · "Price tickets, lab results attached." · "New to edibles? Start low." · "Twelve taps. One board."
- Buttons: "See the menu" · "Order for pickup" · "Add" · "Lab results (COA)"
- Microcopy: "Prices before tax · while stocks last." · "Bring your ID: we check it at the door." · "Pay in store."
- Words to avoid on a cannabis site: health or effect claims ("relaxing", "sleep", "pain", "anxiety", "calming", "energising"), "medicine" or "medical" on an adult-use site, "organic" or "craft" unless certified and allowed, "free", "BOGO", "giveaway", "candy", cartoon or kid-friendly language, and anything that glamorises getting high.
Colour
| Token | Day board (light) | Night board (dark) | Role |
|---|---|---|---|
--paper |
#f3eee3 |
#12110e |
Cream card stock; a dark room at night |
--card |
#fbf8f1 |
#1b1915 |
Tickets, forms, the tray |
--well |
#e9e2d3 |
#16140f |
Alternate sections |
--line |
#d6ccb8 |
#332e26 |
Hairlines, dashed ticket perforations |
--ink / --ink-2 |
#1b1915 / #3b372f |
#f3eee3 / #d5cdbd |
Text, the heavy 2px frames |
--muted |
#655d50 |
#a39a8a |
Labels, notes |
--brass |
#855610 |
#e3ad54 |
The one accent: buttons, links, the lit phrase |
--alert |
#a8321d |
#ff8f7a |
The WARNING label |
--board / --flap / --flap-2 |
#15130f / #322d26 / #29251f |
same | The board, each flap's upper and lower half |
--flap-ink / --flap-lit / --flap-muted |
#f3ead8 / #f0b23e / #a89f8e |
same | Letters, prices and the live tab, small print on the board |
Measured contrast (WCAG): ink on paper 15.2:1 · muted on paper 5.6:1 (on well 5.0:1) · brass on paper 5.4:1, on card 5.9:1 · white on brass 6.3:1 · alert 5.8:1. Night board: ink 16.3:1 · muted 6.8:1 (on card 6.3:1) · brass 9.3:1 · text on brass 8.7:1. On the board: letters 11.4:1, prices 7.2:1, small print 7.1:1.
No neon, no bright greens, no candy colours. Several states treat bright neon and cartoonish colour as appealing to minors; the board's cream and amber read as signage, not sweets.
Typography
- Display: Big Shoulders Display 700–800, uppercase: tall signage capitals built for boards and stations.
- Body: Manrope 400–700: clear and friendly at reading size.
- Board: Spline Sans Mono 500–600: every flap, price, potency and code.
| Token | Size | Use |
|---|---|---|
--fs-h1 |
clamp(52px, 7.6vw, 120px), weight 800, line 0.88 | Page headline |
--fs-h2 |
clamp(38px, 4.8vw, 68px), weight 800 | Section headline |
--fs-h3 |
24px, weight 700 | Tickets, facts |
--fs-lead |
clamp(18px, 1.35vw, 21px) | Intro paragraphs |
--fs-body |
17px | Body |
--fs-label |
12px mono caps | Eyebrows (with a board-tile mark) |
The signature move: a tall capitals headline whose last phrase is lit in brass, beside a board that never sits still for long.
Layout
- 1220px wrap, gutter
max(20px, 4vw). A black notice bar on top (21+, ID, pickup only), a sticky header with a heavy ink rule. - Hero: copy left, the board right. Then tickets beside the tray, the potency guide, a four-cell facts strip, a heavy-ruled FAQ and a board-black closing card.
- Heavy 2px ink frames for tickets, facts, tables and forms; the board is the only dark object on a light page.
Shape
- Signage-square:
--r-s4px buttons and inputs,--r-m8px tickets,--r-l14px the board and closing card. - Tickets have a dashed perforation under their top line; the board has an inset frame line, like a mounted sign.
- The brand mark is two flap tiles with the initials.
Motion language
- The clatter: on a tab change each flap cycles through two to six random characters (70ms each, a small rotateX) before landing; rows start 90ms apart. While nobody has touched it, the board steps to the next tab every 7 seconds.
- The clock on the board keeps the time.
- The tray updates on every Add; the reservation number clatters onto a flap row.
- Reveals: 16px rise and fade, 600ms. The phone menu drops down as a board of destinations.
- Motion switch in the footer (
[data-motion-toggle],html.calm, remembered assite-motion, default fromprefers-reduced-motion). Calm sets the board instantly and stops the cycling. - Night board switch (
[data-theme-toggle]), remembered assite-theme;theme-colorfollows.
Imagery and illustration
The board, tickets and drawn maps carry the page. Line icons at 1.8px stroke in brass. Photography of the store, the counter and staff (all adults, clearly over 21), in warm light. On cannabis sites never show people who could look under 21, consumption, smoke clouds, leaves as decoration, cartoons, or anything that imitates candy or snack packaging.
Signature components
.board[data-board][data-cycle]›.board-head(.board-title,[data-clock]) ›.board-tabs(button[data-tab]) ›table > thead > tr > th[data-w](.r)(.opt)+ emptytbody›script.board-data({"Tab": [[cells], ...]}) ›.board-foot..optcolumns hide on phones; the last column is lit..ticket›.t-top,h3,.t-meta > span,.t-notes,.t-lab,.t-foot(.t-price,button.add[data-item][data-name][data-meta][data-price])..tray[data-tray="key"]›.tray-head([data-count]),.tray-list,.tray-empty,.tray-sum([data-sub]),.tray-note..gate[data-age-gate][data-no-text]›.gate-card([data-age-yes],[data-age-no],[data-age-out])..potency(.potency-barwith--start,.potency-marks),.warn,.facts[style="--n:4"],.notice-bar,.licence,.faq details,.close-card.
Multi-page kit
- Phone menu:
.menu-btn[aria-controls]opens.site-menu(a board of destinations); Escape, outside click and links close it; Tab stays inside while open. - Current page:
aria-current="page"(a brass underline). - Inner pages:
.page-headwith.crumbs, a.tagand a smaller.h1. - Fields:
.field,.fields,.field-wide,fieldset.field-set,.check,.form-card,[aria-invalid="true"];form[data-template]shows "This is a template" on submit. - Tiles:
.choices›label.choice > input + span > b + small. Segmented control:.seg(button[aria-pressed]withdata-filter/data-value, orlabel > input + text). Stepper:.stepper. - Gate:
[data-gate]withbutton[data-show="panel-id"](the content kind; the age check is.gate[data-age-gate]). - Slider, switch, tables, layout:
input.range,.switch[role=switch],.table/.table.stack,.r,.grid-2.lean/.lean-r. - Helpers:
Tableau.flip(el, text, width, rightAlign)clatters any text onto a flap row;Tableau.refresh(root).
Cannabis retail in the US
Rules are set state by state and change often. Tableau carries the strictest common set, so a site starts compliant almost anywhere adult-use is legal, then gets the state's own wording:
- 21+ age check on entry to the site, remembered in the browser, with the page behind it inert; "No" keeps the site closed.
- Licence number and regulator in every footer; the state's required warning text in a
.warnbox (the template's wording is a placeholder to replace). - No health, therapeutic or effect claims: products are described by what's on the label (category, type, potency, size, price) and aroma only, with lab results (COA) for each.
- Nothing that appeals to people under 21: no cartoons, cartoon fonts, bright neon, candy words or imitations of snack brands, and no images of anyone who could look under 21 (California, 4 CCR § 15040; New York OCM guidance).
- No free cannabis, BOGO offers, contests or giveaways (California, 4 CCR § 15040), and no presenting an adult-use store as medical.
- Public-health facts are welcome and often required: start low with edibles, onset can take two hours, don't drive, store locked away from children and pets, Poison Control 1-800-222-1222.
Ad placement rules (for example California's 71.6% adult-audience test) apply to where you advertise, not just what the site says. These notes are design guidance, not legal advice; check every page against your state's current regulations before launch.
Do and don't
- Do keep the board honest: real prices, real sizes, "sample" until it's live.
- Do put lab results one click from every product.
- Do keep the notice bar: 21+, ID, how ordering works.
- Don't describe what a product does to you, or show anyone using it.
- Don't use neon, candy colours, cartoon type or snack-brand parodies.
- Don't run promotions that give cannabis away.
Accessibility
AA contrast throughout (measured above). Skip link, 3px blue focus ring (amber on the board). The board is a real table; each cell's text is in the page for screen readers while the flaps are aria-hidden. The age check is a modal dialog with focus kept inside and the page behind inert. Tickets' Add buttons use aria-pressed; the tray's steppers are labelled per product. Tables stack on phones; the board drops its optional columns. Responsive to 360px; tested with motion on and off, in Day board and Night board.
How to make it yours
| Dial | Range |
|---|---|
| Accent | Brass (default), copper-red (Gaslight), copper (Copperline), velvet red (Rialto); set --brass, --brass-2, --brass-soft for both modes |
| Board letters | --flap-lit for prices: amber (default), beer-gold, marquee-bulb gold; keep it 4.5:1 on --flap |
| Board | Columns and widths per business: product/type/THC/size/price, tap/style/ABV/price, film/rating/screen/time |
| Gate | On for anything age-restricted; off otherwise |
| Night board | On (default) or Day board only |
| Not negotiable | Big Shoulders capitals, the mono board, heavy ink frames, a real list on the board, and on cannabis sites the age check, licence line, warnings, lab results and no health claims; the Motion switch |



