@ajuarezso/sui-design-system 0.24.1 → 0.25.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 (120) hide show
  1. package/docs/sui-accordion/README.md +85 -11
  2. package/docs/sui-activity-feed/README.md +65 -11
  3. package/docs/sui-activity-filter/README.md +54 -5
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +64 -10
  6. package/docs/sui-avatar/README.md +92 -29
  7. package/docs/sui-avatar-group/README.md +75 -9
  8. package/docs/sui-badge/README.md +85 -17
  9. package/docs/sui-banner/README.md +85 -20
  10. package/docs/sui-brand-logo/README.md +95 -31
  11. package/docs/sui-breadcrumb-item/README.md +54 -3
  12. package/docs/sui-breadcrumbs/README.md +54 -6
  13. package/docs/sui-button/README.md +76 -12
  14. package/docs/sui-button-group/README.md +91 -23
  15. package/docs/sui-button-group-item/README.md +81 -14
  16. package/docs/sui-card/README.md +105 -18
  17. package/docs/sui-chart-legend/README.md +63 -10
  18. package/docs/sui-chart-legend-dot/README.md +59 -10
  19. package/docs/sui-checkbox/README.md +109 -29
  20. package/docs/sui-checkbox-card/README.md +70 -14
  21. package/docs/sui-checkbox-label/README.md +92 -26
  22. package/docs/sui-circular-progress-bar/README.md +80 -19
  23. package/docs/sui-color-dot/README.md +72 -12
  24. package/docs/sui-color-picker/README.md +71 -13
  25. package/docs/sui-command-menu-footer/README.md +50 -1
  26. package/docs/sui-command-menu-item/README.md +74 -14
  27. package/docs/sui-command-menu-search/README.md +58 -3
  28. package/docs/sui-compact-avatar-group/README.md +73 -13
  29. package/docs/sui-compact-button/README.md +123 -34
  30. package/docs/sui-compact-select/README.md +61 -7
  31. package/docs/sui-compact-select-for-input/README.md +70 -6
  32. package/docs/sui-content-card/README.md +75 -14
  33. package/docs/sui-content-divider/README.md +67 -16
  34. package/docs/sui-content-label/README.md +99 -20
  35. package/docs/sui-counter-input/README.md +102 -18
  36. package/docs/sui-date-selector/README.md +69 -11
  37. package/docs/sui-datepicker/README.md +85 -18
  38. package/docs/sui-day-cell/README.md +75 -17
  39. package/docs/sui-day-label/README.md +56 -7
  40. package/docs/sui-divider/README.md +64 -9
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +69 -12
  43. package/docs/sui-dropdown-caption/README.md +58 -6
  44. package/docs/sui-dropdown-item/README.md +75 -9
  45. package/docs/sui-dropdown-menu/README.md +83 -14
  46. package/docs/sui-dropdown-search/README.md +60 -4
  47. package/docs/sui-emoji/README.md +94 -30
  48. package/docs/sui-empty-state/README.md +71 -7
  49. package/docs/sui-fancy-button/README.md +74 -14
  50. package/docs/sui-file-icon/README.md +70 -12
  51. package/docs/sui-file-upload/README.md +77 -17
  52. package/docs/sui-file-upload-card/README.md +64 -12
  53. package/docs/sui-filter/README.md +83 -14
  54. package/docs/sui-flag/README.md +73 -8
  55. package/docs/sui-form-hint/README.md +56 -7
  56. package/docs/sui-form-label/README.md +57 -5
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +86 -18
  59. package/docs/sui-image-upload/README.md +90 -22
  60. package/docs/sui-image-upload-profile/README.md +70 -11
  61. package/docs/sui-img-retry/README.md +50 -1
  62. package/docs/sui-inline-input/README.md +67 -9
  63. package/docs/sui-inline-select/README.md +62 -2
  64. package/docs/sui-input/README.md +90 -27
  65. package/docs/sui-integration-switch/README.md +84 -17
  66. package/docs/sui-kbd/README.md +73 -9
  67. package/docs/sui-key-icon/README.md +85 -23
  68. package/docs/sui-link-button/README.md +96 -27
  69. package/docs/sui-logo/README.md +93 -22
  70. package/docs/sui-modal/README.md +72 -13
  71. package/docs/sui-modal-footer/README.md +86 -12
  72. package/docs/sui-modal-header/README.md +57 -1
  73. package/docs/sui-modal-sheet/README.md +74 -12
  74. package/docs/sui-notification/README.md +81 -11
  75. package/docs/sui-notification-footer/README.md +55 -5
  76. package/docs/sui-notification-tab-menu/README.md +61 -5
  77. package/docs/sui-otp-input/README.md +70 -9
  78. package/docs/sui-page-header/README.md +89 -19
  79. package/docs/sui-pagination/README.md +73 -13
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +80 -18
  82. package/docs/sui-period-range/README.md +70 -11
  83. package/docs/sui-popover/README.md +81 -15
  84. package/docs/sui-product-card/README.md +89 -21
  85. package/docs/sui-progress-bar/README.md +82 -15
  86. package/docs/sui-progress-bar-label/README.md +79 -18
  87. package/docs/sui-radio/README.md +84 -7
  88. package/docs/sui-radio-card/README.md +70 -16
  89. package/docs/sui-radio-label/README.md +89 -22
  90. package/docs/sui-rating/README.md +101 -31
  91. package/docs/sui-rich-editor/README.md +47 -2
  92. package/docs/sui-segmented-control/README.md +90 -21
  93. package/docs/sui-select/README.md +80 -11
  94. package/docs/sui-sidebar/README.md +71 -16
  95. package/docs/sui-slider/README.md +75 -8
  96. package/docs/sui-social-button/README.md +71 -11
  97. package/docs/sui-status-badge/README.md +75 -14
  98. package/docs/sui-stepper/README.md +75 -18
  99. package/docs/sui-store-card/README.md +85 -22
  100. package/docs/sui-switch/README.md +82 -11
  101. package/docs/sui-switch-card/README.md +80 -16
  102. package/docs/sui-switch-label/README.md +91 -14
  103. package/docs/sui-tab-chips/README.md +93 -21
  104. package/docs/sui-tab-menu-horizontal/README.md +68 -7
  105. package/docs/sui-tab-menu-vertical/README.md +64 -11
  106. package/docs/sui-table/README.md +77 -16
  107. package/docs/sui-tag/README.md +86 -12
  108. package/docs/sui-tag-input/README.md +77 -13
  109. package/docs/sui-textarea/README.md +84 -17
  110. package/docs/sui-time-picker/README.md +96 -33
  111. package/docs/sui-toast/README.md +81 -20
  112. package/docs/sui-tooltip/README.md +80 -22
  113. package/docs/sui-topbar/README.md +64 -10
  114. package/docs/sui-topbar-button/README.md +61 -7
  115. package/docs/sui-topbar-item/README.md +68 -7
  116. package/docs/sui-topbar-user/README.md +61 -5
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
  118. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  119. package/package.json +1 -1
  120. package/types/ajuarezso-sui-design-system.d.ts +7 -3
