@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.
Files changed (58) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/dist/_shared/progressbar.js +19 -18
  3. package/dist/_types/atoms/CopyableValue/CopyableValue.d.ts +4 -4
  4. package/dist/_types/atoms/DescriptionList/DescriptionList.d.ts +5 -4
  5. package/dist/_types/atoms/DotsButton/DotsButton.d.ts +15 -0
  6. package/dist/_types/atoms/ProgressBar/ProgressBar.d.ts +12 -2
  7. package/dist/_types/atoms/Slider/Slider.d.ts +19 -2
  8. package/dist/_types/atoms/Spinner/Spinner.d.ts +15 -1
  9. package/dist/_types/constants/copy-to-clipboard.d.ts +22 -0
  10. package/dist/_types/messages/BrandMessages.d.ts +35 -1
  11. package/dist/_types/messages/index.d.ts +1 -1
  12. package/dist/_types/molecules/CalendarPlanner/CalendarPlanner.d.ts +13 -3
  13. package/dist/_types/molecules/CalendarRoster/CalendarRoster.d.ts +38 -5
  14. package/dist/_types/molecules/Carousel/Carousel.d.ts +65 -13
  15. package/dist/_types/molecules/CodeBlock/CodeBlock.d.ts +20 -6
  16. package/dist/_types/molecules/ContextMenu/ContextMenu.d.ts +5 -1
  17. package/dist/_types/molecules/CopyButton/CopyButton.d.ts +5 -6
  18. package/dist/_types/molecules/EmptyState/EmptyState.d.ts +2 -0
  19. package/dist/_types/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +13 -1
  20. package/dist/_types/molecules/NotificationList/NotificationList.d.ts +33 -3
  21. package/dist/_types/molecules/PageIntro/PageIntro.d.ts +12 -7
  22. package/dist/_types/molecules/ProjectCard/ProjectCard.d.ts +14 -1
  23. package/dist/_types/molecules/Stepper/Stepper.d.ts +32 -7
  24. package/dist/_types/molecules/TreeView/TreeView.d.ts +11 -2
  25. package/dist/_types/molecules/UptimeBars/UptimeBars.d.ts +20 -2
  26. package/dist/_types/organisms/Chart/Chart.d.ts +46 -8
  27. package/dist/_types/sections/Hero/Hero.d.ts +4 -1
  28. package/dist/_types/sections/LegalFooter/LegalFooter.d.ts +13 -1
  29. package/dist/_types/templates/PublicPageShell/PublicPageShell.d.ts +15 -1
  30. package/dist/brand.css +12 -2
  31. package/dist/calendar-planner.js +47 -47
  32. package/dist/calendar-roster.js +28 -25
  33. package/dist/carousel.js +69 -67
  34. package/dist/chart.js +250 -249
  35. package/dist/code-block.js +34 -34
  36. package/dist/context-menu.js +1 -1
  37. package/dist/copy-button.js +35 -34
  38. package/dist/copyable-value.js +43 -42
  39. package/dist/description-list.js +1 -1
  40. package/dist/dots-button.js +18 -17
  41. package/dist/language-switcher.js +43 -41
  42. package/dist/legal-footer.js +21 -18
  43. package/dist/link.css +1 -1
  44. package/dist/notification-list.js +40 -38
  45. package/dist/page-intro.css +1 -1
  46. package/dist/page-intro.js +23 -17
  47. package/dist/progress-bar.js +1 -0
  48. package/dist/project-card.js +31 -30
  49. package/dist/public-page-shell.js +12 -11
  50. package/dist/slider.js +24 -23
  51. package/dist/spinner.js +19 -14
  52. package/dist/stepper.js +35 -38
  53. package/dist/tokens.css +2 -2
  54. package/dist/tree-view.js +86 -85
  55. package/dist/uptime-bars.js +54 -53
  56. package/package.json +1 -1
  57. package/src/tokens/molecules/page-intro.css +1 -1
  58. 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
