REstimator Design System
El sistema de diseño de Presupuestador RE, una herramienta B2B de presupuestación para talleres de herrería y metalurgia. Dark industrial, denso, desktop‑first y con un único acento ámbar racionado. Esta documentación reúne sus foundations, sus componentes, sus patrones de producto y su sistema responsive.
Visión general
Presupuestador RE ayuda a presupuestadores y dueños de taller a producir cotizaciones más rápidas y consistentes con criterios estandarizados: familias → subcategorías → dimensiones, rangos de precio calibrados, jornales y referencias de material. Es una herramienta de trabajo diario.
Propósito del sistema
Codificar ese producto como foundations, componentes y recreaciones de pantalla reutilizables, para que cualquier superficie nueva se construya on‑brand en minutos. El prototipo mid‑fi V1 congelado es la referencia: la arquitectura de información, los flujos y la estructura de pantallas ya están decididos. El sistema eleva únicamente la calidad visual; no rediseña flujos ni cambia la IA.
Principios
Arquitectura general
| Capa | Ubicación | Qué contiene |
|---|---|---|
| Entrada global | styles.css | Manifiesto de @import únicamente. Los consumidores enlazan este archivo. |
| Tokens | tokens/ | fonts · colors · typography · spacing · elevation · theme-light · base |
| Componentes | components/ | React, 6 categorías. Namespace window.PresupuestadorREDesignSystem_84f335 |
| Foundation cards | guidelines/ | 16 especímenes de color, tipo, espacio, marca y validación de tema. |
| UI kit | ui_kits/presupuestador/ | 5 pantallas hi‑fi interactivas del producto congelado, dark. Token‑driven vía kit.css + shell.js |
| Spec mobile | Mobile v1 - Spec de implementación.html | 3 pantallas mobile finales con medidas, spacing, sticky y componentes. |
| Agent skill | SKILL.md | Hace la carpeta usable como Agent Skill en Claude Code. |
Estado y versionado
Congelado
- IA, flujos y estructura de pantallas (V1).
- Pairing tipográfico (2026‑06‑16) — no re‑explorar.
- Las 5 reglas de producto (abajo).
Estable y en uso
- 147 tokens · tema dark.
- 33 componentes exportados.
- 5 pantallas desktop del kit.
Especificado, sin construir
- 6 componentes mobile (Mobile v1).
- Capa tablet (documentada, sin artefacto).
- templates/ — 0 templates.
Reglas de producto no negociables
Vienen de S12 y se respetan en toda superficie nueva. Son reglas del dominio del negocio, no criterios de diseño.
Fundamentos
147 tokensTodos los valores de esta sección son los tokens reales del sistema, leídos de tokens/. Los componentes leen siempre var(--re-*), así que ninguno fija un valor a mano.
Color · rampa grafito (base dark)
Charcoal — paneles más profundos
Ámbar — el único color de marca
Regla de racionamiento del ámbar. El ámbar aparece en exactamente cuatro clases de momento: el precio recomendado (cifra ámbar sobre el charcoal más profundo), el rail de navegación activo, el CTA primario / de envío y el logo. Todo lo demás se resuelve con grafito y hairlines. Ver NR‑08 por la extensión de esta regla a mobile.
Semánticos (ajustados para dark)
Ciclo de vida del presupuesto (Historial)
Aliases semánticos — preferilos en componentes y pantallas
| Alias | Resuelve a | Alias | Resuelve a |
|---|---|---|---|
| --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 |
Tema light — planificado
Planificado El sistema publicado tiene un solo tema: dark. Existe un remap de color explorado —superficies blanco cálido, tinta grafito, bordes gris cálido— que dejaría intactos espaciado, tipografía, radios, jerarquía e interacción, con el ámbar como único acento. Todavía no forma parte del sistema y no se documenta como disponible.
Tipografía · CONGELADA
El pairing es final y no se re‑explora. Se evaluó una alternativa con Plus Jakarta Sans contra las pantallas reales (Typography Comparison.html) y fue rechazada: Hanken ganó en densidad, legibilidad a tamaño chico y tono industrial.
Primary UI — Hanken Grotesk
Technical — JetBrains Mono
PRE-2026-0148
Escala real
| Token | Valor | Uso | Muestra |
|---|---|---|---|
| --re-text-display | 40px | La cifra hero de “recomendado” | $135.599 |
| --re-text-2xl | 23px | H1 de página | Calculadora |
| --re-text-xl | 21px | H1 compacto | Historial |
| --re-text-lg | 17px | H2 de sección | Dimensiones |
| --re-text-md | 14.5px | Títulos de card | Encabezado del presupuesto |
| --re-text-base | 14px | Body / controles | Ancho de paso |
| --re-text-sm | 13px | Body secundario, celdas | Pedro Núñez · Barandas |
| --re-text-xs | 12px | Hints, captions | decimales con coma |
| --re-text-2xs | 11px | Eyebrows, labels uppercase | FABRICACIÓN ESTIMADA |
Pesos · 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
| Clase | Qué hace |
|---|---|
| .re-root | Tipo base del documento: family, 14px, lh 1.45, tracking, color, antialiasing, font-feature-settings:"tnum" 1,"ss01" 1. Opt‑in en <body> o wrapper. |
| .re-num | Cifras tabulares — dinero, medidas, códigos, fechas. |
| .re-mono | Cambia a JetBrains Mono. |
| .re-eyebrow | Eyebrow / kicker: 11px, 600, +0.06em, uppercase, color faint. |
Números y unidades — formato uruguayo, siempre tabular
| Tipo | Formato | Ejemplo |
|---|---|---|
| Dinero | punto de miles, sin decimales | $168.000 |
| Medidas | coma decimal + unidad | 0,80 m · 2,90 m |
| Jornales | coma decimal, un decimal | 7,0 |
| Porcentajes | signo + valor | + 8% · IVA 22% |
| Códigos | mono, mayúsculas | GV-A-00148 · ESC-RECT |
Spacing · grilla de 4px
Sizing · constantes de layout (del shell V1 congelado)
- Sidebar
- 248px
- Topbar
- 60px
- Ancho de documento
- 1080px
- Control estándar
- 40px
- Control compacto
- 32px
Radius
Borders
La estructura se dibuja con líneas de 1px, no con fills pesados. Hairlines en todas partes: --re-line para divisores y bordes de card, --re-line-2 en inputs, --re-line-strong para énfasis y dashed.
Elevation
En dark la profundidad es una superficie más clara + un borde de 1px; las sombras son profundas y calladas por debajo. Sin glow, sin sombra de color.
Iconography
Reglas
- SVG de línea inline únicamente. viewBox 24×24, stroke="currentColor", stroke-width ~1.7–1.8 (1.7 nav/UI, 2 chevrons/flechas), caps y joins redondos.
- Heredan el color del texto y se sitúan a 15–18px.
- Sin icon font, sin sprite, sin PNG, sin emoji, sin pictogramas unicode. Un “✓” en toasts transitorios es la única excepción.
- Para superficies nuevas, copiá las formas del kit antes de recurrir a una librería. No hay set de CDN incluido: el set es chico y mantenido a mano.
Glifos recurrentes
Familia de taxonomía de producto — TaxonomyIcon
10 glifos de categoría de fabricación dibujados en el mismo lenguaje (24×24, stroke 1.7, sin fills, sin librería externa): escaleras · barandas · rejas · cerramientos · puertas · portones · mobiliario · estructuras · techos · parrilleros. Se usan en rails de rubro, dropdowns, cards de catálogo y chips para que el producto lea como herramienta especializada de metalurgia y no como app de negocio genérica. API: <TaxonomyIcon name="rejas" size={18} strokeWidth={1.7}/>; iterá TAXONOMY_ICONS para menús; color vía currentColor (ámbar en activo).
Motion
Mínimo y funcional. .12–.15s ease en hover / border / background; los toggles deslizan su knob; el único movimiento ambiente es el pulso lento del punto “En vivo” en paneles live. Sin bounces, sin parallax, sin coreografía de entrada, sin efectos de escala.
Breakpoints
| Capa | Ancho de referencia | Rol |
|---|---|---|
| Desktop | ≥ 1200 · diseño 1440 | Capa primaria. Sidebar fijo + panel de resultado lateral. |
| Tablet | 834 | Capa intermedia con identidad propia: tabs superiores + bottom sheet. |
| Mobile | 390 · fluido 360–430 | Diseñada, no adaptada. Bottom tab bar + resumen pinneado. |
Los breakpoints no están tokenizados: viven en prosa y en las specs, no en tokens/. Cualquier implementación los está hardcodeando.
Accessibility foundations
| Decisión | Valor | Por qué |
|---|---|---|
| Contraste de labels tenues | --re-ink-4 #7f858e | Elevado desde #686d76 (≈3.4:1) para superar WCAG AA 4.5:1 sobre superficies. |
| Focus visible | --re-ring 3px ámbar | Anillo de 3px + borde ámbar en todo control enfocable. Nunca se remueve el outline sin reemplazo. |
| Touch targets | ≥ 44px | Mínimo táctil en mobile/tablet; los controles de 42px visuales llevan área extendida. |
| Iconos sin texto | title obligatorio | IconButton exige title, usado como tooltip y aria-label. |
| Cifras | tabular-nums | Dinero y medidas nunca “bailan” entre estados; comparación vertical fiable. |
| Estado nunca sólo por color | punto + etiqueta | El ciclo de vida usa punto de color y etiqueta en español. |
Componentes
33 exports · 6 categoríasLos 33 componentes exportados por window.PresupuestadorREDesignSystem_84f335. Cada directorio tiene <Name>.jsx + .d.ts + .prompt.md y un specimen *.card.html. Los especímenes de abajo son réplicas token‑driven de los componentes reales (mismos tokens, misma anatomía) para que este documento no dependa de un runtime React.
Cómo leer los subcomponentes. Varios exports viven en un archivo padre: Field/Input/Select/Textarea ← forms/Input.jsx · Card/CardHead/CardBody/SectionHead ← layout/Card.jsx · AppShell/LogoMark/Sidebar/NavGroup/NavItem/Topbar/Breadcrumbs/UserChip ← navigation/AppShell.jsx · Table/TableToolbar/RowActions/Pagination ← data/Table.jsx · Badge/StatusBadge y Alert/AlertGroup ← sus archivos de feedback/.
Button
Propósito
Control de acción principal. Exactamente un primary (o accent) por vista; todo lo demás es secondary o ghost.
API
- variant
- secondary | primary | accent | ghost
- size
- sm | md | lg
- block
- boolean
- iconLeft / iconRight
- ReactNode (16px)
Semántica de variantes
- secondary — outline neutro, el caballo de batalla.
- primary — fill charcoal sólido, la acción principal única de la pantalla.
- accent — fill ámbar de marca, reservado a acciones hero de envío/compartir.
- ghost — sin borde, acciones inline de baja énfasis.
Tokens
IconButton · Toggle · SegmentedControl
- variant
- default 34 | bare 30
- danger
- boolean
- title
- obligatorio
Icon‑only para topbar y acciones de fila. title se usa como tooltip y aria-label.
- pressed / defaultPressed
- boolean
- size
- md | sm
- accent
- boolean
- disabled
- boolean
- options
- 2–3 items
- value
- string
- onChange
- (value) => void
Más de 3 opciones → usar Select.
Field · Input · Select · Textarea
API
| Export | Props relevantes |
|---|---|
| Field | label · optional · note · htmlFor |
| Input | prefix · suffix · leadIcon · num |
| Select | children (<option>) · chevron propio |
| Textarea | nativo · resize vertical |
Comportamiento
- Field envuelve: label + hint inline (“opcional”) + control + note con icono.
- num activa cifras tabulares y alineación para dinero y medidas.
- prefix/suffix para $ y unidades (m, %).
- Focus: borde ámbar + --re-ring. Disabled: opacidad .45.
No existe prop de error/invalid en Field ni Input. La validación del producto es warn‑only vía Alert, así que el error inline a nivel campo no está definido en el sistema.
Badge · StatusBadge
API
- Badge · tone
- neutral | ok | warn | crit | info
- Badge · dot
- boolean
- Badge · square
- chip mono de código
- Badge · icon
- ReactNode
- StatusBadge · status
- draft | sent | appr | rej | cancel
- StatusBadge · label
- override del español
Uso
- StatusBadge mapea automáticamente color de punto + etiqueta en español. No armes el pill a mano.
- square para códigos (GV-A-00148, ESC-RECT): mono, radio 5px.
- El estado nunca se comunica sólo por color: siempre punto + texto.
Alert · AlertGroup
API
- Alert · tone
- warn | ok | info | crit | neutral
- Alert · icon
- ReactNode · null oculta
- Alert · title
- lead line en negrita
- AlertGroup · title
- “Alertas y recordatorios”
- AlertGroup · items
- ReactNode[]
Comportamiento
- El motor es warn‑only y nunca bloquea; por eso warn es el tono por defecto y el icono default es el triángulo.
- AlertGroup es el panel titulado de recordatorios con bullets.
- Microcopy: icono info/lock + una sola oración.
Tokens
Card · CardHead · CardBody · SectionHead
Esta card es el especímen: CardHead (tile de icono + título + hint + acciones) sobre un divisor, luego CardBody.
API
| Export | Props |
|---|---|
| Card | pad (20/24 interno) · flush (clip para tablas) |
| CardHead | icon · title · hint · actions |
| CardBody | tight (menos padding para tablas/listas) |
| SectionHead | index · title · hint · tools |
Anatomía
Superficie grafito, borde --re-line de 1px, --re-shadow-sm, radio --re-r-lg 13px. flush cuando la card envuelve una tabla a sangre.
Hacer / No hacer
- Do — usar SectionHead numerado para pasos de un flujo largo (calculadora, editor).
- Don't — anidar cards dentro de cards; para agrupar dentro de una card usá SectionHead + divisores.
StatTile
API
- label
- uppercase
- value
- tabular
- sub
- línea de apoyo
- accent
- variante charcoal
- dot
- punto de estado live
- amberValue
- cifra en ámbar
Uso
- Fila de KPI del dashboard y grillas de estado.
- accent es para un solo tile destacado por fila: es el ancla charcoal.
- amberValue con moderación: sólo cifras headline (respeta el racionamiento del ámbar).
- dot se combina con accent para paneles “En vivo”.
TechnicalPreviewCard · TechnicalRenderers
El único dibujo sancionado del sistema: planos y elevaciones esquemáticos generados paramétricamente desde las dimensiones del propio presupuesto. Son diagramas medidos, con líneas de estructura grafito de 1px, overlays de dimensión token‑driven y ámbar reservado al indicio de entrada/baranda.
Registro
Basado en registro: family/variant seleccionan un renderer. Escaleras trae cuatro: recta (elevación lateral), L, U y caracol (vistas en planta). Las familias desconocidas caen a un placeholder “sin vista técnica”.
Uso permitido
- Previews de calculadora y editor, filas de historial, documento al cliente.
- Nunca dibujar arte de producto decorativo a mano.
API
- family
- Escaleras | otras → placeholder
- variant
- recta | L | U | caracol
- dims
- ancho · altura · avance · escalones · huella · contrahuella · diametro
- config
- string[] de chips
- size
- compact | standard | large
- title / code
- override · código mono
- showDims
- default true
- live
- indicador “En vivo”
Densidades
- compact — head + dibujo + footer.
- standard — + 4 dimensiones + chips.
- large — stage más grande + 6 dimensiones.
Extender
TechnicalRenderers.register(family, variant, def) · setFamilyLabel · has · variants · families, todos encadenables. escalones se clampea a 4–16; un chip que matchee /baranda|pasamano/ dibuja la baranda en recta.
Navegación y App Shell
El shell desktop es la capa primaria y está congelado desde V1: sidebar sticky de 248px + topbar sticky de 60px + main con scroll. Mobile no comprime ese shell: cambia de patrón.
Desktop — AppShell
Topbar · Breadcrumbs · UserChip
API
| Export | Props |
|---|---|
| AppShell | sidebar · topbar · children |
| LogoMark | mark ("RE") · name · tagline |
| Sidebar | logo · footer · children |
| NavGroup | label · first |
| NavItem | icon · label · active · as |
| Topbar | breadcrumbs · actions |
| Breadcrumbs | items: {label, href}[] |
| UserChip | name · role · initials |
LogoMark tiene tagline por defecto 'RE · v1.0', pero las pantallas del kit y los mockups muestran “REstimator · motor v1.5”. Hay que unificar el default o pasarlo siempre explícito.
Mobile — navegación inferior y header compacto
Mobile es diseñada, no adaptada: el sidebar no se “oculta”, se reemplaza por una bottom tab bar de 5 familias. Los breadcrumbs desaparecen (los sustituye título + back) y el branding aparece una sola vez por header.
| Elemento | Medida | Comportamiento | Estado en el DS |
|---|---|---|---|
| BottomTabBar | h 64 + safe-area | fixed bottom. 5 tabs: Inicio · Calc · Historial · Catálogos · Parám. Iconos 21, label 10. Activo --re-amber-ink. | Nuevo |
| MobileHeader | h ~62 | sticky top. Back + título (Calculadora) o marca + título (Inicio / Historial). Sin breadcrumbs, sin sub‑copy. | Nuevo |
| BottomActionBar | h 62 · bottom 64 | fixed sobre la tab bar. Sólo Calculadora: Guardar (primary) · Estimación · Presupuesto. | Nuevo |
| AppShell (modo mobile) | — | Mismo árbol de rutas, tres modos de navegación (sidebar / tabs / bottom bar). | Extendido |
Comportamiento sticky / fijo
| Capa (de abajo hacia arriba) | Alto | Posición | z-index | Dónde |
|---|---|---|---|---|
| Bottom tab bar | 64 | fixed bottom 0 | 40 | Mobile |
| Action bar | 62 | fixed bottom 64 | 35 | Mobile · Calculadora |
| Header compacto | ~62 | sticky top 0 | 30 | Mobile |
| Resumen recomendado | auto ~108 | sticky bajo header | 28 | Mobile · Calculadora |
| Bottom sheet (desglose) | máx 78% | overlay + scrim | 60 | Mobile · Tablet |
| Sidebar / Topbar | 248 / 60 | sticky | — | Desktop |
| Panel de resultado | 380 col | sticky lateral | — | Desktop · Calculadora |
| Save bar | auto | fixed bottom · shadow-bar | — | Desktop · Editor / Parámetros |
Formularios y entrada de datos
Los formularios son el corazón del producto: la calculadora es un formulario largo con resultado en vivo. La entrada de datos privilegia velocidad de tipeo y lectura tabular por encima de adornos.
Inventario de controles
| Control | Export | Variantes / tamaños | Estados definidos |
|---|---|---|---|
| Text input | Input | prefix · suffix · leadIcon · num | default · focus · disabled · placeholder |
| Select | Select | native + chevron propio | default · focus · disabled |
| Textarea | Textarea | resize vertical | default · focus · disabled |
| Search | Input + leadIcon | patrón, no componente aparte | default · focus · con valor |
| Toggle | Toggle | md 38 · sm 32 · accent | on · off · disabled |
| Segmented | SegmentedControl | 2–3 opciones, con/sin icono | selected · unselected |
| Wrapper de campo | Field | label · optional · note | — |
| Checkbox · Radio | — | No existen como componentes. El producto resuelve la elección con Select, SegmentedControl y Toggle. Ver NR‑13. | |
Estados de control
Hover · focus · pressed · disabled — reglas globales
| Estado | Tratamiento |
|---|---|
| Hover | fill a --re-surface-2 + borde a --re-line-strong (o amber‑darken en CTAs ámbar) |
| Focus | ring ámbar de 3px (--re-ring) + borde ámbar |
| Pressed / activo | toggles y páginas activas voltean a ámbar |
| Disabled | opacidad .45, sin eventos |
| Transición | .12–.15s ease en background / border. Sin shrink ni scale. |
Validación · errores · éxito
El motor de cálculo es warn‑only y nunca bloquea. Esa decisión de producto define toda la validación: los avisos se agrupan como Alert junto al resultado, no como errores de campo que impidan avanzar.
Patrón de data entry — formularios largos
- Pasos numerados con SectionHead: Producto → Dimensiones → Opciones constructivas → Terminación / colocación / zona.
- Una card por paso; grilla de 2–3 columnas en desktop, 1–2 en tablet, 1 en mobile.
- Unidades siempre visibles como suffix, nunca sólo en el label.
- Coma decimal en medidas — el hint del paso lo recuerda (“decimales con coma”).
- Recálculo en vivo: no hay botón “calcular”; el panel de resultado muestra el punto “En vivo”.
- Campos opcionales marcados con hint inline optional, no con asterisco en los obligatorios.
Save bar
Editor y Parámetros usan una barra fija inferior con recuento de cambios (“1 cambio de calibración local”) + Restaurar por defecto + Guardar cambios. Sombra hacia arriba (--re-shadow-bar).
Visualización de datos
Historial es la superficie de datos principal: tabla densa, filtros que funcionan, estado como punto de color sobre pill neutra y acciones de fila reveladas en hover.
Table · TableToolbar · RowActions · Pagination
API
| Export | Props |
|---|---|
| Table | children (thead/tbody propios) |
| TableToolbar | title · count · actions |
| RowActions | children (IconButtons) |
| Pagination | showing · pages · current · onPage |
Helpers
- Clases de header: is-right · is-center · is-sortable.
- Clases de celda: re-cell-strong (primaria) · re-cell-sub (línea secundaria).
- Envolver en <Card flush>: la card recorta el desborde de la tabla.
- RowActions se revela en hover de fila.
Montos y cifras
- Columna de monto alineada a la derecha, tabular-nums, peso 600.
- Código en mono a 11,5px, color --re-ink-3.
- Fila de dos líneas: primaria (re-cell-strong) + secundaria cliente · fecha.
Empty state — el patrón real del producto
Los estados vacíos explican la regla, no sólo dicen “sin resultados”.
No hay componente de loading / skeleton en el sistema, y los empty states existen sólo como copy dentro de pantallas, no como componente reutilizable.
Cards, tiles y badges como display
Ya documentados en §02: Card family para contenedores, StatTile para KPI y grillas de estado, Badge/StatusBadge para etiquetas, códigos y ciclo de vida, TechnicalPreviewCard para el dibujo esquemático del producto.
Patrones de producto
Patrones propios de REstimator. No son componentes: son composiciones con significado de negocio, y varias están gobernadas por las reglas no negociables del §00.
Valor recomendado y rangos
Reglas del patrón
- El recomendado es la única cifra ámbar de la pantalla y vive sobre el charcoal más profundo.
- Siempre se muestra con su rango (mín / máx) y un pin en el track: el número nunca aparece solo.
- El precio sale de Fab_min/Fab_max calibrados, no de jornales × valor.
- Siempre etiquetado “valor de fabricación · + IVA”: nunca se insinúa que es precio final.
- El panel lleva el punto “En vivo”: recálculo continuo, sin botón calcular.
Jornales — control, no precio
Pasos del resultado
El panel de resultado siempre presenta los mismos pasos numerados, en el mismo orden, en los tres breakpoints:
| Paso | Bloque | Qué comunica |
|---|---|---|
| 1 | Fabricación estimada | Rango mín–máx + track con pin del recomendado. |
| — | Recomendado | Bloque charcoal con la cifra ámbar. El ancla visual. |
| 2 | Jornales · mano de obra | Mín / Rec. / Máx como control de carga. |
| 3 | Colocación (sugerida) | Rango + base de cálculo (~10% de fabricación) + zona. |
| 4 | Subtotal | Fabricación + colocación → subtotal, con “+ IVA” explícito. |
| 5 | Override | Ajuste manual del precio final, siempre visible como campo aparte. |
| 6 | Alertas | AlertGroup warn‑only al pie del panel. |
Creación y edición de presupuestos
Flujo de la calculadora
- 1 Producto — familia → subcategoría (taxonomía de 10 rubros).
- 2 Dimensiones — medidas en metros, coma decimal.
- 3 Opciones constructivas — estructura, contrahuella, antideslizante, baranda.
- 4 Terminación · colocación · zona — DTM, tipo de colocación, zona geográfica.
- Encabezado del presupuesto opcional y compactable: no roba protagonismo al formulario.
Clasificación
Familias → subcategorías es la columna vertebral. TaxonomyIcon acompaña cada rubro en rails, dropdowns, cards de catálogo y chips.
Ciclo de vida y acciones
- Estados: Borrador → Enviado → Aprobado / Rechazado / Cancelado.
- Sin borrado físico: el cambio de estado es suave y reversible.
- Duplicar es de primera clase: retomar una cotización previa es el camino más común.
- Freeze: al publicarse, el presupuesto congela su versión de parámetros y queda inmutable.
- Override: el ajuste manual queda registrado, no reemplaza silenciosamente al recomendado.
Filtros y búsqueda
- Búsqueda por N°, cliente u obra en un único input con leadIcon.
- Filtros por tipo/estado en una línea; en mobile con scroll horizontal y activo ámbar sólido.
- Contador de resultados siempre visible (“58 resultados”).
El documento al cliente — la única superficie clara
El resumen al cliente se renderiza como una hoja de papel blanca real (es el artefacto imprimible / WhatsApp / PDF) apoyada sobre el banco de trabajo oscuro; su fila de total es charcoal con el total en ámbar. Todo lo demás del producto es oscuro. Modos estimación y formal vía SegmentedControl. Voz en tercera persona formal (“Le compartimos una estimación…”), nunca voseo. Nunca serializa rangos, jornales, márgenes ni calibración (regla 5).
Voz y microcopy
| Regla | Aplicación |
|---|---|
| Idioma | Español de Uruguay, voseo rioplatense en imperativo: “Agregá notas…”, “buscá, filtrá y retomá”. Nunca “añade/busca”. |
| Tono | Llano, operativo, confiable. Declarativas cortas. Explica por qué existe un número sin titubear. |
| Casing | Sentence case en todo lo legible. UPPERCASE + tracking sólo en eyebrows chicos. |
| Persona | La app te habla a vos (el presupuestador). El documento al cliente es formal en tercera persona. |
| Emoji | Nunca. Un “✓” en confirmaciones transitorias es el único carácter decorativo. |
| Notas de ayuda | Icono info/lock + una sola oración. |
Sistema responsive
El mismo sistema en tres densidades. Mobile no es otro producto: son los mismos tokens, la misma taxonomía, los mismos pasos de resultado y el mismo vocabulario, con el patrón de navegación y de resultado que corresponde al espacio disponible.
Transformación por aspecto
| Aspecto | Mobile · 390 | Tablet · 834 | Desktop · 1440 |
|---|---|---|---|
| Navegación | Bottom tab bar (5 familias) + título contextual | Tabs superiores de familia bajo el header | Sidebar izquierdo fijo 248px |
| Branding | Monograma RE en header (avatar = usuario, no marca) | Monograma + nombre compactos | Logo + nombre + versión de motor en sidebar |
| Breadcrumbs | Ocultos — los reemplaza título + back | Compactos, opcionales | Completos en el topbar |
| Header | Sticky compacto: back + título; sin sub‑copy | Sticky: título + acción | Topbar + page‑head |
| Resultado | Resumen pinneado arriba + sheet a demanda | Bottom sheet colapsable con peek | Panel lateral sticky 380px |
| Acciones primarias | Barra fija sobre el tab bar | En el peek del sheet + dentro del panel | Dentro del panel de resultado |
| Sticky | Header + resumen + barra de acciones | Header + peek del sheet | Panel de resultado + save bar |
| Formularios | 1 campo por fila; secciones numeradas con anclas | Grilla de 2 columnas con respiración | Grilla de 2–3 columnas |
| Densidad | Cards apiladas, gap 14, padding 16 | Intermedia, padding 22 | Densa, padding 20/24, gap 16–20 |
| Tablas / listas | Fila = card; tap abre; secundarias en ⋯ | Tabla reducida o cards según ancho | Tabla completa + RowActions en hover |
| Control | 42px | 42px | 40px (--re-control-h) |
Patrón de resultado — decisión por breakpoint
Se evaluaron cuatro opciones (lateral sticky · superior resumido · bottom sheet · híbrida) y se eligió la composición híbrida: ninguna opción única gana en los tres tamaños, así que el patrón se adapta al espacio. El recomendado queda siempre glanceable; el desglose está a un tap.
Desktop ≥ 1200
Espacio horizontal de sobra: el desglose completo queda sticky junto al formulario, como ya venía funcionando.
Tablet 834
Formulario a ancho cómodo; barra‑peek inferior con recomendado + rango + CTA. Se expande sin tapar campos.
Mobile 390
Header de resultado pinneado (recomendado + rango + tamaño); “Ver desglose” abre el sheet. Acciones en barra fija.
Constantes mobile v1
- Viewport base
- 390 × 844
- Rango fluido
- 360–430
- Grilla
- 4px (--re-s*)
- Padding de pantalla
- 16 (s4)
- Gap entre cards
- 14
- Card
- r13 · pad 16
- Control
- h42 · r7
- Touch target
- ≥ 44
- Safe area
- env(safe-area-inset-bottom)
Reglas de adaptación de componentes
- Nada se “oculta” solamente. Si un elemento no cabe, se reemplaza por su equivalente táctil.
- Acción dominante por tap: la fila entera abre; las secundarias van a un overflow ⋯.
- Chips en una línea con scroll horizontal; el activo es ámbar sólido, nunca wrap a dos líneas.
- Sin sub‑copy en headers táctiles: título + back y nada más.
- Una sola marca por header: monograma = app, avatar = usuario.
- El bottom sheet sólo transporta el desglose: nunca se convierte en navegación.
Spec completa: Mobile v1 — Spec de implementación
La capa tablet está documentada y especificada, pero no existe artefacto de pantalla tablet en ui_kits/. Los valores tablet provienen de los mockups de refinamiento, no de una pantalla del kit.
Ejemplos de pantalla
5 desktop · 3 mobileLas pantallas del producto construidas con el sistema. Las cinco de desktop son las del UI kit; las tres de mobile vienen de la spec de implementación Mobile v1. Cada una está capturada en alta resolución y se puede abrir para recorrerla.
Desktop — UI kit
Capturas de las pantallas reales del kit. Hacé click en cualquiera para abrirla y recorrerla completa.
Mobile v1 — pantallas finales
Calculadora, Inicio e Historial quedaron congeladas para implementación, con medidas, spacing, componentes y comportamiento sticky por pantalla. Se documentan en su propio archivo para no duplicarlas acá.
Exploración de color
Las cinco pantallas de desktop con un remap de color claro, lado a lado contra el sistema oscuro. Cambian superficies, tinta, bordes y sombras; el espaciado, la tipografía, los componentes y la jerarquía son los mismos, y el ámbar sigue siendo el único acento. La rampa de tinta está calibrada contra el contraste que ya alcanzaba el tema oscuro, no elegida a ojo. Es una exploración: el sistema publicado tiene un solo tema, dark.
Documentación de respaldo
Los documentos donde se decidieron las cosas que este sistema da por resueltas: auditorías, el cierre de alcance de la V1 y el paquete de handoff.
| Artefacto | Tipo | Qué contiene |
|---|---|---|
| Refinamiento HiFi — Auditoría y Decisiones | Auditoría | Auditoría wireframe vs HiFi, problemas UX/visuales, comparación A/B/C/D del panel de resultado. |
| Typography Comparison | Auditoría | Hanken vs Plus Jakarta contra pantallas reales — decisión de congelar Hanken. |
| V1 Design Freeze · Readiness Audit | Freeze | Cierre de alcance V1 y verificación de que el sistema estaba listo para congelarse. |
| Accessibility Review · UX Review | Review | Resultados de las revisiones de accesibilidad y de UX sobre el kit congelado. |
| Claude Code Handoff Package | Handoff | Paquete de handoff a desarrollo. |
Se listan como inventario, sin publicarse. Los nombres son los originales de cada documento.
Inventario de componentes
33 construidos · 6 especificadosLos 33 componentes construidos y los 6 que quedaron especificados, con lo que cada uno cubre hoy en desktop y en mobile. La columna Estado dice en qué punto del sistema está:
- Estable
- construido y en uso.
- Extendido
- existe, y le falta cobertura para mobile.
- Nuevo
- especificado en Mobile v1, todavía sin construir.
- Requiere revisión
- tiene una inconsistencia documentada.
| Componente | Categoría | Variantes | Estados de UI | Desktop | Mobile | Estado | Notas de implementación |
|---|---|---|---|---|---|---|---|
| Button | Formularios | secondary · primary · accent · ghost / sm·md·lg | default · hover · focus · disabled | Sí | Sí | Estable | Un solo primary/accent por vista. Mobile usa h42 en barras de acción. |
| IconButton | Formularios | default 34 · bare 30 · danger | default · hover · focus · disabled | Sí | Parcial | Estable | title obligatorio. En mobile subir a ≥44 de área. |
| Field | Formularios | label · optional · note | — | Sí | Sí | Estable | Wrapper de todos los controles. |
| Input | Formularios | prefix · suffix · leadIcon · num | default · focus · disabled · placeholder | Sí | Sí | Requiere revisión | Sin estado de error/invalid (ver NR‑06). |
| Select | Formularios | native + chevron | default · focus · disabled | Sí | Sí | Estable | Pasar <option> como children. |
| Textarea | Formularios | resize vertical | default · focus · disabled | Sí | Sí | Estable | Notas del presupuesto. |
| Toggle | Formularios | md 38 · sm 32 · accent | on · off · disabled | Sí | Sí | Estable | Track charcoal on; sm para filas de tabla. |
| SegmentedControl | Formularios | 2–3 opciones, con/sin icono | selected · unselected | Sí | Sí | Estable | >3 opciones → Select. |
| Badge | Feedback | 5 tonos · dot · square | estático | Sí | Sí | Estable | square para códigos mono. |
| StatusBadge | Feedback | draft·sent·appr·rej·cancel | estático | Sí | Sí | Estable | Mapea color + etiqueta español automáticamente. |
| Alert | Feedback | warn·ok·info·crit·neutral | estático · con/sin título | Sí | Sí | Estable | warn es default: el motor nunca bloquea. |
| AlertGroup | Feedback | title · items | estático | Sí | Sí | Estable | Panel “Alertas y recordatorios”. |
| Card | Layout | pad · flush | estático · hover en filas | Sí | Sí | Estable | flush para tablas a sangre. |
| CardHead | Layout | icon · title · hint · actions | estático | Sí | Parcial | Estable | En mobile las actions suelen pasar a overflow. |
| CardBody | Layout | default · tight | — | Sí | Sí | Estable | tight para tablas y listas de opciones. |
| SectionHead | Layout | index · title · hint · tools | estático | Sí | Sí | Estable | Pasos numerados de calculadora / editor. |
| StatTile | Layout | default · accent · dot · amberValue | estático | Sí | Parcial | Estable | Un solo accent por fila. |
| TechnicalPreviewCard | Layout | compact · standard · large / 4 renderers | live · placeholder | Sí | No documentado | Extendido | Registro extensible. Comportamiento mobile sin especificar. |
| TechnicalRenderers | Layout | registry API | — | Sí | Sí | Estable | register · setFamilyLabel · has · variants · families |
| AppShell | Navegación | sidebar + topbar + main | — | Sí | Requiere modo | Extendido | Necesita 3 modos: sidebar / tabs / bottom bar. |
| Sidebar | Navegación | logo · footer | — | Sí | No aplica | Estable | 248px fijo, sticky. |
| LogoMark | Navegación | mark · name · tagline | — | Sí | Sí | Requiere revisión | Tagline default desalineado (ver NR‑02). |
| NavGroup | Navegación | label · first | — | Sí | No aplica | Estable | Eyebrow uppercase del sidebar. |
| NavItem | Navegación | icon · label · as | default · hover · active | Sí | Sustituido | Estable | Active = rail ámbar de 3px + label bold. |
| Topbar | Navegación | breadcrumbs · actions | — | Sí | Variante compacta | Extendido | Mobile: back + título, sin breadcrumbs. |
| Breadcrumbs | Navegación | items[] | — | Sí | Ocultos | Estable | Último item en bold. |
| UserChip | Navegación | name · role · initials | — | Sí | Sólo avatar | Estable | En mobile colapsa al avatar. |
| Table | Datos | helpers is-right/center/sortable | row hover | Sí | Fila → card | Estable | Envolver en Card flush. |
| TableToolbar | Datos | title · count · actions | — | Sí | Simplificado | Estable | Pill de recuento de resultados. |
| RowActions | Datos | cluster de IconButtons | revelado en hover | Sí | Overflow ⋯ | Extendido | En táctil no hay hover: requiere menú ⋯. |
| Pagination | Datos | showing · pages · current | current · hover | Sí | No documentado | Extendido | En mobile va a ser scroll infinito o “cargar más”, todavía sin definir. |
| TaxonomyIcon | Iconos | 10 categorías · size · strokeWidth | currentColor · activo ámbar | Sí | Sí | Estable | Usado también en el bottom tab bar. |
| TAXONOMY_ICONS | Iconos | array ordenado | — | Sí | Sí | Estable | Iterar para menús y catálogos. |
| BottomTabBar | Navegación | 5 tabs | active · inactive | No aplica | Sí | Nuevo | h64 + safe-area. Iconos 21, label 10. |
| MobileHeader | Navegación | back+título · marca+título | sticky | No aplica | Sí | Nuevo | Variante compacta de Topbar. |
| BottomActionBar | Navegación | 1 primary + 2 secundarias | fixed | No aplica | Sí | Nuevo | h62, bottom 64, shadow hacia arriba. |
| ResultSummary | Producto | pinned charcoal | sticky · live | No aplica | Sí | Nuevo | Variante de ResultPanel: recomendado + rango + tamaño + “Ver desglose”. |
| ResultSheet | Producto | bottom sheet | abierto · cerrado | No aplica | Sí | Nuevo | Radio sup. 18, máx 78%, grab 38×4, scrim .6. |
| FilterChips | Datos | una línea scroll-x | active ámbar sólido · inactive | Parcial | Sí | Nuevo | Nunca wrap a dos líneas. |
| Checkbox · Radio | Formularios | — | — | No | No | Requiere revisión | No existen en el sistema (ver NR‑13). |
| Skeleton · Spinner | Feedback | — | — | No | No | Requiere revisión | Sin componente de loading (ver NR‑07). |
Diseño → Implementación
Cómo escala el sistema: una decisión de foundation se convierte en token, el token viste un componente, el componente compone un patrón de producto y el patrón se instancia en una pantalla. La cadena es la misma para todo.
--re-amber-bright #f5b342
StatTile amberValue
+ rango + track
ResultSummary (mobile)
Cómo consumir el sistema
1 · Estilos
Enlazá un solo archivo. Es un manifiesto de @import: trae fuentes, colores, tipografía, spacing, elevación y el reset base.
<link rel="stylesheet" href="styles.css">
<body class="re-root">2 · Tema
No hay nada que configurar: dark es el único tema del sistema, y es el que aplica :root por defecto.
3 · Componentes
const { Button, Card, StatusBadge } =
window.PresupuestadorREDesignSystem_84f335;Reglas para superficies nuevas
- Nunca un hex literal: siempre var(--re-*). Si falta un token, se agrega al sistema, no a la pantalla.
- Nunca re‑explorar tipografía: está congelada.
- Respetá el racionamiento del ámbar: recomendado · rail/tab activo · CTA · logo.
- Iconos: copiá las formas del kit; 24×24, stroke 1.7–1.8, round caps.
- Sin emoji, sin gradientes, sin glass, sin blur decorativo.
- Las 5 reglas de producto del §00 no se negocian desde diseño.
- Cifras: tabular-nums y formato uruguayo siempre.
Migración a Figma
- Los tokens de §01 mapean 1:1 a variables de Figma (color, number para spacing/radius, string para families).
- Las variantes de §02 mapean a component properties (variant, size, tone, status).
- Los tres breakpoints de §07 mapean a page/frame widths 390 · 834 · 1440.
Evolución del sistema
Las líneas de trabajo abiertas del sistema y en qué estado está cada una.
Registro interno de auditoría (13 notas)
Inconsistencias y huecos detectados al auditar el sistema. Quedan escritos para resolverse como decisión explícita en vez de corregirse sobre la marcha. Es material de trabajo interno.
Prosa vs token en --re-ink-4. El readme describe #686d76; el token real es #7f858e (elevado para cumplir WCAG AA). La prosa del readme quedó desactualizada respecto del archivo de tokens.
Tagline por defecto de LogoMark. El componente trae 'RE · v1.0'; el kit y los mockups muestran “REstimator · motor v1.5”. Definir cuál es el canónico.
--re-text-xl (21px) no documentado. Existe en tokens/typography.css pero falta en la escala descrita en el readme (40 · 23 · 17 · 14.5 · 14 · 13 · 12 · 11).
Altura de control por breakpoint. --re-control-h es 40px (desktop) pero la spec Mobile v1 usa 42px. No hay token de control mobile: hoy el 42 está hardcodeado.
Breakpoints sin tokenizar. 390 / 834 / 1200–1440 viven en prosa y specs, no en tokens/.
Sin estado de error de campo. Field/Input no exponen error/invalid. Coherente con el motor warn‑only, pero deja sin definir la validación inline si alguna vez se necesita.
Sin loading ni empty state como componentes. No existe skeleton/spinner; los empty states son copy dentro de pantallas.
Racionamiento del ámbar en mobile. La regla define cuatro momentos; mobile agrega el tab activo (ámbar‑ink) y el filter chip activo (ámbar sólido). Hay que reformular la regla para táctil o reclasificar esos usos como “rail activo”.
6 componentes mobile especificados sin construir. BottomTabBar · MobileHeader · BottomActionBar · ResultSummary · ResultSheet · FilterChips existen en Mobile v1 pero no en components/.
Starting points obsoletos. Las 4 pantallas del kit están marcadas @startingPoint, un mecanismo que los proyectos consumidores ya no ofrecen. Lo reemplazaron los templates/, y hoy hay 0 templates.
Fuentes por CDN. tokens/fonts.css importa Hanken Grotesk y JetBrains Mono desde Google Fonts. Para un export standalone verdaderamente offline hay que auto‑hospedarlas o inlinearlas.
Tablet sin artefacto. La capa está documentada pero no hay pantalla tablet en ui_kits/; sus valores vienen de los mockups de refinamiento.
Sin Checkbox ni Radio. El producto los evita (usa Select, SegmentedControl y Toggle), pero conviene declararlo como decisión explícita del sistema en vez de un hueco.

