@studiolxd/brand 38.16.0 → 39.0.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/CHANGELOG.md +116 -0
- package/dist/_shared/tokens.js +5 -0
- package/dist/_types/atoms/StarRating/StarRating.d.ts +87 -30
- package/dist/_types/molecules/Card/Card.d.ts +12 -1
- package/dist/_types/molecules/ConfirmDialog/ConfirmDialog.d.ts +42 -2
- package/dist/brand.css +12 -2
- package/dist/card.js +1 -2
- package/dist/chat-shell.css +1 -1
- package/dist/chat-shell.js +18 -12
- package/dist/confirm-dialog.css +1 -1
- package/dist/confirm-dialog.js +65 -42
- package/dist/star-rating.css +1 -1
- package/dist/star-rating.js +44 -30
- package/dist/tokens.css +12 -2
- package/package.json +1 -1
- package/src/tokens/components/description-list.css +1 -1
- package/src/tokens/components/star-rating.css +5 -0
- package/src/tokens/molecules/chat-shell.css +1 -0
- package/src/tokens/molecules/confirm-dialog.css +1 -0
- package/src/tokens/scss/components/_description-list.scss +1 -1
- package/src/tokens/scss/components/_star-rating.scss +3 -0
- package/src/tokens/scss/molecules/_chat-shell.scss +1 -0
- package/src/tokens/scss/molecules/_confirm-dialog.scss +1 -0
- package/src/tokens/surface-invert.css +2 -0
- package/src/tokens/surface-public.css +1 -0
- package/src/tokens/tokens.json +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,122 @@ El paquete sigue [semver](https://semver.org/lang/es/): **patch** para bug fixes
|
|
|
7
7
|
regeneración de `dist`, **minor** para componentes/props/variantes/tokens nuevos, **major**
|
|
8
8
|
para breaking changes.
|
|
9
9
|
|
|
10
|
+
## [39.0.0] — 2026-09-15
|
|
11
|
+
|
|
12
|
+
> **Major.** `StarRating` deja de traer sus textos puestos: ahora se le pasan, y el
|
|
13
|
+
> compilador lo exige. Además, la flecha de la tarjeta enlazada es opcional, el
|
|
14
|
+
> `ConfirmDialog` sabe pedir una frase de confirmación y el término de una lista de
|
|
15
|
+
> descripción deja de verse diminuto en superficie pública.
|
|
16
|
+
|
|
17
|
+
### Breaking — `StarRating`: el componente recibe su texto
|
|
18
|
+
|
|
19
|
+
Los cinco textos pasan a ser props **obligatorias y sin valor por defecto**, exigidas por
|
|
20
|
+
el tipo en cuanto el componente puede emitirlas: `valueLabel` siempre en lectura;
|
|
21
|
+
`countLabel` en cuanto se pasa `reviewCount`; `emptyLabel` en cuanto `value` puede ser
|
|
22
|
+
`null`; `optionLabel` y `groupLabel` en modo entrada. El corte lo hace el tipo, no la
|
|
23
|
+
documentación: si el valor de tu API es `number` no se te pide `emptyLabel`, y el día que
|
|
24
|
+
pase a `number | null` el compilador te lo reclama en vez de dejarte pintar cinco estrellas
|
|
25
|
+
vacías —que es el dibujo de «valorado con 0», una nota real y la peor de todas.
|
|
26
|
+
|
|
27
|
+
Van con ello otros tres cambios incompatibles: **`value` pasa a obligatorio** en lectura
|
|
28
|
+
(antes omitirlo pintaba cero estrellas, o sea un olvido disfrazado de valoración);
|
|
29
|
+
**`locale` desaparece**, porque el componente ya no escribe ninguna cifra y quien compone
|
|
30
|
+
la frase es quien la escribe; y el modo se elige con `readOnly` **literal**.
|
|
31
|
+
|
|
32
|
+
Qué hacer al actualizar: `StarRating.mdx` § «Qué se rompe al actualizar» trae el código
|
|
33
|
+
exacto de los textos que había, para copiarlos tal cual si tu app está en castellano.
|
|
34
|
+
|
|
35
|
+
> La regla del repo sobre textos de componente —prop opcional con el castellano por
|
|
36
|
+
> defecto— queda en revisión: hay ya cuatro piezas que no la cumplen, y lo que decida esa
|
|
37
|
+
> revisión se escribirá en su sitio, no aquí.
|
|
38
|
+
|
|
39
|
+
### `Card`: la flecha la manda `ctaLabel`
|
|
40
|
+
|
|
41
|
+
En modo enlace, la flecha y el nombre accesible del CTA aparecen **con `ctaLabel` y solo
|
|
42
|
+
con él**. Sin la prop no hay ninguno de los dos: una rejilla de catálogo donde cada tarjeta
|
|
43
|
+
repite la misma flecha es ruido, no señal. No hay `showArrow`/`hideArrow` — una sola cosa
|
|
44
|
+
que decidir, no dos que se puedan contradecir. Ningún consumidor del repo se ve afectado:
|
|
45
|
+
los veinte usos del modo enlace ya pasaban `ctaLabel`.
|
|
46
|
+
|
|
47
|
+
### `ConfirmDialog`: frase de confirmación
|
|
48
|
+
|
|
49
|
+
Nueva prop `confirmPhrase` —la frase exacta que hay que teclear para que la acción se
|
|
50
|
+
habilite— con `confirmPhraseLabel` y `confirmPhraseMismatch`, obligatorias en cuanto se usa
|
|
51
|
+
la primera, porque el rótulo es donde el producto dice QUÉ hay que escribir y eso el diálogo
|
|
52
|
+
no lo sabe. El botón de confirmar nace apagado; el error sale **tras un intento** —salir del
|
|
53
|
+
campo con algo escrito, o pulsar Intro—, nunca mientras se teclea, y seguir escribiendo lo
|
|
54
|
+
retira. Con la frase puesta, Intro confirma desde el propio campo. La comparación perdona
|
|
55
|
+
los espacios de los extremos y nada más: ni caja ni acentos, que es de lo que vive la
|
|
56
|
+
barrera. Con la frase, el foco entra en el campo y no en «Cancelar»: lo que la regla del
|
|
57
|
+
foco evita es que un Intro de más caiga sobre la acción que destruye, y aquí el botón nace
|
|
58
|
+
apagado.
|
|
59
|
+
|
|
60
|
+
Existía porque faltaba: tres sitios de la suite resolvían este patrón de tres maneras
|
|
61
|
+
distintas, dos dejando el botón vivo y lanzando desde `onConfirm` para que el diálogo no se
|
|
62
|
+
cerrara, y otro saltándose el `ConfirmDialog` entero para montar un `Modal` a mano.
|
|
63
|
+
|
|
64
|
+
### `DescriptionList`: el término, proporcionado en superficie pública
|
|
65
|
+
|
|
66
|
+
El bloque `.site-shell` subía el valor a `--text-font-size` (20px) y **no tocaba el
|
|
67
|
+
término**, que se quedaba en `--label-font-size` (14px): dentro de `AppShell` el par es
|
|
68
|
+
14/16 y no canta, en superficie pública era 14/20 y el término se veía diminuto al lado de
|
|
69
|
+
su valor. El término pasa a `{text.paragraph.small.font-size}`, que ES el peldaño
|
|
70
|
+
inmediatamente por debajo del valor por definición: **la superficie de aplicación queda
|
|
71
|
+
idéntica** (14/16) y la pública pasa a 16/20. Cambia el aspecto de toda ficha pública de la
|
|
72
|
+
suite que monte una `DescriptionList` dentro de un `SiteShell`, incluidas las pantallas de
|
|
73
|
+
conexión de conector.
|
|
74
|
+
|
|
75
|
+
No había ninguna historia que montara una `DescriptionList` dentro de un `SiteShell` — por
|
|
76
|
+
eso nadie lo había visto. Ahora la hay. Y `Typography.mdx` gana el escalón que le faltaba a
|
|
77
|
+
la doctrina: **«hereda un peldaño por debajo»**, entre «hereda el cuerpo» y «talla propia»,
|
|
78
|
+
donde encajan el término de la ficha, el Breadcrumb, el pie de `Figure`, la ayuda de
|
|
79
|
+
formulario y el índice del `Accordion`.
|
|
80
|
+
|
|
81
|
+
### Publicación
|
|
82
|
+
|
|
83
|
+
`scripts/publish-npm.mjs` sube el paquete con `npm stage publish` en vez de publicarlo
|
|
84
|
+
directo, y termina imprimiendo el identificador del stage: el segundo factor se difiere a
|
|
85
|
+
una persona, que aprueba con su sesión. El camino del token «Automation» queda documentado
|
|
86
|
+
como lo que es —npm está restringiendo los tokens que se saltan el 2FA— y el ritual de
|
|
87
|
+
`release:check` + tag no cambia.
|
|
88
|
+
|
|
89
|
+
## [38.17.0] — 2026-09-15
|
|
90
|
+
|
|
91
|
+
> **Minor.** En `ChatShell`, el botón que despliega el cajón de conversaciones
|
|
92
|
+
> deja de saltar: cerrado y abierto cae en el mismo punto exacto de la pantalla.
|
|
93
|
+
|
|
94
|
+
**`ChatShell` — el disparador del cajón no se mueve al desplegar.** En pantalla
|
|
95
|
+
estrecha hay dos botones gemelos con el mismo glifo: el de la cabecera, que abre
|
|
96
|
+
el cajón, y el del propio cajón, que lo cierra. La v38.15.0 ya los dejó
|
|
97
|
+
idénticos de forma —misma variante, misma talla, mismo icono— pero no de sitio,
|
|
98
|
+
porque cada uno se medía contra un origen distinto: el de la cabecera contra el
|
|
99
|
+
relleno que ponga quien monta el armazón (el armazón no tiene relleno propio: quien
|
|
100
|
+
compone, espacia) y el del cajón contra el `padding-block`, el `padding-inline` y el
|
|
101
|
+
`gap` del `Sheet`. Medido en `mobile1` con 24px de aire alrededor: cerrado caía en
|
|
102
|
+
(24,24) y abierto en (56,72) — 48px más abajo y 32 a la derecha, con la misma caja
|
|
103
|
+
de 32×32. Al plegar y desplegar, el glifo daba un salto.
|
|
104
|
+
|
|
105
|
+
Ahora el cajón **repite la misma fila `chat-shell__header`** que la columna
|
|
106
|
+
principal, con el botón dentro y la lista debajo en `chat-shell__drawer-list`;
|
|
107
|
+
`.chat-shell__drawer` anula el relleno propio del `Sheet` para que esa fila nazca
|
|
108
|
+
donde nace la cabecera, y no recorta (`overflow: visible`), que si no se comía dos
|
|
109
|
+
lados del anillo de foco. El disparador gana además `align-self: flex-start`: sin
|
|
110
|
+
eso el arreglo solo valía con cabeceras bajitas —con un título y un selector de
|
|
111
|
+
modelo, la fila crece, el botón centrado baja con ella y el del cajón se queda
|
|
112
|
+
arriba, y volvía a saltar 22px—. Anclado al arranque coinciden sea cual sea el alto
|
|
113
|
+
de la cabecera, el mismo criterio con el que el aspa de un diálogo se alinea con la
|
|
114
|
+
primera línea del título. Verificado en Chromium: (24,24,32,32) antes y después.
|
|
115
|
+
|
|
116
|
+
**Token nuevo:** `chat-shell.drawer-gap`, en cascada desde
|
|
117
|
+
`chat-shell.thread-padding-block` — la lista del cajón arranca donde arranca el
|
|
118
|
+
hilo. Ningún color nuevo.
|
|
119
|
+
|
|
120
|
+
**Para consumidores:** ninguna prop cambia. Dos efectos visibles: el disparador de
|
|
121
|
+
la cabecera pasa a ir pegado al canto superior de su fila en vez de centrado, así
|
|
122
|
+
que con cabeceras altas el glifo sube unos píxeles; y dentro del cajón hay marcado
|
|
123
|
+
nuevo (`.chat-shell__header`, `.chat-shell__drawer-list`), que afecta a quien
|
|
124
|
+
estuviera pintando a mano el interior de `.chat-shell__drawer`. `Sheet` no se toca.
|
|
125
|
+
|
|
10
126
|
## [38.16.0] — 2026-09-15
|
|
11
127
|
|
|
12
128
|
> **Minor.** La barra de filtros deja de reorganizarse mientras escribes,
|
package/dist/_shared/tokens.js
CHANGED
|
@@ -1656,7 +1656,10 @@ var e = {
|
|
|
1656
1656
|
"--star-rating-star-size": "1.25em",
|
|
1657
1657
|
"--star-rating-sm-star-size": "1em",
|
|
1658
1658
|
"--star-rating-lg-star-size": "1.5em",
|
|
1659
|
+
"--star-rating-count-gap": "0.5rem",
|
|
1659
1660
|
"--star-rating-track-color": "#6b6b6b",
|
|
1661
|
+
"--star-rating-count-color": "#4a4a4a",
|
|
1662
|
+
"--star-rating-empty-color": "#4a4a4a",
|
|
1660
1663
|
"--star-rating-fill-color": "#111e30",
|
|
1661
1664
|
"--star-rating-cursor": "pointer",
|
|
1662
1665
|
"--star-rating-disabled-cursor": "not-allowed",
|
|
@@ -2356,6 +2359,7 @@ var e = {
|
|
|
2356
2359
|
"--command-palette-item-highlighted-color": "#ffffff",
|
|
2357
2360
|
"--command-palette-item-icon-size": "1.5rem",
|
|
2358
2361
|
"--confirm-dialog-actions-space-before": "1.5rem",
|
|
2362
|
+
"--confirm-dialog-phrase-space-before": "1rem",
|
|
2359
2363
|
"--consent-banner-bg": "#ffffff",
|
|
2360
2364
|
"--consent-banner-color": "#111e30",
|
|
2361
2365
|
"--consent-banner-border-color": "#111e30",
|
|
@@ -3183,6 +3187,7 @@ var e = {
|
|
|
3183
3187
|
"--chat-shell-list-width": "15rem",
|
|
3184
3188
|
"--chat-shell-gap": "2rem",
|
|
3185
3189
|
"--chat-shell-header-gap": "0.75rem",
|
|
3190
|
+
"--chat-shell-drawer-gap": "1rem",
|
|
3186
3191
|
"--chat-shell-thread-padding-block": "1rem",
|
|
3187
3192
|
"--chat-shell-thread-padding-inline": "calc(0.75rem + 1px)",
|
|
3188
3193
|
"--chat-shell-bg": "#ffffff",
|
|
@@ -1,55 +1,112 @@
|
|
|
1
1
|
import './StarRating.css';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/** Valoración al montar, cuando la entrada no está controlada. */
|
|
6
|
-
defaultValue?: number;
|
|
7
|
-
/** Se llama con la valoración elegida. Solo en entrada (`readOnly={false}`). */
|
|
8
|
-
onValueChange?: (value: number) => void;
|
|
9
|
-
/** Cuántas estrellas tiene la escala. */
|
|
2
|
+
/** Lo que no depende del modo ni de los textos. */
|
|
3
|
+
export interface StarRatingCommonProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'onChange' | 'defaultValue'> {
|
|
4
|
+
/** Cuántas estrellas tiene la escala. Default: 5. */
|
|
10
5
|
max?: number;
|
|
6
|
+
/** Talla de la estrella, relativa al texto que la rodea. */
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
/** Se añade DESPUÉS de las clases propias. */
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* El recuento de reseñas y su rótulo viajan juntos: sin `reviewCount` no hay
|
|
13
|
+
* nada que escribir, y con él hace falta saber cómo se escribe.
|
|
14
|
+
*/
|
|
15
|
+
export type StarRatingCountProps = {
|
|
16
|
+
/**
|
|
17
|
+
* Cuántas reseñas hay detrás de la media: se pinta a continuación («(24)»)
|
|
18
|
+
* y entra en el nombre accesible. **Sin él** la nota es la de UNA reseña
|
|
19
|
+
* suelta, donde un recuento no significa nada.
|
|
20
|
+
*/
|
|
21
|
+
reviewCount?: undefined;
|
|
22
|
+
countLabel?: (reviewCount: number) => string;
|
|
23
|
+
} | {
|
|
24
|
+
/** Cuántas reseñas hay detrás de la media. Obliga a pasar `countLabel`. */
|
|
25
|
+
reviewCount: number;
|
|
26
|
+
/**
|
|
27
|
+
* Cómo se escribe el recuento visible («(24)»). **Obligatorio** con
|
|
28
|
+
* `reviewCount`: el componente no escribe texto por su cuenta.
|
|
29
|
+
*/
|
|
30
|
+
countLabel: (reviewCount: number) => string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* El valor y el texto del vacío, igual: `emptyLabel` solo se lee cuando `value`
|
|
34
|
+
* puede ser `null`, así que solo lo pide quien pueda pasarlo.
|
|
35
|
+
*/
|
|
36
|
+
export type StarRatingValueProps = {
|
|
37
|
+
/** Valoración mostrada. Se redondea a media estrella. */
|
|
38
|
+
value: number;
|
|
39
|
+
emptyLabel?: string;
|
|
40
|
+
} | {
|
|
41
|
+
/**
|
|
42
|
+
* Valoración mostrada. Se redondea a media estrella.
|
|
43
|
+
*
|
|
44
|
+
* **`null` no es cero**: es «todavía sin reseñas». Con `null` la escala no
|
|
45
|
+
* se dibuja —cinco estrellas vacías son el dibujo de «valorado con 0», que
|
|
46
|
+
* es una nota de verdad y la peor— y en su lugar va `emptyLabel`.
|
|
47
|
+
*/
|
|
48
|
+
value: number | null;
|
|
49
|
+
/**
|
|
50
|
+
* Qué se lee y se ve cuando `value` es `null`. **Obligatorio** en cuanto
|
|
51
|
+
* `value` pueda serlo: el componente no escribe «Todavía sin reseñas» por
|
|
52
|
+
* su cuenta.
|
|
53
|
+
*/
|
|
54
|
+
emptyLabel: string;
|
|
55
|
+
};
|
|
56
|
+
/** Modo lectura (el de siempre): una imagen con su nombre accesible. */
|
|
57
|
+
export type StarRatingReadProps = StarRatingCommonProps & StarRatingCountProps & StarRatingValueProps & {
|
|
11
58
|
/**
|
|
12
59
|
* Solo lectura (por defecto). El componente nace para **mostrar** una media;
|
|
13
60
|
* para capturar una valoración hay que pedirlo con `readOnly={false}`.
|
|
14
61
|
*/
|
|
15
|
-
readOnly?:
|
|
62
|
+
readOnly?: true;
|
|
63
|
+
/**
|
|
64
|
+
* Nombre accesible de la valoración: recibe el valor ya redondeado a media
|
|
65
|
+
* estrella, el máximo y, si lo hay, el recuento. Es el nombre COMPLETO —el
|
|
66
|
+
* recuento visible queda dentro de la imagen y no se lee aparte—, p. ej.
|
|
67
|
+
* «4,5 de 5 estrellas, 24 reseñas». **Obligatorio**: el nombre accesible lo
|
|
68
|
+
* pasa el consumidor.
|
|
69
|
+
*/
|
|
70
|
+
valueLabel: (value: number, max: number, reviewCount?: number) => string;
|
|
71
|
+
};
|
|
72
|
+
/** Modo entrada (`readOnly={false}`): un grupo de radios nativos. */
|
|
73
|
+
export type StarRatingInputProps = StarRatingCommonProps & {
|
|
74
|
+
/** Modo entrada. */
|
|
75
|
+
readOnly: false;
|
|
76
|
+
/** Valoración elegida, cuando la entrada está controlada. */
|
|
77
|
+
value?: number;
|
|
78
|
+
/** Valoración al montar, cuando la entrada no está controlada. */
|
|
79
|
+
defaultValue?: number;
|
|
80
|
+
/** Se llama con la valoración elegida. */
|
|
81
|
+
onValueChange?: (value: number) => void;
|
|
16
82
|
/** Deshabilita la entrada. */
|
|
17
83
|
disabled?: boolean;
|
|
18
|
-
/** Talla de la estrella, relativa al texto que la rodea. */
|
|
19
|
-
size?: 'sm' | 'md' | 'lg';
|
|
20
84
|
/** `name` de los radios que envían la valoración con el formulario. */
|
|
21
85
|
name?: string;
|
|
22
|
-
/** Idioma con el que se escribe el número del nombre accesible. */
|
|
23
|
-
locale?: string;
|
|
24
|
-
/**
|
|
25
|
-
* Nombre accesible en lectura: recibe el valor ya redondeado a media estrella
|
|
26
|
-
* y el máximo. Default: «4,5 de 5 estrellas» (castellano). Una app
|
|
27
|
-
* multiidioma debe pasarlo traducido.
|
|
28
|
-
*/
|
|
29
|
-
valueLabel?: (value: number, max: number) => string;
|
|
30
86
|
/**
|
|
31
|
-
* Nombre accesible de cada estrella elegible.
|
|
32
|
-
*
|
|
87
|
+
* Nombre accesible de cada estrella elegible, p. ej. «3 de 5 estrellas».
|
|
88
|
+
* **Obligatorio**: lo pasa el consumidor.
|
|
33
89
|
*/
|
|
34
|
-
optionLabel
|
|
90
|
+
optionLabel: (value: number, max: number) => string;
|
|
35
91
|
/**
|
|
36
|
-
* Nombre accesible del grupo
|
|
37
|
-
*
|
|
92
|
+
* Nombre accesible del grupo, p. ej. «Valoración». **Obligatorio**, igual que
|
|
93
|
+
* `optionLabel`.
|
|
38
94
|
*/
|
|
39
|
-
groupLabel
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
95
|
+
groupLabel: string;
|
|
96
|
+
};
|
|
97
|
+
export type StarRatingProps = StarRatingReadProps | StarRatingInputProps;
|
|
43
98
|
/**
|
|
44
99
|
* Valoración en estrellas, de lectura o de entrada.
|
|
45
100
|
*
|
|
46
101
|
* **En lectura** es una sola imagen: `role="img"` con el valor exacto en el
|
|
47
102
|
* nombre accesible («4,5 de 5 estrellas»), no cinco iconos que el lector tenga
|
|
48
|
-
* que contar. Admite **media estrella**, que es como se lee una media
|
|
103
|
+
* que contar. Admite **media estrella**, que es como se lee una media, y
|
|
104
|
+
* **`value={null}`** para «todavía sin reseñas», que no se dibuja con estrellas
|
|
105
|
+
* porque las estrellas vacías ya significan otra cosa.
|
|
49
106
|
*
|
|
50
107
|
* **En entrada** (`readOnly={false}`) es un grupo de radios nativos —teclado,
|
|
51
108
|
* envío de formulario y estado marcado vienen del navegador— con una estrella
|
|
52
109
|
* por opción. La entrada va en pasos enteros: la media estrella describe una
|
|
53
110
|
* media calculada, no algo que una persona elija.
|
|
54
111
|
*/
|
|
55
|
-
export declare function StarRating(
|
|
112
|
+
export declare function StarRating(props: StarRatingProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -50,7 +50,18 @@ export interface CardProps extends Omit<React.ComponentPropsWithoutRef<'div'>, '
|
|
|
50
50
|
* consumidor (varios párrafos, `<Tag>`, texto con formato…).
|
|
51
51
|
*/
|
|
52
52
|
description?: React.ReactNode;
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Texto accesible del CTA (modo link), *visually-hidden*. **Manda sobre la
|
|
55
|
+
* flecha**: con `ctaLabel` la tarjeta pinta la flecha Y su nombre accesible;
|
|
56
|
+
* sin `ctaLabel` no pinta ninguna de las dos cosas. Una sola decisión en vez
|
|
57
|
+
* de dos props que puedan contradecirse — no hay `showArrow`.
|
|
58
|
+
*
|
|
59
|
+
* Omitirlo es lo que se quiere en una rejilla de catálogo, donde la flecha
|
|
60
|
+
* repetida en cada tarjeta es ruido y el destino ya lo dice el título. Con
|
|
61
|
+
* él, en cambio, la tarjeta suelta de marketing gana la llamada visible y el
|
|
62
|
+
* enlace un nombre accesible completo («Ver más sobre plataformas LMS»)
|
|
63
|
+
* cuando lo único visible sería la flecha.
|
|
64
|
+
*/
|
|
54
65
|
ctaLabel?: string;
|
|
55
66
|
/** Color de fondo. Default: `'outline'`. */
|
|
56
67
|
color?: CardColor;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
2
|
import { type ModalProps } from '../Modal/Modal';
|
|
3
3
|
import './ConfirmDialog.css';
|
|
4
|
-
export interface
|
|
4
|
+
export interface ConfirmDialogBaseProps {
|
|
5
5
|
open: boolean;
|
|
6
6
|
/** Título del diálogo: la pregunta, no «Confirmar». */
|
|
7
7
|
title: string;
|
|
@@ -67,6 +67,42 @@ export interface ConfirmDialogProps {
|
|
|
67
67
|
/** Se añade DESPUÉS de las clases propias del pie del diálogo. */
|
|
68
68
|
className?: string;
|
|
69
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* La frase de confirmación y sus dos textos viajan juntos: sin `confirmPhrase`
|
|
72
|
+
* no hay campo que rotular ni discrepancia que contar, y con ella los dos
|
|
73
|
+
* textos los pasa el producto —dicen QUÉ hay que teclear—, así que no llevan
|
|
74
|
+
* default castellano.
|
|
75
|
+
*/
|
|
76
|
+
export type ConfirmDialogPhraseProps = {
|
|
77
|
+
/**
|
|
78
|
+
* Exige teclear una frase exacta —el nombre de la organización, el del
|
|
79
|
+
* plugin— antes de poder confirmar. El botón de confirmar nace apagado y
|
|
80
|
+
* solo se enciende cuando lo tecleado coincide.
|
|
81
|
+
*/
|
|
82
|
+
confirmPhrase?: undefined;
|
|
83
|
+
confirmPhraseLabel?: string;
|
|
84
|
+
confirmPhraseMismatch?: string;
|
|
85
|
+
} | {
|
|
86
|
+
/**
|
|
87
|
+
* La frase exacta que hay que teclear para poder confirmar. Se compara
|
|
88
|
+
* sin los espacios de los extremos —un espacio pegado al pegar no es un
|
|
89
|
+
* error de la persona— pero sin tocar nada más: ni la caja ni los
|
|
90
|
+
* acentos, que es de lo que vive esta barrera.
|
|
91
|
+
*/
|
|
92
|
+
confirmPhrase: string;
|
|
93
|
+
/**
|
|
94
|
+
* Rótulo del campo. **Obligatorio** con `confirmPhrase`, sin default: es
|
|
95
|
+
* donde el producto dice qué hay que teclear («Escribe *acme* para
|
|
96
|
+
* confirmar»), y eso el diálogo no lo sabe.
|
|
97
|
+
*/
|
|
98
|
+
confirmPhraseLabel: string;
|
|
99
|
+
/**
|
|
100
|
+
* Mensaje cuando lo tecleado no coincide. **Obligatorio** con
|
|
101
|
+
* `confirmPhrase`, sin default, por lo mismo.
|
|
102
|
+
*/
|
|
103
|
+
confirmPhraseMismatch: string;
|
|
104
|
+
};
|
|
105
|
+
export type ConfirmDialogProps = ConfirmDialogBaseProps & ConfirmDialogPhraseProps;
|
|
70
106
|
/**
|
|
71
107
|
* La pregunta antes de una acción que no se puede deshacer: borrar una
|
|
72
108
|
* organización, revocar una clave, expulsar a alguien de un equipo.
|
|
@@ -80,5 +116,9 @@ export interface ConfirmDialogProps {
|
|
|
80
116
|
* queda abierto y ocupado —no se cierra en falso ni deja pulsar dos veces— y
|
|
81
117
|
* se cierra solo al resolver. Si rechaza, sigue abierto: el error lo cuenta el
|
|
82
118
|
* consumidor, que es quien sabe qué ha pasado.
|
|
119
|
+
*
|
|
120
|
+
* Con `confirmPhrase` monta además la **barrera de teclear el identificador**
|
|
121
|
+
* —el patrón de «escribe el nombre de la organización para borrarla»—: un campo
|
|
122
|
+
* bajo la pregunta y el botón de confirmar apagado hasta que coincida.
|
|
83
123
|
*/
|
|
84
|
-
export declare function ConfirmDialog({ open, title, description, children, onConfirm, onCancel, onConfirmError, secondaryActionLabel, onSecondaryAction, destructive, confirmLabel, cancelLabel, pendingLabel, closeLabel, container, className, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
124
|
+
export declare function ConfirmDialog({ open, title, description, children, onConfirm, onCancel, onConfirmError, secondaryActionLabel, onSecondaryAction, destructive, confirmLabel, cancelLabel, pendingLabel, closeLabel, confirmPhrase, confirmPhraseLabel, confirmPhraseMismatch, container, className, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|