Nº 103 of 520
Creator profile with masthead
Essayist Mira Joshi: a 104px Literata name, toggleable role chips, a 3-up work strip, and a Sunday-letter subscribe row.
Preview
Use it
Free to use · credit appreciated1 Once, in your project
npx skills add SusanAcharya/Design-Lounge 2 Then ask
Using the Design Lounge skill, build "Creator profile with masthead" (piece profile-creator-masthead) in my stack. Match its brief; restyle it onto my product's theme.
No skill? Paste the brief instead. It carries the numbers, tokens and behaviour.
<!-- Design Lounge Nº 103 · "Creator profile with masthead" · designlounge.vercel.app -->
# Creator profile with masthead
> **Build brief for a coding agent.** Rebuild this piece in the reader's stack. If they haven't said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don't "improve" them.
## What it is
A profile page for a fictional Kathmandu essayist, Mira Joshi. The first frame is a paper-coloured masthead: a 13px olive kicker, a 104px Literata name, four role chips, a one-sentence italic bio, then a 3-up strip of recent work and a subscribe row for "The Sunday letter". Public Sans carries the UI. Do not use Fraunces — that is the Lounge house face. Olive is the single accent. The page should feel like the front of a slim journal, not a social profile.
## Reference behaviour
1. Initial state: chips "Essayist" and "Editor" are `aria-pressed="true"` (ink fill, paper type). "Speaker" and "Teacher" are unpressed (1px `--line` border). The email field is empty. Subscribe is enabled.
2. Click a chip: it toggles pressed independently (these are roles she claims, not exclusive filters). Pressed: `#1C1914` fill, `#F6F1E6` type. Unpressed hover: border and type go `--ink`.
3. Hover a work card: 1px border becomes `--ink`, the card lifts 3px over 320ms. Focus-visible uses the same lift plus the olive ring.
4. Submit subscribe with an empty or invalid value: the live region reads `Enter a full address.` and the field is focused. Valid pattern: one `@`, a dot in the domain, no spaces.
5. Valid submit: button label becomes `Subscribed`, class `ok` (ink fill), button and input `disabled`. Live region: `Next letter: Sunday 4 Oct.`
6. Nav "Essays" is current (1px olive underline). Index and Subscribe scroll to `#work` and `#sub`.
7. Reduced motion: durations 1ms; cards do not lift.
## Structure
```
1280 × 800
┌────────────────────────────────────────────────────────────────────────┐
│ Mira Joshi (italic 18) ESSAYS INDEX SUBSCRIBE │ 54
├────────────────────────────────────────────────────────────────────────┤
│ KATHMANDU · ESSAYS, 2019–2026 │
│ Mira Joshi (104px Literata, −0.035em) │
│ [Essayist] [Editor] [Speaker] [Teacher] chips 32px, 8px gap │
│ Long pieces on rooms, rivers… (20px italic, 48ch) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ plate 120 │ │ plate 120 │ │ plate 120 │ │
│ │ A kitchen… │ │ Keeping a… │ │ The river… │ cards 248 min │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ The Sunday letter (28px italic) │ [ email ] [ Subscribe ] │
└────────────────────────────────────────────────────────────────────────┘
Side pad 56px. Work gap 16px. Subscribe row has a 1px ink top rule.
```
… 133 more lines. Copy or download for the full brief. Loading the source…Brief
173 linesBuild brief for a coding agent. Rebuild this piece in the reader’s stack. If they haven’t said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don’t “improve” them.
What it is
A profile page for a fictional Kathmandu essayist, Mira Joshi. The first frame is a paper-coloured masthead: a 13px olive kicker, a 104px Literata name, four role chips, a one-sentence italic bio, then a 3-up strip of recent work and a subscribe row for “The Sunday letter”. Public Sans carries the UI. Do not use Fraunces — that is the Lounge house face. Olive is the single accent. The page should feel like the front of a slim journal, not a social profile.
Reference behaviour
- Initial state: chips “Essayist” and “Editor” are
aria-pressed="true"(ink fill, paper type). “Speaker” and “Teacher” are unpressed (1px--lineborder). The email field is empty. Subscribe is enabled. - Click a chip: it toggles pressed independently (these are roles she claims, not exclusive filters). Pressed:
#1C1914fill,#F6F1E6type. Unpressed hover: border and type go--ink. - Hover a work card: 1px border becomes
--ink, the card lifts 3px over 320ms. Focus-visible uses the same lift plus the olive ring. - Submit subscribe with an empty or invalid value: the live region reads
Enter a full address.and the field is focused. Valid pattern: one@, a dot in the domain, no spaces. - Valid submit: button label becomes
Subscribed, classok(ink fill), button and inputdisabled. Live region:Next letter: Sunday 4 Oct. - Nav “Essays” is current (1px olive underline). Index and Subscribe scroll to
#workand#sub. - Reduced motion: durations 1ms; cards do not lift.
Structure
1280 × 800
┌────────────────────────────────────────────────────────────────────────┐
│ Mira Joshi (italic 18) ESSAYS INDEX SUBSCRIBE │ 54
├────────────────────────────────────────────────────────────────────────┤
│ KATHMANDU · ESSAYS, 2019–2026 │
│ Mira Joshi (104px Literata, −0.035em) │
│ [Essayist] [Editor] [Speaker] [Teacher] chips 32px, 8px gap │
│ Long pieces on rooms, rivers… (20px italic, 48ch) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ plate 120 │ │ plate 120 │ │ plate 120 │ │
│ │ A kitchen… │ │ Keeping a… │ │ The river… │ cards 248 min │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ The Sunday letter (28px italic) │ [ email ] [ Subscribe ] │
└────────────────────────────────────────────────────────────────────────┘
Side pad 56px. Work gap 16px. Subscribe row has a 1px ink top rule.
<nav aria-label="Primary">— 54px. Italic Literata mark, three Public Sans links.<header class="mast">— kicker,h1,.chips(role="group"), bio paragraph.<section class="work" id="work" aria-label="Recent work">— three<a class="card">. Each: 120px CSS plate, 11px olive label, 22px italic title, 13px deck.<section class="sub" id="sub">— 2 columns. Left: title + count. Right:<form novalidate>+#msglive region.
Tokens
:root {
--paper: #f6f1e6; /* page */
--ink: #1c1914; /* name, pressed chip, rules */
--ink-2: #5c564c; /* bio, deck, nav */
--ink-3: #8a8376; /* unused tertiary */
--line: #d8d0c0; /* hairlines, chip/card border */
--olive: #3d4f3a; /* kicker, labels, subscribe, focus */
--olive-2: #2c3a2a; /* subscribe hover */
--serif: "Literata", Georgia, serif;
--sans: "Public Sans", system-ui, sans-serif;
--pad: 56px;
--nav: 54px;
--chip-h: 32px;
--plate-h: 120px;
--card-min: 248px;
--field-h: 48px;
--t: 180ms;
--t-swap: 320ms;
--ease: cubic-bezier(.2, .7, .2, 1);
--expo: cubic-bezier(.16, 1, .3, 1);
}
Typography
| Role | Family | Size | Weight | Line-height | Tracking | Case |
|---|---|---|---|---|---|---|
| Name | Literata | 104px | 400 | 0.82 | −0.035em | title |
| Bio | Literata italic | 20px | 400 | 1.4 | 0 | sentence |
| Card title / subscribe h3 | Literata italic | 22–28px | 400 | 1.15–1.2 | 0 | sentence |
| Nav mark | Literata italic | 18px | 400 | 1 | 0 | title |
| UI / body | Public Sans | 13–15px | 400–600 | 1.55 | 0 | sentence |
| Kicker / card label | Public Sans | 11–13px | 600 | 1 | +0.10–0.12em | UPPERCASE |
| Chip | Public Sans | 12px | 400 | 1 | +0.04em | title |
Motion
| Element | Trigger | Property | From → To | Duration | Easing | Notes |
|---|---|---|---|---|---|---|
.card | hover / focus | translateY, border | 0 → −3px | 320ms | --expo | |
.chip | hover / press | colour, background | line → ink | 0–180ms | --ease | |
| Subscribe button | hover | background | olive → olive-2 | 180ms | --ease | |
| Subscribe success | submit | label + fill | olive → ink | 0 | — | class ok |
Reduced motion: 1ms durations; no card lift.
States
- Chip default: transparent, 1px
--line,--ink-2type, 32px / 999px radius. - Chip hover:
--inkborder and type. - Chip pressed:
--inkfill,--papertype,aria-pressed="true". - Card default:
#FBF7EE, 1px--line. Hover/focus:--inkborder, −3px. - Email default: 48px, 1px
--line, transparent fill. Focus:--oliveborder (no extra outline besides:focus-visible). - Subscribe default: 48px, olive fill, paper type. Success: ink fill, label “Subscribed”, disabled.
- Nav current: 1px olive underline.
Accessibility
- Chips are
<button aria-pressed>insiderole="group"labelled “Roles”. - Work items are links (whole card). Plates are
aria-hidden. - Form is
novalidateso the custom message is used. Input hasaria-label="Email for the Sunday letter".#msgisaria-live="polite". - Contrast: ink on paper > 13:1;
--ink-2on paper ≈ 6.1:1; paper on olive > 8:1; olive kicker 13px / 600 on paper ≈ 6.8:1. - Hit targets: chips 32× ≥ 72px, fields 48px, cards ≥ 248px. Focus ring 2px olive, 3px offset.
Responsive rules
- ≥ 1280: as specified. Name 104px. Work 3 columns. Subscribe 2 columns.
- 900–1279: name 88px if needed to stay one line; work stays 3 columns until 900.
- < 900: name 72px. Work 1 column. Subscribe stacks; the form sits under the copy.
- < 640: side pad 20px. Chips may wrap to two lines.
Acceptance checklist
- Name is 104px Literata (not Fraunces, not Instrument Serif).
- UI face is Public Sans. Olive
#3D4F3Ais the only accent. - Four chips; Essayist and Editor start pressed; each toggles independently.
- Three work cards in one row at 1280, each with a 120px CSS plate (no photographs).
- Card titles are italic Literata 22px.
- Subscribe validates the address, announces via
aria-live, and disables the field on success. - Invalid submit focuses the input and does not disable the form.
- First 800px includes the name, chips, bio, 3-up strip, and the subscribe rule.
- Focus rings are 2px olive on chips, cards, input, and the button.
-
prefers-reduced-motion: reduceremoves the 3px card lift. - Subject is Mira Joshi, not the Lounge curator. No emoji, no placeholder copy.
Implementation notes
Do not load Fraunces. The pairing is Literata + Public Sans only:
<link href="https://fonts.googleapis.com/css2?family=Literata:ital,opsz,wght@0,7..72,400;0,7..72,500;1,7..72,400&family=Public+Sans:wght@400;500;600&display=swap" rel="stylesheet">
Chips are independent toggles, not a single-select filter:
chips.forEach((c) => c.addEventListener('click', () => {
c.setAttribute('aria-pressed', c.getAttribute('aria-pressed') === 'true' ? 'false' : 'true');
}));
Validate in JS because novalidate is on. Keep the pattern small:
const ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(input.value);
if (!ok) { msg.textContent = 'Enter a full address.'; input.focus(); return; }
The three plates, 120px tall:
- Kitchen — 165° split: olive to 38%, 2px
--line, then paper. Reads as a wall meeting a counter. - Week — vertical 18px rules on
#EFE6D2, 2px olive baseline. Reads as a ruled page. - River — radial highlight at 80% 20% plus a 135° olive-to-ink wash.
Copy is fixed: “A kitchen that faces west” (4 200 words), “Keeping a week” (Letter No. 41), “The river as a sentence” (28 min). The letter count is 4 800 readers with a thin space, not a comma.
Common mistakes: setting the name in Fraunces; using a purple subscribe pill; making chips exclusive; replacing the three plates with grey boxes; adding a photograph avatar. The masthead is the portrait.
Details
- Palette
- Type
- Literata · Public Sans
- Motion
- Subtle motion
- Build
- One session
- Tags
On the shelves