No.301 · Feedback· New
Blank Page Starter
The empty state of a new page: faint options under an untitled heading offer a blank page or a template, step aside the moment you type, and set a chosen template in line by line.
The prompt
Written for the variant you picked above: Light
Build the empty state of a new document page in a warm-minimal style (Inter, ink #37352f). A borderless 30–40px bold title input with tight tracking and a pale 'Untitled' placeholder, then a borderless auto-growing body textarea whose 'Start writing…' placeholder only shows when focused. Under it, a small faint label 'Begin with' and a stack of ghost options, each a 32px row in faint grey #a5a29a with a 20px glyph: '▢ Empty page' (with a tiny bordered ↵ key hint), '✎ Meeting notes', '☷ Weekly plan', '❏ Reading list'. Hovering or focusing an option gives it a 6% ink background and full ink colour; options rise in 40ms apart. Typing in the body makes the options disappear (clearing it brings them back). Choosing a template sets the title to the template name if it is empty and replaces the body with the template's lines, set in one by one (4px rise, 260ms, 40ms stagger): 20px semibold headings, • bullets, real to-do checkboxes that strike through when ticked, and plain text. A quiet 'Start over with a blank page' button follows the last line. Selected variant — Light (light): Light theme: page #ffffff, ink #37352f, muted #787774, faint #a5a29a, title placeholder #b9b6ae, hover rgb(55 53 47 / 0.06), key hint border rgb(55 53 47 / 0.12), focus and checkbox accent #2383e2. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: From the title, ↓ moves into the options and Enter starts an empty page (focus goes to the body). ↑/↓ walk the options; ↑ from the first returns to the title. Choosing a template moves focus to Start over; Start over clears everything and focuses the title. onPick reports the template id or 'empty'. Motion: Options and template lines rise 4px and fade in with a 40ms stagger. Reduced motion shows them immediately. Accessibility: The page is an article named by its title. Options are a labelled group of real buttons; checkboxes are wrapped in labels. Focus is moved deliberately after each choice and is always visible. Responsive behavior: One fluid column; the title scales with container width and long template lines wrap. Touch: Every option is a tap target; nothing depends on hover. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- From the title, ↓ moves into the options and Enter starts an empty page (focus goes to the body). ↑/↓ walk the options; ↑ from the first returns to the title. Choosing a template moves focus to Start over; Start over clears everything and focuses the title. onPick reports the template id or 'empty'.
- Motion
- Options and template lines rise 4px and fade in with a 40ms stagger. Reduced motion shows them immediately.
- Accessibility
- The page is an article named by its title. Options are a labelled group of real buttons; checkboxes are wrapped in labels. Focus is moved deliberately after each choice and is always visible.
- Responsive
- One fluid column; the title scales with container width and long template lines wrap.
- On touch
- Every option is a tap target; nothing depends on hover.