subproyecto · restyle · v1.0 · jul 2026

Lenguaje de componentes · packages/ui

Una familia de forma, no un kit de fábrica.

La librería compartida tiene 151 componentes (49 raíz + 102 en subcarpetas) y todos visten shadcn de fábrica: rounded-md genérico, sombras neutras, cero opinión. El norte ya existe en el propio producto: el topbar de /search (controles quietos, botones de ícono circulares, bordes finos) y la vibra del sistema de diseño (pills, radios 14, hairlines, tinta noche). Este catálogo muestra las 16 familias núcleo, antes vs después, con su especificación exacta y la receta shadcn — porque shadcn está hecho para esto: cva + tokens, cero forks.

Componentes
151 en packages/ui
Familias maquetadas
16
Mecanismo
cva variants + tokens
Riesgo
Ninguno funcional
01La tesis · clean con identidad
las dos referencias

"Demasiado estándar y sin identidad" tiene diagnóstico técnico: los componentes usan los defaults de shadcn tal cual salieron del generador. La identidad no se logra decorando — se logra con una sola familia de forma repetida con disciplina: la acción es pill, la superficie es 14px con hairline, el campo es 10px quieto, la sombra es noche, el título es Parkinsans y el dato es Inter. Más clean que hoy (menos sombra, menos borde, menos peso) y al mismo tiempo inconfundiblemente Amedi.

Referencia 1 · el topbar de /search

Lo quieto ya lo tenemos

Controles h-9 compactos, botones de ícono perfectamente circulares, inputs bordeados sin drama, shadow-xs. Ese temperamento es el canon de los campos y las barras — solo le falta la piel de la marca. (Y una purga: el botón de IA del search bar es un from-violet-500 to-purple-600 que no existe en ninguna paleta.)

Referencia 2 · el sistema de diseño

La identidad ya está escrita

El manual y las propuestas ya hablan este idioma: CTAs pill, cards de 14px con borde .5pt, pills editoriales en minúscula, tinta #012030, acción #13678A, foco menta. El catálogo de abajo no inventa: traduce ese idioma a cva.

02La doctrina de forma
cuatro radios con rol

Cuatro radios, cada uno con un significado — nunca por gusto del archivo. Con esto, cualquier componente de los 151 (y los que vengan) se dibuja sin adivinar.

RolRadioFormaEjemplos
Acción999px · pill Petroleo sólido · hover petroleo-deep · Parkinsans 600 · h-10 (h-9 compacta) button, badge, chips de filtro, paginación activa
Superficie14px Borde hairline #D6E2E2 · sombra 0 1px 2px rgba(1,32,48,.06) · título Parkinsans card, popover, dropdown-menu, toast, calendar
Campo10px h-10 · borde #D6E2E2 · foco: borde petroleo + ring menta al 30% · placeholder muted input, select, textarea, date-picker, multi-select
Lámina20px Overlay rgba(1,32,48,.72) · sombra noche lg · header Parkinsans dialog, sheet, drawer, command palette
El degradado en componentes · sutil y contado

La doctrina del macroproyecto baja al nivel componente con cuatro sitios sutiles: el subrayado del tab activo · el avatar · el relleno de progress y progress-ring · la hairline del elemento protagonista (una card, un KPI). Siempre la venda petroleo→menta→verde, siempre fino (2–3px o un relleno), jamás en botones ni fondos.

Sombras y foco

Frías y contadas

Toda sombra se tinta a noche rgba(1,32,48,…) y baja un peso respecto a hoy (la identidad no es elevación, es forma). El foco es uno solo en toda la librería: borde petroleo + anillo menta-deep al 30%, 3px.

Tipografía en componentes

Parkinsans habla, Inter opera

Parkinsans 600–700 en: texto de botón, título de card/dialog/empty, número grande. Inter en: campos, tablas, menús, badges, metadata — con tnum donde haya cifras. Nada de UPPERCASE gritado; todo inicia en mayúscula — Sentence case, siempre.

04La receta shadcn · sin fork
cva + tokens

Todo lo anterior se logra donde shadcn quiere que se logre: en los cva de cada componente y en los tokens. Ejemplo real — el diff conceptual del botón:

- "… rounded-md text-sm font-semibold font-family-sans …"
+ "… rounded-full text-sm font-semibold font-display …"

- default: 'bg-brand-600 … shadow-xs hover:bg-brand-700'
+ default: 'bg-brand-600 hover:bg-brand-700'  // mismos tokens — la corrida A ya los volvió petroleo; aquí solo cambia la forma

+ // regla global de foco (una para toda la librería):
+ focus-visible:border-brand-600 focus-visible:ring-[3px] focus-visible:ring-ring/30
Orden de operaciones

Tokens primero, forma después

Este subproyecto asume las corridas del restyle: la A retinta los tokens (color correcto, forma vieja) y este catálogo cambia la forma (los cva). Son commits distintos y verificables por separado — el color nunca se hardcodea en la forma.

Alcance del cambio

