@ajuarezso/sui-design-system 0.24.1 → 0.25.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 (116) hide show
  1. package/docs/sui-accordion/README.md +4 -4
  2. package/docs/sui-activity-feed/README.md +11 -11
  3. package/docs/sui-activity-filter/README.md +5 -5
  4. package/docs/sui-app-store-badge/README.md +7 -7
  5. package/docs/sui-avatar/README.md +26 -23
  6. package/docs/sui-avatar-group/README.md +11 -7
  7. package/docs/sui-badge/README.md +7 -7
  8. package/docs/sui-banner/README.md +15 -15
  9. package/docs/sui-brand-logo/README.md +24 -23
  10. package/docs/sui-breadcrumb-item/README.md +3 -3
  11. package/docs/sui-breadcrumbs/README.md +6 -6
  12. package/docs/sui-button/README.md +9 -7
  13. package/docs/sui-button-group/README.md +25 -22
  14. package/docs/sui-button-group-item/README.md +16 -13
  15. package/docs/sui-card/README.md +8 -8
  16. package/docs/sui-chart-legend/README.md +10 -10
  17. package/docs/sui-chart-legend-dot/README.md +10 -10
  18. package/docs/sui-checkbox/README.md +4 -4
  19. package/docs/sui-checkbox-card/README.md +12 -12
  20. package/docs/sui-checkbox-label/README.md +3 -3
  21. package/docs/sui-circular-progress-bar/README.md +19 -16
  22. package/docs/sui-color-dot/README.md +13 -9
  23. package/docs/sui-color-picker/README.md +9 -9
  24. package/docs/sui-command-menu-footer/README.md +1 -1
  25. package/docs/sui-command-menu-item/README.md +13 -12
  26. package/docs/sui-command-menu-search/README.md +3 -2
  27. package/docs/sui-compact-avatar-group/README.md +14 -11
  28. package/docs/sui-compact-button/README.md +16 -11
  29. package/docs/sui-compact-select/README.md +5 -5
  30. package/docs/sui-compact-select-for-input/README.md +1 -1
  31. package/docs/sui-content-card/README.md +12 -12
  32. package/docs/sui-content-divider/README.md +18 -15
  33. package/docs/sui-content-label/README.md +17 -17
  34. package/docs/sui-counter-input/README.md +12 -12
  35. package/docs/sui-date-selector/README.md +8 -8
  36. package/docs/sui-datepicker/README.md +14 -14
  37. package/docs/sui-day-cell/README.md +15 -14
  38. package/docs/sui-day-label/README.md +4 -4
  39. package/docs/sui-divider/README.md +9 -6
  40. package/docs/sui-drawer-header/README.md +9 -9
  41. package/docs/sui-dropdown-caption/README.md +5 -5
  42. package/docs/sui-dropdown-item/README.md +5 -5
  43. package/docs/sui-dropdown-menu/README.md +10 -10
  44. package/docs/sui-dropdown-search/README.md +3 -3
  45. package/docs/sui-emoji/README.md +13 -13
  46. package/docs/sui-empty-state/README.md +4 -4
  47. package/docs/sui-fancy-button/README.md +15 -13
  48. package/docs/sui-file-icon/README.md +14 -11
  49. package/docs/sui-file-upload/README.md +10 -10
  50. package/docs/sui-file-upload-card/README.md +11 -10
  51. package/docs/sui-filter/README.md +12 -12
  52. package/docs/sui-flag/README.md +11 -7
  53. package/docs/sui-form-hint/README.md +2 -2
  54. package/docs/sui-form-label/README.md +4 -4
  55. package/docs/sui-icon/README.md +19 -16
  56. package/docs/sui-image-upload/README.md +20 -19
  57. package/docs/sui-image-upload-profile/README.md +12 -11
  58. package/docs/sui-img-retry/README.md +1 -1
  59. package/docs/sui-inline-input/README.md +6 -6
  60. package/docs/sui-inline-select/README.md +2 -2
  61. package/docs/sui-input/README.md +14 -14
  62. package/docs/sui-integration-switch/README.md +15 -15
  63. package/docs/sui-kbd/README.md +3 -3
  64. package/docs/sui-key-icon/README.md +22 -19
  65. package/docs/sui-link-button/README.md +21 -18
  66. package/docs/sui-logo/README.md +20 -19
  67. package/docs/sui-modal/README.md +11 -11
  68. package/docs/sui-modal-footer/README.md +3 -3
  69. package/docs/sui-modal-header/README.md +1 -1
  70. package/docs/sui-modal-sheet/README.md +4 -4
  71. package/docs/sui-notification/README.md +11 -11
  72. package/docs/sui-notification-footer/README.md +4 -4
  73. package/docs/sui-notification-tab-menu/README.md +4 -4
  74. package/docs/sui-otp-input/README.md +5 -5
  75. package/docs/sui-page-header/README.md +14 -12
  76. package/docs/sui-pagination/README.md +13 -13
  77. package/docs/sui-payment-icon/README.md +16 -13
  78. package/docs/sui-period-range/README.md +5 -5
  79. package/docs/sui-popover/README.md +10 -10
  80. package/docs/sui-product-card/README.md +15 -15
  81. package/docs/sui-progress-bar/README.md +12 -9
  82. package/docs/sui-progress-bar-label/README.md +14 -10
  83. package/docs/sui-radio/README.md +2 -2
  84. package/docs/sui-radio-card/README.md +12 -12
  85. package/docs/sui-radio-label/README.md +3 -3
  86. package/docs/sui-rating/README.md +22 -19
  87. package/docs/sui-rich-editor/README.md +2 -2
  88. package/docs/sui-segmented-control/README.md +9 -9
  89. package/docs/sui-select/README.md +9 -9
  90. package/docs/sui-sidebar/README.md +7 -7
  91. package/docs/sui-slider/README.md +7 -7
  92. package/docs/sui-social-button/README.md +8 -8
  93. package/docs/sui-status-badge/README.md +13 -10
  94. package/docs/sui-stepper/README.md +18 -18
  95. package/docs/sui-store-card/README.md +16 -16
  96. package/docs/sui-switch/README.md +2 -2
  97. package/docs/sui-switch-card/README.md +10 -10
  98. package/docs/sui-switch-label/README.md +1 -1
  99. package/docs/sui-tab-chips/README.md +17 -15
  100. package/docs/sui-tab-menu-horizontal/README.md +6 -6
  101. package/docs/sui-tab-menu-vertical/README.md +8 -8
  102. package/docs/sui-table/README.md +13 -13
  103. package/docs/sui-tag/README.md +14 -11
  104. package/docs/sui-tag-input/README.md +6 -6
  105. package/docs/sui-textarea/README.md +8 -8
  106. package/docs/sui-time-picker/README.md +25 -25
  107. package/docs/sui-toast/README.md +16 -15
  108. package/docs/sui-tooltip/README.md +19 -18
  109. package/docs/sui-topbar/README.md +7 -7
  110. package/docs/sui-topbar-button/README.md +4 -4
  111. package/docs/sui-topbar-item/README.md +7 -7
  112. package/docs/sui-topbar-user/README.md +5 -5
  113. package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
  114. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  115. package/package.json +1 -1
  116. package/types/ajuarezso-sui-design-system.d.ts +26 -22
@@ -23,7 +23,7 @@ de pago · Repartidores»), el perfil del super admin.
23
23
  - 2 a 4 secciones arriba del contenido: `sui-tab-menu-horizontal`.
24
24
  - Filtros de una lista: `sui-tab-chips`.
25
25
 
26
- Regla corta (propuesta, falta aprobación): **secciones de una página de ajustes en web → tab menu
26
+ Regla corta (canon, aprobado por el dueño, 05-10-2026, bloque B7): **secciones de una página de ajustes en web → tab menu
27
27
  vertical · en mobile → lista de filas que abren pantalla.**
28
28
 
29
29
  ## Qué variante usar
