Skip to content
Design System · Master documentation

REstimator Design System

The design system behind Presupuestador RE, a B2B quoting tool for metalwork and ironwork shops. Dark, industrial, dense, desktop-first, with a single rationed amber accent. This documentation gathers its foundations, its components, its product patterns and its responsive system.

Tokens
147
colour · type · space · elevation
Components
33
exports in the namespace
Screens
5 desktop 3 mobile
from the UI kit and the Mobile v1 spec
Theme
Dark
the system’s only theme
00

Overview

Presupuestador RE helps estimators and shop owners produce faster, more consistent quotes from standardised criteria: families → subcategories → dimensions, calibrated price ranges, labour days and material references. It is a tool for daily work.

What the system is for

To codify that product as reusable foundations, components and screen recreations, so any new surface is built on-brand in minutes. The frozen V1 mid-fi prototype is the reference: the information architecture, the flows and the screen structure are already settled. The system raises visual quality only; it does not redesign flows or change the IA.

Principles

Speed
Operational density. The estimator enters measurements and reads the recommended value in a loop; nothing gets in the way.
Clarity
Structure drawn with 1px hairlines, not heavy fills. Typographic hierarchy before colour.
Trust
Every number explains where it comes from. Warnings are warn-only and never block the calculation.
Efficiency
No gradients, glass, decorative blur or entrance choreography. Motion is minimal and functional.

Overall architecture

LayerLocationWhat it holds
Global entry pointstyles.cssAn @import manifest only. Consumers link this file.
Tokenstokens/fonts · colors · typography · spacing · elevation · theme-light · base
Componentscomponents/React, 6 categories. Namespace window.PresupuestadorREDesignSystem_84f335
Foundation cardsguidelines/16 specimens of colour, type, space, brand and theme validation.
UI kitui_kits/presupuestador/5 interactive hi-fi screens of the frozen product, dark. Token-driven via kit.css + shell.js
Mobile specMobile v1 - Spec de implementación.html3 final mobile screens with measurements, spacing, sticky behaviour and components.
Agent skillSKILL.mdMakes the folder usable as an Agent Skill in Claude Code.

Status and versioning

Frozen

  • IA, flows and screen structure (V1).
  • Type pairing (2026‑06‑16) — not to be re-explored.
  • The 5 product rules (below).

Stable and in use

  • 147 tokens · dark theme.
  • 33 exported components.
  • 5 desktop screens from the kit.

Specified, not built

  • 6 mobile components (Mobile v1).
  • Tablet layer (documented, no artifact).
  • templates/ — 0 templates.

Non-negotiable product rules

They come from S12 and are respected on every new surface. They are rules of the business domain, not design criteria.

1
FreezeEvery quote freezes the parameter version it was calculated with; published ones are immutable.
2
QA gateA parameter or product change only reaches production through a QA Run.
3
CurrencyThe product operates in UYU; the exchange rate only converts internal costs.
4
EditorS5A (ProductEditor) is the only product editor.
5
PrivacyThe client summary never serialises margins, labour days or calibration.
01

Foundations

147 tokens

Every value in this section is a real system token, read from tokens/. Components always read var(--re-*), so nothing hardcodes a value.

Colour · graphite ramp (dark base)

--re-canvas
#0d0e11
App background — near black
--re-surface
#16181d
Cards, panels
--re-surface-2
#1d2026
Inset / hover, inputs
--re-surface-3
#262a31
Deep inset, tracks
--re-ink
#f2f3f4
Primary text
--re-ink-2
#c2c6cc
Secondary text
--re-ink-3
#9197a0
Tertiary / hints
--re-ink-4
#7f858e
Faint labels, placeholders — raised for AA
--re-line
#262a31
Hairlines, card borders
--re-line-2
#313641
Input borders
--re-line-strong
#434954
Emphasised borders, dashed

Charcoal — deeper panels

--re-charcoal
#0a0b0e
Recommended block, document total
--re-charcoal-2
#14161b
Sub-block on charcoal
--re-charcoal-line
#2b2f37
Hairline on charcoal

Amber — the only brand colour

--re-amber
#e0911e
Primary CTA, active rail
--re-amber-strong
#f0a634
Hover / press (lightens on dark)
--re-amber-bright
#f5b342
Recommended value, headline figures
--re-amber-soft
rgba(224,145,30,.13)
Tinted background
--re-amber-line
rgba(224,145,30,.34)
Tinted border
--re-amber-ink
#f0b45e
Amber text on tint

Amber rationing rule. Amber appears in exactly four kinds of moment: the recommended price (amber figure on the deepest charcoal), the active navigation rail, the primary / submit CTA and the logo. Everything else is resolved with graphite and hairlines. See NR‑08 for how this rule extends to mobile.

Semantic (tuned for dark)

--re-ok
#52b06e
+ ok-bright #6fd08a, soft, line
--re-warn
#d99a3a
+ warn-ink #e6c188, soft, line
--re-crit
#d86a52
+ soft, line
--re-info
#5b9be0
+ soft, line

Quote lifecycle (History)

Draft Sent Approved Rejected Cancelled

Semantic aliases — prefer these in components and screens

AliasResolves toAliasResolves to
--re-bg--re-canvas--re-border--re-line
--re-text--re-ink--re-border-field--re-line-2
--re-text-muted--re-ink-2--re-border-strong--re-line-strong
--re-text-subtle--re-ink-3--re-focus--re-amber
--re-text-faint--re-ink-4--re-accent / --re-primary--re-amber
--re-accent-hover--re-amber-strong--re-primary-hover--re-amber-strong