~24 archivos cva, 151 beneficiados

Las 16 familias viven en ~24 archivos de packages/ui/src/components. Los 102 componentes de subcarpetas (layouts, notifications, comunes) heredan por composición — se revisan con el checklist de la auditoría, no se reescriben.

05El reto de armonía
el catálogo, auditado contra sus propias reglas

Antes de declarar el lenguaje cerrado, se retó a sí mismo: cada par de color medido contra WCAG, cada radio contra la doctrina, cada degradado contra su presupuesto. Esto es lo que el reto encontró y cómo quedó resuelto — los números son medidos, no estimados.

HallazgoMediciónResolución
El badge ámbar fallaba AA#B6791A / #F7ECCF → 3.11:1 ❌ Nace --state-warning-deep #8A5B12 (4.98:1 ✅) como texto sobre warning-soft — token nuevo del sistema, no un parche local. Corregido en cascada en las cuatro piezas del hub.
El texto danger sobre danger-soft quedaba corto#C0392B / #F6DEDA → 4.24:1 ⚠️ Nace --state-danger-deep #9E2F22 (5.68:1 ✅). El #C0392B queda para fondos sólidos con texto blanco (5.44:1 ✅).
El tab inactivo en muted no llegaba#6E8794 / blanco → 3.78:1 ⚠️ Inactivo pasa a ink-soft (8.57:1 ✅). Muted queda para metadata y placeholders (exentos), nunca para navegación.
Menta y verde se mezclaban semánticamentetoast "agendada" en menta La regla queda escrita: la pill dice el estado del objeto (Agendada=menta · Atendida=verde) y el toast dice el resultado de la acción (éxito=verde, siempre). El chip del toast se corrigió.
Dos direcciones de degradado conviviendo90° vs 120° sin regla 90° en elementos horizontales (tab, progress, hairline) · 120° solo en la marca (cruz, avatar). Ahora es regla, no accidente.
Radios fuera de la doctrina de cuatroítem 8px · checkbox 5px Se formaliza el quinto peldaño derivado: r-micro = el radio del padre − 6 (ítem dentro de superficie 14→8 · marca dentro de campo 10→5, el checkbox). La doctrina sigue siendo cuatro roles + una regla de herencia.
Tipografías fuera de la escala13.5 / 12.5 / 11.5 / 9.5px Los specs se alinean a la escala del sistema: 11 · 13 · 15. Botón compacto 13, botón default 15, badge 11, grupo de sidebar 10 (text-2xs). Los mockups son ilustrativos; el cva usa tokens de escala.
El presupuesto del degradado podía desbordarsetab + progress + hairline en una vista Regla de presupuesto: máximo dos apariciones sutiles por vista (sin contar el avatar). Ante conflicto gana el que comunica estado (progress) y la hairline decorativa se omite.
Lo que el reto confirmó

Pasaron sin tocar: botón primary (6.3:1), destructive (5.44:1), badges info y success (8.17 y 4.86), el badge menta del sidebar con tinta noche (7.82), el header de tabla en ink-soft (8.57). El lenguaje era sólido — ahora además está probado.

06Cómo se aplica
después de las corridas A/B/C
FaseQué se tocaQué cambia
1Los 4 radios como tokens --radius-action (pill) · --radius-surface 14 · --radius-field 10 · --radius-panel 20 en globals.css, para que la doctrina sea código.
2Acción + campo button, input, select trigger, badge, search-bar nuevo — las familias 01, 02, 04. El cambio más visible.
3Superficies + láminas card, popover, dropdown, dialog, sheet, drawer, tooltip, toast — familias 03, 06, 07, 12.
4Datos + estados data-table, tabs, avatar, checkbox/radio/switch, empty, skeleton — familias 05, 08–11, 13–16.
5QA visual /cresco:visual-qa por app contra este catálogo + las pantallas del macroproyecto; el checklist de 7 preguntas por componente compuesto.
Dependencia honesta

Este catálogo cambia forma, no color: depende de que la corrida A (tokens petroleo) esté mergeada, y conviene que B y C hayan barrido las clases crudas para que la forma nueva no conviva con esmeralda hardcodeado. Orden natural: A → B → C → componentes.

Los componentes son la marca en su tamaño más pequeño.

Un botón pill, una card con hairline, una tabla que respira: nadie los mira dos veces, y por eso son la identidad de verdad — la que se siente sin verse. Con cuatro radios con rol, un foco único y dos tipografías haciendo su papel, los 151 componentes dejan de ser un kit de fábrica y se vuelven la casa.

Riesgo

Ninguno funcional. cva variants y tokens; API de componentes intacta.

Mayor efecto

Fase 2. Botón pill + campo quieto: el 80% de la sensación.

El canon

El topbar de /search — ya era el norte; ahora es componente oficial.

La regla

Cuatro radios con rol. Todo lo demás se deduce.

Amedi · lenguaje de componentes · subproyecto del restyle · v1.0 Julio 2026 · 16 familias · packages/ui auditado