@ajuarezso/sui-design-system 0.22.0 → 0.23.1

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 (99) hide show
  1. package/docs/INDEX.md +8 -8
  2. package/docs/sui-accordion/README.md +2 -2
  3. package/docs/sui-activity-feed/README.md +1 -2
  4. package/docs/sui-alert/README.md +28 -19
  5. package/docs/sui-app-store-badge/README.md +5 -4
  6. package/docs/sui-avatar/README.md +16 -16
  7. package/docs/sui-avatar-group/README.md +4 -4
  8. package/docs/sui-badge/README.md +27 -9
  9. package/docs/sui-banner/README.md +10 -9
  10. package/docs/sui-brand-logo/README.md +3 -3
  11. package/docs/sui-breadcrumbs/README.md +1 -1
  12. package/docs/sui-button/README.md +48 -24
  13. package/docs/sui-button-group/README.md +6 -4
  14. package/docs/sui-button-group-item/README.md +3 -3
  15. package/docs/sui-card/README.md +17 -19
  16. package/docs/sui-chart-legend/README.md +8 -7
  17. package/docs/sui-checkbox/README.md +11 -6
  18. package/docs/sui-checkbox-card/README.md +24 -19
  19. package/docs/sui-checkbox-label/README.md +32 -10
  20. package/docs/sui-circular-progress-bar/README.md +2 -0
  21. package/docs/sui-color-dot/README.md +1 -1
  22. package/docs/sui-color-picker/README.md +22 -7
  23. package/docs/sui-command-menu-footer/README.md +8 -8
  24. package/docs/sui-command-menu-search/README.md +2 -2
  25. package/docs/sui-compact-avatar-group/README.md +4 -3
  26. package/docs/sui-compact-button/README.md +41 -44
  27. package/docs/sui-compact-select/README.md +9 -5
  28. package/docs/sui-compact-select-for-input/README.md +2 -2
  29. package/docs/sui-content-card/README.md +6 -5
  30. package/docs/sui-content-divider/README.md +4 -4
  31. package/docs/sui-content-label/README.md +11 -6
  32. package/docs/sui-counter-input/README.md +19 -18
  33. package/docs/sui-date-selector/README.md +16 -12
  34. package/docs/sui-datepicker/README.md +46 -32
  35. package/docs/sui-day-cell/README.md +17 -8
  36. package/docs/sui-day-label/README.md +2 -2
  37. package/docs/sui-divider/README.md +5 -5
  38. package/docs/sui-drawer-footer/README.md +19 -5
  39. package/docs/sui-dropdown-search/README.md +3 -3
  40. package/docs/sui-emoji/README.md +6 -6
  41. package/docs/sui-empty-state/README.md +13 -23
  42. package/docs/sui-fancy-button/README.md +24 -18
  43. package/docs/sui-file-icon/README.md +1 -1
  44. package/docs/sui-file-upload/README.md +3 -0
  45. package/docs/sui-file-upload-card/README.md +8 -7
  46. package/docs/sui-filter/README.md +5 -5
  47. package/docs/sui-flag/README.md +3 -2
  48. package/docs/sui-form-hint/README.md +12 -8
  49. package/docs/sui-form-label/README.md +11 -16
  50. package/docs/sui-icon/README.md +4 -3
  51. package/docs/sui-image-upload/README.md +28 -16
  52. package/docs/sui-inline-input/README.md +7 -6
  53. package/docs/sui-inline-select/README.md +8 -5
  54. package/docs/sui-input/README.md +26 -35
  55. package/docs/sui-integration-switch/README.md +14 -7
  56. package/docs/sui-kbd/README.md +4 -4
  57. package/docs/sui-key-icon/README.md +6 -2
  58. package/docs/sui-link-button/README.md +21 -17
  59. package/docs/sui-modal-footer/README.md +1 -1
  60. package/docs/sui-notification/README.md +8 -6
  61. package/docs/sui-notification-footer/README.md +2 -2
  62. package/docs/sui-notification-tab-menu/README.md +5 -3
  63. package/docs/sui-pagination/README.md +8 -5
  64. package/docs/sui-password-strength/README.md +1 -1
  65. package/docs/sui-period-range/README.md +18 -14
  66. package/docs/sui-popover/README.md +13 -7
  67. package/docs/sui-product-card/README.md +14 -10
  68. package/docs/sui-progress-bar/README.md +4 -2
  69. package/docs/sui-progress-bar-label/README.md +2 -0
  70. package/docs/sui-radio/README.md +14 -7
  71. package/docs/sui-radio-card/README.md +12 -12
  72. package/docs/sui-radio-label/README.md +36 -11
  73. package/docs/sui-rating/README.md +28 -9
  74. package/docs/sui-rich-editor/README.md +3 -3
  75. package/docs/sui-segmented-control/README.md +32 -21
  76. package/docs/sui-select/README.md +35 -31
  77. package/docs/sui-sidebar/README.md +1 -2
  78. package/docs/sui-slider/README.md +7 -0
  79. package/docs/sui-social-button/README.md +24 -11
  80. package/docs/sui-status-badge/README.md +7 -3
  81. package/docs/sui-stepper/README.md +30 -17
  82. package/docs/sui-store-card/README.md +9 -4
  83. package/docs/sui-switch/README.md +16 -11
  84. package/docs/sui-switch-card/README.md +18 -16
  85. package/docs/sui-switch-label/README.md +22 -11
  86. package/docs/sui-tab-chips/README.md +55 -41
  87. package/docs/sui-tab-menu-horizontal/README.md +19 -11
  88. package/docs/sui-tab-menu-vertical/README.md +10 -5
  89. package/docs/sui-tag/README.md +25 -11
  90. package/docs/sui-tag-input/README.md +24 -14
  91. package/docs/sui-textarea/README.md +21 -21
  92. package/docs/sui-time-picker/README.md +38 -32
  93. package/docs/sui-toast/README.md +27 -22
  94. package/docs/sui-tooltip/README.md +14 -17
  95. package/docs/sui-topbar-button/README.md +2 -2
  96. package/fesm2022/ajuarezso-sui-design-system.mjs +1071 -240
  97. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  98. package/package.json +1 -1
  99. package/types/ajuarezso-sui-design-system.d.ts +601 -267