@@ -36,9 +36,9 @@ o con peso → radio-card · muchas → select.**
36
36
  > motivos («Spam», «Acoso», «Infringe las reglas»); el «avanzado» suma (Sublabel), badge «NEW»,
37
37
  > descripción, Link Button y la versión con el círculo a la derecha.
38
38
  >
39
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
40
- > **1 uso**, las franjas horarias del checkout, con `flip`. Más **1 radio nativo** de motivos
41
- > (ver abajo a qué componente va).
39
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`), revisado
40
+ > el 06-10-2026: **2 usos**, las franjas horarias del checkout (con `flip`) y los distritos de
41
+ > «Trabaja con nosotros». Más **1 radio nativo** de motivos (ver abajo a qué componente va).
42
42
 
43
43
  ### Las piezas
44
44
 
@@ -47,22 +47,26 @@ o con peso → radio-card · muchas → select.**
47
47
  | `value` | Siempre (es obligatorio). Lo que lee el `sui-radio-group`. | API |
48
48
  | `label` | Siempre. La opción en pocas palabras («Dirección no encontrada», «12:00 — 12:30 p. m.»). | según la guía del DS (pieza) |
49
49
  | `sublabel` | Precisión corta entre paréntesis: «(recomendado)». | según la guía del DS |
50
- | `description` | Una frase de qué pasa si se elige. Sube el label a peso medio. Si casi todas las opciones la necesitan, probablemente es `sui-radio-card`. | según la guía del DS (pieza); el «cuándo» es propuesta |
51
- | `badge` | Solo novedad. Con string sale naranja `light`: pasa el objeto. | según la guía del DS (pieza «NEW»); el color es propuesta |
50
+ | `description` | Una frase de qué pasa si se elige. Sube el label a peso medio. Si casi todas las opciones la necesitan, probablemente es `sui-radio-card`. | según la guía del DS (pieza); el «cuándo» es canon (aprobado por el dueño, 05-10-2026, bloque B4) |
51
+ | `badge` | Solo novedad. Con string sale naranja `light`: pasa el objeto. | según la guía del DS (pieza «NEW»); el color es canon (aprobado por el dueño, 05-10-2026, bloque B3) |
52
52
  | `link` | «Ver detalle» que no elige la opción. Solo se ve con `description`. | según la guía del DS |
53
53
  | `flip` | Círculo a la derecha en listas de opciones tipo hoja (sheet) y de ajustes, donde el texto es lo que se lee y el círculo es el indicador, como las franjas del checkout. En formularios, a la izquierda. | canon (aprobado por el dueño, 03-10-2026) |
54
54
  | `disabled` | La opción existe pero no aplica (franja ya llena). | según la guía del DS |
55
- | `size` | `medium` (default, Figma): círculo 20, label 14/20. `large`: círculo 24, label 16/24. `xlarge`: círculo 28, label 16/24. En large y xlarge el sublabel y la descripción se quedan en 12/16 (canon, dueño 04-10-2026); el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
55
+ | `size` | `medium` (default, Figma): círculo 20, label 14/20. `large`: círculo 24, label 16/24. `xlarge`: círculo 28, label 16/24. En large y xlarge el sublabel y la descripción se quedan en 12/16 (canon, dueño 04-10-2026); el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. `2xlarge`: círculo 28 con la fila a 44 (su uso por dispositivo está pendiente, ver D16). Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
56
56
 
57
57
  **Usos de hoy:**
58
58
 
59
- - **1 radio nativo de motivos:** `pages/driver/driver-order-detail/driver-order-detail.html:844`
59
+ - **1 radio nativo de motivos:** `pages/driver/driver-order-detail/driver-order-detail.html:874`
60
60
  (motivos de cancelación del repartidor). Por la pantalla hermana va a `sui-radio-card
