Design Lounge
Install

Nº 319 of 520

Newsletter close

The last line of a note, then a band: The evening list, one Sunday letter, an email field, and Join. A bad address stays on the page.

Preview

Open full size
1280 × 800 · 3.3 KB · 76 lines

Use it

Free to use · credit appreciated

1 Once, in your project

npx skills add SusanAcharya/Design-Lounge

2 Then ask

Using the Design Lounge skill, build "Newsletter close" (piece newsletter-close-band) 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.

Brief

185 lines

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. When a kit is locked, Join is the one solid button and the band colour is --surface. The mid-article fold is newsletter-fold-inline. This band closes the page.

What it is

The end of a note, then the ask. The note says “That is the evening.” in 48px serif, with one sentence under it. The band is a full-width surface with a hairline on top. Inside the same 720px column: “The evening list”, the promise of one Sunday letter, an email field, and Join. An empty or broken address shows “Use a full address.” under the field and does not submit. A full address hides the form and the promise, and the line “You are on the evening list.” takes their place. The band stays. It is not a toast, and it is not a fold in the middle of an essay.

Reference behaviour

  1. The first frame shows the closing title, the lead, the band, the empty field, and Join.
  2. Submit with an empty field, or a value that is not a full address, sets aria-invalid, shows the error, and moves focus to the field. Join still says Join.
  3. A full address has one @ and a dot in the domain. ada@press.mail qualifies. ada@press does not.
  4. A valid submit hides the form and the promise. The heading stays. The done line reads “You are on the evening list.”
  5. There is no second field, no name, and no checkbox.
  6. There is no animation. Focus ring is 2px --focus, offset 2px.
  7. The error is under the field. It is not a toast.

Structure

padding 64px, column max-width 720
That is the evening.         48px
The note ends here. The list, if you want it, is under this line.
band, full width, hairline top, padding 28px 64px
  column 720
    The evening list          28px
    One letter on Sunday...
    [ email ] [ Join ]        40px
    Use a full address.       hidden until invalid
    You are on the evening list.   hidden until valid
  • The band is a section labelled Evening list.
  • The field’s accessible name is Email.
  • The error uses an id the field points at with aria-describedby.

Tokens

:root {
  --bg: #f4efe6;
  --band: #f7f3ea;
  --ink: #241c16;
  --ink-2: #5c5148;
  --line: #ddd4c6;
  --line-strong: #c9bfb2;
  --primary: #3f5c4b;
  --primary-ink: #fffdf8;
  --danger: #9b2c2c;
  --focus: #3f5c4b;
  --serif: "Newsreader", Georgia, serif;
  --sans: "Public Sans", system-ui, sans-serif;
}

Join is the one solid button. Radius is 2px. The family replaces the radius and the 40px height. The band background becomes --surface when a theme is locked. Do not keep this cream on a dark theme.

Typography

RoleFamilySizeWeightColour
Close titleserif48px500--ink
Leadsans16px400--ink-2
Band titleserif28px500--ink
Promisesans16px400--ink-2
Fieldsans14px400--ink
Buttonsans13px500--primary-ink
Errorsans12px400--danger
Doneserif22px500--ink

The close title is the largest type. The band title steps down. The done line is smaller than the band title, because the ask has been answered. The lead measure is about 42 characters. The promise is about 46.

Motion

None. Success replaces the form in one frame. Reduced motion has nothing to remove. Do not slide the band.

ThingTriggerWhat changes
Bad submitclickerror, invalid field, focus returns
Good submitclickform and promise hide, done line shows
Focuskeyboard2px ring

States

  • Field resting: height 40px, padding 0 12px, radius 2px, 1px --line-strong, white fill.
  • Field invalid: border --danger, error visible.
  • Join: height 40px, padding 0 14px, fill --primary, text --primary-ink. The only solid.
  • Error: 12px --danger, under the field, hidden until a bad submit.
  • Done: 22px serif, hidden until a good submit. The band heading remains.
  • Focus-visible: 2px outline, offset 2px.
  • Do not add a second button. A person who does not want the letter does nothing. There is no dismiss on a band that is the end of the page.