@@ -22,8 +22,9 @@ nada a nadie.
22
22
  > **La guía del DS no tiene este componente.** Todo es **propuesta, falta aprobación**.
23
23
  >
24
24
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
25
- > `sui-select`, `sui-compact-select`, `sui-inline-select`, `sui-dropdown-item`, `sui-tag` y
26
- > `sui-command-menu-item`.
25
+ > `sui-select`, `sui-compact-select`, `sui-compact-select-for-input`, `sui-inline-select`,
26
+ > `sui-dropdown-item` y `sui-command-menu-item`. `sui-tag` no la trae: la recibe proyectada en
27
+ > `[data-slot=start]`.
27
28
 
28
29
  ### `size`
29
30
 
@@ -12,7 +12,7 @@ Story: [Atoms/Form/Form Hint](https://sui-design-system.web.app/?path=/docs/atom
12
12
  ## Cuándo usarlo / cuándo no
13
13
 
14
14
  **Úsalo** para una línea debajo de un campo o grupo **que no trae la suya**: cómo se llena
15
- («Como aparece en tu DNI.»), un contador («120/200»), o qué falló («Selecciona un método de
15
+ («Como aparece en tu DNI»), un contador («120/200»), o qué falló («Selecciona un método de
16
16
  pago»). Va pegado al control que explica.
17
17
 
18
18
  **No lo uses** para:
@@ -31,7 +31,8 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
31
31
  > trae tres estados: normal, deshabilitado y con error (`hasError`). El ícono es una pieza aparte
32
32
  > y opcional. No da reglas de largo ni de copy.
33
33
  >
34
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
34
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`; las cifras
35
+ > siguen iguales el 04-10-2026, las líneas de abajo están actualizadas a esa fecha):
35
36
  > **36 usos en 18 archivos**: 11 `error`, 25 `neutral` (24 por default y 1 explícito), 0
36
37
  > `disabled`; 2 con `icon` propio (`information-line`). Hay además **al menos 14 hints escritos a
37
38
  > mano** con clases propias (`__form-hint`, `__hint`).
@@ -48,7 +49,7 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
48
49
 
49
50
  | qué | regla | fuente |
50
51
  |---|---|---|
51
- | `message` | Hasta 8 palabras (mediana 6). Si no cabe, es un `sui-alert`. Con punto final si es una oración. | canon (`docs/CANON-SUI.md` §5.4) |
52
+ | `message` | Hasta 8 palabras (mediana 6). Si no cabe, es un `sui-alert`. Sin punto final si es una frase corta; con punto si son dos oraciones. | canon (`docs/CANON-SUI.md` §5.4 el largo; `docs/VOZ-Y-ESCRITURA.md` el punto) |
52
53
  | `icon` sin pasar | El de la variante (ninguno en `neutral`, info en `error` y `disabled`). | según la guía del DS (ícono opcional); default de SUI |
53
54
  | `icon="…"` en `neutral` | Solo cuando la ayuda es una advertencia que conviene notar («No reconocimos el distrito…»). | propuesta, falta aprobación (2 usos hoy) |
54
55
  | `[icon]="null"` | Quita el ícono también en `error`. No usar: el error necesita algo más que el color. | propuesta, falta aprobación |
@@ -62,14 +63,14 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
62
63
  Bien usado, en cambio, `step-vehicle.html:43`: el error de un grupo de `sui-radio-card`.
63
64
  - **4 como subtítulo de una sección, no de un campo:** `pages/schedule/schedule.html:17`
64
65
  («Pausa tu sucursal…», bajo el título de la card), `:61`, `pages/drivers/drivers.html:29`,
65
- `pages/driver/driver-schedule/driver-schedule.html:94`.
66
+ `pages/driver/driver-schedule/driver-schedule.html:92`.
66
67
  - **12 de más de 8 palabras** (4 son los subtítulos de arriba) → acortar, o `sui-alert` si de
67
68
  verdad hace falta todo: `pages/super-admin/master-users/master-users.html:66` (26 palabras),
68
- `pages/orders/orders.html:587` (23), `pages/driver/driver-order-detail/driver-order-detail.html:834` (23),
69
- `pages/envios/envios.html:399` (15).
70
- - **Al menos 14 hints a mano** con clases propias. Ejemplos: `pages/discounts/discounts.html:196`
69
+ `pages/orders/orders.html:589` (23), `pages/driver/driver-order-detail/driver-order-detail.html:868` (23),
70
+ `pages/envios/envios.html:401` (15).
71
+ - **Al menos 14 hints a mano** con clases propias. Ejemplos: `pages/discounts/discounts.html:205`
71
72
  (`discounts__form-hint`), `components/settings-panel/settings-panel.html:93`,
72
- `pages/promociones/promociones.html:180`.
73
+ `pages/promociones/promociones.html:181`.
73
74
 
74
75
  ## Tamaño en mobile y en web
75
76
 
@@ -110,6 +111,9 @@ Outputs: ninguno.
110
111
  - **Sin `message` no ocupa lugar**: no hace falta envolverlo en `@if`.
111
112
  - En `error` el ícono es `information-fill` en rojo, no `error-warning-line`.
112
113
  - Letra fija de 12/16 px; el ícono mide 16 px y se alinea con la primera línea.
114
+ - `variant="error"` con mensaje lleva `role="alert"`: el lector lo anuncia al aparecer
115
+ (04-10-2026). Para enlazarlo a un control propio, pon `id` en el host y apúntalo con
116
+ `aria-describedby`; los campos del DS ya lo hacen solos.
113
117
 
114
118
  ## Ejemplo
115
119
 
@@ -19,7 +19,8 @@ Story: [Atoms/Form/Form Label](https://sui-design-system.web.app/?path=/docs/ato
19
19
 
20
20
  - **Encima de un `sui-input`, `sui-select` o `sui-textarea`**: esos ya dibujan su label, asterisco,
21
21
  sublabel y tooltip con `[label]`, `[required]`, `[sublabel]`, `[tooltip]`. Ponerle uno afuera
22
- duplica la pieza y pierde el `for`.
22
+ duplica la pieza y deja el `required` y el error separados del campo. El label interno sí
23
+ lleva `for` al `id` del control (desde el 04-10-2026); uno puesto afuera no lo conoce.
23
24
  - El texto de un solo checkbox, radio o switch: `sui-checkbox-label`, `sui-radio-label`,
24
25
  `sui-switch-label`.
25
26
  - Un título de sección o de card («Datos personales»): `sui-page-header`, `sui-content-label` o
@@ -35,8 +36,8 @@ Regla corta: **campo de texto → su propio `[label]` · grupo o control sin lab
35
36
  > es «Last Name*(Optional)»: el opcional va **entre paréntesis** en el sub. Tiene un solo tamaño y
36
37
  > un estado deshabilitado. Info (tooltip) y el link de la derecha vienen del Figma del componente.
37
38
  >
38
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
39
- > **37 usos en 13 archivos**: 13 con `required`, 5 con `sublabel="Opcional"`, 2 con `link`
39
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
40
+ > **37 usos en 13 archivos**: 13 con `required`, 7 con `sublabel="(Opcional)"`, 2 con `link`
40
41
  > («Cambiar»), 0 con `tooltip`, 0 con `disabled`; 6 con `size="medium"` explícito, el resto en el
41
42
  > default (`medium`).
42
43
 
@@ -63,27 +64,21 @@ Regla corta: **campo de texto → su propio `[label]` · grupo o control sin lab
63
64
  La regla de controles grandes del dueño (28-09-2026) no aplica aquí: el `size` del label es
64
65
  tipografía, no área táctil.
65
66
 
66
- **Usos de hoy que rompen las reglas:**
67
+ **Usos de hoy que rompen las reglas** (medido el 04-10-2026; los sublabels sin paréntesis, el
68
+ «(opcional)» en el label, el número de paso en los labels de promociones y el Title Case de
69
+ `drivers.html:28` ya se corrigieron en la app, commits `ce4a2d12` y `8128dc03`):
67
70
 
68
71
  - **8 encima de un campo que ya trae su label → pasar a `[label]` del campo:**
69
72
  `pages/driver-onboarding/step-info/step-info.html:37` («Nombre completo»), `:56`, `:77`;
70
73
  `pages/customer-onboarding/step-address/step-address.html:70` («Departamento», sobre
71
74
  `sui-select`), `:87`, `:106`; `pages/driver-onboarding/step-vehicle/step-vehicle.html:49`, `:62`.
72
75
  En esos mismos campos el `sui-form-hint` de abajo también es el `[hint]` del input.
73
- - **5 con `sublabel="Opcional"` sin paréntesis** → se lee «ImagenOpcional» (1 px de separación).
74
- Pasar a «(Opcional)»: `components/add-product-modal/add-product-modal.html:42`, `:195`;
75
- `pages/promociones/promociones.html:200`; `pages/business-onboarding/step-info/step-info.html:41`, `:54`.
76
- - **2 con «(opcional)» dentro del label → `sublabel`:** `pages/driver-onboarding/step-vehicle/step-vehicle.html:49`
77
- («Placa del vehículo (opcional)») y `:62`.
78
76
  - **2 como título de sección → heading o `sui-content-label`:** `pages/customer/checkout/checkout.html:187`
79
77
  («Datos personales») y `:35` («Recoges en el local»).
80
- - **5 con el número de paso dentro del label** («1. Imagen del banner»…«5. Comprobante de pago»):
81
- `pages/promociones/promociones.html:179`, `:200`, `:210`, `:230`, `:264`. Los pasos van en un
82
- `sui-stepper` o en el título de la sección; el label queda «Imagen del banner». Además `:200`
83
- («2. Descripción») está encima de un `sui-textarea`, que ya trae su `[label]`.
84
- - **1 en Title Case:** `pages/drivers/drivers.html:28` («Modo de Asignación» → «Modo de asignación»).
85
- - **3 con un switch armado a mano al lado → `sui-switch-label`:** `pages/discounts/discounts.html:195`,
86
- `:299`; `components/add-product-modal/add-product-modal.html:195`.
78
+ - **1 encima de un `sui-textarea`**, que ya trae su `[label]`: `pages/promociones/promociones.html:201`
79
+ («Descripción»).
80
+ - **3 con un switch armado a mano al lado → `sui-switch-label`:** `pages/discounts/discounts.html:204`,
81
+ `:316`; `components/add-product-modal/add-product-modal.html:204`.
87
82
 
88
83
  ## Tamaño en mobile y en web
89
84
 
@@ -91,7 +91,7 @@ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propue
91
91
 
92
92
  Un ícono suelto **nunca** es el área táctil: si se toca, va en `sui-compact-button` o
93
93
  `sui-button` `onlyIcon`, que dan los 44 px. Hoy solo 2 íconos cambian por breakpoint
94
- (`pages/discounts/discounts.html:101` y `:106`, con `bp.isTablet() ? 20 : 16`).
94
+ (`pages/discounts/discounts.html:103` y `:108`, con `bp.isTablet() ? 20 : 16`).
95
95
 
96
96
  ## «No usar»: por qué no hoy y cuándo sí
97
97
 
@@ -121,8 +121,9 @@ Outputs: ninguno.
121
121
  - **`size` acepta número o string**: `[size]="20"` son px; `size="1.25em"` es CSS. Con
122
122
  `size="20"` (string sin unidad) el ícono no toma tamaño.
123
123
  - **El nombre no se valida**: si no existe en RemixIcon, sale vacío sin error.
124
- - **No tiene `aria-label`**: los propios del DS llevan `aria-hidden`; los de RemixIcon son un
125
- `<i>` vacío. Si el ícono es lo único que dice algo, el texto va al lado o en el contenedor.
124
+ - **No tiene `aria-label` y es decorativo siempre**: el SVG propio y el `<i>` de RemixIcon llevan
125
+ `aria-hidden="true"` (el `<i>` desde el 04-10-2026; antes el lector podía leer el glifo como un
126
+ símbolo raro). Si el ícono es lo único que dice algo, el texto va al lado o en el contenedor.
126
127
  - **La app necesita la fuente de RemixIcon** (`remixicon/fonts/remixicon.css` en `styles.scss`):
127
128
  el paquete del DS no la trae.
128
129
  - Dentro de un `sui-kbd`, el kbd le fuerza el color `text-sub-600`.
@@ -63,7 +63,7 @@ El archivo que entrega **no se sube tal cual**: pasa por `ImageCompressorService
63
63
  | input | cuándo | fuente |
64
64
  |---|---|---|
65
65
  | `title` | Verbo + qué: «Subir logo», «Subir comprobante», «Subir captura del pago». | propuesta |
66
- | `subtitle` | Formatos y tamaño, **solo los que el componente acepta** (JPG, PNG o WebP), o el encuadre que se va a aplicar («se recorta a 16:9»). Mientras procesa: «Procesando…». | propuesta |
66
+ | `subtitle` | Formatos y tamaño, **solo los que el componente acepta** (JPG, PNG, WebP, GIF o HEIC), o el encuadre que se va a aplicar («se recorta a 16:9»). Mientras procesa: «Procesando…». | propuesta |
67
67
 
68
68
  ### `maxSize`, `disabled`, `src`
69
69
 
@@ -75,19 +75,20 @@ El archivo que entrega **no se sube tal cual**: pasa por `ImageCompressorService
75
75
 
76
76
  ### Usos de hoy que rompen la propuesta
77
77
 
78
- - **5 subtítulos prometen HEIC**: hasta el 03-10-2026 el componente lo rechazaba; con la versión
79
- nueva del DS ya pasa (ver Trampas por la vista previa en Chrome):
80
- `components/plan-change-modal/plan-change-modal.html:150`, `pages/driver/driver-wallet/driver-wallet.html:243`,
81
- `pages/promociones/promociones.html:185` y `:269`, `pages/customer/order-tracking/order-tracking.html:985`.
78
+ - **5 subtítulos prometen HEIC**: hasta el 03-10-2026 el componente lo rechazaba; desde la 0.22.0
79
+ (la que usa la app) ya lo acepta, así que **ya no rompen nada**. Lo que queda es la vista previa en
80
+ blanco en Chrome hasta que la pantalla ponga el JPG comprimido (ver Trampas):
81
+ `components/plan-change-modal/plan-change-modal.html:157`, `pages/driver/driver-wallet/driver-wallet.html:252`,
82
+ `pages/promociones/promociones.html:194` y `:279`, `pages/customer/order-tracking/order-tracking.html:985`.
82
83
  - **1 logo en círculo** → `rect`: `pages/business-onboarding/step-info/step-info.html:42` (en
83
- `mi-negocio.html:518` el mismo logo es `rect`, y en el home del cliente se ve cuadrado).
84
+ `mi-negocio.html:520` el mismo logo es `rect`, y en el home del cliente se ve cuadrado).
84
85
  - **3 imágenes en cuadrado que deberían ir `fluid`**: comprobantes en
85
86
  `components/plan-change-modal/plan-change-modal.html:150` y `pages/central/central-gastos/central-gastos.html:118`;
86
- la portada 16:9 en `pages/mi-negocio/mi-negocio.html:572` (en el onboarding ya va `fluid`).
87
+ la portada 16:9 en `pages/mi-negocio/mi-negocio.html:574` (en el onboarding ya va `fluid`).
87
88
  - **8 sin `editable`**: `components/avatar-editor/avatar-editor.ts:33` (pone `false` aunque tiene
88
- recortador), `pages/customer/order-tracking/order-tracking.html:985` (cliente, solo celular),
89
+ recortador), `pages/customer/order-tracking/order-tracking.html:978` (cliente, solo celular),
89
90
  `components/plan-change-modal/plan-change-modal.html:150`, `pages/central/central-gastos/central-gastos.html:118`,
90
- `pages/promociones/promociones.html:185` y `:269`, y `pages/business-onboarding/step-info/step-info.html:42` y `:56`.
91
+ `pages/promociones/promociones.html:186` y `:271`, y `pages/business-onboarding/step-info/step-info.html:42` y `:56`.
91
92
  - **2 áreas de subida armadas a mano** que van con este componente (`rect`, `fluid`, `editable`):
92
93
  `components/renewal-modal/renewal-modal.html:64` (comprobante, con SVG propio) y
93
94
  `pages/products/add-product/add-product.html:223` (foto del producto, con dropzone propia).
@@ -95,16 +96,22 @@ El archivo que entrega **no se sube tal cual**: pasa por `ImageCompressorService
95
96
 
96
97
  ## Tamaño en mobile y en web
97
98
 
98
- En mobile se toca con el dedo: lo que se toca mide **44 px o más**. El área vacía se toca entera
99
- (80 a 200 px), así que pasa; los botones con imagen, no. En pantallas de los dos se elige con el
100
- servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`).
99
+ En mobile se toca con el dedo: lo que se toca mide **44 px o más** (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono). El área vacía se
100
+ toca entera (80 a 200 px), así que pasa. Los botones con imagen se **ven** de 40 (lápiz y tacho) y
101
+ 32 («Quitar»), pero en el teléfono (≤ 767 px) **se tocan en 44 de alto** con un `::before`
102
+ invisible (04-10-2026). En pantallas de los dos se elige con el servicio de breakpoints de la app
103
+ (`bp`, en `services/breakpoints.service.ts`).
104
+
105
+ **Por qué no hay un size nuevo**: aquí `size` (`sm`/`md`/`lg`/`xl`) es el tamaño de la **foto**, no
106
+ el de los botones. Un `2xl` agrandaría la imagen sin que nadie lo pida; el área invisible lleva lo
107
+ que se toca a 44 sin cambiar el dibujo ni los sizes de hoy.
101
108
 
102
109
  | uso | mobile | web | fuente |
103
110
  |---|---|---|---|
104
111
  | comprobante, captura, QR, portada, banner | `fluid` | `fluid` (en una columna de ≤ 480 px) | propuesta |
105
112
  | logo, foto de producto, foto de perfil | `xl` (200) | `xl` (200), o `lg` (160) al lado del nombre | propuesta |
106
- | lápiz y tacho (`editable`) | 40 px (32 en `sm`) | 40 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
107
- | «Quitar» (sin `editable`) | 32 px (`sui-button` `xsmall`) | 32 px | canon (aprobado por el dueño, 03-10-2026) |
113
+ | lápiz y tacho (`editable`) | se ven de 40 (32 en `sm`), se tocan en 44 de alto; a los lados el área crece la mitad del espacio entre los dos (3; 2 en `sm`) para no pisarse | 40 px | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (área) · canon (aprobado por el dueño, 03-10-2026), extensión SUI (40) |
114
+ | «Quitar» (sin `editable`) | se ve de 32 (`sui-button` `xsmall`), se toca en 44 de alto: crece 4 hacia la foto (la mitad del gap de 8) y 8 hacia abajo | 32 px | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (área) · canon (aprobado por el dueño, 03-10-2026) |
108
115
 
109
116
  ```html
110
117
  <sui-image-upload shape="rect" [size]="bp.isMobile() ? 'xl' : 'lg'" [editable]="true"
@@ -116,7 +123,8 @@ servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`).
116
123
 
117
124
  Desde el 03-10-2026 el lápiz y el tacho miden **40** (antes 34; en `sm`, de 80 de lado, no entran dos
118
125
  de 40 y quedan en 32) y el «Quitar» es un `sui-button` `xsmall` de **32** (antes 28). En `circle`
119
- los dos botones van centrados abajo, dentro del círculo.
126
+ los dos botones van centrados abajo, dentro del círculo. Lo que haya justo debajo del «Quitar»
127
+ pierde 8 px de toque en el teléfono: no pegarle otro control sin margen.
120
128
 
121
129
  ## «No usar»: por qué no hoy y cuándo sí
122
130
 
@@ -169,7 +177,7 @@ recortador; se llama con una referencia: `#qr` → `qr.abrirSelector()`).
169
177
  (antes en voseo).
170
178
  - **El default de `shape` es `circle`** y el de `size` es `lg`: para un logo o un comprobante hay
171
179
  que pasar los dos.
172
- - **Con `fluid`, `size` no hace nada** (`promociones.html:185` pasa `size="lg"` y `fluid` a la vez).
180
+ - **Con `fluid`, `size` no hace nada** (`promociones.html:186` pasa `size="lg"` y `fluid` a la vez).
173
181
  - **`removed` ya vacía `src`** por dentro; quien lo usa solo limpia su `File` y su estado.
174
182
  - **Al elegir, pone la vista previa sola** (`src` = data URL) y emite el `File` original, sin
175
183
  comprimir ni recortar. Comprimir y recortar es trabajo de la pantalla.
@@ -178,6 +186,10 @@ recortador; se llama con una referencia: `#qr` → `qr.abrirSelector()`).
178
186
  - Con `circle` + `editable` los botones van centrados abajo, sobre la foto (antes, en la esquina, el
179
187
  círculo recortaba el tacho).
180
188
  - Con `src` puesto, tocar el área vacía no hace nada: para elegir otra va el lápiz o `abrirSelector()`.
189
+ - **Teclado (04-10-2026):** vacío, el host es el botón (`role="button"`, Enter/Espacio abren el
190
+ selector). Con imagen deja de serlo, porque adentro hay botones: sin `editable` la foto entera es
191
+ un `<button>` «Cambiar imagen» (antes un `div` que solo respondía al mouse) y «Quitar» va aparte;
192
+ con `editable`, el lápiz y el tacho.
181
193
  - El `alt` de la vista previa dice «Vista previa».
182
194
  - El atributo `title` del host se borra solo (no sale el tooltip gris del navegador).
183
195
  - Ya trae el arreglo de iOS para el `:active` pegado.
@@ -31,14 +31,14 @@ Regla corta: **un dato, en su lugar, que se corrige rápido → inline · varios
31
31
  > Todo lo de abajo es **propuesta, falta aprobación**.
32
32
  >
33
33
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Hay listas con campos siempre
34
- > abiertos que se parecen (`pages/super-admin/master-settings/master-settings.html:99`, nombre de
34
+ > abiertos que se parecen (`pages/super-admin/master-settings/master-settings.html:101`, nombre de
35
35
  > cada categoría del home), pero ahí se editan varias filas y se guarda todo junto: está bien con
36
36
  > `sui-input`.
37
37
 
38
38
  | prop / evento | cuándo | fuente |
39
39
  |---|---|---|
40
40
  | `value` | El dato. `[(value)]` o `formControlName`, nunca los dos. | API |
41
- | `placeholder` | Lo que se ve si está vacío: «Sin nombre». **Siempre**: el default es «Placeholder text...». | propuesta, falta aprobación |
41
+ | `placeholder` | Lo que se ve si está vacío: «Sin nombre». **Siempre**: el default genérico es «Escribe aquí…» (en español desde el 04-10-2026). | propuesta, falta aprobación |
42
42
  | `leftIcon` | Un ícono que dice qué dato es (`price-tag-3-line` para una categoría). `false` si el texto se explica solo. El default es `user-3-line`. | propuesta, falta aprobación |
43
43
  | `editLabel` | Nombre accesible del lápiz: «Editar nombre». | propuesta, falta aprobación |
44
44
  | `error` | El valor escrito no sirve (vacío, repetido). Solo se ve en edición; no trae mensaje. | propuesta, falta aprobación |
@@ -48,14 +48,15 @@ Regla corta: **un dato, en su lugar, que se corrige rápido → inline · varios
48
48
 
49
49
  ## Tamaño en mobile y en web
50
50
 
51
- **No tiene `size`**: mide 36 px de alto y sus botones (lápiz, ✓, ✕) son de 24 × 24. El texto ya
52
- sube a 16 px en mobile (sin zoom de iOS). **No tiene tamaño suficiente para mobile**: los botones
51
+ **No tiene `size`**: mide 38 px de alto (8 + 20 + 8 de padding y línea, más 1 + 1 de borde) y sus
52
+ botones (lápiz, ✓, ✕) son de 24 × 24 (ícono de 20 + 2 de padding). En edición el texto sube a 16 px
53
+ en mobile (sin zoom de iOS). **No tiene tamaño suficiente para mobile**: los botones
53
54
  de 24 px quedan lejos de los 44 que pide un dedo. Usarlo en el panel web; en el teléfono, editar
54
55
  con un `sui-input` `large`.
55
56
 
56
57
  | uso | mobile | web |
57
58
  |---|---|---|
58
- | renombrar en una lista | `sui-input` `large` en un modal | este, 36 px |
59
+ | renombrar en una lista | `sui-input` `large` en un modal | este, 38 px |
59
60
 
60
61
  ## «No usar»: por qué no hoy y cuándo sí
61
62
 
@@ -72,7 +73,7 @@ con un `sui-input` `large`.
72
73
  | input | tipo | default |
73
74
  |---|---|---|
74
75
  | `value` · model, `[(value)]` | `string` | `''` |
75
- | `placeholder` | `string` | `'Placeholder text...'` |
76
+ | `placeholder` | `string` | `'Escribe aquí…'` |
76
77
  | `leftIcon` | `string \| false` | `'user-3-line'` |
77
78
  | `error` | `boolean` | `false` |
78
79
  | `disabled` | `boolean` | `false` |
@@ -33,7 +33,7 @@ Regla corta: **dentro de una frase o al final de un campo → inline · campo
33
33
 
34
34
  | prop | cuándo | fuente |
35
35
  |---|---|---|
36
- | `type="icon"` (default) | Con un ícono delante (atenuado hasta que se elige). | según la guía del DS |
36
+ | `type="icon"` (default) | Con un ícono delante. Texto e ícono van atenuados (`text-sub-600`) salvo en hover, con foco o con el menú abierto. | según la guía del DS |
37
37
  | `type="country"` + `flag` | No usar hoy: todo es Perú. | según la guía del DS (ejemplo «Country») |
38
38
  | `items` | `{ value, label, sublabel?, icon?, flag?, disabled? }`. | API |
39
39
  | `selected` / `selectedChange` | La opción elegida. O `formControlName`, nunca los dos. | API |
@@ -48,10 +48,13 @@ es la palabra, muy por debajo de los 44 px. **No tiene tamaño suficiente para m
48
48
  teléfono, solo dentro de un `sui-input` (que da el alto) o con la frase en una fila que se toque
49
49
  entera.
50
50
 
51
- | uso | mobile | web |
52
- |---|---|---|
53
- | dentro de una frase | evitar: usar `sui-select` | 20 px, en línea con el texto |
54
- | al final de un `sui-input` | el alto lo da el input (`large`) | el alto lo da el input (`medium`) |
51
+ | uso | mobile | web | fuente |
52
+ |---|---|---|---|
53
+ | dentro de una frase | evitar: usar `sui-select` | 20 px, en línea con el texto | propuesta, falta aprobación |
54
+ | al final de un `sui-input` | el alto lo da el input (`large`) | el alto lo da el input (`medium`) | propuesta, falta aprobación |
55
+
56
+ Las opciones del menú miden **36 px también en mobile**: a diferencia de `sui-select` y de los
57
+ compactos, este no tiene la regla de 44 en ≤ 767 px (`sui-inline-select.scss` no la trae).
55
58
 
56
59
  ## «No usar»: por qué no hoy y cuándo sí
57
60
 
@@ -35,11 +35,11 @@ Regla corta: **una línea → input · varias → textarea · de una lista → s
35
35
  > fecha y contador) sin do/don't. Lo marcado «según la guía del DS» sale de esos ejemplos; el
36
36
  > resto es **propuesta, falta aprobación**, salvo lo que ya es canon (CLAUDE.md, CANON-SUI).
37
37
  >
38
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`, más
39
- > `master-ejercicios`): **194 usos en 61 archivos**. Tipos: 53 `text`, 36 sin `type` (`text`),
40
- > 32 `amount`, 22 `number`, 18 `tel`, 10 `email`, 10 `search`, 7 `date`, 3 `password`, 2 `url`,
41
- > 1 `datetime-local`. Tamaños: 163 sin `size` (`medium`), 18 `large`, 3 `xlarge`, 3 `medium`,
42
- > 2 `small`, 5 dinámicos.
38
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`, más
39
+ > `master-ejercicios`): **195 usos en 61 archivos**. Tipos: 42 `text`, 36 sin `type` (`text`),
40
+ > 34 `amount`, 21 `search`, 21 `number`, 18 `tel`, 10 `email`, 7 `date`, 3 `password-toggle`,
41
+ > 2 `url`, 1 `datetime-local`. Tamaños: 88 `bp.isMobile() ? 'large' : 'medium'`, 77 sin `size`
42
+ > (`medium`), 18 `large`, 3 `xlarge`, 3 `medium`, 1 `small`, 3 `bp.controlSize()`, 2 otros dinámicos.
43
43
 
