@studiolxd/brand 41.0.0 → 41.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 +54 -0
- package/dist/_shared/tokens.js +3 -0
- package/dist/_types/atoms/Button/Button.d.ts +17 -4
- package/dist/_types/molecules/Card/Card.d.ts +13 -4
- package/dist/_types/organisms/AnnotationThread/AnnotationThread.d.ts +10 -1
- package/dist/annotation-thread.css +1 -1
- package/dist/brand.css +4 -1
- package/dist/card.css +1 -1
- package/dist/filter-bar.css +1 -1
- package/dist/tokens.css +4 -1
- package/package.json +1 -1
- package/src/tokens/molecules/annotation-thread.css +1 -0
- package/src/tokens/molecules/filter-bar.css +2 -0
- package/src/tokens/scss/molecules/_annotation-thread.scss +1 -0
- package/src/tokens/scss/molecules/_filter-bar.scss +2 -0
- package/src/tokens/tokens.json +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,60 @@ 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
|
+
## [41.1.0] — 2026-09-15
|
|
11
|
+
|
|
12
|
+
> **Minor.** El interruptor de la barra de filtros se centra con el campo que tiene al
|
|
13
|
+
> lado, el pie de una tarjeta cumple la norma de las acciones por sí solo, y `block` queda
|
|
14
|
+
> escrito como lo que es: la excepción.
|
|
15
|
+
|
|
16
|
+
### `FilterBar`: un control sin rótulo, a la altura del que sí lo lleva
|
|
17
|
+
|
|
18
|
+
Un interruptor no lleva rótulo encima y un campo sí, así que en la rejilla el interruptor
|
|
19
|
+
se pegaba arriba, a la altura de los **rótulos** en vez de a la de los **campos**. Ahora la
|
|
20
|
+
barra le reserva a esa celda el renglón del rótulo —medido por token, no a ojo— y, en el
|
|
21
|
+
espacio que queda, abre una caja de **la altura de un campo** y centra el control dentro.
|
|
22
|
+
|
|
23
|
+
Medido en Chromium: los centros de la caja del campo, del interruptor y del botón de las
|
|
24
|
+
acciones caen en el mismo píxel. La referencia es la **talla estándar del campo**, no el
|
|
25
|
+
alto real del renglón, y eso es lo que permite tener las dos cosas a la vez: un control que
|
|
26
|
+
crece hacia abajo —un selector múltiple con fichas— sigue creciendo sin mover a nadie, y
|
|
27
|
+
los rótulos siguen todos en su línea. Donde ningún filtro lleva rótulo no se reserva nada,
|
|
28
|
+
y apilado, por debajo del punto de ruptura, tampoco.
|
|
29
|
+
|
|
30
|
+
### `CardFooter` cumple la norma solo
|
|
31
|
+
|
|
32
|
+
Era la única ranura de acciones del sistema que no lo hacía: siempre una fila, con la
|
|
33
|
+
columna a pedir a mano — la prop de escape que la norma vino a quitar, mudada del botón al
|
|
34
|
+
contenedor. Ahora, por debajo de `md`, sus acciones ocupan la línea como en las otras once
|
|
35
|
+
ranuras.
|
|
36
|
+
|
|
37
|
+
`direction="column"` **se queda**, y con un significado más limpio: ya no es «acuérdate de
|
|
38
|
+
apilar en móvil», sino «apila **siempre**, también donde hay sitio» — el pie con una línea
|
|
39
|
+
de texto sobre el botón, o la tarjeta que se sabe estrecha en escritorio.
|
|
40
|
+
|
|
41
|
+
**Por qué por ventana y no por contenedor**, que es el hallazgo que merece quedar escrito:
|
|
42
|
+
se intentó como el pie de un diálogo y se midió antes de darlo por bueno. Declarar la
|
|
43
|
+
tarjeta como contenedor (`container-type: inline-size`) le quita el ancho que saca de su
|
|
44
|
+
contenido: dos tarjetas dentro de un `Inline` pasan de medir lo que mide su texto a 34px,
|
|
45
|
+
solo su propio aire. **Una tarjeta no puede ser contenedor** porque se usa de las dos
|
|
46
|
+
maneras —unas veces la estira su hueco, otras la mide su contenido—; un diálogo sí, porque
|
|
47
|
+
su ancho siempre viene de fuera. Queda en `Foundations › Puntos de ruptura` como el primer
|
|
48
|
+
límite documentado de la técnica.
|
|
49
|
+
|
|
50
|
+
### `Button.block`, escrito al derecho
|
|
51
|
+
|
|
52
|
+
Su documentación decía que era «lo que quiere un botón suelto dentro de una página», que es
|
|
53
|
+
justo la invitación a usarlo en vez de buscar la ranura. Ahora dice lo contrario, y la
|
|
54
|
+
norma tiene su mitad negativa escrita:
|
|
55
|
+
|
|
56
|
+
> Todo botón vive en una ranura de acciones. Si no hay ranura que le encaje, eso es un
|
|
57
|
+
> hueco del sistema que se reporta — no un `block` que se añade.
|
|
58
|
+
|
|
59
|
+
Con la lista de las ranuras que dan la línea entera y de las que no la dan a propósito
|
|
60
|
+
—las que viven dentro de una fila, donde estirar rompería la fila que les da sentido—.
|
|
61
|
+
`AnnotationThread` sale de la lista de dudosos: vive en un panel estrecho también en
|
|
62
|
+
escritorio, así que sus acciones ocupan la línea **siempre**, sin punto de ruptura.
|
|
63
|
+
|
|
10
64
|
## [41.0.0] — 2026-09-15
|
|
11
65
|
|
|
12
66
|
> **Major.** Segunda familia al proveedor de textos: `Table` y `DataTable` pierden sus
|
package/dist/_shared/tokens.js
CHANGED
|
@@ -2539,6 +2539,8 @@ var e = {
|
|
|
2539
2539
|
"--filter-bar-row-gap": "0.75rem",
|
|
2540
2540
|
"--filter-bar-column-min-inline-size": "12rem",
|
|
2541
2541
|
"--filter-bar-actions-gap": "0.75rem",
|
|
2542
|
+
"--filter-bar-label-offset": "calc(0.875rem * 1.5 + 0.5rem)",
|
|
2543
|
+
"--filter-bar-control-block-size": "2.5rem",
|
|
2542
2544
|
"--form-field-gap": "0.25rem",
|
|
2543
2545
|
"--image-crop-dialog-gap": "1rem",
|
|
2544
2546
|
"--image-crop-dialog-area-max-height": "60vh",
|
|
@@ -3093,6 +3095,7 @@ var e = {
|
|
|
3093
3095
|
"--annotation-thread-item-gap": "0.5rem",
|
|
3094
3096
|
"--annotation-thread-items-gap": "1rem",
|
|
3095
3097
|
"--annotation-thread-header-gap": "0.5rem",
|
|
3098
|
+
"--annotation-thread-actions-gap": "0.75rem",
|
|
3096
3099
|
"--annotation-thread-author-font-family": "\"Google Sans Flex\", system-ui, sans-serif",
|
|
3097
3100
|
"--annotation-thread-author-font-size": "0.875rem",
|
|
3098
3101
|
"--annotation-thread-author-font-weight": "500",
|
|
@@ -28,10 +28,23 @@ export interface ButtonBaseProps extends Omit<React.ComponentPropsWithoutRef<'bu
|
|
|
28
28
|
/** Size of the button */
|
|
29
29
|
size?: 'sm' | 'md' | 'lg';
|
|
30
30
|
/**
|
|
31
|
-
* Estira el botón hasta el ancho de su contenedor
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
31
|
+
* Estira el botón hasta el ancho de su contenedor (`'mobile'`, solo por
|
|
32
|
+
* debajo de `md`). **Es la excepción marcada, no el camino normal.**
|
|
33
|
+
*
|
|
34
|
+
* Todo botón vive en una **ranura de acciones**: el pie de un `Form` o de un
|
|
35
|
+
* diálogo, las `actions` de un `Alert`, de una `FilterBar`, de un `Hero`, de
|
|
36
|
+
* un `PageIntro`… Y el ancho lo decide la ranura, no el botón: la norma del
|
|
37
|
+
* sistema (Fundamentos › **Puntos de ruptura**) hace que en móvil las
|
|
38
|
+
* acciones tomen la línea entera desde el CSS del contenedor, sin prop que
|
|
39
|
+
* acordarse de pasar. Dentro de una ranura del sistema `block` no hace falta,
|
|
40
|
+
* y pasarlo es pelearse con ella.
|
|
41
|
+
*
|
|
42
|
+
* **Si no hay ranura que le encaje, eso es un hueco del sistema y se
|
|
43
|
+
* reporta** — no un `block` que se añade.
|
|
44
|
+
*
|
|
45
|
+
* Queda, entonces, para el botón que de verdad NO está en una ranura de
|
|
46
|
+
* acciones: la llamada a la acción dentro de un texto, o la fila que un
|
|
47
|
+
* producto monta a mano mientras el sistema no tiene su ranura.
|
|
35
48
|
*/
|
|
36
49
|
block?: boolean | 'mobile';
|
|
37
50
|
/**
|
|
@@ -142,11 +142,20 @@ export declare const CardAction: import("react").ForwardRefExoticComponent<Omit<
|
|
|
142
142
|
export declare const CardContent: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
143
143
|
export interface CardFooterProps extends CardPartProps {
|
|
144
144
|
/**
|
|
145
|
-
* `row` (por defecto): las acciones en fila
|
|
146
|
-
*
|
|
147
|
-
*
|
|
145
|
+
* `row` (por defecto): las acciones en fila **en escritorio**; por debajo de
|
|
146
|
+
* `md` apilan y ocupan la línea entera solas, que es la norma del sistema
|
|
147
|
+
* (Fundamentos › Puntos de ruptura) — no hay que pedirlo.
|
|
148
|
+
*
|
|
149
|
+
* `column`: apiladas y a todo el ancho **siempre, también donde hay sitio**.
|
|
150
|
+
* Es la excepción declarada, para un pie con una línea de texto sobre el
|
|
151
|
+
* botón (una nota de prueba, una condición) que debe quedar pegada a él, y
|
|
152
|
+
* para una tarjeta que se sabe estrecha en escritorio —una rejilla de tres
|
|
153
|
+
* columnas—, porque el pie mide su hueco y no la ventana.
|
|
148
154
|
*/
|
|
149
155
|
direction?: 'row' | 'column';
|
|
150
156
|
}
|
|
151
|
-
/**
|
|
157
|
+
/**
|
|
158
|
+
* Pie de la tarjeta: sus acciones. En móvil apila y da la línea entera a cada
|
|
159
|
+
* una; en escritorio, fila —salvo `direction="column"`—.
|
|
160
|
+
*/
|
|
152
161
|
export declare const CardFooter: import("react").ForwardRefExoticComponent<CardFooterProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -43,7 +43,16 @@ export interface AnnotationThreadProps extends React.ComponentPropsWithoutRef<'a
|
|
|
43
43
|
* `resolved` se retira visualmente sin desaparecer.
|
|
44
44
|
*/
|
|
45
45
|
status?: AnnotationThreadStatus;
|
|
46
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Acciones del hilo entero: resolver, reabrir, seguir. Van al pie, **una por
|
|
48
|
+
* línea y a la línea entera**, siempre: el hilo vive en un panel de revisión
|
|
49
|
+
* —una columna estrecha también en escritorio—, así que el ancho de la
|
|
50
|
+
* ventana no dice nada de lo que mide este hueco.
|
|
51
|
+
*
|
|
52
|
+
* Se pasan sueltas (`<><Button/><Button/></>`), sin envolverlas en un
|
|
53
|
+
* `Inline`: el envoltorio se llevaría la línea y los botones se quedarían a
|
|
54
|
+
* su ancho natural dentro de él.
|
|
55
|
+
*/
|
|
47
56
|
actions?: ReactNode;
|
|
48
57
|
/** Con qué se responde: un `MessageComposer`, un `TextareaField`, un `Button`. */
|
|
49
58
|
reply?: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.annotation-thread{gap:var(--annotation-thread-gap);padding-block:var(--annotation-thread-padding-block);padding-inline:var(--annotation-thread-padding-inline);border:var(--annotation-thread-border-width) var(--annotation-thread-border-style) var(--annotation-thread-border-color);flex-direction:column;display:flex}.annotation-thread.annotation-thread--acknowledged{opacity:var(--annotation-thread-acknowledged-opacity)}.annotation-thread.annotation-thread--resolved{opacity:var(--annotation-thread-resolved-opacity)}.annotation-thread__status{display:flex}.annotation-thread__item{gap:var(--annotation-thread-item-gap);flex-direction:column;display:flex}.annotation-thread__header{align-items:center;gap:var(--annotation-thread-header-gap);flex-wrap:wrap;display:flex}.annotation-thread__avatar{flex-shrink:0;display:inline-flex}.annotation-thread__author{font-family:var(--annotation-thread-author-font-family);font-size:var(--annotation-thread-author-font-size);font-weight:var(--annotation-thread-author-font-weight);color:var(--annotation-thread-author-color)}.annotation-thread__date,.annotation-thread__edited{font-size:var(--annotation-thread-meta-font-size);color:var(--annotation-thread-meta-color)}.annotation-thread__meta{align-items:center;gap:var(--annotation-thread-header-gap);overflow-wrap:anywhere;min-inline-size:0;font-size:var(--annotation-thread-meta-font-size);color:var(--annotation-thread-meta-color);flex-wrap:wrap;display:inline-flex}.annotation-thread__body{font-size:var(--annotation-thread-body-font-size);line-height:var(--annotation-thread-body-line-height);color:var(--annotation-thread-body-color)}.annotation-thread__item-actions{gap:var(--annotation-thread-header-gap);flex-wrap:wrap;display:flex}.annotation-thread__replies{gap:var(--annotation-thread-items-gap);border-inline-start:var(--annotation-thread-reply-guide-width) var(--annotation-thread-reply-guide-style) var(--annotation-thread-reply-guide-color);flex-direction:column;padding-inline-start:var(--annotation-thread-reply-indent);display:flex}.annotation-thread__replies-label{font-size:var(--annotation-thread-replies-label-font-size);color:var(--annotation-thread-replies-label-color);margin-block:0}.annotation-thread__actions{gap:var(--annotation-thread-
|
|
1
|
+
.annotation-thread{gap:var(--annotation-thread-gap);padding-block:var(--annotation-thread-padding-block);padding-inline:var(--annotation-thread-padding-inline);border:var(--annotation-thread-border-width) var(--annotation-thread-border-style) var(--annotation-thread-border-color);flex-direction:column;display:flex}.annotation-thread.annotation-thread--acknowledged{opacity:var(--annotation-thread-acknowledged-opacity)}.annotation-thread.annotation-thread--resolved{opacity:var(--annotation-thread-resolved-opacity)}.annotation-thread__status{display:flex}.annotation-thread__item{gap:var(--annotation-thread-item-gap);flex-direction:column;display:flex}.annotation-thread__header{align-items:center;gap:var(--annotation-thread-header-gap);flex-wrap:wrap;display:flex}.annotation-thread__avatar{flex-shrink:0;display:inline-flex}.annotation-thread__author{font-family:var(--annotation-thread-author-font-family);font-size:var(--annotation-thread-author-font-size);font-weight:var(--annotation-thread-author-font-weight);color:var(--annotation-thread-author-color)}.annotation-thread__date,.annotation-thread__edited{font-size:var(--annotation-thread-meta-font-size);color:var(--annotation-thread-meta-color)}.annotation-thread__meta{align-items:center;gap:var(--annotation-thread-header-gap);overflow-wrap:anywhere;min-inline-size:0;font-size:var(--annotation-thread-meta-font-size);color:var(--annotation-thread-meta-color);flex-wrap:wrap;display:inline-flex}.annotation-thread__body{font-size:var(--annotation-thread-body-font-size);line-height:var(--annotation-thread-body-line-height);color:var(--annotation-thread-body-color)}.annotation-thread__item-actions{gap:var(--annotation-thread-header-gap);flex-wrap:wrap;display:flex}.annotation-thread__replies{gap:var(--annotation-thread-items-gap);border-inline-start:var(--annotation-thread-reply-guide-width) var(--annotation-thread-reply-guide-style) var(--annotation-thread-reply-guide-color);flex-direction:column;padding-inline-start:var(--annotation-thread-reply-indent);display:flex}.annotation-thread__replies-label{font-size:var(--annotation-thread-replies-label-font-size);color:var(--annotation-thread-replies-label-color);margin-block:0}.annotation-thread__actions{align-items:stretch;gap:var(--annotation-thread-actions-gap);flex-direction:column;display:flex}.annotation-thread__actions>*{inline-size:100%}
|