Light theme — planned

Planned The published system has a single theme: dark. A colour remap has been explored —warm white surfaces, graphite ink, warm grey borders— which would leave spacing, typography, radii, hierarchy and interaction untouched, with amber as the only accent. It is not part of the system yet and is not documented as available.

Typography · FROZEN

The pairing is final and is not re-explored. An alternative with Plus Jakarta Sans was evaluated against the real screens (Typography Comparison.html) and rejected: Hanken won on density, legibility at small sizes and industrial tone.

Primary UI — Hanken Grotesk

Recommended quote
400 · 500 · 600 · 700 — humanist grotesque, industrial-neutral, not “rounded startup”. Used for everything: headings, body, controls, tables.
--re-font-sans

Technical — JetBrains Mono

GV-A-00148
PRE-2026-0148
400 · 500 · 600 — codes, IDs, dates and tabular figures. Product codes ESC-RECT.
--re-font-mono

Actual scale

TokenValueUseSample
--re-text-display40pxThe hero “recommended” figure$135.599
--re-text-2xl23pxPage H1Calculator
--re-text-xl21pxCompact H1History
--re-text-lg17pxSection H2Dimensions
--re-text-md14.5pxCard titlesQuote header
--re-text-base14pxBody / controlsTread width
--re-text-sm13pxSecondary body, cellsPedro Núñez · Railings
--re-text-xs12pxHints, captionsdecimals with a comma
--re-text-2xs11pxEyebrows, uppercase labelsESTIMATED FABRICATION

Weights · line-heights · tracking · helpers

Regular
400
Medium
500
Semibold
600
Bold
700
tight
1.15
snug
1.35
normal
1.45
relaxed
1.6
ls-body
-0.005em
ls-heading
-0.02em
ls-tight
-0.01em
ls-eyebrow
0.06em
ls-caps
0.05em
ClassWhat it does
.re-rootBase document type: family, 14px, lh 1.45, tracking, colour, antialiasing, font-feature-settings:"tnum" 1,"ss01" 1. Opt-in on <body> or a wrapper.
.re-numTabular figures — money, measurements, codes, dates.
.re-monoSwitches to JetBrains Mono.
.re-eyebrowEyebrow / kicker: 11px, 600, +0.06em, uppercase, faint colour.

Numbers and units — Uruguayan format, always tabular

TypeFormatExample
Moneydot as thousands separator, no decimals$168.000
Measurementsdecimal comma + unit0,80 m · 2,90 m
Labour daysdecimal comma, one decimal place7,0
Percentagessign + value+ 8% · IVA 22%
Codesmono, uppercaseGV-A-00148 · ESC-RECT

Spacing · 4px grid

--re-s14px
--re-s28px
--re-s312px
--re-s416px
--re-s520px
--re-s624px
--re-s732px
--re-s840px
--re-s948px
--re-s1064px

Sizing · layout constants (from the frozen V1 shell)

Sidebar
248px
Topbar
60px
--re-sidebar-w · --re-topbar-h
Document width
1080px
--re-content-max — document / reading
Standard control
40px
Compact control
32px
--re-control-h · --re-control-h-sm · see NR‑04

Radius

r-sm · 7px
r · 9px
r-lg · 13px
r-pill · 30px
r-full · 999px
Consistent and modest — nothing fully rounded except avatars and dots.

Borders

Structure is drawn with 1px lines, not heavy fills. Hairlines everywhere: --re-line for dividers and card borders, --re-line-2 on inputs, --re-line-strong for emphasis and dashed rules.

Elevation

In dark, depth is a lighter surface plus a 1px border; shadows sit deep and quiet underneath. No glow, no coloured shadow.

--re-shadow-sm
Hairline lift — cards by default, tiles
0 1px 2px rgba(0,0,0,.40)
--re-shadow
Card at rest
0 1px 3px / 0 1px 2px
--re-shadow-panel
Floating panel — sticky result, preview, menus
0 8px 24px / 0 2px 6px
--re-shadow-paper
The “paper” of the client-facing document
0 16px 44px / 0 3px 10px
--re-shadow-bar
Fixed save bar — the shadow points upwards
0 -2px 16px rgba(0,0,0,.50)
--re-ring / --re-ring-amber
Focus — 3px amber on dark
.26 / .32 alpha

Iconography

Rules

  • Inline line SVG only. viewBox 24×24, stroke="currentColor", stroke-width ~1.7–1.8 (1.7 for nav/UI, 2 for chevrons/arrows), round caps and joins.
  • They inherit text colour and sit at 15–18px.
  • No icon font, no sprite, no PNG, no emoji, no unicode pictograms. A “✓” in transient toasts is the only exception.
  • For new surfaces, copy the shapes from the kit before reaching for a library. There is no bundled CDN set: the set is small and hand-maintained.

Recurring glyphs

calculator · clock · cube · sliders · shield-check · warning · star (recommended) · pencil · duplicate · document · bubble · magnifier

Product taxonomy family — TaxonomyIcon

10 fabrication-category glyphs drawn in the same language (24×24, stroke 1.7, no fills, no external library): stairs · railings · grilles · enclosures · doors · gates · furniture · structures · roofs · grills. They are used in category rails, dropdowns, catalogue cards and chips, so the product reads as a specialised metalwork tool and not as a generic business app. API: <TaxonomyIcon name="rejas" size={18} strokeWidth={1.7}/>; iterate TAXONOMY_ICONS for menus; colour via currentColor (amber when active).

