Catálogo canónico del design system del POS — el storybook que no existía (medido en el repo nuevo apps/marketplace/flutter). Cada componente con su ejemplo en vivo, su clase real de Flutter, sus variantes y su capa. El 100% del sistema está aquí: tokens, las 31 primitivas Ds* + 7 Gdl* + 4 helpers ya vivos, y el dominio POS Pos* por crear. Alterna claro/oscuro arriba a la derecha.
Razonamiento
- Capa compartida
ds.css— codifica las reglas de marca una vez (línea de acento recta, amarillo solo relleno, DM Mono para datos, radios, modo oscuro). Da la unidad. - 7 archetipos responsive — cada vista se clasificó en uno (lista, maestro-detalle, form, dashboard, board, focus, hub) y eso dictó el layout y el uso del espacio por tamaño.
- Shell por app — Caja: Hub + pestañas · Cocina: kiosco · Gestión: riel ↔ cajón. Invariantes: recibo siempre claro, displays LAN siempre oscuros.
Sistema de nombrado
Todo componente cae en una capa y lleva un prefijo por paquete. Así sabes dónde nace cada pieza nueva y no se duplica.
| Capa | Qué es | Dónde vive | Prefijo |
|---|---|---|---|
| 0 · Tokens | color, tipografía, radio, espacio, motion, sombra | gdl_theme/src/scmdg/ | Ds* |
| 1 · Primitivas | botón, campo, badge, card, tabla… (marca genérica) | gdl_ui/lib/src/ds/ | Ds* |
| 2 · Dominio POS | mesa, ticket KDS, recibo, display LAN, teclado | pos_ui/ (paquete nuevo) | Pos* |
| 3 · Shells | andamiaje de navegación (riel↔cajón↔tabbar, maestro-detalle) | gdl_ui / pos_ui | Ds* / Pos* |
| 4 · Pantallas | una vista concreta de una app | apps/<app>/lib/features/<f>/screens/ | NameScreen |
Ds* (gdl_ui) = marca reusable por TODAS las apps · Gdl* = legacy "Mexican Brutalism", aún en uso, se migra a Ds* al tocarlo (no crear nuevos) · Pos* (pos_ui) = dominio POS compartido por las 3 apps + displays. Regla de promoción: si un widget aparece en ≥2 apps o ≥2 features, deja de ser clase privada y sube a paquete.Idioma
- Código en inglés — clases, archivos, carpetas, parámetros:
OrderCard,order_queue_screen.dart,features/orders/. - UI visible en español (es-MX, tono tú) — todo string que ve el usuario.
- Deuda a normalizar (medida): la app
soportey varias features (cupones/,resenas/) están en español en el código; paramslista/detalle/haySeleccionenMasterDetailScaffold. Se ingesan al tocarlos.
Sufijos de archivo (formalizar)
| Sufijo | Para | Ejemplo → clase |
|---|---|---|
_screen.dart | pantalla (capa 4) | order_queue_screen.dart → OrderQueueScreen |
_card.dart | tarjeta | order_card.dart → PosOrderCard |
_tile.dart | azulejo (grid/hub/piso) | table_tile.dart → PosTableTile |
_row.dart | fila de lista/datos | key_value_row.dart → DsKeyValueRow |
_sheet.dart | bottom sheet / panel | address_form_sheet.dart |
_section.dart | bloque compuesto | totals_section.dart |
_scaffold.dart | shell (capa 3) | pos_scaffold.dart → PosScaffold |
Tokens (capa 0)
Fuente vigente = SCMDG Soft. Se leen con context.dsTokens (ThemeExtension DsTokens, valores distintos claro/oscuro). Tema: buildScmdgSoftTheme(brightness:).
Marca & superficies
DsColors / DsTokensTipografía
DsTypographyRadio · espacio · motion
DsRadius / DsSpacing / DsMotionaccent + DsBorder.width en la base cuadrada del contenedor. Al portar a Flutter conviene un helper DsAccentLine para no re-derivarla por pantalla.Layout & shell
Barra superior
PosScaffold 🔨 pos_uiShell de Gestión (riel ↔ cajón)
PosScaffold 🔨 pos_uiPestañas inferiores
NavigationBar ✅ tema SCMDGBotones
Botón
DsButton ✅ gdl_uiBadges & chips
Badge
DsBadge ✅ gdl_uiTag / chip
DsTag ✅ gdl_uiTarjetas
Tarjeta
DsCard + DsAccentLine ✅ card 🔨 accent-lineContenido
Línea recta al borde
Stat (KPI)
DsStat ✅ gdl_uiDatos
Fila de datos
DsListRow / DsTable 🔨 DsListRow ✅ DsTableVoz de datos
DsTypography.mono ✅ tokenFormularios
Campo
DsInput ✅ gdl_uiSwitch
DsSwitch ✅ gdl_uiPasos (wizard)
DsSteps 🔨 gdl_uiTeclado numérico
PosKeypad 🔨 pos_uiInventario 100% — gdl_ui
Todo lo que ya vive en packages/gdl_ui (medido). Los demos de arriba muestran una parte; esta es la lista completa para que no falte ninguno. Variantes = parámetro enum, no constructores nombrados.
Design system SCMDG Soft — src/ds/ (31)
| Componente | Variantes (enum) | Rol |
|---|---|---|
DsButton | Variant{primary,accent,secondary,ghost,danger} · Size{sm,md,lg} | acción principal |
DsIconButton | Variant{ghost,secondary,primary,accent} · Size{sm,md,lg} | botón de un glifo |
DsInput | Size{sm,md,lg} | campo de texto |
DsTextarea | — | multilínea |
DsSelect<T> | Size{sm,md,lg} | dropdown (overlay propio) |
DsCheckbox | — | booleano |
DsRadio<T> | — | opción única |
DsSwitch | — | toggle |
DsSlider | — | numérico continuo |
DsSegmentedControl<T> | Size{sm,md} | 2-4 opciones exclusivas |
DsBadge | Tone{neutral,brand,success,danger,warning,info,role} | pastilla de estado |
DsTag | — | chip removible/seleccionable |
DsCard + DsCardHeader | Elevation{none,sm,md,lg} | superficie base |
DsStat | — | tarjeta KPI |
DsTable<RowT> | Align{left,right,center} · factory .text | tabla estilo consola |
DsTabs<T> | — | tabs subrayado |
DsBreadcrumbs | — | rastro de ruta |
DsPagination | — | paginación |
DsMenu | Align{left,right} | menú de acciones |
DsAccordion | — | divulgación apilada |
DsAlert | Tone{neutral,success,danger,warning,info} | banner inline |
DsToast | Tone{neutral,success,danger,warning,info} | transitorio |
DsDialogContent | — | modal |
DsTooltip | Side{top,bottom,left,right} | tooltip local |
DsProgress | — | barra determinada |
DsSpinner | — | carga indeterminada |
DsSkeleton | — | placeholder shimmer |
DsAvatar + DsAvatarGroup | — | avatar / grupo apilado |
DsQrCode | — | QR escaneable |
DsAuthBrandHeader | — | cabecera marca (auth) |
DsGeoPatternBackground | — | fondo geométrico (auth) |
Legacy / dominio Gdl* — src/ (7, en migración)
| Componente | Nota de migración |
|---|---|
GdlAvatar | → usar DsAvatar |
BusinessCard | consolidar 4 variantes → DsBusinessCard |
GdlCachedImage | mantener (utilidad de red) |
GdlEmptyState | → candidato DsEmptyState |
GdlErrorView | → candidato DsErrorView |
GdlSkeleton / GdlLoadingView | → usar DsSkeleton |
GdlRatingStars | display de calificación |
MasterDetailScaffold | shell capa 3 ya vivo (params a inglesar); reusar para maestro-detalle |
Helpers (funciones, no widgets)
showDsDialog<T>(...)— presenta unDsDialogContent.mostrarPanelDs<T>(...)— reconstruye por frame (diálogos con estado).preguntar(...)— sí/no;destructivoen rojo.showDsToast(...)— overlay apilado abajo-derecha.
Galería visual de primitivas
Ejemplo en vivo de las primitivas que en el inventario solo salían como fila de texto — dibujadas con la piel de la marca (réplica CSS de ds.css; la versión fiel definitiva vive en el storybook Flutter de gdl_ui). Alterna claro/oscuro para verlas en ambos temas.
DsSelectdropdownDsTextareamultilíneaDsCheckboxbooleanoDsRadio<T>opción únicaDsSlidernuméricoDsTabs<T>subrayadoDsBreadcrumbsrastroDsPaginationpáginasDsMenuaccionesDsAccordiondivulgaciónDsAlertbannerDsToasttransitorioDsTooltiplocalDsProgressdeterminadaDsSpinnerindeterminadaDsSkeletoncargaDsAvatarGroupapiladoDsQrCodeescaneableDsAuthBrandHeaderauthDsGeoPatternBackgroundfondo authDominio POS (pos_ui · Pos*)
Piezas de dominio POS por crear en el paquete nuevo pos_ui, compartidas por Caja + Cocina + Gestión y los displays LAN. Las genéricas (Hub, roster) suben a gdl_ui como Ds*.
Azulejo del Hub
DsLiveTile 🔨 gdl_uiMesa del piso
PosTableTile 🔨 pos_uiTicket de KDS
PosKdsTicket 🔨 pos_ui- 1 Volcán
- 2 Quesataco
- 3 Campechano
Bandeja de orden
PosOrderCard 🔨 pos_uiRoster de staff
DsStaffCard 🔨 gdl_uiRecibo (papel claro invariante)
PosReceipt 🔨 pos_uiDisplay LAN (oscuro invariante)
PosDisplaySurface 🔨 pos_uiComprobantes impresos
Ya diseñados y cerrados en papel con Gustavo (24-jul-2026). 5 formatos térmicos (ESC/POS 80 mm) generados por gdl_tickets.py, más comprobantes en color tamaño carta (Factura CFDI 4.0 y Corte de caja Z). Viven en apps/marketplace/pos/docs/ticket-design/.
Factura CFDI 4.0 (carta, color)
letter/comprobantes-color.htmlCorte de caja Z (carta, color)
letter/comprobantes-color.htmlTickets térmicos — 80 mm (ESC/POS) · los 5 formatos
thermal/gdl_tickets.pyParámetros (spec firme)
| Parámetro | Valor / decisión |
|---|---|
| Ancho | 48 columnas font A (576 dots, 80 mm @ 203 dpi) — NO los 42 del default del Bridge |
| Estética | CERO rellenos negros: banners tipográficos con línea inferior (rasters pre-render, receta 6× + umbral 160) |
| Momento-dinero | TOTAL / DIFERENCIA como raster con UNA línea debajo |
| Sello de plataforma | wordmark guiadalajara.com POS (sin ġ, sin chip) |
| Códigos QR | raster GS v 0 (python3-qrcode) · QR de ticket + QR SAT |
| Voz de datos | fuente del printer (kv, items con wrap, sub-líneas) · horas 24h |
| Impresión | térmica de red 80 mm · CFDI + corte también en HP Smart Tank (cola CUPS HP-SmartTank, 192.168.0.99) |
| Contrato de datos | dicts DEMO_* en el generador = las llaves a llenar con datos reales |
Dónde vive (control)
thermal/gdl_tickets.py— generador ESC/POS de los 5 formatos (CLI:--formatos,--tira,--lista).thermal/render_assets.mjs+thermal/assets/*.png— banners raster (b_venta, b_cfdi, b_corte, b_comanda, b_precuenta, bizname, plataforma, totalbar, totalbar_corte).letter/comprobantes-color.html— CFDI 4.0 + Corte Z en color (carta) ·letter/tickets-letter.html— preview B/N ·letter/qr_sat.png,qr_ticket.png.- Copia local para esta galería:
gdl-pos-allmocks/ticket-design/.
Reconciliación mock → código
Para que el storyboard y Flutter hablen el mismo idioma: cada clase CSS de los mocks, su clase real, su paquete y su estado. De ~28 patrones: 11 ya existen · 3 se reusan de shells vivos · 14 son nuevos (10 → gdl_ui genéricos, 4 → pos_ui de dominio).
| Mock (CSS) | Clase Flutter | Paquete | Estado |
|---|---|---|---|
btn | DsButton | gdl_ui | ✅ existe |
icobtn | DsIconButton | gdl_ui | ✅ existe |
badge | DsBadge | gdl_ui | ✅ existe |
chip / cat | DsTag | gdl_ui | ✅ existe |
seg | DsSegmentedControl | gdl_ui | ✅ existe |
card / accentline | DsCard + DsAccentLine | gdl_ui | ✅ card 🔨 line |
stat | DsStat | gdl_ui | ✅ existe |
tbl | DsTable | gdl_ui | ✅ existe |
fld / inp | DsInput | gdl_ui | ✅ existe |
sw | DsSwitch | gdl_ui | ✅ existe |
topbar/rail/gshell | PosScaffold | pos_ui | 🔨 crear |
tabbar | NavigationBar (tema) | gdl_ui | ✅ tema |
kv / kk | DsKeyValueRow | gdl_ui | 🔨 crear |
dd (2 paneles) | MasterDetailScaffold | gdl_ui | ✅ reusar |
rrow/qrow/tk | DsListRow | gdl_ui | 🔨 crear |
htile | DsLiveTile | gdl_ui | 🔨 crear |
rp / bar | DsDashboardGrid + DsBarChart | gdl_ui | 🔨 crear |
staff | DsStaffCard | gdl_ui | 🔨 crear |
st-card/whc | DsStatusCard | gdl_ui | 🔨 crear |
pcard | DsProductCard | gdl_ui | 🔨 crear |
steps | DsSteps | gdl_ui | 🔨 crear |
ttile | PosTableTile | pos_ui | 🔨 crear |
kticket | PosKdsTicket | pos_ui | 🔨 crear |
ocard / acard | PosOrderCard | pos_ui | 🔨 crear |
receipt | PosReceipt | pos_ui | 🔨 crear |
disp / num | PosDisplaySurface | pos_ui | 🔨 crear |
keys / key | PosKeypad | pos_ui | 🔨 crear |
Deuda de duplicación (medida)
Ds transversal / Pos dominio).| Hoy | Duplicación medida | Consolidar en |
|---|---|---|
ds_states.dart | copia literal en consumer + repartidor | gdl_ui (loading/empty/error) |
main_scaffold.dart | 4 copias + admin_shell.dart | PosScaffold / DsAppScaffold parametrizable |
| tarjeta de negocio | 4 nombres: AppBusinessCard, MapBusinessCard, GdlBusinessCard, business_card | DsBusinessCard |
| stat cards / detail rows | _StatCard, _MiniStatCard, _DetailRow, _InfoRow, _SummaryRow, SettingsRow (privadas por feature) | DsStat (existe) + DsKeyValueRow |
| splash / login / push | 5 copias c/u | plantillas + DsAuthBrandHeader + DsGeoPatternBackground (existen) |
Por qué "faltaban" componentes
- No había storybook —
_showcase/solo enlaza a las apps corriendo; este catálogo es el primero. - Los componentes de bajo nivel no son archivos, son clases privadas
_XxxCard/_DetailRowdentro de cada*_screen.dart; por eso se reinventan por pantalla. - Nombrado es/en mezclado — el mayor obstáculo; resuelto con la política inglés-código / español-UI de arriba.