61
61
  type="basic"` como `pages/orders/orders.html:567`, no a este componente.
62
- - El único uso actual, `pages/customer/checkout/checkout.html:473`, controla la selección con
63
- `[checked]` + `(selected)` por fila, sin `sui-radio-group`. Funciona porque el padre fija el
64
- estado, pero no se enchufa a un formulario. **Va sin `size`** (`medium`, círculo de 20 px) en
65
- una hoja del checkout del cliente, que se usa en el teléfono: rompe la tabla de abajo.
62
+ - `pages/customer/checkout/checkout.html:474` controla la selección con `[checked]` +
63
+ `(selected)` por fila, sin `sui-radio-group`. Funciona porque el padre fija el estado, pero no se
64
+ enchufa a un formulario. Va con `bp.isMobile() ? '2xlarge' : 'medium'`: en la computadora baja a
65
+ `medium`, que D16 ya no usa (va `large`, dueño 06-10-2026). El `2xlarge` del teléfono está
66
+ pendiente (ver D16).
67
+ - `pages/customer/trabaja/trabaja.html:150` va con `bp.isMobile() ? 'xlarge' : 'large'`, que es lo
68
+ mismo que `bp.controlSize()`: cumple la fila de D16. Sin descripción la fila mide 28 en el
69
+ teléfono, no 44; si pasa a `2xlarge` está pendiente (ver D16).
66
70
 
67
71
  ## Tamaño en mobile y en web
68
72
 
@@ -74,12 +78,12 @@ dueño, 28-09-2026).
74
78
 
75
79
  | uso | mobile | web | fuente |
76
80
  |---|---|---|---|
77
- | opciones de un formulario o una hoja (franjas horarias, método de entrega) | `2xlarge` (fila de 44 como mínimo, círculo 28, label 16/24) | `large` (círculo 24, label 16/24) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; web: canon (aprobado por el dueño, 03-10-2026) |
78
- | lista densa de desktop | — | `medium` (círculo 20, label 14/20) | propuesta, falta aprobación |
79
- | opciones con mucho contexto cada una | `sui-radio-card` con `bp.controlSize()` | `sui-radio-card` con `bp.controlSize()` | propuesta |
81
+ | opciones de un formulario o una hoja (franjas horarias, método de entrega) | `xlarge` (círculo 28, label 16/24; sin descripción la fila mide 28, no 44: `2xlarge` pendiente, ver D16) | `large` (círculo 24, label 16/24) | D16 (fila de checkbox, radio y switch; dueño 06-10-2026) |
82
+ | lista densa de desktop | — | `large` (círculo 24): no baja a `medium` | D16, dueño 06-10-2026 |
83
+ | opciones con mucho contexto cada una | `sui-radio-card` con `bp.controlSize()` | `sui-radio-card` con `bp.controlSize()` | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
80
84
 
81
85
  ```html