44
44
  ### `type` — qué dato es
45
45
 
@@ -61,20 +61,9 @@ El `type` decide el teclado del teléfono y el filtro de teclas. Por dentro, `nu
61
61
  | `card` | No usar hoy: no hay pago con tarjeta. | según la guía del DS (ejemplo «Payment Input») |
62
62
  | `button` | No usar hoy: campo de solo lectura con una acción al lado (copiar enlace). | según la guía del DS (ejemplo «With Button») |
63
63
 
64
- **Usos de hoy que rompen la regla:**
65
-
66
- - **11 buscadores con `type="text"`** → `type="search"` (hoy no sale la lupa en el teclado):
67
- `pages/customers/customers.html:28`, `pages/products/products.html:71`,
68
- `components/map-picker-modal/map-picker-modal.html:14`, `pages/settings/team/team.html:59`,
69
- `pages/super-admin/super-admin.html:63`…
70
- - **21 `amount` sin `prefix="S/"`**, 15 de ellos con «(S/)» metido en el label:
71
- `pages/super-admin/master-settings/master-settings.html:273` («Mínimo (S/)»),
72
- `pages/business-onboarding/step-product/step-product.html:33` («Precio (S/)», placeholder «Ej: 25»),
73
- `pages/super-admin/master-drivers/master-drivers.html:99`.
74
- - **2 montos con `type="number"`** → `amount` + `prefix`: `pages/super-admin/super-admin.html:649`
75
- («Monto a cobrar»), `pages/super-admin/master-gastos/master-gastos.html:193` («Monto»).
76
- - **3 `password` sin ojo** → `password-toggle`: `pages/auth/login/login.html:71`,
77
- `pages/auth/register/register.html:121`, `:133`.
64
+ **Usos de hoy que rompen la regla:** ninguno (medido el 04-10-2026). Los 11 buscadores con
65
+ `type="text"`, los 21 `amount` sin `prefix="S/"`, los 2 montos con `type="number"` y los 3
66
+ `password` sin ojo se corrigieron en la app el 03-10-2026 (merge `70f937e4`).
78
67
 
79
68
  ### Las piezas
80
69
 
@@ -103,17 +92,11 @@ El `type` decide el teclado del teléfono y el filtro de teclas. Por dentro, `nu
103
92
  | `closeOnOutsideClick` | Déjalo en `true`: tocar fuera baja el teclado. `false` solo si la pantalla maneja el foco a mano (1 uso). | código del DS |