Motion

Minimal and functional. .12–.15s ease on hover / border / background; toggles slide their knob; the only ambient movement is the slow pulse of the “Live” dot in live panels. No bounces, no parallax, no entrance choreography, no scale effects.

Breakpoints

LayerReference widthRole
Desktop≥ 1200 · design 1440Primary layer. Fixed sidebar + side result panel.
Tablet834Intermediate layer with an identity of its own: top tabs + bottom sheet.
Mobile390 · fluido 360–430Designed, not adapted. Bottom tab bar + pinned summary.
NR‑05

Breakpoints are not tokenised: they live in prose and in the specs, not in tokens/. Any implementation is hardcoding them.

Accessibility foundations

DecisionValueWhy
Contrast of faint labels--re-ink-4 #7f858eRaised from #686d76 (≈3.4:1) to clear WCAG AA 4.5:1 on surfaces.
Visible focus--re-ring 3px amberA 3px ring + amber border on every focusable control. The outline is never removed without a replacement.
Touch targets≥ 44pxMinimum touch size on mobile/tablet; 42px visual controls carry an extended hit area.
Icons without texttitle obligatorioIconButton requires title, used both as tooltip and aria-label.
Figurestabular-numsMoney and measurements never “dance” between states; vertical comparison stays reliable.
State never by colour alonedot + labelThe lifecycle uses a coloured dot and a written label.
02

Components

33 exports · 6 categories

The 33 components exported by window.PresupuestadorREDesignSystem_84f335. Each directory holds <Name>.jsx + .d.ts + .prompt.md and a *.card.html specimen. The specimens below are token-driven replicas of the real components (same tokens, same anatomy), so this document does not depend on a React runtime.

How to read the subcomponents. Several exports live in one parent file: Field/Input/Select/Textareaforms/Input.jsx · Card/CardHead/CardBody/SectionHeadlayout/Card.jsx · AppShell/LogoMark/Sidebar/NavGroup/NavItem/Topbar/Breadcrumbs/UserChipnavigation/AppShell.jsx · Table/TableToolbar/RowActions/Paginationdata/Table.jsx · Badge/StatusBadge and Alert/AlertGroup ← their own feedback/ files.

Button

Variantssecondary · primary · accent · ghost
Sizes · sm 32 · md 40 · lg 46
States

Purpose

The main action control. Exactly one primary (or accent) per view; everything else is secondary or ghost.

API

variant
secondary | primary | accent | ghost
size
sm | md | lg
block
boolean
iconLeft / iconRight
ReactNode (16px)

Variant semantics

  • secondary — neutral outline, the workhorse.
  • primary — solid charcoal fill, the screen's single main action.
  • accent — brand amber fill, reserved for hero send/share actions.
  • ghost — no border, low-emphasis inline actions.

Tokens

--re-control-h · --re-r-sm · --re-line-2 · --re-charcoal · --re-amber · --re-amber-strong · --re-ring

IconButton · Toggle · SegmentedControl

IconButton
variant
default 34 | bare 30
danger
boolean
title
required

Icon-only, for the topbar and row actions. title is used both as tooltip and aria-label.

Toggle
off · md 38
on · charcoal track
on · amber accent
sm 32 · table rows
pressed / defaultPressed
boolean
size
md | sm
accent
boolean
disabled
boolean
SegmentedControl
EstimateFormal
Table Cards
options
2–3 items
value
string
onChange
(value) => void

More than 3 options → use Select.

Field · Input · Select · Textarea

Anatomy and stateslabel + hint + control + note
Tread width m
0,62m
Labour day rate
$14.360
Reference and control — it does not set the price.
Family
Stairs
Search
Search by number, client, project…
Notes optional
Add notes for the client…
Locked by freeze
v37377

API

ExportRelevant props
Fieldlabel · optional · note · htmlFor
Inputprefix · suffix · leadIcon · num
Selectchildren (<option>) · chevron propio
Textareanativo · resize vertical

Behaviour

  • Field wraps: label + inline hint (“optional”) + control + note with icon.
  • num switches on tabular figures and alignment for money and measurements.
  • prefix/suffix for $ and units (m, %).
  • Focus: amber border + --re-ring. Disabled: opacity .45.
NR‑06

There is no error/invalid prop on Field or Input. The product's validation is warn-only via Alert, so field-level inline errors are undefined in the system.

Badge · StatusBadge

Tones and shapes
neutralokwarncritinfo
with dotESC-RECTGV-A-00148
StatusBadge — lifecycle Draft Sent Approved Rejected Cancelled

API

Badge · tone
neutral | ok | warn | crit | info
Badge · dot
boolean
Badge · square
mono code chip
Badge · icon
ReactNode
StatusBadge · status
draft | sent | appr | rej | cancel
StatusBadge · label
overrides the default label

Usage

  • StatusBadge maps dot colour + written label automatically. Do not assemble the pill by hand.
  • square for codes (GV-A-00148, ESC-RECT): mono, 5px radius.
  • State is never communicated by colour alone: always dot + text.

Alert · AlertGroup

Toneswarn is the default — the engine never blocks
Pitch outside the comfortable rangeCheck height and run. It is a warning: it does not block the calculation.
Recommended pitch≈ 14 steps · 17.4 cm riser · 34°
Changes apply only to new calculations.
The parameter version needed to freeze the quote is missing.
These are not included in the commercial output sent to the client.

API

Alert · tone
warn | ok | info | crit | neutral
Alert · icon
ReactNode · null hides it
Alert · title
bold lead line
AlertGroup · title
“Alerts and reminders”
AlertGroup · items
ReactNode[]