- /** Nombre accesible de la región. Default: «Carrusel» (castellano). Una app multiidioma debe pasarlo traducido. */
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. Por defecto «carrusel», en
9
- * castellano: es el lector de pantalla quien lo lee, así que se traduce.
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
- /** Nombre accesible de la pista, la que recibe el foco para desplazarse con el teclado. Default: «Diapositivas» (castellano). Una app multiidioma debe pasarlo traducido. */
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
- /** Texto accesible del botón «anterior». Default: «Anterior» (castellano). Una app multiidioma debe pasarlo traducido. */
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
- /** Texto accesible del botón «siguiente». Default: «Siguiente» (castellano). Una app multiidioma debe pasarlo traducido. */
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
- /** Texto accesible del indicador n. Default: «Ir a la diapositiva N» (castellano). Una app multiidioma debe pasarlo traducido. */
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
- /** Texto accesible del botón que detiene el avance automático. Por defecto «Pausar». */
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
- /** Texto accesible del botón que reanuda el avance automático. Por defecto «Reproducir». */
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. Por defecto «Diapositiva N
44
- * de M». Lo lee el lector de pantalla: se traduce.
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. Por defecto
65
- * «diapositiva», en castellano.
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. Default: "Copiar código" (castellano).
21
- * Una app multiidioma debe pasarla traducida.
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. Default: "Copiado"
26
- * (castellano).
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, que es focalizable por tener scroll
31
- * horizontal propio. Recibe el `language` cuando lo hay. Default en castellano.
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
- /** Nombre accesible del botón. */
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. Default castellano.
17
- * @default 'Copiar'
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. Default castellano.
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). Default castellano.
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
- /** Nombre accesible del control (la etiqueta del campo). */
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
- /** Nombre accesible de la lista. **No se pinta**: el título lo pone la página. Default «Notificaciones». */
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
- /** Texto solo para lectores de pantalla que marca una fila sin leer. Default «Sin leer». */
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
- /** Rótulo del botón de marcar una fila. Default «Marcar como leída». */
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
- * **Es una frase y termina con puntuación final** —un punto, o el signo que
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
- /** Nombre accesible de la lista de etiquetas. Por defecto «Categorías». */
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
- /** Se antepone, solo para lectores de pantalla, a la etiqueta de un paso ya hecho. Default: «Completado». */
50
+ /** Anulación puntual de `stepper.completed`. */
33
51
  completed?: string;
34
- /** Ídem para el paso actual. Default: «Paso actual». */
52
+ /** Anulación puntual de `stepper.current`. */
35
53
  current?: string;
36
- /** Ídem para un paso que aún no toca. Default: «Pendiente». */
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
- /** Nombre accesible de la lista. Default: «Progreso» (castellano). */
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
- * Default: «Paso 2 de 4» (castellano).
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
- /** Textos de estado para lectores de pantalla. Todos con default castellano. */
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. Default: «Árbol» (castellano). Una app
59
- * multiidioma debe pasarlo traducido.
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
- /** Nombre accesible de la tira. Default castellano: «Disponibilidad». */
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
- /** Cómo se dice que un punto no tiene dato. Default castellano: «sin datos». */
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
- /** Título de la tabla equivalente oculta. Default: «Datos del gráfico» (castellano). */
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. Default: «Los datos
90
- * completos están en la tabla que sigue; flechas para recorrer el gráfico.»
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
- /** Encabezado de la primera columna de la tabla. Default: «Categoría» (castellano). */
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
- /** Encabezado de la columna de valores en `pie`/`donut`. Default: «Valor» (castellano). */
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
- /** Encabezado de la columna de porcentaje en `pie`/`donut`. Default: «Porcentaje» (castellano). */
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
- /** Texto cuando no hay datos. Default: «Sin datos que mostrar» (castellano). */
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
- /** La frase bajo el título, opcional: `Paragraph size="large"`. */
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
- /** Nombre accesible del `nav`. */
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