104
93
  | `leadingControl` / `trailingControl` / `leadingDivider` / `trailingDivider` | Componer un control adentro: el país del teléfono (`sui-compact-select-for-input` en `[data-slot=start]`) o una acción al lado. Hoy sin uso. | según la guía del DS (ejemplos «With Select» y «With Button») |
105
94
 
106
- **Usos de hoy que rompen la regla:**
107
-
108
- - **Los 24 `sublabel` de hoy van sin paréntesis** (input, textarea y select: 17 «Opcional», 4 «No editable», 2 «Máximo a descontar», 1 «Solo interno») y se leen pegados al label → «(Opcional)»:
109
- `components/address-form-modal/address-form-modal.html:134`, `pages/discounts/discounts.html:170`,
110
- `pages/customer/profile/profile.html:234`.
111
- - **16 «(opcional)» escritos en el label** (input, textarea y select juntos) → `sublabel="(Opcional)"`:
112
- `pages/driver/driver-profile/driver-profile.html:431` («Placa (opcional)»),
113
- `pages/super-admin/master-plans/master-plans.html:131`, `pages/super-admin/super-admin.html:661`.
114
- - **13 placeholders con `...`** (input, textarea y select) → `…`: `pages/customers/customers.html:28`
115
- («Buscar clientes...»), `pages/products/products.html:71`, `components/address-form-modal/address-form-modal.html:134`.
116
- - **2 campos sin label en el login** (el placeholder hace de rótulo): `pages/auth/login/login.html:64`, `:71`.
95
+ **Usos de hoy que rompen la regla** (medido el 04-10-2026; los `sublabel` sin paréntesis, los
96
+ «(opcional)» en el label y los placeholders con `...` ya se corrigieron en la app, commits
97
+ `ce4a2d12` y `e0470b34`):
98
+
99
+ - **2 campos sin label en el login** (el placeholder hace de rótulo): `pages/auth/login/login.html:64`, `:72`.
117
100
  - **6 campos con el label afuera** (`<sui-form-label>` suelto encima) en el onboarding del
