sunny-start is a simple calculator delivered as a single-page design. The product intent is narrow and explicit: one page on which a person enters numbers and arithmetic operations and reads the computed result, with no navigation to other destinations, no accounts, and no surrounding application surface. The design must be simple, and the whole experience must live on one page.
The audience is broad and casual — anyone who needs quick arithmetic, such as a student checking homework, someone splitting a bill, or a shopper tallying a cart. Because the audience is casual and the interaction is one-tap, legibility and immediate clarity of the display and keys are as important as the visual character of the page.
The visual character is deliberately poster-like rather than instrument-neutral: the calculator is treated as a printed poster that happens to do math, with the display as the headline and the keypad as stacked colour bands. This document specifies that product, its single page, its one human role, and the visual, interaction, and technical constraints that make it buildable.
sunny-start is a first-party, single-page web calculator. The entire product is one anonymously reachable page, Calculator, which is both the public entry and the only working surface. There is no sign-in, no account, no saved history, no settings destination, and no second route. A visitor opens the page, performs arithmetic, reads the result, and may continue calculating or clear the display — all without leaving the page.
The page is owned by the application and rendered by the React frontend. Arithmetic evaluation is a small, self-contained computation; the shared FastAPI backend is available as the application's API process and the MariaDB database is provisioned as application-owned storage, but neither is required to create product behavior: the calculator has no durable domain entities, no persistence requirement, and no identity requirement. The backend and database remain part of the delivered infrastructure inventory and may host the arithmetic evaluation endpoint and health checks, but they do not introduce accounts, saved calculations, or additional pages.
Current scope is exactly the one page and the arithmetic behavior described in this document. Anything beyond a simple single-page calculator — history, memory keys, scientific functions, unit conversion, accounts, sharing — is outside the current delivery boundary and is not part of acceptance.
The single page of the product, anonymously reachable, hosting the poster composition and the working calculator. It is the public entry surface and the only destination.
Information and state
Primary actions
Supporting actions and states
Domain entities
Component responsibilities
States
FR-1 — Single-page calculator delivery (explicit) As a Calculator User, I should get the whole calculator on one page, so that I can do arithmetic without navigating anywhere.
FR-2 — Simple, legible design (explicit) As a Calculator User, I should see a simple design whose display and keys are immediately readable, so that I can calculate quickly without deciphering the interface.
FR-3 — Digit entry (required_inference) As a Calculator User, I should press digit keys to build the number I want to calculate with, so that I can enter operands.
FR-4 — Decimal entry (required_inference) As a Calculator User, I should enter fractional numbers, so that I can calculate with decimals.
FR-5 — Operator selection (required_inference) As a Calculator User, I should choose an operation (÷, ×, −, +), so that the calculator knows what to do with my numbers.
FR-6 — Evaluation and result display (required_inference) As a Calculator User, I should press equals to see the computed result, so that I get my answer.
FR-7 — Clear and reset (required_inference) As a Calculator User, I should clear the calculator, so that I can start a fresh calculation or recover from a mistake.
FR-8 — Error handling and recovery (required_inference) As a Calculator User, I should be told when an operation cannot be computed, so that I am not shown a misleading number.
FR-9 — Keypress and result feedback (explicit, from creative direction) As a Calculator User, I should feel each key press and see the result arrive, so that the calculator feels responsive and poster-like.
prefers-reduced-motion, all motion is disabled and the static poster remains fully usable.Product context. A casual, broad-audience visitor — a student checking homework, someone splitting a bill, a shopper tallying a cart — who arrives at the single Calculator page with a small piece of arithmetic to do and no interest in setup, accounts, or navigation.
Primary goal. Enter numbers and an operation and read the correct result quickly, on one page, without leaving it.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which numbers to enter, which operation to apply, when to press equals, and when to clear. The user decides when a calculation is complete and whether to chain another operation onto the result.
Interactions with other participants. None. The calculator has a single human role; there is no counterparty, recipient, or approver. The only other actors are the application itself (rendering the page and evaluating arithmetic) and the provisioned backend/database infrastructure, which do not interact with the user directly.
Observable success. The display shows the correct result after equals, the page never navigates away, and the user can immediately begin another calculation or clear the display.
What makes this role distinct. The role's entire work is a tight, repeated loop of entry → operation → result → clear, performed anonymously on one page. There is no persistent state, no history to manage, and no cross-participant handoff — the role is defined by speed and legibility rather than by any administrative or collaborative responsibility.
0, and the hard-edged keypad with the red operator column and full-width red equals bar.0 and start again.Failure/recovery. If the user presses a second decimal point in the same operand, it is ignored. If the user presses a different operator before entering a second operand, the pending operator is replaced. If the user presses equals without a complete expression, the display is left unchanged or repeats the last result.
0, the pending expression and operator are discarded, and any error state is removed.0 state, or presses a digit key to start a fresh operand.prefers-reduced-motion enabled.The creative direction is authoritative for this section: the muse is Paula Scher, and the headline idea is "Calculator as poster: type that fills the frame, keys as colour blocks."
Mode. Dark mode only.
Colour tokens (exact hex, by role).
#111111 — dominates roughly 60% of the frame.#1C1C1C — dark digit keys and panel surfaces.#F5F1E8 — cream, carrying all numerals and labels at high contrast.#E63A24 — Scher red; owns the right-hand operator column and the equals bar.#F2C230 — poster yellow; the band behind the display header and the clear key.#8A857B — warm grey, only for secondary labels and hairline rules.No gradients. Every colour is a flat field meeting another at a hard edge. Blue and indigo are forbidden anywhere in the palette.
Typography.
-0.02em, stacked and occasionally rotated 90° along the left edge as a poster gesture.clamp(56px, 12vw, 160px); live display clamp(48px, 9vw, 120px); key glyphs clamp(22px, 4.5vw, 34px); labels 12–14px uppercase tracked +0.12em; body 16px/1.5.Shape language. Hard edges only — zero border radius on keys, display, and bands. Keys are solid rectangles separated by 2px black gutters so they read as a printed grid. Diagonal colour bands slice across section boundaries at −8°. Thin 1px cream rules under labels. No shadows, no glass, no rounded pills.
Layout. A single centred column capped at 480px on mobile and 900px at desktop, set inside a full-bleed poster: an oversized Anton wordmark "SUNNY / START" stacked at top-left bleeding off the left edge at 1280px, a rotated vertical caption along the right margin, and the calculator as a cream-ruled panel on the ink ground. The keypad is a 4×5 modular grid: digits in a three-wide column of dark keys, operators in a single Scher-red column, zero spanning two cells, equals as a full-width red bar. At 375px the poster chrome collapses to the wordmark alone above the panel; at 768px the rotated caption appears; at 1280px the wordmark bleeds and the panel gains generous surrounding space.
Imagery. Typography is the image. No photography, no illustration, no icons beyond flat geometric operator glyphs (÷ × − + =) drawn as thick strokes. A single halftone-dot texture may sit at 8% opacity inside the display band for print-poster grain.
Accessibility. All readable text and controls stay whole inside the viewport and their containers at 375px, 768px, and 1280px; the cream-on-ink and cream-on-red pairings maintain high contrast; motion is fully disabled under prefers-reduced-motion.
The public entry is a full-bleed ink-black poster that computes. Its dominant element is an oversized Anton "SUNNY START" wordmark stacked in two lines at top-left, bleeding past the left viewport edge at desktop scale (up to 160px). The live calculator display panel — a cream-ruled rectangle on black — physically overlaps the wordmark's lower-right corner, and its huge Anton numerals are the second-largest type on screen. A solid Scher-red vertical band runs the full height of the right margin behind the operator column, colliding with a yellow horizontal band that underlines the wordmark. The keypad sits below as a hard-edged grid, with equals as a full-width red bar like a printed rule that also computes.
There is no centred headline, no subtext, and no call-to-action button — the composition is a printed poster whose only interaction is arithmetic. The signature moves are: the bleeding stacked wordmark, the display panel overlapping its corner, operators living in a single full-height red column rather than reading as buttons, the full-width equals bar, the 120ms yellow colour-block wipe on result updates, and the rotated 90° vertical caption in the right margin at 768px and above.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
0; the red operator column and yellow clear key already in place; the yellow band underlining the wordmark.prefers-reduced-motion, leaving the static poster fully assembled and the calculator fully usable.clamp(...) to fit; no element covers any part of readable text or a control.prefers-reduced-motion, all motion is disabled and a usable static arrangement is provided.#F5F1E8 on ink #111111 and on Scher red #E63A24 must remain high-contrast for numerals and labels.backend, database, and frontend services as the runnable inventory.0.#E63A24 used for operators and equals.#F2C230 used for the display header band and clear key.
0

0
No comments yet. Be the first!