bright-calculator is a simple calculator delivered as a single-page design. The product intent is narrow and explicit: give anyone who needs a quick sum a single screen where they can enter numbers and operators, evaluate the calculation, read the result, and clear or correct the current calculation to start again. There is no account, no saved history requirement, and no multi-page application structure — the calculator itself is the page.
The audience is the everyday person performing quick arithmetic on one screen, referred to in this document as the Calculator User. The experience is designed around playful precision: responsive keys, a live numeric display, and a page that feels alive rather than like a spreadsheet, while remaining an everyday utility.
This document is the System Requirements Document for the project requested by Diya Trivedi.
bright-calculator is a first-party, browser-delivered calculator. The entire product is one page: the calculator surface itself, presented as a warm-paper field with an oversized live result numeral, an expression line, and a circular keypad. There is no marketing page separate from the calculator — the first screen is the calculator.
Access is anonymous and immediate. No sign-in, account, profile, or identity establishment is required or implied: the calculator holds no durable per-user state that must be privately owned or resumed, and no commitment, entitlement, or value transfer is bound to a participant. The Calculator User opens the page and begins calculating.
The application is served by a shared backend process (FastAPI) and a React frontend, with a MariaDB instance provisioned as part of the scaffold. The calculator's arithmetic is a client-side interaction; the provisioned database does not by itself justify domain entities, authentication, or persistence of calculations, and none are required by the accepted source. The backend exists as the shared application process for any application APIs and domain modules; it does not add product behavior.
Everything described in this document is current scope. No future-horizon features have been accepted.
Removed from scope
The anonymous public entry surface. Because the product is constrained to a single page, the Landing surface is cohesive with the calculator experience: it is the same warm-paper field that presents the calculator, with the calculator as its dominant content. It explains what the simple single-page calculator is and does through its own presence and labeling, then hands the user directly into calculation without a separate navigation step.
0 with an empty expression line.The single-page calculator surface where the Calculator User enters numbers and operators, evaluates the calculation, sees the result, and clears to start again.
clamp(56px, 12vw, 128px), Space Grotesk 600, right-aligned in the display panel; the largest element on the page; updates on every keypress.#FF4D2E, sweeps in beneath the result on each completed calculation.#FFFFFF surface, 2px black border, no shadow.0–9 to enter numbers.+, −, ×, ÷) to select an operation; the active operator is highlighted in vermilion.=) to evaluate the current expression; the equals key is the vermilion-accented key.prefers-reduced-motion.0, expression line empty, ticker empty or hidden until a first result exists.FR-1 — Enter numbers As a Calculator User, I should be able to press digit keys to enter a number into the calculator, so that I can build the operands of my calculation.
explicit (simple calculator) with required_inference for the specific keypad interaction.0–9) or the decimal key.FR-2 — Select an operator
As a Calculator User, I should be able to press an operator key (+, −, ×, ÷) to choose the operation, so that the calculator knows how to combine my operands.
explicit (calculator) with required_inference for the active-operator highlight.#FF4D2E); the expression line shows the pending expression; hovering an operator nudges the expression line with a small horizontal parallax.FR-3 — Evaluate the calculation As a Calculator User, I should be able to press the equals key to evaluate my expression and see the result, so that I get the answer to my sum.
explicit (calculator) with required_inference for the odometer roll and underline sweep.=, vermilion-accented).FR-4 — Clear and start again As a Calculator User, I should be able to press the clear key to reset the current calculation, so that I can correct a mistake or begin a new sum.
required_inference (indispensable recovery mechanic for the accepted calculator lifecycle).0, empty expression).FR-5 — See recent results As a Calculator User, I should see a small ticker of my recent results along the bottom edge, so that I can glance back at what I just computed.
required_inference (observable continuation of the accepted calculation lifecycle; session-scoped, in-memory only).prefers-reduced-motion it wraps into static readable rows.FR-6 — Reduced-motion usability As a Calculator User who prefers reduced motion, I should be able to use the calculator with motion removed, so that the page remains usable and readable.
explicit (creative direction motion constraint).prefers-reduced-motion: reduce.0.0 with an empty expression.prefers-reduced-motion: reduce.Muse: Yugo Nakamura — interaction as delight, kinetic type, cursor-reactive physics, generative grids with minimal chrome. Headline idea: "Interaction as delight — a calculator you can feel."
| Role | Hex | Usage |
|---|---|---|
| Background | #F4F1EA | Warm paper ground, full viewport |
| Surface | #FFFFFF | Display panel, pressed-key states |
| Text | #111111 | Pure black type and key rings |
| Primary | #111111 | Keys, primary controls |
| Accent | #FF4D2E | Equals key, active operator, live result underline (~5% of surface) |
| Muted | #8C877C | Secondary labels, hint text |
-0.02em).clamp(56px, 12vw, 128px).clamp(56px, 12vw, 128px); expression line 20px; key labels 22–28px; micro-labels 11px uppercase with 0.18em letterspacing; body/hints 15px.None — motion and typography replace imagery. The only graphics are the black circular keys, the display panel, hairline rules, and a faint generative dot-grid texture at 8% opacity behind the keypad.
Gradient blobs or glassmorphism; blue or indigo primary buttons on white; Inter/Roboto/Arial/system-ui; rectangular rounded keys with drop shadows; identical hover-lift cards; marketing headline + subtext + CTA hero; stock photography or illustration; bouncy spring easing on key presses.
The first screen is the calculator, not a marketing hero. A warm paper field (#F4F1EA) fills the viewport. On the left, a huge live result numeral (clamp(56px, 12vw, 128px), Space Grotesk 600, tabular) sits above a small expression line and a vermilion underline that animates on each calculation. On the right, a 4×5 grid of black-ringed circular keys. The dominant element is the oversized result numeral — the largest thing on the page, changing on every keypress.
Signature moves:
prefers-reduced-motion.No headline-above-button composition, no gradient, no card sitting on a white page.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
0 in oversized tabular Space Grotesk 600 above an empty expression line; right column with the 4×5 circular keypad; vertical hairline rule between; faint dot-grid behind the keypad; ticker along the bottom edge.explicit): The calculator design must be a single page. The Landing and Calculator surfaces are cohesive within that one page; no additional routes or pages are introduced.explicit, creative direction): Headlines, wordmarks, labels, numbers, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (e.g. font-size: clamp(...)) to fit. No other element covers any part of them. Decoration and motion may be cropped or bled, but never over readable text or controls.explicit, creative direction): The recent-results ticker may cross the viewport edge by design; every item must become fully readable as it passes. Under prefers-reduced-motion, it wraps into static readable rows.explicit, creative direction): All motion respects prefers-reduced-motion by removing the roll and parallax and letting the ticker wrap into static rows.required_inference): Pure black #111111 on warm paper #F4F1EA and on white #FFFFFF provides high contrast; the vermilion accent #FF4D2E is reserved for the equals key, active operator, and result underline, not for body text.explicit by absence): The accepted source does not require saved calculations, accounts, or history beyond the session-scoped ticker. The provisioned MariaDB instance does not justify domain entities or authentication.required_inference): The calculator performs standard four-function arithmetic (+, −, ×, ÷) with decimal entry, which is the minimal interpretation of "simple calculator."required_inference): The recent-results ticker is session-scoped and in-memory; it is not persisted and does not constitute a history feature.explicit): The design must be a single page.explicit): The creative direction's palette, typography, shape language, layout, and motion rules are authoritative for visuals and interaction.explicit): The generic indigo/blue-on-white SaaS template is forbidden.explicit): No account, sign-in, or identity establishment is required; access is anonymous.explicit by absence): No future-horizon features are accepted; all requirements are current.prefers-reduced-motion: reduce state in which roll and parallax are removed and the ticker wraps into static rows.
Calculator
Live result
Keyboard works too — digits, . + − × ÷, Enter to evaluate, Esc to clear.

Calculator
Live result
Keyboard works too — digits, . + − × ÷, Enter to evaluate, Esc to clear.
No comments yet. Be the first!