shadow-web is a web application calculator. Its product intent is narrow and complete: a person opens the app, enters numbers and arithmetic operations, and sees the computed result. The audience is anyone who needs a quick, correct answer — students, shoppers, freelancers, people splitting a bill — and the product is a single instrument rather than a suite of tools.
The experience is delivered as a custom first-party web UI with two surfaces: a public Landing page that explains what the calculator is and does before any calculation work, and a Calculator page that owns entering numbers and operations, computing and viewing the result, and clearing the entry for a new calculation. Neither surface requires an account; the calculator is usable anonymously and immediately.
The visual and tonal direction is a remix of a familiar industrial object — keys, labels, a display — rendered with quoted labels, hazard stripes, an exposed grid, and hard-edged tag motifs. Character is added without slowing down the arithmetic or compromising the legibility of digits and keys.
shadow-web is a single-purpose web calculator. A visitor arrives at the Landing page, learns in one screen what the calculator does, and opens the Calculator. On the Calculator they build an arithmetic expression from a keypad, see the running expression and the computed result on a display plate, and clear the entry to start a new calculation. There is no account, no saved history across sessions, and no adjacent product surface.
Current delivery comprises three provisioned services:
Actors:
Accepted behavior is limited to: presenting the calculator, accepting numeric and operator input, computing the result of the entered expression, displaying the running expression and result, and clearing the entry. Explicitly out of scope: accounts, sign-in, saved calculation history, sharing, unit conversion, scientific or programmer modes, and any capability not listed above.
Removed from scope
shadow-web is delivered entirely as a first-party web application. Both accepted pages — Landing and Calculator — are application-owned custom pages with no access requirement: a visitor can reach and use them anonymously, with no identity establishment, session continuity, or permission model. Because no accepted capability creates a durable relationship, obligation, entitlement, or value transfer bound to a specific person, no application-owned identity is introduced.
The Landing page is a public entry surface: it explains the calculator and provides the single path into the Calculator. The Calculator page owns the entire calculation lifecycle — input, computation, result display, and clearing. Arithmetic evaluation is performed by the shared backend so the result is authoritative and consistent; the frontend owns input capture and display state.
There is no future-horizon functionality in the accepted requirements. Anything not described in this document — history, accounts, additional modes — is outside the current delivery boundary and is not implied by the provisioned database or by the calculator's product category.
prefers-reduced-motion.0 with no running expression and no ledger entries; success — result digits replace the entry and the completed operation appears in the ledger; error — an invalid expression (for example a trailing operator or division by zero) shows an error state on the display plate with the entered expression preserved; recovery — pressing CLEAR or entering a valid digit/operator returns the display to a usable entry state.FR-1 — Open the web calculator (explicit) As a Calculator User, I should open the shadow-web web application and reach the calculator so that I can perform arithmetic.
FR-2 — Enter numbers (explicit) As a Calculator User, I should enter numbers using the keypad so that I can build the operands of my calculation.
FR-3 — Choose arithmetic operations (explicit) As a Calculator User, I should choose an arithmetic operation so that the entered numbers are combined as I intend.
FR-4 — See the computed result (explicit) As a Calculator User, I should see the computed result of my entered expression so that I get the answer I came for.
FR-5 — Clear the entry for a new calculation (explicit) As a Calculator User, I should clear the current entry so that I can start a fresh calculation without leftover state.
0, and the active operator state is released.FR-6 — Review completed operations in the current session (required_inference) As a Calculator User, I should see the operations I have completed in this session so that I can check my recent answers without re-entering them.
Product context. The Calculator User arrives at shadow-web with a specific sum in mind — a bill to split, a price to check, a homework answer to verify — and wants the answer in seconds. They are not looking for a workspace, an account, or a record of their work; they want one instrument that responds immediately and reads clearly.
Primary goal. Get a correct result from the numbers and operations they enter, and be able to start a fresh calculation cleanly.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which digits and decimal point to enter; which operator (÷, ×, −, +) to apply; when to press "=" to compute; when to press "CLEAR" to reset. The user decides when an expression is complete and when a result is acceptable.
Interactions with other accepted participants. The Calculator User is the only active human persona. Their input is evaluated by the backend and rendered by the frontend; no other human participant is involved, and no result is handed to another person.
Observable success. The display plate shows the correct result for the entered expression, the running expression matches what they intended, and CLEAR returns the instrument to a clean 0 state for the next calculation.
0, no running expression, and an empty operation ledger.0, and the active operator state is released.The visual language is a remix of a familiar industrial object — keys, labels, a display — in the spirit of Virgil Abloh: quoted labels, hazard stripes, an exposed grid, and tag motifs. It is quick, confident, and a little streetwise, never corporate or calming.
Palette (light mode)
| Role | Token | Hex |
|---|---|---|
| Background (concrete-grey paper ground) | --bg | #EDEAE4 |
| Surface (keys, display plate) | --surface | #F7F5F1 |
| Text / ink (type, display digits, operator keys) | --ink | #111111 |
| Primary (buttons, key borders) | --primary | #111111 |
| Accent (equals key, quotation marks, hazard stripe, active operator) | --accent | #FF4D00 |
| Muted (metadata, secondary labels, running expression) | --muted | #7A756C |
Safety orange #FF4D00 is the single hot accent: the equals key, the quotation marks around labels, the hazard stripe, and the active-operator state — never more than one orange element per cluster. Orange is used for large type and key fills with black text on top, never for small body copy on light ground. Body text #111111 on #EDEAE4 and #F7F5F1 clears contrast comfortably.
Typography
clamp(40px, 9vw, 128px); calculator display digits clamp(40px, 8vw, 72px); key labels 18–22px; metadata 13px uppercase with 0.12em tracking.Shape language
Layout
Imagery. No photography. The imagery is the object itself: thick-line vector key glyphs, hazard stripes, punched tag labels, exposed grid lines, and a halftone-dot texture on the landing's secondary panel. The calculator panel is treated as a product shot — a flat, hard-edged illustration of an instrument.
Readability constraint. Headlines, wordmarks, labels, numbers, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. Decoration and imagery may be cropped or bled off an edge, but never cover readable text or controls.
The public entry is a poster, not a SaaS hero. A full-bleed concrete-grey ground (#EDEAE4) carries a hazard-stripe band in orange #FF4D00 and ink #111111 at 45°, running edge to edge behind the top third of the screen.
The dominant element is the headline "SHADOW-WEB" set in Archivo Black at clamp(40px, 9vw, 128px), flush left, stacked in two lines, with the second line "CALCULATOR" in outlined ink stroke rather than fill. Each word is wrapped in oversized literal quotation marks in orange. Beneath the headline, a solid black tag-shaped block with a punched hole reads "PRESS KEYS. GET ANSWERS." in off-white Space Grotesk caps.
The CTA is a single black key-shaped button labelled "OPEN CALCULATOR" with an orange offset shadow, pinned bottom-left of the headline block — not centred. On the right side at 1280px, a hard-edged illustration of the calculator instrument itself is cropped off the right edge by 15%, its display showing a live example sum. At 375px the instrument illustration drops below the headline and the hazard band runs behind the type.
The signature moves that carry through both pages: every label is wrapped in literal straight quotation marks with the quotes in safety orange; the hazard-stripe band reappears as a 6px rule dividing calculator sections; keys are hard-cornered off-white tiles with a 2px ink border and a solid 2px black offset shadow that collapses on press; the display is a bordered off-white plate with a punched "SHADOW-WEB / MODEL 01" tag and the running expression in muted grey above the result; the equals key is the only fully orange key, and the active operator key inverts to orange fill with a black glyph.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion, the hazard stripe drift is paused and the page renders as a static poster; label tags do not flip on hover; all content remains fully readable and the CTA remains operable.#111111 on #EDEAE4 and #F7F5F1 clears contrast comfortably; orange is used for large type and key fills with black text on top, never for small body copy on light ground.prefers-reduced-motion, the hazard-stripe drift is paused and the page provides a usable static arrangement.docker-compose.yml with the three provisioned services — frontend, backend, database — connected through the shared backend for feature APIs.

No comments yet. Be the first!