what pollen is made of

every colour, face, shadow and curve on this site is a css variable, and these are the packets they come in: open one for its tokens and the rule behind them.

blooms

colour · 33 tokens seven warm hues on cream paper, and ink that is brown, never black.

the whole palette lives at golden hour. amber is pollen's voice, coral is the warm second, sage says thank you, and pink, lavender and sky drift through the background. neutrals are tinted toward brown so nothing reads as cold.

the tinted-neutral rule
never #000, never #fff. every neutral leans amber or brown. white is a bug, not a colour.
the one-cool-dot rule
sky is the only cool colour, and only as atmosphere. a cool foreground element is a defect.
the sage-for-thanks rule
sage confirms and attributes: reposts, from-chips, added-by chains. primary actions are amber's job.

the blooms

tokenpreviewvalue
--cream #faf5ef
--coral #e8734a
--coral-soft #f09070
--amber #eda63a
--amber-light #f5c96a
--sage #8aad6e
--sage-light #b5d4a0
--pink #e8a0b4
--pink-soft #f0c4d4
--lavender #c8b8e0
--lavender-light #e8dff5
--sky #b8d8e8
--sky-light #daeef5
--brown-light #d4bb96
--tint-warm color-mix(in srgb, var(--amber) 6%, transparent)
--tint-pink color-mix(in srgb, var(--pink) 8%, transparent)
--tint-green color-mix(in srgb, var(--sage) 6%, transparent)
--tint-coral color-mix(in srgb, var(--coral) 6%, transparent)

accent roles

tokenpreviewvalue
--accent var(--amber)
--accent-warm var(--coral)
--accent-secondary var(--pink)
--accent-hover #d4944a
--accent-glow #f5c890
--accent-green var(--sage)
--accent-pink var(--pink)
--accent-blue var(--sky)

ink

tokenpreviewvalue
--text #3d3028
--text-secondary #7a6b5e
--text-muted #a89888

danger and success

tokenpreviewvalue
--color-danger #c54545
--color-danger-bg rgba(220, 100, 100, 0.08)
--color-success #6ab88f
--color-success-bg rgba(125, 201, 160, 0.08)

voice

type · 25 tokens pp eiko for names, pp museum for sentences, and gt maru emoji for every emoji.

two text faces and one emoji face, all self-hosted. pp eiko is the display serif, usually light. pp museum is the humanist body face. gt maru emoji draws the emoji: it sits first in every stack but is scoped by unicode-range to emoji codepoints, so letters fall straight through to the text face and only the emoji change.

the lowercase rule
system chrome is lowercase. post, not Post. explore, not Explore. headings inside posts may use title case.
the gt maru emoji rule
every emoji the site shows, in chrome or in a post, is drawn by gt maru when it has the glyph. the platform's emoji font fills the gaps. chrome uses emoji as punctuation: a leaf on the from-chip, a blossom in the logo.
the no-em-dash rule
commas, colons, semicolons, periods, parentheses. not em dashes, and not two hyphens either.

faces, scale, weight

tokenpreviewvalue
--font-body 'GT Maru Emoji', 'PP Museum', system-ui, sans-serif
--font-display 'GT Maru Emoji', 'PP Eiko', Georgia, serif
--font-accent 'GT Maru Emoji', 'PP Eiko', Georgia, serif
--font-mono ui-monospace, 'SF Mono', Menlo, monospace
--font-emoji 'GT Maru Emoji', system-ui, sans-serif
--font-size-xs 0.75rem
--font-size-sm 0.875rem
--font-size-base 1rem
--font-size-lg 1.125rem
--font-size-xl 1.25rem
--font-size-2xl 1.5rem
--font-size-3xl 2rem
--font-size-4xl 3rem
--font-size-5xl 4rem
--font-weight-light 300
--font-weight-normal 400
--font-weight-medium 500
--font-weight-bold 700
--font-weight-ultrabold 800
--line-height 1.6
--line-height-tight 1.1
--line-height-loose 1.8
--letter-spacing 0.01em
--letter-spacing-wide 0.04em
--letter-spacing-tight -0.02em

paper and light

surfaces · 28 tokens cream ground, amber-tinted shadows, and glass that reads as filtered afternoon light.

depth comes from translucency and warm tint, not from heavy drop shadows. three shadow tiers, all tinted toward amber and brown, all diffuse. glass is allowed because cream-on-cream needs separation; the saturate() in the blur is what keeps it warm instead of gray.

the sun-cast-shadow rule
shadows are warm, low-opacity, large-radius. an rgba(0, 0, 0, x) shadow is cold against cream and does not ship.
the glass-is-earned rule
glass ships on header chrome, modals and post cards. not on buttons, inputs, chips or list items.
the lift-on-hover rule
cards rise 2px on hover with a spring, the shadow steps up one tier, and on pollen-chrome cards the shimmer border fades in.

the paper