82
- <sui-radio-label value="recojo" [size]="bp.isMobile() ? '2xlarge' : 'large'" label="Recojo en tienda" />
86
+ <sui-radio-label value="recojo" [size]="bp.controlSize()" label="Recojo en tienda" />
83
87
  ```
84
88
 
85
89
  | size | círculo | label | sublabel / descripción | alto de la fila sin descripción |
@@ -89,21 +93,42 @@ dueño, 28-09-2026).
89
93
  | `xlarge` | 28 | 16/24 | 12/16 | 28 |
90
94
  | `2xlarge` | 28 | 16/24 | 12/16 | **44** (`min-height`) |
91
95
 
92
- `2xlarge` (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono) es la fila del teléfono: mismo círculo de 28 y mismo label que `xlarge`,
93
- pero la fila mide 44 como mínimo con todo centrado en vertical, y el texto secundario se queda en 12
94
- (regla del 03-10). Con descripción la fila ya pasa de 44 y vuelve a alinearse arriba.
96
+ `2xlarge` (canon, dueño 04-10-2026: piso táctil 44 en el teléfono) tiene el mismo círculo de 28 y
97
+ el mismo label que `xlarge`, pero la fila mide 44 como mínimo con todo centrado en vertical, y el
98
+ texto secundario se queda en 12 (regla del 03-10). Con descripción la fila ya pasa de 44 y vuelve a
99
+ alinearse arriba. Si reemplaza a `xlarge` en el celular y la tablet está **pendiente** (ver D16).
95
100
 
96
101
  Toda la fila se toca (el host recibe el click). Con `xlarge` el contenido baja 2 px para que la
97
102
  línea del label (24) quede centrada con el círculo (28).
98
103
 
99
- Sin descripción, la fila en `xlarge` mide 28 px (lo que mide el círculo): en el teléfono va
100
- `2xlarge`, que la lleva a 44. Con descripción llega sola: 2 + 24 (label) + 4 + 16 (descripción) = 46 px
104
+ Sin descripción, la fila en `xlarge` mide 28 px (lo que mide el círculo):
105
+ `2xlarge` la lleva a 44 (pendiente, ver D16). Con descripción llega sola: 2 + 24 (label) + 4 + 16 (descripción) = 46 px
101
106
  en `xlarge` y en `2xlarge`.
102
107
 
103
108
  **Regla de tamaños aplicada (canon, dueño 04-10-2026):** en `large` y `xlarge` el label sube a
104
109
  16/24 y el sublabel y la descripción se quedan en 12/16, igual que `sui-switch-label`. Antes subían
105
110
  a 14/20. El badge y el link siguen creciendo con el size.
106
111
 
112
+ ### Por dispositivo (D16)
113
+
114
+ | dispositivo | size | nota |
115
+ |---|---|---|
116
+ | celular chico (< 380) | `xlarge` | círculo de 28 |
117
+ | celular (380–767) | `xlarge` | |
118
+ | tablet táctil (`pointer: coarse`) | `xlarge` | `bp.controlSize()` mira solo el ancho: un iPad de 768 o más recibe `large` hasta que el helper mire el puntero |
119
+ | computadora (`pointer: fine`) | `large` | un paso menos que el celular; no baja a `medium` (D16, dueño 06-10-2026) |
120
+
121
+ Ultrawide: igual que la computadora (`large`).
122
+
123
+ En master-pedidos: `[size]="bp.controlSize()"` (`xlarge` hasta 767 px, `large` desde ahí). La
124
+ expresión exacta de D16, con la tablet, es `bp.tactil() ? 'xlarge' : 'large'`.
125
+
126
+ **Pendiente: `2xlarge` en el celular y la tablet.** Sin descripción, `xlarge` deja la fila en 28 px,
127
+ por debajo del piso de 44. El dueño aprobó `2xlarge` el 04-10-2026 justo para eso (fila de 44), pero
128
+ la fila de D16 dice `xlarge` para toda la familia y ningún helper devuelve `2xlarge`. Falta que el
129
+ dueño decida si en este componente el celular y la tablet pasan a `2xlarge` (y que D16 y
130
+ `bp.controlSize()` lo recojan). Mientras no lo decida, manda la fila de D16: `xlarge`.
131
+
107
132
  ## «No usar»: por qué no hoy y cuándo sí
108
133
 
109
134
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -140,7 +165,8 @@ a 14/20. El badge y el link siguen creciendo con el size.
140
165
  - **No implementa `ControlValueAccessor`.** El formulario se engancha al `sui-radio-group`, no a
141
166
  cada opción. Sin grupo, se maneja con `[(checked)]`.
142
167
  - **`size` arranca en `medium`** (círculo de 20 px): sin `[size]="bp.controlSize()"` choca con la
143
- regla de controles grandes (dueño, 28-09-2026) en mobile.
168
+ regla de controles grandes (dueño, 28-09-2026) y con D16. Aun con `xlarge`, la fila sin
169
+ descripción queda en 28: si pasa a `2xlarge` está pendiente (ver D16).
144
170
  - **Tocar una opción ya elegida no la desmarca** (bien, es un radio). Tocar el link tampoco la elige.
145
171
  - **`link` solo se dibuja con `description`.**
146
172
  - El `sui-radio` de adentro no recibe clics (`pointer-events: none`): no le pongas handlers.
@@ -151,12 +177,53 @@ a 14/20. El badge y el link siguen creciendo con el size.
151
177
  - El badge con string sale naranja; en `sui-radio-card` el default es azul.
152
178
  - `flip` usa CSS `order`: el orden para lector de pantalla no cambia.
153
179
 
180
+ ## Bien y mal
181
+
182
+ Sin size
183
+
184
+ ```html
185
+ <!-- ❌ mal: sin size queda en medium, círculo de 20 en el teléfono y en la computadora -->
186
+ <sui-radio-label [value]="d" [label]="d" />
187
+ ```
188
+
189
+ ```html
190
+ <!-- ✅ bien -->
191
+ <sui-radio-label [size]="bp.controlSize()" [value]="d" [label]="d" />
192
+ ```
193
+
194
+ Franjas horarias en la computadora
195
+
196
+ ```html
197
+ <!-- ❌ mal: medium en la computadora; D16 no baja de large (pages/customer/checkout/checkout.html:474) -->
198
+ <sui-radio-label [size]="bp.isMobile() ? '2xlarge' : 'medium'" [value]="'' + f.inicioMs"
199
+ [label]="etiquetaFranja(f)" [flip]="true" [disabled]="!f.disponible" />
200
+ ```
201
+
202
+ ```html
203
+ <!-- ✅ bien (si el teléfono pasa a 2xlarge está pendiente, ver D16) -->
204
+ <sui-radio-label [size]="bp.controlSize()" [value]="'' + f.inicioMs"
205
+ [label]="etiquetaFranja(f)" [flip]="true" [disabled]="!f.disponible" />
206
+ ```
207
+
208
+ Link sin descripción
209
+
210
+ ```html
211
+ <!-- ❌ mal: link solo se dibuja con description; «Ver precios» no aparece -->
212
+ <sui-radio-label value="pro" label="Plan Pro" [link]="{ label: 'Ver precios', href: '/precios' }" />
213
+ ```
214
+
215
+ ```html
216
+ <!-- ✅ bien -->
217
+ <sui-radio-label [size]="bp.controlSize()" value="pro" label="Plan Pro"
218
+ description="Facturación mensual." [link]="{ label: 'Ver precios', href: '/precios' }" />
219
+ ```
220
+
154
221
  ## Ejemplo
155
222
 
156
223
  ```html
157
224
  <sui-radio-group [(ngModel)]="motivo" class="lista-vertical">
158
225
  @for (m of motivos; track m) {
159
- <sui-radio-label [value]="m" [label]="m" />
226
+ <sui-radio-label [size]="bp.controlSize()" [value]="m" [label]="m" />
160
227
  }
161
228
  </sui-radio-group>
162
229
  ```
@@ -35,8 +35,8 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
35
35
  > el suyo («cada sistema de calificación se comporta distinto»). Los ejemplos son: nota con
36
36
  > reseñas («4.5 ∙ 5.2K Ratings · 18 reviews»), celdas, barra de estrellas, barra de corazones,
37
37
  > barra de emojis, barra de números del 1 al 5 y barra con área de texto. No trae tamaños, ni
38
- > do/don't. Lo marcado «según la guía del DS» es que el ejemplo existe; el cuándo es
39
- > **propuesta, falta aprobación**, salvo lo que diga «canon».
38
+ > do/don't. Lo marcado «según la guía del DS» es que el ejemplo existe; el cuándo está
39
+ > aprobado donde dice «canon»; lo que sigue en propuesta espera decisión.
40
40
  >
41
41
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **23 ratings en 13 pantallas**, sin
42
42
  > contar prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`,
