magic-calculator is a simple calculator delivered as a single designed page. The product intent is narrow and exact: one page, one job — arithmetic. A visitor opens the page, sees a disciplined calculator interface, enters numbers and operators, and reads the computed result.
The audience is anyone who needs a quick, correct answer: a general "Calculator User" who performs everyday arithmetic and expects a clear, well-designed instrument rather than a product pitch. There is no onboarding, no marketing narrative, and no second page. The page should feel like a piece of signage — a beautifully disciplined tool.
This document is the System Requirements Document for the project. It specifies the single-page calculator's behavior, its one active human persona, its page content, its visual system, and its technical delivery.
magic-calculator is a single-page web calculator. The current delivery consists of one designed page that presents the calculator plate — a readout and a ruled keypad — together with the page's typographic identity. There is exactly one active human persona, the Calculator User, and no application-owned identity, accounts, or sign-in: the page is anonymously reachable and stateless between visits.
Accepted current behavior: the page presents a designed calculator interface; the user enters numbers and operators; the page computes and displays the result; the user can clear the entry and continue with a new calculation. The product is limited to a single page.
The provisioned infrastructure is a React frontend, a shared FastAPI backend process for application APIs and domain modules, and a MariaDB database. The calculator's arithmetic is a client-side interaction on the single page; the backend and database are provisioned infrastructure and do not by themselves introduce domain entities, authentication, or persistence requirements for this product.
Removed from scope
The product is delivered as one first-party page, anonymously accessible, with no identity establishment and no protected state. The calculator's working state (the current entry and the displayed result) lives in the page for the duration of the visit; nothing about the user is stored or resumed.
The single-page constraint is a hard boundary: the calculator experience, its typographic identity, and its operation legend all live on the one page. There is no separate landing page, no settings page, and no results page. The backend and database are provisioned as shared infrastructure but carry no current product behavior for this calculator; arithmetic is performed in the page itself.
Future ideas are not part of current delivery and are recorded separately in Section 11.
The single page of the product. It is anonymously reachable and holds no user identity.
Information and state
Primary actions
Supporting actions
Domain entities
Component responsibilities
States
FR-1 — Single designed calculator page As a Calculator User, I should see a single designed calculator page when I open the product, so that I immediately understand it is a calculator and can begin arithmetic.
FR-2 — Enter digits As a Calculator User, I should press digit keys to build the number I want to calculate with, so that the readout reflects the number I am entering.
FR-3 — Enter a decimal value As a Calculator User, I should press the decimal key, marked with the single black circle, to enter fractional values, so that I can calculate with non-integer numbers.
FR-4 — Select an operation As a Calculator User, I should press an operator key (+, −, ×, ÷) to choose the operation, so that the calculator knows what to do with the next number.
FR-5 — Compute and display the result As a Calculator User, I should press the equals key to commit the pending operation and see the computed result, so that I get the answer to my calculation.
FR-6 — Clear the calculation As a Calculator User, I should press the clear key to reset the entry and pending operation, so that I can start a new calculation cleanly.
FR-7 — Read the operation legend As a Calculator User, I should see the four operations listed as color-coded labels in a ruled strip, so that I can recognize the available operations at a glance.
FR-8 — Readable and operable at all supported viewports As a Calculator User, I should be able to read every label and number and press every key at 375px, 768px, and 1280px widths, so that the calculator works on my device.
Product context. The Calculator User arrives at a single page that is a calculator, not a product site. They may be on a phone, tablet, or desktop, and they want a quick, correct answer to an everyday arithmetic question. They have no account and no expectation of one; the page is anonymous and stateless.
Primary goal. Enter a calculation and read a correct result from a clear, well-designed interface.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which digits to enter, whether a value is fractional, which operation applies, and when to commit with equals or reset with clear.
Interactions with other accepted participants. None. The Calculator User is the only active human persona; there is no counterparty, recipient, or approver in this product.
Observable success. The readout shows the correct result after equals, the active operator is visibly marked, and the page remains fully readable and operable at every supported viewport.
Failure and recovery. If the user presses equals with an invalid operation (for example, division by zero), the readout shows an error indication. The user presses the yellow clear key, the readout returns to a zero entry with no active operator, and they begin again.
Failure and recovery. A second decimal press within the same entry does not add a second decimal point; the user continues entering digits normally.
The visual system follows the supplied creative direction after Massimo Vignelli: information design as wayfinding, a visible grid, one Helvetica-class grotesque, and primary colors used as coded signals.
Palette (light mode)
#F2EFE9 (warm paper ground, carries the whole page)#FFFFFF (the calculator plate)#111111 (all type and all rules)#D6301F (equals key, active operator, the equals rule, the zone divider)#F2B705 (operator column labels and the clear key)#6B6B6B (small-caps metadata only)Proportion: 80% paper and black, 15% white surface, 5% red and yellow. No blue anywhere; color is code, not mood.
Typography
clamp(48px, 9vw, 112px); result clamp(40px, 7vw, 88px); section label 11px; key label clamp(18px, 2.4vw, 24px); body 16px. Three sizes only; hierarchy by weight and rules.Shape language
Layout
clamp(20px, 6vw, 96px).Imagery. No photography, no illustration. The imagery is the interface itself: the ruled keypad plate, the tabular result, the color-coded operation legend, and a small pictogram set of plus, minus, multiply, and divide drawn as 2px-stroke geometric symbols. Decoration is restricted to the grid rules and the single black dot.
The first screen is a poster, not a SaaS hero. A warm paper field (#F2EFE9) carries a full-bleed black rule across the top bearing the wordmark "CALC" in Archivo 700 at clamp(48px, 9vw, 112px), flush left, spanning roughly 40% of the viewport width and sitting tight against the left margin. Directly beneath it, a single 16px line of black body copy.
The right 5 columns are dominated by the calculator plate: a white rectangle with a 2px black border, a huge tabular result number at clamp(40px, 7vw, 88px) in the top third, a red equals rule, and a 4×5 keypad of hard-edged keys divided by hairlines. A red vertical rule separates the two zones. There is no centered headline, no gradient, and no floating card — the composition is two unequal rectangles divided by rules, exactly like a Vignelli information panel.
The signature moves are: the oversized flush-left "CALC" wordmark separated from the calculator plate by a full-height red vertical rule; the calculator as a single ruled plate with no radii and no shadows; the result number treated as signage with a red equals rule that draws across the readout after each calculation; operations color-coded like a transit legend (red for equals, yellow for clear and operator labels, black for digits); and the single black circle serving as the decimal point and the only decorative mark.
Interaction Model: Static Motion Tempo: still Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion, the result count and the red rule draw become instant swaps; the page remains fully usable and static.prefers-reduced-motion. (explicit, from the creative direction)Assumptions
[Default — not specified by user][Default — not specified by user][Default — not specified by user]Constraints
Future requirements (not part of current delivery)
#D6301F) for equals and the active operator; yellow (#F2B705) for clear and operator labels.
One page, one job: arithmetic, answered with precision.
magic-calculatorSingle page

One page, one job: arithmetic, answered with precision.
magic-calculatorSingle page
No comments yet. Be the first!