tokenpreviewvalue
--bg var(--cream)
--bg-attachment fixed

surfaces

tokenpreviewvalue
--surface rgba(255, 253, 250, 0.88)
--surface-hover rgba(255, 255, 255, 0.95)
--surface-border rgba(232, 166, 90, 0.15)
--surface-blur 16px

shadows

tokenpreviewvalue
--shadow-sm 0 1px 3px rgba(180, 150, 120, 0.06)
--shadow-md 0 4px 16px rgba(180, 150, 120, 0.07)
--shadow-lg 0 12px 40px rgba(180, 150, 120, 0.1)
--shadow var(--shadow-md)
--shadow-hover var(--shadow-lg)
--shadow-glow 0 4px 24px rgba(232, 165, 90, 0.2)

glass

tokenpreviewvalue
--glass-bg linear-gradient(168deg, rgba(255, 255, 255, 0.76), rgba(255, 252, 248, 0.58) 50%, rgba(250, 245, 240, 0.48))
--glass-blur blur(20px) saturate(1.2)
--glass-border 1px solid rgba(255, 255, 255, 0.5)
--glass-shadow 0 4px 20px rgba(180, 150, 120, 0.05)
--glass-shadow-inset 0 1px 0 rgba(255, 255, 255, 0.7) inset

shimmer border

tokenpreviewvalue
--shimmer-gradient linear-gradient(135deg, color-mix(in srgb, var(--amber) 35%, transparent), color-mix(in srgb, var(--coral) 25%, transparent), color-mix(in srgb, var(--pink) 25%, transparent), color-mix(in srgb, var(--lavender) 25%, transparent), color-mix(in srgb, var(--sky) 35%, transparent), color-mix(in srgb, var(--sage) 25%, transparent), color-mix(in srgb, var(--amber) 35%, transparent))
--shimmer-speed 5s

gradients