@@ -50,7 +50,7 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
50
50
  | appearance | cuándo | ejemplo real | fuente |
51
51
  |---|---|---|---|
52
52
  | `inline` (default), `readonly` | **Mostrar** una nota: la fila de estrellas pelada. | `components/ratings-detail/ratings-detail.html:31` (la nota del local) | según la guía del DS (ejemplo «Rating Review») |
53
- | `inline`, interactivo | Pedir la nota en grande: en el teléfono con `size="2xlarge"` (estrellas de 32 en botones de 44 × 44); `xlarge` (28 tocables) queda para web. | `pages/customer/rate-order/rate-order.html:93` y `:167` (hoy en `xlarge`) | tamaño: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; el «cuándo inline vs bar» sigue como propuesta |
53
+ | `inline`, interactivo | Pedir la nota en grande: en el teléfono y la tablet con `size="2xlarge"` (estrellas de 32 en botones de 44 × 44); en la computadora, `medium`. | `pages/customer/rate-order/rate-order.html:95` y `:169` (hoy `2xlarge` / `xlarge`, cortado con `bp.isMobile()`) | teléfono: canon (dueño, 04-10-2026): piso táctil 44 · computadora: D16, dueño 05-10-2026 (antes `xlarge`) · el «cuándo inline vs bar» sigue como propuesta |
54
54
  | `bar` | **Pedir** una nota en el celular: con `size="2xlarge"` las celdas miden 64 × 44 (36 en los demás sizes). | `components/rate-entity-card/rate-entity-card.html:40` | según la guía del DS (ejemplo «Rating Bar») |
55
55
  | `cell` | **No usar** hoy (ver abajo). | — | según la guía del DS (ejemplo «Rating Cell») |
56
56
  | `bar-area` | **No usar** hoy (ver abajo). | — | según la guía del DS (ejemplo «Rating Bar With Textarea») |
@@ -59,8 +59,8 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
59
59
 
60
60
  | type | cuándo | fuente |
61
61
  |---|---|---|
62
- | `star` (default) | La nota de un pedido, un local, un repartidor o un cliente: la que entra al promedio. | según la guía del DS (ejemplo) · propuesta (cuándo) |
63
- | `emoji` | Cómo le fue a la persona con la app o con un proceso (no entra a la nota de nadie). Solo en `bar`. Hoy: `components/rate-entity-card/rate-entity-card.html:38`. | según la guía del DS (ejemplo «Single Selectable») · propuesta (cuándo) |
62
+ | `star` (default) | La nota de un pedido, un local, un repartidor o un cliente: la que entra al promedio. | según la guía del DS (ejemplo) · canon (aprobado por el dueño, 05-10-2026, bloque B2) (cuándo) |
63
+ | `emoji` | Cómo le fue a la persona con la app o con un proceso (no entra a la nota de nadie). Solo en `bar`. Hoy: `components/rate-entity-card/rate-entity-card.html:38`. | según la guía del DS (ejemplo «Single Selectable») · canon (aprobado por el dueño, 05-10-2026, bloque B2) (cuándo) |
64
64
  | `heart` | **No usar** como nota (ver abajo). | según la guía del DS (ejemplo «Rating Bar Heart») |
65
65
  | `number` | **No usar** hoy (ver abajo). Solo en `bar`. | según la guía del DS (ejemplo de 1 a 5) |
66
66
 
@@ -68,29 +68,29 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
68
68
 
69
69
  | size | px | cuándo | fuente |
70
70
  |---|---|---|---|
71
- | `small` | 16 | Web: filas y listas (cada reseña, tablas, historial). | propuesta, falta aprobación |
72
- | `medium` (default) | 20 | Web: perfil, ficha, detalle. Mobile: filas y listas. | propuesta, falta aprobación |
73
- | `large` | 24 | Web: la nota grande de un resumen, la card de una calificación enviada. Mobile: perfil y ficha. | propuesta, falta aprobación |
71
+ | `small` | 16 | **No se usa**: es chico. Las filas y listas de la computadora (cada reseña, tablas, historial) van en `medium`. | D16, dueño 05-10-2026 (antes «web: filas y listas», propuesta) |
72
+ | `medium` (default) | 20 | Computadora, tablet y celular chico: filas, listas, perfil, ficha y detalle. | D16, dueño 05-10-2026 |
73
+ | `large` | 24 | Celular (380–767): filas, listas, perfil y ficha (un paso más que la computadora). Computadora: la nota grande de un resumen, la card de una calificación enviada. | celular: D16, dueño 05-10-2026 · resumen en la computadora: propuesta, falta aprobación |
74
74
  | `xlarge` | 28 | Extensión SUI. Mobile: la nota grande de un resumen. | propuesta, falta aprobación |
75
75
 
76
76
  ### El resto de las propiedades
77
77
 
78
78
  | propiedad | valor | cuándo | fuente |
79
79
  |---|---|---|---|
80
- | `readonly` | `true` | **Todo rating que muestra una nota.** Sin él se puede tocar y cambiar. | propuesta, falta aprobación |
80
+ | `readonly` | `true` | **Todo rating que muestra una nota.** Sin él se puede tocar y cambiar. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
81
81
  | `halfStep` | `true` | Obligatorio si el valor es un **promedio** (sin él, 4,5 se pinta como 4). Una nota individual es entera y no lo necesita. Solo funciona en `inline` + `readonly`. | según la guía del DS (muestra 4.5) |