Behaviour

  • The engine is warn-only and never blocks; that is why warn is the default tone and the triangle is the default icon.
  • AlertGroup is the titled reminders panel with bullets.
  • Microcopy: info/lock icon + a single sentence.

Tokens

--re-warn-soft/-line · --re-ok-soft/-line · --re-info-soft/-line · --re-crit-soft/-line · --re-r

Card · CardHead · CardBody · SectionHead

Quote headeroptional

This card is the specimen: CardHead (icon tile + title + hint + actions) over a divider, then CardBody.

1Product
2Dimensionsdecimals with a comma
3Construction options
SectionHead — numbered steps inside the calculator / editor

API

ExportProps
Cardpad (20/24 interno) · flush (clip para tablas)
CardHeadicon · title · hint · actions
CardBodytight (menos padding para tablas/listas)
SectionHeadindex · title · hint · tools

Anatomy

Graphite surface, 1px --re-line border, --re-shadow-sm, --re-r-lg 13px radius. flush when the card wraps a full-bleed table.

Do / Don't

  • Do — use a numbered SectionHead for the steps of a long flow (calculator, editor).
  • Don't — nest cards inside cards; to group content within a card use SectionHead + dividers.

StatTile

Quotes this month
24
+3 vs. last month
Approved
9
37.5% conversion
Quoted amount
$2.480.000
month to date
Engine
v1.5
QA up to date

API

label
uppercase
value
tabular
sub
supporting line
accent
charcoal variant
dot
live status dot
amberValue
figure in amber

Usage

  • Dashboard KPI row and status grids.
  • accent is for one single highlighted tile per row: it is the charcoal anchor.
  • amberValue sparingly: headline figures only (it respects amber rationing).
  • dot combines with accent for “Live” panels.

TechnicalPreviewCard · TechnicalRenderers

The only sanctioned drawing in the system: schematic plans and elevations generated parametrically from the quote’s own dimensions. They are measured diagrams, with 1px graphite structure lines, token-driven dimension overlays and amber reserved for the entry/railing cue.

Registry

Registry-based: family/variant select a renderer. Stairs ships four: straight (side elevation), L, U and spiral (plan views). Unknown families fall back to a “no technical view” placeholder.

Permitted use

  • Calculator and editor previews, history rows, the client-facing document.
  • Never hand-draw decorative product art.

API

family
Stairs | others → placeholder
variant
straight | L | U | spiral
dims
width · height · run · steps · tread · riser · diameter
config
string[] of chips
size
compact | standard | large
title / code
override · mono code
showDims
default true
live
“Live” indicator

Densities

  • compact — head + drawing + footer.
  • standard — + 4 dimensions + chips.
  • large — bigger stage + 6 dimensions.

Extending

TechnicalRenderers.register(family, variant, def) · setFamilyLabel · has · variants · families, all chainable. escalones is clamped to 4–16; a chip matching /baranda|pasamano/ draws the railing on recta.

03

Navigation & App Shell

The desktop shell is the primary layer and has been frozen since V1: a 248px sticky sidebar + a 60px sticky topbar + a scrolling main. Mobile does not compress that shell: it changes pattern.

Desktop — AppShell

Sidebar · LogoMark · NavGroup · NavItem248px
RE
Presupuestador
RE · v1.0
Operations
Configuration

Topbar · Breadcrumbs · UserChip

Operations/Calculator(unsaved)
RERamiroEstimator

API

ExportProps
AppShellsidebar · topbar · children
LogoMarkmark ("RE") · name · tagline
Sidebarlogo · footer · children
NavGrouplabel · first
NavItemicon · label · active · as
Topbarbreadcrumbs · actions
Breadcrumbsitems: {label, href}[]
UserChipname · role · initials
NR‑02

LogoMark has the default tagline 'RE · v1.0', but the kit screens and the mockups show “REstimator · motor v1.5”. The default needs to be unified, or passed explicitly every time.

Mobile — bottom navigation + compact header

Mobile is designed, not adapted: the sidebar is not “hidden”, it is replaced by a bottom tab bar of 5 families. Breadcrumbs disappear (title + back replace them) and branding appears only once per header.

ElementSizeBehaviourStatus in the DS
BottomTabBarh 64 + safe-areafixed bottom. 5 tabs: Home · Calc · History · Catalogues · Params. Icons 21, label 10. Active --re-amber-ink.New
MobileHeaderh ~62sticky top. Back + title (Calculator) or brand + title (Home / History). No breadcrumbs, no sub-copy.New
BottomActionBarh 62 · bottom 64fixed above the tab bar. Calculator only: Save (primary) · Estimate · Quote.New
AppShell (mobile mode)Same route tree, three navigation modes (sidebar / tabs / bottom bar).Extended

Sticky / fixed behaviour

Layer (bottom to top)HeightPositionz-indexWhere
Bottom tab bar64fixed bottom 040Mobile
Action bar62fixed bottom 6435Mobile · Calculator
Compact header~62sticky top 030Mobile
Recommended summaryauto ~108sticky bajo header28Mobile · Calculator
Bottom sheet (breakdown)max 78%overlay + scrim60Mobile · Tablet
Sidebar / Topbar248 / 60stickyDesktop
Result panel380 colsticky lateralDesktop · Calculator
Save barautofixed bottom · shadow-barDesktop · Editor / Parameters
04

Forms & Data Entry

Forms are the heart of the product: the calculator is a long form with a live result. Data entry favours typing speed and tabular reading over ornament.

