marine-calculator is a simple calculator delivered as a single page. The product intent is narrow and complete: a person opens one page, enters numbers and arithmetic operators, sees the current input/expression and the computed result, and can clear the calculator to start a new calculation. There is no account, no navigation, no saved history, and no second screen.
The audience is anyone who needs quick everyday arithmetic — students, shoppers, freelancers, kitchen-table budgeters — and who wants a calm, legible instrument rather than a consumer-electronics keypad. The design register is warm editorial: a cream paper page, ink type, a single rust operational accent, and a calculator card that reads like a well-set page in a good book.
This document is the System Requirements Document for the product; it specifies the single page, its behavior, its visual system, and the delivery boundary.
The product is one anonymous, publicly reachable page named Calculator. It is the whole product: the page hosts the display zone (running expression and result), the keypad (digits, operators, equals, clear), and the small decorative marks that give the card its printed feel.
Delivery is first-party custom UI. The page requires no identity, no sign-in, no session continuity, and no persisted user state; a calculation lives only in the page while it is open. Because no accepted behavior creates a durable relationship, entitlement, or value transfer bound to a person, application-owned identity is not introduced. There is no account creation, no login, no profile, and no history feature.
The page is served by the React frontend. Evaluation of entered arithmetic is a page-local interaction; the shared FastAPI backend and MariaDB remain provisioned infrastructure and are not required to carry calculator state or results. Nothing in the accepted requirements asks the backend to store calculations, and the provisioned database alone does not justify domain entities or persistence.
Current scope is exactly the single Calculator page and its arithmetic entry, display, evaluation, and clear behavior. Nothing beyond that is current.
Removed from scope
Not applicable — no reference directive declares content_source.
The single page of the product, anonymously reachable, with no identity requirement. It is a centred single column: cream paper ground across the viewport, one lifted-paper calculator card (max-width 460px on desktop, edge-to-edge with 16px side padding at 375px), generous cream margins around it (at least 64px vertical breathing room at 1280px).
Information and state
EXPRESSION (12px, 600, +0.12em tracking, muted) above the running expression in Literata 400, muted ink, clamp(18px, 2.4vw, 24px). Empty state shows a muted placeholder dash or zero-length expression line that holds its height so the layout does not jump.RESULT above the result numeral in Literata 600–700, ink, right-aligned like a ledger figure, clamp(44px, 9vw, 88px). Initial state displays 0. The result never wraps out of its container; at 375px it drops to 44px.÷, ×, −, +) stacked in a rust-tinted right column as rust type on cream; equals as a tall solid rust block spanning two rows with cream Literata type; a full-width C key beneath in ink outline. Keys are 10px-radius rectangles with 1px ink borders on cream, no gloss, no pills, at least 56px tall at 375px. Keypad numerals in Work Sans 500, clamp(20px, 2.6vw, 26px).C returns to normal entry.Primary actions
= to evaluate the expression and show the result.C to clear the expression and result and return to the initial 0 state.Supporting actions and states
:active.Domain entities
Component responsibilities
States
0, expression empty.0.= produces a result that fades in and is displayed right-aligned.C recovers.C always returns the page to the initial state.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 — Enter numbers and arithmetic operators (explicit) As a Calculator User, I should enter numbers and arithmetic operators, so that I can build the calculation I want.
÷, ×, −, +.= (FR-4) or C (FR-5).FR-3 — See the current input/expression and the computed result (explicit) As a Calculator User, I should see both the current expression and the computed result, so that I can check what I entered and read the answer.
EXPRESSION and RESULT.C recovers.FR-4 — Evaluate the expression (explicit)
As a Calculator User, I should press = to compute the result of my expression, so that I get the answer.
FR-5 — Clear the calculator (explicit) As a Calculator User, I should clear the calculator, so that I can start a new calculation.
C key.0.C also clears an error state, returning the page to the initial state.Product context. A person who needs quick everyday arithmetic — a student checking homework, a shopper totalling a basket, a freelancer adding up hours, a household budgeter at the kitchen table. They arrive at the page with a number in mind and no patience for setup. The product is a single page with no account, no onboarding, and no navigation; the calculator card is the entire experience.
Primary goal. Get a correct arithmetic answer quickly and legibly, and be able to start over cleanly.
Distinct accepted responsibilities.
= to evaluate (FR-4).C to clear and start a new calculation (FR-5).Relevant inputs and decisions. Which digits and operators to enter, when the expression is complete enough to evaluate, and whether to continue from the result or clear and start fresh.
Interactions with other accepted participants. None. The Calculator User is the only active human participant; there is no counterparty, recipient, or approver. Evaluation is page-local and produces no state for anyone else.
Observable success. The result numeral appears right-aligned in the result zone, set in oversized Literata, matching the entered expression; C returns the page to 0 and an empty expression.
What makes this role distinct. The work is a single continuous, private, ephemeral interaction with one instrument — no identity, no handoff, no durable record. The persona's value is speed and legibility, not collaboration or persistence.
EXPRESSION label with an empty expression, RESULT label with 0, the wavy rule, and the keypad. No sign-in is requested.÷, ×, −, +) in the rust-tinted right column. The operator appears in the expression after the entered number.= again, or press C to clear (Flow B). Closing the page ends the calculation; nothing is saved.Failure and recovery. If the expression cannot be evaluated (for example division by zero), the result zone shows a short plain-language message instead of a numeral, the expression stays visible, and the calculator remains usable. Pressing a digit or C returns the page to normal entry.
C key beneath the keypad.0; any error message is removed.Muse and headline. Warm editorial arithmetic after Frank Chimero — a calculator that feels like a well-set page in a good book, not a piece of consumer electronics.
Mode. Light only. The page is paper cream throughout; there is no dark mode variant.
Colour tokens (exact hex, by role)
| Role | Hex | Use |
|---|---|---|
| Background | #F4EBDD | Cream paper ground across the whole page |
| Surface | #FBF5EA | Calculator card |
| Text | #231F1A | Ink — all numerals, reading text, key borders, hairline |
| Primary | #B5502F | Rust — equals key fill, operator type, focus ring, tally stroke |
| Accent | #C98A2E | Mustard — hand-drawn rule flourishes, active-press tint, tally stroke |
| Muted | #8A7E6E | Labels, hairline rules, secondary metadata, running expression |
No blue or indigo anywhere. No gradients, no glass, no frosted panels.
Typography
EXPRESSION, RESULT), 400/500 for body.clamp(44px, 9vw, 88px); expression line clamp(18px, 2.4vw, 24px); wordmark 20px; keypad numerals clamp(20px, 2.6vw, 26px); labels 12px uppercase; body 16px/1.6.Shape language. Soft printed-paper geometry: the calculator card has a 14px radius, a 1px ink hairline, and no drop shadow — depth comes from a single offset cream shadow line, like a page lifted off another page. Keys are 10px-radius rectangles with 1px ink borders on cream, no gloss, no pills. One hand-drawn wavy SVG rule (2px stroke, rust and mustard) separates display from keypad. Corners stay consistent; nothing is a blob.
Spacing rhythm. Single centred column, max-width 460px on desktop, at least 64px vertical breathing room at 1280px; keypad grid with 8pt gutters; at 375px the card goes edge-to-edge with 16px side padding and keys at least 56px tall.
Imagery style. No photography. The only visuals are a small hand-drawn ink illustration (abacus or stack of tally marks, 2px stroke, rust and mustard) in the card's top-left margin and the wavy divider rule. Decoration only; never overlapping readable text or keys.
The public entry is the product: a single cream page with one lifted-paper calculator card centred in it, no hero image and no marketing copy above the fold. The dominant element is the oversized Literata result numeral, right-aligned in ink on the cream card at clamp(44px, 9vw, 88px) — a number set in a book, not a digital readout. Above it the running expression sits small and muted beneath the EXPRESSION label; below it the hand-drawn wavy ink rule, then the bordered cream keypad with exactly one filled block: the solid rust equals key spanning two rows with cream Literata type. A tiny rust-and-mustard tally-mark illustration sits in the card's top-left margin. The composition is quiet and printed, with the whole viewport as paper and the calculator as the only object on the page.
Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
= (transformation) evaluates the expression; the new result (outcome) fades in over 180ms with a 4px upward drift and settles right-aligned in ink. No other motion occurs.:active tint, 180ms result fade with 4px upward drift. No bounces, no particles, no looping animation, no spring.EXPRESSION label with an empty expression line, RESULT label with 0 in oversized Literata; the wavy rust-and-mustard rule; the bordered keypad with the solid rust equals block as the only filled element.prefers-reduced-motion, all transitions are instant and the static layout is unchanged; the first frame is identical and fully usable.clamp(...); no element covers any part of them. The result display drops to 44px at 375px so it never wraps out of its container.prefers-reduced-motion, all transitions are instant and the static layout is unchanged.frontend, backend, and database services as the runnable inventory.÷, ×, −, +) with digits 0–9, as implied by "calculator"; no scientific, memory, percentage, or unit-conversion functions are included.EXPRESSION and RESULT area at the top of the calculator card.C): the full-width ink-outline key that resets the calculator to its initial state.

No comments yet. Be the first!