@studiolxd/brand 49.2.0 → 49.3.1

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,56 @@ 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
+ ## [49.3.1] — 2026-09-17
11
+
12
+ > **Patch.** La v49.0.1 estrechó a `:where(.link)` el `inline-size: fit-content` que evita
13
+ > que un enlace suelto se estire dentro de un `Stack` — necesario para no encoger el `<a>`
14
+ > que es pieza de otro componente (`menu__item`, `card`…). Pero dejó fuera el `<a>` de un
15
+ > router de Server Component sin `class="link"` (el `Link` de next-intl, p. ej., que en RSC
16
+ > no admite `render` sobre el `Link` de brand sin romper el prerender): el «← Volver» sobre
17
+ > un `PageIntro` seguía necesitando un `Inline` envolvente para no estirar su subrayado por
18
+ > toda la página.
19
+
20
+ ### El arreglo
21
+
22
+ Nueva regla en `Link.css`, `:where(.stack > a:not([class]))`, aparte de `:where(.link)`:
23
+ solo alcanza al `<a>` que es hijo DIRECTO de un `Stack` y no lleva ninguna clase. El `<a>`
24
+ que es pieza de otro componente trae siempre su propia clase BEM (barrido en la v49.0.1),
25
+ así que queda fuera sin tocarlo. Story de contrato nueva (`tags: ['!dev']`) en
26
+ `Atoms/Stack` — «enlace suelto sin clase, hijo directo de un Stack, no se estira» — con el
27
+ caso del «← Volver» sobre un `PageIntro` dentro de un `Stack align="stretch"`.
28
+
29
+ ## [49.3.0] — 2026-09-17
30
+
31
+ > **Minor.** Norma de redacción cerrada para el estado vacío: `EmptyState.title` nunca
32
+ > lleva punto, ni siquiera cuando el aviso son dos frases —esa se parte entre `title` y
33
+ > `description`—, y `DataTable`/`ConversationList` reciben `emptyDescription` para poder
34
+ > hacer esa partición desde fuera.
35
+
36
+ ### El porqué
37
+
38
+ La regla de Redacción ya decía que `title` no lleva punto y que `description` sí, pero no
39
+ cerraba el caso de un aviso de dos frases («Aún no hay perfiles. Crea uno para recibir
40
+ avisos de licitaciones que encajen con el perfil.»): sin una norma explícita, ese texto
41
+ podía acabar entero en `title`, con un punto interior y dos frases donde solo cabe un
42
+ rótulo. Y aunque la norma estuviera clara, `DataTable` y `ConversationList` —los dos únicos
43
+ componentes que pintan `EmptyState` por dentro— solo exponían `emptyMessage`: no había
44
+ manera de pasarles la segunda frase aunque el consumidor la tuviera.
45
+
46
+ ### El arreglo
47
+
48
+ `Foundations/Redacción` fija la partición: una sola frase va entera en `title`, sin punto;
49
+ un aviso de dos frases pone la primera en `title` (sin punto) y el resto en `description`
50
+ (con punto), nunca las dos en el título. `EmptyState.mdx` y el JSDoc de `EmptyState.title`
51
+ remiten a la regla.
52
+
53
+ `DataTable` y `ConversationList` suman `emptyDescription?: string`, sin default de
54
+ catálogo —es de producto, no de cromo—, que llega tal cual a `EmptyState.description`
55
+ junto al `emptyMessage` de siempre como `title`. Story «Vacío con descripción» y test de
56
+ contrato en los dos. De paso, el fixture de textos en inglés de Storybook traía
57
+ `dataTable.empty: 'No results.'` con un punto que incumplía la propia regla del `title`
58
+ que pinta: pasa a `'No results'`.
59
+
10
60
  ## [49.2.0] — 2026-09-16
11
61
 
12
62
  > **Minor.** `CommandPalette` deja de ser dueña exclusiva de su consulta: `onQueryChange`
@@ -68,6 +68,14 @@ export interface ConversationListProps extends Omit<React.ComponentPropsWithoutR
68
68
  * ven dos—. Solo se lee con la lista vacía.
69
69
  */
70
70
  emptyMessage?: string;
71
+ /**
72
+ * Segunda frase del `EmptyState` que la lista pinta ella misma, opcional y
73
+ * **sin default de catálogo**: es de producto, no de cromo, así que solo se
74
+ * pinta cuando esta lista tiene algo propio que añadir tras `emptyMessage`.
75
+ * Termina en punto (ver Foundations → Redacción); `emptyMessage` sigue
76
+ * siendo el rótulo, nunca lleva punto.
77
+ */
78
+ emptyDescription?: string;
71
79
  /**
72
80
  * `title` del `Alert` de error. **Sin default**: sin él, sale de
73
81
  * `conversationList.error`, y solo se lee cuando hay `error`.
@@ -5,7 +5,11 @@ 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
+ * El rótulo del estado: sin punto, nunca dos frases (ver Foundations →
10
+ * Redacción). Un aviso de dos frases se parte: la primera aquí, el resto en
11
+ * `description`.
12
+ */
9
13
  title: string;
10
14
  /** La frase que lo explica, opcional: termina en punto (ver Foundations → Redacción). */
11
15
  description?: string;
@@ -105,6 +105,14 @@ export interface DataTableProps<TData, TValue> {
105
105
  * nadie»), que un catálogo común no puede saber.
106
106
  */
107
107
  emptyMessage?: string;
108
+ /**
109
+ * Segunda frase del estado vacío, opcional y **sin default de catálogo**:
110
+ * es de producto, no de cromo, así que solo se pinta cuando esta pantalla
111
+ * tiene algo propio que añadir tras `emptyMessage`. Termina en punto (ver
112
+ * Foundations → Redacción); `emptyMessage` sigue siendo el rótulo, nunca
113
+ * lleva punto.
114
+ */
115
+ emptyDescription?: string;
108
116
  isLoading?: boolean;
109
117
  pagination?: DataTableServerPagination;
110
118
  headerLabels?: DataTableHeaderLabels;
@@ -120,4 +128,4 @@ export interface DataTableProps<TData, TValue> {
120
128
  * `BrandMessagesProvider`, y los de sus piezas de los suyos (`table`,
121
129
  * `pagination`). Las props de texto siguen ahí como anulación puntual.
122
130
  */
123
- export declare function DataTable<TData, TValue>({ columns, data, ariaLabel, ariaLabelledBy, searchColumnId, search, searchPlaceholder, searchClearLabel, toolbar, footerActions, pageSize, emptyMessage, isLoading, pagination, headerLabels, paginationLabels, className, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
131
+ export declare function DataTable<TData, TValue>({ columns, data, ariaLabel, ariaLabelledBy, searchColumnId, search, searchPlaceholder, searchClearLabel, toolbar, footerActions, pageSize, emptyMessage, emptyDescription, isLoading, pagination, headerLabels, paginationLabels, className, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;