Control inventory

ControlExportVariants / sizesDefined states
Text inputInputprefix · suffix · leadIcon · numdefault · focus · disabled · placeholder
SelectSelectnative + custom chevrondefault · focus · disabled
TextareaTextareavertical resizedefault · focus · disabled
SearchInput + leadIcona pattern, not a separate componentdefault · focus · with a value
ToggleTogglemd 38 · sm 32 · accenton · off · disabled
SegmentedSegmentedControl2–3 options, with or without iconselected · unselected
Field wrapperFieldlabel · optional · note
Checkbox · RadioThey do not exist as components. The product resolves choice with Select, SegmentedControl and Toggle. See NR‑13.

Control states

Default
2,43m
Focus — amber border + 3px ring
2,43m
Disabled — opacity .45
2,43m
Placeholder — ink-4
0,00m
With currency prefix
$14.360
Select
Montevideo

Hover · focus · pressed · disabled — global rules

StateTreatment
Hoverfill to --re-surface-2 + border to --re-line-strong (or amber-darken on amber CTAs)
Focus3px amber ring (--re-ring) + amber border
Pressed / activetoggles and active pages flip to amber
Disabledopacity .45, no events
Transition.12–.15s ease on background / border. No shrink, no scale.

Validation · errors · success

The calculation engine is warn-only and never blocks. That product decision defines all validation: warnings are grouped as an Alert next to the result, not as field errors that stop you from moving on.

Warning — does not block
Run outside the comfortable rangeYou can continue: the calculation still runs.
Success / calm confirmation
Saved to history · GV-A-00159
Field note — icon + one sentence
These are not included in the commercial output sent to the client.

Data entry pattern — long forms

  • Numbered steps with SectionHead: Product → Dimensions → Construction options → Finish / installation / zone.
  • One card per step; a 2–3 column grid on desktop, 1–2 on tablet, 1 on mobile.
  • Units always visible as a suffix, never only in the label.
  • Decimal comma on measurements — the step hint is a reminder (“decimals with a comma”).
  • Live recalculation: there is no “calculate” button; the result panel shows the “Live” dot.
  • Optional fields marked with an inline optional hint, rather than an asterisk on the required ones.

Save bar

The Editor and Parameters screens use a fixed bottom bar with a change count (“1 local calibration change”) + Restore defaults + Save changes. Shadow cast upwards (--re-shadow-bar).

05

Data Display

History is the main data surface: a dense table, filters that work, state as a coloured dot on a neutral pill, and row actions revealed on hover.

Table · TableToolbar · RowActions · Pagination

Saved quotes58 results
CodeClient / projectFamilyStateAmount
GV-A-00159
Balcony railing
Pedro Núñez · 15/06/2026
Railings Draft $96.000
EST-2026-014
Balcony railing — initial
Pedro Núñez · 13/06/2026
Railings Sent $96.000
EST-2026-013
Straight staircase — first contact
Valentina Cruz · 12/06/2026
Stairs Approved $175.000
Showing 1–12 of 58 1235

API

ExportProps
Tablechildren (thead/tbody propios)
TableToolbartitle · count · actions
RowActionschildren (IconButtons)
Paginationshowing · pages · current · onPage

Helpers

  • Header classes: is-right · is-center · is-sortable.
  • Cell classes: re-cell-strong (primary) · re-cell-sub (secondary line).
  • Wrap in <Card flush>: the card clips the table’s overflow.
  • RowActions is revealed on row hover.

Amounts and figures

  • The amount column is right-aligned, tabular-nums, weight 600.
  • Code in mono at 11.5px, colour --re-ink-3.
  • Two-line row: primary (re-cell-strong) + secondary client · date.

Empty state — the product's real pattern

Only saved quotes are listed. There are no hard deletes: the state is changed softly.

Empty states explain the rule, they do not just say “no results”.

NR‑07

There is no loading / skeleton component in the system, and empty states exist only as copy inside screens, not as a reusable component.

Cards, tiles and badges as display

Already documented in §02: the Card family for containers, StatTile for KPIs and status grids, Badge/StatusBadge for labels, codes and lifecycle, TechnicalPreviewCard for the product's schematic drawing.

06

Product Patterns

Patterns specific to REstimator. They are not components: they are compositions with business meaning, and several are governed by the non-negotiable rules in §00.

Recommended value and ranges

Recommended
$135.599
fabrication value · + VAT
Minimum
$127.463
Maximum
$143.735

Pattern rules

  • The recommended value is the only amber figure on the screen and sits on the deepest charcoal.
  • It is always shown with its range (min / max) and a pin on the track: the number never appears alone.
  • The price comes from calibrated Fab_min/Fab_max, not from labour days × rate.
  • Always labelled “fabrication value · + VAT”: it is never implied to be a final price.
  • The panel carries the “Live” dot: continuous recalculation, no calculate button.

Labour days — a control, not a price

5,3
Min
6,5
Rec.
7,7
Max
Workload check — it does not set the price. Literal product copy.

Result steps

The result panel always presents the same numbered steps, in the same order, across all three breakpoints:

StepBlockWhat it communicates
1Estimated fabricationMin–max range + track with the recommended pin.
RecommendedCharcoal block with the amber figure. The visual anchor.
2Labour days · workforceMin / Rec. / Max as a workload check.
3Installation (suggested)Range + calculation basis (~10% of fabrication) + zone.
4SubtotalFabrication + installation → subtotal, with an explicit “+ VAT”.
5OverrideManual adjustment of the final price, always visible as a separate field.
6AlertsA warn-only AlertGroup at the foot of the panel.

