zen-simple is a simple calculator delivered as a single page. The product intent is narrow and exact: a person opens one page, enters numbers and operators, and reads the arithmetic result. There is no account, no history, no multi-page navigation, and no adjacent productivity surface.
The audience is anyone who needs quick arithmetic — a public utility for everyday calculation. The design intent, drawn from the project's creative direction, is a quiet, exact, trustworthy instrument in the spirit of Dieter Rams: honest keys on a strict grid, a calm right-aligned display, and a single signal colour reserved for operators and the equals key.
This document is the System Requirements Document for zen-simple. It specifies the single-page calculator, its one active human persona, its one page, and the delivery boundary around it.
zen-simple is a single-page web calculator. The page presents a small-caps label row, a right-aligned numeric display, a hairline rule, and a 4-by-5 modular key grid. The user presses digit keys to build an operand, presses an operator key to record the pending operation, presses further digits for the second operand, and presses the orange equals key to see the result. The current operator is shown in orange in the label row above the display.
The product is anonymous and public. There is no sign-in, no saved state across sessions, and no server-side calculation requirement. The calculator's working state (current entry, pending operator, stored operand, result) lives in the page for the duration of the visit.
Provisioned infrastructure is a shared FastAPI backend, a MariaDB database, and a React frontend. The calculator's arithmetic is a client-side interaction; the backend and database are provisioned services that do not, by themselves, create calculator domain entities, accounts, or persistence requirements. They remain available for the application's runtime and are reflected in the Tech Stack.
Removed from scope
zen-simple is delivered as one first-party page, Calculator, which is the anonymous public entry. A visitor lands directly on the calculator; no identity is established, requested, or required, because the accepted behavior creates no durable actor-specific state, commitment, entitlement, or value transfer that would need to be bound to a person. The page is fully usable on first load.
All accepted calculator behavior — digit entry, operator selection, equals, clear, decimal point, sign toggle, and percent — is owned by the Calculator page and executed in the browser. The shared backend and MariaDB are provisioned runtime services; they do not own any accepted calculator interaction and are not required for the calculator to function. No provider surface or external destination participates in the accepted journeys.
The current delivery horizon contains only the single-page calculator described here. Nothing beyond it is currently committed.
Information and state
ZEN SIMPLE, with the current pending operator displayed in orange when one is active (for example ZEN SIMPLE · ×); when no operator is pending, the label row shows only ZEN SIMPLE.clamp(40px, 9vw, 64px).Primary actions
0–9 append digits to the current entry.. begins or extends a fractional entry; a second decimal point in the same entry is ignored.+, −, ×, ÷ record the pending operator and, if a first operand and operator are already present, evaluate the pending operation first and use its result as the new first operand.= (solid orange block) evaluates the pending operation and shows the result in the display.Supporting actions
C resets the calculator to its initial state: display 0, no stored operand, no pending operator.± flips the sign of the current entry.% converts the current entry to its percentage value (entry divided by 100).Domain entities
Component responsibilities
clamp range and remain fully readable).States
0, no operator indicator.Error); the next digit or C returns the calculator to normal entry.C always returns to the initial state from any state, including the error state.FR-1 — Single-page calculator As a Calculator user, I should open one page that presents a calculator, so that I can do arithmetic without navigating anywhere.
0 and the full key grid; access — anonymous public entry; failure/recovery — none material; continuation — the user begins entering digits.FR-2 — Digit entry As a Calculator user, I should press digit keys to build a number in the display, so that I can enter the operands I want to calculate with.
0–9; result — the digit is appended to the current entry and shown right-aligned in the display; access — anonymous; failure/recovery — none; continuation — the user presses more digits, an operator, or equals.1, 2, 3 shows 123; a leading 0 is replaced by the first non-zero digit.FR-3 — Operator selection As a Calculator user, I should press an operator key to record the operation I want, so that the calculator knows what to do with my next operand.
+, −, ×, or ÷; input — the operator; result — the operator is stored as pending and shown in orange in the label row; if a first operand and operator already exist, the pending operation is evaluated and its result becomes the new first operand; access — anonymous; failure/recovery — none; continuation — the user enters the second operand.8, × shows × in the label row; pressing 8, ×, 2, + shows 16 and pending +.FR-4 — Equals and result As a Calculator user, I should press the equals key to see the result of my calculation, so that I get the answer I asked for.
=; input — the stored operand, pending operator, and current entry; result — the computed value appears in the display and the operator indicator clears; access — anonymous; failure/recovery — division by zero shows an error state (see FR-8); continuation — the user starts a new entry or continues from the result.7, +, 5, = shows 12.FR-5 — Clear As a Calculator user, I should press the clear key to reset the calculator, so that I can start a fresh calculation.
C; result — display returns to 0, stored operand and pending operator are cleared, operator indicator clears; access — anonymous; failure/recovery — works from every state including error; continuation — the user begins a new entry.C yields the initial state.FR-6 — Decimal point As a Calculator user, I should press the decimal point key to enter fractional numbers, so that I can calculate with non-integers.
.; result — a decimal point is added to the current entry; a second decimal point in the same entry is ignored; access — anonymous; failure/recovery — none; continuation — the user enters further digits.3, ., 5 shows 3.5; 3, ., ., 5 shows 3.5.FR-7 — Sign toggle and percent
As a Calculator user, I should press ± to flip the sign of my entry and % to convert my entry to a percentage, so that I can handle negative and percentage values.
± or %; result — ± negates the current entry; % divides the current entry by 100 and shows the result; access — anonymous; failure/recovery — none; continuation — the user continues entering or presses an operator or equals.5, ± shows -5; 50, % shows 0.5.FR-8 — Division-by-zero error and recovery As a Calculator user, I should see a clear error when I divide by zero and be able to recover, so that the calculator never shows a misleading result.
= with a pending ÷ and a zero divisor; result — the display shows an error state (for example Error) and the operator indicator clears; access — anonymous; failure/recovery — pressing any digit or C returns the calculator to normal entry; continuation — the user proceeds with a new calculation.5, ÷, 0, = shows the error state; pressing C restores 0.Product context. The Calculator user arrives at zen-simple to do quick arithmetic — a sum, a difference, a product, a quotient, a percentage. They are not signing in, not saving anything, and not returning to a history. They want an exact, quiet instrument that responds immediately.
Primary goal. Enter an expression with digits and operators and read the correct result.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which digits to enter, which operator to apply, when to press equals, and when to clear. The user reads the display and the orange operator indicator to confirm the calculator's state before committing.
Interactions with other participants. None. The Calculator user is the only active human participant; the calculator's arithmetic is performed in the page, and no other persona, provider, or external party is affected by the calculation.
Observable success. The display shows the correct result after equals; the operator indicator reflects the pending operation; clear returns the calculator to 0; an error is shown clearly for division by zero and is recoverable.
ZEN SIMPLE, the display 0, the hairline rule, and the 4-by-5 key grid. No identity is requested.C to reset to 0.Failure/recovery. If the user makes an entry mistake, pressing C returns the calculator to 0 and clears the pending operator; the user re-enters the calculation.
C to reset, or begins a new entry.. to begin a fractional entry; further digits extend it, and a second . is ignored.± to negate the current entry, or % to convert it to a percentage; the display updates immediately.÷, enters 0, and presses equals.Error) and the operator indicator clears.C (or begins a new digit entry); the calculator returns to normal entry with display 0 or the new digit.The creative direction is authoritative: Less, but better: a calculator of honest controls, after Dieter Rams.
Palette (light mode)
#E8E4DC — warm off-white ground, approximately 70 percent of the frame.#F4F1EA — the calculator panel.#1C1C1A — ink for digits and labels.#2F2F2C — ink keys, approximately 25 percent of the frame.#E4581F — Braun orange, reserved for operator glyphs and the solid equals key only.#8A867D — secondary labels and the hairline rule.Typography
clamp(40px, 9vw, 64px).Shape language
Layout
Imagery
Accessibility
clamp range and never overflows its container.The public entry is the calculator panel itself: a 380px warm-white block (#F4F1EA) on a large warm-grey ground (#E8E4DC). A small-caps label row reads ZEN SIMPLE above a 64px right-aligned display in tabular figures. A single hairline rule separates the display from the 4-by-5 key grid. The orange equals key is the only hot mark in the frame; operator keys are ink with orange glyphs. The composition is flat, composed, and quiet — the display is the calm focus, and the key grid is the visual content. No images, no shadows, no decoration.
Interaction Model: Static (direction) Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
ZEN SIMPLE; the display shows 0; the orange equals key is the only hot mark.none)clamp(40px, 9vw, 64px) and never overflows its container. (explicit via creative direction)prefers-reduced-motion, the page-load fade is removed and the calculator remains fully usable. (explicit via creative direction)none; no identity is established.C or a new digit are indispensable for the accepted division operation.clamp(40px, 9vw, 64px).ZEN SIMPLE and showing the pending operator in orange.C or a new digit.
Keyboard · 0–9 . + − × ÷ · Enter · C
0
Keyboard · 0–9 . + − × ÷ · Enter · C
0
No comments yet. Be the first!