118
101
  repartidor: `pages/driver-onboarding/step-info/step-info.html:37`. Funciona, pero el error y el
119
102
  `required` quedan desconectados del campo: va el `label` del propio input.
@@ -124,8 +107,10 @@ Los altos de `sui-input` son **los del botón a propósito** (`large` 48 y `xlar
124
107
  extensión de SUI): un campo y un botón puestos lado a lado miden lo mismo. La guía del DS solo
125
108
  tiene `medium` (40), `small` (36) y `xsmall` (32).
126
109
 
127
- En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el valor, el placeholder y el
128
- prefijo van en 16/24 también en desktop. En mobile cualquier tamaño ya iba en 16 (por el zoom de iOS).
110
+ En large y xlarge el texto sube a 16 px (canon, aprobado por el dueño el 03-10-2026): el valor, el placeholder y el
111
+ prefijo van en 16/24 también en desktop. En mobile el valor y el placeholder ya iban en 16 en
112
+ cualquier tamaño (por el zoom de iOS), y desde el 04-10-2026 el prefijo `S/` los acompaña: en el
113
+ teléfono también va en 16 en todos los tamaños (antes se quedaba en 14 al lado de un monto de 16).
129
114
 
130
115
  | uso | mobile | web | fuente |
131
116
  |---|---|---|---|
@@ -140,11 +125,12 @@ prefijo van en 16/24 también en desktop. En mobile cualquier tamaño ya iba en
140
125
  ```
141
126
 
142
127
  No uses `bp.controlSize()` en campos: da `xlarge` (52) en mobile, más alto que el botón `large`
143
- del footer (3 usos hoy, `pages/customer/checkout/checkout.html:392`). El texto sube solo a 16 px
128
+ del footer (3 usos hoy: `pages/customer/checkout/checkout.html:269`, `:384`,
129
+ `pages/super-admin/master-sonidos-push/master-sonidos-push.html:43`). El texto sube solo a 16 px
144
130
  en mobile (evita el zoom de iOS): no hace falta pedirlo.
145
131
 
146
- Hoy: **163 sin `size`** quedan en 40 px también en el teléfono (cumple el mínimo, no alinea con el
147
- botón `large`).
132
+ Hoy: **88 usos** ya van con `bp.isMobile() ? 'large' : 'medium'`; **77 sin `size`** quedan en 40 px
133
+ también en el teléfono (no alinea con el botón `large`).
148
134
 
149
135
  ## «No usar»: por qué no hoy y cuándo sí
150
136
 
@@ -229,6 +215,11 @@ proyectados con `leadingControl` / `trailingControl`).
229
215
  - Tocar fuera baja el teclado (`closeOnOutsideClick`). Ya distingue tocar otro campo: no hace falta
