@studiolxd/brand 47.0.0 → 47.1.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 CHANGED
@@ -7,6 +7,48 @@ 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
+ ## [47.1.0] — 2026-09-15
11
+
12
+ > **Minor.** La norma de puntuación de subtítulos y estados vacíos, fijada por escrito en
13
+ > Foundations → Redacción, con el JSDoc de `Hero`, `PageIntro` y `EmptyState` remitiendo a
14
+ > ella. Documentación y ejemplos, sin cambios de comportamiento ni de CSS de por sí — salvo
15
+ > el `fix` suelto que viaja en la misma release: un `Link` dejaba de medir su texto al ser
16
+ > ítem directo de un `Stack align="stretch"`.
17
+
18
+ ### `PageIntro` gana `eyebrow`: la ranura encima del título
19
+
20
+ Prop nueva, `eyebrow?: ReactNode`: lo que va **encima** del título —una `Tag` de estado,
21
+ una categoría, un `Breadcrumb` corto—, nunca un subtítulo ni una frase larga (para eso
22
+ sigue estando `description`). Con `actions`, el eyebrow se queda en la **columna del
23
+ título**, nunca en la de las acciones: el título y las acciones pasan a compartir fila
24
+ dentro de una nueva `.page-intro__title-group` que agrupa eyebrow y título, y las reglas
25
+ de la fila (ancho flexible, línea base, aire bajo el bloque) se mueven de `.heading` a
26
+ ese grupo. El hueco entre eyebrow y título es `--page-intro-row-gap`, el mismo que ya
27
+ separaba el título de las acciones apiladas — ningún token nuevo. Sin `eyebrow`, el
28
+ marcado es exactamente el de siempre. Story «Con eyebrow» y su test de contrato en
29
+ `Molecules/PageIntro`.
30
+
31
+ ### Redacción: subtítulo y estado vacío terminan en punto
32
+
33
+ Página nueva, `Foundations/Redacción`: todo subtítulo (`Hero.description`,
34
+ `PageIntro.description`) y toda `EmptyState.description` terminan en punto; el `title` de
35
+ `EmptyState`, los rótulos, los botones y los tags, no. Sin puntos suspensivos ni
36
+ exclamación; el signo de interrogación solo si la frase es una pregunta de verdad. El
37
+ JSDoc de las tres props afectadas remite a la página. `dataTable.empty` del catálogo de
38
+ Storybook (`.storybook/brandMessagesFixture.ts`) llevaba un punto de más: alimenta el
39
+ `title` de `EmptyState` dentro de `DataTable`, y un título no lleva punto.
40
+
41
+ ### Fix: un `Link` directo de un `Stack align="stretch"` no se estira
42
+
43
+ `Link` fijaba su color, su subrayado y su relleno pero no su ancho: como ítem de un flex en
44
+ columna con `align-items: stretch`, ocupaba todo el ancho del `Stack` y la línea de su
45
+ subrayado cruzaba la página entera —el caso de un «← Volver» sobre un `PageIntro`—. Ahora
46
+ `inline-size: fit-content` en la cara base del enlace (`a:not(.button)`, `.link`): su caja
47
+ vuelve a ser la de su texto, sin tocar el enlace suelto en un párrafo (donde `width` no
48
+ aplica a una caja `inline`) ni el centrado vertical de `Inline` (`align-items: center`),
49
+ que un `align-self` habría descuadrado. Story «El enlace dentro de una columna» en
50
+ `Atoms/Link`, con su test de contrato.
51
+
10
52
  ## [47.0.0] — 2026-09-15
11
53
 
12
54
  > **Major.** Octava familia al proveedor de textos: el cromo de aplicación y la navegació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;
@@ -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;
@@ -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;