@ajuarezso/sui-design-system 0.19.0 → 0.20.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 (47) hide show
  1. package/docs/INDEX.md +136 -0
  2. package/docs/sui-alert/README.md +216 -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 +212 -0
  7. package/docs/sui-brand-logo/README.md +143 -0
  8. package/docs/sui-button/README.md +192 -0
  9. package/docs/sui-button-group/README.md +178 -0
  10. package/docs/sui-button-group-item/README.md +102 -0
  11. package/docs/sui-checkbox/README.md +147 -0
  12. package/docs/sui-checkbox-label/README.md +143 -0
  13. package/docs/sui-circular-progress-bar/README.md +131 -0
  14. package/docs/sui-color-dot/README.md +112 -0
  15. package/docs/sui-color-picker/README.md +124 -0
  16. package/docs/sui-compact-avatar-group/README.md +103 -0
  17. package/docs/sui-compact-button/README.md +190 -0
  18. package/docs/sui-content-divider/README.md +124 -0
  19. package/docs/sui-divider/README.md +102 -0
  20. package/docs/sui-emoji/README.md +138 -0
  21. package/docs/sui-fancy-button/README.md +148 -0
  22. package/docs/sui-file-icon/README.md +103 -0
  23. package/docs/sui-flag/README.md +99 -0
  24. package/docs/sui-form-hint/README.md +124 -0
  25. package/docs/sui-form-label/README.md +148 -0
  26. package/docs/sui-icon/README.md +135 -0
  27. package/docs/sui-kbd/README.md +97 -0
  28. package/docs/sui-key-icon/README.md +125 -0
  29. package/docs/sui-link-button/README.md +221 -0
  30. package/docs/sui-logo/README.md +152 -0
  31. package/docs/sui-payment-icon/README.md +98 -0
  32. package/docs/sui-progress-bar/README.md +132 -0
  33. package/docs/sui-progress-bar-label/README.md +143 -0
  34. package/docs/sui-radio/README.md +134 -0
  35. package/docs/sui-radio-label/README.md +137 -0
  36. package/docs/sui-rating/README.md +198 -0
  37. package/docs/sui-segmented-control/README.md +144 -0
  38. package/docs/sui-slider/README.md +143 -0
  39. package/docs/sui-social-button/README.md +158 -0
  40. package/docs/sui-status-badge/README.md +164 -0
  41. package/docs/sui-switch/README.md +146 -0
  42. package/docs/sui-switch-label/README.md +139 -0
  43. package/docs/sui-tag/README.md +145 -0
  44. package/fesm2022/ajuarezso-sui-design-system.mjs +193 -48
  45. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  46. package/package.json +1 -1
  47. package/types/ajuarezso-sui-design-system.d.ts +166 -27
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: sui-logo
3
+ selector: sui-logo
4
+ resumen: El logo de Master Pedidos (la M y la palabra), dibujado en SVG y coloreable
5
+ alternativas: [sui-brand-logo (logos de OTRAS marcas: WhatsApp, Google, Apple…), sui-avatar (el logo de un local, que es una foto)]
6
+ ---
7
+
8
+ # sui-logo
9
+
10
+ Story: [Atoms/Logo](https://sui-design-system.web.app/?path=/docs/atoms-logo--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** siempre que aparezca la marca Master Pedidos: barras, login, «Acerca de», la pantalla
15
+ de actualización, las páginas públicas.
16
+
17
+ **No lo uses** para:
18
+
19
+ - El logo de un local: es una foto, va en `sui-avatar`.
20
+ - Logos de terceros: `sui-brand-logo`.
21
+ - El splash nativo (`index.html`): se pinta antes de que arranque Angular, así que es una copia a
22
+ mano en SVG. Si se cambia el logo, hay que tocar las dos.
23
+
24
+ **Nunca un PNG o un SVG suelto del logo**: con `sui-logo` el color sigue al tema y el dibujo es
25
+ uno solo.
26
+
27
+ ## Qué variante usar
28
+
29
+ > **La guía del DS no tiene este componente**: es propio de SUI, porque es la marca de la app.
30
+ > Todo lo de abajo es **propuesta, falta aprobación**; los ejemplos salen de cómo se usa hoy.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: 10 logos en 8 archivos, sin contar
33
+ > prototipos ni vitrinas. 4 `horizontal`, 3 `stacked`, 3 `markOnly`; 7 con `[height]` y 3 con `size`.
34
+
35
+ ### `orientation` y `markOnly`
36
+
37
+ | valor | cuándo | ejemplo real de la app | fuente |
38
+ |---|---|---|---|
39
+ | `horizontal` (default) | Barras y cabeceras: la M a la izquierda y la palabra en dos líneas. | `layouts/public/public-layout.html:4` · `pages/public/pedido-en-vivo/pedido-en-vivo.html:72` · `pages/role-selector/role-selector.html:10` | propuesta |
40
+ | `stacked` | Pantallas de marca centradas: la M arriba y la palabra abajo. | `pages/empresa/about/about.html:12` · `components/ota-update/ota-update.html:118` | propuesta |
41
+ | `[markOnly]="true"` | Donde la palabra no entra o ya está escrita al lado: nav mobile, login. | `layouts/public/public-layout.html:6` · `pages/auth/login/login.html:3` | propuesta |
42
+
43
+ No existe la versión de una sola línea («Master Pedidos» en un renglón): es otro dibujo.
44
+
45
+ ### `size` y `height`
46
+
47
+ `size` fija el **alto**; el ancho sale solo.
48
+
49
+ | valor | alto | cuándo | fuente |
50
+ |---|---|---|---|
51
+ | `xs` / `sm` | 16 / 20 | No usar hoy: la palabra no se lee (con `markOnly` sí sirve). | propuesta |
52
+ | `md` (default) | 24 | Barra de una página pública. | propuesta |
53
+ | `lg` | 32 | Nav pública, login. | propuesta |
54
+ | `xl` | 40 | Pantalla de actualización. | propuesta |
55
+ | `2xl` | 48 | Selector de rol. | propuesta |
56
+ | `height` | libre | **Solo para más de 48 px**: el apilado de 120 en «Acerca de» y en la actualización. | propuesta |
57
+
58
+ **Usos de hoy que romperían la propuesta: 4 `[height]` que van a la escala.**
59
+ `components/ota-update/ota-update.html:17` (`40` → `size="xl"`),
60
+ `pages/public/pedido-en-vivo/pedido-en-vivo.html:72` (`22` → `md`),
61
+ `layouts/public/public-layout.html:6` (`28` → `lg`), `pages/customer/about/about.html:19` (`44` → `xl` o `2xl`).
62
+
63
+ ### `markColor` y `textColor`
64
+
65
+ | combinación | cuándo | fuente |
66
+ |---|---|---|
67
+ | de marca (default): M `--sui-primary-base` + palabra `--sui-text-strong-950` | Sobre fondo claro. **No hace falta pasar los colores**: ya son el default. | propuesta |
68
+ | monocromo: todo `--sui-text-strong-950` | Login y nav pública, donde el naranja ya está en el botón principal. | propuesta |
69
+ | blanco: todo `--sui-static-white` | Sobre naranja o sobre foto. `static-white` no cambia con el tema. | propuesta |
70
+ | cualquier otro color | No usar. | propuesta |
71
+
72
+ **Usos de hoy redundantes: 6** pasan a mano los colores que ya son el default (no rompen nada,
73
+ sobran): `components/ota-update/ota-update.html:17`, `pages/role-selector/role-selector.html:10`,
74
+ `pages/empresa/about/about.html:12`.
75
+
76
+ **Logo que no pasa por el componente: 1.** `components/landing-footer/landing-footer.html:7` usa
77
+ `assets/landing/logo-blanco.png` → `sui-logo` con los dos colores en `--sui-static-white`.
78
+
79
+ ### `decorative` y `ariaLabel`
80
+
81
+ | input | cuándo | fuente |
82
+ |---|---|---|
83
+ | `[decorative]="true"` | Cuando al lado ya está escrito «Master Pedidos» (el título de «Acerca de»): así el lector de pantalla no lo dice dos veces. | propuesta |
84
+ | `ariaLabel` | No tocar: ya dice «Master Pedidos». | propuesta |
85
+
86
+ ## Tamaño en mobile y en web
87
+
88
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
89
+ pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
90
+ breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
91
+ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
92
+
93
+ | uso | mobile | web |
94
+ |---|---|---|
95
+ | barra | `[markOnly]="true"` `size="lg"` | `horizontal` `size="lg"` |
96
+ | pantalla de entrada (selector de rol, login) | `2xl` (48) | `xl` (40) |
97
+ | pantalla de marca («Acerca de», actualización) | `stacked` `[height]="120"` | igual |
98
+
99
+ ```html
100
+ <sui-logo size="lg" [markOnly]="bp.isMobile()" />
101
+ ```
102
+
103
+ En la barra no cambia el alto, cambia la forma: en mobile no entra la palabra. Es lo que ya hace
104
+ `layouts/public/public-layout.html:4`–`:6`, con dos logos y CSS.
105
+
106
+ ## «No usar»: por qué no hoy y cuándo sí
107
+
108
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
109
+ |---|---|---|
110
+ | `size` `xs`, `sm` con palabra | la palabra no se lee | con `markOnly`: el ícono chico en una firma o un pie de página |
111
+ | un color fuera de los tres | la marca es naranja, negra o blanca | ninguno previsto |
112
+
113
+ ## API
114
+
115
+ <!-- api:inicio -->
116
+ <!-- generada: no editar a mano — `npm run docs` -->
117
+
118
+ | input | tipo | default |
119
+ |---|---|---|
120
+ | `orientation` | `'horizontal' \| 'stacked'` | `'horizontal'` |
121
+ | `markOnly` | `boolean` | `false` |
122
+ | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'` |
123
+ | `height` | `number \| string \| null` | `null` |
124
+ | `markColor` | `string` | `'var(--sui-primary-base)'` |
125
+ | `textColor` | `string` | `'var(--sui-text-strong-950)'` |
126
+ | `decorative` | `boolean` | `false` |
127
+ | `ariaLabel` | `string` | `'Master Pedidos'` |
128
+
129
+ Outputs: ninguno.
130
+ <!-- api:fin -->
131
+
132
+ ## Trampas
133
+
134
+ - **`height` gana sobre `size`.** Un número son px; un string es cualquier valor CSS (`'60%'`).
135
+ - **Los colores van por custom property**: `markColor="var(--sui-primary-base)"` funciona; un
136
+ `fill` puesto desde afuera, no.
137
+ - **Con `markOnly`, `orientation` no hace nada.**
138
+ - **No trae padding**: el `viewBox` es justo el dibujo. El aire lo pone quien lo usa.
139
+ - **No es `sui-brand-logo`**: ese sirve logos de otras marcas como imágenes que no se pueden teñir.
140
+
141
+ ## Ejemplo
142
+
143
+ ```html
144
+ <!-- Barra de una página pública -->
145
+ <sui-logo size="md" />
146
+
147
+ <!-- «Acerca de»: el título ya dice el nombre -->
148
+ <sui-logo orientation="stacked" [height]="120" [decorative]="true" />
149
+
150
+ <!-- Sobre el fondo naranja -->
151
+ <sui-logo [markOnly]="true" size="2xl" markColor="var(--sui-static-white)" />
152
+ ```
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: sui-payment-icon
3
+ selector: sui-payment-icon
4
+ resumen: El círculo de color de un pago de servicio (agua, gas, luz, internet, alquiler…)
5
+ alternativas: [sui-key-icon (cualquier otro ícono en círculo), sui-brand-logo (el logo de un medio de pago con marca)]
6
+ ---
7
+
8
+ # sui-payment-icon
9
+
10
+ Story: [Atoms/Icon/Payment Icon](https://sui-design-system.web.app/?path=/docs/atoms-icon-payment-icon--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para identificar el **tipo de un pago de servicio** en una lista: agua, gas, luz,
15
+ donación, internet, teléfono, alquiler, impuestos. Es un `sui-key-icon` `lighter` con el ícono y
16
+ el color ya elegidos.
17
+
18
+ **No lo uses** para:
19
+
20
+ - **Medios de pago** (Yape, Plin, efectivo, tarjeta): no están aquí. Este componente es de
21
+ **servicios**, no de cómo se paga.
22
+ - Cualquier otro ícono en círculo: `sui-key-icon`.
23
+
24
+ ## Qué variante usar
25
+
26
+ > **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
27
+ > aprobación**.
28
+ >
29
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**.
30
+
31
+ ### `type`
32
+
33
+ | valor | ícono y color | cuándo | fuente |
34
+ |---|---|---|---|
35
+ | `water` | gota, celeste | No usar hoy. | propuesta |
36
+ | `gas` | fuego, rojo | No usar hoy. | propuesta |
37
+ | `electricity` | foco, amarillo | No usar hoy. | propuesta |
38
+ | `donate` | mano con corazón, rosa | No usar hoy. | propuesta |
39
+ | `internet` | wifi, azul | No usar hoy. | propuesta |
40
+ | `phone` | celular, naranja | No usar hoy. | propuesta |
41
+ | `rent` | casa, verde | No usar hoy. | propuesta |
42
+ | `tax` | documento, morado | No usar hoy. | propuesta |
43
+
44
+ ### `size` y `ariaLabel`
45
+
46
+ | input | cuándo | fuente |
47
+ |---|---|---|
48
+ | `size` `40` (default) | El único tamaño del Figma. Los demás (32, 48, 56, 64) heredan la escala de `sui-key-icon`. | propuesta |
49
+ | `ariaLabel` | Solo si al lado no está escrito el servicio. Si no, es decorativo. | propuesta |
50
+
51
+ Usos de hoy que rompen la regla: **0**.
52
+
53
+ ## Tamaño en mobile y en web
54
+
55
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
56
+ pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
57
+ breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
58
+ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
59
+
60
+ | uso | mobile | web |
61
+ |---|---|---|
62
+ | fila de una lista | `40` | `32` |
63
+
64
+ ```html
65
+ <sui-payment-icon type="electricity" [size]="bp.isMobile() ? 40 : 32" />
66
+ ```
67
+
68
+ ## «No usar»: por qué no hoy y cuándo sí
69
+
70
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
71
+ |---|---|---|
72
+ | todo el componente (0 usos) | la app no maneja pagos de servicios | si el local registra sus gastos fijos por tipo (luz, agua, internet, alquiler), o si la billetera paga servicios |
73
+
74
+ ## API
75
+
76
+ <!-- api:inicio -->
77
+ <!-- generada: no editar a mano — `npm run docs` -->
78
+
79
+ | input | tipo | default |
80
+ |---|---|---|
81
+ | `type` | `SuiPaymentIconType` | — (requerido) |
82
+ | `size` | `32 \| 40 \| 48 \| 56 \| 64` | `40` |
83
+ | `ariaLabel` | `string \| null` | `null` |
84
+
85
+ Outputs: ninguno.
86
+ <!-- api:fin -->
87
+
88
+ ## Trampas
89
+
90
+ - **No es para medios de pago**: no hay Yape, Plin ni tarjeta.
91
+ - **`type` decide el ícono y el color**: no se pueden cambiar. Si necesitas otro, usa `sui-key-icon`.
92
+ - **`size` es un número**: `[size]="48"`.
93
+
94
+ ## Ejemplo
95
+
96
+ ```html
97
+ <sui-payment-icon type="electricity" />
98
+ ```
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: sui-progress-bar
3
+ selector: sui-progress-bar
4
+ resumen: Barra que muestra cuánto falta para completar algo, pintada con el estado de lo que mide
5
+ alternativas: [sui-progress-bar-label (la misma barra con título, número y descripción), sui-circular-progress-bar (el avance en un círculo, junto a un título), un gráfico (repartir un total entre partes)]
6
+ ---
7
+
8
+ # sui-progress-bar
9
+
10
+ Story: [Atoms/Progress/Progress Bar](https://sui-design-system.web.app/?path=/docs/atoms-progress-progress-bar--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para mostrar **cuánto avanzó algo hacia un final**: una descarga, una foto que se sube,
15
+ la meta del día, el saldo que queda. Va pelada (sin texto) solo cuando otra cosa de la pantalla ya
16
+ dice qué mide y cuánto.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Una barra con título o número visible: `sui-progress-bar-label` (la arma con la tipografía y el
21
+ espaciado del DS).
22
+ - **Repartir un total entre partes** (visitas por dispositivo, ventas por canal): eso no es un
23
+ avance hacia algo, es una proporción. Va un gráfico, o la barra en `blue` si es una sola cifra.
24
+ - Una espera sin porcentaje conocido: un spinner o un skeleton.
25
+
26
+ ## Qué variante usar
27
+
28
+ > **La guía del DS lo define como «un gráfico simple para mostrar qué tan completo está algo»**
29
+ > y trae cuatro colores (`blue` default, `red`, `orange`, `green`), una sola altura, `value` y
30
+ > `max`. No dice cuándo usar cada color. Cada color apunta a un token de estado
31
+ > (`--sui-state-*`), igual que el badge: de ahí sale su significado, que es el mismo que el del
32
+ > badge aprobado. Lo marcado «según la guía del DS» sale de ahí; el resto es **propuesta, falta
33
+ > aprobación**.
34
+ >
35
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **2 barras peladas en 1 pantalla**
36
+ > (`overview-visitors`), sin contar prototipos ni vitrinas (`master-preview`,
37
+ > `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`,
38
+ > `master-ejercicios`, `dev-index`). Las otras 4 barras de la app usan `sui-progress-bar-label`.
39
+
40
+ ### `color` — el estado de lo que mide
41
+
42
+ | color | token | cuándo | ejemplo | fuente |
43
+ |---|---|---|---|---|
44
+ | `blue` (default) | `information` | Avance neutro: no hay nada que juzgar. | Subir una foto, descargar, pasos de un formulario | según la guía del DS (default y token) · propuesta (cuándo) |
45
+ | `green` | `success` | Se cumplió o va bien. | Meta cumplida, saldo alto | según la guía del DS (token) · propuesta (cuándo) |
46
+ | `orange` | `warning` | Va en curso y pide atención. | Saldo bajando, meta del día a medias | según la guía del DS (token) · propuesta (cuándo) |
47
+ | `red` | `error` | Se perdió o se acabó. | Meta perdida, saldo agotado | según la guía del DS (token) · propuesta (cuándo) |
48
+ | `purple` | `feature` | **No usar** (ver abajo). Extensión SUI. | — | propuesta, falta aprobación |
49
+
50
+ **Ojo con el naranja**: en este proyecto el `orange` de estado (`--sui-state-warning-base`) es
51
+ el mismo `#fa7319` de la marca. Una barra naranja sin un juicio detrás se lee como «marca», no
52
+ como «atención».
53
+
54
+ ### `size`
55
+
56
+ | size | alto | cuándo | fuente |
57
+ |---|---|---|---|
58
+ | `small` | 4 px | Web: dentro de una card o una fila densa. | propuesta, falta aprobación |
59
+ | `medium` (default) | 6 px | Web: lo normal y la barra principal. Mobile: dentro de una fila densa. Es la única altura de la guía. | según la guía del DS |
60
+ | `large` | 8 px | Mobile: lo normal y la barra principal (descarga, meta del día). | propuesta, falta aprobación |
61
+ | `xlarge` | 10 px | **No usar** (ver abajo). | propuesta, falta aprobación |
62
+
63
+ ### `value` y `ariaLabel`
64
+
65
+ | propiedad | regla | fuente |
66
+ |---|---|---|
67
+ | `value` | Siempre de 0 a 100. Si el dato viene como fracción (0,6) o como «3 de 5», se convierte antes. | propuesta, falta aprobación |
68
+ | `ariaLabel` | **Obligatorio** en la barra pelada: sin título visible, el lector de pantalla no sabe qué mide. | propuesta, falta aprobación |
69
+
70
+ **Usos de hoy que rompen la regla — a discutir, 2:**
71
+ `pages/overview/components/overview-visitors/overview-visitors.html:22` y `:45` pintan en
72
+ `orange` cómo se reparten las visitas por dispositivo. No es un avance ni pide atención: con esta
73
+ regla va `blue`, o mejor un gráfico. Tampoco llevan `ariaLabel`.
74
+
75
+ ## No usar: por qué no hoy y cuándo sí
76
+
77
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
78
+ |---|---|---|
79
+ | `color="purple"` | No está en la guía y no hay caso. | El avance de una función en prueba, con el mismo morado que el badge «Beta». |
80
+ | `size="xlarge"` | Ninguna barra es lo único de su pantalla. | Una pantalla de carga larga, donde la barra es lo único (importar la carta de un local). |
81
+
82
+ ## Tamaño en mobile y en web
83
+
84
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
85
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
86
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
87
+ de la app.
88
+
89
+ | uso | mobile | web | fuente |
90
+ |---|---|---|---|
91
+ | Dentro de una fila o card densa | `medium` (6) | `small` (4) | propuesta, falta aprobación |
92
+ | Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8) | `medium` (6) | propuesta, falta aprobación |
93
+
94
+ ```ts
95
+ readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
96
+ ```
97
+
98
+ ```html
99
+ <sui-progress-bar [value]="progreso()" [size]="bp.isMobile() ? 'medium' : 'small'" ariaLabel="Subiendo la foto" />
100
+ ```
101
+
102
+ ## API
103
+
104
+ <!-- api:inicio -->
105
+ <!-- generada: no editar a mano — `npm run docs` -->
106
+
107
+ | input | tipo | default |
108
+ |---|---|---|
109
+ | `value` | `number` | `0` |
110
+ | `color` | `'blue' \| 'green' \| 'orange' \| 'red' \| 'purple'` | `'blue'` |
111
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
112
+ | `ariaLabel` | `string \| null` | `null` |
113
+
114
+ Outputs: ninguno.
115
+ <!-- api:fin -->
116
+
117
+ ## Trampas
118
+
119
+ - **No hay `max`** (la guía sí lo tiene): `value` es un porcentaje de 0 a 100, con tope.
120
+ - **El default es `blue`**, no el naranja de la marca.
121
+ - El azul de la barra es `--sui-state-information-base`, **no** `--sui-primary-base` (que en
122
+ este proyecto es naranja).
123
+ - El ancho es el 100 % del padre: dentro de un flex, dale `flex: 1` o un ancho.
124
+ - Lleva `role="progressbar"` con `aria-valuenow`; la animación se apaga con
125
+ `prefers-reduced-motion`.
126
+
127
+ ## Ejemplo
128
+
129
+ ```html
130
+ <!-- Dentro de una fila que ya dice «Subiendo la foto · 64 %» -->
131
+ <sui-progress-bar [value]="progreso()" ariaLabel="Subiendo la foto" />
132
+ ```
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: sui-progress-bar-label
3
+ selector: sui-progress-bar-label
4
+ resumen: La barra de progreso con lo que mide, cuánto va y, si hace falta, qué hacer
5
+ alternativas: [sui-progress-bar (la barra pelada, cuando otra cosa ya la rotula), sui-circular-progress-bar (el avance en un círculo, junto a un título)]
6
+ ---
7
+
8
+ # sui-progress-bar-label
9
+
10
+ Story: [Atoms/Progress/Progress Bar Label](https://sui-design-system.web.app/?path=/docs/atoms-progress-progress-bar-label--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** siempre que una barra de progreso lleve **título o número visible**: «Descargando
15
+ actualización 64 %», «Meta del día · 3 de 5 entregas», «Saldo restante · S/ 12.40 de S/ 20.00».
16
+ Arma la barra (`sui-progress-bar` adentro), el título, el número y una fila opcional con
17
+ descripción y link, con el espaciado del DS.
18
+
19
+ **No lo uses** para:
20
+
21
+ - Una barra que ya está rotulada por la fila donde vive: `sui-progress-bar`.
22
+ - Un avance que va en un cuadrado al lado de un título: `sui-circular-progress-bar`.
23
+ - Repartir un total entre partes: un gráfico.
24
+
25
+ ## Qué variante usar
26
+
27
+ > **La guía del DS no tiene una página propia para esto**: son los ejemplos «With Label» y
28
+ > «Advanced» de la página de la barra de progreso (título + «80%», y debajo un link
29
+ > «Upgrade» con una descripción). No dice cuándo usar cada forma. Lo marcado «según la guía del
30
+ > DS» sale de esos ejemplos; el resto es **propuesta, falta aprobación**.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **4 en 3 pantallas** (la descarga del
33
+ > OTA, el saldo y la meta del día en el dashboard del repartidor, el saldo en la billetera), sin
34
+ > contar prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`,
35
+ > `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`). Todas
36
+ > `on-top`; 3 con `percentage` de texto; 1 con `showBottom`; ninguna con `link`.
37
+
38
+ `color` y `size` se eligen con las tablas de `sui-progress-bar`: el color es el **estado de lo
39
+ que mide** (blue neutro, green cumplido, orange pide atención, red perdido o agotado).
40
+
41
+ | propiedad | valor | cuándo | ejemplo real | fuente |
42
+ |---|---|---|---|---|
43
+ | `type` | `on-top` (default) | Título y número arriba, barra abajo. Lo normal. | Las 4 de la app | según la guía del DS («With Label») |
44
+ | `type` | `on-right` | Sin título: barra y número en una línea, dentro de una fila que ya dice qué mide a la izquierda. | Pedidos por distrito en una tabla | propuesta, falta aprobación |
45
+ | `title` | texto | Qué mide, en sentence case, sin punto: «Saldo restante», «Meta del día». | `pages/driver/driver-wallet/driver-wallet.html:43` | según la guía del DS |
46
+ | `percentage` | `true` (default) | El porcentaje es la unidad que importa (una descarga). | `components/ota-update/ota-update.html:132` | según la guía del DS («80%») |
47
+ | `percentage` | texto | Hay una unidad real: entregas, soles. «3 de 5 entregas», «S/ 12.40 de S/ 20.00». | `pages/driver/driver-dashboard/driver-dashboard.html:512` | propuesta, falta aprobación |
48
+ | `percentage` | `false` | El número ya está escrito al lado, o no significa nada. | — | propuesta, falta aprobación |
49
+ | `showBottom` + `description` | texto | Qué está pasando o qué hacer mientras avanza: «No cierres la app, estamos dejando todo listo.» | `components/ota-update/ota-update.html:132` | según la guía del DS («Advanced») |
50
+ | `link` | texto o `{ label, href }` | La acción que resuelve lo que la barra avisa: «Recargar» cuando el saldo está en rojo. Va con `showBottom`. | — (sin usos) | según la guía del DS («Upgrade») · propuesta (cuándo) |
51
+ | `ariaLabel` | texto | Lo que mide, si el título no alcanza («Saldo restante sobre el saldo de cortesía»). | `pages/driver/driver-dashboard/driver-dashboard.html:240` | propuesta, falta aprobación |
52
+
53
+ **Usos de hoy que rompen la regla — a discutir, 1:**
54
+ `components/ota-update/ota-update.html:132` pinta la descarga en `orange`. Una descarga es avance
55
+ neutro: con la regla de color va `blue`. En la app el naranja se lee como la marca, así que puede
56
+ ser una decisión de marca y no un error: decide el dueño. Las de saldo y meta (`driver-wallet:43`,
57
+ `driver-dashboard:240` y `:512`) ya pintan verde, naranja y rojo según el estado: cumplen.
58
+
59
+ ## No usar: por qué no hoy y cuándo sí
60
+
61
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
62
+ |---|---|---|
63
+ | `type="on-right"` | Ninguna barra de hoy vive en una fila con su nombre al lado. | Una tabla del super admin con el avance por distrito o por local. |
64
+ | `link` | Ninguna barra de hoy ofrece la acción que la resuelve. | «Recargar» bajo el saldo del repartidor cuando está en rojo. |
65
+
66
+ ## Tamaño en mobile y en web
67
+
68
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
69
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
70
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
71
+ de la app.
72
+
73
+ El `size` solo cambia la barra; el título y el número no cambian de tamaño.
74
+
75
+ | uso | mobile | web | fuente |
76
+ |---|---|---|---|
77
+ | Dentro de una card o fila densa (saldo en el dashboard) | `medium` (6) | `small` (4) | propuesta, falta aprobación |
78
+ | Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8) | `medium` (6) | propuesta, falta aprobación |
79
+
80
+ ```ts
81
+ readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
82
+ ```
83
+
84
+ ```html
85
+ <sui-progress-bar-label title="Saldo restante" [value]="balancePercent()"
86
+ [size]="bp.isMobile() ? 'large' : 'medium'" [color]="balanceColor()" />
87
+ ```
88
+
89
+ Hoy las 4 de la app tienen un size fijo para las dos plataformas.
90
+
91
+ ## API
92
+
93
+ <!-- api:inicio -->
94
+ <!-- generada: no editar a mano — `npm run docs` -->
95
+
96
+ | input | tipo | default |
97
+ |---|---|---|
98
+ | `value` | `number` | `0` |
99
+ | `type` | `'on-top' \| 'on-right'` | `'on-top'` |
100
+ | `title` | `string` | `''` |
101
+ | `percentage` | `boolean \| string` | `true` |
102
+ | `showBottom` | `boolean` | `false` |
103
+ | `description` | `string` | `''` |
104
+ | `link` | `SuiLinkConfig \| string \| null` | `null` |
105
+ | `color` | `'blue' \| 'green' \| 'orange' \| 'red' \| 'purple'` | `'blue'` |
106
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
107
+ | `ariaLabel` | `string \| null` | `null` |
108
+
109
+ | output | payload |
110
+ |---|---|
111
+ | `linkClick` | `void` |
112
+ <!-- api:fin -->
113
+
114
+ Output: `(linkClick)`. Con `link` de texto el `<a>` no navega y solo emite; con
115
+ `{ label, href }` navega y además emite.
116
+
117
+ ## Trampas
118
+
119
+ - **`description` y `link` solo se ven con `[showBottom]="true"`.**
120
+ - **`on-right` ignora `title`, `description` y `link`**: solo barra y número.
121
+ - `percentage` acepta `true`, `false` o un texto: un texto vacío vuelve al porcentaje.
122
+ - El porcentaje automático se redondea (`64.6` → «65%»).
123
+ - El link se pinta en el azul de información, no en el naranja de la marca.
124
+ - Si no hay `title` y `percentage` es `false`, no se dibuja la fila de arriba.
125
+ - Tiene el strip del `title` nativo: no aparece el tooltip gris del navegador.
126
+
127
+ ## Ejemplo
128
+
129
+ ```html
130
+ <!-- Meta del día del repartidor -->
131
+ <sui-progress-bar-label
132
+ title="Meta del día"
133
+ [value]="hechas / meta * 100"
134
+ [percentage]="hechas + ' de ' + meta + ' entregas'"
135
+ [color]="perdida ? 'red' : cumplida ? 'green' : 'orange'"
136
+ size="large" />
137
+
138
+ <!-- Saldo en rojo, con la acción que lo resuelve -->
139
+ <sui-progress-bar-label
140
+ title="Saldo restante" [value]="18" percentage="S/ 3.60 de S/ 20.00" color="red"
141
+ [showBottom]="true" link="Recargar" description="para seguir recibiendo pedidos"
142
+ (linkClick)="abrirRecarga()" />
143
+ ```
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: sui-radio
3
+ selector: sui-radio
4
+ resumen: El círculo solo para elegir una opción de una lista corta, sin texto propio
5
+ alternativas: [sui-radio-label (círculo con su texto, lista densa), sui-radio-card (opción con peso o que se toca en el teléfono), sui-select (más de 6 opciones), sui-segmented-control (2-4 modos que se aplican al instante), sui-checkbox (varias a la vez)]
6
+ ---
7
+
8
+ # sui-radio
9
+
10
+ Story: [Atoms/Checkbox, Radio & Switch/Radio](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-radio--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para elegir **una** opción de una lista corta, solo como círculo: cuando el texto vive
15
+ en otra parte (una columna «Por defecto» en una tabla, una fila propia con foto y precio).
16
+ Va dentro de un `sui-radio-group`, que es el que hace que elegir una desmarque la otra.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Un círculo con su texto en una lista densa (franjas horarias): `sui-radio-label`.
21
+ - Opciones con peso (ícono, descripción, borde) o que se tocan en el teléfono: `sui-radio-card`
22
+ (método de pago, tipo de entrega, motivos de cancelación). Crece con `bp.controlSize()`; el
23
+ radio-label no tiene `size`.
24
+ - Más de ~6 opciones: `sui-select`.
25
+ - 2-4 modos de la misma vista que se aplican al instante: `sui-segmented-control`.
26
+ - Varias a la vez: `sui-checkbox`.
27
+
28
+ Regla corta: **lista densa de texto → radio-label · con peso o en el teléfono → radio-card · muchas → select · sin texto → este.**
29
+
30
+ ## Qué variante usar
31
+
32
+ > **La guía del DS lo define como control para «una sola selección de una lista corta de
33
+ > opciones»**, y su ejemplo con label es una lista de motivos para reportar algo («Spam»,
34
+ > «Acoso», «Infringe las reglas»). Muestra deshabilitado, con label y con label avanzado. No
35
+ > trae do/don't de tamaños.
36
+ >
37
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
38
+ > **2 `sui-radio` en 2 archivos**, ambos en modo suelto (`standaloneChecked`), con tamaño
39
+ > dinámico. Más **1 `<input type="radio">` nativo**.
40
+
41
+ ### Estado y modo
42
+
43
+ | qué | cuándo | fuente |
44
+ |---|---|---|
45
+ | dentro de `sui-radio-group` + `[value]` | Siempre que haya más de una opción. El grupo hace la exclusión y se enchufa a `[(ngModel)]`. | según la guía del DS (es un radio group) |
46
+ | suelto con `[(standaloneChecked)]` | Solo cuando la exclusión la hace la fila o el padre (la fila de opciones del detalle de producto). **Suelto, al tocarlo se desmarca** como un checkbox. | propuesta, falta aprobación |
47
+ | `disabled` | La opción existe pero no aplica ahora (una variante agotada). | según la guía del DS |
48
+
49
+ ### `size`
50
+
51
+ | size | px | cuándo | fuente |
52
+ |---|---|---|---|
53
+ | `xlarge` | 28 | Mobile, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
54
+ | `large` | 24 | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
55
+ | `medium` (default) | 20 | Solo dentro de un componente que fija su escala (detalle de producto). Es el único tamaño de la guía. | según la guía del DS (único tamaño); el «cuándo» es propuesta |
56
+
57
+ **Usos de hoy que rompen la regla:**
58
+
59
+ - **1 radio nativo → `sui-radio-card type="basic"`:**
60
+ `pages/driver/driver-order-detail/driver-order-detail.html:812` (motivos de cancelación del
61
+ repartidor, el mismo caso del ejemplo de la guía). La pantalla hermana del local ya lo resolvió
62
+ así: `pages/orders/orders.html:566`.
63
+ - **1 suelto que se puede desincronizar:** `pages/super-admin/master-settings/master-settings.html:105`
64
+ (categoría por defecto). Usa `[standaloneChecked]` + `$event && …`: al tocar el que ya está
65
+ elegido, el círculo se apaga por dentro pero el padre sigue diciendo que es el elegido. Va en
66
+ un `sui-radio-group` con `[ngModel]`.
67
+
68
+ ## Tamaño en mobile y en web
69
+
70
+ | uso | mobile | web |
71
+ |---|---|---|
72
+ | círculo en una fila o tabla | `xlarge` (28 px) | `large` (24 px) |
73
+ | dentro de un componente que fija su escala | lo que pase el padre | lo que pase el padre |
74
+
75
+ ```html
76
+ <sui-radio [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
77
+ ```
78
+
79
+ El más grande mide 28 px: el área táctil de 44 px la tiene que dar la fila.
80
+
81
+ ## «No usar»: por qué no hoy y cuándo sí
82
+
83
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
84
+ |---|---|---|
85
+ | suelto (`standaloneChecked`) fuera de una fila propia | se desmarca al tocarlo de nuevo: no es un radio | nunca como grupo; solo como dibujo dentro de una fila que maneja el clic |
86
+
87
+ ## API
88
+
89
+ <!-- api:inicio -->
90
+ <!-- generada: no editar a mano — `npm run docs` -->
91
+
92
+ ### `sui-radio`
93
+
94
+ | input | tipo | default |
95
+ |---|---|---|
96
+ | `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
97
+ | `value` | `SuiRadioValue` | `null` |
98
+ | `disabled` | `boolean` | `false` |
99
+ | `standaloneChecked` · model, `[(standaloneChecked)]` | `boolean` | `false` |
100
+
101
+ Outputs: ninguno.
102
+
103
+ ### `sui-radio-group`
104
+
105
+ Inputs: ninguno.
106
+
107
+ Outputs: ninguno.
108
+ <!-- api:fin -->
109
+
110
+ `sui-radio-group`: sin inputs; implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`)
111
+ y proyecta los radios (`sui-radio`, `sui-radio-label`, `sui-radio-card`).
112
+
113
+ ## Trampas
114
+
115
+ - **Suelto, togglea.** `standaloneChecked` se invierte con cada toque: se puede desmarcar. Para
116
+ semántica de radio, `sui-radio-group`.
117
+ - **`sui-radio-group` no tiene `value`**: se maneja con `[(ngModel)]` o un form control.
118
+ - **`sui-radio-group` es `inline-flex` en fila con gap 16.** Para lista vertical hay que darle
119
+ `flex-direction: column; align-items: flex-start` desde afuera.
120
+ - **Deshabilitar el control del grupo no deshabilita los radios** (`setDisabledState` no hace
121
+ nada): pasa `[disabled]` a cada uno.
122
+ - No hay `small`: el más chico es `medium` (20 px).
123
+ - Sin marcar, en foco, el círculo se pinta del color de marca: viene del Figma, no es un error.
124
+ - No dibuja texto ni `aria-label`: pelado, pon el texto en un `<label>` o usa `sui-radio-label`.
125
+
126
+ ## Ejemplo
127
+
128
+ ```html
129
+ <sui-radio-group [(ngModel)]="categoriaPorDefecto">
130
+ @for (cat of categorias; track cat.id) {
131
+ <sui-radio [size]="bp.controlSize()" [value]="cat.id" [attr.aria-label]="cat.nombre" />
132
+ }
133
+ </sui-radio-group>
134
+ ```