230
216
  agregar lógica de blur en la pantalla.
231
217
  - El `(keydown.enter)` puesto en el host funciona: el evento sube desde el `<input>` de adentro.
218
+ - **Accesibilidad (04-10-2026)**: cada campo trae su `id`; el `label` interno apunta a él con `for`,
219
+ el hint o el error se enlazan con `aria-describedby` y `error` pone `aria-invalid`. No hace
220
+ falta agregarlos a mano. Un `sui-form-label` puesto **afuera** no conoce ese `id`: usa `[label]`.
221
+ - En el teléfono la X de limpiar y el ojo se ven de 12-20 px pero se tocan en 44 × 44 (área
222
+ invisible, 04-10-2026).
232
223
 
233
224
  ## Ejemplo
234
225
 
@@ -63,20 +63,24 @@ Regla corta: **servicio externo que se prende y se configura → integration-swi
63
63
 
64
64
  ## Tamaño en mobile y en web
65
65
 
66
- No tiene `size`.
66
+ | size | «Administrar» | interruptor | fuente |
67
+ |---|---|---|---|
68
+ | `medium` (default) | 38 (8 + 20 + 8 de padding y 2 de borde), texto 14 | `sui-switch` `medium`, 32 × 20 | Figma |
69
+ | `large` | 44 (9 + 24 + 9 + 2), texto 16 | igual: 32 × 20 | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono. Size nuevo del 04-10-2026 |
67
70
 