Creating and editing quotes

Calculator flow

  • 1 Product — family → subcategory (10-category taxonomy).
  • 2 Dimensions — measurements in metres, decimal comma.
  • 3 Construction options — structure, riser, anti-slip, railing.
  • 4 Finish · installation · zone — DTM, installation type, geographic zone.
  • The quote header is optional and collapsible: it does not steal focus from the form.

Classification

Families → subcategories is the backbone. TaxonomyIcon accompanies each category in rails, dropdowns, catalogue cards and chips.

Lifecycle and actions

  • States: Draft → Sent → Approved / Rejected / Cancelled.
  • No hard deletes: the state change is soft and reversible.
  • Duplicate is first-class: picking up a previous quote is the most common path.
  • Freeze: on publication, the quote freezes its version of the parameters and becomes immutable.
  • Override: the manual adjustment is recorded; it does not silently replace the recommended value.

Filters and search

  • Search by number, client or project in a single input with a leadIcon.
  • Type/state filters on one line; on mobile they scroll horizontally, with a solid amber active state.
  • The result count is always visible (“58 results”).

The client-facing document — the only light surface

The client summary is rendered as a real sheet of white paper (it is the printable / WhatsApp / PDF artifact) resting on the dark workbench; its total row is charcoal with the total in amber. Everything else in the product is dark. Estimate and formal modes via SegmentedControl. Formal third-person voice (“Please find attached an estimate…”), never informal address. It never serialises ranges, labour days, margins or calibration (rule 5).

Voice and microcopy

RuleApplication
LanguageUruguayan Spanish, Rioplatense voseo in the imperative: “Agregá notas…”, “buscá, filtrá y retomá”. Never “añade/busca”.
TonePlain, operational, trustworthy. Short declaratives. It explains why a number exists without hedging.
CasingSentence case for everything readable. UPPERCASE + tracking only on small eyebrows.
PersonThe app speaks to you (the estimator). The client-facing document is formal and third-person.
EmojiNever. A “✓” in transient confirmations is the only decorative character.
Help notesInfo/lock icon + a single sentence.
07

Responsive System

The same system at three densities. Mobile is not another product: same tokens, same taxonomy, same result steps and same vocabulary, with the navigation and result pattern that suits the available space.

Transformation by aspect

AspectMobile · 390Tablet · 834Desktop · 1440
NavigationBottom tab bar (5 families) + contextual titleTop family tabs under the headerFixed 248px left sidebar
BrandingRE monogram in the header (avatar = user, not brand)Compact monogram + nameLogo + name + engine version in the sidebar
BreadcrumbsHidden — replaced by title + backCompact, optionalComplete, in the topbar
HeaderCompact sticky: back + title; no sub-copySticky: title + actionTopbar + page head
ResultPinned summary on top + sheet on demandCollapsible bottom sheet with a peek380px sticky side panel
Primary actionsFixed bar above the tab barIn the sheet's peek + inside the panelInside the result panel
StickyHeader + summary + action barHeader + sheet peekResult panel + save bar
Forms1 field per row; numbered sections with anchors2-column grid with breathing room2–3 column grid
DensityStacked cards, gap 14, padding 16Intermediate, padding 22Dense, padding 20/24, gap 16–20
Tables / listsRow = card; tap opens it; secondary actions in ⋯Reduced table or cards depending on widthFull table + RowActions on hover
Control42px42px40px (--re-control-h)

Result pattern — a decision per breakpoint

Four options were evaluated (sticky side · summarised top · bottom sheet · hybrid) and the hybrid composition was chosen: no single option wins at all three sizes, so the pattern adapts to the space. The recommended value stays glanceable at all times; the breakdown is one tap away.

Desktop ≥ 1200

Side panel

Horizontal space to spare: the full breakdown stays sticky beside the form, as it already worked.

Tablet 834

Bottom sheet

Form at a comfortable width; a bottom peek bar with the recommended value + range + CTA. It expands without covering fields.

Mobile 390

Summary on top + sheet

Pinned result header (recommended + range + size); “View breakdown” opens the sheet. Actions live in a fixed bar.

Mobile v1 constants

Base viewport
390 × 844
Fluid range
360–430
Grid
4px (--re-s*)
Screen padding
16 (s4)
Gap between cards
14
Card
r13 · pad 16
Control
h42 · r7
Touch target
≥ 44
Safe area
env(safe-area-inset-bottom)

Component adaptation rules

  • Nothing is merely “hidden”. If an element does not fit, it is replaced by its touch equivalent.
  • One dominant action per tap: the whole row opens; secondary actions move to a ⋯ overflow.
  • Chips on one line with horizontal scroll; the active one is solid amber, never wrapping to two lines.
  • No sub-copy in touch headers: title + back and nothing else.
  • One brand mark per header: monogram = app, avatar = user.
  • The bottom sheet carries only the breakdown: it never becomes navigation.

Full spec: Mobile v1 — Implementation spec

NR‑12

The tablet layer is documented and specified, but there is no tablet screen artifact in ui_kits/. The tablet values come from the refinement mockups, not from a screen in the kit.

08

Screen Examples

5 desktop · 3 mobile

The product screens built with the system. The five desktop ones come from the UI kit; the three mobile ones come from the Mobile v1 implementation spec. Each is captured at high resolution and can be opened to scroll through.

Desktop — UI kit

Captures of the kit’s real screens. Click any of them to open it and scroll through the full screen.

