@ajuarezso/sui-design-system 0.19.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 (97) hide show
  1. package/docs/INDEX.md +136 -0
  2. package/docs/sui-alert/README.md +229 -0
  3. package/docs/sui-app-store-badge/README.md +137 -0
  4. package/docs/sui-avatar/README.md +263 -0
  5. package/docs/sui-avatar-group/README.md +115 -0
  6. package/docs/sui-badge/README.md +229 -0
  7. package/docs/sui-banner/README.md +190 -0
  8. package/docs/sui-brand-logo/README.md +143 -0
  9. package/docs/sui-breadcrumb-item/README.md +96 -0
  10. package/docs/sui-breadcrumbs/README.md +122 -0
  11. package/docs/sui-button/README.md +209 -0
  12. package/docs/sui-button-group/README.md +178 -0
  13. package/docs/sui-button-group-item/README.md +102 -0
  14. package/docs/sui-card/README.md +168 -0
  15. package/docs/sui-chart-legend/README.md +140 -0
  16. package/docs/sui-chart-legend-dot/README.md +118 -0
  17. package/docs/sui-checkbox/README.md +147 -0
  18. package/docs/sui-checkbox-card/README.md +150 -0
  19. package/docs/sui-checkbox-label/README.md +143 -0
  20. package/docs/sui-circular-progress-bar/README.md +131 -0
  21. package/docs/sui-color-dot/README.md +112 -0
  22. package/docs/sui-color-picker/README.md +124 -0
  23. package/docs/sui-compact-avatar-group/README.md +103 -0
  24. package/docs/sui-compact-button/README.md +190 -0
  25. package/docs/sui-compact-select/README.md +127 -0
  26. package/docs/sui-compact-select-for-input/README.md +117 -0
  27. package/docs/sui-content-card/README.md +147 -0
  28. package/docs/sui-content-divider/README.md +124 -0
  29. package/docs/sui-content-label/README.md +148 -0
  30. package/docs/sui-counter-input/README.md +145 -0
  31. package/docs/sui-date-selector/README.md +98 -0
  32. package/docs/sui-datepicker/README.md +193 -0
  33. package/docs/sui-day-cell/README.md +118 -0
  34. package/docs/sui-day-label/README.md +81 -0
  35. package/docs/sui-divider/README.md +102 -0
  36. package/docs/sui-drawer-footer/README.md +127 -0
  37. package/docs/sui-drawer-header/README.md +140 -0
  38. package/docs/sui-emoji/README.md +138 -0
  39. package/docs/sui-empty-state/README.md +145 -0
  40. package/docs/sui-fancy-button/README.md +148 -0
  41. package/docs/sui-file-icon/README.md +103 -0
  42. package/docs/sui-file-upload/README.md +154 -0
  43. package/docs/sui-file-upload-card/README.md +129 -0
  44. package/docs/sui-flag/README.md +99 -0
  45. package/docs/sui-form-hint/README.md +124 -0
  46. package/docs/sui-form-label/README.md +148 -0
  47. package/docs/sui-icon/README.md +135 -0
  48. package/docs/sui-image-upload/README.md +200 -0
  49. package/docs/sui-image-upload-profile/README.md +145 -0
  50. package/docs/sui-inline-input/README.md +104 -0
  51. package/docs/sui-inline-select/README.md +101 -0
  52. package/docs/sui-input/README.md +244 -0
  53. package/docs/sui-integration-switch/README.md +142 -0
  54. package/docs/sui-kbd/README.md +97 -0
  55. package/docs/sui-key-icon/README.md +125 -0
  56. package/docs/sui-link-button/README.md +221 -0
  57. package/docs/sui-logo/README.md +152 -0
  58. package/docs/sui-notification/README.md +179 -0
  59. package/docs/sui-notification-footer/README.md +98 -0
  60. package/docs/sui-notification-tab-menu/README.md +112 -0
  61. package/docs/sui-otp-input/README.md +116 -0
  62. package/docs/sui-pagination/README.md +146 -0
  63. package/docs/sui-password-strength/README.md +99 -0
  64. package/docs/sui-payment-icon/README.md +98 -0
  65. package/docs/sui-period-range/README.md +93 -0
  66. package/docs/sui-popover/README.md +178 -0
  67. package/docs/sui-product-card/README.md +173 -0
  68. package/docs/sui-progress-bar/README.md +132 -0
  69. package/docs/sui-progress-bar-label/README.md +143 -0
  70. package/docs/sui-radio/README.md +134 -0
  71. package/docs/sui-radio-card/README.md +160 -0
  72. package/docs/sui-radio-label/README.md +137 -0
  73. package/docs/sui-rating/README.md +199 -0
  74. package/docs/sui-rich-editor/README.md +114 -0
  75. package/docs/sui-segmented-control/README.md +144 -0
  76. package/docs/sui-select/README.md +180 -0
  77. package/docs/sui-slider/README.md +143 -0
  78. package/docs/sui-social-button/README.md +158 -0
  79. package/docs/sui-status-badge/README.md +164 -0
  80. package/docs/sui-stepper/README.md +166 -0
  81. package/docs/sui-store-card/README.md +147 -0
  82. package/docs/sui-switch/README.md +146 -0
  83. package/docs/sui-switch-card/README.md +149 -0
  84. package/docs/sui-switch-label/README.md +139 -0
  85. package/docs/sui-tab-chips/README.md +185 -0
  86. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  87. package/docs/sui-tab-menu-vertical/README.md +136 -0
  88. package/docs/sui-tag/README.md +145 -0
  89. package/docs/sui-tag-input/README.md +120 -0
  90. package/docs/sui-textarea/README.md +157 -0
  91. package/docs/sui-time-picker/README.md +237 -0
  92. package/docs/sui-toast/README.md +190 -0
  93. package/docs/sui-tooltip/README.md +201 -0
  94. package/fesm2022/ajuarezso-sui-design-system.mjs +466 -279
  95. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  96. package/package.json +1 -1
  97. package/types/ajuarezso-sui-design-system.d.ts +367 -72
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: sui-checkbox-label
3
+ selector: sui-checkbox-label
4
+ resumen: Casilla con su texto (y opcionalmente descripción, badge y link) para opciones que se suman
5
+ alternativas: [sui-checkbox (la casilla sola, el texto vive en otra parte), sui-checkbox-card (cada opción es una tarjeta), sui-switch-label (se aplica al instante), sui-radio-label (una sola opción)]
6
+ ---
7
+
8
+ # sui-checkbox-label
9
+
10
+ Story: [Atoms/Checkbox, Radio & Switch/Checkbox Label](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-checkbox-label--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para toda casilla que tiene texto al lado: «Acepto los términos», cada permiso de un
15
+ miembro del equipo, cada categoría de una lista. Toda la fila es clicable y se enchufa a un
16
+ formulario. **Pendiente de decisión:** no tiene `size` (20 px), así que en una pantalla nueva de
17
+ mobile choca con la regla de controles grandes; hasta que el DS le sume `size`, en mobile
18
+ `sui-checkbox-card` es la salida grande.
19
+
20
+ **No lo uses** para:
21
+
22
+ - Prender algo que se aplica ya, sin botón de guardar: `sui-switch-label`.
23
+ - Elegir una sola opción: `sui-radio-label`.
24
+ - Opciones con peso propio (ícono o logo, descripción larga, borde): `sui-checkbox-card`.
25
+ - Listas de 10+ palabras sueltas (talles, etiquetas): se vuelve un muro; ahí va una grilla de
26
+ `sui-checkbox` pelados o chips, como los de la calificación del pedido.
27
+
28
+ Regla corta: **casilla con texto → este · casilla sin texto → `sui-checkbox` · opción con peso → card.**
29
+
30
+ ## Qué variante usar
31
+
32
+ > **La guía del DS muestra las piezas, no cuándo usarlas.** Su ejemplo «con label avanzado»
33
+ > arma Label + (Sublabel) + badge «NEW» + descripción + Link Button, y la variante invertida
34
+ > (casilla a la derecha). No trae do/don't. Lo marcado «según la guía del DS» sale de ese ejemplo.
35
+ >
36
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas, misma lista
37
+ > de exclusión que `sui-badge`): **0 usos**. Hay **5 casillas armadas a mano** que deberían ser
38
+ > este componente (ver abajo).
39
+
40
+ ### Las piezas
41
+
42
+ | prop | cuándo | fuente |
43
+ |---|---|---|
44
+ | `label` | Siempre. Qué se marca, en una a tres palabras («Gestionar productos»). | según la guía del DS (pieza); largo según `docs/CANON-SUI.md` §5.4 |
45
+ | `sublabel` | Una precisión corta entre paréntesis: «(opcional)», «(12)». Va con paréntesis en el texto: el componente no los pone. | según la guía del DS («Label(Sublabel)») |
46
+ | `description` | Cuando la opción necesita una frase que explique qué pasa si se marca («Recibe un correo cada vez que entra un pedido»). Pasa el label a peso medio. | según la guía del DS (pieza); el «cuándo» es propuesta |
47
+ | `badge` | Solo para algo **nuevo** («Nuevo», en `purple` como el badge de novedad). Con string sale naranja `light`: pásale el objeto. | según la guía del DS (pieza «NEW»); el color es propuesta |
48
+ | `link` | Un «Ver detalle» que abre más información sin marcar la casilla. **Solo se ve si hay `description`.** | según la guía del DS (pieza «Link Button») |
49
+ | `flip` | No usar en formularios: la casilla va a la izquierda, como en la guía. | propuesta, falta aprobación |
50
+ | `indeterminate` | El «seleccionar todo» de un grupo, cuando hay algunas marcadas. Hoy no usar (ver abajo). | propuesta, falta aprobación |
51
+ | `disabled` | La opción existe pero no se puede tocar ahora; decir por qué en la descripción. | según la guía del DS |
52
+ | `size` | `medium` (default, Figma): casilla 20, label 14/20. `large`: casilla 24, label 16/24. `xlarge`: casilla 28, label 16/24. En large y xlarge el sublabel y la descripción pasan a 14/20, el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
53
+
54
+ **Usos de hoy que deberían ser este componente (5):**
55
+
56
+ - **4 `sui-checkbox` + `<label>` a mano:** `pages/settings/team/team.html:225` y `:294`
57
+ (permisos), `components/option-sections-manager/option-sections-manager.html:188` y `:210`.
58
+ - **1 nativo:** `pages/sales-channels/facebook/facebook.html:69`.
59
+
60
+ **Antes de migrarlos:** los 4 de `sui-checkbox` hoy están en 24/28 px (`bp.controlSize()`,
61
+ regla de controles grandes del dueño, 28-09-2026). Desde el 03-10-2026 el label tiene `size`
62
+ (`large` 24 / `xlarge` 28): al migrar se le pasa `[size]="bp.controlSize()"` y no se achican.
63
+
64
+ ## Tamaño en mobile y en web
65
+
66
+ En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
67
+ va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
68
+ (`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px); para controles,
69
+ `bp.controlSize()` devuelve `xlarge` en mobile y `large` en web (regla de controles grandes del
70
+ dueño, 28-09-2026).
71
+
72
+ | uso | mobile | web | fuente |
73
+ |---|---|---|---|
74
+ | casilla con texto en un formulario | `xlarge` (casilla 28, label 16/24) | `large` (casilla 24, label 16/24) | canon (aprobado por el dueño, 03-10-2026) |
75
+ | lista densa de desktop (tabla, filtros) | — | `medium` (casilla 20, label 14/20) | propuesta, falta aprobación |
76
+
77
+ ```html
78
+ <sui-checkbox-label [size]="bp.controlSize()" label="Recordar mi dirección" [(active)]="recordar" />
79
+ ```
80
+
81
+ Toda la fila se toca (el host recibe el click), así que el área táctil es la fila entera, no solo
82
+ la casilla. Con `xlarge` el contenido baja 2 px para que la línea del label (24) quede centrada
83
+ con la casilla (28).
84
+
85
+ ## «No usar»: por qué no hoy y cuándo sí
86
+
87
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
88
+ |---|---|---|
89
+ | `flip` | en un formulario la casilla va a la izquierda; a la derecha se confunde con un switch | una lista de ajustes donde las demás filas son switches a la derecha y una sola es casilla |
90
+ | `badge` | ninguna opción marcable es nueva hoy | una opción recién agregada («Nuevo») en un formulario que el usuario ya conoce |
91
+ | `link` | ninguna opción necesita abrir detalle | «Acepto los términos» con su «Ver términos» (con `description`) |
92
+ | `indeterminate` | ninguna lista tiene «seleccionar todo» | el «Todos los permisos» arriba de la lista de permisos del equipo |
93
+
94
+ ## API
95
+
96
+ <!-- api:inicio -->
97
+ <!-- generada: no editar a mano — `npm run docs` -->
98
+
99
+ | input | tipo | default |
100
+ |---|---|---|
101
+ | `label` | `string` | `''` |
102
+ | `sublabel` | `string \| null` | `null` |
103
+ | `description` | `string \| null` | `null` |
104
+ | `badge` | `SuiBadgeConfig \| string \| null` | `null` |
105
+ | `link` | `SuiLinkConfig \| string \| null` | `null` |
106
+ | `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
107
+ | `flip` | `boolean` | `false` |
108
+ | `disabled` | `boolean` | `false` |
109
+ | `indeterminate` | `boolean` | `false` |
110
+ | `active` · model, `[(active)]` | `boolean` | `false` |
111
+
112
+ | output | payload |
113
+ |---|---|
114
+ | `linkClick` | `MouseEvent` |
115
+ <!-- api:fin -->
116
+
117
+ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
118
+
119
+ ## Trampas
120
+
121
+ - **El estado se llama `active`, no `checked`.** `[(checked)]` aquí no existe.
122
+ - **No tiene `size`**: la casilla siempre mide 20 px.
123
+ - **`link` solo se dibuja si hay `description`.** Sin descripción desaparece sin avisar.
124
+ - **`description` cambia el label de peso** (regular → medio) y abre el bloque en columna.
125
+ - El badge con string sale **naranja `light`**; en `sui-checkbox-card` el default es azul.
126
+ Pasa `{ label, color, variant }` para que combinen.
127
+ - `link` con `href` es un `<a>` real; con `target: '_blank'` agrega `rel="noopener noreferrer"`.
128
+ Sin `href`, emite `linkClick` y no marca la casilla.
129
+ - `flip` cambia el orden con CSS `order`: el lector de pantalla y el Tab siguen viendo la casilla primero.
130
+ - Deshabilitado baja la opacidad del bloque a 0.5 (convención del proyecto).
131
+
132
+ ## Ejemplo
133
+
134
+ ```html
135
+ <sui-checkbox-label label="Gestionar productos" [(active)]="permisos.productos" />
136
+
137
+ <sui-checkbox-label
138
+ label="Avisarme por correo"
139
+ sublabel="(opcional)"
140
+ description="Te escribimos cuando entra un pedido nuevo."
141
+ [link]="{ label: 'Ver ejemplo', href: '/ayuda/correos', target: '_blank' }"
142
+ formControlName="avisoCorreo" />
143
+ ```
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: sui-circular-progress-bar
3
+ selector: sui-circular-progress-bar
4
+ resumen: El avance de algo en un anillo, para cuando cabe en un cuadrado al lado de un título
5
+ alternativas: [sui-progress-bar-label (barra con título y número, cuando hay ancho), sui-progress-bar (barra pelada)]
6
+ ---
7
+
8
+ # sui-circular-progress-bar
9
+
10
+ Story: [Atoms/Progress/Circular Progress Bar](https://sui-design-system.web.app/?path=/docs/atoms-progress-circular-progress-bar--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando el avance tiene que entrar en **un cuadrado al lado de un título**, como un
15
+ avatar: «Perfil 60 % completo» en el onboarding, los documentos al día de un repartidor, la meta
16
+ del día en una card chica.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Un avance con título y descripción, si hay ancho: `sui-progress-bar-label` se lee más rápido.
21
+ - Varios avances en una lista: barras, que se comparan a simple vista; los anillos no.
22
+ - Una espera sin porcentaje: un spinner.
23
+
24
+ ## Qué variante usar
25
+
26
+ > **En la guía del DS se llama «Progress Circle»** («un gráfico simple para mostrar qué tan
27
+ > completo está algo»). Trae cinco tamaños (80, 72, 64, 56 y 48; default 80), `value` y `max`,
28
+ > y **un solo color** (el primario del DS, que en SUI es el azul de información). No dice cuándo
29
+ > usar cada tamaño. Lo marcado «según la guía del DS» sale de ahí; el resto es **propuesta,
30
+ > falta aprobación**.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**, sin contar prototipos ni
33
+ > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
34
+ > `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`).
35
+
36
+ ### `size`
37
+
38
+ | size | número al centro | cuándo | fuente |
39
+ |---|---|---|---|
40
+ | `48` | no (solo el anillo) | Junto a un texto que ya dice el porcentaje. | según la guía del DS |
41
+ | `56` | sí, 12 px | Web: en una fila o una card. | según la guía del DS (tamaño) · propuesta (cuándo) |
42
+ | `64` (default SUI) | sí, 14 px | Mobile: en una fila o una card. | según la guía del DS (tamaño) · propuesta (cuándo) |
43
+ | `72` | sí, 14 px | Web: lo principal de la pantalla. | según la guía del DS (tamaño) · propuesta (cuándo) |
44
+ | `80` (default de la guía) | sí, 14 px | Mobile: lo principal de la pantalla. | según la guía del DS (tamaño) · propuesta (cuándo) |
45
+
46
+ ### `color` — misma regla que `sui-progress-bar`
47
+
48
+ | color | cuándo | fuente |
49
+ |---|---|---|
50
+ | `blue` (default) | Avance neutro: perfil completado, pasos. | según la guía del DS (su único color) |
51
+ | `green` | Se cumplió o va bien: documentos al día. | propuesta, falta aprobación |
52
+ | `orange` | Va en curso y pide atención: meta del día a medias. | propuesta, falta aprobación |
53
+ | `red` | Se perdió o se acabó: meta perdida. | propuesta, falta aprobación |
54
+ | `purple` | **No usar** (ver abajo). | propuesta, falta aprobación |
55
+
56
+ ### El resto
57
+
58
+ | propiedad | valor | cuándo | fuente |
59
+ |---|---|---|---|
60
+ | `number` | `true` (default) | Lo normal: el porcentaje al centro. | según la guía del DS |
61
+ | `number` | `false` | El texto de al lado ya dice el número. | propuesta, falta aprobación |
62
+ | `strokeWidth` | número | **No usar** (ver abajo). | propuesta, falta aprobación |
63
+ | `ariaLabel` | texto | Siempre: lo que mide («Perfil completado»). | propuesta, falta aprobación |
64
+
65
+ Usos de hoy que rompen la regla: **0** (no hay usos).
66
+
67
+ ## No usar: por qué no hoy y cuándo sí
68
+
69
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
70
+ |---|---|---|
71
+ | El componente entero (0 usos) | Los avances de hoy tienen ancho para una barra con título. | «Perfil 60 % completo» en el onboarding del repartidor o del local. |
72
+ | `color="purple"` | Extensión SUI sin caso, igual que en la barra. | El avance de una función en prueba. |
73
+ | `strokeWidth` | El grosor por tamaño ya sale de la guía (8 % del diámetro; 14 % en 48). | Ninguno: si hace falta otro grosor, se pide al DS. |
74
+
75
+ ## Tamaño en mobile y en web
76
+
77
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
78
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
79
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
80
+ de la app.
81
+
82
+ | uso | mobile | web | fuente |
83
+ |---|---|---|---|
84
+ | Junto a un texto que ya dice el número | `48` | `48` | propuesta, falta aprobación |
85
+ | En una fila o card | `64` | `56` | propuesta, falta aprobación |
86
+ | Lo principal de la pantalla | `80` | `72` | propuesta, falta aprobación |
87
+
88
+ ```ts
89
+ readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
90
+ ```
91
+
92
+ ```html
93
+ <sui-circular-progress-bar [value]="60" [size]="bp.isMobile() ? 64 : 56" ariaLabel="Perfil completado" />
94
+ ```
95
+
96
+ `size` es un número: el ternario devuelve `64 : 56`, no `'64' : '56'`.
97
+
98
+ ## API
99
+
100
+ <!-- api:inicio -->
101
+ <!-- generada: no editar a mano — `npm run docs` -->
102
+
103
+ | input | tipo | default |
104
+ |---|---|---|
105
+ | `value` | `number` | `0` |
106
+ | `size` | `48 \| 56 \| 64 \| 72 \| 80` | `64` |
107
+ | `color` | `'blue' \| 'green' \| 'orange' \| 'red' \| 'purple'` | `'blue'` |
108
+ | `number` | `boolean` | `true` |
109
+ | `strokeWidth` | `number \| null` | `null` |
110
+ | `ariaLabel` | `string \| null` | `null` |
111
+
112
+ Outputs: ninguno.
113
+ <!-- api:fin -->
114
+
115
+ ## Trampas
116
+
117
+ - **`size` es un número, no un texto**: `[size]="64"`, no `size="64"` (un string no tipa).
118
+ - **En 48 no hay número**, aunque `number` sea `true`.
119
+ - **No hay `max`**: `value` es un porcentaje de 0 a 100.
120
+ - El default de SUI es **64**; el de la guía, **80**.
121
+ - El porcentaje se redondea a entero.
122
+ - El azul es `--sui-state-information-base`, no el naranja de `--sui-primary-base`.
123
+
124
+ ## Ejemplo
125
+
126
+ ```html
127
+ <div class="perfil">
128
+ <sui-circular-progress-bar [value]="60" [size]="56" ariaLabel="Perfil completado" />
129
+ <span>Completa tu perfil para empezar a repartir</span>
130
+ </div>
131
+ ```
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: sui-color-dot
3
+ selector: sui-color-dot
4
+ resumen: Una opción de color para elegir (o mostrar el color elegido); no es un punto de estado
5
+ alternativas: [sui-color-picker (el selector completo, con hex propio), sui-badge type="with-dot" (punto de estado vivo), sui-status-badge withDot (punto de estado de un ciclo)]
6
+ ---
7
+
8
+ # sui-color-dot
9
+
10
+ Story: [Atoms/Color/Color Dot](https://sui-design-system.web.app/?path=/docs/atoms-color-color-dot--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para que la persona **elija un color** de una fila de opciones, o para mostrar el color
15
+ que ya eligió: el color de una variante de producto («Rojo vino»), el color de una etiqueta. Es
16
+ un `<button role="radio">`: se toca.
17
+
18
+ **No lo uses** para:
19
+
20
+ - **Un estado** (en línea, abierto, pendiente): el color del dot es el color literal, sin
21
+ significado. Va `sui-badge type="with-dot"` o `sui-status-badge [withDot]="true"`, que pintan
22
+ con los tokens de estado.
23
+ - Un punto decorativo o una leyenda de gráfico: un `<span>` con el token del color.
24
+ - Elegir un color que no está en los 10: `sui-color-picker` (que usa este dot por dentro).
25
+
26
+ ## Qué variante usar
27
+
28
+ > **En la guía del DS es la fila «Recommended Colors» del selector de color**: muestras para
29
+ > elegir un color recomendado. No dice cuándo usar cada estado. Lo marcado «según la guía del
30
+ > DS» sale de ahí; el resto es **propuesta, falta aprobación**.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**, sin contar prototipos ni
33
+ > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
34
+ > `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`). Candidato:
35
+ > `components/add-product-modal/add-product-modal.html:289` elige el color de una variante con
36
+ > `<input type="color">`, que abre un selector distinto en iOS, Android y escritorio.
37
+
38
+ | propiedad | valor | cuándo | fuente |
39
+ |---|---|---|---|
40
+ | `color` | los 10 (`gray`, `blue`, `orange`, `red`, `green`, `yellow`, `purple`, `sky`, `pink`, `teal`) | El color literal que se ofrece. **No significan nada**: son la paleta `-500`, no los tokens de estado del badge. Se ofrecen en ese orden. | según la guía del DS (colores recomendados) |
41
+ | `customHex` | `#rrggbb` | Un color exacto que no está en los 10 (el de una variante de producto). Pisa a `color`. | propuesta, falta aprobación |
42
+ | `state` | `default` | Opción disponible. | según la guía del DS |
43
+ | `state` | `selected` | El color elegido. Uno solo por fila; lo setea la pantalla. | según la guía del DS |
44
+ | `state` | `disabled` | Un color que no se puede elegir (agotado en esa variante). | propuesta, falta aprobación |
45
+ | `state` | `hover` | **No usar** (ver abajo). | propuesta, falta aprobación |
46
+ | `size` | `medium` (default) · `large` | `medium` 24 (Figma) en web; `large` 32 en mobile. En `large` el dot mide 22, 18 en hover y 16 seleccionado, con anillo de 24. | `medium`: según la guía del DS · `large`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
47
+ | `ariaLabel` | texto | El nombre del color para el lector de pantalla. Por default dice «Rojo», «Celeste»; con `customHex`, el hex. Con hex propio, pasar el nombre («Rojo vino»). | propuesta, falta aprobación |
48
+
49
+ Usos de hoy que rompen la regla: **0** (no hay usos).
50
+
51
+ ## No usar: por qué no hoy y cuándo sí
52
+
53
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
54
+ |---|---|---|
55
+ | El componente entero (0 usos) | La app no ofrece colores para elegir. | El color de una variante de producto en `add-product-modal`, en lugar del selector nativo. |
56
+ | `state="hover"` | El CSS ya lo pone al pasar el mouse. | Vitrinas y capturas del DS. |
57
+
58
+ ## Tamaño en mobile y en web
59
+
60
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
61
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
62
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
63
+ de la app.
64
+
65
+ | uso | mobile | web | fuente |
66
+ |---|---|---|---|
67
+ | Cualquiera | `large` (32 × 32) | `medium` (24 × 24) | canon (aprobado por el dueño, 03-10-2026) |
68
+ | Separación entre dots | 12 px | 4 px | propuesta, falta aprobación |
69
+
70
+ ```html
71
+ <sui-color-dot [color]="c" [size]="bp.isMobile() ? 'large' : 'medium'" [state]="c === elegido() ? 'selected' : 'default'" />
72
+ ```
73
+
74
+ `large` mide 32, todavía por debajo de los 44 px del dedo: los 12 px de separación completan el
75
+ área para no tocar el vecino.
76
+
77
+ ## API
78
+
79
+ <!-- api:inicio -->
80
+ <!-- generada: no editar a mano — `npm run docs` -->
81
+
82
+ | input | tipo | default |
83
+ |---|---|---|
84
+ | `color` | `'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal'` | `'gray'` |
85
+ | `customHex` | `string \| null` | `null` |
86
+ | `state` | `'default' \| 'hover' \| 'selected' \| 'disabled'` | `'default'` |
87
+ | `size` | `'medium' \| 'large'` | `'medium'` |
88
+ | `ariaLabel` | `string` | `''` |
89
+
90
+ | output | payload |
91
+ |---|---|
92
+ | `clicked` | `void` |
93
+ <!-- api:fin -->
94
+
95
+ Output: `(clicked)`, solo si no está `disabled`. El dot no cambia su propio `state`: la pantalla
96
+ lo pasa a `selected`.
97
+
98
+ ## Trampas
99
+
100
+ - **Es un botón**: dentro de otro botón o de un link, rompe el HTML y el foco.
101
+ - **El dot no se marca solo** al tocarlo: `(clicked)` avisa y la pantalla setea `state`.
102
+ - `disabled` pinta el dot gris claro, no el color atenuado.
103
+ - Con `customHex`, el `color` se ignora.
104
+ - `medium` mide 24 × 24 y `large` 32 × 32: los dos quedan por debajo de los 44 del dedo. En mobile va `large` con 12 px de separación entre dots.
105
+
106
+ ## Ejemplo
107
+
108
+ ```html
109
+ @for (c of colores; track c) {
110
+ <sui-color-dot [color]="c" [state]="c === elegido() ? 'selected' : 'default'" (clicked)="elegido.set(c)" />
111
+ }
112
+ ```
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: sui-color-picker
3
+ selector: sui-color-picker
4
+ resumen: Botón que abre un panel para elegir un color libre (espectro, matiz, hex) o uno de los recomendados
5
+ alternativas: [sui-color-dot (un punto de color, para armar una grilla propia), sui-select o sui-radio-card (el color es una categoría con nombre, no un color libre)]
6
+ ---
7
+
8
+ # sui-color-picker
9
+
10
+ Story: [Atoms/Color/Color Picker](https://sui-design-system.web.app/?path=/docs/atoms-color-color-picker--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando la persona tiene que **crear o elegir un color libre** y guardarlo como hex: el
15
+ color de una variante de producto («Rojo», «Azul marino» en una polera), el color de una etiqueta.
16
+ Se ve igual en iOS, Android y desktop porque no usa el selector del sistema.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Elegir entre colores que son categorías con nombre (estados, tipos): `sui-select` o
21
+ `sui-radio-card`. El picker es para color **libre**.
22
+ - Una grilla fija de colores siempre visible, sin botón: arma la grilla con `sui-color-dot`.
23
+ - El selector nativo (`<input type="color">`): abre algo distinto en cada sistema.
24
+
25
+ Regla corta: **color libre que se guarda → color-picker · una de N categorías → select · grilla siempre a la vista → color-dot.**
26
+
27
+ ## Qué variante usar
28
+
29
+ > **La guía del DS lo define para «elegir o crear colores específicos»** y lo muestra de dos
30
+ > formas: el panel a la vista y dentro de un popover con su botón («Pick Color»), con una
31
+ > sección de colores recomendados. No dice cuándo va cada pieza.
32
+ >
33
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
34
+ > **0 usos**. Hay **1 `<input type="color">` nativo** que es exactamente su caso.
35
+
36
+ ### Las piezas
37
+
38
+ | prop | cuándo | fuente |
39
+ |---|---|---|
40
+ | `value` | El hex guardado (`[(value)]`). Sin valor, el botón muestra el `placeholder`. | según la guía del DS (popover con botón) |
41
+ | `placeholder` | «Elegir color» (default). Cambiarlo solo si el campo dice qué color es («Color de la variante»). | propuesta, falta aprobación |
42
+ | `alpha` | **`false` por defecto en la app**: la base guarda 6 caracteres (`#rrggbb`). Con `true` (default del componente) puede emitir 8. | propuesta, falta aprobación |
43
+ | `colors` | Acotar los recomendados a los que tengan sentido para el caso. Default: los 10 de SUI. | según la guía del DS (sección «Recommended Colors») |
44
+ | `recommendedLabel` | «Colores recomendados» (default). | propuesta, falta aprobación |
45
+ | `presetsOnly` | Solo la grilla de recomendados, sin espectro ni hex: cuando el color tiene que salir de la paleta. | propuesta, falta aprobación |
46
+ | `eyedropper` | Dejar el default (`true`): solo aparece donde el navegador lo soporta (Chromium de escritorio). | propuesta, falta aprobación |
47
+ | `showFormatLabel` | `false`: el «Hex» con flecha es decorativo, no cambia de formato. | propuesta, falta aprobación |
48
+ | `disabled` | El campo existe pero no se puede tocar ahora. | propuesta, falta aprobación |
49
+ | `ariaLabel` | Siempre que el botón no tenga un label al lado que diga qué color es. | propuesta, falta aprobación |
50
+
51
+ **Usos de hoy que rompen la regla:**
52
+
53
+ - **1 nativo → `sui-color-picker` con `[alpha]="false"`:**
54
+ `components/add-product-modal/add-product-modal.html:293` (color de cada opción cuando el grupo
55
+ se muestra «como colores»; guarda `swatchHex` de 6 caracteres).
56
+
57
+ ## Tamaño en mobile y en web
58
+
59
+ | uso | mobile | web |
60
+ |---|---|---|
61
+ | botón que abre el panel | 32 px de alto (no hay `size`) | 32 px |
62
+
63
+ **No tiene un tamaño grande para mobile.** El botón mide unos 32 px de alto y los puntos de
64
+ color del panel 24 px. En mobile funciona, pero queda debajo de los 44 px de área táctil.
65
+ Agrandarlo es una decisión del DS.
66
+
67
+ ## «No usar»: por qué no hoy y cuándo sí
68
+
69
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
70
+ |---|---|---|
71
+ | `alpha` en `true` | el modelo de datos espera `#rrggbb`; con opacidad emite `#rrggbbaa` | un color de marca sobre imágenes donde la transparencia es parte del diseño (fondo de un banner) |
72
+ | `presetsOnly` | el único caso de hoy (colores de una variante) necesita colores libres | el color de una etiqueta interna con paleta cerrada |
73
+ | `showFormatLabel` en `true` | muestra «Hex» con una flecha que no hace nada | nunca, hasta que el DS soporte RGB o HSL |
74
+
75
+ ## API
76
+
77
+ <!-- api:inicio -->
78
+ <!-- generada: no editar a mano — `npm run docs` -->
79
+
80
+ | input | tipo | default |
81
+ |---|---|---|
82
+ | `colors` | `readonly SuiColorDotColor[]` | `SUI_COLOR_DOT_COLORS` |
83
+ | `value` · model, `[(value)]` | `string \| null` | `null` |
84
+ | `placeholder` | `string` | `'Elegir color'` |
85
+ | `recommendedLabel` | `string` | `'Colores recomendados'` |
86
+ | `presetsOnly` | `boolean` | `false` |
87
+ | `alpha` | `boolean` | `true` |
88
+ | `eyedropper` | `boolean` | `true` |
89
+ | `showFormatLabel` | `boolean` | `true` |
90
+ | `disabled` | `boolean` | `false` |
91
+ | `ariaLabel` | `string` | `'Seleccionar color'` |
92
+
93
+ | output | payload |
94
+ |---|---|
95
+ | `change` | `string` |
96
+ <!-- api:fin -->
97
+
98
+ `SuiColorDotColor`: `'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal'`.
99
+
100
+ ## Trampas
101
+
102
+ - **`alpha` viene en `true`**: si la persona baja la opacidad, el valor pasa a 8 caracteres.
103
+ Pasa `[alpha]="false"` si lo guardas como `#rrggbb`.
104
+ - **El «Hex» con flecha es decorativo**: solo lee y emite hex.
105
+ - **El cuentagotas no aparece en iOS, Android, Safari ni Firefox**: no es un error.
106
+ - El hex escrito a mano se aplica al salir del campo o con Enter; si es inválido, vuelve al anterior
107
+ sin avisar.
108
+ - Acepta 3, 4, 6 u 8 caracteres con o sin `#`, y siempre emite con `#`.
109
+ - El botón muestra el nombre en español si el color es uno de los 10 («Naranja»); si no, el hex
110
+ en mayúsculas.
111
+ - Elegir un recomendado **cierra** el panel; arrastrar el espectro no.
112
+ - El panel vive en un overlay del CDK: escapa a cualquier `overflow: hidden` del contenedor.
113
+ - No implementa `ControlValueAccessor`: se usa con `[(value)]`.
114
+
115
+ ## Ejemplo
116
+
117
+ ```html
118
+ <sui-color-picker
119
+ [alpha]="false"
120
+ [showFormatLabel]="false"
121
+ placeholder="Color de la variante"
122
+ [value]="opcion.swatchHex ?? null"
123
+ (valueChange)="cambiarColor(opcion, $event)" />
124
+ ```
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: sui-compact-avatar-group
3
+ selector: sui-compact-avatar-group
4
+ resumen: Varias personas en una píldora baja con el «+N» en texto, para tablas y filas apretadas
5
+ alternativas: [sui-avatar-group (la pila grande, para cards y cabeceras), sui-avatar (una sola persona)]
6
+ ---
7
+
8
+ # sui-compact-avatar-group
9
+
10
+ Story: [Atoms/Avatar/Compact Avatar Group](https://sui-design-system.web.app/?path=/docs/atoms-avatar-compact-avatar-group--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando hay que mostrar varias personas **en poco alto**: una celda de tabla, una fila
15
+ de lista. Es una píldora blanca con los avatares casi pegados y el «+N» como texto.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Una card o una cabecera con espacio: `sui-avatar-group`.
20
+ - Una sola persona: `sui-avatar`.
21
+
22
+ ## Qué variante usar
23
+
24
+ > **La guía del DS dice qué es, sus tamaños y sus dos estilos, no cuándo usar cada uno.** Lo
25
+ > marcado «según la guía del DS» sale de su texto o de su código; el resto es **propuesta,
26
+ > falta aprobación**.
27
+ >
28
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. El DS lo usa dentro
29
+ > de `sui-table`.
30
+
31
+ ### Lo que sí dice la guía del DS
32
+
33
+ - **Para qué es**: la versión más compacta del avatar group.
34
+ - **Tamaños**: 40, 32 y 24; el default de la guía es 40 (en SUI, `'32'`).
35
+ - **Estilos**: `default` (píldora blanca con sombra) y `stroke` (además, un borde `stroke-soft-200`).
36
+
37
+ ### `size`, `appearance`, `max` y `count`
38
+
39
+ | input | valor | cuándo | fuente |
40
+ |---|---|---|---|
41
+ | `size` | `'24'` | Celda de tabla. | propuesta |
42
+ | `size` | `'32'` (default SUI) | Fila de una lista. | propuesta |
43
+ | `size` | `'40'` (default de la guía) | Dentro de una card. | propuesta |
44
+ | `appearance` | `default` | Sobre un fondo gris o de color: la sombra lo separa. | propuesta |
45
+ | `appearance` | `stroke` | Sobre blanco, donde la sombra sola no alcanza a marcar el borde. | propuesta |
46
+ | `max` | `3` (default) | Tres avatares visibles. | propuesta |
47
+ | `count` | — | Solo si el total no está en `items` (vienen 3 caras pero son 12 personas): `count="+9"`. Si no, se calcula solo. | propuesta |
48
+
49
+ Usos de hoy que rompen la regla: **0** (no hay usos).
50
+
51
+ ## Tamaño en mobile y en web
52
+
53
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
54
+ pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
55
+ breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
56
+ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
57
+
58
+ | uso | mobile | web |
59
+ |---|---|---|
60
+ | fila o celda de tabla | `'32'` | `'24'` |
61
+ | dentro de una card | `'40'` | `'32'` |
62
+
63
+ ```html
64
+ <sui-compact-avatar-group [size]="bp.isMobile() ? '32' : '24'" [items]="repartidores" />
65
+ ```
66
+
67
+ ## «No usar»: por qué no hoy y cuándo sí
68
+
69
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
70
+ |---|---|---|
71
+ | todo el componente (0 usos) | no hay tablas con varias personas por fila | la columna «repartidores» en la tabla de locales del super admin |
72
+
73
+ ## API
74
+
75
+ <!-- api:inicio -->
76
+ <!-- generada: no editar a mano — `npm run docs` -->
77
+
78
+ | input | tipo | default |
79
+ |---|---|---|
80
+ | `size` | `'24' \| '32' \| '40'` | `'32'` |
81
+ | `appearance` | `'default' \| 'stroke'` | `'default'` |
82
+ | `items` | `readonly SuiAvatarGroupItem[]` | `[]` |
83
+ | `max` | `number` | `3` |
84
+ | `count` | `string \| null` | `null` |
85
+
86
+ Outputs: ninguno.
87
+ <!-- api:fin -->
88
+
89
+ `items` usa `SuiAvatarGroupItem` (ver `sui-avatar-group`).
90
+
91
+ ## Trampas
92
+
93
+ - **`size` es un string**: `size="32"`, no `[size]="32"` (con número no compila).
94
+ - **El estilo se llama `appearance`**, no `variant` ni `style` (el atributo `style` es del HTML).
95
+ - **`size` no es el de `sui-avatar`**: `'24'` → avatar `sm`, `'32'` → `md`, `'40'` → `lg`.
96
+ - **`count` gana sobre el cálculo**: si lo pasas, se muestra aunque no sobre nadie.
97
+ - Las reglas de foto y color de cada persona son las de `sui-avatar`.
98
+
99
+ ## Ejemplo
100
+
101
+ ```html
102
+ <sui-compact-avatar-group size="24" appearance="stroke" [items]="repartidoresDelLocal" />
103
+ ```