68
71
  | uso | mobile | web |
69
72
  |---|---|---|
70
- | interruptor | **32 × 20 fijo: bajo el piso de mobile** | 32 × 20 |
71
- | «Administrar» | **36 de alto: bajo el piso de 44** | 36 |
73
+ | «Administrar» | `large` (44) | `medium` (38) |
72
74
  | layout | `vertical` | `horizontal` |
73
75
 
74
76
  ```html
75
- <sui-integration-switch [type]="bp.isMobile() ? 'vertical' : 'horizontal'" … />
77
+ <sui-integration-switch [size]="bp.isMobile() ? 'large' : 'medium'"
78
+ [type]="bp.isMobile() ? 'vertical' : 'horizontal'" … />
76
79
  ```
77
80
 
78
- **No llega al tamaño de mobile.** El switch es `sui-switch` `medium` fijo y el botón mide 36. Antes
79
- de usarlo en el teléfono hace falta un `size` en el DS (no se inventó aquí).
81
+ **El interruptor sigue bajo el piso**: es `sui-switch` `medium` fijo (20 de alto) en los dos sizes,
82
+ y a diferencia de `sui-switch-card`, tocar la tarjeta no prende nada: solo responde el
83
+ interruptor. Para algo que se prende y apaga en el teléfono, `sui-switch-card` es la salida.
80
84
 