@@ -39,14 +39,14 @@ vertical · en mobile → lista de filas que abren pantalla.**
39
39
 
40
40
  | valor | cuándo | fuente |
41
41
  |---|---|---|
42
- | `card` | El menú flota junto al contenido sobre un fondo gris (`bg-weak-50`): el borde y la sombra lo separan. | según la guía del DS (ejemplo «contenedor con estilo»); el cuándo es propuesta |
43
- | `list` | El menú vive dentro de una columna que ya tiene fondo o borde propio (una card, un panel). | según la guía del DS (ejemplo base); el cuándo es propuesta |
42
+ | `card` | El menú flota junto al contenido sobre un fondo gris (`bg-weak-50`): el borde y la sombra lo separan. | según la guía del DS (ejemplo «contenedor con estilo»); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
43
+ | `list` | El menú vive dentro de una columna que ya tiene fondo o borde propio (una card, un panel). | según la guía del DS (ejemplo base); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
44
 
45
45
  ### `dividerLabel`
46
46
 
47
47
  | valor | cuándo | fuente |
48
48
  |---|---|---|
49
- | vacío (default) | Un solo grupo de secciones. | propuesta, falta aprobación |
49
+ | vacío (default) | Un solo grupo de secciones. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
50
50
  | texto | Nombra el grupo cuando hay más de un menú apilado («Tu local» · «Tu cuenta»). Sale en MAYÚSCULAS y gris. | según la guía del DS (ejemplo con título) |
51
51
 
52
52
  ### Ítems (`tabs`)
@@ -54,10 +54,10 @@ vertical · en mobile → lista de filas que abren pantalla.**
54
54
  | qué | cuándo | fuente |
55
55
  |---|---|---|
56
56
  | texto | El nombre de la sección. Una o dos palabras; si es más largo, se corta con «…». | según la guía del DS (ejemplos con texto) |
57
- | `icon` | Sí, en todos los ítems: en un menú lateral el ícono ayuda a encontrar rápido. El activo se pinta naranja. | propuesta, falta aprobación |
58
- | `number` | Pendientes que piden acción en esa sección (círculo rojo). | propuesta, falta aprobación |
57
+ | `icon` | Sí, en todos los ítems: en un menú lateral el ícono ayuda a encontrar rápido. El activo se pinta naranja. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
58
+ | `number` | Pendientes que piden acción en esa sección (círculo rojo). | canon (aprobado por el dueño, 05-10-2026, bloque B3) |
59
59
  | `rightIcon` | Cuando el ítem lleva a otra página en vez de cambiar el panel de al lado. | propuesta, falta aprobación |
60
- | `disabled` | Una sección que depende del plan. | propuesta, falta aprobación |
60
+ | `disabled` | Una sección que depende del plan. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
61
61
 
62
62
  Usos de hoy que rompen las reglas: **0** (no se usa).
63
63
 
@@ -68,7 +68,7 @@ Usos de hoy que rompen las reglas: **0** (no se usa).
68
68
 
69
69
  | uso | mobile | web | fuente |
70
70
  |---|---|---|---|
71
- | secciones de ajustes | no se usa: lista de filas que abren pantalla | `tab-menu-vertical` | propuesta, falta aprobación |
71
+ | secciones de ajustes | no se usa: lista de filas que abren pantalla | `tab-menu-vertical` | «no se usa en mobile»: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — el ítem mide 36 y no tiene `size` · la lista de filas en mobile y el uso en web: canon (aprobado por el dueño, 05-10-2026, bloque B7) |
72
72
 
73
73
  ```html
74
74
  @if (!bp.isMobile()) {
@@ -32,9 +32,9 @@ Regla corta: **comparar por columnas → tabla · leer de a uno → tarjetas ·
32
32
  > estructura de dos dimensiones donde cada fila es un ítem y cada columna un dato del ítem»,
33
33
  > muestra un solo ejemplo (un directorio de personas **con selección por checkbox**), le pone
34
34
  > `overflow-x-auto` al contenedor y deriva el orden, la selección y la paginación a una
35
- > librería externa. No trae do/don't, tamaños ni comportamiento en mobile. Casi todo lo de
36
- > abajo es **práctica de la app** o **propuesta, falta aprobación**; lo marcado «canon» sale de
37
- > `master-pedidos/CLAUDE.md` o de `docs/CANON-SUI.md`.
35
+ > librería externa. No trae do/don't, tamaños ni comportamiento en mobile. Lo de abajo es
36
+ > **práctica de la app**, **canon** (sale de `master-pedidos/CLAUDE.md`, de `docs/CANON-SUI.md` o lo
37
+ > aprobó el dueño el 05-10-2026) o **propuesta, falta aprobación**, que espera decisión.
38
38
  >
39
39
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **9 tablas** en 7 pantallas, sin contar
40
40
  > prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`,
@@ -55,9 +55,9 @@ Regla corta: **comparar por columnas → tabla · leer de a uno → tarjetas ·
55
55
  | prop de columna | cuándo | ejemplo real de la app | fuente |
56
56
  |---|---|---|---|
57
57
  | `priority: 'leading'` + `descriptionKey` | La **primera** columna: el dato que identifica la fila arriba (14/500) y un dato de apoyo debajo (12/400). Se usa en vez de una plantilla propia para la columna principal. | `pages/orders/orders.ts:278` (pedido + «hace 12 min») · `pages/super-admin/master-orders/master-orders.ts:390` | práctica de la app (7 de 9 tablas) |
58
- | `priority: 'passive'` | Datos de contexto que no deciden nada: fecha, número de comprobante. Se leen en gris (`text-sub-600`). | `pages/super-admin/master-overview/master-overview.ts:192` | propuesta, falta aprobación |
58
+ | `priority: 'passive'` | Datos de contexto que no deciden nada: fecha, número de comprobante. Se leen en gris (`text-sub-600`). | `pages/super-admin/master-overview/master-overview.ts:192` | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
59
59
  | `priority: 'none'` | Columna de acciones (íconos) sin texto propio. Con `label: ''` y `width` fijo. | `pages/super-admin/master-gastos/master-gastos.ts:143` | práctica de la app |
60
- | `align: 'right'` | Montos. Así se comparan en vertical. | `pages/central/central-gastos/central-gastos.ts:82` | propuesta, falta aprobación |
60
+ | `align: 'right'` | Montos. Así se comparan en vertical. | `pages/central/central-gastos/central-gastos.ts:82` | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
61
61
  | `width` | Columnas de largo fijo: monto, estado, fecha, acciones. | `central-gastos.ts:82-83` | práctica de la app |
62
62
  | `minWidth` | Columnas de texto que crecen (nombre, concepto): el piso para que no se aplasten. | `master-orders.ts:392` | práctica de la app |
63
63
  | `maxWidth` + `truncate` | Nombres que pueden ser muy largos: corta con «…» y el valor completo sale en tooltip. | `master-overview.ts:193` | práctica de la app |
@@ -72,10 +72,10 @@ Dentro va un componente SUI, no HTML a mano:
72
72
 
73
73
  | contenido | componente | fuente |
74
74
  |---|---|---|
75
- | estado o categoría | `<sui-badge variant="lighter" size="small">` | canon (CANON-SUI §0: «Chip de estado») |
76
- | acciones de la fila | `<sui-button variant="ghost" color="neutral" size="2xsmall" [onlyIcon]="true">` | canon (README de `sui-button`: tabla densa = `2xsmall`) |
75
+ | estado o categoría | `<sui-badge variant="lighter" size="medium">` | canon (dueño, 05-10-2026, D16); CANON-SUI §0 («Chip de estado») todavía dice `small`: hay que actualizarlo en master-pedidos |
76
+ | acciones de la fila | `<sui-button variant="ghost" color="neutral" size="medium" [onlyIcon]="true">` | canon (dueño, 05-10-2026, D16) (README de `sui-button`: en una tabla, `medium`; antes `2xsmall`) |
77
77
  | prender/apagar | `<sui-switch>` | propuesta, falta aprobación |