82
- | `value` | `0` | Solo dentro del botón que invita a calificar, junto al texto «Calificar» (`pages/customer/order-history/order-history.html:352`). Suelto, cinco estrellas vacías se leen como «0 estrellas». | propuesta, falta aprobación |
83
- | `max` | `5` (default) | Siempre 5 en notas: la fórmula de la nota asume 5. | propuesta, falta aprobación |
84
- | `max` | otro | Solo con `type="number"` (encuesta de 1 a 10). | propuesta, falta aprobación |
85
- | `alignment` | `inline` (default) | Solo los íconos; el número y el conteo los escribe la pantalla. | propuesta, falta aprobación |
86
- | `alignment` | `horizontal` | Junto con `reviewLink`. | propuesta, falta aprobación |
87
- | `alignment` | `vertical` | **No usar** (ver abajo). | propuesta, falta aprobación |
82
+ | `value` | `0` | Solo dentro del botón que invita a calificar, junto al texto «Calificar» (`pages/customer/order-history/order-history.html:352`). Suelto, cinco estrellas vacías se leen como «0 estrellas». | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
83
+ | `max` | `5` (default) | Siempre 5 en notas: la fórmula de la nota asume 5. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
84
+ | `max` | otro | Solo con `type="number"` (encuesta de 1 a 10). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
85
+ | `alignment` | `inline` (default) | Solo los íconos; el número y el conteo los escribe la pantalla. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
86
+ | `alignment` | `horizontal` | Junto con `reviewLink`. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
87
+ | `alignment` | `vertical` | **No usar** (ver abajo). | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
88
88
  | `reviewLink` | `{ label, href? }` | Link «Ver 128 reseñas» que abre la hoja de reseñas. Hoy sin usos. | según la guía del DS («18 reviews») |
89
89
  | `showValue` | `true` | **No usar** (ver abajo). | propuesta, falta aprobación |
90
- | `reviewCount` | número | **No usar** (ver abajo). | propuesta, falta aprobación |
91
- | `emojis` | lista | Dejar el default (cinco caras, de triste a feliz). Cambiarlo rompe la lectura de la escala. | propuesta, falta aprobación |
92
- | `ariaLabel` | texto | Decir qué se califica: «Califica al repartidor», «Nota del local». El default es «Calificación». | propuesta, falta aprobación |
93
- | `reason` / `reasonPlaceholder` / `reasonRows` | — | Solo en `bar-area`. El placeholder por defecto es «Cuéntanos por qué» (03-10-2026). | propuesta, falta aprobación |
90
+ | `reviewCount` | número | **No usar** (ver abajo). | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
91
+ | `emojis` | lista | Dejar el default (cinco caras, de triste a feliz). Cambiarlo rompe la lectura de la escala. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
92
+ | `ariaLabel` | texto | Decir qué se califica: «Califica al repartidor», «Nota del local». El default es «Calificación». | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
93
+ | `reason` / `reasonPlaceholder` / `reasonRows` | — | Solo en `bar-area`. El placeholder por defecto es «Cuéntanos por qué» (03-10-2026). | según el código |
94
94
 
95
95
  **Usos de hoy que rompen la regla:**
96
96
 
@@ -98,8 +98,8 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
98
98
  `pages/super-admin/master-users/master-user-sheet.html:142`.
99
99
  - **1 rating usado como ícono** (`type="heart"` con `max=1` para los favoritos):
100
100
  `components/ratings-detail/ratings-detail.html:45`. Va `sui-icon name="heart-3-fill"`.
101
- - **A discutir, 2 `inline` interactivos de 28 px** como input:
102
- `pages/customer/rate-order/rate-order.html:93` y `:167`. Alternativa: `appearance="bar"`.
101
+ - **A discutir, 2 `inline` interactivos de 28 px en la computadora** (en el teléfono ya van en `2xlarge`) como input:
102
+ `pages/customer/rate-order/rate-order.html:95` y `:169`. Alternativa: `appearance="bar"`.
103
103
 
104
104
  ## No usar: por qué no hoy y cuándo sí
105
105
 
@@ -115,17 +115,21 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
115
115
 
116
116
  ## Tamaño en mobile y en web
117
117
 
