@ajuarezso/sui-design-system 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/docs/INDEX.md +51 -51
  2. package/docs/sui-alert/README.md +13 -0
  3. package/docs/sui-badge/README.md +17 -0
  4. package/docs/sui-banner/README.md +190 -0
  5. package/docs/sui-breadcrumb-item/README.md +96 -0
  6. package/docs/sui-breadcrumbs/README.md +122 -0
  7. package/docs/sui-button/README.md +17 -0
  8. package/docs/sui-card/README.md +168 -0
  9. package/docs/sui-chart-legend/README.md +140 -0
  10. package/docs/sui-chart-legend-dot/README.md +118 -0
  11. package/docs/sui-checkbox-card/README.md +150 -0
  12. package/docs/sui-compact-select/README.md +127 -0
  13. package/docs/sui-compact-select-for-input/README.md +117 -0
  14. package/docs/sui-content-card/README.md +147 -0
  15. package/docs/sui-content-label/README.md +148 -0
  16. package/docs/sui-counter-input/README.md +145 -0
  17. package/docs/sui-date-selector/README.md +98 -0
  18. package/docs/sui-datepicker/README.md +193 -0
  19. package/docs/sui-day-cell/README.md +118 -0
  20. package/docs/sui-day-label/README.md +81 -0
  21. package/docs/sui-drawer-footer/README.md +127 -0
  22. package/docs/sui-drawer-header/README.md +140 -0
  23. package/docs/sui-empty-state/README.md +145 -0
  24. package/docs/sui-file-upload/README.md +154 -0
  25. package/docs/sui-file-upload-card/README.md +129 -0
  26. package/docs/sui-image-upload/README.md +200 -0
  27. package/docs/sui-image-upload-profile/README.md +145 -0
  28. package/docs/sui-inline-input/README.md +104 -0
  29. package/docs/sui-inline-select/README.md +101 -0
  30. package/docs/sui-input/README.md +244 -0
  31. package/docs/sui-integration-switch/README.md +142 -0
  32. package/docs/sui-notification/README.md +179 -0
  33. package/docs/sui-notification-footer/README.md +98 -0
  34. package/docs/sui-notification-tab-menu/README.md +112 -0
  35. package/docs/sui-otp-input/README.md +116 -0
  36. package/docs/sui-pagination/README.md +146 -0
  37. package/docs/sui-password-strength/README.md +99 -0
  38. package/docs/sui-period-range/README.md +93 -0
  39. package/docs/sui-popover/README.md +178 -0
  40. package/docs/sui-product-card/README.md +173 -0
  41. package/docs/sui-radio-card/README.md +160 -0
  42. package/docs/sui-rating/README.md +7 -6
  43. package/docs/sui-rich-editor/README.md +114 -0
  44. package/docs/sui-select/README.md +180 -0
  45. package/docs/sui-stepper/README.md +166 -0
  46. package/docs/sui-store-card/README.md +147 -0
  47. package/docs/sui-switch-card/README.md +149 -0
  48. package/docs/sui-tab-chips/README.md +185 -0
  49. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  50. package/docs/sui-tab-menu-vertical/README.md +136 -0
  51. package/docs/sui-tag-input/README.md +120 -0
  52. package/docs/sui-textarea/README.md +157 -0
  53. package/docs/sui-time-picker/README.md +237 -0
  54. package/docs/sui-toast/README.md +190 -0
  55. package/docs/sui-tooltip/README.md +201 -0
  56. package/fesm2022/ajuarezso-sui-design-system.mjs +273 -231
  57. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  58. package/package.json +1 -1
  59. package/types/ajuarezso-sui-design-system.d.ts +208 -52
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: sui-breadcrumbs
3
+ selector: sui-breadcrumbs
4
+ resumen: Ruta de migas en web que dice dónde estás dentro de una jerarquía de 3 o más niveles y deja volver a cualquiera
5
+ alternativas: [sui-page-header (título de la pantalla), botón de volver del layout (mobile), sui-tab-menu-horizontal (secciones del mismo nivel)]
6
+ ---
7
+
8
+ # sui-breadcrumbs
9
+
10
+ Story: [Molecules/Breadcrumbs/Breadcrumbs](https://sui-design-system.web.app/?path=/docs/molecules-breadcrumbs-breadcrumbs--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** en **web** cuando una pantalla está **3 o más niveles adentro** y sirve volver a un nivel
15
+ intermedio sin pasar por todos: «Productos › Hamburguesas › Clásica con queso» en el panel de la
16
+ empresa, «Locales › Sabores Andinos › Pedidos» en el super admin.
17
+
18
+ **No lo uses** para:
19
+
20
+ - **Mobile**: ahí se vuelve con la flecha del layout. Una fila de migas en 390 px se corta y
21
+ compite con el título.
22
+ - **Una pantalla de 1 o 2 niveles**: el título y el volver ya lo dicen.
23
+ - Secciones del mismo nivel: `sui-tab-menu-horizontal`.
24
+ - Los pasos de un flujo: `sui-stepper`.
25
+
26
+ Regla corta: **3+ niveles en web → breadcrumbs · mobile o 1-2 niveles → flecha de volver.**
27
+
28
+ ## Qué variante usar
29
+
30
+ > **Lo que dice la guía del DS**: «guía mostrando el camino dentro de una app o sitio». Ejemplos con
31
+ > flecha (default), **como enlaces** y con **separador `/`**. El ítem activo es la página actual. No
32
+ > trae do/don't.
33
+ >
34
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`): **0 usos**.
35
+
36
+ ### `divider`
37
+
38
+ | divider | cuándo | fuente |
39
+ |---|---|---|
40
+ | `arrow` (default) | Siempre en la app. | según la guía del DS (es su default) |
41
+ | `slash` | No: misma función que la flecha; dos estilos en la misma app se leen como dos cosas. | según la guía del DS (la forma existe); el no es propuesta |
42
+ | `dot` | No: el punto separa metadatos («12 min · S/ 4.50»), no niveles. Extensión de SUI. | propuesta, falta aprobación |
43
+
44
+ ### Ítems (`items`)
45
+
46
+ | qué | cuándo | fuente |
47
+ |---|---|---|
48
+ | `label` | Siempre el nombre real del nivel («Hamburguesas», no «Categoría»). Un id nunca es el nombre. | canon (CLAUDE.md, «un identificador nunca es el título de nada») |
49
+ | `href` | Cada nivel anterior con su ruta interna (`/empresa/productos`): navega con el router, sin recargar. | propuesta, falta aprobación |
50
+ | sin `href` + `(navigate)` | Cuando volver no es una ruta (cerrar un panel, limpiar un filtro). | propuesta, falta aprobación |
51
+ | `icon` solo en el primero | El inicio como casa (`home-5-line`) con `ariaLabel`. | según la guía del DS (ítems con ícono); el cuándo es propuesta |
52
+ | `active` | No hace falta: el último ya es el activo. Solo si la página actual no va al final (raro). | según el código |
53
+
54
+ Usos de hoy que rompen las reglas: **0** (no se usa).
55
+
56
+ ## Tamaño en mobile y en web
57
+
58
+ Alto fijo de **20 px** (texto 14, ícono 20), sin `size`. **No tiene tamaño para mobile**: no se usa ahí.
59
+
60
+ | uso | mobile | web | fuente |
61
+ |---|---|---|---|
62
+ | ruta de 3+ niveles | no se usa: flecha de volver | `sui-breadcrumbs` | propuesta, falta aprobación |
63
+
64
+ ```html
65
+ @if (!bp.isMobile()) {
66
+ <sui-breadcrumbs [items]="ruta()" />
67
+ }
68
+ ```
69
+
70
+ ## «No usar»: por qué no hoy y cuándo sí
71
+
72
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
73
+ |---|---|---|
74
+ | el componente entero | ninguna pantalla pasa de 2 niveles con salto a uno intermedio | el detalle de un producto dentro de una categoría en el panel web, o un local dentro del super admin |
75
+ | `slash` | ya hay flecha; mezclar estilos confunde | nunca, mientras la flecha sea el estilo de la app |
76
+ | `dot` | el punto es separador de metadatos | nunca para niveles |
77
+ | en mobile | 20 px de alto y la ruta se corta | nunca |
78
+
79
+ ## API
80
+
81
+ <!-- api:inicio -->
82
+ <!-- generada: no editar a mano — `npm run docs` -->
83
+
84
+ | input | tipo | default |
85
+ |---|---|---|
86
+ | `items` | `readonly SuiBreadcrumbEntry[]` | — (requerido) |
87
+ | `divider` | `'arrow' \| 'slash' \| 'dot'` | `'arrow'` |
88
+
89
+ | output | payload |
90
+ |---|---|
91
+ | `navigate` | `SuiBreadcrumbEntry` |
92
+ <!-- api:fin -->
93
+
94
+ ```ts
95
+ interface SuiBreadcrumbEntry {
96
+ label?: string;
97
+ icon?: string; // RemixIcon, 20 px
98
+ href?: string; // interno → router; externo → navegador
99
+ active?: boolean; // default: el último
100
+ ariaLabel?: string; // obligatorio si va solo el ícono
101
+ }
102
+ type SuiBreadcrumbDivider = 'arrow' | 'slash' | 'dot';
103
+ ```
104
+
105
+ ## Trampas
106
+
107
+ - **`navigate` sale en todo clic**, también en los que tienen `href` (el navegador ya navega). Si
108
+ usas `href`, no navegues otra vez en `(navigate)`.
109
+ - **El último ítem es el activo solo**: no es clicable y va en negro.
110
+ - **No corta texto largo**: con nombres de producto largos la fila crece. Acórtalos tú.
111
+ - El host dice `aria-label="Ruta de navegación"` (hasta el 03-10-2026, «Breadcrumb») y no se puede cambiar.
112
+ - `SuiBreadcrumbEntry` (los datos) no es `SuiBreadcrumbItem` (el componente de cada miga).
113
+
114
+ ## Ejemplo
115
+
116
+ ```html
117
+ <sui-breadcrumbs
118
+ [items]="[{ icon: 'home-5-line', href: '/empresa/inicio', ariaLabel: 'Inicio' },
119
+ { label: 'Productos', href: '/empresa/productos' },
120
+ { label: 'Hamburguesas', href: '/empresa/productos?categoria=hamburguesas' },
121
+ { label: 'Clásica con queso' }]" />
122
+ ```
@@ -122,6 +122,23 @@ flujo nuevo cae en la columna de la derecha, se usa (aprobado por el dueño, 03-
122
122
  | `sui-button-group` (0 usos) | hoy no hay opciones combinables pegadas | días del horario del local o filtros que se suman |
123
123
  | `sui-topbar-button` (0 usos) | las barras de la app tienen sus íconos propios | si se unifica la barra superior del admin con la del DS |
124
124
 
125
+ ## Tamaño en mobile y en web
126
+
127
+ En mobile se toca con el dedo: 40 px como mínimo y 48 en la acción principal. En web, 28–40.
128
+
129
+ | uso | mobile | web | fuente |
130
+ |---|---|---|---|
131
+ | acción principal de la pantalla o footer de modal | `large` (48) | `medium` (40) | canon (aprobado por el dueño, 03-10-2026) (footer de modal siempre `large`) |
132
+ | acción dentro de una card o una fila | `medium` (40) | `small` (36) / `xsmall` (32) | canon (aprobado por el dueño, 03-10-2026) |
133
+ | acción en una tabla densa | — (no hay tablas en mobile) | `2xsmall` (28) | canon (aprobado por el dueño, 03-10-2026) |
134
+ | CTA de landing | `xlarge` (52) | `large` (48) | propuesta, falta aprobación |
135
+
136
+ Patrón (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile hasta 767 px):
137
+
138
+ ```html
139
+ <sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
140
+ ```
141
+
125
142
  ## API
126
143
 
127
144
  <!-- api:inicio -->
@@ -0,0 +1,168 @@
1
+ ---
2
+ name: sui-card
3
+ selector: sui-card
4
+ resumen: Superficie con borde, radio y sombra que agrupa contenido, con slots de header, cuerpo, media y footer
5
+ alternativas: [sui-content-card (una fila «cara + nombre + detalle» dentro de su cajita), sui-radio-card / sui-checkbox-card / sui-switch-card (la card ES la opción que se elige), sui-product-card (un producto de la carta), sui-store-card (un local en un listado del cliente), sui-modal-sheet (contenido encima de la pantalla)]
6
+ ---
7
+
8
+ # sui-card
9
+
10
+ Story: [Molecules/Card/Card](https://sui-design-system.web.app/?path=/docs/molecules-card-card--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** como la superficie de una sección o de un ítem: un bloque de KPIs, un gráfico con su
15
+ título, una fila de lista que se toca, un formulario corto dentro de una página.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Una fila «foto o ícono + nombre + detalle»: eso es `sui-content-card` (o `sui-content-label`
20
+ dentro de una card que ya existe).
21
+ - Una opción que se elige: `sui-radio-card`, `sui-checkbox-card` o `sui-switch-card` ya traen la
22
+ card, el estado elegido y el área táctil.
23
+ - Un producto de la carta o un local del listado del cliente: `sui-product-card` y
24
+ `sui-store-card`.
25
+ - Contenido que aparece encima de la pantalla: `sui-modal` / `sui-modal-sheet`.
26
+
27
+ Regla corta: **agrupa contenido → card · es una fila con cara → content-card · se elige → card de
28
+ selección.**
29
+
30
+ ## Qué variante usar
31
+
32
+ > **La guía del DS no tiene página de la card.** Nada de lo que sigue sale de una guía: lo
33
+ > marcado «propuesta» sale de cómo la usa la app y falta el ok del dueño; lo «canon» ya está
34
+ > aprobado.
35
+ >
36
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin `master-preview`,
37
+ > `master-prototipos`, `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`,
38
+ > `master-ejercicios`): **253 cards en 79 archivos**. Variantes: 227 `default` explícito, 24 sin
39
+ > `variant` (también default), 2 `elevated`, 0 `flat`. Tamaños: 95 `small`, 123 `medium`
40
+ > explícito + 21 sin `size`, 14 `large`, 0 `xlarge`. 9 con `[interactive]`. Slots: 23
41
+ > `sui-card-header`, 11 `sui-card-footer`, 4 `sui-card-media`.
42
+
43
+ ### `variant`
44
+
45
+ | variant | cuándo | fuente |
46
+ |---|---|---|
47
+ | `default` | Lo normal: la card sobre el fondo de la app (borde + sombra x-small). 251 de 253. | propuesta (práctica de la app) |
48
+ | `elevated` | La card flota sobre un mapa, una foto o un fondo de color, donde el borde se pierde y hace falta la sombra media. Precedente: el seguimiento público del pedido (`pages/public/pedido-en-vivo/pedido-en-vivo.html:19`, `:69`). | propuesta |
49
+ | `flat` | Ver «No usar». | propuesta |
50
+
51
+ ### `size` (padding × gap entre slots)
52
+
53
+ | size | medidas | cuándo | fuente |
54
+ |---|---|---|---|
55
+ | `small` | 16 / 12 | Filas de una lista de cards, KPIs chicos, cards tocables. **Toda card en mobile.** | propuesta |
56
+ | `medium` (default) | 20 / 16 | Secciones en web. | propuesta |
57
+ | `large` | 24 / 20 | La sección principal de una pantalla de web (los 14 de hoy son gráficos de reportes y los pasos del onboarding). | propuesta |
58
+ | `xlarge` | 28 / 24 | Ver «No usar». Extensión SUI (no está en Figma). | propuesta |
59
+
60
+ ### `interactive`
61
+
62
+ | valor | cuándo | fuente |
63
+ |---|---|---|
64
+ | `true` | La card entera es **una** acción: abre un detalle o lleva a otra pantalla («Mis direcciones», una factura). Da cursor, hover, foco y el arreglo de iOS. | propuesta |
65
+ | `false` (default) | La card tiene 2 acciones o más adentro, o ninguna. Las acciones van como botones dentro. | propuesta |
66
+
67
+ ### Slots
68
+
69
+ | slot | cuándo | fuente |
70
+ |---|---|---|
71
+ | `[sui-card-header]` | Título de la card a la izquierda y, si hace falta, una acción chica a la derecha (`sui-link-button` «Ver todo»). | propuesta |
72
+ | cuerpo (sin atributo) | El contenido. **Con 2 bloques o más, envuélvelos en un div propio con `display:flex; flex-direction:column; gap`** (ver Trampas). | canon (memoria del proyecto, 10-05-2026) |
73
+ | `[sui-card-media]` | Gráfico, mapa o foto de borde a borde, al final. Si después va un footer, la media deja de comerse el borde inferior. | propuesta |
74
+ | `[sui-card-footer]` | La acción de la card o un resumen. Si son dos botones, siguen el orden de `sui-modal-footer` (secundario a la izquierda, primario a la derecha). | canon (orden de botones, CLAUDE.md) |
75
+
76
+ **Usos de hoy que rompen las reglas:**
77
+
78
+ - **18 cards en 6 archivos con `gap` puesto en la clase del `sui-card`**, que no llega a los hijos
79
+ del cuerpo: `pages/central/central-inicio/central-inicio.html:36` (×6),
80
+ `pages/super-admin/master-semanas/master-semanas.html:21` (×4),
81
+ `pages/central/central-ingresos/central-ingresos.html:36` (×3), `pages/invoices/invoices.html:19`
82
+ (×2), `pages/driver/driver-history/driver-history.html:17` (×2) y
83
+ `pages/driver/driver-wallet/driver-wallet.html:154` (ahí además el `flex-direction: row` del host
84
+ no pone el badge al lado del monto: el cuerpo es un solo hijo).
85
+ - **3 cards tocables armadas a mano** (`(click)` o `routerLink` sin `[interactive]`): sin foco, sin
86
+ hover y sin el arreglo de iOS. `pages/super-admin/master-users/master-users.html:156` (con
87
+ `role="button"` y `touchstart` a mano), `pages/super-admin/master-settings/master-settings.html:601`,
88
+ `pages/driver/driver-dashboard/driver-dashboard.html:990`.
89
+
90
+ ## Tamaño en mobile y en web
91
+
92
+ El `size` de la card es su padding, no un área táctil: no tiene que llegar a 44. Lo que importa en
93
+ mobile es no perder ancho.
94
+
95
+ | uso | mobile | web |
96
+ |---|---|---|
97
+ | sección, KPI, gráfico | `small` (16) | `medium` (20) |
98
+ | sección principal de un reporte | `small` | `large` (24) |
99
+ | fila de lista tocable | `small` | `small` |
100
+
101
+ ```html
102
+ <sui-card [size]="bp.isMobile() ? 'small' : 'medium'"> … </sui-card>
103
+ ```
104
+
105
+ `bp` es el `BreakpointsService` de la app. Va al ritmo de los gaps de página (12 / 16 / 20 por
106
+ breakpoint). Si la card es tocable, el alto de la fila (≥ 44) lo da su contenido, no el `size`.
107
+
108
+ ## «No usar»: por qué no hoy y cuándo sí
109
+
110
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
111
+ |---|---|---|
112
+ | `variant="flat"` (0 usos) | la app siempre pone la card sobre el fondo gris, donde la sombra ayuda | una card dentro de otra superficie blanca (un sheet, otra card), donde la sombra dobla el borde |
113
+ | `size="xlarge"` (0 usos) | ninguna pantalla lo pide; no está en Figma | un hero de desktop (la portada de un reporte impreso) |
114
+
115
+ ## API
116
+
117
+ <!-- api:inicio -->
118
+ <!-- generada: no editar a mano — `npm run docs` -->
119
+
120
+ | input | tipo | default |
121
+ |---|---|---|
122
+ | `variant` | `'default' \| 'elevated' \| 'flat'` | `'default'` |
123
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
124
+ | `interactive` | `boolean` | `false` |
125
+
126
+ Outputs: ninguno.
127
+ <!-- api:fin -->
128
+
129
+ Slots: `[sui-card-header]`, cuerpo (`<ng-content>`), `[sui-card-media]`, `[sui-card-footer]`.
130
+
131
+ ## Trampas
132
+
133
+ - **El `gap` del host separa slots, no hijos.** El cuerpo va dentro de `.sui-card__body` (flex en
134
+ columna, sin gap). Poner `gap` en una clase del `sui-card` no separa nada de lo que proyectas: se
135
+ necesita un wrapper propio (`<div class="x__card-body">` con flex y gap).
136
+ - Sin header ni footer el host queda con `gap: 0` (`:has(> .sui-card__body:only-child)`).
137
+ - **`interactive` no trae output, pero sí teclado** (desde 03-10-2026): pone `role="button"`,
138
+ `tabindex="0"`, hover y foco, y **Enter / Espacio hacen click en la card**, así que tu `(click)`
139
+ (o el `routerLink` de un `<a>` que la envuelve) también responde al teclado. No agregues
140
+ `(keydown.enter)` además: se dispararía dos veces. Una tecla dentro de un campo o botón
141
+ proyectado es de ese control, no de la card.
142
+ - Los slots son **atributos** (`sui-card-header`), no `slot="…"`.
143
+ - El host tiene `overflow: hidden` y radio 16: lo que sobresalga (un badge colgado de la esquina)
144
+ se corta.
145
+ - `sui-card-media` rompe el padding con margen negativo leído de `--sui-card-padding-x`; si le
146
+ cambias el padding a la card desde afuera, la media queda corrida.
147
+ - En modo oscuro `elevated` usa `--sui-card-elevated-border` para el borde (la sombra no se ve).
148
+
149
+ ## Ejemplo
150
+
151
+ ```html
152
+ <!-- Sección con título, dos bloques y una acción -->
153
+ <sui-card [size]="bp.isMobile() ? 'small' : 'medium'">
154
+ <div sui-card-header class="ganancias__head">
155
+ <h3>Tus días del mes</h3>
156
+ <sui-link-button variant="primary" size="small" (click)="verTodo()">Ver todo</sui-link-button>
157
+ </div>
158
+ <div class="ganancias__card-body"> <!-- display:flex; flex-direction:column; gap:12px -->
159
+ <span>Martes 3 · 6 entregas · S/ 42.00</span>
160
+ <span>Miércoles 4 · 4 entregas · S/ 28.50</span>
161
+ </div>
162
+ </sui-card>
163
+
164
+ <!-- Fila tocable -->
165
+ <sui-card size="small" [interactive]="true" (click)="abrirDirecciones()">
166
+ …
167
+ </sui-card>
168
+ ```
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: sui-chart-legend
3
+ selector: sui-chart-legend
4
+ resumen: Leyenda de un gráfico — punto de color, nombre de la serie y su valor — dibujada fuera del gráfico
5
+ alternativas: [sui-chart-legend-dot (el punto suelto, en una fila o tabla), la leyenda propia de ECharts (cuando hay que poder apagar series tocándolas), sui-badge (una etiqueta, no una serie)]
6
+ ---
7
+
8
+ # sui-chart-legend
9
+
10
+ Story: [Molecules/Chart/Chart Legend](https://sui-design-system.web.app/?path=/docs/molecules-chart-chart-legend--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** debajo o al lado de un gráfico para decir **qué es cada color**, y cuánto suma cada
15
+ serie si el número importa («Yape 42 · Efectivo 31 · Plin 9»). Es texto de la página, así que se lee
16
+ igual en el celular, sin tocar nada.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Una leyenda que tiene que **apagar series** al tocarlas: eso lo hace la leyenda de ECharts
21
+ (`legend: {…}`), que es interactiva. Esta no tiene clic.
22
+ - Un estado o una categoría que no viene de un gráfico: `sui-badge` o `sui-status-badge`.
23
+ - Esconder los números en un tooltip: en el celular no hay hover (así lo hizo bien
24
+ `pages/super-admin/master-drivers/master-drivers.html:226`).
25
+
26
+ ## Qué variante usar
27
+
28
+ > La guía del DS no tiene página para este componente: sale del Figma del DS (set «Chart Legends»).
29
+ > Todo lo de abajo es **propuesta**, salvo lo marcado «según el componente» o «canon».
30
+ >
31
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas): **1 uso**, más
32
+ > **5 leyendas hechas a mano** y **9 gráficos con la leyenda de ECharts**.
33
+
34
+ ### `items` — cada serie
35
+
36
+ | campo | valor | cuándo | fuente |
37
+ |---|---|---|---|
38
+ | `label` | nombre corto | El nombre de la serie, tal como se dice en la app: «Entregados», «Yape». | propuesta |
39
+ | `color` | sin pasar | **Lo normal** en categorías sin bien ni mal (canales, métodos de pago, distritos): el componente reparte azul, naranja, rojo, verde… en orden. | según el componente (orden) · cuándo: propuesta |
40
+ | `color` | el del estado | Cuando la serie **es un estado**: entregados `green`, cancelados `red`, pendientes `orange`. Mismo significado que en `sui-badge`. | canon (colores con significado del badge) |
41
+ | `customColor` | el color que ya usa el gráfico | Solo cuando el gráfico tiene su propia paleta y el punto tiene que coincidir. Va el mismo valor en los dos lados. | propuesta |
42
+ | `value` | número o texto | Cuando el número importa para leer el gráfico: «42», «S/ 1,200», «38 %». | propuesta |
43
+ | `disabled` | `true` | Una serie sin datos en el período: se ve, apagada, para que no parezca que falta. | propuesta |
44
+
45
+ Los 12 valores de `color`, uno por uno y con su regla, están en el README de `sui-chart-legend-dot`.
46
+
47
+ Para que el gráfico y la leyenda pinten **el mismo color**, ECharts recibe la paleta desde
48
+ `SUI_CHART_LEGEND_HEX` (exportado por el paquete): `color: [SUI_CHART_LEGEND_HEX.blue, …]`.
49
+
50
+ ### `orientation`
51
+
52
+ | orientation | cuándo | fuente |
53
+ |---|---|---|
54
+ | `horizontal` (default) | Debajo de un gráfico de barras o de líneas. Si no entra, baja a la línea siguiente. | propuesta |
55
+ | `vertical` | Al lado de una dona o un pie, con el `value` de cada serie. En mobile, debajo de la dona. | propuesta |
56
+
57
+ ### Usos de hoy que romperían la regla
58
+
59
+ - **5 leyendas hechas a mano** (punto con `[style.background]` + nombre + valor) → `sui-chart-legend`
60
+ con `customColor` o la paleta del DS: `components/marketing-channels/marketing-channels.html:10`,
61
+ `components/customer-segments/customer-segments.html:26`,
62
+ `pages/overview/components/overview-retention/overview-retention.html:12`,
63
+ `pages/reports/reports.html:59` y `:80`.
64
+ - **A discutir — 9 gráficos con la leyenda de ECharts**: `pages/super-admin/master-semanas/master-semanas.ts:187`
65
+ (y `:248`, `:288`, `:335`), `pages/super-admin/master-overview/master-overview.ts:264` y `:401`,
66
+ `pages/reports/reports.ts:338` y `:381`, `core/utils/chart-barras-repartidores.ts:166`. Si nadie
67
+ apaga series tocándolas, pasarían a `sui-chart-legend` (fuente, tamaño y color del DS en vez de
68
+ `#525252` y 12 px puestos a mano). `pages/reports/` tiene además la leyenda a mano: hay dos
69
+ leyendas para el mismo gráfico.
70
+
71
+ ## Tamaño en mobile y en web
72
+
73
+ **No tiene `size`**: punto de 16 px y texto de 12 en las dos. No se toca, así que no tiene mínimo
74
+ para el dedo; lo que cambia por plataforma es la orientación.
75
+
76
+ | uso | mobile | web | fuente |
77
+ |---|---|---|---|
78
+ | bajo barras o líneas | `horizontal` (envuelve) | `horizontal` | propuesta |
79
+ | junto a una dona | `vertical`, **debajo** de la dona | `vertical`, a la derecha | propuesta |
80
+
81
+ ```html
82
+ <sui-chart-legend [orientation]="bp.isMobile() ? 'horizontal' : 'vertical'" [items]="metodos()" />
83
+ ```
84
+
85
+ El texto de 12 px queda chico en mobile y el componente no tiene un tamaño mayor: no se cambia aquí.
86
+
87
+ ## «No usar»: por qué no hoy y cuándo sí
88
+
89
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
90
+ |---|---|---|
91
+ | `disabled` | ningún gráfico muestra series vacías | una serie sin datos en el período elegido |
92
+ | `customColor` con un hex propio | la paleta del DS ya cubre las series | un gráfico con colores de marca de terceros (Yape morado, Plin celeste) |
93
+
94
+ ## API
95
+
96
+ <!-- api:inicio -->
97
+ <!-- generada: no editar a mano — `npm run docs` -->
98
+
99
+ | input | tipo | default |
100
+ |---|---|---|
101
+ | `items` | `readonly SuiChartLegendItem[]` | — (requerido) |
102
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
103
+
104
+ Outputs: ninguno.
105
+ <!-- api:fin -->
106
+
107
+ ```ts
108
+ interface SuiChartLegendItem {
109
+ label: string;
110
+ color?: SuiChartLegendColor; // 'gray' | 'light-gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal' | 'disabled'
111
+ customColor?: string; // cualquier color CSS; gana sobre `color`
112
+ value?: string | number;
113
+ disabled?: boolean; // gana sobre los dos colores
114
+ }
115
+ ```
116
+
117
+ ## Trampas
118
+
119
+ - **Sin `color`, los colores salen en orden fijo** (azul, naranja, rojo, verde, amarillo…), no los
120
+ del gráfico: si ECharts usa otra paleta, el punto y la barra no coinciden. Usa
121
+ `SUI_CHART_LEGEND_HEX` en el gráfico o pasa el color.
122
+ - El orden automático empieza en **azul**, no en el naranja de la marca.
123
+ - `value` sale a 4 px del nombre, en negro (el nombre va en gris): el formato («S/ 1,200», «38 %») lo arma quien la usa.
124
+ - Host con `role="list"` y cada item `role="listitem"`; el punto es decorativo.
125
+ - `items` es obligatorio.
126
+
127
+ ## Ejemplo
128
+
129
+ ```html
130
+ <sui-chart-legend orientation="vertical" [items]="[
131
+ { label: 'Yape', value: 42 },
132
+ { label: 'Efectivo', value: 31 },
133
+ { label: 'Plin', value: 9 },
134
+ ]" />
135
+
136
+ <sui-chart-legend [items]="[
137
+ { label: 'Entregados', color: 'green', value: '86 %' },
138
+ { label: 'Cancelados', color: 'red', value: '14 %' },
139
+ ]" />
140
+ ```
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: sui-chart-legend-dot
3
+ selector: sui-chart-legend-dot
4
+ resumen: Punto de color de una serie de gráfico, para atar un número de una fila o una tabla con su color en el gráfico
5
+ alternativas: [sui-chart-legend (la leyenda completa, que ya trae sus puntos), sui-color-dot (elegir un color, no nombrar una serie), sui-badge with-dot (un estado vivo)]
6
+ ---
7
+
8
+ # sui-chart-legend-dot
9
+
10
+ Story: [Molecules/Chart/Chart Legend Dot](https://sui-design-system.web.app/?path=/docs/molecules-chart-chart-legend-dot--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** suelto cuando una fila o una tabla **habla de una serie del gráfico** y el color la ata:
15
+ «● Delivery 64 %» en el resumen bajo una dona, la columna de una tabla que repite las barras.
16
+
17
+ **No lo uses** para:
18
+
19
+ - La leyenda de un gráfico: `sui-chart-legend` ya trae sus puntos.
20
+ - Elegir un color (variantes de un producto): `sui-color-dot`.
21
+ - Marcar un estado vivo («Abierto», «En línea»): `sui-badge` con `type="with-dot"`.
22
+ - La línea de tiempo de una actividad: `sui-activity-feed`.
23
+
24
+ ## Qué variante usar
25
+
26
+ > La guía del DS no tiene página para este componente: sale del Figma del DS (set «Chart Legend
27
+ > Dots»). Todo lo de abajo es **propuesta**, salvo lo marcado «según el componente» o «canon».
28
+ >
29
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos sueltos** (sí dentro de la única
30
+ > `sui-chart-legend`), y **3 puntos de serie hechos a mano** fuera de una leyenda.
31
+
32
+ ### `color`
33
+
34
+ Cada color apunta al mismo estado de la paleta que en `sui-badge`. En un gráfico manda una regla:
35
+ **el mismo color que la serie en el gráfico**.
36
+
37
+ | color | estado de la paleta | cuándo | fuente |
38
+ |---|---|---|---|
39
+ | `blue` | information | Primera serie de categorías sin carga (el orden automático arranca aquí). | según el componente (orden) |
40
+ | `orange` | warning | Pendiente; o segunda serie de categorías. | canon (significado del badge) · como serie de categorías: propuesta |
41
+ | `red` | error | Cancelado, rechazado, fallido. | canon (significado del badge) |
42
+ | `green` | success | Entregado, pagado, aprobado. | canon (significado del badge) |
43
+ | `yellow` | away | En pausa; o una serie más de categorías. | canon (significado del badge) · como serie de categorías: propuesta |
44
+ | `purple` | feature | Lo nuevo; o una serie más de categorías. | canon (significado del badge) · como serie de categorías: propuesta |
45
+ | `sky` · `pink` · `teal` | verified · highlighted · stable | Series de categorías a partir de la séptima. | propuesta |
46
+ | `gray` (default) | faded | «Otros» o «Sin categoría»: lo que no se reparte. | propuesta |
47
+ | `light-gray` | — | No usar: es el mismo gris del apagado. **Cuándo sí:** el resto de una barra de progreso partida («lo que falta»). | propuesta |
48
+ | `disabled` | — | Una serie sin datos o apagada. Dentro de `sui-chart-legend` va por `disabled: true`, no por color. | según el componente |
49
+ | `customColor` | el color que ya usa el gráfico | Solo si el gráfico tiene paleta propia; gana sobre `color`. | propuesta |
50
+
51
+ ### `size`
52
+
53
+ | size | cuándo | fuente |
54
+ |---|---|---|
55
+ | `small` (16 px) | Junto a texto de 12 (como en la leyenda, que lo usa siempre). | según el componente |
56
+ | `medium` (20 px, default) | Junto a texto de 14: filas y tablas. | propuesta |
57
+
58
+ El círculo de color mide 12 px en los dos tamaños: lo que cambia es el aire alrededor.
59
+
60
+ ### Usos de hoy que romperían la regla
61
+
62
+ - **3 puntos de serie hechos a mano** (`<span>` con `[style.background]`) → `sui-chart-legend-dot`:
63
+ `components/customer-retention/customer-retention.html:17`,
64
+ `components/order-fulfillment/order-fulfillment.html:17`,
65
+ `components/cancellation-rate/cancellation-rate.html:33`.
66
+ - Las 5 leyendas hechas a mano están contadas en `sui-chart-legend`.
67
+
68
+ ## Tamaño en mobile y en web
69
+
70
+ Es decorativo y no se toca: no tiene mínimo para el dedo.
71
+
72
+ | uso | mobile | web | fuente |
73
+ |---|---|---|---|
74
+ | fila de resumen o tabla | `medium` (20) | `medium` (20) | propuesta |
75
+ | junto a texto de 12 | `small` (16) | `small` (16) | según el componente |
76
+
77
+ No cambia por plataforma: va con el tamaño del texto que acompaña, no con la pantalla.
78
+
79
+ ## «No usar»: por qué no hoy y cuándo sí
80
+
81
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
82
+ |---|---|---|
83
+ | `light-gray` | es el gris del apagado | el resto de una barra partida |
84
+ | `sky`, `pink`, `teal` | ningún gráfico pasa de 6 series | un gráfico por distrito o por local con 7 series o más |
85
+
86
+ ## API
87
+
88
+ <!-- api:inicio -->
89
+ <!-- generada: no editar a mano — `npm run docs` -->
90
+
91
+ | input | tipo | default |
92
+ |---|---|---|
93
+ | `color` | `'gray' \| 'light-gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal' \| 'disabled'` | `'gray'` |
94
+ | `size` | `'medium' \| 'small'` | `'medium'` |
95
+ | `customColor` | `string \| null` | `null` |
96
+
97
+ Outputs: ninguno.
98
+ <!-- api:fin -->
99
+
100
+ Constantes exportadas: `SUI_CHART_LEGEND_COLORS` (los 11 colores en el orden del Figma),
101
+ `SUI_CHART_SERIES_COLORS` (el orden automático: azul, naranja, rojo, verde…) y
102
+ `SUI_CHART_LEGEND_HEX` (color → hex, para darle la misma paleta a ECharts).
103
+
104
+ ## Trampas
105
+
106
+ - **El default es `gray`**, no un color de serie: sin `color` todos los puntos salen grises.
107
+ - `size` arranca en `medium` aquí, pero la leyenda usa siempre `small`.
108
+ - El punto lleva un anillo blanco y una sombra para separarse del gráfico: sobre un fondo blanco
109
+ se ve un poco más chico que un círculo plano del mismo tamaño.
110
+ - `SUI_CHART_LEGEND_HEX` tiene los hex del modo claro: en modo oscuro no se invierten.
111
+ - Es decorativo (`aria-hidden`): el significado lo dice el texto de al lado.
112
+
113
+ ## Ejemplo
114
+
115
+ ```html
116
+ <span class="fila"><sui-chart-legend-dot color="green" /> Entregados <b>86 %</b></span>
117
+ <span class="fila"><sui-chart-legend-dot color="red" /> Cancelados <b>14 %</b></span>
118
+ ```