Mobile v1 — final screens

Calculator, Home and History were frozen for implementation, with measurements, spacing, components and sticky behaviour per screen. They are documented in their own file so they are not duplicated here.

Colour exploration

The five desktop screens with a light colour remap, side by side against the dark system. Surfaces, ink, borders and shadows change; spacing, typography, components and hierarchy do not, and amber remains the only accent. The ink ramp is calibrated against the contrast the dark theme already achieved, rather than picked by eye. It is an exploration: the published system has one theme, dark.

Supporting documentation

The documents where the things this system takes as settled were decided: audits, the V1 scope lock and the handoff package.

ArtifactTypeWhat it contains
Refinamiento HiFi — Auditoría y DecisionesAuditWireframe vs. hi-fi audit, UX and visual issues, A/B/C/D comparison of the result panel.
Typography ComparisonAuditHanken vs. Plus Jakarta against real screens — the decision to freeze Hanken.
V1 Design Freeze · Readiness AuditFreezeV1 scope lock, and the check that the system was ready to be frozen.
Accessibility Review · UX ReviewReviewResults of the accessibility and UX reviews of the frozen kit.
Claude Code Handoff PackageHandoffHandoff package for development.

Listed as an inventory, not published. Names are each document’s original title, in the language it was written in.

09

Component Inventory

33 built · 6 specified

The 33 components that were built and the 6 that were specified, with what each one covers today on desktop and on mobile. The Status column says where in the system it stands:

Stable
built and in use.
Extended
exists, and still needs mobile coverage.
New
specified in Mobile v1, not built yet.
Needs review
has a documented inconsistency.
ComponentCategoryVariantsStatesDesktopMobileStatusImplementation notes
ButtonFormssecondary · primary · accent · ghost / sm·md·lgdefault · hover · focus · disabledYesYesStableOne primary/accent per view. Mobile uses h42 in action bars.
IconButtonFormsdefault 34 · bare 30 · dangerdefault · hover · focus · disabledYesPartialStabletitle required. On mobile, raise the hit area to ≥44.
FieldFormslabel · optional · noteYesYesStableWrapper for every control.
InputFormsprefix · suffix · leadIcon · numdefault · focus · disabled · placeholderYesYesNeeds reviewNo error/invalid state (see NR‑06).
SelectFormsnative + chevrondefault · focus · disabledYesYesStablePass <option> as children.
TextareaFormsvertical resizedefault · focus · disabledYesYesStableQuote notes.
ToggleFormsmd 38 · sm 32 · accenton · off · disabledYesYesStableCharcoal track when on; sm for table rows.
SegmentedControlForms2–3 options, with or without iconselected · unselectedYesYesStable>3 options → Select.
BadgeFeedback5 tones · dot · squarestaticYesYesStablesquare for mono codes.
StatusBadgeFeedbackdraft·sent·appr·rej·cancelstaticYesYesStableMaps colour + Spanish label automatically.
AlertFeedbackwarn·ok·info·crit·neutralstatic · with or without titleYesYesStablewarn is the default: the engine never blocks.
AlertGroupFeedbacktitle · itemsstaticYesYesStable“Alerts and reminders” panel.
CardLayoutpad · flushstatic · hover on rowsYesYesStableflush for full-bleed tables.
CardHeadLayouticon · title · hint · actionsstaticYesPartialStableOn mobile the actions usually move to an overflow.
CardBodyLayoutdefault · tightYesYesStabletight for tables and option lists.
SectionHeadLayoutindex · title · hint · toolsstaticYesYesStableNumbered steps in the calculator / editor.
StatTileLayoutdefault · accent · dot · amberValuestaticYesPartialStableOne accent per row.
TechnicalPreviewCardLayoutcompact · standard · large / 4 rendererslive · placeholderYesNot documentedExtendedExtensible registry. Mobile behaviour unspecified.
TechnicalRenderersLayoutregistry APIYesYesStableregister · setFamilyLabel · has · variants · families
AppShellNavigationsidebar + topbar + mainYesMode requiredExtendedNeeds 3 modes: sidebar / tabs / bottom bar.
SidebarNavigationlogo · footerYesNot applicableStable248px fixed, sticky.
LogoMarkNavigationmark · name · taglineYesYesNeeds reviewDefault tagline is misaligned (see NR‑02).
NavGroupNavigationlabel · firstYesNot applicableStableThe sidebar's uppercase eyebrow.
NavItemNavigationicon · label · asdefault · hover · activeYesReplacedStableActive = 3px amber rail + bold label.
TopbarNavigationbreadcrumbs · actionsYesCompact variantExtendedMobile: back + title, no breadcrumbs.
BreadcrumbsNavigationitems[]YesHiddenStableLast item in bold.
UserChipNavigationname · role · initialsYesAvatar onlyStableOn mobile it collapses to the avatar.
TableDatais-right/center/sortable helpersrow hoverYesRow → cardStableWrap in Card flush.
TableToolbarDatatitle · count · actionsYesSimplifiedStableResult count pill.
RowActionsDatacluster of IconButtonsrevealed on hoverYes⋯ overflowExtendedThere is no hover on touch: it needs a ⋯ menu.
PaginationDatashowing · pages · currentcurrent · hoverYesNot documentedExtendedOn mobile it will be infinite scroll or “load more”, still undefined.
TaxonomyIconIcons10 categories · size · strokeWidthcurrentColor · amber when activeYesYesStableAlso used in the bottom tab bar.
TAXONOMY_ICONSIconsordered arrayYesYesStableIterate it for menus and catalogues.
BottomTabBarNavigation5 tabsactive · inactiveNot applicableYesNewh64 + safe area. Icons 21, label 10.
MobileHeaderNavigationback+title · brand+titlestickyNot applicableYesNewCompact variant of Topbar.
BottomActionBarNavigation1 primary + 2 secondaryfixedNot applicableYesNewh62, bottom 64, shadow cast upwards.
ResultSummaryProductpinned charcoalsticky · liveNot applicableYesNewA ResultPanel variant: recommended + range + size + “View breakdown”.
ResultSheetProductbottom sheetopen · closedNot applicableYesNewTop radius 18, max 78%, grab 38×4, scrim .6.
FilterChipsDataone line, scroll-xactive solid amber · inactivePartialYesNewNever wraps to two lines.
Checkbox · RadioFormsNoNoNeeds reviewThey do not exist in the system (see NR‑13).
Skeleton · SpinnerFeedbackNoNoNeeds reviewNo loading component (see NR‑07).
10