118
- Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
119
- (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
120
- en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
121
- de la app.
118
+ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
119
+ «tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
120
+ 380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
121
+ computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
122
+ (< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
123
+ `xsmall`**, salvo lo que el componente solo tiene en chico. En la app, `bp.isMobile()` mira solo el
124
+ ancho (≤ 767 px); `bp.celular()` (380–767) y `bp.tactil()` (celular o pantalla táctil) ya miran los
125
+ 380 px y el puntero: son las dos señales que usa este componente (ver «Por dispositivo (D16)»).
122
126
 
123
127
  | uso | mobile | web | fuente |
124
128
  |---|---|---|---|
125
- | Mostrar en una fila o lista | `medium` (20) | `small` (16) | propuesta, falta aprobación |
126
- | Mostrar en perfil o ficha | `large` (24) | `medium` (20) | propuesta, falta aprobación |
129
+ | Mostrar en una fila o lista | `large` (24) | `medium` (20) | D16, dueño 05-10-2026 (antes `medium` / `small`) |
130
+ | Mostrar en perfil o ficha | `large` (24) | `medium` (20) | D16, dueño 05-10-2026 |
127
131
  | La nota grande de un resumen | `xlarge` (28) | `large` (24) | propuesta, falta aprobación |
128
- | Pedir una nota | `2xlarge`: `inline` (estrellas de 32 en botones de 44 × 44) o `bar` (celdas de 64 × 44) | `bar` (64 × 36), o `inline` `large` con mouse | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; web: propuesta |
132
+ | Pedir una nota | `2xlarge`: `inline` (estrellas de 32 en botones de 44 × 44) o `bar` (celdas de 64 × 44) | `bar` (64 × 36), o `inline` `medium` con mouse | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: D16, dueño 05-10-2026 (lo que se toca va `medium` en la computadora; antes `large`, propuesta) |
129
133
 
130
134
  ```ts
131
135
  readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
@@ -133,7 +137,7 @@ readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/br
133
137
 
134
138
  ```html
135
139
  <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true"
136
- [size]="bp.isMobile() ? 'medium' : 'small'" ariaLabel="Nota del local" />
140
+ [size]="bp.celular() ? 'large' : 'medium'" ariaLabel="Nota del local" />
137
141
  ```
138
142
 
139
143
  En `bar` el `size` no cuenta salvo `2xlarge` (celda de 44 de alto en vez de 36; íconos fijos de 20
@@ -154,6 +158,28 @@ nota de solo lectura sigue `medium`/`large`.
154
158
  (el botón es el ícono, sin padding) y `2xlarge` 44 px (32 + 6 + 6); `bar` 36 px (8 + 20 + 8 de cada
155
159
  celda) y en `2xlarge` 44 (12 + 20 + 12); `cell` 58 px (12 + 32 + 12 de padding y 2 de borde).
156
160
 
161
+ ### Por dispositivo (D16)
162
+
163
+ `rating` no está en la tabla por componente de D16 (dueño, 05-10-2026), así que va por la regla
164
+ general y tiene **dos filas según el modo**: mostrar una nota (`readonly`) es «lo que no se toca» y
165
+ pedirla es «lo que se toca».
166
+
167
+ | dispositivo | size | nota |
168
+ |---|---|---|
169
+ | celular chico (< 380 px) | mostrar `medium` · pedir `2xlarge` | D16 pide `medium` con área de 44 para pedir, pero solo `2xlarge` llega a 44: hasta que el DS estire el área (nota ¹ de D16), se queda el grande |
170
+ | celular (380–767 px) | mostrar `large` · pedir `2xlarge` | mostrar sube un paso (P1 b); pedir: `inline` 44 × 44 o `bar` 64 × 44 |
171
+ | tablet táctil (`pointer: coarse`) | mostrar `medium` · pedir `2xlarge` | se pide con el dedo: mismo piso de 44 que el celular |
172
+ | computadora (`pointer: fine`) | mostrar `medium` · pedir `medium` | en `bar` el `size` no cuenta salvo `2xlarge` (celdas de 36) |
173
+
174
+ Ultrawide (≥ 1920 px): igual que la computadora. `small` no se usa en ningún dispositivo. La nota
175
+ grande de un resumen va un paso arriba de esta tabla (`large` en la computadora, `xlarge` en el
176
+ celular), y eso sigue en propuesta.
177
+
178
+ En master-pedidos, sin helper propio:
179
+
180
+ - mostrar: `[size]="bp.celular() ? 'large' : 'medium'"` (resumen, en propuesta: `bp.celular() ? 'xlarge' : 'large'`)
181
+ - pedir: `[size]="bp.tactil() ? '2xlarge' : 'medium'"`
182
+
157
183
  ## API
158
184
 
159
185
  <!-- api:inicio -->
@@ -206,13 +232,57 @@ Implementa `ControlValueAccessor` sobre `value` (sirve con `formControlName`). `
206
232
  nativo), Home/End van a 1 y al máximo, sin vuelta. Cada flecha elige y emite `valueChange`. Si
207
233
  la pantalla ya escribe la nota al lado, ponle `aria-hidden="true"` para que no se lea dos veces.
208
234
 
235
+ ## Bien y mal
236
+
237
+ Lo favorito no es una nota
238
+
239
+ ```html
240
+ <!-- ❌ mal: un rating de un corazón como ícono (components/ratings-detail/ratings-detail.html:45) -->
241
+ <sui-rating type="heart" appearance="inline" [readonly]="true" [value]="1" [max]="1" />
242
+ ```
243
+
244
+ ```html
245
+ <!-- ✅ bien: ícono del mismo tamaño que las estrellas de al lado -->
246
+ <sui-icon name="heart-3-fill" [size]="bp.celular() ? 28 : 24" aria-hidden="true" />
247
+ ```
248
+
249
+ La nota grande de un resumen
250
+
251
+ ```html
252
+ <!-- ❌ mal: tamaños invertidos, más chico en el celular (components/ratings-detail/ratings-detail.html:34) -->
253
+ <sui-rating [value]="average()" [readonly]="true" [halfStep]="true"
254
+ [size]="bp.isMobile() ? 'large' : 'xlarge'" />
255
+ ```
256
+
257
+ ```html
258
+ <!-- ✅ bien: regla general de lo que no se toca, un paso más grande en el celular.
259
+ El paso extra del resumen (`xlarge` / `large`) sigue en propuesta, falta aprobación -->
260
+ <sui-rating [value]="average()" [readonly]="true" [halfStep]="true"
261
+ [size]="bp.celular() ? 'large' : 'medium'" />
262
+ ```
263
+
264
+ La nota en una fila o lista
265
+
266
+ ```html
267
+ <!-- ❌ mal: `small` fijo, 16 px también en el celular (pages/drivers/drivers.html:160, pages/customer/order-tracking/order-tracking.html:407) -->
268
+ <sui-rating type="star" size="small" [value]="driver.rating" [readonly]="true" [halfStep]="true" />
269
+ ```
270
+
271
+ ```html
272
+ <!-- ✅ bien -->
273
+ <sui-rating type="star" [size]="bp.celular() ? 'large' : 'medium'"
274
+ [value]="driver.rating" [readonly]="true" [halfStep]="true" />
275
+ ```
276
+
209
277
  ## Ejemplo
210
278
 
211
279
  ```html
212
280
  <!-- Mostrar la nota del local (promedio, desde el agregado) -->
213
281
  <span class="nota">{{ notaTexto }}</span>
214
- <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true" size="small" aria-hidden="true" />
282
+ <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true"
283
+ [size]="bp.celular() ? 'large' : 'medium'" aria-hidden="true" />
215
284
 
216
285
  <!-- Pedir la nota al repartidor -->
217
- <sui-rating appearance="bar" type="star" [(value)]="nota" ariaLabel="Califica al repartidor" />
286
+ <sui-rating appearance="bar" type="star" [size]="bp.tactil() ? '2xlarge' : 'medium'"
287
+ [(value)]="nota" ariaLabel="Califica al repartidor" />
218
288
  ```
@@ -25,14 +25,14 @@ Regla corta: **hoy, siempre `sui-textarea`.**
25
25
  ## Qué variante usar
26
26
 
27
27
  > **La guía del DS no tiene página para este componente.** Viene del Figma («Rich Editor»), donde
28
- > solo está la barra de formato. Todo lo de abajo es **propuesta, falta aprobación**.
28
+ > solo está la barra de formato. Las reglas marcadas **canon** están aprobadas; lo que sigue en **propuesta** espera decisión.
29
29
  >
30
30
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**.
31
31
 
32
32
  | prop / evento | cuándo | fuente |
33
33
  |---|---|---|
34
34
  | `layout="full"` (default) | Título, tamaño, B I U S, alineación, comentario, enlace, mención. | API |
35
- | `layout="formatting"` | Solo B I U S y alineación: lo único que el editor aplica solo. | propuesta, falta aprobación |
35
+ | `layout="formatting"` | Solo B I U S y alineación: lo único que el editor aplica solo. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
36
36
  | `layout="compact"` | Solo título y tamaño (los dos son avisos a la pantalla, no formato real). | — |
37
37
  | `layout="social"` | Comentario, enlace, mención (también avisos). | — |
38
38
  | `showMore` | El botón ⋮ al final. Apagarlo si no hay más acciones. | API |
@@ -47,6 +47,12 @@ Regla corta: **hoy, siempre `sui-textarea`.**
47
47
  **No tiene `size`.** Los botones de la barra son de 28 px: **no tiene tamaño suficiente para
48
48
  mobile**. Si alguna vez se usa, que sea en el panel web.
49
49
 
50
+ ### Por dispositivo (D16)
51
+
52
+ No aplica: no tiene input `size` y la barra mide 28 px en todos los dispositivos, así que no llega a
53
+ los 44 de D16 (dueño, 05-10-2026) en el celular ni en la tablet táctil. Solo en la computadora
54
+ (`pointer: fine`); en master-pedidos no hay nada que bindear.
55
+
50
56
  ## «No usar»: por qué no hoy y cuándo sí
51
57
 
52
58
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -106,6 +112,45 @@ Sub-componente: `sui-rich-editor-item` (cada botón de la barra).
106
112
  - Por default muestra solo la barra: sin `[editable]="true"` no hay dónde escribir.
107
113
  - El label de tamaño por default es técnico («14px»); el de título ya está en español («Título», 04-10-2026).
108
114
 
115
+ ## Bien y mal
116
+
117
+ Una descripción o una nota
118
+
119
+ ```html
120
+ <!-- ❌ mal: el texto se guarda y se muestra plano; la barra sobra y en el teléfono no se toca -->
121
+ <sui-rich-editor [editable]="true" placeholder="Describe el producto…" [(value)]="descripcion" />
122
+ ```
123
+
124
+ ```html
125
+ <!-- ✅ bien -->
126
+ <sui-textarea [size]="bp.sizeControl()" label="Descripción" [rows]="4"
127
+ placeholder="Describe el producto…" [(value)]="descripcion" />
128
+ ```
129
+
130
+ La barra entera esperando que todo funcione
131
+
132
+ ```html
133
+ <!-- ❌ mal: título, tamaño, enlace, comentario y mención solo emiten (action); nadie los resuelve -->
134
+ <sui-rich-editor [editable]="true" [(value)]="html" />
135
+ ```
136
+
137
+ ```html
138
+ <!-- ✅ bien: solo lo que el editor aplica solo -->
139
+ <sui-rich-editor layout="formatting" [showMore]="false" [editable]="true" [(value)]="html" />
140
+ ```
141
+
142
+ Un editor sin dónde escribir
143
+
144
+ ```html
145
+ <!-- ❌ mal: sin [editable]="true" solo se dibuja la barra -->
146
+ <sui-rich-editor layout="formatting" placeholder="Escribe la respuesta…" [(value)]="html" />
147
+ ```
148
+
149
+ ```html
150
+ <!-- ✅ bien -->
151
+ <sui-rich-editor layout="formatting" [editable]="true" placeholder="Escribe la respuesta…" [(value)]="html" />
152
+ ```
153
+
109
154
  ## Ejemplo
110
155
 
111
156
  ```html