81
85
  ## «No usar»: por qué no hoy y cuándo sí
82
86
 
@@ -94,6 +98,7 @@ de usarlo en el teléfono hace falta un `size` en el DS (no se inventó aquí).
94
98
  |---|---|---|
95
99
  | `type` | `'horizontal' \| 'vertical'` | `'horizontal'` |
96
100
  | `appearance` | `'card' \| 'list'` | `'card'` |
101
+ | `size` | `'medium' \| 'large'` | `'medium'` |
97
102
  | `title` | `string` | `''` |
98
103
  | `description` | `string \| null` | `null` |
99
104
  | `brandIconSrc` | `string \| null` | `null` |
@@ -123,10 +128,12 @@ Slot: `[sui-integration-brand]` (reemplaza al logo). Implementa `ControlValueAcc
123
128
  - **Es controlada**: `active` es input y `activeChange` solo avisa; sin actualizar tu señal el
124
129
  interruptor no se mueve.
125
130
  - El estado se llama `active`, no `checked` (como en `sui-switch-label`).
126
- - El interruptor no tiene `size`: siempre `medium`.
131
+ - El interruptor no cambia con `size`: siempre `sui-switch` `medium`. El `size` del componente (04-10-2026) solo agranda «Administrar».
127
132
  - En `vertical` el interruptor va arriba a la derecha y «Administrar» abajo a ancho completo.
128
133
  - `appearance="list"` no tiene borde ni fondo ni padding: va dentro de algo que los ponga.
129
134
  - El host borra el atributo `title` del DOM; el título se ve como texto, no como `aria-label`.
135
+ El interruptor toma su nombre de ese título (y su descripción de `description`) con
136
+ `aria-labelledby` (revisión 04-10-2026); antes el lector decía solo «interruptor».
130
137
 
131
138
  ## Ejemplo
132
139
 
@@ -46,10 +46,10 @@ Usos de hoy que rompen la regla: **0**.
46
46
 
47
47
  ## Tamaño en mobile y en web
48
48
 
49
- En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
50
- pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
51
- breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
52
- el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
49
+ No es táctil: es una tecla dibujada. En mobile no hay teclado físico, así que no se muestra; en
50
+ web tiene un solo tamaño. Donde la pantalla existe en los dos (panel del local, super admin) se
51
+ oculta con el servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`). Todo
52
+ es **propuesta**.
53
53
 
54
54
  | uso | mobile | web |
55
55
  |---|---|---|
@@ -12,7 +12,7 @@ Story: [Atoms/Icon/Key Icon](https://sui-design-system.web.app/?path=/docs/atoms
12
12
  ## Cuándo usarlo / cuándo no
13
13
 
14
14
  **Úsalo** cuando un ícono tiene que **anclar** algo: el inicio de una fila, la cabecera de un
15
- modal, el resultado de una acción («Cuenta bloqueada», «¡Gracias por calificar!»).
15
+ modal, el resultado de una acción («Cuenta bloqueada», «Gracias por calificar»).
16
16
 
17
17
  **No lo uses** para:
18
18
 
@@ -35,7 +35,11 @@ modal, el resultado de una acción («Cuenta bloqueada», «¡Gracias por califi
35
35
  | `lighter` | El ícono dice un estado: el color del fondo **es** el significado («Cuenta bloqueada» en rojo, «Calificación enviada» en verde). | propuesta |
36
36
  | `stroke` (default) | Ícono neutro al inicio de una fila, sobre fondo blanco. **Siempre con `color="gray"`.** | propuesta |
37
37
 
38
- ### `color` — mismo significado que el badge
38
+ ### `color` — mismo significado que el badge, salvo `teal`
39
+
40
+ Ojo: aquí `teal` pinta el token **verified** (celeste, `--sui-state-verified-*`), que en
41
+ `sui-badge` es `sky`; el `teal` del badge es **stable** (verde agua). La key-icon no tiene `sky`
42
+ ni un color para stable.
39
43
 
40
44
  | valor | estado de la paleta | cuándo | fuente |
41
45
  |---|---|---|---|