Accessibility

  • The section name is Evening list.
  • The field name is Email. The placeholder is not the label. aria-label supplies the name because the band title is the heading, not the field label. A product may use a visible label instead. Do not leave the field with only a placeholder.
  • The error is tied with aria-describedby and aria-invalid.
  • A bad submit returns focus to the field.
  • Hit target: the field and Join are 40px. On a phone, at least 44px.
  • Contrast: #fffdf8 on #3f5c4b and #9b2c2c on #f7f3ea clear 4.5.
  • The done line is in the page, so it is read where the form was. It does not need a toast.

Responsive rules

  • At 1280 the column is 720px. The band is full width. The words and the form sit in that column, padding 64px.
  • Below 640 the form stacks. The field is full width. Join stays 40px tall and can be full width. The close title may step down to 36px and stays the largest type.
  • Do not pin this band over the page while the person is still reading. It is the close, after the note. A sticky mobile bar is cta-sticky-mobile-bar.
  • Another screen in the same pass uses the same 720px column for its text.

Acceptance checklist

  • The close title is “That is the evening.” at 48px.
  • The column is 720px. The band is full width with a hairline on top.
  • The band title is The evening list. The promise names Sunday and says there is no second list.
  • Join is the only solid button, #3f5c4b with #fffdf8 text, 40px tall.
  • An empty submit shows “Use a full address.” and does not hide the form.
  • ada@press is invalid. ada@press.mail succeeds.
  • Success hides the form and the promise and shows “You are on the evening list.”
  • The error is under the field, not a toast.
  • Focus ring is 2px, offset 2px.
  • There is no name field, no checkbox, and no animation.

Implementation notes

Test the address before hiding the form.

const ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.value);
if (!ok) { email.focus(); return; }
form.hidden = true;

Hide with the hidden attribute.

Common mistakes:

  • A fold in the middle of a paragraph. That is newsletter-fold-inline, and its sentence is “You’re on the list.” Do not reuse that sentence here.
  • A footer of link columns with a small email jammed in. That is footer-newsletter-split when the footer is the piece. This band is the close of a note.
  • Two solid buttons.
  • A toast on success, so the person loses the confirmation when it vanishes.
  • Accepting ada@press as a full address.
  • A checkbox for a second list after the promise said there is not one.
  • A gradient band.
  • Pinning the band to the viewport on a long essay.

Where it sits in a product:

  1. Put it after the last paragraph, once.
  2. The mid-article version is the other newsletter piece. Do not stack both on one essay.
  3. Join is the one primary on this view. The note above has no second button.
  4. The column is the pass column, 720px.
  5. Height and radius follow the family.
  6. When a theme is locked, Join uses --primary and --primary-ink, and the band uses --surface.
  7. The error uses --danger. Do not use the brand red as the error if the theme has a danger token.
  8. One letter, one list. Do not add a frequency toggle.
  9. The close title is the largest type on the view.
  10. Keep the credit line on the token block.

Rebuild order:

  1. Set the paper, Newsreader, and Public Sans.
  2. Place the close title and the lead in the 720px column.
  3. Place the full-width band and the same column inside it.
  4. Place the field and Join.
  5. Wire a bad address to the error.
  6. Wire a full address to the done line.
  7. Map the button and the band onto the kit.

Copy you keep:

  1. That is the evening.
  2. The note ends here. The list, if you want it, is under this line.
  3. The evening list.
  4. One letter on Sunday. No second list, and no offer beside the letter.
  5. Use a full address.
  6. Join.
  7. You are on the evening list.

Details

Palette
Type
Newsreader · Public Sans
Motion
Static
Build
Quick build
Designed bySusan AcharyaKathmandu

Studied

Mendo

Paper, type, and the object. The shop stays quiet.

All sources