tokenpreviewvalue
--gradient-garden linear-gradient( 170deg, #faf5ef 0%, #f8f0e8 25%, #f5ebe0 50%, #f0e4d8 75%, #ede0d0 100% )
--gradient-cream linear-gradient( 175deg, #fffdfb 0%, #fdf9f4 40%, #faf5ed 70%, #f5efe6 100% )
--gradient-sunset linear-gradient( 135deg, #fdf6ee 0%, #fceee0 50%, #f8e4d4 100% )
--gradient-accent linear-gradient(135deg, var(--coral), var(--amber))

profile ambient

tokenpreviewvalue
--profile-ambient-bg-attachment fixed

header chrome

tokenpreviewvalue
--header-bg rgba(250, 245, 239, 0.72)
--header-blur 28px

modal overlay

tokenpreviewvalue
--modal-overlay rgba(61, 53, 48, 0.4)
--modal-blur 12px

space and shape

spacing, corners, widths · 14 tokens a rem-based spacing scale and corners that are always round, never sharp.

spacing steps from a quarter rem to six rem. corners run 8, 12, 20 and 24px, with 9999px for pills. reading columns sit at min(680px, 90vw), inside the 65 to 75 character measure that body text wants.

the full-edge rule
a card border wraps all four sides at 1px or not at all. no side stripes as colour accents.
the pill rule
buttons and chips are fully round. cards are 24px, smaller cards 20px, chips 12px.

spacing scale

tokenpreviewvalue
--space-xs 0.25rem
--space-sm 0.5rem
--space-md 1rem
--space-lg 1.5rem
--space-xl 2rem
--space-2xl 2.5rem
--space-3xl 4rem
--space-4xl 6rem

corners

tokenpreviewvalue
--radius-sm 8px
--radius 12px
--radius-lg 20px
--radius-round 9999px

layout widths

tokenpreviewvalue
--content-width min(680px, 90vw)
--sidebar-width 240px

motion

easing and duration · 7 tokens spring easing, short durations, and nothing that asks for attention.

state changes use the spring curve: fast out, soft landing, no bounce. the default duration is a quarter second. the repost burst is the one long moment at just under a second. reduced-motion collapses everything to a single frame.

the transform-only rule
animate transform, opacity and filter. never width, height, padding or margin. the one exception is an inline card collapsing, and it springs out in a third of a second.
the one-moment rule
a surface gets one authored motion, orchestrated, not a hover effect on every element.

hover a row below and its dot travels on that curve or timing.

easing and duration

tokenpreviewvalue
--ease cubic-bezier(0.25, 0.1, 0.25, 1)
--ease-bounce cubic-bezier(0.34, 1.56, 0.64, 1)
--ease-spring cubic-bezier(0.23, 1, 0.32, 1)
--duration 250ms
--duration-fast 150ms
--duration-slow 400ms

hover

tokenpreviewvalue
--hover-lift -3px

buttons

controls · 10 tokens secondary is the default, primary is reserved, ghost is for stepping back.

an unstyled button is already the secondary tier: cream, hairline border, pill shape. primary wears the coral-to-amber gradient and an amber glow, and is reserved for the main action on a surface. ghost is for cancel and dismiss. danger is for delete and block only.

the one-primary rule
one primary button per surface. two primaries is a layout asking for a decision it should have made.

these are real buttons: hover, focus, and press them.

buttons

tokenpreviewvalue
--btn-bg var(--accent)
--btn-bg-hover var(--accent-hover)
--btn-text white
--btn-radius var(--radius-round)
--btn-shadow 0 2px 8px rgba(232, 165, 90, 0.25)
--btn-padding 0.75rem 1.75rem
--btn-secondary-bg var(--surface)
--btn-secondary-border var(--surface-border)
--btn-secondary-text var(--text)
--btn-ghost-text var(--text-secondary)

inputs

fields and focus · 8 tokens a soft cream well with an amber hairline that firms up when you land in it.

inputs sit in a translucent cream well with an amber border at 20%. on focus the well goes opaque, the border goes solid amber, and the focus ring adds a 3px amber halo. placeholders speak in lowercase and use the muted ink.

the visible-focus rule
every interactive element shows the focus ring under keyboard focus. focus:not(:focus-visible) may stay quiet.

inputs

tokenpreviewvalue
--input-bg rgba(255, 253, 250, 0.7)
--input-bg-focus rgba(255, 255, 255, 0.95)
--input-border rgba(232, 165, 90, 0.2)
--input-border-focus var(--accent)
--input-radius var(--radius)
--input-padding 0.875rem 1.25rem

focus

tokenpreviewvalue
--focus-ring 0 0 0 3px rgba(232, 165, 90, 0.35)
--focus-offset 2px

small things

logo, poppy, avatar, links · 6 tokens the wordmark with its turning flower, the coral poppy that stands for pollen elsewhere, and the amber-to-pink avatar halo.

the logo is the wordmark with a pixel flower beside it, picked at random from the flower set and kept for a few page views (it is drawn by the logo component, not by a token). away from the site, pollen is a california poppy: coral petals, amber heart, sage stem. it is the favicon, the touch icon, and the icon to use in directories and link lists. avatars sit on an amber-to-pink gradient with an amber glow. links are coral, hover to amber, and underline in pink.

the quiet-metrics rule
counts and follower numbers stay small and secondary. no hero stats, no centred numbers.

a sentence with a link in it and #a-tag.

the pollen poppy at icon size the poppy on cream, as the touch icon the poppy as a favicon

the poppy ships as svg, a 512px png for directories, a favicon, and a cream-backed touch icon. keep its proportions and colours and give it room.

avatar

tokenpreviewvalue
--avatar-bg linear-gradient(135deg, var(--accent), var(--accent-pink))
--avatar-shadow 0 4px 16px rgba(232, 165, 90, 0.2)
--avatar-size 80px
tokenpreviewvalue
--link-color var(--accent-warm)
--link-hover var(--accent)
--link-underline var(--accent-pink)

post cards

six chromes · 6 tokens one post, six outfits. the author picks the chrome and every post they make wears it.

the post card is the workhorse of the whole site. its background chains through --surface so palette vibes cascade into it. the author chooses one of six chromes in their card studio: pollen, pop, y2k, manuscript, neon and memphis. each chrome is a peer, scoped to its own data-post-style attribute, with a handful of bounded knobs.

the peer-chrome rule
a new chrome ships as a peer of the six, with its own knobs, never as a one-off.
the inline-first rule
notes, reposts and edits open inline inside the card. a modal means the inline pattern was exhausted.

sample posts by a made-up account, shown with each chrome's default knobs.

post cards

tokenpreviewvalue
--card-bg var(--surface)
--card-border var(--surface-border)
--card-border-width 1px
--card-radius 24px
--card-radius-sm 20px
--card-shadow var(--shadow)

your garden

profile knobs · 16 tokens the variables a profile can turn: layout, columns, banner, header, and the font scale.

every variable on this page can be overridden from a profile's custom css, and these are the ones made for it. column or masonry or grid, how many columns, whether the banner shows, how the header aligns. the token system is the design system, and every token is a creative lever.

the lever rule
a new token should make sense as something a person would want to turn. if it would not, it is a value, not a token.

paste any token into your custom css under :root to change it on your profile.

profile knobs

tokenpreviewvalue
--profile-layout column
--profile-width 700px
--profile-columns 3
--profile-gap 16px
--banner-display block
--banner-height 220px
--header-align center
--header-position static
--profile-header-bg transparent
--profile-header-padding var(--space-2xl) var(--space-xl)
--profile-header-blur 0px
--card-border-style solid
--timestamp-display block
--tags-display flex
--reactions-size normal
--font-scale 100%

153 tokens in 10 packets, read from the live stylesheet on every request. if this page is wrong, the site is wrong too.

want to grow your own? every token here can be overridden from your profile's custom css. 🌱