@ajuarezso/sui-design-system 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/INDEX.md +136 -0
- package/docs/sui-alert/README.md +216 -0
- package/docs/sui-app-store-badge/README.md +137 -0
- package/docs/sui-avatar/README.md +263 -0
- package/docs/sui-avatar-group/README.md +115 -0
- package/docs/sui-badge/README.md +212 -0
- package/docs/sui-brand-logo/README.md +143 -0
- package/docs/sui-button/README.md +192 -0
- package/docs/sui-button-group/README.md +178 -0
- package/docs/sui-button-group-item/README.md +102 -0
- package/docs/sui-checkbox/README.md +147 -0
- package/docs/sui-checkbox-label/README.md +143 -0
- package/docs/sui-circular-progress-bar/README.md +131 -0
- package/docs/sui-color-dot/README.md +112 -0
- package/docs/sui-color-picker/README.md +124 -0
- package/docs/sui-compact-avatar-group/README.md +103 -0
- package/docs/sui-compact-button/README.md +190 -0
- package/docs/sui-content-divider/README.md +124 -0
- package/docs/sui-divider/README.md +102 -0
- package/docs/sui-emoji/README.md +138 -0
- package/docs/sui-fancy-button/README.md +148 -0
- package/docs/sui-file-icon/README.md +103 -0
- package/docs/sui-flag/README.md +99 -0
- package/docs/sui-form-hint/README.md +124 -0
- package/docs/sui-form-label/README.md +148 -0
- package/docs/sui-icon/README.md +135 -0
- package/docs/sui-kbd/README.md +97 -0
- package/docs/sui-key-icon/README.md +125 -0
- package/docs/sui-link-button/README.md +221 -0
- package/docs/sui-logo/README.md +152 -0
- package/docs/sui-payment-icon/README.md +98 -0
- package/docs/sui-progress-bar/README.md +132 -0
- package/docs/sui-progress-bar-label/README.md +143 -0
- package/docs/sui-radio/README.md +134 -0
- package/docs/sui-radio-label/README.md +137 -0
- package/docs/sui-rating/README.md +198 -0
- package/docs/sui-segmented-control/README.md +144 -0
- package/docs/sui-slider/README.md +143 -0
- package/docs/sui-social-button/README.md +158 -0
- package/docs/sui-status-badge/README.md +164 -0
- package/docs/sui-switch/README.md +146 -0
- package/docs/sui-switch-label/README.md +139 -0
- package/docs/sui-tag/README.md +145 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +193 -48
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +166 -27
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-icon
|
|
3
|
+
selector: sui-icon
|
|
4
|
+
resumen: Un ícono monocromo de RemixIcon (o uno propio del DS) que toma el color del texto
|
|
5
|
+
alternativas: [sui-key-icon (el ícono dentro de un círculo de color), sui-emoji (emoji con emoción), sui-brand-logo (el logo de otra marca en su color), sui-compact-button (un ícono que se toca)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-icon
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Icon/Icon](https://sui-design-system.web.app/?path=/docs/atoms-icon-icon--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para **todo ícono**: dentro de un texto, una fila, una card, un título. Es la única
|
|
15
|
+
forma de poner un ícono: nada de `<i class="ri-…">` ni SVG pegado en el template. Los íconos
|
|
16
|
+
propios del DS (`info-custom-fill`, `heart-half-fill`…) también pasan por aquí.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Un ícono que se toca: `sui-compact-button` o un `sui-button` con `leftIcon`/`onlyIcon`.
|
|
21
|
+
- Un ícono dentro de un círculo de color (cabecera de un modal, inicio de una fila): `sui-key-icon`.
|
|
22
|
+
- Emoción (estado vacío, celebración): `sui-emoji`.
|
|
23
|
+
- El logo de una marca cuando la marca es lo que se muestra: `sui-brand-logo`.
|
|
24
|
+
|
|
25
|
+
## Qué variante usar
|
|
26
|
+
|
|
27
|
+
> **La guía del DS no tiene página para el ícono**: usa RemixIcon en todos sus ejemplos, sin
|
|
28
|
+
> reglas de tamaño. La escala de abajo sale de los tokens del DS (`--sui-icon-size-*` y
|
|
29
|
+
> `--sui-icon-*` en `sui-tokens.scss`). Lo marcado «canon» ya es regla del proyecto; el resto es
|
|
30
|
+
> **propuesta, falta aprobación**.
|
|
31
|
+
>
|
|
32
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: 406 íconos en 95 archivos, sin contar
|
|
33
|
+
> prototipos ni vitrinas. 331 `-line`, 43 `-fill`. Ninguno usa el input `color`.
|
|
34
|
+
|
|
35
|
+
### `size`
|
|
36
|
+
|
|
37
|
+
| valor | tamaño de hoy | cuándo | fuente |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| `12` | 5 | Dentro de un badge `small`. | propuesta (token `--sui-icon-size-xs`) |
|
|
40
|
+
| `16` | 69 | Junto a texto chico: metadatos, botones `2xsmall`/`xsmall`, dentro de un kbd. | propuesta (token `--sui-icon-size-sm`) |
|
|
41
|
+
| `20` (default) | 114 | El normal: botones, inputs, filas, navegación. | propuesta (token `--sui-icon-size-md`) |
|
|
42
|
+
| `24` | 5 | Cabeceras y acciones sueltas. | propuesta (token `--sui-icon-size-lg`) |
|
|
43
|
+
| `32` | 2 | Ícono protagonista. Si va dentro de un círculo, es `sui-key-icon`. | propuesta (token `--sui-icon-size-xl`) |
|
|
44
|
+
| `26` | 7 | Solo el ícono del hero de los onboarding (`ob__hero-icon`). | canon (`CLAUDE.md`, patrón de los pasos de onboarding) |
|
|
45
|
+
| `14`, `18` | 149 | Fuera de la escala, pero el DS mismo los usa (tabs, product-card). **A discutir**: no migrar en masa. | propuesta |
|
|
46
|
+
| `13`, `22`, `28`, `44`… | 49 | Sin regla: van al más cercano de la escala. | propuesta |
|
|
47
|
+
|
|
48
|
+
**Usos de hoy fuera de la escala sin regla: 49.** `22` (20 usos: `components/ota-quick-fab/ota-quick-fab.html:11`,
|
|
49
|
+
`pages/schedule/schedule.html:10`), `13` (14: `pages/super-admin/master-drivers/master-drivers.html:359`, `:419`),
|
|
50
|
+
`28` (4: `pages/envios/envios.html:691`), `44`, `48` y `36` (6: `pages/support/support.html:9`,
|
|
51
|
+
`components/product-detail-view/product-detail-view.html:30`), y uno cada uno de `10`, `11`, `15`,
|
|
52
|
+
`30`, `34`. Los de 36 px en adelante casi siempre son un ícono protagonista que quiere ser
|
|
53
|
+
`sui-key-icon` o un `sui-emoji`.
|
|
54
|
+
|
|
55
|
+
### `name`: `-line` o `-fill`
|
|
56
|
+
|
|
57
|
+
| valor | cuándo | fuente |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `-line` | El normal. | propuesta |
|
|
60
|
+
| `-fill` | El seleccionado (el tab activo) o un glifo chico sobre color. | propuesta |
|
|
61
|
+
| propios del DS (`info-custom-fill`, `heart-half-fill`, `building-skyline`, `avatar-placeholder`) | Los usan componentes del DS; en la app no hacen falta. | propuesta |
|
|
62
|
+
|
|
63
|
+
### `color`
|
|
64
|
+
|
|
65
|
+
| valor | cuándo | fuente |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| sin `color` (default) | El normal: hereda el color del texto. Casi siempre es lo que se quiere. | propuesta |
|
|
68
|
+
| `var(--sui-icon-sub-600)` | Ícono de apoyo junto a un texto principal. | propuesta |
|
|
69
|
+
| `var(--sui-icon-soft-400)` | Decorativo, metadatos. | propuesta |
|
|
70
|
+
| `var(--sui-icon-disabled-300)` | Deshabilitado. | propuesta |
|
|
71
|
+
| `var(--sui-icon-white-0)` | Sobre fondo oscuro o de color. | propuesta |
|
|
72
|
+
| un hex o un color de estado | No usar: si el ícono dice un estado, va en `sui-key-icon` `lighter`. | propuesta |
|
|
73
|
+
|
|
74
|
+
## Tamaño en mobile y en web
|
|
75
|
+
|
|
76
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
77
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
78
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
79
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
80
|
+
|
|
81
|
+
| uso | mobile | web |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| junto al texto de una fila | `20` | `16` |
|
|
84
|
+
| ícono protagonista | `32` | `24` |
|
|
85
|
+
| metadatos | `16` | `16` |
|
|
86
|
+
| dentro de un botón o un input | lo decide el componente | igual |
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<sui-icon name="store-2-line" [size]="bp.isMobile() ? 20 : 16" />
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Un ícono suelto **nunca** es el área táctil: si se toca, va en `sui-compact-button` o
|
|
93
|
+
`sui-button` `onlyIcon`, que dan los 44 px. Hoy solo 2 íconos cambian por breakpoint
|
|
94
|
+
(`pages/discounts/discounts.html:101` y `:106`, con `bp.isTablet() ? 20 : 16`).
|
|
95
|
+
|
|
96
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
97
|
+
|
|
98
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| tamaños `13`, `22`, `28`, `44`… | no hay regla que los pida | ninguno: van al más cercano de 12/16/20/24/32 |
|
|
101
|
+
| `color` con un hex | rompe el tema oscuro | ninguno |
|
|
102
|
+
| `<i class="ri-…">` o SVG pegado | se salta el componente | ninguno |
|
|
103
|
+
|
|
104
|
+
## API
|
|
105
|
+
|
|
106
|
+
<!-- api:inicio -->
|
|
107
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
108
|
+
|
|
109
|
+
| input | tipo | default |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `name` | `string` | — (requerido) |
|
|
112
|
+
| `size` | `number \| string` | `20` |
|
|
113
|
+
| `color` | `string` | `''` |
|
|
114
|
+
|
|
115
|
+
Outputs: ninguno.
|
|
116
|
+
<!-- api:fin -->
|
|
117
|
+
|
|
118
|
+
## Trampas
|
|
119
|
+
|
|
120
|
+
- **`name` va sin el prefijo `ri-`**: `name="store-2-line"`, no `ri-store-2-line`.
|
|
121
|
+
- **`size` acepta número o string**: `[size]="20"` son px; `size="1.25em"` es CSS. Con
|
|
122
|
+
`size="20"` (string sin unidad) el ícono no toma tamaño.
|
|
123
|
+
- **El nombre no se valida**: si no existe en RemixIcon, sale vacío sin error.
|
|
124
|
+
- **No tiene `aria-label`**: los propios del DS llevan `aria-hidden`; los de RemixIcon son un
|
|
125
|
+
`<i>` vacío. Si el ícono es lo único que dice algo, el texto va al lado o en el contenedor.
|
|
126
|
+
- **La app necesita la fuente de RemixIcon** (`remixicon/fonts/remixicon.css` en `styles.scss`):
|
|
127
|
+
el paquete del DS no la trae.
|
|
128
|
+
- Dentro de un `sui-kbd`, el kbd le fuerza el color `text-sub-600`.
|
|
129
|
+
|
|
130
|
+
## Ejemplo
|
|
131
|
+
|
|
132
|
+
```html
|
|
133
|
+
<sui-icon name="store-2-line" [size]="16" />
|
|
134
|
+
<sui-icon name="time-line" [size]="20" color="var(--sui-icon-sub-600)" />
|
|
135
|
+
```
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-kbd
|
|
3
|
+
selector: sui-kbd
|
|
4
|
+
resumen: Una tecla dibujada para mostrar un atajo de teclado (⌘K, Esc, ↑ ↓)
|
|
5
|
+
alternativas: [sui-badge (una etiqueta corta que no es una tecla), sui-tag (un chip)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-kbd
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Kbd](https://sui-design-system.web.app/?path=/docs/atoms-kbd--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** solo para **mostrar un atajo de teclado** en desktop: el ⌘K del buscador, el Esc para
|
|
15
|
+
cerrar, las flechas y el enter al pie de un menú.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Una etiqueta o un número: `sui-badge`.
|
|
20
|
+
- Nada en mobile: con el dedo no hay teclas.
|
|
21
|
+
|
|
22
|
+
## Qué variante usar
|
|
23
|
+
|
|
24
|
+
> **La guía del DS tiene una sola variante** (la tecla con texto) y la muestra dentro del
|
|
25
|
+
> buscador del command menu. Lo marcado «según la guía del DS» sale de ahí; el resto es
|
|
26
|
+
> **propuesta, falta aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
|
|
29
|
+
> `sui-command-menu-search`, `sui-command-menu-item`, `sui-command-menu-footer`, `sui-filter`,
|
|
30
|
+
> `sui-notification-footer` y `sui-topbar`.
|
|
31
|
+
|
|
32
|
+
### Lo que sí dice la guía del DS
|
|
33
|
+
|
|
34
|
+
- **Para qué es**: mostrar el estilo de una tecla.
|
|
35
|
+
- **Cómo es**: 20 px de alto, fondo blanco, borde `stroke-soft-200`, texto `text-soft-400`.
|
|
36
|
+
- **Dónde lo pone**: el ⌘K al lado del buscador del command menu.
|
|
37
|
+
|
|
38
|
+
### `variant`
|
|
39
|
+
|
|
40
|
+
| valor | cuándo | fuente |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `default` | Tecla con texto: ⌘K, Esc. | según la guía del DS |
|
|
43
|
+
| `subtle` | Tecla con un ícono de 16 px (flechas, enter) al pie de un menú. Extensión de SUI (sale del Figma del command menu). | propuesta |
|
|
44
|
+
|
|
45
|
+
Usos de hoy que rompen la regla: **0**.
|
|
46
|
+
|
|
47
|
+
## Tamaño en mobile y en web
|
|
48
|
+
|
|
49
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
50
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
51
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
52
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
53
|
+
|
|
54
|
+
| uso | mobile | web |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| atajo de teclado | no se muestra | tamaño único (20 px de alto) |
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
@if (!bp.isMobile()) { <sui-kbd>⌘K</sui-kbd> }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
No tiene tamaños: en mobile no hay teclado físico, así que no se pinta.
|
|
63
|
+
|
|
64
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
65
|
+
|
|
66
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| directo en una pantalla | la app se usa con el dedo | atajos del panel del super admin o del local en desktop: ⌘K para buscar, Esc para cerrar |
|
|
69
|
+
|
|
70
|
+
## API
|
|
71
|
+
|
|
72
|
+
<!-- api:inicio -->
|
|
73
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
74
|
+
|
|
75
|
+
| input | tipo | default |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `variant` | `'default' \| 'subtle'` | `'default'` |
|
|
78
|
+
|
|
79
|
+
Outputs: ninguno.
|
|
80
|
+
<!-- api:fin -->
|
|
81
|
+
|
|
82
|
+
Slot: `<ng-content>` (el texto o el `sui-icon`).
|
|
83
|
+
|
|
84
|
+
## Trampas
|
|
85
|
+
|
|
86
|
+
- **El texto sale en MAYÚSCULAS** (`text-transform: uppercase`): «esc» se ve «ESC».
|
|
87
|
+
- **`subtle` no se elige solo** al poner un ícono: hay que pedirlo.
|
|
88
|
+
- El ícono de adentro va a 16 px y toma `text-sub-600` aunque le pongas otro color.
|
|
89
|
+
- Mide 20 px de alto fijo: no crece con el texto de al lado.
|
|
90
|
+
|
|
91
|
+
## Ejemplo
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<sui-kbd>⌘K</sui-kbd>
|
|
95
|
+
|
|
96
|
+
<sui-kbd variant="subtle"><sui-icon name="arrow-up-line" [size]="16" /></sui-kbd>
|
|
97
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-key-icon
|
|
3
|
+
selector: sui-key-icon
|
|
4
|
+
resumen: Un ícono dentro de un círculo, con fondo de color si el ícono dice un estado
|
|
5
|
+
alternativas: [sui-icon (el ícono suelto), sui-avatar (cuando es una persona o un local), sui-payment-icon (el círculo ya armado para un pago de servicio)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-key-icon
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Icon/Key Icon](https://sui-design-system.web.app/?path=/docs/atoms-icon-key-icon--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** cuando un ícono tiene que **anclar** algo: el inicio de una fila, la cabecera de un
|
|
15
|
+
modal, el resultado de una acción («Cuenta bloqueada», «¡Gracias por calificar!»).
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Una persona o un local: `sui-avatar`.
|
|
20
|
+
- Un ícono dentro de un texto o un botón: `sui-icon`.
|
|
21
|
+
- Algo que se toca: no es clickeable (sin foco, sin output). Envuélvelo en la card o el botón.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
|
|
26
|
+
> aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
|
|
29
|
+
> `sui-content-label` y `sui-payment-icon`.
|
|
30
|
+
|
|
31
|
+
### `styleVariant`
|
|
32
|
+
|
|
33
|
+
| valor | cuándo | fuente |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `lighter` | El ícono dice un estado: el color del fondo **es** el significado («Cuenta bloqueada» en rojo, «Calificación enviada» en verde). | propuesta |
|
|
36
|
+
| `stroke` (default) | Ícono neutro al inicio de una fila, sobre fondo blanco. **Siempre con `color="gray"`.** | propuesta |
|
|
37
|
+
|
|
38
|
+
### `color` — mismo significado que el badge
|
|
39
|
+
|
|
40
|
+
| valor | estado de la paleta | cuándo | fuente |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| `gray` (default) | faded | Neutro. El único color para `stroke`. | propuesta |
|
|
43
|
+
| `blue` | information | Información. | propuesta |
|
|
44
|
+
| `orange` | warning | Pendiente, pide atención. | propuesta |
|
|
45
|
+
| `red` | error | Error, bloqueado, rechazado. | propuesta |
|
|
46
|
+
| `green` | success | Bien, listo, aprobado. | propuesta |
|
|
47
|
+
| `yellow` | away | En pausa. | propuesta |
|
|
48
|
+
| `purple` | feature | Novedad. | propuesta |
|
|
49
|
+
| `pink` | highlighted | Destacado. | propuesta |
|
|
50
|
+
| `teal` | verified | Verificado. | propuesta |
|
|
51
|
+
|
|
52
|
+
### `size`
|
|
53
|
+
|
|
54
|
+
| valor | ícono | cuándo | fuente |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| `32` | 20 | Filas densas. | propuesta |
|
|
57
|
+
| `40` (default) | 20 | Filas de una lista. | propuesta |
|
|
58
|
+
| `48` | 24 | Cards. | propuesta |
|
|
59
|
+
| `56` | 28 | Cabecera de un modal. | propuesta |
|
|
60
|
+
| `64` | 32 | El resultado de un modal: cuenta bloqueada, calificación enviada. | propuesta |
|
|
61
|
+
|
|
62
|
+
**Usos de hoy que romperían la propuesta: 7 círculos con ícono hechos a mano.** Dos son un
|
|
63
|
+
`sui-key-icon` `lighter` exacto: `components/cuenta-bloqueada/cuenta-bloqueada.html:4` (64 px,
|
|
64
|
+
fondo `error-lighter`) y `components/driver-rate-modal/driver-rate-modal.html:17` (64 px,
|
|
65
|
+
`success-lighter`). Los otros cinco se acercan (40–48 px, fondos neutros o `primary-alpha-10`):
|
|
66
|
+
`pages/envios/envios.html:27`, `pages/customer/mandadito/mandadito.html:255`,
|
|
67
|
+
`pages/customer/confirmation/confirmation.html:29`,
|
|
68
|
+
`pages/customer/order-tracking/order-tracking.html:487`, `pages/products/add-product/add-product.html:74`.
|
|
69
|
+
Se encontraron buscando reglas `*icon*` con `border-radius: 50%`, fondo y 32–64 px: puede haber más.
|
|
70
|
+
|
|
71
|
+
## Tamaño en mobile y en web
|
|
72
|
+
|
|
73
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
74
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
75
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
76
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
77
|
+
|
|
78
|
+
| uso | mobile | web |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| inicio de una fila | `40` | `32` |
|
|
81
|
+
| card | `48` | `40` |
|
|
82
|
+
| resultado de un modal | `64` | `56` |
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<sui-key-icon name="lock-line" styleVariant="lighter" color="red" [size]="bp.isMobile() ? 64 : 56" />
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
89
|
+
|
|
90
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| `stroke` con un color que no sea `gray` | el color solo tiñe el ícono y se confunde con `lighter` | ninguno: si el color significa algo, es `lighter` |
|
|
93
|
+
|
|
94
|
+
## API
|
|
95
|
+
|
|
96
|
+
<!-- api:inicio -->
|
|
97
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
98
|
+
|
|
99
|
+
| input | tipo | default |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `name` | `string` | — (requerido) |
|
|
102
|
+
| `styleVariant` | `'stroke' \| 'lighter'` | `'stroke'` |
|
|
103
|
+
| `color` | `'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'pink' \| 'teal'` | `'gray'` |
|
|
104
|
+
| `size` | `32 \| 40 \| 48 \| 56 \| 64` | `40` |
|
|
105
|
+
|
|
106
|
+
Outputs: ninguno.
|
|
107
|
+
<!-- api:fin -->
|
|
108
|
+
|
|
109
|
+
## Trampas
|
|
110
|
+
|
|
111
|
+
- **El estilo se llama `styleVariant`**, no `variant` ni `style` (choca con el `style` del HTML).
|
|
112
|
+
- **`size` es un número**: `[size]="48"`. Con `size="48"` (string) no compila.
|
|
113
|
+
- **El ícono no baja de 20 px**: en `32` sigue en 20 (es el Figma), en el resto es la mitad.
|
|
114
|
+
- **El default es `stroke` `gray`**: si quieres el círculo de color, pide `lighter` explícito.
|
|
115
|
+
- `name` va sin `ri-`, como en `sui-icon`.
|
|
116
|
+
|
|
117
|
+
## Ejemplo
|
|
118
|
+
|
|
119
|
+
```html
|
|
120
|
+
<!-- Resultado de un modal -->
|
|
121
|
+
<sui-key-icon name="lock-line" styleVariant="lighter" color="red" [size]="64" />
|
|
122
|
+
|
|
123
|
+
<!-- Inicio de una fila -->
|
|
124
|
+
<sui-key-icon name="store-2-line" />
|
|
125
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-link-button
|
|
3
|
+
selector: sui-link-button
|
|
4
|
+
resumen: Acción que se lee como texto, sin caja
|
|
5
|
+
alternativas: [sui-button (acción con caja: la principal o la secundaria de un grupo), sui-compact-button (solo ícono, sin texto), sui-alert (sus acciones se pasan en actions[] y ya salen como link)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-link-button
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Button/Link Button](https://sui-design-system.web.app/?path=/docs/atoms-button-link-button--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para una acción que se lee como texto: «Ver todas» en la cabecera de una sección,
|
|
15
|
+
«Omitir» o «Ahora no», «Términos y condiciones» dentro de un párrafo, «Cambiar» junto a un dato.
|
|
16
|
+
Es el reemplazo del `sui-button` `ghost` `primary`.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **La acción principal** de un grupo: `sui-button` `filled`.
|
|
21
|
+
- **Abrir una acción destructiva grande** (cancelar un pedido, rechazarlo, anular un gasto):
|
|
22
|
+
`sui-button` `stroke` `error`. El link `error` es para quitar algo menor.
|
|
23
|
+
- **Las acciones de un alert o un toast**: se pasan en `actions[]` y el componente ya las pinta
|
|
24
|
+
como link `modifiable`. No proyectes un link-button a mano dentro.
|
|
25
|
+
- **Un ícono solo**: `sui-compact-button`.
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **La guía del DS no dice cuándo usar cada variante.** Su página muestra los cinco colores,
|
|
30
|
+
> los dos tamaños, el subrayado, los íconos y el deshabilitado, sin do/don't. Las reglas de
|
|
31
|
+
> abajo son **canon (aprobado por el dueño, 03-10-2026)** salvo donde dice otra fuente.
|
|
32
|
+
>
|
|
33
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: 22 link-buttons en 17 archivos, sin
|
|
34
|
+
> contar prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`,
|
|
35
|
+
> `dx/*`, `master-rutina`, `master-medico`, `dev-index`) ni la copia local del componente en
|
|
36
|
+
> `components/sui/sui-link-button/`. Variantes: 10 `gray` (1 por default), 7 `primary`,
|
|
37
|
+
> 3 `error`, 2 `modifiable`, 0 `black`. Tamaños: 16 `medium`, 6 `small`. 8 con `leftIcon`,
|
|
38
|
+
> 4 con `rightIcon`, 4 con `href`, 2 con `underline`, 2 con `disabled`.
|
|
39
|
+
|
|
40
|
+
### Lo que sí dice la guía del DS
|
|
41
|
+
|
|
42
|
+
- **Para qué es**: botones que se integran con el texto que los rodea.
|
|
43
|
+
- **Defaults**: `gray` + `medium`. Igual que SUI.
|
|
44
|
+
- **`modifiable` no tiene color propio**: hereda el del contenedor, para que lo pinte quien lo usa.
|
|
45
|
+
- **Subrayado**: aparece al pasar el mouse; con `underline` queda fijo.
|
|
46
|
+
- **Deshabilitado**: el texto pasa a `text-disabled-300` y se va el subrayado.
|
|
47
|
+
- **Tamaños**: `large` (24 px, texto `label-md`, ícono 20; extensión SUI para mobile), `medium` (20 px, `label-sm`, ícono 20) y `small` (16 px, `label-xs`, ícono 16).
|
|
48
|
+
|
|
49
|
+
### `variant`
|
|
50
|
+
|
|
51
|
+
| variant | cuándo | ejemplo real de la app | fuente |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| `primary` | El link principal de una sección: «Ver todas», «Cambiar horario», «Descargar la app». Reemplaza al `sui-button` `ghost` `primary`. | `pages/customer/checkout/checkout.html:165` («Cambiar horario») · `pages/public/landing-business/landing-business.html:208` («Descargar la app») | canon (aprobado por el dueño, 03-10-2026) |
|
|
54
|
+
| `gray` (default) | Salida de baja jerarquía: «Omitir», «Ahora no», «Cerrar sesión», «Más información». | `pages/account-suspended/account-suspended.html:70` («Cerrar sesión») · `pages/super-admin/master-approvals/master-approvals.html:90` («Más información») | canon (aprobado por el dueño, 03-10-2026) |
|
|
55
|
+
| `black` | Un link dentro de un texto, con `underline`: «Términos y condiciones», «Ver política». | (sin uso hoy) | canon (aprobado por el dueño, 03-10-2026) |
|
|
56
|
+
| `error` | Quitar algo menor, en texto: «Quitar», «Borrar foto». Nunca para abrir una destructiva grande. | (sin uso correcto hoy) | canon (aprobado por el dueño, 03-10-2026) |
|
|
57
|
+
| `modifiable` | Toma el color del contenedor: las acciones del alert, del banner y del toast. | `components/sui/sui-toast/sui-toast-outlet.html:36` (acción del toast) · `components/subscription-banner/subscription-banner.html:10` («Renovar plan») | hereda el color: según la guía del DS · dónde va: canon (aprobado por el dueño, 03-10-2026) |
|
|
58
|
+
|
|
59
|
+
**Usos de hoy que rompen la regla:**
|
|
60
|
+
|
|
61
|
+
- **3 `error` que abren una destructiva grande → `sui-button` `stroke` `error`:**
|
|
62
|
+
`pages/super-admin/master-orders/master-orders.html:425` («Cancelar pedido»),
|
|
63
|
+
`pages/orders/orders.html:232` («Rechazar pedido»), `pages/central/central-gastos/central-gastos.html:101`
|
|
64
|
+
(«Anular gasto»).
|
|
65
|
+
- A discutir: `pages/super-admin/master-orders/master-orders.html:430` («Liberar» en `gray`): es una
|
|
66
|
+
acción de operación, no una salida de baja jerarquía.
|
|
67
|
+
|
|
68
|
+
### `size`
|
|
69
|
+
|
|
70
|
+
| size | cuándo | fuente |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `large` (24 px, texto 16, ícono 20) | Mobile, donde se lee y se toca con el dedo: el link suelto de una pantalla de teléfono. | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
|
|
73
|
+
| `medium` (20 px, default) | Lo normal: cabeceras de sección, párrafos, acciones sueltas. | default según la guía del DS; el «cuándo» es canon (aprobado por el dueño, 03-10-2026) |
|
|
74
|
+
| `small` (16 px) | Junto a un dato en una fila: «Cambiar», «Mi billetera», «Cambiar mi calificación». | canon (aprobado por el dueño, 03-10-2026) |
|
|
75
|
+
|
|
76
|
+
### `underline`
|
|
77
|
+
|
|
78
|
+
| underline | cuándo | fuente |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `false` (default) | Lo normal: la línea aparece al pasar el mouse o con foco. | según la guía del DS |
|
|
81
|
+
| `true` | Solo la **primera** acción de un alert, banner o toast, o un link dentro de un párrafo (`black`). | solo la primera subrayada: según la guía del DS (alert) · el resto: canon (aprobado por el dueño, 03-10-2026) |
|
|
82
|
+
|
|
83
|
+
### Íconos
|
|
84
|
+
|
|
85
|
+
| prop | cuándo | fuente |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `rightIcon` (`arrow-right-s-line`) | Cuando el link lleva a otra pantalla: «Ver la carta», «Mi billetera». | canon (aprobado por el dueño, 03-10-2026) |
|
|
88
|
+
| `leftIcon` | Cuando el ícono dice la acción: descargar, editar, agregar, ver. «Descargar la app», «Agregar nota para el conductor». | propuesta |
|
|
89
|
+
| los dos a la vez | No: con dos íconos el link deja de leerse como texto. | propuesta |
|
|
90
|
+
|
|
91
|
+
Los íconos son nombres RemixIcon sin el prefijo `ri-`. Miden 20 px en `large` y `medium`, y 16 px en `small`.
|
|
92
|
+
|
|
93
|
+
### `disabled`
|
|
94
|
+
|
|
95
|
+
| disabled | cuándo | fuente |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `true` | La acción existe pero ahora no se puede: mientras se guarda, mientras se procesa otra acción. Mejor que esconderla si la persona la espera en ese lugar. | cómo se ve: según la guía del DS · cuándo: propuesta |
|
|
98
|
+
|
|
99
|
+
Ejemplos: `components/add-product-modal/add-product-modal.html:330` («Vista previa» mientras guarda),
|
|
100
|
+
`pages/orders/orders.html:232`.
|
|
101
|
+
|
|
102
|
+
### `href`, `target`, `rel`, `type`, `ariaLabel`
|
|
103
|
+
|
|
104
|
+
| prop | cuándo | fuente |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `href` | Navegar, sin otra acción: el componente pinta un `<a>` real. Las rutas internas (`/cliente/…`) navegan con el Router, sin recargar. | propuesta |
|
|
107
|
+
| `target="_blank"` | Solo para destinos externos: la descarga, un documento, WhatsApp. **Pon también `rel="noopener noreferrer"`**: aquí el default de `rel` es `null`. | propuesta |
|
|
108
|
+
| `type="submit"` | Solo dentro de un `<form>`. El resto, `button` (default). | propuesta (mismo criterio que `sui-button`) |
|
|
109
|
+
| `ariaLabel` | Cuando el texto visible no basta fuera de contexto: «Descargar la app» → «Descargar la app de Master Pedidos». | propuesta |
|
|
110
|
+
|
|
111
|
+
## Tamaño en mobile y en web
|
|
112
|
+
|
|
113
|
+
En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
|
|
114
|
+
va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
115
|
+
(`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
|
|
116
|
+
`[size]="bp.isMobile() ? 'large' : 'small'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
|
|
117
|
+
9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
|
|
118
|
+
|
|
119
|
+
| size | alto | texto | ícono |
|
|
120
|
+
|---|---|---|---|
|
|
121
|
+
| `large` | 24 px | `label-md` 16/24 | 20 |
|
|
122
|
+
| `medium` (default) | 20 px | `label-sm` 14/20 | 20 |
|
|
123
|
+
| `small` | 16 px | `label-xs` 12/16 | 16 |
|
|
124
|
+
|
|
125
|
+
`large` es extensión SUI (03-10-2026); Figma trae `medium` y `small`. El ícono de `large` es 20
|
|
126
|
+
(como el `sui-button` large), no 24: con 24 el chevron pesa más que el texto.
|
|
127
|
+
|
|
128
|
+
| uso | mobile | web | fuente |
|
|
129
|
+
|---|---|---|---|
|
|
130
|
+
| link suelto (cabecera de sección, «Omitir», «Ver todas») | `large` (24) | `medium` (20) | web: canon (aprobado por el dueño, 03-10-2026) · mobile `large`: propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo (antes era `medium`) |
|
|
131
|
+
| junto a un dato en una fila («Cambiar», «Mi billetera») | `medium` (20) | `small` (16) | canon (aprobado por el dueño, 03-10-2026) |
|
|
132
|
+
| dentro de un párrafo | el del texto que lo rodea | el del texto que lo rodea | propuesta |
|
|
133
|
+
|
|
134
|
+
```html
|
|
135
|
+
<sui-link-button variant="primary" [size]="bp.isMobile() ? 'large' : 'medium'" rightIcon="arrow-right-s-line">Ver todas</sui-link-button>
|
|
136
|
+
<sui-link-button variant="gray" [size]="bp.isMobile() ? 'medium' : 'small'" rightIcon="arrow-right-s-line">Mi billetera</sui-link-button>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Ningún tamaño llega a 44 px**: el link mide 16–24 de alto y no tiene padding. En mobile el área
|
|
140
|
+
táctil la pone el contenedor: la fila o el bloque donde vive tiene que medir 44 px o más de alto, o
|
|
141
|
+
dejar aire alrededor del link. `small` (16) no va en mobile: hoy hay 6 links `small` fijos
|
|
142
|
+
(`pages/driver/driver-profile/driver-profile.html:258`, `:264`, `pages/driver/driver-dashboard/driver-dashboard.html:1089`,
|
|
143
|
+
`pages/mi-negocio/mi-negocio.html:472`, `pages/customer/order-history/order-history.html:413`,
|
|
144
|
+
`components/add-product-modal/add-product-modal.html:330`); los 4 de repartidor y cliente se usan
|
|
145
|
+
sí o sí en el teléfono → `[size]="bp.isMobile() ? 'medium' : 'small'"`.
|
|
146
|
+
|
|
147
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
148
|
+
|
|
149
|
+
Ningún valor del link-button está en «no usar»: los cinco colores, los tres tamaños y el
|
|
150
|
+
subrayado tienen un caso. `black` y `error` hoy no tienen un uso correcto en la app, pero la regla
|
|
151
|
+
de arriba dice dónde van.
|
|
152
|
+
|
|
153
|
+
## API
|
|
154
|
+
|
|
155
|
+
<!-- api:inicio -->
|
|
156
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
157
|
+
|
|
158
|
+
| input | tipo | default |
|
|
159
|
+
|---|---|---|
|
|
160
|
+
| `variant` | `'gray' \| 'black' \| 'primary' \| 'error' \| 'modifiable'` | `'gray'` |
|
|
161
|
+
| `size` | `'large' \| 'medium' \| 'small'` | `'medium'` |
|
|
162
|
+
| `underline` | `boolean` | `false` |
|
|
163
|
+
| `disabled` | `boolean` | `false` |
|
|
164
|
+
| `leftIcon` | `string \| null` | `null` |
|
|
165
|
+
| `rightIcon` | `string \| null` | `null` |
|
|
166
|
+
| `href` | `string \| null` | `null` |
|
|
167
|
+
| `target` | `string \| null` | `null` |
|
|
168
|
+
| `rel` | `string \| null` | `null` |
|
|
169
|
+
| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
|
|
170
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
171
|
+
|
|
172
|
+
| output | payload |
|
|
173
|
+
|---|---|
|
|
174
|
+
| `clicked` | `MouseEvent` |
|
|
175
|
+
<!-- api:fin -->
|
|
176
|
+
|
|
177
|
+
Slots: `<ng-content>` (el texto).
|
|
178
|
+
|
|
179
|
+
## Trampas
|
|
180
|
+
|
|
181
|
+
- **El output es `(clicked)`**, no `(click)` como en `sui-button`. `(click)` sobre el host igual
|
|
182
|
+
funciona porque el clic burbujea, pero hoy hay 6 usos así (`components/subscription-banner/subscription-banner.html:10`,
|
|
183
|
+
`pages/super-admin/master-approvals/master-approvals.html:90`, `pages/central/central-gastos/central-gastos.html:101`,
|
|
184
|
+
`pages/account-suspended/account-suspended.html:66` y `:70`, `pages/customer/viaje/viaje.html:215`).
|
|
185
|
+
Usa `(clicked)`, que ya respeta `disabled`.
|
|
186
|
+
- **`rel` arranca en `null`**, a diferencia de compact, fancy y social, que traen
|
|
187
|
+
`'noopener noreferrer'`. Con `target="_blank"` hay que ponerlo a mano.
|
|
188
|
+
- **`disabled` le gana a `href`**: deshabilitado, el componente pinta un `<button>` y el link desaparece.
|
|
189
|
+
- `modifiable` sin un `color` en el contenedor hereda el color del texto que lo rodea: sobre una
|
|
190
|
+
superficie blanca sale gris oscuro, no naranja.
|
|
191
|
+
- En hover, `primary` y `error` se oscurecen (`primary-dark`, `red-700`); con foco mantienen el
|
|
192
|
+
color base y solo se subrayan.
|
|
193
|
+
- El subrayado va solo bajo el texto, no bajo los íconos.
|
|
194
|
+
- Es `display: inline-flex` alineado a la base del texto: fluye dentro de un párrafo como un link
|
|
195
|
+
normal. Para posicionarlo suelto, lo ubica quien lo usa.
|
|
196
|
+
- En `master-pedidos` hay una **copia local** en `src/app/components/sui/sui-link-button/` (la usa el
|
|
197
|
+
toast local). No es la del paquete: un arreglo en el DS no le llega.
|
|
198
|
+
- Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
|
|
199
|
+
|
|
200
|
+
## Ejemplo
|
|
201
|
+
|
|
202
|
+
```html
|
|
203
|
+
<!-- Link principal de una sección -->
|
|
204
|
+
<sui-link-button variant="primary" (clicked)="verTodas()">Ver todas</sui-link-button>
|
|
205
|
+
|
|
206
|
+
<!-- Junto a un dato, lleva a otra pantalla -->
|
|
207
|
+
<sui-link-button variant="gray" size="small" rightIcon="arrow-right-s-line" (clicked)="irABilletera()">
|
|
208
|
+
Mi billetera
|
|
209
|
+
</sui-link-button>
|
|
210
|
+
|
|
211
|
+
<!-- Link dentro de un párrafo -->
|
|
212
|
+
<p>Al continuar aceptas la
|
|
213
|
+
<sui-link-button variant="black" [underline]="true" href="/privacidad">Política de privacidad</sui-link-button>.
|
|
214
|
+
</p>
|
|
215
|
+
|
|
216
|
+
<!-- Externo -->
|
|
217
|
+
<sui-link-button variant="primary" leftIcon="download-2-line" href="https://master-pedidos.com/descargar"
|
|
218
|
+
target="_blank" rel="noopener noreferrer" ariaLabel="Descargar la app de Master Pedidos">
|
|
219
|
+
Descargar la app
|
|
220
|
+
</sui-link-button>
|
|
221
|
+
```
|