78
- | calificación | `<sui-rating>` de solo lectura | propuesta, falta aprobación |
78
+ | calificación | `<sui-rating>` de solo lectura | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
79
79
 
80
80
  Si la columna tiene plantilla, `descriptionKey` y `truncate` **no se aplican**: solo funcionan en
81
81
  el render de texto plano. Por eso `orders.html:94` deja la columna del pedido sin plantilla.
@@ -119,16 +119,16 @@ secundaria dentro de un tablero) y 6 sin `size` (o sea `medium`).
119
119
  |---|---|---|---|
120
120
  | tabla principal de una pantalla | `medium` | `medium` | práctica de la app |
121
121
  | tabla secundaria dentro de un tablero | `small` | `small` | práctica de la app (1 uso) |
122
- | filas con dos líneas y un badge | `medium` | `medium` | propuesta, falta aprobación |
122
+ | filas con dos líneas y un badge | `medium` | `medium` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
123
123
 
124
124
  El patrón `[size]="bp.isMobile() ? 'large' : 'medium'"` de los botones **no aplica aquí**: la fila
125
125
  ya mide 64 y el toque es sobre toda la fila. `large`/`xlarge` no tienen uso hoy.
126
126
 
127
127
  **Qué pasa en mobile (≤ 767 px):** la tabla scrollea en horizontal dentro de sí misma; la
128
128
  cabecera y el cuerpo miden lo mismo y la barra de scroll se oculta. En la app conviven dos
129
- salidas, y las dos son práctica, no regla:
129
+ salidas, y cuándo va cada una ya es regla:
130
130
 
131
- | salida | dónde | cuándo elegirla (propuesta) |
131
+ | salida | dónde | cuándo elegirla (canon (aprobado por el dueño, 05-10-2026, bloque B7)) |
132
132
  |---|---|---|
133
133
  | la misma tabla, con scroll lateral | `orders`, `master-orders`, `central-gastos`, `central-ingresos` | 3-4 columnas, y la primera (`leading`) ya dice casi todo |
134
134
  | tarjetas en grilla por debajo de 1350 px | `drivers` (`drivers.ts:282`), `master-gastos` | 6+ columnas: con el sidebar abierto no entran ni en laptop ni en iPad |
@@ -268,12 +268,12 @@ trabajo de la página.
268
268
  emptyMessage="Sin pedidos en este estado."
269
269
  (rowClicked)="abrirDetalle($event)">
270
270
  <ng-template suiTableCell="estado" let-row>
271
- <sui-badge [color]="row.color" variant="lighter" size="small">{{ row.estadoLabel }}</sui-badge>
271
+ <sui-badge [color]="row.color" variant="lighter" size="medium">{{ row.estadoLabel }}</sui-badge>
272
272
  </ng-template>
273
273
  </sui-table>
274
274
 
275
275
  @if (hayMas()) {
276
- <sui-button variant="stroke" color="neutral" [size]="bp.isMobile() ? 'large' : 'small'"
276
+ <sui-button variant="stroke" color="neutral" [size]="bp.isMobile() ? 'large' : 'medium'"
277
277
  [disabled]="cargandoMas()" (click)="cargarMas()">Cargar más</sui-button>
278
278
  }
279
279
  </sui-card>
@@ -35,7 +35,7 @@ tab-chips o segmented-control.**
35
35
  > **La guía del DS dice para qué es, no cuándo usar cada estilo.** Su página lo define como
36
36
  > «categorizar y etiquetar contenido» y muestra `stroke` (default), `gray`, deshabilitado, con
37
37
  > imagen, con avatar y con botón de quitar. No trae do/don't. Lo marcado «según la guía del DS»
38
- > sale de ahí; el resto es **propuesta, falta aprobación**.
38
+ > sale de ahí; lo marcado canon lo aprobó el dueño; el resto es **propuesta, falta aprobación** y espera decisión.
39
39
  >
40
40
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 tags**, sin contar prototipos ni
41
41
  > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
@@ -48,12 +48,12 @@ tab-chips o segmented-control.**
48
48
  | `tagStyle` | `stroke` (default) | Lo normal. Sirve sobre cualquier fondo (blanco o gris claro). | — | según la guía del DS (default) |
49
49
  | `tagStyle` | `gray` | Solo sobre blanco, cuando hay muchos tags juntos y el borde hace ruido. **Sobre gris claro desaparece.** | Varios filtros aplicados en fila | propuesta, falta aprobación |
50
50
  | `dismissible` | `true` | Lo que se nombra se puede quitar. Emite `(dismiss)`; la pantalla lo saca. | «Abierto ahora ✕» | según la guía del DS |
51
- | `dismissLabel` | texto | Siempre «Quitar» + el nombre: el lector de pantalla no ve el texto del tag desde la X. | `dismissLabel="Quitar Abierto ahora"` | propuesta, falta aprobación |
51
+ | `dismissLabel` | texto | Siempre «Quitar» + el nombre: el lector de pantalla no ve el texto del tag desde la X. | `dismissLabel="Quitar Abierto ahora"` | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
52
52
  | `leading` + `[data-slot=start]` | avatar | Nombra a una persona o un local. | «Burger House» con su logo | según la guía del DS (con avatar, con imagen) |
53
53
  | `leading` + `[data-slot=start]` | ícono de 16 | El ícono dice qué tipo de dato es. | «Andahuaylas» con un pin | según la guía del DS (`Tag.Icon`) |
54
54
  | `sublabel` | texto | Cuántos resultados trae ese filtro, entre paréntesis. | «Pollerías (12)» | propuesta, falta aprobación |
55
- | `disabled` | `true` | **No usar** hoy (ver abajo). | — | según la guía del DS (existe) · propuesta (cuándo) |
56
- | `interactive` | `true` | **No usar** hoy (ver abajo). | — | propuesta, falta aprobación |
55
+ | `disabled` | `true` | **No usar** hoy (ver abajo). | — | según la guía del DS (existe) · canon (aprobado por el dueño, 05-10-2026, bloque B6) (cuándo) |
56
+ | `interactive` | `true` | **No usar** hoy (ver abajo). | — | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
57
57
 
58
58
  Usos de hoy que rompen la regla: **0** (no hay usos).
59
59
 
@@ -67,10 +67,13 @@ Usos de hoy que rompen la regla: **0** (no hay usos).
67
67
 
68
68
  ## Tamaño en mobile y en web
69
69
 
