@studiolxd/brand 47.0.0 → 48.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 +170 -0
- package/dist/_shared/progressbar.js +19 -18
- package/dist/_types/atoms/CopyableValue/CopyableValue.d.ts +4 -4
- package/dist/_types/atoms/DescriptionList/DescriptionList.d.ts +5 -4
- package/dist/_types/atoms/DotsButton/DotsButton.d.ts +15 -0
- package/dist/_types/atoms/ProgressBar/ProgressBar.d.ts +12 -2
- package/dist/_types/atoms/Slider/Slider.d.ts +19 -2
- package/dist/_types/atoms/Spinner/Spinner.d.ts +15 -1
- package/dist/_types/constants/copy-to-clipboard.d.ts +22 -0
- package/dist/_types/messages/BrandMessages.d.ts +35 -1
- package/dist/_types/messages/index.d.ts +1 -1
- package/dist/_types/molecules/CalendarPlanner/CalendarPlanner.d.ts +13 -3
- package/dist/_types/molecules/CalendarRoster/CalendarRoster.d.ts +38 -5
- package/dist/_types/molecules/Carousel/Carousel.d.ts +65 -13
- package/dist/_types/molecules/CodeBlock/CodeBlock.d.ts +20 -6
- package/dist/_types/molecules/ContextMenu/ContextMenu.d.ts +5 -1
- package/dist/_types/molecules/CopyButton/CopyButton.d.ts +5 -6
- package/dist/_types/molecules/EmptyState/EmptyState.d.ts +2 -0
- package/dist/_types/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +13 -1
- package/dist/_types/molecules/NotificationList/NotificationList.d.ts +33 -3
- package/dist/_types/molecules/PageIntro/PageIntro.d.ts +12 -7
- package/dist/_types/molecules/ProjectCard/ProjectCard.d.ts +14 -1
- package/dist/_types/molecules/Stepper/Stepper.d.ts +32 -7
- package/dist/_types/molecules/TreeView/TreeView.d.ts +11 -2
- package/dist/_types/molecules/UptimeBars/UptimeBars.d.ts +20 -2
- package/dist/_types/organisms/Chart/Chart.d.ts +46 -8
- package/dist/_types/sections/Hero/Hero.d.ts +4 -1
- package/dist/_types/sections/LegalFooter/LegalFooter.d.ts +13 -1
- package/dist/_types/templates/PublicPageShell/PublicPageShell.d.ts +15 -1
- package/dist/brand.css +12 -2
- package/dist/calendar-planner.js +47 -47
- package/dist/calendar-roster.js +28 -25
- package/dist/carousel.js +69 -67
- package/dist/chart.js +250 -249
- package/dist/code-block.js +34 -34
- package/dist/context-menu.js +1 -1
- package/dist/copy-button.js +35 -34
- package/dist/copyable-value.js +43 -42
- package/dist/description-list.js +1 -1
- package/dist/dots-button.js +18 -17
- package/dist/language-switcher.js +43 -41
- package/dist/legal-footer.js +21 -18
- package/dist/link.css +1 -1
- package/dist/notification-list.js +40 -38
- package/dist/page-intro.css +1 -1
- package/dist/page-intro.js +23 -17
- package/dist/progress-bar.js +1 -0
- package/dist/project-card.js +31 -30
- package/dist/public-page-shell.js +12 -11
- package/dist/slider.js +24 -23
- package/dist/spinner.js +19 -14
- package/dist/stepper.js +35 -38
- package/dist/tokens.css +2 -2
- package/dist/tree-view.js +86 -85
- package/dist/uptime-bars.js +54 -53
- package/package.json +1 -1
- package/src/tokens/molecules/page-intro.css +1 -1
- package/src/tokens/scss/molecules/_page-intro.scss +1 -1
|
@@ -1,15 +1,52 @@
|
|
|
1
1
|
import './Carousel.css';
|
|
2
|
+
/**
|
|
3
|
+
* El cromo del carrusel: cómo se llaman la región y la pista, qué hacen sus
|
|
4
|
+
* mandos y qué se anuncia al cambiar de diapositiva. Todo cromo — dicen qué es
|
|
5
|
+
* y qué hace el carrusel, nunca qué hay dentro: el contenido de cada
|
|
6
|
+
* diapositiva lo pone quien la monta.
|
|
7
|
+
*
|
|
8
|
+
* Las dos `roleDescription` también van aquí: las lee el lector de pantalla en
|
|
9
|
+
* voz alta, así que son texto y no una palabra clave del motor.
|
|
10
|
+
*/
|
|
11
|
+
export interface CarouselMessages {
|
|
12
|
+
/** Nombre accesible de la región cuando la pantalla no le da uno propio. */
|
|
13
|
+
label: string;
|
|
14
|
+
/** `aria-roledescription` de la región: qué es esto. */
|
|
15
|
+
roleDescription: string;
|
|
16
|
+
/** Nombre accesible de la pista, la que recibe el foco para desplazarse. */
|
|
17
|
+
track: string;
|
|
18
|
+
/** Nombre accesible del botón de retroceso. */
|
|
19
|
+
previous: string;
|
|
20
|
+
/** Nombre accesible del botón de avance. */
|
|
21
|
+
next: string;
|
|
22
|
+
/** Nombre accesible del indicador n (base 0). Interpola, así que es función. */
|
|
23
|
+
indicator: (index: number) => string;
|
|
24
|
+
/** Nombre accesible del botón que detiene el avance automático. */
|
|
25
|
+
pause: string;
|
|
26
|
+
/** Nombre accesible del botón que lo reanuda. */
|
|
27
|
+
play: string;
|
|
28
|
+
/** Lo que se anuncia al cambiar de diapositiva. Interpola, así que es función. */
|
|
29
|
+
slideStatus: (index: number, total: number) => string;
|
|
30
|
+
/** `aria-roledescription` de cada diapositiva. */
|
|
31
|
+
slideRoleDescription: string;
|
|
32
|
+
}
|
|
2
33
|
export interface CarouselProps {
|
|
3
34
|
/** Las diapositivas: uno o varios `CarouselSlide`. */
|
|
4
35
|
children: React.ReactNode;
|
|
5
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Nombre accesible de la región. **Sin default**: sin él, sale de
|
|
38
|
+
* `carousel.label` del `BrandMessagesProvider`.
|
|
39
|
+
*/
|
|
6
40
|
label?: string;
|
|
7
41
|
/**
|
|
8
|
-
* Texto de `aria-roledescription` de la región.
|
|
9
|
-
*
|
|
42
|
+
* Texto de `aria-roledescription` de la región. **Sin default**: sin él,
|
|
43
|
+
* sale de `carousel.roleDescription`.
|
|
10
44
|
*/
|
|
11
45
|
roleDescription?: string;
|
|
12
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Nombre accesible de la pista, la que recibe el foco para desplazarse con
|
|
48
|
+
* el teclado. **Sin default**: sin él, sale de `carousel.track`.
|
|
49
|
+
*/
|
|
13
50
|
trackLabel?: string;
|
|
14
51
|
/**
|
|
15
52
|
* Ancho de cada diapositiva — cualquier medida CSS (`'50%'`, `'18rem'`,
|
|
@@ -29,19 +66,34 @@ export interface CarouselProps {
|
|
|
29
66
|
* movimiento automático: pararlo así es definitivo, no se reanuda solo.
|
|
30
67
|
*/
|
|
31
68
|
autoplay?: number;
|
|
32
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Texto accesible del botón «anterior». **Sin default**: sin él, sale de
|
|
71
|
+
* `carousel.previous`. Solo se lee con `controls`.
|
|
72
|
+
*/
|
|
33
73
|
prevLabel?: string;
|
|
34
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Texto accesible del botón «siguiente». **Sin default**: sin él, sale de
|
|
76
|
+
* `carousel.next`. Solo se lee con `controls`.
|
|
77
|
+
*/
|
|
35
78
|
nextLabel?: string;
|
|
36
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Texto accesible del indicador n. **Sin default**: sin él, sale de
|
|
81
|
+
* `carousel.indicator`. Solo se lee con `indicators`.
|
|
82
|
+
*/
|
|
37
83
|
indicatorLabel?: (index: number) => string;
|
|
38
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* Texto accesible del botón que detiene el avance automático. **Sin
|
|
86
|
+
* default**: sin él, sale de `carousel.pause`. Solo se lee con `autoplay`.
|
|
87
|
+
*/
|
|
39
88
|
pauseLabel?: string;
|
|
40
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* Texto accesible del botón que reanuda el avance automático. **Sin
|
|
91
|
+
* default**: sin él, sale de `carousel.play`. Solo se lee con `autoplay`.
|
|
92
|
+
*/
|
|
41
93
|
playLabel?: string;
|
|
42
94
|
/**
|
|
43
|
-
* Texto que se anuncia al cambiar de diapositiva.
|
|
44
|
-
*
|
|
95
|
+
* Texto que se anuncia al cambiar de diapositiva. **Sin default**: sin él,
|
|
96
|
+
* sale de `carousel.slideStatus`.
|
|
45
97
|
*/
|
|
46
98
|
slideStatusLabel?: (index: number, count: number) => string;
|
|
47
99
|
className?: string;
|
|
@@ -61,8 +113,8 @@ export interface CarouselProps {
|
|
|
61
113
|
export declare function Carousel({ children, label, roleDescription, trackLabel, slideSize, controls, indicators, autoplay, prevLabel, nextLabel, indicatorLabel, pauseLabel, playLabel, slideStatusLabel, className, id, }: CarouselProps): import("react/jsx-runtime").JSX.Element;
|
|
62
114
|
export interface CarouselSlideProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
63
115
|
/**
|
|
64
|
-
* Texto de `aria-roledescription` de la diapositiva.
|
|
65
|
-
*
|
|
116
|
+
* Texto de `aria-roledescription` de la diapositiva. **Sin default**: sin
|
|
117
|
+
* él, sale de `carousel.slideRoleDescription` del `BrandMessagesProvider`.
|
|
66
118
|
*/
|
|
67
119
|
roleDescription?: string;
|
|
68
120
|
children: React.ReactNode;
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import './CodeBlock.css';
|
|
2
|
+
/**
|
|
3
|
+
* Los dos textos propios del bloque de código. El acuse de copiar **no está
|
|
4
|
+
* aquí**: es el de toda la familia y sale de `copy.copied`.
|
|
5
|
+
*/
|
|
6
|
+
export interface CodeBlockMessages {
|
|
7
|
+
/** Nombre accesible del botón de copiar. Dice qué se copia: código. */
|
|
8
|
+
copy: string;
|
|
9
|
+
/**
|
|
10
|
+
* Nombre accesible del área de código, que es focalizable por tener scroll
|
|
11
|
+
* horizontal propio. Recibe el lenguaje cuando lo hay.
|
|
12
|
+
*/
|
|
13
|
+
region: (language?: string) => string;
|
|
14
|
+
}
|
|
2
15
|
export interface CodeBlockProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
3
16
|
/** Código a mostrar. Texto plano o nodos ya resaltados por un highlighter externo. */
|
|
4
17
|
children: React.ReactNode;
|
|
@@ -17,18 +30,19 @@ export interface CodeBlockProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
|
17
30
|
*/
|
|
18
31
|
singleLine?: boolean;
|
|
19
32
|
/**
|
|
20
|
-
* aria-label del botón de copiar.
|
|
21
|
-
*
|
|
33
|
+
* aria-label del botón de copiar. **Sin default**: sin él, sale de
|
|
34
|
+
* `codeBlock.copy` del `BrandMessagesProvider`. Solo se lee con `copyable`.
|
|
22
35
|
*/
|
|
23
36
|
copyLabel?: string;
|
|
24
37
|
/**
|
|
25
|
-
* Texto que se anuncia al lector de pantalla tras copiar.
|
|
26
|
-
*
|
|
38
|
+
* Texto que se anuncia al lector de pantalla tras copiar. **Sin default**:
|
|
39
|
+
* sin él, sale de `copy.copied` —el acuse de toda la familia de copiar, no
|
|
40
|
+
* uno propio del bloque.
|
|
27
41
|
*/
|
|
28
42
|
copiedLabel?: string;
|
|
29
43
|
/**
|
|
30
|
-
* Nombre accesible del área de código
|
|
31
|
-
*
|
|
44
|
+
* Nombre accesible del área de código. Recibe el `language` cuando lo hay.
|
|
45
|
+
* **Sin default**: sin él, sale de `codeBlock.region`.
|
|
32
46
|
*/
|
|
33
47
|
codeLabel?: (language?: string) => string;
|
|
34
48
|
/** Se añade DESPUÉS de las clases propias del componente. */
|
|
@@ -14,7 +14,11 @@ export interface ContextMenuProps {
|
|
|
14
14
|
/** Talla del botón de tres puntos (talla del sistema). */
|
|
15
15
|
triggerSize?: 'sm' | 'md' | 'lg';
|
|
16
16
|
triggerOrientation?: 'horizontal' | 'vertical';
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Nombre accesible del botón. **Reenvío puro** al `DotsButton`, que lee
|
|
19
|
+
* `dotsButton.label` del `BrandMessagesProvider`: no hace falta pasarlo para
|
|
20
|
+
* traducir.
|
|
21
|
+
*/
|
|
18
22
|
label?: string;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
@@ -13,20 +13,19 @@ export interface CopyButtonProps extends Omit<ComponentPropsWithoutRef<'button'>
|
|
|
13
13
|
*/
|
|
14
14
|
children?: ReactNode;
|
|
15
15
|
/**
|
|
16
|
-
* Nombre accesible del botón.
|
|
17
|
-
*
|
|
16
|
+
* Nombre accesible del botón. **Sin default**: sin él, sale de `copy.label`
|
|
17
|
+
* del `BrandMessagesProvider`. Solo se lee cuando el botón es de solo icono
|
|
18
|
+
* —con rótulo visible, lo nombra el rótulo.
|
|
18
19
|
*/
|
|
19
20
|
label?: string;
|
|
20
21
|
/**
|
|
21
22
|
* Acuse tras copiar: se anuncia en una región viva y, si hay rótulo visible,
|
|
22
|
-
* lo sustituye mientras dura.
|
|
23
|
-
* @default 'Copiado'
|
|
23
|
+
* lo sustituye mientras dura. **Sin default**: sin él, sale de `copy.copied`.
|
|
24
24
|
*/
|
|
25
25
|
copiedLabel?: string;
|
|
26
26
|
/**
|
|
27
27
|
* Aviso cuando el portapapeles no está disponible (contexto no seguro,
|
|
28
|
-
* permiso denegado).
|
|
29
|
-
* @default 'No se pudo copiar'
|
|
28
|
+
* permiso denegado). **Sin default**: sin él, sale de `copy.error`.
|
|
30
29
|
*/
|
|
31
30
|
errorLabel?: string;
|
|
32
31
|
/** Variante del botón. */
|
|
@@ -5,7 +5,9 @@ export interface EmptyStateAction {
|
|
|
5
5
|
href?: string;
|
|
6
6
|
}
|
|
7
7
|
export interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
8
|
+
/** El rótulo del estado: sin punto (ver Foundations → Redacción). */
|
|
8
9
|
title: string;
|
|
10
|
+
/** La frase que lo explica, opcional: termina en punto (ver Foundations → Redacción). */
|
|
9
11
|
description?: string;
|
|
10
12
|
icon?: React.ReactNode;
|
|
11
13
|
action?: EmptyStateAction;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import './LanguageSwitcher.css';
|
|
3
|
+
/**
|
|
4
|
+
* El único texto del selector, y es **cromo**: cómo se llama el control. Los
|
|
5
|
+
* nombres de los idiomas **no** están aquí y no es olvido: van cada uno en su
|
|
6
|
+
* propio idioma («Español», «English») y viajan en `languages`, que son datos.
|
|
7
|
+
*/
|
|
8
|
+
export interface LanguageSwitcherMessages {
|
|
9
|
+
/** Etiqueta del control (visible en `compact`, nombre del `nav` en `list`). */
|
|
10
|
+
label: string;
|
|
11
|
+
}
|
|
3
12
|
export interface Language {
|
|
4
13
|
/** Código BCP 47 (`es`, `en`, `pt-BR`). Es el valor; en el control se muestra el nombre. */
|
|
5
14
|
code: string;
|
|
@@ -19,7 +28,10 @@ export interface LanguageSwitcherProps {
|
|
|
19
28
|
value: string;
|
|
20
29
|
/** Cambio de idioma. Qué hacer con él (enrutar, persistir) es del producto. */
|
|
21
30
|
onChange?: (code: string) => void;
|
|
22
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Nombre accesible del control (la etiqueta del campo). **Sin default**: sin
|
|
33
|
+
* él, sale de `languageSwitcher.label` del `BrandMessagesProvider`.
|
|
34
|
+
*/
|
|
23
35
|
label?: string;
|
|
24
36
|
/** `id` del control en compacto (enlaza la etiqueta). */
|
|
25
37
|
id?: string;
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import './NotificationList.css';
|
|
3
|
+
/**
|
|
4
|
+
* El cromo de la bandeja: cómo se llama la lista, cómo se marca una fila sin
|
|
5
|
+
* leer y qué dice el botón de marcarla. **Espacio propio y no el del
|
|
6
|
+
* `NotificationPanel`**: son dos piezas distintas —la bandeja a página
|
|
7
|
+
* completa y el flotante de la cabecera— y el catálogo de la suite también las
|
|
8
|
+
* tiene aparte (`notifications.inbox.*` frente a `notifications.panel.*`).
|
|
9
|
+
*
|
|
10
|
+
* Lo que cuenta cada notificación —título, cuerpo, hora ya formateada— es
|
|
11
|
+
* contenido y viaja en `items`.
|
|
12
|
+
*/
|
|
13
|
+
export interface NotificationListMessages {
|
|
14
|
+
/** Nombre accesible de la lista. No se pinta: el título lo pone la página. */
|
|
15
|
+
label: string;
|
|
16
|
+
/** Texto, solo para lectores de pantalla, que marca una fila sin leer. */
|
|
17
|
+
unread: string;
|
|
18
|
+
/** Rótulo del botón de marcar una fila como leída. */
|
|
19
|
+
markRead: string;
|
|
20
|
+
}
|
|
3
21
|
/** Una notificación tal y como la enseña la lista: ya resuelta, sin datos crudos. */
|
|
4
22
|
export interface NotificationListItem {
|
|
5
23
|
id: string;
|
|
@@ -59,11 +77,23 @@ export interface NotificationListProps {
|
|
|
59
77
|
* acciones del producto; sin ella no se pinta.
|
|
60
78
|
*/
|
|
61
79
|
onMarkRead?: (id: string) => void;
|
|
62
|
-
/**
|
|
80
|
+
/**
|
|
81
|
+
* Nombre accesible de la lista. **No se pinta**: el título lo pone la
|
|
82
|
+
* página. **Sin default**: sin él, sale de `notificationList.label` del
|
|
83
|
+
* `BrandMessagesProvider`.
|
|
84
|
+
*/
|
|
63
85
|
label?: string;
|
|
64
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* Texto solo para lectores de pantalla que marca una fila sin leer. **Sin
|
|
88
|
+
* default**: sin él, sale de `notificationList.unread`. Solo se lee cuando
|
|
89
|
+
* hay alguna fila sin leer y esa fila no trae el suyo.
|
|
90
|
+
*/
|
|
65
91
|
unreadLabel?: string;
|
|
66
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* Rótulo del botón de marcar una fila. **Sin default**: sin él, sale de
|
|
94
|
+
* `notificationList.markRead`. Solo se lee cuando hay `onMarkRead` y alguna
|
|
95
|
+
* fila sin leer.
|
|
96
|
+
*/
|
|
67
97
|
markReadLabel?: string;
|
|
68
98
|
/** Se añade DESPUÉS de las clases propias de la lista (el consumidor añade, no sustituye). */
|
|
69
99
|
className?: string;
|
|
@@ -2,16 +2,21 @@ import type { ReactNode } from 'react';
|
|
|
2
2
|
import { type HeadingProps } from '../../atoms/Heading/Heading';
|
|
3
3
|
import './PageIntro.css';
|
|
4
4
|
export interface PageIntroProps {
|
|
5
|
+
/**
|
|
6
|
+
* Encima del título: una `Tag` de estado, una categoría, un `Breadcrumb`
|
|
7
|
+
* corto. No es un subtítulo ni acepta una frase larga —para eso está
|
|
8
|
+
* `description`—, es una pieza pequeña que sitúa la página antes de
|
|
9
|
+
* nombrarla. Con `actions`, queda en la columna del título, nunca en la
|
|
10
|
+
* de las acciones.
|
|
11
|
+
*/
|
|
12
|
+
eyebrow?: ReactNode;
|
|
5
13
|
/** El título de la página: un `Heading` de nivel 1 (o el que diga `level`). */
|
|
6
14
|
title: ReactNode;
|
|
7
15
|
/**
|
|
8
16
|
* La frase bajo el título, opcional: va como entradilla (`Paragraph
|
|
9
|
-
* size="large"`, un peldaño por encima del cuerpo).
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* le toque—: no es un rótulo ni un subtítulo. Sin el punto, el párrafo se
|
|
13
|
-
* lee como un `Heading` menor y la jerarquía de la cabecera se deshace. Lo
|
|
14
|
-
* que no llegue a frase o cabe en el título, o va en `children`.
|
|
17
|
+
* size="large"`, un peldaño por encima del cuerpo). Termina en punto (ver
|
|
18
|
+
* Foundations → Redacción). Lo que no llegue a frase, o cabe en el título,
|
|
19
|
+
* o va en `children`.
|
|
15
20
|
*/
|
|
16
21
|
description?: ReactNode;
|
|
17
22
|
/** Más texto bajo la frase (otro `Paragraph`, una lista…): mismo aire. */
|
|
@@ -45,4 +50,4 @@ export interface PageIntroProps {
|
|
|
45
50
|
* Con `actions` sirve además de cabecera de una sección dentro de la página
|
|
46
51
|
* (`level={2}`): el título a la izquierda y la acción principal a la derecha.
|
|
47
52
|
*/
|
|
48
|
-
export declare function PageIntro({ title, description, actions, level, size, as: Tag, className, children, }: PageIntroProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export declare function PageIntro({ eyebrow, title, description, actions, level, size, as: Tag, className, children, }: PageIntroProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,6 +3,15 @@ import { type HeadingLevel, type HeadingSize } from '../../atoms/Heading/Heading
|
|
|
3
3
|
import { type TagVariant } from '../../atoms/Tag/Tag';
|
|
4
4
|
import type { CardMedia } from '../Card/Card';
|
|
5
5
|
import './ProjectCard.css';
|
|
6
|
+
/**
|
|
7
|
+
* El único texto de la tarjeta, y es **cromo**: cómo se llama la lista de
|
|
8
|
+
* etiquetas. Las etiquetas en sí son datos y viajan en `tags`; el título y la
|
|
9
|
+
* descripción son contenido.
|
|
10
|
+
*/
|
|
11
|
+
export interface ProjectCardMessages {
|
|
12
|
+
/** Nombre accesible de la lista de etiquetas de categoría. */
|
|
13
|
+
tags: string;
|
|
14
|
+
}
|
|
6
15
|
export type { TagVariant };
|
|
7
16
|
export interface ProjectCardTag {
|
|
8
17
|
/** Clave de React. Sin ella se usa la etiqueta. */
|
|
@@ -30,7 +39,11 @@ export interface ProjectCardProps {
|
|
|
30
39
|
headingLevel?: HeadingLevel;
|
|
31
40
|
/** Talla del título. Por defecto `5` (24px). */
|
|
32
41
|
headingSize?: HeadingSize;
|
|
33
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Nombre accesible de la lista de etiquetas. **Sin default**: sin él, sale
|
|
44
|
+
* de `projectCard.tags` del `BrandMessagesProvider`. Solo se lee cuando hay
|
|
45
|
+
* etiquetas.
|
|
46
|
+
*/
|
|
34
47
|
tagsLabel?: string;
|
|
35
48
|
className?: string;
|
|
36
49
|
id?: string;
|
|
@@ -28,12 +28,30 @@ export interface StepperStep {
|
|
|
28
28
|
}
|
|
29
29
|
/** Estado de un paso dentro del flujo. Lo deduce el componente de `current`. */
|
|
30
30
|
export type StepperStatus = 'completed' | 'current' | 'pending';
|
|
31
|
+
/**
|
|
32
|
+
* El cromo del progreso: el nombre de la lista, la cuenta de la forma
|
|
33
|
+
* compacta y las tres marcas de estado que solo oye un lector de pantalla.
|
|
34
|
+
* Dicen en qué punto del flujo se está, no de qué flujo se trata: las
|
|
35
|
+
* etiquetas de cada paso son contenido y viajan en `steps`.
|
|
36
|
+
*/
|
|
37
|
+
export interface StepperMessages {
|
|
38
|
+
/** Nombre accesible de la lista de pasos. */
|
|
39
|
+
label: string;
|
|
40
|
+
/** La cuenta de la forma compacta: «Paso 2 de 4». Interpola, así que es función. */
|
|
41
|
+
compact: (current: number, total: number) => string;
|
|
42
|
+
/** Se antepone, solo para lectores de pantalla, a la etiqueta de un paso ya hecho. */
|
|
43
|
+
completed: string;
|
|
44
|
+
/** Ídem para el paso actual. */
|
|
45
|
+
current: string;
|
|
46
|
+
/** Ídem para un paso que aún no toca. */
|
|
47
|
+
pending: string;
|
|
48
|
+
}
|
|
31
49
|
export interface StepperLabels {
|
|
32
|
-
/**
|
|
50
|
+
/** Anulación puntual de `stepper.completed`. */
|
|
33
51
|
completed?: string;
|
|
34
|
-
/**
|
|
52
|
+
/** Anulación puntual de `stepper.current`. */
|
|
35
53
|
current?: string;
|
|
36
|
-
/**
|
|
54
|
+
/** Anulación puntual de `stepper.pending`. */
|
|
37
55
|
pending?: string;
|
|
38
56
|
}
|
|
39
57
|
export interface StepperProps {
|
|
@@ -47,15 +65,22 @@ export interface StepperProps {
|
|
|
47
65
|
* `reachable`; por defecto, los completados.
|
|
48
66
|
*/
|
|
49
67
|
onStepSelect?: (index: number, step: StepperStep) => void;
|
|
50
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* Nombre accesible de la lista. **Sin default**: sin él, sale de
|
|
70
|
+
* `stepper.label` del `BrandMessagesProvider`.
|
|
71
|
+
*/
|
|
51
72
|
label?: string;
|
|
52
73
|
/**
|
|
53
74
|
* El texto de la forma compacta (por debajo de `md`), donde no caben las
|
|
54
|
-
* etiquetas. Recibe el número de paso (base 1) y el total.
|
|
55
|
-
*
|
|
75
|
+
* etiquetas. Recibe el número de paso (base 1) y el total. **Sin default**:
|
|
76
|
+
* sin él, sale de `stepper.compact`.
|
|
56
77
|
*/
|
|
57
78
|
compactLabel?: (current: number, total: number) => string;
|
|
58
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Textos de estado para lectores de pantalla, clave a clave. **Sin
|
|
81
|
+
* defaults**: los que no se pasen salen de `stepper.completed`,
|
|
82
|
+
* `stepper.current` y `stepper.pending`.
|
|
83
|
+
*/
|
|
59
84
|
labels?: StepperLabels;
|
|
60
85
|
className?: string;
|
|
61
86
|
id?: string;
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
2
|
import './TreeView.css';
|
|
3
|
+
/**
|
|
4
|
+
* El único texto del árbol, y es **cromo**: el nombre genérico de la región.
|
|
5
|
+
* Qué árbol es —«Contenidos del curso»— lo dice la prop `label`, que gana.
|
|
6
|
+
*/
|
|
7
|
+
export interface TreeViewMessages {
|
|
8
|
+
/** Nombre accesible del árbol cuando la pantalla no le da uno propio. */
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
3
11
|
export interface TreeViewNode {
|
|
4
12
|
/** Identificador único en todo el árbol. */
|
|
5
13
|
id: string;
|
|
@@ -55,8 +63,9 @@ export interface TreeViewProps extends Omit<React.ComponentPropsWithoutRef<'ul'>
|
|
|
55
63
|
/** Se llama con el id del nodo elegido. */
|
|
56
64
|
onSelectedChange?: (id: string) => void;
|
|
57
65
|
/**
|
|
58
|
-
* Nombre accesible del árbol.
|
|
59
|
-
*
|
|
66
|
+
* Nombre accesible del árbol. **Sin default**: sin él, sale de
|
|
67
|
+
* `treeView.label` del `BrandMessagesProvider`, que es el nombre genérico;
|
|
68
|
+
* esta prop es la que dice de qué árbol se trata.
|
|
60
69
|
*/
|
|
61
70
|
label?: string;
|
|
62
71
|
/**
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
|
|
2
2
|
import { type UptimeBarsThresholds } from './uptimeStatus';
|
|
3
3
|
import './UptimeBars.css';
|
|
4
|
+
/**
|
|
5
|
+
* Los dos textos de la tira, y los dos son **cromo**: cómo se llama la región
|
|
6
|
+
* y cómo se dice que un punto no tiene dato. Ni las fechas ni los porcentajes
|
|
7
|
+
* pasan por aquí — son formato (`locale`) y los escribe quien pasa los puntos.
|
|
8
|
+
*/
|
|
9
|
+
export interface UptimeBarsMessages {
|
|
10
|
+
/** Nombre accesible de la tira cuando la pantalla no le da uno propio. */
|
|
11
|
+
label: string;
|
|
12
|
+
/** Cómo se dice que un punto no tiene dato (el monitor todavía no existía). */
|
|
13
|
+
noData: string;
|
|
14
|
+
}
|
|
4
15
|
export type { UptimeBarsThresholds, UptimeBarsStatus } from './uptimeStatus';
|
|
5
16
|
/** Un punto de la serie: un día, una hora, un despliegue. La tira no lo sabe. */
|
|
6
17
|
export interface UptimeBarsPoint {
|
|
@@ -23,7 +34,10 @@ export interface UptimeBarsProps extends Omit<ComponentPropsWithoutRef<'div'>, '
|
|
|
23
34
|
* tira: el dato que se lee sin mirar treinta rectángulos ni abrir un bocadillo.
|
|
24
35
|
*/
|
|
25
36
|
summary: ReactNode;
|
|
26
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Nombre accesible de la tira. **Sin default**: sin él, sale de
|
|
39
|
+
* `uptimeBars.label` del `BrandMessagesProvider`.
|
|
40
|
+
*/
|
|
27
41
|
label?: string;
|
|
28
42
|
/** Rótulo del extremo antiguo, bajo la primera barrita: «Hace 30 días». */
|
|
29
43
|
startLabel?: ReactNode;
|
|
@@ -41,7 +55,11 @@ export interface UptimeBarsProps extends Omit<ComponentPropsWithoutRef<'div'>, '
|
|
|
41
55
|
* «5 de septiembre: 100 %. Sin incidencias».
|
|
42
56
|
*/
|
|
43
57
|
pointLabel?: (point: UptimeBarsPoint, formattedValue: string | null) => string;
|
|
44
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Cómo se dice que un punto no tiene dato. **Sin default**: sin él, sale de
|
|
60
|
+
* `uptimeBars.noData`. Solo se lee cuando hay un punto sin dato y no hay
|
|
61
|
+
* `pointLabel` propio.
|
|
62
|
+
*/
|
|
45
63
|
noDataLabel?: string;
|
|
46
64
|
/**
|
|
47
65
|
* Bocadillo por barrita, con ratón y con teclado. Default `true`. Sin él las
|
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
2
|
import './Chart.css';
|
|
3
|
+
/**
|
|
4
|
+
* El cromo del gráfico: el nombre de la tabla equivalente, sus encabezados, la
|
|
5
|
+
* pista que se lee al enfocar el lienzo y el aviso de serie vacía. Dicen lo
|
|
6
|
+
* mismo en cualquier gráfico de la suite.
|
|
7
|
+
*
|
|
8
|
+
* **Lo que NO está aquí, y no es olvido:** `ariaLabel` —qué cuenta ESTE
|
|
9
|
+
* gráfico— sigue siendo obligatorio y sin default; el `title`, el `caption` y
|
|
10
|
+
* los nombres de las series son contenido; y las cifras son formato, que sale
|
|
11
|
+
* de `locale` con `Intl`.
|
|
12
|
+
*/
|
|
13
|
+
export interface ChartMessages {
|
|
14
|
+
/** Título de la tabla equivalente oculta. */
|
|
15
|
+
tableCaption: string;
|
|
16
|
+
/** Frase que describe el gráfico para quien lo enfoca. */
|
|
17
|
+
tableHint: string;
|
|
18
|
+
/** Encabezado de la primera columna de la tabla. */
|
|
19
|
+
category: string;
|
|
20
|
+
/** Encabezado de la columna de valores en `pie`/`donut`. */
|
|
21
|
+
value: string;
|
|
22
|
+
/** Encabezado de la columna de porcentaje en `pie`/`donut`. */
|
|
23
|
+
share: string;
|
|
24
|
+
/** Texto cuando no hay datos que mostrar. */
|
|
25
|
+
empty: string;
|
|
26
|
+
}
|
|
3
27
|
export type ChartType = 'line' | 'area' | 'bar' | 'scatter' | 'pie' | 'donut' | 'funnel' | 'treemap' | 'radial-bar' | 'radar';
|
|
4
28
|
export interface ChartSeries {
|
|
5
29
|
/** Clave del valor dentro de cada fila de `data`. */
|
|
@@ -83,21 +107,35 @@ export interface ChartProps extends Omit<React.ComponentPropsWithoutRef<'figure'
|
|
|
83
107
|
valueLabels?: ChartValueLabels;
|
|
84
108
|
/** Locale con el que se formatean los números. Default `'es-ES'`. */
|
|
85
109
|
locale?: string;
|
|
86
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* Título de la tabla equivalente oculta. **Sin default**: sin él, sale de
|
|
112
|
+
* `chart.tableCaption` del `BrandMessagesProvider`.
|
|
113
|
+
*/
|
|
87
114
|
tableCaption?: string;
|
|
88
115
|
/**
|
|
89
|
-
* Frase que describe el gráfico para quien lo enfoca.
|
|
90
|
-
*
|
|
91
|
-
* (castellano).
|
|
116
|
+
* Frase que describe el gráfico para quien lo enfoca. **Sin default**: sin
|
|
117
|
+
* él, sale de `chart.tableHint`.
|
|
92
118
|
*/
|
|
93
119
|
tableHint?: string;
|
|
94
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* Encabezado de la primera columna de la tabla. **Sin default**: sin él,
|
|
122
|
+
* sale de `chart.category`.
|
|
123
|
+
*/
|
|
95
124
|
categoryLabel?: string;
|
|
96
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* Encabezado de la columna de valores en `pie`/`donut`. **Sin default**: sin
|
|
127
|
+
* él, sale de `chart.value`. Solo se lee en esos dos tipos.
|
|
128
|
+
*/
|
|
97
129
|
valueLabel?: string;
|
|
98
|
-
/**
|
|
130
|
+
/**
|
|
131
|
+
* Encabezado de la columna de porcentaje en `pie`/`donut`. **Sin default**:
|
|
132
|
+
* sin él, sale de `chart.share`. Solo se lee en esos dos tipos.
|
|
133
|
+
*/
|
|
99
134
|
shareLabel?: string;
|
|
100
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* Texto cuando no hay datos. **Sin default**: sin él, sale de `chart.empty`.
|
|
137
|
+
* Solo se lee cuando no hay nada que pintar.
|
|
138
|
+
*/
|
|
101
139
|
emptyMessage?: string;
|
|
102
140
|
/** Se añade DESPUÉS de las clases propias del componente. */
|
|
103
141
|
className?: string;
|
|
@@ -4,7 +4,10 @@ import './Hero.css';
|
|
|
4
4
|
export interface HeroProps {
|
|
5
5
|
/** El título de la portada: un `Heading` de nivel 1 a talla 10 (display). */
|
|
6
6
|
title: ReactNode;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* La frase bajo el título, opcional: `Paragraph size="large"`. Termina en
|
|
9
|
+
* punto (ver Foundations → Redacción).
|
|
10
|
+
*/
|
|
8
11
|
description?: ReactNode;
|
|
9
12
|
/** Uno o varios botones (`Button`), en fila con envoltura (`Inline`), bajo el texto. Van a talla `lg`: la escala del Hero lo pide, y el consumidor no tiene que acordarse de pasarla. */
|
|
10
13
|
actions?: ReactNode;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import { type ContainerWidth } from '../../atoms/Container/Container';
|
|
3
3
|
import './LegalFooter.css';
|
|
4
|
+
/**
|
|
5
|
+
* El único texto del pie, y es **cromo**: cómo se llama esa navegación. Los
|
|
6
|
+
* rótulos de los enlaces —aviso legal, privacidad, cookies— son datos y viajan
|
|
7
|
+
* en `links`; el `title` es el contenido de ESE pie.
|
|
8
|
+
*/
|
|
9
|
+
export interface LegalFooterMessages {
|
|
10
|
+
/** Nombre accesible del `nav` de enlaces legales. */
|
|
11
|
+
label: string;
|
|
12
|
+
}
|
|
4
13
|
export interface LegalFooterLink {
|
|
5
14
|
id: string;
|
|
6
15
|
label: string;
|
|
@@ -12,7 +21,10 @@ export type LegalFooterRenderLinkProps = {
|
|
|
12
21
|
children: ReactNode;
|
|
13
22
|
};
|
|
14
23
|
export interface LegalFooterProps {
|
|
15
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Nombre accesible del `nav`. **Sin default**: sin él, sale de
|
|
26
|
+
* `legalFooter.label` del `BrandMessagesProvider`.
|
|
27
|
+
*/
|
|
16
28
|
label?: string;
|
|
17
29
|
/** Título opcional sobre los enlaces. */
|
|
18
30
|
title?: string;
|
|
@@ -26,6 +26,18 @@ export interface PublicPageShellProps {
|
|
|
26
26
|
* lee cuando hay banda.
|
|
27
27
|
*/
|
|
28
28
|
preferencesLabel?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Medida del contenido de la banda de preferencias, tal cual la de
|
|
31
|
+
* `Container`. Por defecto `'xl'`, la misma que el `main` de una página
|
|
32
|
+
* pública corriente. Se baja a `'lg'` cuando la página entera lee a esa
|
|
33
|
+
* medida: la banda tiene que alinear con el contenido, no al revés. Lleva el
|
|
34
|
+
* prefijo de la ranura —como `mainWidth`— porque el marco tiene cuatro y un
|
|
35
|
+
* `width` pelado no diría cuál gobierna.
|
|
36
|
+
*
|
|
37
|
+
* No se resuelve anidando un `Container` dentro de `preferences`: eso dobla
|
|
38
|
+
* el relleno lateral y desalinea la banda con el `main`.
|
|
39
|
+
*/
|
|
40
|
+
preferencesWidth?: ContainerWidth;
|
|
29
41
|
/**
|
|
30
42
|
* Medida del contenido del `main`, tal cual la de `Container`. Por defecto
|
|
31
43
|
* `'xl'` (1280px), el ancho de las páginas públicas; `'full'` para que el
|
|
@@ -82,7 +94,9 @@ export interface PublicPageShellProps {
|
|
|
82
94
|
*
|
|
83
95
|
* **El `main` lleva los mismos mandos que un `Container`** (`mainWidth`,
|
|
84
96
|
* `mainSpace`, `mainFlush`), con los defaults de siempre. Es lo que permite que
|
|
85
|
-
* una portada abra con un `Hero` de lado a lado sin salirse del marco.
|
|
97
|
+
* una portada abra con un `Hero` de lado a lado sin salirse del marco. La
|
|
98
|
+
* banda de preferencias tiene el suyo, `preferencesWidth`, para que pueda
|
|
99
|
+
* alinear con un contenido más estrecho sin anidar otro `Container` dentro.
|
|
86
100
|
*/
|
|
87
101
|
/**
|
|
88
102
|
* El único texto del marco, y es **cromo**: el nombre de la banda donde viven
|