Style guide · v0.1

Toko

The visual and component system behind Toko — Internet Computer-native generator, wallet, launchpad, and secondary marketplace. This guide is a single source for type, color, components, and the patterns the product is built on.

Toko character saying hi

Rendered with the project's own fonts (Anton, Mona Sans, Mona Sans) and the canonical logo and character art. Built to hold up at desktop and at ~375px wide. Use the Light / Dark toggle (top-right of the page) to flip the entire guide between modes and verify every component reads correctly on both surfaces.

Brand

Brand rules

Toko leads with a friendly character and an unapologetic display typeface. Keep visual personality concentrated in empty states, onboarding, and success moments — never on dense data views.

Logo

Toko
Light surface
Toko
Dark surface

Use: the logo is two files — the character (2026-05 - face.svg, preferred; 2026-05 - face.png as a raster fallback for surfaces that can't render SVG) and the wordmark (app-name.png). Default to the SVG; only reach for the PNG when SVG isn't supported or you specifically need a fixed-pixel raster (e.g. OG/social images, older email clients). The wordmark file is white as shipped, so use it as-is on dark surfaces; on light surfaces apply filter: brightness(0) to flip it to black. Never recolor the character. Pair the character and wordmark with a gap and clear-space equal to the height of the "T".

Character library

Each emotion is a folder of frames in bot-images/ — pick a single frame when used statically, sequence frames when used as a Lottie/GIF. Below is the full library at one representative frame each.

Hi
Hi
Laugh
Laugh
Thumbs up
Thumbs up
Confident
Confident
Love
Love
Grateful
Grateful
Party
Party
Spotlight
Spotlight
Mic drop
Mic drop
Podcaster
Podcaster
Determined
Determined
Teach or present
Teach / present
Question
Question
Point
Point
Inspect
Inspect
Read
Read
Type
Type
Recharge
Recharge
Oops / sorry
Oops / sorry
Not mathing
Not mathing
Anxious
Anxious
Unwell
Unwell

When to use which

MomentRecommended emotion folders
Onboarding / first runHi, Teach / present
Empty state — no data yetRecharge, Inspect, Read
Empty state — search returned nothingInspect, Oops / sorry
Success / confirmationThumbs up, Love, Party
Achievement / rewardConfident, Thumbs up, Grateful
Error / mistakeOops / sorry, Not mathing — never use a happy pose with an error message
System unhealthy / outageUnwell, Anxious
Loading / system busyType, Read
Pre-launch / countdownDetermined
Live event / featured dropPodcaster, Spotlight, Mic drop
Drawing attention to UIPoint, Question
Profile avatar (logged in)Hi, Confident
Big reveal / announcementMic drop, Spotlight

Use: empty states, loading states, success moments, onboarding, marketing. Avoid: sprinkling through data tables, list rows, or transactional flows where personality reads as noise. Never: recolor, flip, or modify the character — use the pose that fits instead.

Voice

Direct, friendly, never breathless. Sentence case in body copy, all-caps display type in headings. Errors are matter-of-fact, not apologetic. Status copy is short ("Draft", "Live", "Upload Failed"). No emojis in product copy.

Foundations · Color

Color

Three color languages, each scoped to one role. Lifecycle drives stage indicators. Health drives resource gauges. Notification severity drives toasts and banners. Don't cross them.

Surfaces & text

Canvas
#FFFFFF
Canvas alt
#FAFAFA
Page
#EAEAEA
Inverse
#1D1D1D
Inverse 2
#000000
Border soft
#E5E5E5

Page background: application pages sit on the Page grey (--surface-page, #EAEAEA) — the light grey tone used throughout the app shell. Canvas white is reserved for the cards, panels and surfaces layered on top; it is never used as a full-page background. The Page grey is the quiet contrast that lets white cards read as raised.

Lifecycle

Draft
#F59E0B
Review
#6366F1
Live
#10B981

Rule: lifecycle colors carry the stage on a Status pill — a soft tint background with matching text and dot — and as the active segment of a Draft/Review/Live selector or the accent line on a Card header. Never use them as button backgrounds. The same three stages apply to projects, collections, and individual tokens.

Health (resource gauges)

OK
#10B981
Warning
#F59E0B
Critical
#EF4444

Rule: health red and lifecycle red share a hue. That's deliberate — both mean "stop / attention." Don't introduce a second red.

Foundations · Typography

Typography

Three families, each with a single job. Anton for display. Mona Sans for emphasis and labels. Mona Sans for everything else.

Families

Anton Display · 400
Built to glow
Mona Sans Emphasis · 400–900
Token details — edit metadata
Mona Sans Body · 300–900
A collection is the policy boundary for a group of tokens. Every collection owns its own attribute schema and rarity model.

Type scale

Display XL Anton · 72/0.9
Icypeas
Display Anton · 48/0.95
Icypeas Collection
Heading Anton · 28/1
Claim Requirements
Subheading Mona Sans · 18/1.2 · 700
Set staking or holding requirements
Body L Mona Sans · 18/1.55
Featured in the marketplace as your collection's main visual.
Body Mona Sans · 16/1.55
Primary collection for the Icypeas universe. Includes all canonical characters and key drops.
Body S Mona Sans · 14/1.5
Why this drop matters, or what you'd like them to know.
Caption Mona Sans · 13/1.4 · 500
This is your collection thumbnail shown in public views.
Label Mona Sans · 12/1 · 700, uppercase, tracked
Token Score Visible

Anton vs Mona — when to use which

Both are condensed and usually set in uppercase, so they're easy to confuse. The bright line is 24px. Anton is one ultra-heavy display weight that loses legibility below 24px; Mona Sans has true weights (400–900) and stays crisp at caption sizes. Self-test: is it uppercase? No → Mona Sans. Yes → is it 24px or bigger? Yes → Anton. No → Mona.

Anton — the loud voice · ≥24px · one weight
Launchpad
Claim Requirements

Page titles, section headers, hero text, big numbers. Never UI controls, never below 24px.

Mona Sans — small uppercase labels · 10–13px · 700–800
Foundations · Typography
Token name    Rarity    Status
Legendary

Eyebrows, table headers, stage pills, tag chips, nav group labels — the sizes Anton physically can't do.

Same word, same size — they are not the same face
Generator Generator

Anton (left) is blacker and tighter; Mona (right) is lighter with open counters. If a Mona label starts reading like "mini Anton", it's set too big or too heavy — drop it back to 10–13px at weight 700–800.

SurfaceFamilySpec
Page / section titles, heroAnton≥24px · uppercase · tracked
Big stats, countersAnton≥24px · tabular context only
Eyebrows, group labelsMona Sans10–12px · 700–800 · uppercase · 0.14–0.18em tracking
Table headersMona Sans11px · 800 · uppercase
Stage pills, tag chipsMona Sans9.5–11px · 700 · uppercase
Subheadings (sentence case allowed)Mona Sans16–18px · 700
Everything in sentence caseMona Sans13–18px · 300–900

Rules

Headlines and section labels are uppercase. Body copy is sentence case. Never use Anton below 24px (it loses legibility). Use Mona Sans when a label needs emphasis but Anton would be too loud (form labels, table headers, eyebrows). Body text always Mona Sans. Quick self-test: uppercase? No → Mona Sans. Yes → 24px or bigger? Yes → Anton, no → Mona.

Foundations · Spacing & radius

Spacing & radius

Spacing is a multiple of 4. Radius scales with surface size — small controls 4–8px, cards and modals 12–16px, pills are fully rounded.

Spacing scale

4
8
12
16
24
32
48
64

Radius

4 · controls
8 · inputs, icon buttons
12 · inner panels, notes
16 · cards, modals, hero
pill · buttons, status, badges
Foundations · Iconography

Iconography

Two icon systems. Semantic notification icons are filled black circles with a white glyph. Health gauges are colored battery icons. Don't mix: don't use a colored circle for a notification, don't use a black battery.

Notification icons

Success
Error
Warning
Info

Cycle Status (health gauges)

Healthy
Degraded
Critical

Guard badges

Collection guards are buyer-facing permission promises, shown on the public collection page and across collection management (Manage → Guards, status summaries, the Live locked list). Each guard ships as a self-contained shield badge in two states: on (solid black — the permission is allowed / active) and off (muted grey — blocked / inactive, a stronger guarantee to buyers). Unlike the line icons, these are pre-coloured raster badges — don't recolour them with currentColor. Render at 22–32px. (Placeholder art, PNG only; SVGs to follow.)

Duplicates guard on
Duplicates · on
Destruction guard on
Destruction · on
Transfer-restrictions guard on
Transfer limits · on
Sale-restrictions guard on
Sale limits · on
Duplicates guard off
Duplicates · off
Destruction guard off
Destruction · off
Transfer-restrictions guard off
Transfer limits · off
Sale-restrictions guard off
Sale limits · off
Components

Buttons

Primary actions are solid black and pill-shaped, with Mona Sans (emphasis) labels in sentence case, lightly tracked (0.04em). Secondary actions are outlined on a light fill; ghosts are outlined and transparent. Reserve Anton for headings and titles — never for button labels. Icon buttons stay square (8px radius).

Sizes

States

Default
Hover
Pressed
Focused
Disabled
Secondary · default
Secondary · hover
Ghost · default
Ghost · hover

On dark surface

Default
Hover
Secondary
Ghost
Disabled

Color variants — semantic CTAs

Use only when the action itself carries a hard meaning. Danger for destructive ("Delete collection", "Burn token"). Success as a confirmation CTA inside a success modal — never as a default save. Warning for "I understand the risk, proceed" actions. Never use semantic colors on the page's standing primary CTA.

Color variants — states

Danger · default
Danger · hover
Danger · focused
Danger · disabled
Success · default
Success · hover

Icon buttons

Same anatomy as the standard button — square, holds a single 18px icon. Always include an aria-label. Use the secondary variant for non-primary actions in a toolbar; reserve the solid black variant for the primary affordance only. The destructive icon button uses the danger color for trash, burn, disconnect, etc.

Icon buttons — sizes

Rules

One primary button per surface. Place primary on the right of an action group. Disabled state is mid-grey; never lower the opacity of the active button to fake a disabled state. Color variants are reserved for actions whose semantic weight matches the color — they are not theming.

Components

Inputs & forms

Single visual treatment for inputs: light alt-canvas fill, soft border, focus ring in primary text color.

Search

States

Default · empty
Default · filled
Hover
Focused
Error
Disabled

On dark surface

Default
Focused
Disabled

Helper text, required, optional

Helper text sits below the field at 12px slate. Required is a red asterisk after the label. Optional uses an uppercase chip on the right of the label row. Helpers are short — one line, no terminal period unless a sentence.

Shown in your wallet list. You can change it later.
Optional
3–24 characters. Letters, numbers, and underscores.

Error & success messages

Error text replaces helper text on validation failure. Use the destructive red and a leading icon. Success messaging is rare — reserve it for inputs where confirming validity matters (handle availability, claim code, transaction hash).

Handles can't include spaces or punctuation.
Valid principal — found on the IC.
Markdown is supported. 0 / 240
Trim to 240 characters. 293 / 240
Components

Selection controls

Checkboxes for multi-select, radios for one-of-many, switches for binary settings. The bulk-action bar uses the indeterminate checkbox state when a partial multi-select is active.

Checkbox

Radio

Switch

Switch — states

Off · default
Off · hover
Off · focused
Off · disabled
On · default
On · hover
On · focused
On · disabled

Checkbox — states

Empty
Empty · hover
Empty · focused
Empty · disabled
Checked
Checked · disabled
Indeterminate

Radio — states

Empty
Empty · hover
Empty · focused
Empty · disabled
Selected
Selected · disabled

With labels & secondary text

For form lists, pair the control with a 14px title and an optional 13px slate description. Click target is the whole row. Wrap the row inside .option-list when the rows belong together (settings panel, multi-select group).

Switch row — settings layout

Switches in a settings list always sit on the right with the label on the left. Optional secondary text drops below the title at 13px. Rows divide with a 1px hairline.

Compact (label only)

Use when secondary text would be noise — short labels in toolbars, filters, or quick toggles.

On dark surface

Switch off
Switch on
Empty
Checked
Radio empty
Radio selected
Components

Optional reveal

A switch that toggles a hidden field group on and off. Use when an input is conditionally relevant — opt-in royalties, custom claim requirements, an alternate payout address. Off is the default; the body collapses entirely.

Off and on

Whole numbers between 1 and the supply cap.
Whole numbers between 1 and the supply cap.

With a richer revealed body

Between 0% and 15%. Higher rates can deter trading.
Where royalties are sent. Defaults to your connected wallet.

Rules

The switch sits in the top-right of the head. Title and description follow the same spec as labeled selection rows. The revealed body is divided from the head with a hairline and inherits a slightly raised surface to signal "this is now active." Off state collapses the body fully — never just disable the inputs and leave them visible.

On dark surface

Whole numbers between 1 and the supply cap.
Components

Tags & pills

Tags are user-attached metadata (removable). Status pills indicate lifecycle. Token-count badges show stack size.

Tag

Character Drop × Game Moomin × ICYPEASVERSE ×

Token count

9 99 9,999

On dark surface

Character Drop × ICYPEASVERSE × 99
Components

Status & lifecycle

Status indicates the current stage of a project, collection, or token. The same three stages — Draft, Review, Live — apply to all three. Use Status pills for inline indicators and the stage selector for stage selection or progress.

Status pill

Draft Review Live

Stage selector — 2 stage

Stage selector — 3 stage

Number state (issue_number lifecycle)

# #

Left: unassigned (pre-review). Middle: assigned or reserved. Right: locked and retired on Live.

Stage selector — states

Review active
Draft active
Live active

On dark surface

Draft Review Live
Components

Cards

Two card kinds: Project (top-level creator workspace, gets a health pill and a collections count) and Collection (a token-policy boundary inside a project, shows token count). Same anatomy, different metadata row.

Project name
Healthy # Collections
Collection name
# Tokens
Components

List rows

Two row primitives. dropdown-item is text-only and stripes alternating rows for scannability. Collection Menu adds a thumbnail and a count, and uses a pill on the active row.

dropdown-item

Collection Menu (single-select)

Dragginz
0 Tokens
Pokedbots
0 Tokens
Motokos
0 Tokens

The current row uses a soft canvas-alt pill, not a checkbox. Multi-select is reserved for token tiles, not collection rows.

Components

Image tiles

Token thumbnails. Corner controls reveal on hover or persist when a multi-select session is active. Use the checkmark variant only when at least one tile is selected — empty checkboxes appear on all sibling tiles to invite selection.

States

Default
Hover
Hover · kebab visible
Multi-select · unchecked
Selected
Components

Tooltips

Dark by default for high contrast. Light variant for use on dark surfaces. Arrow placement reflects the trigger position.

A message which appears on hover.
A message which appears on hover.

On dark surface

A message which appears on hover.
A message which appears on hover.
Components

Notification banners

Four severities — success, error, warning, info — across three visual treatments. Use the light variant inline, the filled variant for high-attention toasts, and the dark variant in dense areas where the page is already light.

Light · accent underline

Filled

Dark

Components

Upload & progress

Each upload renders one row. Blue bar = in-progress (with percentage). Green = done. Red = failed (with "Upload Failed" replacing percent label).

Image001.png1.8 MB
60%
Image001.png1.8 MB
100%
Image001.pngUpload Failed
00%

Skeleton (Input Load)

Uploading…
Components

Modals

Simple Modal Base: white surface, large radius, display-typeface title, lede below it, content area, action group on the right. Use the info strip for cost or consequence disclosures (e.g. "this will use ICP").

Components

Tabs

Horizontal tab bar for navigating between sections of the same surface (Overview / Guards / Supply / Attributes / Rarity / Tokens / Review on the collection editor). Scrolls horizontally on narrow viewports. Distinct from the Draft/Review/Live stage selector — tabs change what you're editing, the stage selector changes which stage you're viewing.

States

Default
Hover
Active
Focused
Disabled

On dark surface

Components

Lock & edit chips

Inline indicators that tell the creator what happens to a setting when the collection goes Live. Pair with section headers on the configuration editor.

Locks at Live Editable in Live

Use Locks at Live for structural fields (supply, guards, attribute schema). Use Editable in Live for presentation fields (banner, description, social handles).

Components

Radio cards

Large clickable choice cards for high-stakes selections — supply policy, rarity model, vendor type. Use the "Most common" pill when one option is the safe default.

Most common Unique pieces Each token is one-of-one. No duplicates, no editions.
Multi-copy editions Every token can have multiple copies — like a print run. Clone Mode is enabled automatically.
Mixed Each token decides its own supply individually. Use for collections with both unique and edition pieces.

States

Option
Default
Option
Hover
Option
Selected
Option
Focused
Option
Disabled

On dark surface

DefaultNot selected.
SelectedThe chosen option.
Components

State banners

Status feedback tied to a choice the creator just made. Different from a notification toast — these are persistent until the configuration changes. Used for Clone Mode, Generator linked, Vendor staged, etc.

Clone Mode will be enabled in Guards when you save — required for multi-copy tokens. Jump to Guards →
! Clone Mode stays off — each token is one-of-one. Jump to Guards →
Components

Disclosure

Progressive disclosure for secondary detail. Default closed. Use sparingly — content the creator needs to reach for ≥50% of the time should not be hidden behind a click.

How is "Up to mintable" calculated?
Unique designs × copies-each = total mintable cap. The cap is the structural ceiling and locks at Live. Per-token supply policy can lower this per token but never raise it.

States

Closed
Hidden detail.
Default · closed
Open
Revealed detail content shows below the trigger.
Open
Components

Save bar

Sticky bottom bar that appears when there are unsaved edits on a configuration page. Lives outside the scroll container.

Unsaved changes

States

No changes
Unsaved changes · 3 fields
Saving…
Saved 2s ago
Token surface

Token card

Same token, two audiences. The public card carries identity only — name, issue, edition. The studio card adds a creator-only panel with mint progress and remaining capacity.

Two contexts

Public — wallet / marketplace

Collectors and the public. Identity only.

Token name

#110
Edition4/25
Creator studio

Creator only. Adds mint progress and remaining count.

Token name

#110
Edition4/25
Studio · creator only
Live 5 / 25
20 remaining to mint

Public anatomy

×10

Token name

#120
Edition4/25
  1. 1
    Artwork — never overlaid by metadata. The image is the most important pixel on the card.
  2. 2
    Stack badge (wallet only). Shown when the holding's stack quantity > 1. The × prefix prevents confusion with issue numbers.
  3. 3
    Token name. Anton, uppercase. Owns the visual weight.
  4. 4
    Issue number. Smaller, slate-grey, same row as the name. Reads like a serial number. Hidden when issue visibility is set to Hidden.
  5. 5
    Edition fraction or supply tag. Prominent Edition 4/25 on capped tokens with copy numbering enabled. Falls back to soft Limited edition / Open edition / 1 of 1 when copy numbers are hidden. No mint progress is ever shown publicly.

Public — all variants

×10

Token name

Open edition
Unlimited · issue hidden · stack of 10. Only the stack badge sits on the art.

Lone astronaut

#106
1 of 1
Single supply · issue shown. "1 of 1" reads warmer than "1/1".

Token name

#120
Limited edition
Capped · issue shown · copy hidden. Cap is intentionally not revealed publicly.

Token name

#110
Edition4/25
Capped · issue + copy shown. The print-run treatment.
Token surface

Rarity borders

Every token wears its rarity. The border is part of the card itself — a coloured frame the artwork is inset into. Three border systems cover every collection: a plain default, creator-picked tiers, and the canonical weighted ladder.

Three rarity systems

SystemWho picks the colourWhen to use it
Default / uniformToko ships a single neutral border.Collections with no rarity, or where every token is rated the same.
TieredThe creator picks one colour per tier.Bespoke ladders that don't map to the canonical 7. Recommendation: pick distinct hues that read clearly at thumbnail size.
Weighted (canonical)Toko-defined.The seven-step ladder used across the marketplace.

Anatomy

The border is a solid-colour outer frame with the artwork inset by 8px. The inner card carries its own corner-radius — drawn in code with the image rendered over it — so the rounded corners stay clean regardless of the tier colour. Card-to-card spacing in a grid stays at var(--s-3) (12px) so the borders never abut.

Token name

#110
Edition4/25
  1. 1
    Outer frame. Solid colour. Carries a 14px outer radius and an 8px inner padding.
  2. 2
    Inset content. The standard token card sits inside the frame with its own 8px radius. The border peeks out evenly on all sides.

Default — no rarity / uniform

Same anatomy, neutral fill. Reads as "framed but unranked" against any surface.

Token name

#001
1 of 1

Tiered — creator picks the palette

A recipe, not a fixed palette. The creator chooses one colour per tier they define. Use distinct hues with enough contrast to read at thumbnail size; reserve very saturated colours for the top tiers.

Tier I

#012
Tier I · Teal

Tier II

#012
Tier II · Magenta

Tier III

#012
Tier III · Graphite

Weighted — the canonical seven

Each tier has one canonical hex — the rarity colour — reused wherever the tier is referenced (frame, dot, tag, text). All seven tiers render the frame as a flat fill of their hex; no gradients, no halos, no metal sheens. The top three tiers — Legendary (light yellow-orange), Mythical (deep pink), and Inconceivable (cyan) — are tuned to feel equally vibrant so none dominates the others.

Common

#001
Common · #E6E6E6

Uncommon

#024
Uncommon · #2ECC71

Rare

#077
Rare · #2F80ED

Epic

#108
Epic · #8F3DFF

Legendary

#142
Legendary · #FCD34D

Mythical

#188
Mythical · #FF1493

Inconceivable

#001
Inconceivable · #06B6D4

Tier reference

Common Uncommon Rare Epic Legendary Mythical Inconceivable

Selection state

Don't override the rarity border to indicate selection — that's the moment the user most needs to see what tier they're picking. Add an outer black ring with a 4px gap and a corner check badge instead. The rarity stays legible, the selection is unambiguous, and it stacks cleanly on every tier including Inconceivable.

Token name

#110
Default

Token name

#110
Selected — outer ring + check

Token name

#001
Selected — Inconceivable

On dark surface

The frame colours are surface-agnostic by design. The inner card flips to the dark canvas treatment automatically.

Common

#001

Epic

#108

Mythical

#188

Inconceivable

#001

Rules

Always render the border in code as an outer container with the artwork inset over it — never bake the border into the artwork. Card spacing in a grid stays at var(--s-3) (12px) so the borders never touch. Selection is an outer ring plus a check badge — never an override of the rarity colour.

Token surface

Issue & copy display options

Collection-wide defaults for how tokens identify themselves on the public card. Vendors can override these before going live.

Issue number

OptionSample
Hiddenno #
Show issue number#7
Show issue and supply cap#7 / 100

Copy / edition number

OptionSample
Hidden
Show edition numberEdition 4/50

Stack behaviour

OptionSample
Allow stacking×10
Always individual1, 2, 3…

"Allow stacking" is fungible-style (coins, ammo, consumables). "Always individual" is collectible-style (numbered prints). Showing edition numbers forces "Always individual".

Patterns

Bulk actions

Persistent toolbar that appears at the edge of the viewport while a multi-select session is active. Empty checkbox = no selection. Indeterminate (minus) = partial selection. Reuses the bar shell for post-action success feedback.

Items selected: 0
Items selected: 3
Assets added to collection successfully
Patterns

Page footer

A wide illustration tile that anchors the bottom of every page. The image carries its own top-fade, so it eases into the page background without an explicit divider — the page just trails off into a friendly clutter of bots and tools.

Light surface

Drop the asset full-width at the bottom of the page. The internal opacity gradient handles the fade; no extra mask or wrapper needed. Sits flush to the bottom edge, no horizontal padding.

Dark surface

The asset's white-to-transparent gradient is inverted with a CSS filter. The illustration goes light, the gradient becomes dark-to-transparent, and the whole thing fades into the dark page exactly the way the light variant does.

Implementation

<img class="page-footer" src="page-footer/Rectangle 1175.svg" alt="" />

.page-footer {
  display: block;
  width: 100%;
  height: auto;
  margin-top: auto;
  pointer-events: none;
  user-select: none;
}
:root[data-theme="dark"] .page-footer {
  filter: invert(1);
}

Rules

Use sparingly. The footer belongs at the bottom of long marketing or browse pages — not in modals, drawers, or transactional flows. Don't crop it. The illustration is designed at 1728 × 307 and works best at full page width. Don't tint it. The grey is intentional; coloured variants risk competing with token art above. Keep it decorative. The image is purely illustrative — never put functional UI inside or on top of it.

Patterns

Empty states

Two flavours. A full-screen empty keeps the page's normal header (eyebrow, Anton title, one-line intro), then the hero image, then the empty-state message, primary action, and any extra info underneath. A compact inline empty — an empty table or a filtered list with no matches inside an otherwise-populated page — drops the hero for a small character frame. Keep copy short and action-oriented; one primary action only.

Full-screen — hero empty

Order: title & intro → image → everything else underneath. The page keeps its normal header — eyebrow, Anton title, and a one-line intro — above the hero. Then the 16:6 hero image, then the empty-state headline, supporting copy, the primary action, and any additional information (a "how it works" explainer, fact cards) underneath. Image spec lives in Imagery & backgrounds — assume a finished 1600 × 600 JPG named no_<name>.jpg.

Project · Beneficiaries
Beneficiaries.

Payout identities that earn a royalty on each sale, after fees.

No beneficiaries yet.

Add the people, charities, or partners who should earn a royalty on each sale.

Compact — inline empty

For an empty region inside a populated page (an empty table, a filtered list with no matches). No hero image — a small character frame, one line, and the action.

No tokens yet

When you mint or claim something, it'll show up here.

Assets

Imagery & backgrounds

Full-bleed photographic and rendered artwork — empty-state heroes and carousel backgrounds. Both are cropped with object-fit: cover / background-position: center, so the same file has to survive more than one crop. Export to spec, keep the subject centered, and ship JPG.

Format — always JPG

These are continuous-tone photos and 3D renders with no transparency, so JPG at quality ~80 is correct: it lands 80–90% smaller than PNG for the same result. Reserve PNG for flat graphics, UI, logos, or anything that needs a transparent background (the character art stays PNG). Run every export through an optimiser so a hero is never heavier than it needs to be.

Empty-state heroes

The wide banner that sits below the page title in an empty-state screen (the .empty-hero pattern). It spans the full content width — the same width as the cards, explainer, and panels below it — with the image area locked to a 16:6 ratio. Export at 1600 × 600 so it stays crisp at typical container widths. On phones (≤560px) the frame switches to a taller 4:3 crop that trims the left and right edges — so keep the hero element horizontally centred with ~10% of clear margin each side.

PropertySpec
Aspect ratio16 : 6 (8 : 3)
Export size1600 × 600 px (16:6 · full content width, retina-ready)
Format / weightJPG · quality ~80 · ≤ 200 KB
Crop behaviourcover · centred · mobile recrops to 4:3 (trims sides)
Safe areasubject centred, ~10% clear margin left & right
Folderstyle-guide/empty-state-hero/

Assume a finished asset. Each hero is delivered ready to use — a 1600 × 600 JPG named no_<name>.jpg. Drop it straight into the folder; no resizing or re-cropping on our side.

Naming. no_<name>.jpg (underscore), where singular is the overview of one thing and plural is the list of them — this is what keeps the project overview and the collection overview from colliding.

SurfaceFile
All projects · studio entryno_projects.jpg
Project overview · empty projectno_project.jpg
Collection overview · empty collectionno_collection.jpg
Collections · listno_collections.jpg
Generators · listno_generators.jpg
Accessno_access.jpg
Whitelistsno_whitelists.jpg
Beneficiariesno_beneficiaries.jpg

Carousel backgrounds

Full-bleed slide art behind the hero carousel (hero-carousel.html). Desktop renders the carousel at a 16:6 banner (up to ~1300px wide); phones (≤720px) switch to a 3:4 portrait. Because the same file fills both a wide and a tall box from the centre, export a large 16:9 master and keep the focal subject inside the central safe zone so it survives both crops.

A dark gradient scrim sits over the left third on desktop and the bottom on mobile to keep the white headline legible. Don't put essential detail in those zones — favour a lower-detail or naturally darker area there, and let the focal subject sit centre / centre-right.

PropertySpec
Display ratio16 : 6 desktop · 3 : 4 mobile (≤720px)
Export size2560 × 1440 px (16:9 master covering both crops)
Format / weightJPG · quality ~80 · ≤ 400 KB
Crop behaviourcover · centred — must read wide and portrait
Safe areafocal subject in the central ~60% (h & v)
Text scrimkeep left third (desktop) / bottom (mobile) low-detail
Patterns

Project & collection identity

The "view / edit" surface at the top of a project or collection. Both use the same identity container — one inset card, the same width as the content below it, holding the banner, thumbnail, name, description, and social links, with its own save footer. Never split these into a full-bleed banner plus separate form fields.

Ipsum Studio
Description
A small studio making warm, generative work.
Social links
X @ipsumstudio
Unsaved changes

Rules

One inset container at content width — never a full-bleed banner. The banner sits across the top; the square thumbnail overlaps its lower edge as an avatar; the name is the Anton title beside the avatar. Description and Social links sit side by side as two columns on web and stack below ~720px. The save controls — an "unsaved changes" indicator with Discard + Save — live in the container's own footer, never in the breadcrumb / nav bar. Identical pattern for both project and collection.

StateWhat it shows
Just createdThumbnail + name + description carried from the create modal; empty banner shows a dashed "Upload a banner" prompt; no social rows yet — a hint plus the add-row only.
PopulatedFilled banner; existing socials listed as editable rows (edit + delete) above the add-row.
LiveBanner & thumbnail are direct edits (save immediately); name / description / links show a "Needs save" chip; core policy is locked read-only below the card.
Assets

Banner vs thumbnail previews

Two different shapes that must always preview at their true aspect ratio. A banner is a wide horizontal header; a thumbnail is a square icon. Never force a banner into a square card, or stretch a thumbnail to fill a wide slot.

Banner · 16:6 wide
Thumbnail · 1:1 square

Rules

A banner is a wide 16:6 horizontal image — preview it at 16:6 everywhere it appears, never cropped into a square tile. A thumbnail is 1:1 and renders as the avatar / icon. In the media library this is why assets are split into separate Banners / Thumbnails / Other views — so each kind previews at its own ratio rather than being normalised to one card shape.

KindRatioUsed as
Banner16 : 6 wideProject / collection header, marketplace hero
Thumbnail1 : 1 squareAvatar, list / grid icon, vendor tile
Patterns

Image picker — Upload / Media library

Anywhere an image is set (new project, new collection, banner or thumbnail), the picker is two equal square tiles side by side: Upload and Media library, given identical treatment. The library option is a peer tile — never a smaller link or a secondary control beneath the upload box.

Rules

Both tiles are square, equal-sized, dashed, each with a 22px icon, a bold label, and a one-line hint — Upload uses the upload-arrow icon, Media library uses the grid icon. They sit side by side as equal peers; the media-library choice must never be demoted to a text link or tucked below the upload area. When the picker sets a square thumbnail the tiles are square; the same two-tile pattern applies when choosing a banner.