70
- Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
71
- (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
72
- en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
73
- de la app.
70
+ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
71
+ «tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
72
+ 380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
73
+ computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
74
+ (< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
75
+ `xsmall`**, salvo lo que el componente solo tiene en chico. Hoy la app corta con
76
+ `BreakpointsService.isMobile()` (≤ 767 px), que todavía no mira el puntero ni los 380 px.
74
77
 
75
78
  | size | alto | texto | leading | X de quitar (área táctil) |
76
79
  |---|---|---|---|---|
@@ -94,9 +97,9 @@ máximo se sigue cortando, y la X queda siempre visible.
94
97
 
95
98
  | uso | mobile | web | fuente |
96
99
  |---|---|---|---|
97
- | Tag con X (filtro aplicado, elegido que se quita) | `xlarge` (40) | `medium` (24) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
98
- | Tag de solo lectura (sin X) | `large` (32) | `medium` (24) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
99
- | Separación entre tags | 8 px | 4–6 px | propuesta, falta aprobación |
100
+ | Tag con X (filtro aplicado, elegido que se quita) | `xlarge` (40) | `medium` (24) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — solo la X de `xlarge` llega a 44 · web: canon (dueño, 05-10-2026, D16) (`medium` es el más chico que tiene) |
101
+ | Tag de solo lectura (sin X) | `large` (32) | `medium` (24) | canon (dueño, 05-10-2026, P1 b); el tamaño es extensión SUI aprobada (03-10-2026) |
102
+ | Separación entre tags | 8 px | 4–6 px | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
100
103
 
101
104
  ```html
102
105
  <sui-tag [size]="bp.isMobile() ? 'xlarge' : 'medium'" [dismissible]="true" (dismiss)="quitar(f)">{{ f.nombre }}</sui-tag>
@@ -35,11 +35,11 @@ Regla corta: **varios valores libres → tag-input · varias opciones fijas →
35
35
  | prop / evento | cuándo | fuente |
36
36
  |---|---|---|
37
37
  | `label` · `required` · `sublabel` · `tooltip` · `hint` | Igual que `sui-input`. El hint dice cómo se agrega: «Escribe y presiona Enter». | según la guía del DS (ejemplo con label «Tag Input») |
38
- | `placeholder` | **Siempre** que el default genérico («Agrega una etiqueta…», 04-10-2026) no diga qué se agrega: «Agrega una palabra…». | propuesta, falta aprobación |
39
- | `commaSeparator` | `true` cuando la gente ya escribe con comas (rubros, sinónimos). | propuesta, falta aprobación |
40
- | `addOnBlur` | `true` en mobile: si sale del campo sin Enter, lo escrito no se pierde. | propuesta, falta aprobación |
41
- | `maxTags` | Cuando hay un tope real. Hoy no hay. | propuesta, falta aprobación |
42
- | `allowDuplicates` | `false` (default). | propuesta, falta aprobación |
38
+ | `placeholder` | **Siempre** que el default genérico («Agrega una etiqueta…», 04-10-2026) no diga qué se agrega: «Agrega una palabra…». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
39
+ | `commaSeparator` | `true` cuando la gente ya escribe con comas (rubros, sinónimos). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
40
+ | `addOnBlur` | `true` siempre, en mobile y en web: si sale del campo sin Enter, lo escrito no se pierde. | canon (aprobado por el dueño, 05-10-2026, bloque B13) |
41
+ | `maxTags` | Cuando hay un tope real. Hoy no hay. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
42
+ | `allowDuplicates` | `false` (default). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
43
43
  | `rightIcon` | No usar hoy (ícono de info a la derecha). | — |
44
44
  | `error` + `errorMessage` | Falta al menos un valor en un campo obligatorio. | según la guía del DS (estado de error del Figma) |
45
45
  | `disabled` | Mientras se guarda. | API |
@@ -79,7 +79,7 @@ en web; el alto sigue en 48/52.
79
79
  | `rightIcon` | el hint explica mejor | — |
80
80
  | `maxTags` | no hay topes | un máximo de 5 palabras clave por producto |
81
81
  | `allowDuplicates` | repetir no sirve | — |
82
- | `size` `xsmall` / `small` | no hay tag-inputs en tablas | un filtro denso del panel |
82
+ | `size` `xsmall` / `small` | son chicos (D16, 05-10-2026) | nunca: un filtro denso del panel también va `medium` |
83
83
 
84
84
  ## API
85
85
 
@@ -47,13 +47,13 @@ Regla corta: **se redacta y puede pasar de una línea → textarea · una línea
47
47
  | `hint` | Para quién es el texto: «Lo va a leer el cliente», «Solo lo ve tu equipo». | según la guía del DS (ejemplo con hint) |
48
48
  | `error` + `errorMessage` | Motivo obligatorio vacío. El mensaje reemplaza al hint y el contador se pone rojo. | según la guía del DS (`Has Error`) |
49
49
  | `placeholder` | Un ejemplo de lo que se espera: «Ej. frágil, tocar el timbre, entregar en recepción». Elipsis `…`. | canon (CANON-SUI §5.2) |
50
- | `maxLength` | **Siempre que otro lo va a leer** (cliente, repartidor, local) o se guarda en la base: muestra «n/200» y corta el exceso. 200 para motivos y notas; 500 para descripciones. | según la guía del DS (su ejemplo principal lleva contador); los topes son propuesta |
51
- | `size` | El mismo de los inputs del formulario: `large` en mobile, `medium` en web. Ver «Tamaño en mobile y en web». | canon (aprobado por el dueño, 03-10-2026), extensión SUI; el «cuándo» es propuesta, falta aprobación |
52
- | `rows` | `3` para motivos y notas (el default del componente es `4`). `2` para una nota corta en un formulario largo. `4` o más solo para una descripción larga. | propuesta, falta aprobación |
53
- | `resizable` | `true` en web. En mobile **`false`**: la manija no se puede arrastrar con el dedo y parece un adorno. | según la guía del DS (versión con y sin manija); el «cuándo» es propuesta |
54
- | `readonly` | Mostrar un texto ya enviado con la misma forma del campo (copiar un mensaje). | propuesta, falta aprobación |
50
+ | `maxLength` | **Siempre que otro lo va a leer** (cliente, repartidor, local) o se guarda en la base: muestra «n/200» y corta el exceso. 200 para motivos y notas; 500 para descripciones. | según la guía del DS (su ejemplo principal lleva contador); los topes: canon (aprobado por el dueño, 05-10-2026, bloque B9) |
51
+ | `size` | El mismo de los inputs del formulario: `large` en mobile, `medium` en web. Ver «Tamaño en mobile y en web». | canon (aprobado por el dueño, 03-10-2026), extensión SUI; el «cuándo»: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
52
+ | `rows` | `3` para motivos y notas (el default del componente es `4`). `2` para una nota corta en un formulario largo. `4` o más solo para una descripción larga. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
53
+ | `resizable` | `true` en web. En mobile **`false`**: la manija no se puede arrastrar con el dedo y parece un adorno. | según la guía del DS (versión con y sin manija); el «cuándo»: canon (aprobado por el dueño, 05-10-2026, bloque B8) |
54
+ | `readonly` | Mostrar un texto ya enviado con la misma forma del campo (copiar un mensaje). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
55
55
  | `disabled` | Mientras se envía. | según la guía del DS |
56
- | `autocomplete` | No hace falta: ningún texto libre se autocompleta. | propuesta, falta aprobación |
56
+ | `autocomplete` | No hace falta: ningún texto libre se autocompleta. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
57
57
 
58
58
  **Usos de hoy que rompen la regla** (medido el 04-10-2026; los `sublabel` sin paréntesis, los
59
59
  «(opcional)» en el label y los placeholders con `...` ya se corrigieron en la app, commits
@@ -90,8 +90,8 @@ también en web, así que cada fila mide 24 en las dos plataformas.
90
90
 
91
91
  | uso | mobile | web | fuente |
92
92
  |---|---|---|---|
93
- | motivo, nota | el `size` del formulario (`large` si los inputs van en `large`), `rows=3`, `[resizable]="false"` | `medium`, `rows=3`, manija | propuesta, falta aprobación |
94
- | descripción larga | igual, `rows=4` | `medium`, `rows=4` | propuesta, falta aprobación |
93
+ | motivo, nota | el `size` del formulario (`large` si los inputs van en `large`), `rows=3`, `[resizable]="false"` | `medium`, `rows=3`, manija | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
94
+ | descripción larga | igual, `rows=4` | `medium`, `rows=4` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
95
95
 
96
96
  ```html
97
97
  <sui-textarea [size]="bp.isMobile() ? 'large' : 'medium'" [rows]="3"
@@ -30,8 +30,8 @@ pocas horas → select.**
30
30
 
31
31
  ## Qué variante usar
32
32
 
33
- > **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
34
- > aprobación**, aunque ya sea práctica de la app.
33
+ > **La guía del DS no tiene página para este componente.** Las reglas marcadas canon
34
+ > están aprobadas; lo que sigue en **propuesta** espera decisión.
35
35
  >
36
36
  > Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas): **7 usos en
37
37
  > 4 pantallas** — horario del local (`weekly-schedule-editor`, 2), turnos del repartidor
@@ -43,25 +43,25 @@ pocas horas → select.**
43
43
 
44
44
  | valor | cuándo | fuente |
45
45
  |---|---|---|
46
- | `12h` (default) | Siempre: en Perú la hora se dice «9:30 PM». Los 7 usos lo llevan. | propuesta |
47
- | `24h` | No usar en la app. | propuesta |
46
+ | `12h` (default) | Siempre: en Perú la hora se dice «9:30 PM». Los 7 usos lo llevan. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
47
+ | `24h` | No usar en la app. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
48
48
 
49
49
  ### `step`
50
50
 
51
51
  | valor | cuándo | fuente |
52
52
  |---|---|---|
53
- | `5` (default) | Horas reales que la persona conoce al minuto: apertura y cierre del local, «cerrar hasta». Con saltos de 30 se redondeaban cierres reales (comentario en `weekly-schedule-editor.html:37`). | propuesta |
54
- | `30` | Bloques de un turno, que se planifican por media hora (`driver-schedule.html:140`). | propuesta |
55
- | `15` | Citas o reservas en cuartos de hora. Sin caso hoy. | propuesta |
56
- | `1` | No usar: 60 opciones en la columna para una precisión que nadie pide. | propuesta |
53
+ | `5` (default) | Horas reales que la persona conoce al minuto: apertura y cierre del local, «cerrar hasta». Con saltos de 30 se redondeaban cierres reales (comentario en `weekly-schedule-editor.html:37`). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
54
+ | `30` | Bloques de un turno, que se planifican por media hora (`driver-schedule.html:140`). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
55
+ | `15` | Citas o reservas en cuartos de hora. Sin caso hoy. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
56
+ | `1` | No usar: 60 opciones en la columna para una precisión que nadie pide. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
57
57
 
58
58
  ### `durationPresets`, `showFooter`, `inline`
59
59
 
60
60
  | input | valor | cuándo | fuente |
61
61
  |---|---|---|---|
62
- | `durationPresets` | `[]` (default desde el 04-10-2026) | **Siempre.** Los presets (15 min, 30 min, 45 min, 1 h) ponen la hora como «tiempo desde la medianoche»: «30 min» deja 12:30 AM. Por eso el default pasó a `[]`; los 7 usos de la app ya los apagaban. | propuesta |
63
- | `durationPresets` | lista propia | No usar mientras se lean como hora del día. | propuesta |
64
- | `showFooter` | `true` (default) | Cancelar/Aplicar: la hora no cambia hasta confirmar. Es lo correcto cuando la hora se guarda o publica algo (el horario del local). | propuesta |
62
+ | `durationPresets` | `[]` (default desde el 04-10-2026) | **Siempre.** Los presets (15 min, 30 min, 45 min, 1 h) ponen la hora como «tiempo desde la medianoche»: «30 min» deja 12:30 AM. Por eso el default pasó a `[]`; los 7 usos de la app ya los apagaban. | según el código |
63
+ | `durationPresets` | lista propia | No usar mientras se lean como hora del día. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
64
+ | `showFooter` | `true` (default) | Cancelar/Aplicar: la hora no cambia hasta confirmar. Es lo correcto cuando la hora se guarda o publica algo (el horario del local). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
65
65
  | `showFooter` | `false` | Se aplica al tocar cada columna. Solo dentro de un formulario que ya tiene su propio «Guardar». | propuesta |
66
66
  | `inline` | `true` | El panel es el contenido, dentro de un `sui-modal` (sin campo ni popover). | propuesta |
67
67
 
@@ -69,15 +69,15 @@ pocas horas → select.**
69
69
 
70
70
  | input | cuándo | fuente |
71
71
  |---|---|---|
72
- | `size="medium"` (40 px, default) | Web. En mobile va `large` (48), que existe desde el 03-10-2026 (ver «Tamaño»). | propuesta |
73
- | `size="small"` (36 px) | Filas densas en web. | propuesta |
74
- | `label` | Siempre, corto y en verbo o momento: «Abre», «Cierra», «Inicio», «Cerrar hasta». | propuesta |
75
- | `sublabel` / `tooltip` | «Opcional» o una aclaración que no entra en el label. | propuesta |
76
- | `hint` | Qué pasa con esa hora: «Se reabre sola a medianoche». | propuesta |
77
- | `error` + `errorMessage` | La hora no cuadra: «Cierra antes de abrir». | propuesta |
78
- | `required` | La hora es obligatoria para guardar. | propuesta |
79
- | `disabled` | Mientras se guarda (como hacen el horario y los turnos). | propuesta |
80
- | `placeholder` | Lo que se elige: «Hora de cierre». El default «Seleccionar hora» sirve. | propuesta |
72
+ | `size="medium"` (40 px, default) | Web. En mobile va `large` (48), que existe desde el 03-10-2026 (ver «Tamaño»). | mobile `large`: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — el campo `medium` mide 40 · web `medium`: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
73
+ | `size="small"` (36 px) | No usar: es chico. Las filas densas de web van en `medium`. | canon (dueño, 05-10-2026, D16) |
74
+ | `label` | Siempre, corto y en verbo o momento: «Abre», «Cierra», «Inicio», «Cerrar hasta». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
75
+ | `sublabel` / `tooltip` | «Opcional» o una aclaración que no entra en el label. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
76
+ | `hint` | Qué pasa con esa hora: «Se reabre sola a medianoche». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
77
+ | `error` + `errorMessage` | La hora no cuadra: «Cierra antes de abrir». | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
78
+ | `required` | La hora es obligatoria para guardar. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
79
+ | `disabled` | Mientras se guarda (como hacen el horario y los turnos). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
80
+ | `placeholder` | El default «Elige una hora» sirve. Si hace falta decir qué hora, en imperativo con tuteo: «Elige la hora de cierre». | canon (dueño, 05-10-2026, P4 a); el default cambió en la 0.25.0 (antes «Seleccionar hora») |
81
81
 
82
82
  Usos de hoy que rompen la regla: los 7 cumplen `12h`, `durationPresets=[]` y `label`, pero **los 7
83
83
  van con `size="medium"` fijo**, también en pantallas del teléfono (turnos y votaciones del
@@ -88,9 +88,9 @@ repartidor): campo de 40, contra el `large` de la tabla de «Tamaño». Cancelar
88
88
 
89
89
  | pieza | qué es | cuándo suelta | fuente |
90
90
  |---|---|---|---|
91
- | `sui-time-picker-item` | una fila de la columna (36 px) | No usar: para filas de horario que se tocan con el pulgar va `sui-radio-label` (`checkout.html:469`). | propuesta |
92
- | `sui-time-picker-duration` | la pastilla de un preset | No usar: es la de los presets de duración. | propuesta |
93
- | `sui-time-picker-status` | pastilla Disponible/Ocupado/En reunión/Desconectado | No usar: el estado del repartidor ya tiene su badge. | propuesta |
91
+ | `sui-time-picker-item` | una fila de la columna (36 px) | No usar: para filas de horario que se tocan con el pulgar va `sui-radio-label` (`checkout.html:469`). | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
92
+ | `sui-time-picker-duration` | la pastilla de un preset | No usar: es la de los presets de duración. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
93
+ | `sui-time-picker-status` | pastilla Disponible/Ocupado/En reunión/Desconectado | No usar: el estado del repartidor ya tiene su badge. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
94
94
 
95
95
  ## Tamaño en mobile y en web
96
96
 
@@ -116,7 +116,7 @@ campo y la de las filas van en 16/24; la fila sigue en 44 (el padding bajó de 1
116
116
 
117
117
  | uso | mobile | web | fuente |
118
118
  |---|---|---|---|
119
- | horario en un formulario | `large` (48) o `xlarge` (52) si va junto a campos xlarge | `medium`, o `small` en filas densas | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: propuesta, falta aprobación |
119
+ | horario en un formulario | `large` (48) o `xlarge` (52) si va junto a campos xlarge | `medium`, también en filas densas | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web `medium`: canon (aprobado por el dueño, 05-10-2026, bloque B1) · también en filas densas, nunca `small`: canon (dueño, 05-10-2026, D16) |
120
120
 
121
121
  ```html
122
122
  <sui-time-picker label="Cierra" format="12h" [step]="5" [durationPresets]="[]"
@@ -154,7 +154,7 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
154
154
  | `hint` | `string \| null` | `null` |
155
155
  | `errorMessage` | `string \| null` | `null` |
156
156
  | `error` | `boolean` | `false` |
157
- | `placeholder` | `string` | `'Seleccionar hora'` |
157
+ | `placeholder` | `string` | `'Elige una hora'` |
158
158
  | `disabled` | `boolean` | `false` |
159
159
  | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
160
160
  | `format` | `'12h' \| '24h'` | `'12h'` |
@@ -37,7 +37,8 @@ toast · bandeja → notification.**
37
37
 
38
38
  > La guía del DS define el toast pero no dice cuándo va cada tipo. Lo marcado «según la guía del
39
39
  > DS» sale de su texto o de su código publicado; «canon» es lo ya aprobado (README de `sui-alert`,
40
- > `docs/CANON-SUI.md` o un pedido del dueño escrito en el código); el resto es **propuesta**.
40
+ > `docs/CANON-SUI.md`, un pedido del dueño escrito en el código o su aprobación del 05-10-2026); lo que
41
+ > quede en **propuesta** espera decisión.
41
42
  >
42
43
  > Uso medido el 04-10-2026 en `master-pedidos/src/app` (sin prototipos, vitrinas ni tests):
43
44
  > **705 llamadas en 108 archivos**, todas con el `SuiToastService` de la copia local. El desglose
@@ -58,11 +59,11 @@ toast · bandeja → notification.**
58
59
 
59
60
  | método | cuándo | ejemplo real de la app | fuente |
60
61
  |---|---|---|---|
61
- | `success()` | La acción salió como se esperaba. Dice **qué** quedó hecho. | `pages/sales-channels/instagram/instagram.ts:102` («Cambios guardados») | propuesta (sigue la regla canon del alert) |
62
+ | `success()` | La acción salió como se esperaba. Dice **qué** quedó hecho. | `pages/sales-channels/instagram/instagram.ts:102` («Cambios guardados») | canon (aprobado por el dueño, 05-10-2026, bloque B2; sigue la regla canon del alert) |
62
63
  | `error()` | La acción **no** salió. Dice qué no se pudo, nunca «Error al…» ni el mensaje técnico. | `pages/driver/driver-profile/driver-profile.ts:516` («No se pudo guardar el vehículo») | canon (copy: `docs/CANON-SUI.md` §5.7) |
63
- | `warning()` | Salió, **pero** con un pero que la persona tiene que saber. | `pages/super-admin/master-promos/master-promos.ts:171` («Push enviada, pero ningún cliente está dentro del radio») | propuesta |
64
- | `info()` | Algo que **llega** y no es el resultado de lo que hiciste: un push con la app abierta, una versión nueva. | `core/services/aviso-unico.service.ts:52` · `core/services/update.service.ts:59` | propuesta |
65
- | `feature()` | No usar hoy (0 usos). **Cuándo sí:** avisar una función nueva en el momento en que se activa («Ya puedes programar tus pedidos»). | — | propuesta |
64
+ | `warning()` | Salió, **pero** con un pero que la persona tiene que saber. | `pages/super-admin/master-promos/master-promos.ts:171` («Push enviada, pero ningún cliente está dentro del radio») | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
65
+ | `info()` | Algo que **llega** y no es el resultado de lo que hiciste: un push con la app abierta, una versión nueva. | `core/services/aviso-unico.service.ts:52` · `core/services/update.service.ts:59` | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
66
+ | `feature()` | No usar hoy (0 usos). **Cuándo sí:** avisar una función nueva en el momento en que se activa («Ya puedes programar tus pedidos»). | — | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
66
67
  | `show({ variant })` | Lo mismo que los de arriba, cuando hace falta pasar todo junto. | `pages/empresa/about/about.ts:103` | según el componente |
67
68
 
68
69
  ### `style` — el relleno
@@ -70,25 +71,25 @@ toast · bandeja → notification.**
70
71
  | style | cuándo | fuente |
71
72
  |---|---|---|
72
73
  | `stroke-dark` (default SUI) | **Siempre.** Flota sobre cualquier pantalla y el oscuro contrasta con todas. | canon (README de `sui-alert`: «default del toast») |
73
- | `stroke` (default de la guía) | No usar hoy: blanco sobre blanco se confunde con el contenido. **Cuándo sí:** una pantalla de fondo oscuro (una landing), donde el oscuro se pierde. | propuesta |
74
- | `lighter` · `light` · `filled` | No usar hoy: un toast que pesa más que el oscuro compite con el botón principal, y si tiene que pesar más, no es un toast. **Cuándo sí:** ninguno previsto; ese caso es un alert o un modal. | propuesta |
74
+ | `stroke` (default de la guía) | No usar hoy: blanco sobre blanco se confunde con el contenido. **Cuándo sí:** una pantalla de fondo oscuro (una landing), donde el oscuro se pierde. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
75
+ | `lighter` · `light` · `filled` | No usar hoy: un toast que pesa más que el oscuro compite con el botón principal, y si tiene que pesar más, no es un toast. **Cuándo sí:** ninguno previsto; ese caso es un alert o un modal. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
75
76
 
76
77
  ### Tiempo, cierre, acción y texto
77
78
 
78
79
  | opción | valor | cuándo | fuente |
79
80
  |---|---|---|---|
80
81
  | `duration` | `4000` (default) | Un título corto. | según el componente (valor de Sonner) |
81
- | `duration` | `6000` | Título más `description`, o un título largo que no se alcanza a leer en 4 s. | propuesta |
82
+ | `duration` | `6000` | Título más `description`, o un título largo que no se alcanza a leer en 4 s. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
82
83
  | `duration` | `60_000` | Los avisos de un pedido que llegan con la app abierta: tiempo de verlos sin quedarse tapando. | canon (pedido del dueño, 28-09-2026, en `aviso-unico.service.ts`) |
83
- | `duration` | `Infinity` | **Solo con `action`**: hay algo que hacer y no se puede perder («Actualizar»). Sin acción, es un alert. | propuesta |
84
+ | `duration` | `Infinity` | **Solo con `action`**: hay algo que hacer y no se puede perder («Actualizar»). Sin acción, es un alert. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
84
85
  | `dismissible` | `true` (default) | Siempre: la X permite quitarlo antes. La guía lo trae cerrable por defecto. | según la guía del DS |
85
- | `dismissible` | `false` | No usar hoy. **Cuándo sí:** un toast de progreso que se reemplaza solo usando el mismo `id` («Subiendo foto…» → «Foto subida»). | propuesta (la guía muestra un ejemplo no cerrable) |
86
- | `action` | `{ label, onClick, keepOpen? }` | **Una** acción corta que resuelve ahí mismo: «Actualizar», «Deshacer», «Reintentar». Se dibuja como link subrayado. | propuesta |
86
+ | `dismissible` | `false` | No usar hoy. **Cuándo sí:** un toast de progreso que se reemplaza solo usando el mismo `id` («Subiendo foto…» → «Foto subida»). | canon (aprobado por el dueño, 05-10-2026, bloque B6; la guía muestra un ejemplo no cerrable) |
87
+ | `action` | `{ label, onClick, keepOpen? }` | **Una** acción corta que resuelve ahí mismo: «Actualizar», «Deshacer», «Reintentar». Se dibuja como link subrayado. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
87
88
  | `title` | frase corta | Qué pasó, en sentence case, **sin punto final**. Una idea. | canon (copy de la app) |
88
- | `description` | segunda frase | Si hace falta una segunda frase, va aquí y no pegada al título con un punto. | propuesta |
89
- | `position` | `bottom-right` (default) | Siempre. En mobile toda posición pasa a ancho completo; las `bottom-*` quedan abajo, por encima de la barra inferior. | propuesta |
90
- | `position` | `top-*` | No usar hoy. **Cuándo sí:** una pantalla con una barra de acción fija abajo que el toast taparía. | propuesta |
91
- | `position` | `bottom-left` · `bottom-center` | No usar hoy: dos esquinas abren dos pilas. **Cuándo sí:** si se decide cambiar la esquina de toda la app, con `setDefaultPosition()`, una sola vez. | propuesta |
89
+ | `description` | segunda frase | Si hace falta una segunda frase, va aquí y no pegada al título con un punto. | canon (CLAUDE.md «Canon de UI» → `docs/VOZ-Y-ESCRITURA.md` «Toasts: la regla completa»: dos frases nunca en el título; D10) |
90
+ | `position` | `bottom-right` (default) | Siempre. En mobile toda posición pasa a ancho completo; las `bottom-*` quedan abajo, por encima de la barra inferior. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
91
+ | `position` | `top-*` | No usar hoy. **Cuándo sí:** una pantalla con una barra de acción fija abajo que el toast taparía. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
92
+ | `position` | `bottom-left` · `bottom-center` | No usar hoy: dos esquinas abren dos pilas. **Cuándo sí:** si se decide cambiar la esquina de toda la app, con `setDefaultPosition()`, una sola vez. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
92
93
  | `id` | texto | Para reemplazar un toast en curso o no repetir el mismo aviso. | según el componente |
93
94
 
94
95
  ### Usos de hoy que rompen la regla
@@ -32,7 +32,8 @@ servicio»). Es un extra: la pantalla tiene que entenderse sin él.
32
32
  ## Qué variante usar
33
33
 
34
34
  > La guía del DS dice para qué es y cómo se llaman sus tamaños, pero no cuándo va cada uno. Lo
35
- > marcado «según la guía del DS» sale de su texto o su código publicado; el resto es **propuesta**.
35
+ > marcado «según la guía del DS» sale de su texto o su código publicado; lo marcado canon lo aprobó
36
+ > el dueño (05-10-2026); lo que sigue en **propuesta** espera decisión.
36
37
  >
37
38
  > Uso medido el 04-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas): **0 tooltips**.
38
39
  > Los 6 que había el 03-10-2026 (2 `suiTooltip` sobre un `<svg>` en el panel del local y 4
@@ -51,18 +52,18 @@ servicio»). Es un extra: la pantalla tiene que entenderse sin él.
51
52
 
52
53
  | SUI | guía | qué es | cuándo | fuente |
53
54
  |---|---|---|---|---|
54
- | `small` (caja de 20 px en `dark`, 22 en `light` por el borde; 24 con la flecha; texto 12) | `xsmall` | texto de una línea, chico | El nombre de un ícono en una tabla o barra densa. | escala según la guía del DS · cuándo: propuesta |
55
- | `medium` (caja de 28 px en `dark`, 30 en `light`; 34 con la flecha; texto 14) — default SUI | `small` (default de la guía) | texto de una línea | Lo normal: una frase corta que explica. | escala según la guía del DS · cuándo: propuesta |
56
- | `large` (280 px, título + descripción + ícono) | `medium` | contenido rico | Explicar un término con título y una o dos frases. Se activa solo al usar `[suiTooltipLarge]`. | escala según la guía del DS · cuándo: propuesta |
55
+ | `small` (caja de 20 px en `dark`, 22 en `light` por el borde; 24 con la flecha; texto 12) | `xsmall` | texto de una línea, chico | No usar: es chico. El nombre de un ícono también va en `medium`. | escala según la guía del DS · no usarlo: canon (dueño, 05-10-2026, D16), reemplaza el «cuándo» del bloque B1 |
56
+ | `medium` (caja de 28 px en `dark`, 30 en `light`; 34 con la flecha; texto 14) — default SUI | `small` (default de la guía) | texto de una línea | Lo normal: una frase corta que explica, o el nombre de un ícono. | escala según la guía del DS · cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B1) · el nombre de un ícono: canon (dueño, 05-10-2026, D16) |
57
+ | `large` (280 px, título + descripción + ícono) | `medium` | contenido rico | Explicar un término con título y una o dos frases. Se activa solo al usar `[suiTooltipLarge]`. | escala según la guía del DS · cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
57
58
  | `xlarge` (320 px) | — | rico, más ancho | No usar hoy. Extensión de SUI. **Cuándo sí:** una explicación rica que en 280 px queda en más de cuatro líneas. | propuesta |
58
59
 
59
60
  ### Contenido: `suiTooltip` o `suiTooltipLarge`
60
61
 
61
62
  | input | cuándo | ejemplo real de la app | fuente |
62
63
  |---|---|---|---|
63
- | `suiTooltip="…"` | Una frase, sin punto final. | (sin uso hoy) | propuesta |
64
- | `[suiTooltipLarge]="{ title, description, icon }"` | Un término que necesita título y explicación. | (sin uso hoy) | propuesta |
65
- | `suiTooltipLarge.dismissible: true` | No usar hoy: lo deja abierto hasta tocar la X o Escape, que es lo que hace un popover. **Cuándo sí:** en web, una explicación larga que la persona lee con calma mientras mueve el mouse. | (sin uso hoy) | propuesta |
64
+ | `suiTooltip="…"` | Una frase, sin punto final. | (sin uso hoy) | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
65
+ | `[suiTooltipLarge]="{ title, description, icon }"` | Un término que necesita título y explicación. | (sin uso hoy) | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
66
+ | `suiTooltipLarge.dismissible: true` | No usar hoy: lo deja abierto hasta tocar la X o Escape, que es lo que hace un popover. **Cuándo sí:** en web, una explicación larga que la persona lee con calma mientras mueve el mouse. | (sin uso hoy) | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
66
67
 
67
68
  ### `theme`, `position` y el resto
68
69
 
@@ -71,14 +72,14 @@ servicio»). Es un extra: la pantalla tiene que entenderse sin él.
71
72
  | `theme` | `auto` | **Siempre.** Oscuro sobre la app en claro (lo que pide la guía) y claro sobre la app en oscuro. | propuesta (la guía: `dark` por default) |
72
73
  | `theme` | `dark` | Igual que `auto` en modo claro, pero no se invierte en modo oscuro. | según la guía del DS (default) |
73
74
  | `theme` | `light` (default SUI) | No usar hoy: sobre una página clara parece una card más. **Cuándo sí:** ya lo da `auto` en modo oscuro. | propuesta |
74
- | `position` | `top` (default) | Siempre que haya espacio. Si no lo hay, el CDK lo da vuelta solo. | propuesta |
75
- | `position` | `right` · `left` | Íconos de una barra lateral angosta (el sidebar colapsado). | propuesta |
76
- | `position` | `bottom` · `*-start` · `*-end` | Un elemento pegado al borde de arriba o a un costado de la pantalla. | propuesta |
77
- | `delay` | `200` (default) | Siempre: evita que se abra al cruzar con el mouse. | propuesta |
78
- | `delay` | otro valor | No usar hoy. **Cuándo sí:** ninguno previsto. | propuesta |
79
- | `disabled` | `true` | Cuando lo que dice ya está a la vista (el sidebar expandido muestra el nombre). | propuesta |
75
+ | `position` | `top` (default) | Siempre que haya espacio. Si no lo hay, el CDK lo da vuelta solo. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
76
+ | `position` | `right` · `left` | Íconos de una barra lateral angosta (el sidebar colapsado). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
77
+ | `position` | `bottom` · `*-start` · `*-end` | Un elemento pegado al borde de arriba o a un costado de la pantalla. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
78
+ | `delay` | `200` (default) | Siempre: evita que se abra al cruzar con el mouse. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
79
+ | `delay` | otro valor | No usar hoy. **Cuándo sí:** ninguno previsto. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
80
+ | `disabled` | `true` | Cuando lo que dice ya está a la vista (el sidebar expandido muestra el nombre). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
80
81
  | `showArrow` | `true` (default) | Siempre: la flecha dice de qué elemento habla. | según la guía del DS |
81
- | `showArrow` | `false` | No usar hoy. **Cuándo sí:** sobre un punto de un gráfico, donde la flecha tapa el dato. | propuesta |
82
+ | `showArrow` | `false` | No usar hoy. **Cuándo sí:** sobre un punto de un gráfico, donde la flecha tapa el dato. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
82
83
 
83
84
  ### Usos de hoy que rompen la regla
84
85
 
@@ -91,9 +92,9 @@ dos `<svg>` con tooltip del panel del local pasaron a subtítulo
91
92
 
92
93
  | uso | mobile | web | fuente |
93
94
  |---|---|---|---|
94
- | nombre de un ícono | no aplica: el ícono lleva el nombre escrito o `aria-label` | `small` | propuesta |
95
- | frase que explica | no aplica: el texto va visible bajo el dato (`sui-form-hint`) | `medium` | propuesta |
96
- | explicación con título | no aplica: `sui-modal-sheet` al tocar el ícono | `large` (automático con `[suiTooltipLarge]`) | propuesta |
95
+ | nombre de un ícono | no aplica: el ícono lleva el nombre escrito o `aria-label` | `medium` | mobile: canon (aprobado por el dueño, 05-10-2026, bloque B7) · web: canon (dueño, 05-10-2026, D16), antes `small` |
96
+ | frase que explica | no aplica: el texto va visible bajo el dato (`sui-form-hint`) | `medium` | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
97
+ | explicación con título | no aplica: `sui-modal-sheet` al tocar el ícono | `large` (automático con `[suiTooltipLarge]`) | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
97
98
 
98
99
  En pantallas que se usan en los dos (panel del local, super admin), el tooltip se apaga en mobile
99
100
  y la ayuda se muestra de otra forma:
@@ -171,7 +172,7 @@ no se usa directo en pantallas.
171
172
  ## Trampas
172
173
 
173
174
  - **El tamaño se pasa como `suiTooltipSize`**, no como `size`: así no choca con el `size` del
174
- componente que lo lleva (`<sui-button size="small" suiTooltip="…">`).
175
+ componente que lo lleva (`<sui-button size="medium" suiTooltip="…">`).
175
176
  - **`position`, `theme`, `delay` y `disabled` sí se llaman así, sin prefijo**: si el host es un
176
177
  componente con un input del mismo nombre (`disabled` de `sui-button`), el valor llega a los dos.
177
178
  - **`suiTooltipSize="large"` con `suiTooltip` de texto dibuja una caja vacía**: el tamaño rico solo
@@ -30,20 +30,20 @@ navegada por arriba → topbar.**
30
30
 
31
31
  > **La guía del DS no tiene página de la topbar.** El componente sale del Figma de SUI (Topbar
32
32
  > [Navigation], frame 3814:25274, cuatro ejemplos: con y sin íconos, con buscador abierto o en
33
- > botón). Sin uso en la app, **todo lo de abajo es propuesta, falta aprobación**, salvo lo que el
34
- > componente ya fija.
33
+ > botón). Sin uso en la app. Las reglas marcadas canon están aprobadas (05-10-2026) y no queda
34
+ > ninguna en propuesta; lo marcado «Figma» lo fija el componente.
35
35
  >
36
36
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: `sui-topbar`, `sui-topbar-item` y
37
37
  > `sui-topbar-user` tienen 0 usos; `sui-topbar-button`, 1 en la vitrina de variantes.
38
38
 
39
39
  | decisión | opción | cuándo | fuente |
40
40
  |---|---|---|---|
41
- | items | sin `icon` | El caso normal: 3-6 secciones con nombre corto. | propuesta, falta aprobación |
42
- | items | con `icon` | Si **todos** llevan ícono. Mezclar con y sin se lee desordenado. | propuesta, falta aprobación |
43
- | item con `rightIcon: 'arrow-down-s-line'` | — | Un «Más ⌄» que abre un menú. El menú lo pones tú (`sui-dropdown-menu`) al escuchar `(itemClicked)`. | propuesta, falta aprobación |
41
+ | items | sin `icon` | El caso normal: 3-6 secciones con nombre corto. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
42
+ | items | con `icon` | Si **todos** llevan ícono. Mezclar con y sin se lee desordenado. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
43
+ | item con `rightIcon: 'arrow-down-s-line'` | — | Un «Más ⌄» que abre un menú. El menú lo pones tú (`sui-dropdown-menu`) al escuchar `(itemClicked)`. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
44
44
  | `search` | objeto con `placeholder` | Buscador abierto de 232 px cuando buscar es la acción principal. | Figma (Type=Default) |
45
45
  | `search` | `{ compact: true }` | Ícono de lupa en la zona de acciones; tú abres el buscador real (`sui-modal` o una paleta de comandos) en `(searchClicked)`. | Figma (Type=With Icon) |
46
- | `actions` | 1-3 íconos | Avisos, ayuda, acciones rápidas. `dot: true` = hay algo nuevo. | propuesta, falta aprobación |
46
+ | `actions` | 1-3 íconos | Avisos, ayuda, acciones rápidas. `dot: true` = hay algo nuevo. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
47
47
  | `user` | config | El chip abre el menú de la cuenta: pásale `[userOpen]` mientras el menú está abierto. | Figma |
48
48
  | `accent` | `brand` (default) | Siempre. `information` es el azul del Figma original. | canon del DS (accent = marca) |
49
49
 
@@ -55,7 +55,7 @@ oculto si no entra.
55
55
 
56
56
  | uso | mobile | web | fuente |
57
57
  |---|---|---|---|
58
- | navegación de una web de escritorio | **no usar** | `sui-topbar` | propuesta, falta aprobación |
58
+ | navegación de una web de escritorio | **no usar** | `sui-topbar` | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
59
59
 
60
60
  **Qué pasa en mobile:** nada se adapta. Los 44 px laterales se comen el ancho, los items se
61
61
  esconden detrás de un scroll lateral sin pista visual, el buscador no se achica y no hay
@@ -26,12 +26,12 @@ armada a mano que quiera verse como la topbar.
26
26
 
27
27
  > **La guía del DS no tiene página de este botón.** Sale del Figma de SUI (Topbar Item Button
28
28
  > [Topbar], set 3814:25156: Default, Hover, Active). Uso medido el 03-10-2026: **0 usos** en la
29
- > app, 1 en la vitrina de variantes (`master-preview/_guia-variantes`). Lo de abajo es
30
- > **propuesta, falta aprobación**.
29
+ > app, 1 en la vitrina de variantes (`master-preview/_guia-variantes`). Las reglas marcadas
30
+ > canon están aprobadas (05-10-2026) y no queda ninguna en propuesta.
31
31
 
32
32
  | prop | cuándo | fuente |
33
33
  |---|---|---|
34
- | `dot` | Hay algo nuevo detrás del ícono (avisos sin leer). Se apaga cuando la persona lo abre. Si el número importa, no alcanza: va un contador en otro lado. | propuesta, falta aprobación |
34
+ | `dot` | Hay algo nuevo detrás del ícono (avisos sin leer). Se apaga cuando la persona lo abre. Si el número importa, no alcanza: va un contador en otro lado. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
35
35
  | `active` | Mientras el panel que abre el botón está abierto (pinta el ícono naranja y `aria-pressed`). | Figma (State=Active) |
36
36
  | `accent` | `brand` (default). `information` es el azul del Figma original: no usar. | canon del DS (accent = marca) |
37
37
 
@@ -43,7 +43,7 @@ mínimo táctil aceptable, pero el botón vive en la topbar, que hoy es solo de
43
43
 
44
44
  | uso | mobile | web | fuente |
45
45
  |---|---|---|---|
46
- | ícono de la barra superior | no usar (no hay topbar en mobile) | 40×40 | propuesta, falta aprobación |
46
+ | ícono de la barra superior | no usar (no hay topbar en mobile) | 40×40 | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
47
47
 
48
48
  ## «No usar»: por qué no hoy y cuándo sí
49
49