teal-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 operators, and reads a correct computed result without navigating anywhere else. The page is the product — there is no account, no dashboard, no marketing site, and no second destination.
The audience is anyone who needs quick everyday arithmetic in a browser. The design treats that utility as a tactile toy: keys that physically respond, digits that land with weight, and a result that reads clearly at any viewport. Delight is the differentiator on an otherwise invisible tool, but it never displaces correctness or legibility.
This document is the System Requirements Document for the project named teal-calculator, requested by Diya Trivedi.
teal-calculator is a single-page web application. The page is anonymously reachable and requires no identity, no session, and no stored data. It contains one calculator slab with a display area and a key grid, plus a wordmark and a one-line instruction.
Current delivery:
Narrow exclusions: no accounts, no saved history, no memory keys, no scientific functions, no unit conversion, no sharing, no export, no multi-page navigation, no backend API, and no third-party calculator service.
Removed from scope
The accepted requirement is a simple calculator presented as a single page. That single page is both the entry point and the entire working surface. A visitor lands on it anonymously, the calculator is already live and showing 0, and every subsequent action happens in place. There is no pre-identity step, because there is nothing private to establish: no durable actor-specific state, no commitment, no entitlement, and no value transfer that must remain bound to a participant.
The delivery boundary is therefore the page boundary. Everything the product does — number entry, operator selection, expression display, computation, clearing, and error recovery — is owned by the Calculator page. Nothing is deferred to a provider surface or an external destination, and nothing is planned for a future release beyond what is described here.
The single page of the product. Anonymous, no access requirement, no identity. It is simultaneously the public entry surface and the working calculator.
Information and state
12 × 4).0.0 display.Primary actions
0 and clear the expression line.Supporting actions and components
teal, oversized lowercase, letters nudged by cursor with spring physics on desktop.a calculator that answers back.Domain entities
+, −, ×, ÷.Component responsibilities and states
prefers-reduced-motion.prefers-reduced-motion.States summary
0 state.FR-1 — Single-page calculator delivery (explicit) As a Calculator user, I should reach a simple calculator on one single page, so that I can do arithmetic without navigating anywhere else.
0, and the full key grid.FR-2 — Digit entry (required_inference) As a Calculator user, I should press digit keys 0–9 and see each digit appear in the display, so that I can build the number I want to compute.
FR-3 — Decimal entry (required_inference) As a Calculator user, I should press the decimal key to enter fractional values, so that I can compute with non-integers.
FR-4 — Operator selection (required_inference) As a Calculator user, I should press an operator key and see it recorded in the expression line, so that I know which operation will run.
+, −, ×, or ÷.12 ×), and the next digit begins a new operand.FR-5 — Compute result (required_inference) As a Calculator user, I should press the equals key and see the computed result, so that I get the answer I came for.
12 × 4) and the display shows the result (48) in large tabular figures; the equals key emits a single expanding orange ring pulse.FR-6 — Clear and reset (required_inference) As a Calculator user, I should press the clear key and return the calculator to its starting state, so that I can start a fresh calculation.
0 and the expression line is emptied.FR-7 — Error display and recovery (required_inference) As a Calculator user, I should see a clear message when a calculation cannot produce a number, so that I understand what happened and can recover.
0; no state is corrupted.FR-8 — Keyboard input (required_inference) As a Calculator user, I should be able to type digits and operators on a physical keyboard, so that I can calculate quickly without aiming at keys.
FR-9 — Reduced-motion compliance (explicit, from creative direction) As a Calculator user who prefers reduced motion, I should get instant state changes with no decorative animation, so that the tool remains usable and comfortable.
prefers-reduced-motion setting is active.Product context. A person who needs quick everyday arithmetic — checking a total, splitting a bill, multiplying a quantity — and who opens a single web page to do it. They arrive anonymously, with no account and no expectation that anything is saved.
Primary goal. Get a correct result from the calculator without navigating away from the page.
Distinct responsibilities. This is the only active human role, and its work is entirely local to one page: entering operands, choosing an operator, reading the expression line to confirm what will be computed, committing with equals, reading the result, and clearing to start again. The role also carries the recovery responsibility — recognizing an error message and clearing it.
Inputs and decisions. Digits, a decimal point, one of four operators, equals, and clear, entered by pointer or keyboard. The decision points are which operator to arm, when the expression is complete enough to compute, and whether to continue from a result or clear.
Interactions with other participants. None. No other human participant is affected by any accepted capability; there is no handoff, no shared state, and no recipient of the result beyond the user reading it.
Observable success. The display shows the correct result with the expression visible above it, and the user can immediately begin another calculation.
What makes this role distinct. The role's entire value is a single tight loop of input and feedback on one page. There is no persistence, no collaboration, and no administrative surface — the persona is defined by the speed and clarity of that loop, not by any organizational or permission context.
teal, the line a calculator that answers back, and the cream calculator slab with the display showing 0.12 × 4), the display shows the result (48) in large tabular figures, and the equals key emits a single expanding orange ring pulse.Failure/recovery. If the user presses equals before a complete expression exists, the display is unchanged and they can continue entering. If the result is non-finite (for example division by zero), the display shows an explicit error message; pressing clear returns the display to 0 and the user starts again.
0.0, or continues with another operator.Failure/recovery. Unrecognized keys are ignored and leave the display unchanged.
0 and the expression line is emptied.prefers-reduced-motion active opens the Calculator page.Muse and headline. After Yugo Nakamura — Interaction as delight. The tool is a toy you can trust: playful precision, flat colour so motion reads clearly, no gradients, no glass, no chrome.
Colour tokens (light mode)
| Role | Hex | Use |
|---|---|---|
| Background | #F2EFE6 | Warm paper ground for the page |
| Surface | #FFFDF7 | Cream calculator slab |
| Text | #141414 | Near-black ink for digits, outlines, wordmark |
| Primary | #0E7C6B | Teal — operator keys and wordmark ink |
| Accent | #FF5A1F | Orange — reserved for the equals key and the live result underline only |
| Muted | #8A8578 | Warm grey for labels, expression line, instruction text |
Flat fills only. No gradients anywhere. The calculator slab carries a 1.5px ink border and a hard 3px offset shadow with no blur.
Typography
-0.03em tracking, lowercase.+0.16em tracking.clamp(48px, 11vw, 132px); title 28 → 40px; result 40 → 72px; key label 20 → 26px; micro-label 11 → 12px; body 15 → 16px.Shape language. Perfectly square keys on a 4px-radius grid, 1.5px ink outlines, hard 3px offset shadows that collapse to 0 on press. The calculator is a single bordered slab. The only curves are the circular clear key and the pill-shaped equals key. Nothing floats, nothing blurs.
Spacing rhythm. 4px base unit; 20px page gutters on mobile; the slab is capped at 420px wide with a 4-column key grid on a 7:1:1:1 rhythm.
Imagery style. No photography and no illustration. The imagery is the interface: oversized tabular digits, ruled hairlines, and a faint 24px dot-grid paper texture behind the slab that nudges nearby dots 2px around the pointer. A small\x20\xe2\x8c\xa8 glyph row is the only pictogram.
Layout. Desktop: two zones — left column with the oversized kinetic wordmark teal and the one-line instruction; right column with the calculator slab. Mobile: one column, wordmark as a stacked band above the slab, 20px gutters. The display sits inside the slab above the keys, right-aligned, with the live expression in muted type above the big result. All readable text and controls stay fully inside the viewport and their containers at 375px, 768px, and 1280px.
The first screen is a two-column editorial spread on warm paper, and the calculator is already live inside it.
On the left, the wordmark teal is set at clamp(48px, 11vw, 132px) in ink, lowercase and tight. Its letters lean away from the cursor with spring physics — 2–6px of displacement that returns to rest — so the name behaves like a physical object on the page. Beneath it, one muted line: a calculator that answers back.
On the right, the cream calculator slab sits with a 1.5px ink border and a hard 3px offset shadow. Its display shows 0 in 72px tabular figures, right-aligned, with the muted expression line above it. The key grid below is square, outlined, and shadowed. The orange equals key is the only saturated accent on the screen.
Behind the slab, a faint 24px dot grid shifts 2px around the pointer. There is no centred headline, no button stack, and no gradient — the calculator is the hero, and it is already answering.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
teal wordmark, composed as a two-column editorial spread on warm paper.teal at up to 132px on the left with the muted instruction beneath; cream slab on the right with 0 in 72px tabular figures and the orange equals key as the only hot accent; faint dot grid behind the slab.clamp(...) to fit. No element covers any part of readable text or a control.prefers-reduced-motion, all decorative motion is disabled and a usable static arrangement is provided.prefers-reduced-motion.+, −, ×, ÷.prefers-reduced-motion setting under which all decorative animation is disabled.

a calculator that answers back
No comments yet. Be the first!