Design → Implementation

How the system scales: a foundation decision becomes a token, the token dresses a component, the component composes a product pattern, and the pattern is instanced on a screen. The chain is the same for everything.

01 · Foundation
Decision
A single warm accent, rationed
Amber marks only the moments that matter; everything else is graphite.
02 · Token
Variable
--re-amber #e0911e
--re-amber-bright #f5b342
It lives in tokens/colors.css. Everything else references it.
03 · Component
Primitive
Button variant="accent"
StatTile amberValue
The component never hardcodes the hex: it reads the variable.
04 · Pattern
Composition
Recommended value
+ range + track
The amber figure on charcoal with its range: business meaning.
05 · Screen
Instance
Calculator.html
ResultSummary (mobile)
The same pattern at three densities, without deciding anything again.

How to consume the system

1 · Styles

Link one single file. It is an @import manifest: it brings fonts, colours, typography, spacing, elevation and the base reset.

<link rel="stylesheet" href="styles.css">
<body class="re-root">

2 · Theme

Nothing to configure: dark is the system’s only theme, and it is what :root applies by default.

3 · Components

const { Button, Card, StatusBadge } =
  window.PresupuestadorREDesignSystem_84f335;

Rules for new surfaces

  • Never a literal hex: always var(--re-*). If a token is missing, it is added to the system, not to the screen.
  • Never re-explore typography: it is frozen.
  • Respect amber rationing: recommended value · active rail/tab · CTA · logo.
  • Icons: copy the shapes from the kit; 24×24, stroke 1.7–1.8, round caps.
  • No emoji, no gradients, no glass, no decorative blur.
  • The 5 product rules in §00 are not negotiable from design.
  • Figures: tabular-nums and Uruguayan format, always.

Migrating to Figma

  • The §01 tokens map 1:1 to Figma variables (colour, number for spacing/radius, string for families).
  • The §02 variants map to component properties (variant, size, tone, status).
  • The three breakpoints in §07 map to page/frame widths 390 · 834 · 1440.

System evolution

The system’s open workstreams and the state each one is in.

Tablet In progress
V2 expansion In development
Light theme Planned
Internal audit log (13 notes)

Inconsistencies and gaps found while auditing the system. They stay written down so each is resolved as an explicit decision rather than patched along the way. This is internal working material.

NR‑01

Prose vs. token in --re-ink-4. The readme describes #686d76; the real token is #7f858e (raised to meet WCAG AA). The readme's prose fell out of date with the token file.

NR‑02

LogoMark default tagline. The component ships 'RE · v1.0'; the kit and the mockups show “REstimator · motor v1.5”. Decide which one is canonical.

NR‑03

--re-text-xl (21px) undocumented. It exists in tokens/typography.css but is missing from the scale described in the readme (40 · 23 · 17 · 14.5 · 14 · 13 · 12 · 11).

NR‑04

Control height per breakpoint. --re-control-h is 40px (desktop) but the Mobile v1 spec uses 42px. There is no mobile control token: today the 42 is hardcoded.

NR‑05

Breakpoints not tokenised. 390 / 834 / 1200–1440 live in prose and specs, not in tokens/.

NR‑06

No field error state. Field/Input do not expose error/invalid. Consistent with the warn-only engine, but it leaves inline validation undefined should it ever be needed.

NR‑07

No loading or empty state as components. There is no skeleton/spinner; empty states are copy inside screens.

NR‑08

Amber rationing on mobile. The rule defines four moments; mobile adds the active tab (amber-ink) and the active filter chip (solid amber). The rule needs restating for touch, or those uses reclassifying as “active rail”.

NR‑09

6 mobile components specified but not built. BottomTabBar · MobileHeader · BottomActionBar · ResultSummary · ResultSheet · FilterChips exist in Mobile v1 but not in components/.

NR‑10

Obsolete starting points. The kit’s 4 screens are marked @startingPoint, a mechanism consuming projects no longer offer. templates/ replaced it, and today there are 0 templates.

NR‑11

Fonts over CDN. tokens/fonts.css imports Hanken Grotesk and JetBrains Mono from Google Fonts. A truly offline standalone export would need them self-hosted or inlined.

NR‑12

Tablet without an artifact. The layer is documented but there is no tablet screen in ui_kits/; its values come from the refinement mockups.

NR‑13

No Checkbox or Radio. The product avoids them (it uses Select, SegmentedControl and Toggle), but this is worth stating as an explicit system decision rather than leaving it as a gap.

REstimator Design System — Master Documentation 147 tokens · 33 components