Content 1
For everything you read.
Brand assets
The mark, the colours and the rules. Copy or download anything here.
Still being drawn. Current, not final.
01
Seventeen colours, all grown from one seed.
oklch(0.255 0.0233 230.47)Every other colour is a formula against that one. Change the seed and all seventeen move with it, and the cells beside the title say whether they still read.
Seven shades of the same deep blue-grey. Any of them works as a background. Three at a time is plenty.
For everything you read.
Four colours at the same brightness, so none of them shouts. Give them a little space and they get along.
The brightest thing here, named after the flash of a rabbit's tail. It has exactly one job: the mark on a primary badge. Never text.
The familiar four. Here for reference, not decoration.
The brightest thing in the system, named after the flash of a rabbit’s tail. The ring around this panel is it.
Never text. On a primary fill it is a logotype allowance and nothing more.
Need something quieter, or a hover state? Turn one of these down rather than reaching for a new colour.
Muted is the one place the contract does not hold: AA-large at best. Captions and metadata only, and keep it off the lightest two shades.
Every colour, and the move that made it, drawn as it happens.
Status colours: the hue is a convention, not a derivation
Surfaces: the seed, lightened and darkened
02
It is a rabbit nose, not a rabbit head.
The Y of a rabbit's philtrum is the whole logic. Reduce it, mirror it, thicken it into an inner curve, then let a lower curl carry the whisker pad.
Design from the nose first. The ears are only ever a hint.
03
Most of the time it is just the mark, one colour, on whatever it sits on.
Two mirrored strokes. Single-colour, so its ink follows whatever it sits in. No light and dark version to keep in sync.
lilbunnyrabbit.mark.v6.wip.svg
Five combinations. The first is the one you want almost every time.
foreground In navigation and other chrome, beside the wordmark.primary Anywhere the mark should read as the brand.background On a light or white ground, where primary would vanish.It is a thin mark. Worth a look before it ends up in a favicon.
How much space it needs around it, and how small it may go. Provisional: these are the defaults, not measured.
In greyscale and all three kinds of colour blindness, the badge shifts by at most 0.00. The two colours differ in brightness, not hue.
04
No wordmark asset. The name is set in Hack, the face every value on this page is set in, so the lockup is a layout rule, not a drawing.
lilBunnyRabbit
Horizontal. Mark, gap, name, centred on the mark. The name at 42% of the mark's height, Hack 700, tracked -0.02em. Both parts are the foreground, so it goes on every shade unchanged.
The horizontal lockup at four sizes. Below about 32px the name stops being readable before the mark stops being recognisable, so that is where the mark goes on alone.
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
11 other arrangements of the same two objects. The only difference between any two is the thing being compared.
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunnyRabbit
lilBunny
Rabbit
lil
Bunny
Rabbit
05
Two faces. One for reading, one for values.
Aa
Everything you read. Headings, body, labels.
Dark is the brand.
Light is what you reach for when a product surface needs it.
Aa
Every value: hexes, formulas, ratios, token names. And the wordmark.
lilBunnyRabbit
1 − L · C ÷ 3 · H + 180°
06
Front and back. Nothing fancy.
lilBunnyRabbit
Andraž
Your job here
lilBunnyRabbit
Andraž
Your job here
lilBunnyRabbit
Andraž
Your job here
85 × 55 mm with 3 mm bleed. Contact details are placeholders.
07
A short list. Most of it comes down to one thing: the brand colours are all the same brightness, so they disappear against each other.
Don't. Brand colours touching. Roughly 1:1, so the edges vanish.
Do. Separated by a gap of the page shade.
Light mode is UI only.
Use it when a product surface needs it. Never for brand recognition, marketing, the app icon or social cards. Those are always dark.
Nothing brand-coloured on white.
Dark’s colours on white vanish: primary is 2.23:1 and cottontail 1.14:1. White is the top rung of the LIGHT ladder — that is where the tint runs out — and the light palette is what goes on it. Nothing from the dark palette ever does.
No two brand colours adjacent or layered.
They are all the same brightness, so side by side they blur into one shape. A gap or a border fixes it.
No gradients between brand colours.
Same brightness means the gradient has nowhere to travel, and it comes out muddy. Between two shades is lovely.
No white text on a brand fill.
White on primary is 2.23:1. Use background #17252c and you get 6.55 to 7.06 instead.
Do not add colours.
Whatever seems to be missing is either a shade or an existing colour turned down.
Do not re-tint the greys.
The backgrounds are blue and the brand is green on purpose. Leave them be.
No more than three shades per viewport.
Neighbours are only about 1.1:1 apart, so a fourth one stops reading as structure.
Muted text is for captions, not content.
At 65% it is 3.75:1 on the page and 2.94 on the lightest shade. Fine for a caption, not for anything important.
Do not “fix” the logo’s contrast.
The bright badge is 1.96:1 on purpose. Logos are exempt (WCAG 1.4.3, 1.4.11). No stroke, no shadow, no lighter green.
Every tile below is the real SVG with one CSS declaration on it. No broken copy of the logo exists in this repo, so none of these can go stale when the mark changes.
08
It exists because interfaces need it. It is not the brand.
Every dark token has a twin here: same name, same job, same position. Nothing rebinds and no component gets a variant. That does not make them interchangeable. Dark is the brand. Light is what you reach for when a product surface needs it. If someone will recognise the mark from it, it should be dark.
09
Same names, same groups, same order. Only the guarantee splits on paper: text clears AA on every shade, brand and states clear AA on the page and the surface and 3:1 on the rungs below.
Seven shades of warm paper, white down to soft sand. The top rung is white because that is where the tint runs out, not because anyone picked it; the page is the fourth. Same job as the dark seven: pick one and build on it.
For everything you read. Solved to an 8:1 body ratio, a step darker than the dark text on purpose: on paper the text alone decides how deep the ladder goes.
The same four ranks, re-solved for a warm ground and sat a step above the text. The loud one turned orange on the way over. That story is further down.
The one token that changed job. Here it is a UI colour: a focus ring, a marker, a chart highlight. Never text, and never the logo.
The familiar four, darkened until they sit on paper.
The same token on paper. It pops by chroma here rather than brightness, and it lost one job on the way over. The ring around this panel is it.
A UI colour only. Never text, and never the mark.
10
Everything else is a twin. The primary changed hue. That was measured, not chosen.
Distance from the page’s own darkened form. Further is better: the colour reads as ink on the paper instead of a tint of it.
So the light mode is fitted to its own ground rather than inheriting dark's wheel. Of dark's four brand relationships, one came along unchanged. Three could not.
accent primary − 72° kept
Dark’s own offset, on the other side of primary. Still legal here.
tertiary primary + 54° moved
Dark’s tertiary is the midpoint of primary and the ground. On a warm page that arc is spoken for, so it takes the one arc paper leaves open: the midpoint of the text and accent hues, 302°, 36° from each.
secondary primary + 180° moved
The complement of orange is blue, and blue is already info. Moved to the midpoint of success and info, 190°, 50° clear of both.
warning hue 70° moved
70° sits 16° from the page hue. Moved to the midpoint of the page and success, 113°, 27° clear of both. A green-gold, forced rather than chosen.
11
The same five combinations, in the light palette.
The bright badge is the one that reads better here: the same pale ears measure 6.06:1 on the orange disc against 1.96:1 in dark, so on paper it needs no exemption. Do not swap the ears for the light cottontail — that pair is invisible. When you cannot control the reproduction, use the neutral pair.
12
Every number above is transcribed from a Chromatics scheme. This is that scheme, running.
13
Grab the palette however you need it. Every format carries both modes.
/* dark */
:root,
[data-theme='dark'] {
--brand-background-lightest: #2a404a; /* background.shift({ l: span, c: span_c }) */
--brand-background-lighter : #243740; /* background.shift({ l: span * 2/3, c: span_c * 2/3 }) */
--brand-background-light : #1d2e36; /* background.shift({ l: span / 3, c: span_c / 3 }) */
--brand-background : #17252c; /* OKLCH(0.255, 0.0233, 230.47) — the seed */
--brand-background-dark : #111d23; /* background.shift({ l: -span / 3, c: -span_c / 3 }) */
--brand-background-darker : #0b1519; /* background.shift({ l: -span * 2/3, c: -span_c * 2/3 }) */
--brand-background-darkest : #060d11; /* background.shift({ l: -span, c: -span_c }) */
--brand-foreground : #b1aba8; /* OKLCH(1 - bl, c / 3, (bh + 180) % 360) */
--brand-tertiary : #9eb1ac; /* OKLCH(foreground.l, c * 1, (primary.h + bh) / 2) — the midpoint of the legal arc */
--brand-secondary : #b2a6c5; /* OKLCH(foreground.l, c * 2, (primary.h + 180) % 360) */
--brand-primary : #a4b483; /* OKLCH(foreground.l, c * 3, (foreground.h + 72) % 360) */
--brand-accent : #dc9b76; /* OKLCH(foreground.l, c * 4, foreground.h) */
--brand-cottontail : #e3f9b2; /* primary.atLightness(top).atChroma(maxChroma(top, primary.h) * 0.60) — top = foreground.l + span * 2 */
--brand-success : #7ac26a; /* OKLCH(foreground.l, c * 6, 140) */
--brand-warning : #e49b39; /* OKLCH(foreground.l, c * 6, 70) */
--brand-error : #f88876; /* OKLCH(foreground.l, c * 6, 30) */
--brand-info : #49b7fb; /* OKLCH(foreground.l, c * 6, 240) */
}
/* light */
[data-theme='light'] {
--brand-background-lightest: #ffffff; /* OKLCH(top + up, maxChroma * tint, light_bh) — white: at L 1 there is no chroma to hold */
--brand-background-lighter : #fcf9f3; /* OKLCH(top + up * 2/3, maxChroma * tint, light_bh) */
--brand-background-light : #f9f3e7; /* OKLCH(top + up / 3, maxChroma * tint, light_bh) */
--brand-background : #f6eddb; /* OKLCH(foreground.l + span * 2, maxChroma * tint, (foreground.h + primary.h) / 2) — the page */
--brand-background-dark : #ebd9b1; /* OKLCH(top - light_span / 3, maxChroma * tint, light_bh) — the surface */
--brand-background-darker : #dec58e; /* OKLCH(top - light_span * 2/3, maxChroma * tint, light_bh) */
--brand-background-darkest : #cab380; /* OKLCH(top - light_span, maxChroma * tint, light_bh) */
--brand-foreground : #414754; /* OKLCH(page.complement().xyy.setLuminance((page.Y + 0.05) / 8 - 0.05).ok_l, c, light_bh + 180) — an 8:1 body */
--brand-tertiary : #5f5968; /* OKLCH(light_bl, u * 1, (light_foreground.h + light_accent.h) / 2) */
--brand-secondary : #376662; /* OKLCH(light_bl, u * 2, (h_success + h_info) / 2) — +180 lands on info, so the teal arc instead */
--brand-primary : #7f4e32; /* OKLCH(light_bl, u * 3, foreground.h) — the seed’s complement: orange */
--brand-accent : #814370; /* OKLCH(light_bl, u * 4, foreground.h − 72) */
--brand-cottontail : #9c4800; /* light_primary.atLightness(light_foreground.l + up * 2).atChroma(maxChroma()) — pops by chroma, not lightness */
--brand-success : #1c6f00; /* OKLCH(light_bl, u * 6, 140).gamutMap() */
--brand-warning : #5d6200; /* OKLCH(light_bl, u * 6, (light_bh + h_success) / 2).gamutMap() — green-gold; 70 sits 16° from the page hue */
--brand-error : #a12c1f; /* OKLCH(light_bl, u * 6, 30) */
--brand-info : #0063a0; /* OKLCH(light_bl, u * 6, 240).gamutMap() */
}
/* Fixed asset colour. Identical in both modes. */
:root {
--brand-mark-ears: #e3f9b2;
}
Source SVGs live in the repo: lilBunnyRabbit/brand/tree/master/src/lib/brand/logos.