Me Gorgeous sells cosmetics and multicultural hair care since 2007. This is the visual system for megorgeous.nl and megorgeous.eu: logo and mark, color, typography, buttons and forms, and the tokens as code. Every combination shown passes WCAG 2.2 AA. A baseline for the next design pass, not a final identity.
One asset, used on both shops: the red wordmark with the knocked-out U and the letterspaced Cosmetic and Hair subtext. The U block is the ownable detail, it comes back in display typography.
The knocked-out U is the wordmark’s most recognizable piece, so it becomes the compact mark for every place the full logo does not fit: favicon, social avatars, app icon, packing slips.
The ramp is drawn from the logo artwork. Red 500 is the brand seen big, Red 600 is the same red made accessible for buttons and text, Red 700 handles hover states and text on tints. Neutrals are warm so they sit well next to it. Ratios are WCAG 2.2 contrast. AA means it passes for normal text; large text, 24 px and up or 19 px bold, needs 3:1.
The logo red. Display headlines from 24 px, illustration, accents. Too light for small text.
The working red. Buttons, links, sale prices, any red text below 24 px.
Hover and active states, red text on Blush badges.
Tinted panels, sale badges, campaign cards. Already in use on both shops.
Page and section background.
Cards, product tiles, the header. The logo always sits on White, Paper or Blush.
All reading text and the footer background, on both shops.
Secondary text, old prices, captions. Warm, and passes AA on White, Paper and Blush.
A shop needs more than brand color: stock states, delivery promises, form feedback. Two pairs and one rule.
Stock and delivery promises, USP checks, success toasts. One green for text and icons, one tint for panels.
Low stock, delayed delivery, notice panels.
No new color. Field borders in Red 600, message text in Red 700, always with an icon. Never plain brand red alone, otherwise errors and sale styling blur.
Primary action white on Red 600, hover Red 700, sale price Red 600 next to Gray 600, badge Red 700 on Blush, footer white on Ink, links Red 600 underlined. Every combination passes AA.
Optima Nova carries the wordmark’s flared letterforms into headings, the wordmark itself is set in Optima Bold. Display only. Inter does everything else: body, navigation, prices, forms. The whole system is three variants, nothing more.
Optima Nova, semibold. Headings and display only, in Ink or Red. One cut, one weight, by design. Never synthesize bold or light. The white U on a red block is the wordmark’s detail and may return in display headlines, never in running text.
Regular 400 carries all reading text at 16 px over 1.5 line height. Semibold 600 does everything that needs weight: buttons, prices, labels, eyebrows, emphasis. No bold, no italics. Self-hosted on .nl today, keep it that way.
Inter 400 · 600, latin subset, woff2
All amounts in Inter 600. Old price Gray 600 with strikethrough, sale price Red 600, regular price Ink, red never marks a regular price. In carts, totals and tables set font-variant-numeric: tabular-nums so amounts align. Dutch notation: euro sign, non-breaking space, comma decimals.
One button for both shops, states defined. Every interactive element gets the same focus ring and a 44 px touch height.
The book as code. The Tailwind block drops into the Hyvä theme on .nl, the CSS variables cover everything custom. Spacing stays on the 4 px scale, radius is 4 for badges and 8 for the rest. One shadow, for the sticky header once it is scrolled and for the search panel. The page behind the search panel dims with the scrim.
:root {
/* color */
--red-500: #E64938; /* logo red, display text from 24 px, accents */
--red-600: #D52D1B; /* buttons, links, sale prices */
--red-700: #A32214; /* hover, text on blush, error messages */
--blush: #FBE5E4;
--paper: #FAF9F7;
--white: #FFFFFF;
--ink: #212121; /* reading text, footer bg */
--gray: #6E6963; /* secondary text, old prices */
--line: #E9E2DB; /* decorative hairlines only */
--border: #958E86; /* input borders, 3.2:1 on white */
--success: #2A6F47; --success-tint: #E3F2E8;
--warning: #92400E; --warning-tint: #FEF3C7;
/* type, three variants: display 600, body 400, strong 600 */
--font-display: 'Optima Nova', Optima, Candara, sans-serif;
--font-body: Inter, 'Helvetica Neue', Arial, sans-serif;
--weight-body: 400; --weight-strong: 600; --weight-display: 600;
--text-display: 39px; --text-h1: 31px; --text-h2: 25px;
--text-h3: 20px; --text-body: 16px; --text-small: 13px;
/* shape and space, 4 px scale */
--radius-badge: 4px; --radius-ui: 8px; --radius-pill: 999px;
--space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
--space-6: 24px; --space-8: 32px; --space-12: 48px; --space-16: 64px;
--focus-ring: 0 0 0 2px var(--white), 0 0 0 4px var(--red-600);
--shadow-header: 0 8px 24px rgba(33,33,33,.06); /* the only shadow: the sticky header once scrolled, the search panel and the minicart */
--scrim: rgba(33,33,33,.32); /* Ink at 32 percent, dims the page behind the search panel and the minicart */
}
colors: {
primary: { lighter: '#E64938', DEFAULT: '#D52D1B', darker: '#A32214' },
secondary: { lighter: '#FAF9F7', DEFAULT: '#6E6963', darker: '#212121' },
background: '#FAF9F7',
blush: '#FBE5E4',
line: '#E9E2DB',
scrim: 'rgba(33,33,33,0.32)',
success: { DEFAULT: '#2A6F47', tint: '#E3F2E8' },
warning: { DEFAULT: '#92400E', tint: '#FEF3C7' },
},
boxShadow: {
header: '0 8px 24px rgba(33,33,33,.06)',
},
fontFamily: {
sans: ['Inter', 'Helvetica Neue', 'Arial', 'sans-serif'],
display: ['"Optima Nova"', 'Optima', 'Candara', 'sans-serif'],
},
Adoption on .nl is one PR: merge the block above into the Hyvä theme’s tailwind.config.js, and buttons, links, sale prices, badges and the footer pick the system up through the primary, secondary and blush utilities.