@netzi/tokens 0.1.0-beta.10
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 +965 -0
- package/LICENSE.md +33 -0
- package/README.md +1008 -0
- package/lib/brand-context.d.ts +10 -0
- package/lib/brand-context.js +65 -0
- package/lib/brand.d.ts +90 -0
- package/lib/brand.js +256 -0
- package/lib/contrast.d.ts +14 -0
- package/lib/contrast.js +34 -0
- package/package.json +56 -0
- package/public-tokens.json +460 -0
- package/styles/base.css +139 -0
- package/styles/fonts/LICENSE-FiraCode.txt +93 -0
- package/styles/fonts/LICENSE-PlusJakartaSans.txt +93 -0
- package/styles/fonts/fira-code-latin-ext.woff2 +0 -0
- package/styles/fonts/fira-code-latin.woff2 +0 -0
- package/styles/fonts/plus-jakarta-sans-latin-ext.woff2 +0 -0
- package/styles/fonts/plus-jakarta-sans-latin.woff2 +0 -0
- package/styles/fonts.css +136 -0
- package/styles/index.css +7 -0
- package/styles/tokens.css +1426 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
# @netzi/tokens
|
|
2
|
+
|
|
3
|
+
## 0.1.0-beta.10
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 2e5ff29: **Contraste del sistema y colores forzados (#150, criterio A.9).**
|
|
8
|
+
- **`prefers-contrast: more` activa el contraste alto sin que la app haga nada.** Sin
|
|
9
|
+
`data-contrast` en la página, los tokens toman los valores de `[data-contrast='high']` cuando
|
|
10
|
+
el sistema pide más contraste, también en las secciones oscuras. El atributo, con cualquier
|
|
11
|
+
valor, manda: `data-contrast="normal"` fija el normal aunque el sistema pida más. El eje de
|
|
12
|
+
contraste de la fuente DTCG declara la preferencia (`axis.system`) y el build emite cada bloque
|
|
13
|
+
de contraste alto también dentro de `@media (prefers-contrast: more)`, con la misma
|
|
14
|
+
especificidad que el original para que la cascada con el cristal no cambie.
|
|
15
|
+
- **`NetziThemeService` sigue el contraste del sistema.** Campo nuevo
|
|
16
|
+
`NetziThemeConfig.systemContrast` (por defecto `true`) y señal `resolvedContrast()`
|
|
17
|
+
(`NetziResolvedThemeContrast`: `'normal' | 'high'`). `setContrast()` fija la elección manual
|
|
18
|
+
(con `false` escribe `data-contrast="normal"`) y `reset()` vuelve a seguir al sistema. Una
|
|
19
|
+
configuración guardada antes sigue al sistema, salvo si eligió el alto. El interruptor de
|
|
20
|
+
`netzi-settings` sale encendido cuando lo pide el sistema.
|
|
21
|
+
- **Colores forzados en cada componente.** Con `forced-colors: active` (el tema de contraste de
|
|
22
|
+
Windows) cada control conserva su borde, su foco, lo elegido y lo deshabilitado con los colores
|
|
23
|
+
del sistema: lo elegido con `Highlight`/`HighlightText` (casilla, interruptor, radio,
|
|
24
|
+
segmentado, pestañas, día y hora elegidos, opción de select, phone y comandos, página actual
|
|
25
|
+
del menú y de la paginación…), lo deshabilitado con `GrayText` y el foco que era solo un halo
|
|
26
|
+
de sombra o un color de borde con un contorno. Los SVG del reloj, la gráfica y la valoración
|
|
27
|
+
se repintan con colores del sistema, porque el navegador no ajusta su `fill` ni su `stroke`;
|
|
28
|
+
las muestras de color se quedan sin ajustar, con borde del sistema.
|
|
29
|
+
|
|
30
|
+
Lo vigilan un guardián de las hojas (`colores-forzados.spec.ts`), specs de navegador con la
|
|
31
|
+
emulación de Playwright y una auditoría con colores forzados en cada ruta del playground.
|
|
32
|
+
|
|
33
|
+
- 4a9cfaa: **Con el dedo, 8 px entre objetivos táctiles vecinos (#210, criterio A.5).** Nuevo token
|
|
34
|
+
público `--netzi-touch-gap` (8 px): la separación mínima entre las zonas de toque de dos
|
|
35
|
+
objetivos con puntero táctil, que los componentes usan en su `@media (pointer: coarse)`.
|
|
36
|
+
Con ratón el aspecto no cambia.
|
|
37
|
+
|
|
38
|
+
Lo respetan la paginación (antes 4 px), las estrellas de `netzi-rating` (sus zonas se
|
|
39
|
+
tocaban), el selector de iconos, las muestras de `netzi-color`, la barra, el menú de tabla y
|
|
40
|
+
la cuadrícula de `netzi-richtext`, los chips y rejillas de `netzi-cron-picker`, las
|
|
41
|
+
pestañas, los botones de `netzi-copy` (que además miden ya 44 px), las filas de
|
|
42
|
+
`netzi-radio-group`, las columnas de hora, los chips de `netzi-tags`, el rango de fecha y
|
|
43
|
+
hora en dos líneas, las cabeceras de `netzi-accordion`, los eventos pulsables de
|
|
44
|
+
`netzi-timeline`, los pasos de `netzi-stepper` (que ya no encogen por debajo de su
|
|
45
|
+
contenido) y las cabeceras ordenables de `netzi-data-table` frente a su asa de
|
|
46
|
+
redimensionar.
|
|
47
|
+
|
|
48
|
+
Con los paneles abiertos, también los días del calendario de `netzi-date` (el panel ocupa
|
|
49
|
+
casi todo el ancho de un móvil de 360 px; más estrecho, encogen los días, no la
|
|
50
|
+
separación), su encabezado y su menú de atajos, el inicio y el fin del rango de
|
|
51
|
+
`netzi-clock`, los ítems de `netzi-menu` (que además miden 44 px), y las opciones de
|
|
52
|
+
`netzi-combobox` frente al borde de su panel, sus chips en el campo y las filas del «+n»,
|
|
53
|
+
y el buscador y «Todos/Ninguno» de `netzi-select` y el buscador de `netzi-phone`.
|
|
54
|
+
Las celdas de `netzi-otp` se separan y, si no caben en una fila, bajan a dos (3 + 3) sin
|
|
55
|
+
encoger. Con el dedo, los paneles de select, combobox, teléfono, fecha, hora y cron abren a
|
|
56
|
+
8 px de su control (6 con ratón), y uno más ancho que la pantalla menos sus márgenes (el
|
|
57
|
+
calendario a 360 px) toma el margen que le quepa en vez de salirse por un lado.
|
|
58
|
+
|
|
59
|
+
Las piezas de un control segmentado siguen tocándose, como pide la política.
|
|
60
|
+
|
|
61
|
+
- 4a9cfaa: **Una pantalla se imprime limpia** (#176, criterio B.13): sin el marco de navegación ni las capas flotantes, en claro y sin vidrio, y sin partir filas.
|
|
62
|
+
- **`@netzi/tokens`**: eje de entorno nuevo, `print` (`tokens/themes/print.tokens.json`). Reinicia el modo, el cristal y el fondo ambiental (`resets`): en `tokens.css` cada bloque que fija `data-theme`, `data-glass` o `data-ambient` va ahora dentro de `@media not print`, así que al imprimir sale el claro y opaco de siempre con el preset, el contraste y la densidad intactos, sin repetir ningún valor. En `@media print`, la raíz pierde las sombras y el desenfoque del velo, y cada duración baja a `0.01ms`. `base.css` imprime el papel en blanco, sin animaciones ni transiciones a medio camino, y con el atributo opcional `data-print-urls` (en un enlace o en un contenedor) cada enlace externo imprime su dirección detrás. Los enlaces se imprimen subrayados. La resolución DTCG (`effectiveAxes`) aplica la misma regla con el medio `print`, y el contrato de contraste se comprueba también en papel.
|
|
63
|
+
- **`@netzi/ui`**: `netzi-layout` imprime solo el contenido, a todo el ancho y con su alto natural (sin menú lateral, topbar, barra de anuncio, pestañas, barra de acciones ni enlace de saltar al contenido). No se imprimen `netzi-toaster`, `netzi-command`, el aviso de `netzi-connection-guard` ni los paneles de `netzi-popover`, `netzi-select`, `netzi-combobox`, `netzi-date`, `netzi-time`, `netzi-phone` y `netzi-cron-picker` (salvo el modo en línea); `netziTooltip` se cierra con `beforeprint`. `netzi-data-table` sale entera aunque tenga altura fija, repite el encabezado en cada página, no parte ninguna fila y deja fuera los botones de su barra, la franja de carga y el relleno de la ventana virtual (que solo imprime las filas pintadas). `netzi-descriptions` no parte un par etiqueta-valor. Un `netzi-modal` o un `netzi-drawer` abierto se imprime una vez, sin el velo y en el flujo donde está el componente, sin tapar la página (fijo se repetiría en cada hoja). Sin sombra en el botón primario ni en los pulgares de `netzi-range-slider`, y sin el menú de tablas de `netzi-richtext`. La hoja de la marca propia lleva su regla oscura en `@media not print`.
|
|
64
|
+
|
|
65
|
+
Página nueva en el playground: «Impresión» (`/impresion`).
|
|
66
|
+
|
|
67
|
+
- eb2dbaa: **Marca propia con contraste (#174).** El contrato de contraste solo se comprobaba al construir
|
|
68
|
+
los tokens y para los seis presets propios, y el README enseñaba a cambiar `--netzi-blue` a un
|
|
69
|
+
morado sin aviso: la tinta encima se quedaba en 3,35:1.
|
|
70
|
+
|
|
71
|
+
`@netzi/tokens`:
|
|
72
|
+
- Nueva entrada `@netzi/tokens/brand`, en JavaScript sin dependencias (vale en cualquier
|
|
73
|
+
framework): `deriveBrand(color)` deriva de un color los siete tokens del primario que se
|
|
74
|
+
redefinen juntos (`primary`, `primary-hover`, `primary-dark`, `primary-text`,
|
|
75
|
+
`primary-graphic`, `on-primary`, `on-primary-dark`) con texto a 4,5:1 y gráfico a 3:1 sobre
|
|
76
|
+
cada superficie y sobre el tinte, en claro y en oscuro. Si ninguna tinta llega a 4,5:1 sobre
|
|
77
|
+
el color, el relleno pasa al tono más cercano que sí (`adjusted`).
|
|
78
|
+
- `validateBrand({ light, dark })` mide una marca hecha a mano contra ese contrato y dice cada
|
|
79
|
+
par que falla (modo, tinta, fondo, ratio y mínimo; `TypeError` si falta un modo); `brandVariables` y `parseBrandColor`
|
|
80
|
+
completan la API. La fórmula del contraste es la misma del build, que ahora la importa de ahí.
|
|
81
|
+
- El README documenta el contrato y su ejemplo cumple; un test lo lee y mete lo derivado en la
|
|
82
|
+
fuente DTCG para pasarle el contrato del build.
|
|
83
|
+
|
|
84
|
+
`@netzi/ui`:
|
|
85
|
+
- `provideNetziBrand(color)` y `NetziThemeService.setBrand(color | null)` escriben la marca en
|
|
86
|
+
una hoja propia (`<style id="netzi-brand">`, con el nonce de `CSP_NONCE` si la app lo da) por
|
|
87
|
+
encima del preset: la regla clara en la raíz y la oscura en todo `[data-theme='dark']`, también
|
|
88
|
+
en las secciones oscuras anidadas. `theme.brand()` da los tokens derivados. La derivación se
|
|
89
|
+
carga con `import()` solo cuando hay marca, fuera del bloque principal. La marca es de la app:
|
|
90
|
+
no se guarda con las preferencias del usuario ni la borra `reset()`.
|
|
91
|
+
- En desarrollo (`isDevMode()`), avisa en la consola, una vez por color, si el color no es válido
|
|
92
|
+
o no puede ser el relleno tal cual, con los pares que fallaban y el tono que se aplica.
|
|
93
|
+
|
|
94
|
+
- 4a9cfaa: **Token de medida legible: `--netzi-measure` (#213).** El ancho máximo del texto corrido (un
|
|
95
|
+
párrafo, una descripción, un aviso) para que cada línea se quede en unos 40 a 75 caracteres (64
|
|
96
|
+
de mediana) en cualquier ancho de ventana (criterio C.9). Vale `33em`. Va en `em` y no en `ch`,
|
|
97
|
+
que sería lo habitual: el `ch` es el ancho del cero de la fuente que pinta en ese momento, el de
|
|
98
|
+
la fuente de respaldo mide un 21 % menos que el de Plus Jakarta Sans, y al llegar la fuente de
|
|
99
|
+
marca cada párrafo acotado cambiaba de ancho y rehacía sus líneas (criterio C.12). Se aplica al
|
|
100
|
+
texto con `max-inline-size`, nunca a la página: el hueco junto al texto lo llenan el contenido
|
|
101
|
+
auxiliar, las acciones, otro panel, la rejilla o la prosa en columnas entre párrafos; un párrafo
|
|
102
|
+
no se parte en columnas, y una descripción corta puede dejar hueco. Solo CSS: el formato DTCG no admite `em`.
|
|
103
|
+
- 4a9cfaa: **Cada duración y cada curva del kit sale de un token (#214).** Los bucles (giradores,
|
|
104
|
+
latidos, barras indeterminadas, el brillo del skeleton), el destello de error del menú y el
|
|
105
|
+
rebote de la aguja del reloj seguían escritos a mano en diez hojas.
|
|
106
|
+
|
|
107
|
+
`@netzi/tokens`:
|
|
108
|
+
- Bucles, con la duración de una vuelta: `--netzi-duration-loop-spin` (700ms, el giro de un
|
|
109
|
+
indicador de carga), `-loop-orbit` (1100ms, el anillo que recorre un ítem o una pestaña),
|
|
110
|
+
`-loop-pulse` (1200ms, el latido que sustituye al giro con movimiento reducido),
|
|
111
|
+
`-loop-sweep` (1200ms, la barra indeterminada) y `-loop-shine` (1300ms, el brillo del
|
|
112
|
+
skeleton). No cambian con `prefers-reduced-motion`: cada componente quita o sustituye su
|
|
113
|
+
bucle en su propia regla.
|
|
114
|
+
- `--netzi-duration-flash` (1400ms): un aviso que se enciende, se deja ver y se apaga solo.
|
|
115
|
+
- Curvas `--netzi-ease-swing` (la de `ease-in-out`), `--netzi-ease-spin` (la de `linear`) y
|
|
116
|
+
`--netzi-ease-settle` (`cubic-bezier(0.34, 1.45, 0.5, 1)`, un rebote sutil al asentar).
|
|
117
|
+
- Al imprimir, las nuevas duraciones bajan a `0.01ms` como las demás.
|
|
118
|
+
|
|
119
|
+
`@netzi/ui`:
|
|
120
|
+
- Las hojas usan esos tokens con el mismo valor que tenían, salvo dos redondeos al token de su
|
|
121
|
+
intención: el giro del spinner del botón pasa de 600 a 700 ms, como el resto de los
|
|
122
|
+
spinners, y la barra de progreso de la navegación de `netzi-layout`, de 1100 a 1200 ms,
|
|
123
|
+
como la de `netzi-progress`.
|
|
124
|
+
- El guardián de movimiento ya no exime los bucles ni tiene lista de excepciones: solo pasan
|
|
125
|
+
`0s` y el `0.01ms` de la regla reducida.
|
|
126
|
+
- `netzi-data-table` en scroll continuo mueve el área con el teclado en píxeles enteros: con
|
|
127
|
+
una cabecera o unas filas de alto con decimales, bajar y volver a subir lo mismo (Av Pág, ↓,
|
|
128
|
+
Re Pág, ↑) dejaba el área a un píxel de arriba.
|
|
129
|
+
- En una pantalla de hasta 640 px, el menú del engranaje de `netzi-data-table` cuenta su
|
|
130
|
+
relleno en el tope de alto: cuando no cabía entero, el panel se salía 8 px por abajo, con
|
|
131
|
+
su último apartado bajo el borde. El menú pasa a medir 300 px con su relleno (antes, 308).
|
|
132
|
+
|
|
133
|
+
- b4f64fe: **Con el dedo, los campos de formulario no bajan de 44 px** (#100, WCAG 2.5.5). Con puntero táctil (`pointer: coarse`), incluidos sus paneles abiertos (el editor de texto va aparte, en #108):
|
|
134
|
+
- Nuevo token `--netzi-touch-target` (44 px). Los controles de tamaño `sm` y `md` suben a 46 px (el borde de 1 px no le quita al input que se toca), cada densidad desde su propia base; `lg` no baja de ahí.
|
|
135
|
+
- Crecen a 44 px: casillas, radios e interruptores (la fila, o la caja si no hay texto), opciones, buscadores y «Todos/Ninguno» de `netzi-select`, opciones, chips y el «+n» de `netzi-combobox`, el buscador y las opciones de `netzi-phone`, días, flechas, título, atajos y su menú de `netzi-date` (el panel ocupa el ancho del móvil y a 320 px las columnas encogen en vez de recortarse), celdas de `netzi-time`, segmentos de `netzi-segmented`, chips y enlaces de `netzi-cron-picker`, muestras de `netzi-color`, estrellas de `netzi-rating`, la franja de los sliders, celdas de `netzi-otp`, botones −/+ e input de `netzi-number`, AM/PM, unidades y extremos de `netzi-clock`, el ojo de `netzi-password` y el campo de `netzi-tags`.
|
|
136
|
+
- Amplían la zona de toque sin mover el dibujo: las × de chips, tags y archivos, «Limpiar» de la búsqueda y del combobox, el chevrón del combobox, las ayudas (i) del cron y la barra de valor del selector de color.
|
|
137
|
+
- Para que esas zonas no se pisen: en `netzi-combobox` múltiple, «Limpiar» se aparta del chevrón algo más de un objetivo y el campo reserva a la derecha sitio para los dos (chips e input no quedan debajo); las filas de chips de `netzi-tags` se separan 10 px; la cabecera de cada campo de `netzi-cron-picker` deja sitio a la zona de su (i).
|
|
138
|
+
- `netzi-range-slider` con `showValue` reserva sitio encima para las burbujas, que tapaban la etiqueta del field (también con ratón).
|
|
139
|
+
- En pantallas táctiles estrechas, el panel de `netzi-date` con reloj apila calendario y hora (hasta 680 px), la rejilla de meses y horas del cron pasa a 4 columnas (hasta 400 px) y `netzi-color-picker` encoge hasta el ancho disponible, también dentro del popover de `netzi-color`, que a 320 px se salía 12 px por la derecha (esto último también con ratón).
|
|
140
|
+
|
|
141
|
+
**Los paneles anclados que no caben debajo abren encima** (también con ratón). Hasta ahora `netzi-time`, `netzi-date`, `netzi-select`, `netzi-combobox`, `netzi-phone` y `netzi-cron-picker` elegían el lado antes de montar el panel, sin saber cuánto mide: abrían debajo salvo que abajo quedaran menos de 160 px. El de la hora con reloj (~355 px) se salía entonces por abajo de un móvil y el dial y AM/PM no se podían tocar. Ahora, ya montado, se mide su alto entero (sin acotar): si cabe debajo, no cambia; si no cabe debajo y encima sí, abre encima; si no cabe en ningún lado, va al que tiene más sitio y se acota a él, y se desplaza por dentro. Vale para los seis: el alto máximo acota el panel entero, con su buscador y su relleno (en `netzi-phone` y `netzi-combobox` solo acotaba la lista, y a media pantalla de un móvil bajo el buscador de países quedaba por encima del borde). Por eso un select, una fecha o un cron que no caben enteros debajo (antes se encogían ahí) ahora abren encima si allí caben o hay más sitio. Con el dedo, si el buscador y «Todos/Ninguno» de `netzi-select` no dejan sitio a la lista, se desplaza el panel entero en vez de aplastarla.
|
|
142
|
+
|
|
143
|
+
Con ratón y teclado nada más cambia de tamaño. El job de accesibilidad de CI lo vigila: mide la zona de toque real de cada control de las páginas de formularios, también con los paneles abiertos y con valor (texto escrito, un archivo, chips en el campo y en el «+n»), y que ningún otro control le pise parte de ella (44 px a 360, 375, 768 y 1024 de ancho; a 320, nada recortado y 24 px), y que los paneles abiertos quepan enteros en la pantalla, también en pantallas bajas (360×640 y 740×360 con el disparador a media pantalla). Mide además con una fuente de otras métricas, para que un alto que salga del texto (y no de un mínimo explícito) no dé 44 en un sistema y menos en otro.
|
|
144
|
+
|
|
145
|
+
`netzi-date` y `netzi-time` encogen con su campo dentro de una fila flex: la hora del panel de fecha, a 320 px, empujaba el botón del reloj fuera de su caja.
|
|
146
|
+
|
|
147
|
+
- e9ac2d9: **`netzi-data-table`: barras de desplazamiento nativas y finas, y sombras de lo oculto (#117).**
|
|
148
|
+
- **Barras nativas finas** con el color de un token nuevo, `--netzi-scrollbar-thumb`
|
|
149
|
+
(`--netzi-text-2`), con su contrato de 3:1 sobre cada superficie y también sobre una fila
|
|
150
|
+
marcada (el tinte del primario, donde se pintan las barras superpuestas), en claro, en
|
|
151
|
+
oscuro, con alto contraste y en cada preset. El pulgar no baja de 24 px y con el dedo
|
|
152
|
+
(`pointer: coarse`) vuelve la barra del sistema. Van por `scrollbar-width`/`scrollbar-color` y,
|
|
153
|
+
en los motores que solo entienden la vía con prefijo, por `::-webkit-scrollbar`. No se
|
|
154
|
+
dibuja ninguna barra a mano: se arrastran, se tocan y se manejan con el teclado como
|
|
155
|
+
cualquier barra del sistema, no tapan clics en el borde y no añaden nada al árbol de
|
|
156
|
+
accesibilidad.
|
|
157
|
+
- **Sombras en los bordes solo con contenido oculto** a ese lado (inicio, final y abajo),
|
|
158
|
+
sin depender del puntero: aparecen y se van con la posición del scroll, también al
|
|
159
|
+
desplazar con el teclado. Se pintan en una capa sin puntero que termina donde empiezan las
|
|
160
|
+
barras. En RTL se invierten.
|
|
161
|
+
- **Columnas fijadas**: la sombra de su borde sale solo cuando hay contenido pasando por
|
|
162
|
+
detrás (antes estaba siempre). Con columnas fijadas a un lado, la sombra de ese lado la
|
|
163
|
+
lleva el borde fijado y no el del área.
|
|
164
|
+
- **La barra horizontal queda a la vista con una tabla alta.** Sin `maxHeight`, `fill` ni
|
|
165
|
+
`autoPageSize`, si la tabla no cabe a lo ancho su área no pasa del alto que se ve del
|
|
166
|
+
contenedor que desplaza la página (el área de contenido de `netzi-layout`, el cuerpo de
|
|
167
|
+
un modal) o, si desplaza el documento, del de la ventana. El encabezado va en el mismo
|
|
168
|
+
contenedor que el cuerpo: se desplaza a lo ancho con él y, al bajar, se queda arriba
|
|
169
|
+
(ahora el encabezado es fijo en todos los modos, no solo con altura fija o `fill`). Una
|
|
170
|
+
tabla que cabe a lo ancho conserva su alto natural.
|
|
171
|
+
- El área sigue siendo una región con nombre y una parada de Tab, y se desplaza con las
|
|
172
|
+
flechas, Re Pág, Av Pág, Inicio y Fin (nativo del navegador, ahora con test). Su anillo
|
|
173
|
+
de foco pasa a ser el del token (`--netzi-focus-ring`), por fuera del borde.
|
|
174
|
+
- **Lo que se enfoca no queda debajo del encabezado fijo** (WCAG 2.4.11): el área reserva
|
|
175
|
+
con `scroll-padding` su alto (medido), así que Tab, Re Pág y Av Pág dejan lo enfocado a la
|
|
176
|
+
vista; el propio encabezado lo anula con un margen negativo y enfocarlo no desplaza nada.
|
|
177
|
+
Que tampoco quede detrás de las columnas fijadas, sin que enfocar lo fijado desplace el
|
|
178
|
+
área, lo resuelve #135 (con su propio changeset).
|
|
179
|
+
- **Capas:** la de sombras va con `z-index: 4` y el encabezado con 2–3, sin contexto de
|
|
180
|
+
apilado propio (para que los menús de las celdas pasen por encima del pie): una barra fija
|
|
181
|
+
de la app que deba quedar encima de la tabla necesita un `z-index` mayor que 4.
|
|
182
|
+
- Un contenedor con scroll solo horizontal y alto según su contenido no cuenta como el que
|
|
183
|
+
desplaza la página (crecería con la tabla); el tope nunca pasa del alto de la ventana.
|
|
184
|
+
|
|
185
|
+
Lo oculto se detecta con el evento `scroll` (pasivo) y con `ResizeObserver` del área y de la
|
|
186
|
+
tabla, una medida por frame; sin bucles de `requestAnimationFrame`.
|
|
187
|
+
|
|
188
|
+
- 29f7661: **Tamaños de ventana con nombre (#157, ADR 0016).** Tokens nuevos con los cortes de ancho en
|
|
189
|
+
los que cambia el diseño, siempre los mismos: `--netzi-window-medium` (600px),
|
|
190
|
+
`--netzi-window-expanded` (840px), `--netzi-window-large` (1200px) y
|
|
191
|
+
`--netzi-window-extra-large` (1600px), el ancho en el que empieza cada tamaño (compacto empieza
|
|
192
|
+
en 0). `--netzi-window-reflow` (375px) es el corte de reflujo dentro de compacto: por debajo,
|
|
193
|
+
lo que va en fila dentro de un panel flotante se apila.
|
|
194
|
+
|
|
195
|
+
Una `var()` no vale dentro de `@media`, así que en una hoja se escribe el número del token, en
|
|
196
|
+
forma de rango: `@media (width < 600px)` o `@media (width >= 840px)`. La salida DTCG los
|
|
197
|
+
publica como `dimension` en px, y el README trae la tabla de tamaños y paneles.
|
|
198
|
+
|
|
199
|
+
- b737fae: **Tokens de movimiento con el movimiento reducido dentro (#151).** Las duraciones y las curvas
|
|
200
|
+
iban escritas a mano en cada componente (quince duraciones distintas entre 80 y 340 ms), y por eso
|
|
201
|
+
la respuesta a `prefers-reduced-motion` también se repetía componente a componente.
|
|
202
|
+
|
|
203
|
+
`@netzi/tokens`:
|
|
204
|
+
- Duraciones con nombre de intención: `--netzi-duration-instant` (100ms), `-fast` (150ms),
|
|
205
|
+
`-base` (200ms) y `-slow` (280ms); curvas `--netzi-ease-standard` (la de `ease`), `-enter` y
|
|
206
|
+
`-exit`. Salen de la fuente DTCG con los tipos `duration` y `cubicBezier`, también en la salida
|
|
207
|
+
DTCG resuelta.
|
|
208
|
+
- Las duraciones del desplazamiento, `--netzi-duration-move-{fast,base,slow}`, valen lo mismo
|
|
209
|
+
que su fundido y con `prefers-reduced-motion: reduce` pasan a `0.01ms` en un solo bloque de
|
|
210
|
+
`tokens.css` (`themes/motion.tokens.json`). Lo que se desplaza, gira o escala con ellas salta
|
|
211
|
+
sin regla propia; los fundidos de color y opacidad conservan su duración. A `0.01ms` y no a
|
|
212
|
+
cero para que `transitionend` y `animationend` sigan llegando.
|
|
213
|
+
|
|
214
|
+
`@netzi/ui`:
|
|
215
|
+
- Las hojas del kit usan los tokens en vez de duraciones y curvas literales (también la
|
|
216
|
+
transición en línea del tooltip). Cada valor va al paso más cercano de la escala: 30 ms
|
|
217
|
+
de diferencia como mucho (60 ms en el giro de la aguja del reloj); `ease-out` pasa a `--netzi-ease-enter` y
|
|
218
|
+
`ease-in` a `--netzi-ease-exit`. Los bucles (giradores, latidos, el brillo del skeleton)
|
|
219
|
+
conservan su ciclo.
|
|
220
|
+
- El toast y las muestras de color de los ajustes ya no necesitan su regla de movimiento
|
|
221
|
+
reducido: el desplazamiento va con un token `move`.
|
|
222
|
+
- Si tu app redefine un token de duración, el kit entero sigue el nuevo ritmo; para quitar el
|
|
223
|
+
movimiento en un ámbito, redefine allí los tres `--netzi-duration-move-*` a `0.01ms`.
|
|
224
|
+
|
|
225
|
+
- 4a9cfaa: **Escala de capas con nombre (`--netzi-layer-*`, #215).** El `z-index` ya no es un número
|
|
226
|
+
suelto en cada hoja: sale de once capas con nombre de intención, de abajo arriba,
|
|
227
|
+
`content` (0), `sticky` (2), `bar` (20), `flyout` (50), `scrim` (80), `modal` (100),
|
|
228
|
+
`dropdown` (120), `toast` (200), `tooltip` (300), `blocking` (1000) y `top` (10000). El
|
|
229
|
+
README las documenta en ese orden, con sus reglas: dentro de su capa, un componente ordena
|
|
230
|
+
con `-1`, `0` o `1`, y lo que va justo encima de otra pieza de su capa sube un escalón con
|
|
231
|
+
`calc(var(--netzi-layer-…) + 1)`.
|
|
232
|
+
|
|
233
|
+
Una barra fija de la app que deba pasar por encima de los encabezados fijos de la tabla va en
|
|
234
|
+
`var(--netzi-layer-bar)`.
|
|
235
|
+
|
|
236
|
+
En `@netzi/ui`, las hojas de drawer, modal, layout, toaster, fecha, hora, combobox, popover,
|
|
237
|
+
select, teléfono, paleta de comandos, editor, cron, conexión y tabla de datos, y el tooltip,
|
|
238
|
+
usan la escala. El apilado no cambia, con una excepción: el panel del selector de cron
|
|
239
|
+
estaba en 1200, por encima del aviso, del tooltip y de la pantalla de sin conexión, y pasa a
|
|
240
|
+
la capa de desplegables como el resto de paneles. Un guardián (`tokens-capas.spec.ts`) falla
|
|
241
|
+
con cualquier `z-index` numérico distinto de `-1`, `0` o `1` en las hojas y los estilos en
|
|
242
|
+
línea del kit.
|
|
243
|
+
|
|
244
|
+
- 021a5bb: **Estados de interacción como un solo sistema, con presionado (#156, criterio B.7).** Nuevo
|
|
245
|
+
grupo `state` en la fuente DTCG: una capa translúcida por estado, del color del texto y con su
|
|
246
|
+
opacidad (`--netzi-state-hover` 8 %, `--netzi-state-focus` 12 %, `--netzi-state-pressed` 12 %,
|
|
247
|
+
`--netzi-state-dragged` 16 %, y cada una con su `--netzi-state-*-opacity` para la plataforma que
|
|
248
|
+
pinte la capa con su propio color), el seleccionado (`--netzi-state-selected`, el tinte del
|
|
249
|
+
primario de siempre) y una sola opacidad para lo deshabilitado
|
|
250
|
+
(`--netzi-state-disabled-opacity`, 0.6). Las capas se redeclaran en cada sección con tema o
|
|
251
|
+
contraste propios, como el anillo de foco.
|
|
252
|
+
|
|
253
|
+
El relleno de marca tiene su presionado propio, `--netzi-primary-pressed`: el hover con la capa
|
|
254
|
+
de presionado del extremo contrario a su tinta, calibrado en cada preset. `deriveBrand` lo
|
|
255
|
+
deriva igual para una marca propia (`primaryPressed`, el octavo token del contrato), y
|
|
256
|
+
`validateBrand` mide `--netzi-on-primary` también sobre él.
|
|
257
|
+
|
|
258
|
+
El contrato de contraste del build cubre el sistema: `--netzi-text` llega a 4.5:1 sobre cada
|
|
259
|
+
superficie con cualquier capa encima, el anillo de foco a 3:1 sobre las de hover, foco y
|
|
260
|
+
presionado, la tinta del primario sobre su presionado, y el texto de lo deshabilitado se queda a
|
|
261
|
+
3:1 (nuevo: un contrato sobre una opacidad nombra su tinta con `ink`).
|
|
262
|
+
|
|
263
|
+
- a4662c0: **Nuevos tokens `--netzi-*-graphic` y `--netzi-*-veil` para lo no textual de un estado (#189,
|
|
264
|
+
WCAG 1.4.11).** La estrella marcada, el punto de presencia, el borde de un campo inválido o el
|
|
265
|
+
icono de un resultado necesitan 3:1 frente a lo que tienen al lado, y el crudo del estado no
|
|
266
|
+
llega en claro: azul 2,08:1 en el peor fondo, verde 1,33, amarillo 1,41 y rojo 2,15.
|
|
267
|
+
- `--netzi-info-graphic` (`#0e84cd`), `--netzi-success-graphic` (`#069047`),
|
|
268
|
+
`--netzi-warning-graphic` (`#9d7a0c`) y `--netzi-danger-graphic` (`#df464b`) en claro; en
|
|
269
|
+
oscuro, el crudo de siempre. Son alias de `--netzi-blue-graphic`, `--netzi-green-graphic`,
|
|
270
|
+
`--netzi-yellow-graphic` y `--netzi-red-graphic`, como los `-text`.
|
|
271
|
+
- `--netzi-info-veil`, `--netzi-success-veil`, `--netzi-warning-veil` y `--netzi-danger-veil`:
|
|
272
|
+
el gráfico al 14 %, el fondo redondo de un icono de estado.
|
|
273
|
+
- El contrato `non-text` de cada gráfico pide 3:1 sobre cada superficie y sobre su velo
|
|
274
|
+
compuesto sobre cada una; el build lo comprueba en las 24 combinaciones de modo, contraste y
|
|
275
|
+
preset.
|
|
276
|
+
|
|
277
|
+
- 4a9cfaa: **Paleta categórica para gráficas: `--netzi-chart-1` … `--netzi-chart-8`** (#175). Ocho colores
|
|
278
|
+
para ocho series, sin repetirse, en el orden en que se asignan: azul, naranja quemado, verde
|
|
279
|
+
azulado, vino, oliva, índigo, rosa rojizo y pizarra, con su versión aclarada en oscuro.
|
|
280
|
+
- Cada uno declara su contrato `non-text` (3:1, WCAG 1.4.11) sobre todas las superficies y el
|
|
281
|
+
build lo comprueba en las 24 combinaciones de modo, contraste y preset. El peor par mide
|
|
282
|
+
3.16:1 en claro y 3.75:1 en oscuro.
|
|
283
|
+
- Elegida para que las series se distingan también con protanopia, deuteranopia y tritanopia
|
|
284
|
+
(simulación de Machado 2009): la distancia mínima entre dos series, en OKLab, es 10.0 sin
|
|
285
|
+
daltonismo y 7.1 con él en claro, y 8.9 y 6.2 en oscuro. Lo fija `test/chart.spec.ts`.
|
|
286
|
+
- Es fija, no sigue al preset: con el primario como serie 1, el preset verde o el rojo chocaba
|
|
287
|
+
con la serie del mismo tono.
|
|
288
|
+
|
|
289
|
+
- 11d7658: **Espaciado, radio y texto por papel; las escalas primitivas pasan a desuso para las apps
|
|
290
|
+
(#228).** La política de diseño reserva las primitivas a la fuente, pero el README enseñaba
|
|
291
|
+
`--netzi-space-*`, `--netzi-radius-sm/lg`, `--netzi-font-size-*`, `--netzi-font-weight-*` y
|
|
292
|
+
`--netzi-line-height-*`. Ahora cada uso tiene su papel en la capa semántica, con el mismo
|
|
293
|
+
valor en cada tema y densidad:
|
|
294
|
+
- **Espaciado**, de lo más cercano a lo más lejano: `--netzi-space-related` (4px),
|
|
295
|
+
`--netzi-space-group` (8), `--netzi-space-stack` (12), `--netzi-space-inset-sm` (12),
|
|
296
|
+
`--netzi-space-inset` (16), `--netzi-space-inset-lg` (24), `--netzi-space-section` (32) y
|
|
297
|
+
`--netzi-space-page` (48). La densidad compacta los reduce igual que antes, también en una
|
|
298
|
+
sección con su propia densidad.
|
|
299
|
+
- **Radios**: `--netzi-radius-control` (6px), `--netzi-radius-surface-sm` (8),
|
|
300
|
+
`--netzi-radius-surface` (10) y `--netzi-radius-pill`.
|
|
301
|
+
- **Texto**: los estilos `--netzi-typography-*`, que ya existían.
|
|
302
|
+
|
|
303
|
+
Las escalas se deprecan en `@netzi/tokens` `0.1.0-beta.10` y **pasan a internas como pronto en
|
|
304
|
+
`@netzi/tokens` `0.1.0-beta.11`**: siguen en `tokens.css` con su valor (los papeles se apoyan
|
|
305
|
+
en ellas), pero salen de `public-tokens.json` y pueden cambiar sin aviso. Se avisa como con los
|
|
306
|
+
sinónimos: `$deprecated` en la fuente y en la salida DTCG, el comentario `/* deprecated: … */`
|
|
307
|
+
en `tokens.css`, la lista del build y la tabla «Escalas que pasan a internas» del README.
|
|
308
|
+
`--netzi-radius-full`, que no llegó a publicarse, es interno desde ya: usa
|
|
309
|
+
`--netzi-radius-pill`. `--netzi-radius-md`, en desuso desde #216, apunta ahora a
|
|
310
|
+
`--netzi-radius-surface-sm`.
|
|
311
|
+
|
|
312
|
+
Duraciones, curvas, familias y la escala de letra (`--netzi-duration-*`, `--netzi-ease-*`,
|
|
313
|
+
`--netzi-font-sans`, `--netzi-font-mono`, `--netzi-font-scale`) ya tenían nombre de intención:
|
|
314
|
+
pasan a la capa semántica **sin cambiar de nombre**.
|
|
315
|
+
|
|
316
|
+
**Migración**, en tus hojas:
|
|
317
|
+
|
|
318
|
+
| Antes | Después |
|
|
319
|
+
| -------------------------------------------------------- | -------------------------------------------------------------- |
|
|
320
|
+
| `var(--netzi-space-2)` | `var(--netzi-space-related)` |
|
|
321
|
+
| `var(--netzi-space-3)` | `var(--netzi-space-group)` |
|
|
322
|
+
| `var(--netzi-space-4)` | `var(--netzi-space-stack)` o `var(--netzi-space-inset-sm)` |
|
|
323
|
+
| `var(--netzi-space-5)` | `var(--netzi-space-inset)` |
|
|
324
|
+
| `var(--netzi-space-6)` | `var(--netzi-space-inset-lg)` |
|
|
325
|
+
| `var(--netzi-space-7)` | `var(--netzi-space-section)` |
|
|
326
|
+
| `var(--netzi-space-8)` | `var(--netzi-space-page)` |
|
|
327
|
+
| `var(--netzi-radius-sm)` | `var(--netzi-radius-control)` |
|
|
328
|
+
| `var(--netzi-radius)` | `var(--netzi-radius-surface-sm)` |
|
|
329
|
+
| `var(--netzi-radius-lg)` | `var(--netzi-radius-surface)` |
|
|
330
|
+
| `font-size` + `font-weight` + `line-height` de la escala | `font: var(--netzi-typography-<papel>)` y su `-letter-spacing` |
|
|
331
|
+
|
|
332
|
+
- 79e0661: **Nuevo token `--netzi-primary-graphic`: el primario para lo no textual que tiene que verse (#140,
|
|
333
|
+
WCAG 1.4.11).** El relleno de una barra de progreso, un anillo de carga o una barra de
|
|
334
|
+
navegación necesitan 3:1 frente a lo que tienen al lado, y `--netzi-primary` no llega en claro
|
|
335
|
+
con azul (2,15:1 en el peor fondo), verde (1,36), naranja (1,78), rojo (2,51) ni cian (1,92).
|
|
336
|
+
- Es el tono más cercano al primario que llega a 3:1 sobre `bg`, `surface`, `surface-2`,
|
|
337
|
+
`surface-3` y el tinte del primario, calibrado por preset y por tema. En oscuro coincide con
|
|
338
|
+
el primario salvo en morado, que se aclara un punto para cumplir sobre el tinte.
|
|
339
|
+
- Su contrato `non-text` lo comprueba el build en las 24 combinaciones de modo, contraste y
|
|
340
|
+
preset: si se rebaja, el CSS no se escribe.
|
|
341
|
+
- `--netzi-primary-text` también cumple, pero se aleja más del color de marca. Sigue siendo el
|
|
342
|
+
que va con lo que late en opacidad: en el valle del latido, el no textual baja de 3:1.
|
|
343
|
+
|
|
344
|
+
- 4a9cfaa: **Qué tokens son para tu app: `public-tokens.json` (#217).** Cada token de la fuente declara
|
|
345
|
+
si es **público** (el contrato: se puede usar y redefinir, y no cambia sin pasar por desuso) o
|
|
346
|
+
**interno** (puede cambiar en cualquier versión). La capa semántica es pública; de las
|
|
347
|
+
primitivas lo son las escalas (espacio, radios, tipografía, interlineado, duraciones y
|
|
348
|
+
curvas); de las de componente, las capas flotantes, el velo, los controles, el objetivo
|
|
349
|
+
táctil, el anillo de foco, la paleta de gráficas, el fondo ambiental y la lente del cristal.
|
|
350
|
+
|
|
351
|
+
Quedan **internos** los colores de marca crudos (`--netzi-blue`, `--netzi-blue-dark`,
|
|
352
|
+
`--netzi-green`, `--netzi-yellow`, `--netzi-red`, `--netzi-purple`) y los pulgares del kit
|
|
353
|
+
(`--netzi-thumb`, `--netzi-scrollbar-thumb`). Siguen saliendo en `tokens.css` igual que antes:
|
|
354
|
+
nada cambia de valor. Si tu app los usa, pasa al primario y a los estados, que siguen al
|
|
355
|
+
preset de marca y al contraste alto (`--netzi-primary`, `--netzi-info`, `--netzi-success`…).
|
|
356
|
+
|
|
357
|
+
El paquete publica la lista en `@netzi/tokens/public-tokens.json` (nombre, ruta canónica, capa
|
|
358
|
+
y aviso de desuso), y la salida DTCG resuelta lo marca en `$extensions["tech.netzi"].visibility`.
|
|
359
|
+
El README tiene la sección «Públicos e internos» y su catálogo ya solo enseña tokens públicos.
|
|
360
|
+
|
|
361
|
+
- 4a9cfaa: **`radius-full`, elevación con nombre y estilos de texto compuestos (#220).**
|
|
362
|
+
- `--netzi-radius-full` para lo del todo redondeado (píldoras, puntos, avatares,
|
|
363
|
+
interruptores). En `@netzi/ui` sustituye a los 77 `999px`, `100px` y `50%` de las hojas, todos
|
|
364
|
+
en piezas cuadradas o en píldoras: el dibujo no cambia. Un guardián lo vigila.
|
|
365
|
+
- Elevación con nombre de intención: `--netzi-elevation-base` (sin sombra), `-raised`,
|
|
366
|
+
`-floating` y `-modal`, con los valores de siempre en cada tema. `@netzi/ui` y el playground
|
|
367
|
+
pasan a usarlos.
|
|
368
|
+
- Un estilo compuesto por paso de la escala (`typography` en DTCG): `--netzi-typography-display`,
|
|
369
|
+
`-headline`, `-title`, `-title-sm`, `-body`, `-body-sm` y `-caption`, como atajo `font`, y su
|
|
370
|
+
espaciado en `--netzi-typography-<estilo>-letter-spacing`.
|
|
371
|
+
|
|
372
|
+
**En desuso**, se deprecan en `@netzi/tokens` `0.1.0-beta.10` y se retiran como pronto en `@netzi/tokens` `0.1.0-beta.11` (ADR 0012): `--netzi-shadow-sm`,
|
|
373
|
+
`--netzi-shadow` y `--netzi-shadow-lg`. Siguen valiendo lo mismo en cada tema y en cada sección
|
|
374
|
+
con su propio tema o contraste. Migración, buscar y sustituir:
|
|
375
|
+
|
|
376
|
+
| Antes | Después |
|
|
377
|
+
| ------------------------ | --------------------------------- |
|
|
378
|
+
| `var(--netzi-shadow-sm)` | `var(--netzi-elevation-raised)` |
|
|
379
|
+
| `var(--netzi-shadow)` | `var(--netzi-elevation-floating)` |
|
|
380
|
+
| `var(--netzi-shadow-lg)` | `var(--netzi-elevation-modal)` |
|
|
381
|
+
|
|
382
|
+
Si tu app redefinía una sombra, redefine su nivel. De paso, `--netzi-surface-1`,
|
|
383
|
+
`--netzi-text-1` y `--netzi-radius-md` (en desuso desde #216) se redeclaran también en cada
|
|
384
|
+
sección con su propio tema o densidad, así que siguen al tema como sus canónicos.
|
|
385
|
+
|
|
386
|
+
- 4a9cfaa: **Un solo nombre por papel: `surface-1`, `text-1` y `radius-md` pasan a desuso (#216).** Eran
|
|
387
|
+
sinónimos de `--netzi-surface`, `--netzi-text` y `--netzi-radius`, que son los canónicos (la
|
|
388
|
+
raíz de cada grupo de la fuente, nota en el ADR 0009). Siguen publicándose con el mismo valor,
|
|
389
|
+
porque apuntan al canónico; se deprecan en `@netzi/tokens` `0.1.0-beta.10` y se retiran **como pronto en `@netzi/tokens` `0.1.0-beta.11`**, en un cambio
|
|
390
|
+
incompatible propio (ADR 0012).
|
|
391
|
+
|
|
392
|
+
Cómo se avisa: `$deprecated` en la fuente DTCG y en la salida resuelta, un comentario
|
|
393
|
+
`/* deprecated: … */` encima de cada uno en `tokens.css`, la lista que imprime el build y la
|
|
394
|
+
tabla «En desuso» del README.
|
|
395
|
+
|
|
396
|
+
**Migración**, buscar y sustituir en tus hojas:
|
|
397
|
+
|
|
398
|
+
| Antes | Después |
|
|
399
|
+
| ------------------------ | ---------------------- |
|
|
400
|
+
| `var(--netzi-surface-1)` | `var(--netzi-surface)` |
|
|
401
|
+
| `var(--netzi-text-1)` | `var(--netzi-text)` |
|
|
402
|
+
| `var(--netzi-radius-md)` | `var(--netzi-radius)` |
|
|
403
|
+
|
|
404
|
+
Si tu app **redefine** uno de los sinónimos (`--netzi-surface-1: …`), redefine el canónico:
|
|
405
|
+
el sinónimo lo sigue. `@netzi/ui` y el playground ya solo usaban los canónicos; ahora un
|
|
406
|
+
guardián lo vigila.
|
|
407
|
+
|
|
408
|
+
- cf23e6b: **Cambio incompatible para las apps que redefinen tokens del tema claro: una sección clara dentro
|
|
409
|
+
de una página oscura pinta el tema claro (#237).** El claro no tenía bloque propio (son los
|
|
410
|
+
valores de las capas, en `:root`), así que una sección con `data-theme="light"` heredaba todos los
|
|
411
|
+
valores oscuros de la página. Ahora `[data-theme='light']` vuelve a declarar, con el valor de las
|
|
412
|
+
capas, cada token que cambia el tema oscuro, y cada contexto de la página (preset, alto contraste,
|
|
413
|
+
también el que pide el sistema, cristal y fondo ambiental) le devuelve a la sección lo suyo, así
|
|
414
|
+
que pinta lo mismo que una página clara con ellos. Con los tokens de fábrica nada cambia en la raíz,
|
|
415
|
+
tampoco con `data-theme="light"` puesto en `<html>`, ni al imprimir.
|
|
416
|
+
|
|
417
|
+
**Por qué es incompatible.** El bloque claro pesa lo que un atributo. Una app que pone
|
|
418
|
+
`data-theme="light"` en `<html>` (como hacen las plantillas de Netzi) y redefine el claro con un
|
|
419
|
+
selector que pesa menos (`html { … }`) o con un `:root` cargado antes de `@netzi/tokens` ve que el
|
|
420
|
+
bloque pisa su valor; y una sección clara dentro de una página oscura toma el claro de fábrica en
|
|
421
|
+
vez del suyo.
|
|
422
|
+
|
|
423
|
+
**Migración.** Declara tus tokens del claro también en `[data-theme='light']`, como ya hacías en
|
|
424
|
+
`[data-theme='dark']` para el oscuro, y carga tu hoja después de `@netzi/tokens`:
|
|
425
|
+
- Antes: `:root { --netzi-surface: #fdfcfa; }`
|
|
426
|
+
- Después: `:root, [data-theme='light'] { --netzi-surface: #fdfcfa; }`
|
|
427
|
+
|
|
428
|
+
- 54f5fdf: **El texto corrido mide 16 px y cada estilo de texto publica su tamaño suelto (#219, #155,
|
|
429
|
+
ADR 0015).** La política de diseño fija el texto corriente en 16 px; en los tokens medía 14.
|
|
430
|
+
- `--netzi-typography-body` pasa a 16 px (`font.size.lg`): párrafos, descripciones y prosa.
|
|
431
|
+
- Nuevo `--netzi-typography-body-ui`, a 14 px: el texto de interfaz (opciones, pestañas,
|
|
432
|
+
celdas, mensajes breves). `body-sm` (12.5 px) queda para lo secundario.
|
|
433
|
+
- Cada estilo publica también `--netzi-typography-<papel>-font-size`, el tamaño solo, para la
|
|
434
|
+
hoja que pone el peso y el interlineado por su cuenta y no quiere que el atajo `font` se los
|
|
435
|
+
pise. Como el tamaño del estilo, multiplica `--netzi-font-scale`.
|
|
436
|
+
- Los avisos de desuso de `--netzi-font-size-*` proponen ahora ese tamaño del papel
|
|
437
|
+
(`md` → `--netzi-typography-body-ui-font-size`, `lg` → `--netzi-typography-body-font-size`).
|
|
438
|
+
|
|
439
|
+
No rompe nada publicado: los estilos de texto (#220) se estrenan en esta misma versión, así
|
|
440
|
+
que ninguna app los usa todavía. `md` sigue valiendo 14 px y sigue siendo el 100 % del ajuste
|
|
441
|
+
de tamaño de letra.
|
|
442
|
+
|
|
443
|
+
### Patch Changes
|
|
444
|
+
|
|
445
|
+
- 0f16d1c: **Colores forzados: el texto resaltado se lee y los anillos se ven sobre el resaltado (#150).**
|
|
446
|
+
- Con colores forzados, Chromium pinta detrás del texto una placa del color del lienzo. Lo
|
|
447
|
+
elegido con `Highlight`/`HighlightText` (segmentado, paginación, menú lateral, días y horas,
|
|
448
|
+
opciones de select, combobox y phone, chips, ajustes, idiomas, comandos, menús de la tabla,
|
|
449
|
+
editor, cron, pestañas de trabajo, contadores de pestañas, paso actual…) quedaba blanco sobre
|
|
450
|
+
blanco. Esas reglas llevan ahora `forced-color-adjust: none`, y lo que llevan dentro hereda el
|
|
451
|
+
texto del resaltado sin fondos propios.
|
|
452
|
+
- El foco o la opción activa encima de lo elegido llevan su contorno con el texto del resaltado
|
|
453
|
+
por dentro (`HighlightText`) o con el del lienzo por fuera: el ítem actual del menú lateral con
|
|
454
|
+
el foco, la opción activa y elegida del combobox, del select y del phone, y la casilla marcada
|
|
455
|
+
con el foco.
|
|
456
|
+
- **Contraste alto:** `--netzi-border-2` sube a 3:1 sobre cada superficie, en claro (`#828b94`)
|
|
457
|
+
y en oscuro (`#68717b`), y el contrato de contraste de los tokens lo comprueba.
|
|
458
|
+
|
|
459
|
+
- 4a9cfaa: **El ejemplo de uso del README pinta con tokens semánticos (#218).** El botón de ejemplo
|
|
460
|
+
usaba `background: var(--netzi-blue)`, una primitiva: quien lo copiaba se saltaba el preset
|
|
461
|
+
de marca y el contraste alto, justo lo que el propio README desaconseja más abajo. Ahora
|
|
462
|
+
usa `--netzi-primary` de relleno y `--netzi-on-primary` de tinta, que es el par que cada
|
|
463
|
+
preset redefine y cuyo contraste comprueba el build.
|
|
464
|
+
|
|
465
|
+
También se corrigen las cifras del aviso «relleno o texto»: `--netzi-blue` da 2.54:1 sobre
|
|
466
|
+
el fondo claro y 2.68:1 sobre blanco (no 2.9:1), y `--netzi-primary-dark` baja a 4.23:1 en
|
|
467
|
+
`surface-3`.
|
|
468
|
+
|
|
469
|
+
- 6be96b3: **Lo marcado y los tonos llegan a 3:1 frente a cualquier superficie (#147, WCAG 1.4.11).**
|
|
470
|
+
- `--netzi-primary-dark`, el relleno de checkbox, radio y toggle marcados, se mide ahora frente a todas las superficies y no solo al fondo de la página. Para cumplirlo se oscurecen el verde (`#079b4e`) y el naranja (`#bf780a`) en claro y se aclara el morado en oscuro (`#824ff3`). El blanco encima sigue por encima de 3:1.
|
|
471
|
+
- Los puntos de `netzi-timeline` con tono (info, success, warning, danger) y los tramos del medidor de `netzi-password` pintan con el tono de texto de su color (`--netzi-*-text`) en vez del crudo, que en claro se quedaba por debajo.
|
|
472
|
+
|
|
473
|
+
- 4a9cfaa: **Nada salta al cargar: imágenes del editor y fuentes de marca (#178).**
|
|
474
|
+
- `@netzi/tokens/fonts.css` añade `'Plus Jakarta Sans Fallback'` y `'Fira Code Fallback'`:
|
|
475
|
+
Arial y Courier New (Liberation Sans y Liberation Mono en Linux) con `size-adjust`,
|
|
476
|
+
`ascent-override`, `descent-override` y `line-gap-override` calculados con las métricas
|
|
477
|
+
de las fuentes del kit. Mientras llega la de marca, el texto ocupa casi lo mismo y la
|
|
478
|
+
página no salta al cambiar. `--netzi-font-sans` y `--netzi-font-mono` (y la fuente por
|
|
479
|
+
defecto de `NetziThemeService`) los nombran justo detrás de la de marca; quien tenía
|
|
480
|
+
guardada la fuente por defecto anterior pasa a la nueva sola. **Aviso:** si la lista de
|
|
481
|
+
`fonts` que pasas a `netzi-settings` usaba como valor la fuente por defecto anterior
|
|
482
|
+
(`'Plus Jakarta Sans', -apple-system, system-ui, sans-serif`), cámbiala por
|
|
483
|
+
`NETZI_THEME_DEFAULTS.font`; si no, ninguna opción saldrá marcada.
|
|
484
|
+
- `netzi-richtext`: cada imagen guarda su tamaño propio y lo emite como `width` y `height`
|
|
485
|
+
con `height:auto`, así que reserva su hueco antes de descargarse sin deformarse. Si al
|
|
486
|
+
insertarla no se conoce, el editor lo lee cuando la imagen carga (fuera del historial
|
|
487
|
+
de deshacer). Un `<img>` con `width` y `height` a la vez se lee como tamaño propio; un
|
|
488
|
+
`width` suelto sigue siendo el ancho elegido.
|
|
489
|
+
- `netzi-richtext`: mientras carga el motor, la barra ya ocupa su sitio (inerte) y el
|
|
490
|
+
documento reserva su alto (el mínimo si está vacío, el máximo si tiene contenido), así
|
|
491
|
+
que al montarse no empuja lo que hay debajo.
|
|
492
|
+
|
|
493
|
+
- 4a9cfaa: **El texto cortado con puntos suspensivos se puede leer entero (#167, A.13).** Había 16
|
|
494
|
+
textos que se cortaban con `text-overflow: ellipsis` y solo la barra de pestañas ofrecía el
|
|
495
|
+
completo, con un `title` que solo veía el puntero. Ahora:
|
|
496
|
+
- **Directiva nueva `netziTruncated`.** Enseña el texto entero en un tooltip del kit, solo
|
|
497
|
+
mientras el elemento no cabe, con el puntero (sobre el texto o sobre el control que lo
|
|
498
|
+
contiene) y con el foco del teclado. Es el mismo tooltip de `netziTooltip`, con todo lo
|
|
499
|
+
suyo (WCAG 1.4.13): se puede recorrer con el puntero, persiste con el foco, se descarta
|
|
500
|
+
con Escape sin mover el foco y se cierra al imprimir; solo funde la opacidad, sin
|
|
501
|
+
desplazarse. No toca `aria-describedby`: el texto ya está entero en el DOM y el lector lo
|
|
502
|
+
lee igual. Un texto suelto cortado (el nombre de un archivo, una celda) se vuelve una
|
|
503
|
+
parada de Tab mientras no cabe, con el anillo de foco del kit (`base.css` de
|
|
504
|
+
`@netzi/tokens` lo pinta en `[data-netzi-truncated-stop]`). Entradas: `netziTruncated` (texto propio; vacío, el del
|
|
505
|
+
elemento), `netziTruncatedPlacement` y `netziTruncatedActive` (foco virtual, para listas
|
|
506
|
+
con `aria-activedescendant`).
|
|
507
|
+
- **Aplicada en cada texto que se corta:** chip, nombre del archivo en
|
|
508
|
+
dropzone, país en phone, copy, valor del select, página actual de las migas, adjunto de notifications, celdas y
|
|
509
|
+
cabeceras de `netzi-data-table` y las etiquetas de sus submenús de fijar y de anchos, el
|
|
510
|
+
título de las pestañas de `netzi-workspace-bar` (sustituye a su `title`) y la zona
|
|
511
|
+
horaria de `netzi-date` y `netzi-time` (la zona IANA entera, también con el foco en el
|
|
512
|
+
campo).
|
|
513
|
+
- **La etiqueta de un paso de `netzi-stepper` ya no se corta:** pasa a otra línea. Con los
|
|
514
|
+
pasos desactivados no se llega a ella con el teclado, y un tooltip no bastaría.
|
|
515
|
+
- **Un solo oyente de teclado y de impresión para todos los tooltips** (`netziTooltip` y
|
|
516
|
+
`netziTruncated`), y solo mientras alguno espera su retardo o está a la vista. Antes cada
|
|
517
|
+
instancia escuchaba el documento, y con mil celdas cada tecla recorría mil oyentes.
|
|
518
|
+
- En la tabla, solo llevan la directiva las celdas de ancho estricto (redimensionando o en
|
|
519
|
+
una columna fijada): con el ancho libre crecen con su texto. Una cabecera sin orden también acaba en puntos suspensivos (antes se
|
|
520
|
+
recortaba en seco), y la cabecera con orden se enseña al pasar por toda la celda.
|
|
521
|
+
|
|
522
|
+
Un guardián de hojas falla si un `text-overflow: ellipsis` del kit no lleva la directiva.
|
|
523
|
+
|
|
524
|
+
- 38a1913: **`tokens.css` se genera desde una fuente única en JSON DTCG** (#127). Los valores no
|
|
525
|
+
cambian: cada `--netzi-*` vale lo mismo en cada tema, preset, contraste, cristal, densidad y
|
|
526
|
+
entorno que en la versión anterior, y las rutas de importación son las mismas.
|
|
527
|
+
- La fuente sigue el formato del W3C Design Tokens Community Group (2025.10), en tres capas
|
|
528
|
+
(primitivos, semánticos y de componente) y un archivo por eje de tema, y Style Dictionary
|
|
529
|
+
genera el CSS. Es la base para publicar los mismos tokens a plataformas que no leen CSS.
|
|
530
|
+
- Cada token que se pinta sobre algo declara su contrato de contraste (texto 4.5:1, no
|
|
531
|
+
textual 3:1) y el build lo comprueba en las 24 combinaciones de modo, contraste y preset:
|
|
532
|
+
si un par no llega, el paquete no se construye.
|
|
533
|
+
- Los comentarios de `tokens.css` salen ahora de las descripciones de la fuente; el orden de
|
|
534
|
+
algunos bloques cambia sin efecto en la cascada.
|
|
535
|
+
|
|
536
|
+
- a2f75a9: **El tinte del tema oscuro y las manchas del fondo ambiental siguen al preset de cada sección
|
|
537
|
+
(#232).** Dentro de una sección con su propio `data-preset` en una página oscura,
|
|
538
|
+
`--netzi-primary-tint` y `--netzi-primary-tint-strong` tomaban el alfa del tema claro; y con
|
|
539
|
+
`data-ambient="on"`, `--netzi-ambient` pintaba las manchas con el primario de la página. Ahora se
|
|
540
|
+
vuelven a declarar en cada sección con preset dentro de una página donde aplica el tema oscuro o el
|
|
541
|
+
fondo ambiental, y el alto contraste las sigue apagando también ahí. La fuente exige la
|
|
542
|
+
redeclaración a cada referencia del valor, también la que va dentro de un degradado o de un estilo
|
|
543
|
+
de texto, y a los tokens que declara cada contexto.
|
|
544
|
+
- 7e4b2f0: **Los estados, los tintes y el pulgar de la barra se redeclaran en cada sección con tema,
|
|
545
|
+
preset o contraste propios (#232).** Una variable que usa otra se resuelve donde se declara: dentro
|
|
546
|
+
de una sección con su propio `data-theme`, `--netzi-info-text` (y el resto de `-text`, `-graphic`
|
|
547
|
+
y `-veil` de los estados), `--netzi-primary-tint`, `--netzi-tint` y el pulgar de la barra de
|
|
548
|
+
desplazamiento heredaban el valor de la raíz, el del tema de la página. Ahora se vuelven a declarar
|
|
549
|
+
en cada eje que cambia lo que referencian, como ya hacían el anillo de foco y los papeles de
|
|
550
|
+
espaciado. La fuente lo exige a cualquier referencia, así que un token nuevo no puede olvidarlo.
|
|
551
|
+
|
|
552
|
+
## 0.1.0-beta.9
|
|
553
|
+
|
|
554
|
+
### Patch Changes
|
|
555
|
+
|
|
556
|
+
- 9819de5: **El indicador de foco llega a 3:1 en todos los presets y temas** (#76). Se pintaba con
|
|
557
|
+
`--netzi-primary`, que en claro se quedaba en 2.7:1 con azul, 1.6 con verde, 2.2 con
|
|
558
|
+
naranja y 2.4 con cian, por debajo de WCAG 1.4.11; y varios controles solo tenían un
|
|
559
|
+
halo del tinte, de 1.1:1.
|
|
560
|
+
- Nuevo token `--netzi-focus-ring`, apoyado en `--netzi-primary-text` y declarado en la
|
|
561
|
+
raíz y en cada elemento con `data-theme` o `data-preset`.
|
|
562
|
+
- Lo usan los contornos y bordes de foco de todo el kit (chip, cron-picker, icon-picker,
|
|
563
|
+
el enlace «ir al contenido», timeline y los campos de formulario) y la imagen
|
|
564
|
+
seleccionada del editor.
|
|
565
|
+
- Checkbox, radio, toggle, rating y segmented pasan del halo o del borde a un contorno de
|
|
566
|
+
2px, que se distingue igual marcado que sin marcar; el pulgar de los sliders, a un
|
|
567
|
+
doble anillo; y el editor de texto enriquecido marca el foco en su recuadro.
|
|
568
|
+
|
|
569
|
+
- 749ad6b: **El hover del botón primario cumple 4.5:1** (#68). Pintaba `--netzi-primary-dark`
|
|
570
|
+
debajo de la tinta oscura `--netzi-on-primary`: 3.93:1 en azul y 4.0:1 en rojo, por
|
|
571
|
+
debajo de WCAG 2.1 AA para un texto de 15px. Nuevo token `--netzi-primary-hover`,
|
|
572
|
+
calibrado por preset y tema (el peor queda en 4.98:1, en rojo), que usan
|
|
573
|
+
`netzi-button` primario y el botón de reintentar de `netzi-connection-guard`.
|
|
574
|
+
`--netzi-primary-dark` sigue siendo el fondo de lo que lleva blanco encima.
|
|
575
|
+
- 03e4440: **La instalación ya no fija el canal `@beta`**: `pnpm add @netzi/ui @netzi/tokens`.
|
|
576
|
+
Mientras un paquete solo tenga versiones beta en npm, cada versión nueva se publica en
|
|
577
|
+
`latest`, que es lo que se instala por defecto. El dist-tag `beta` deja de mantenerse.
|
|
578
|
+
|
|
579
|
+
## 0.1.0-beta.8
|
|
580
|
+
|
|
581
|
+
### Patch Changes
|
|
582
|
+
|
|
583
|
+
- c57b4f0: **Publicación en el npm público con licencia propietaria de uso libre** (ADR 0005).
|
|
584
|
+
Los paquetes pasan a `registry.npmjs.org` con `access: public`, `homepage`
|
|
585
|
+
(<https://ui.netzi.tech>), `bugs` (netzi.tech@gmail.com) y `LICENSE.md` dentro:
|
|
586
|
+
instalar y usar es libre en cualquier aplicación; redistribuir o derivar, no. El
|
|
587
|
+
tarball deja de llevar sourcemaps (exponían el TypeScript original) y `files` deja
|
|
588
|
+
fuera todo lo que no sea el compilado, los tipos, las hojas y la documentación.
|
|
589
|
+
|
|
590
|
+
## 0.1.0-beta.7
|
|
591
|
+
|
|
592
|
+
### Minor Changes
|
|
593
|
+
|
|
594
|
+
- effd0cd: **Fuentes de marca autoalojadas** (#59). `fonts.css` importaba Plus Jakarta Sans
|
|
595
|
+
y Fira Code desde Google Fonts: toda app que lo usara mandaba la IP de cada
|
|
596
|
+
visitante a Google antes de ningún consentimiento (políticas 14 y 08b). Ahora las
|
|
597
|
+
dos familias viajan **dentro del paquete** como fuentes variables woff2
|
|
598
|
+
(`styles/fonts/`, ~95 KB) en dos subconjuntos, `latin` y `latin-ext` (ç, ñ, ß, ã,
|
|
599
|
+
l·l), con `font-display: swap` y sus licencias OFL-1.1 al lado. La importación
|
|
600
|
+
no cambia (`@import '@netzi/tokens/fonts.css'`); Vite y el CLI de Angular
|
|
601
|
+
reescriben las rutas y copian los archivos al build. Un guardián impide que
|
|
602
|
+
ninguna hoja publicada vuelva a cargar algo de fuera.
|
|
603
|
+
|
|
604
|
+
### Patch Changes
|
|
605
|
+
|
|
606
|
+
- 0ff1e00: **Contraste (WCAG 1.4.3) en botón `soft`, anuncios y página de estado** (#56).
|
|
607
|
+
axe sobre las 58 páginas del playground, en claro y oscuro:
|
|
608
|
+
- `netzi-button variant="soft"` escribía con `--netzi-primary-dark` (4.34:1 en
|
|
609
|
+
claro, **2.85:1** en oscuro) y su hover era un azul literal que ignoraba el
|
|
610
|
+
preset. Ahora escribe con `--netzi-primary-text` (garantizado a 4.5:1 sobre el
|
|
611
|
+
tinte en los seis presets y los dos temas) y el hover usa
|
|
612
|
+
`--netzi-primary-tint-strong`. El hover y la sombra del botón primario también
|
|
613
|
+
dejan de ser azul fijo: siguen al preset.
|
|
614
|
+
- `netzi-announcement` de éxito (**2.7:1**) y peligro (4.2:1) mezclaban el acento
|
|
615
|
+
demasiado claro para el texto blanco; las mezclas bajan al 50 % y 65 % y las
|
|
616
|
+
tintas pasan a tokens (`--netzi-on-primary-dark`, `--netzi-on-accent`). Un
|
|
617
|
+
guardián mide cada mezcla como la calcula el navegador.
|
|
618
|
+
- El código gigante de `netzi-status-page` (ilustración al 12 %) pasa a ser
|
|
619
|
+
decoración de verdad: `aria-hidden` y el número pintado por CSS desde
|
|
620
|
+
`data-code`. El estado lo dan el título y la descripción de `netzi-result`.
|
|
621
|
+
- README de tokens: `--netzi-primary` / `--netzi-blue` y compañía son relleno;
|
|
622
|
+
para texto van sus `-text`.
|
|
623
|
+
|
|
624
|
+
Los placeholders de `netzi-input` / `netzi-number` que citaba la incidencia no
|
|
625
|
+
se reproducen: usan `--netzi-text-2` (5.5:1 sobre blanco) y axe no los marca en
|
|
626
|
+
ninguna página.
|
|
627
|
+
|
|
628
|
+
## 0.1.0-beta.6
|
|
629
|
+
|
|
630
|
+
### Minor Changes
|
|
631
|
+
|
|
632
|
+
- 0adae8d: **Escala tipográfica** (#51). El kit publicaba tamaños solo para sus controles
|
|
633
|
+
(`--netzi-control-fs-*`); el texto que no es un control —líneas secundarias,
|
|
634
|
+
pies, metadatos, títulos— no tenía token, cada app se inventaba el suyo y
|
|
635
|
+
`var(--netzi-font-size-xs)`, que parece existir, se descartaba en silencio.
|
|
636
|
+
Llegan `--netzi-font-size-xs/sm/md/lg/xl/2xl/3xl` (11 · 12.5 · 14 · 16 · 18 ·
|
|
637
|
+
22 · 28 px, sacados de lo que el kit ya usa; `md` = 14px es el 100 % de
|
|
638
|
+
`--netzi-font-scale`, con el que todos escalan), `--netzi-line-height-none/
|
|
639
|
+
tight/normal/relaxed` (1 / 1.25 / 1.5 / 1.65) y
|
|
640
|
+
`--netzi-font-weight-regular…extrabold` (400–800, los cortes que carga
|
|
641
|
+
`fonts.css`). La densidad compacta no los cambia. Documentados en el README de
|
|
642
|
+
tokens y en el showcase («Tipografía»); un guardián fija la escala, el anclaje
|
|
643
|
+
en 14 y que todo tamaño multiplique la escala de accesibilidad.
|
|
644
|
+
|
|
645
|
+
## 0.1.0-beta.5
|
|
646
|
+
|
|
647
|
+
### Minor Changes
|
|
648
|
+
|
|
649
|
+
- ba4ed7a: **Interruptor, checkbox y radio: primario oscuro con la marca blanca; y las
|
|
650
|
+
muestras de preset, redondas y del color puro.**
|
|
651
|
+
- El interruptor encendido llevaba el pulgar casi negro (`--netzi-on-primary`)
|
|
652
|
+
sobre el azul claro, porque sobre ese azul el blanco no llega a 3:1. Negro
|
|
653
|
+
sobre azul se veía raro (queja literal). Los tres controles de selección pasan
|
|
654
|
+
a pintar el estado activo con `--netzi-primary-dark` y encima el nuevo
|
|
655
|
+
`--netzi-on-primary-dark`, blanco en todos los presets: pasa de 3:1 en cada uno
|
|
656
|
+
y en los dos temas, y la pista encendida se distingue del fondo (el morado
|
|
657
|
+
oscuro sube un punto en tema oscuro para eso). Lo fija el guardián.
|
|
658
|
+
- Las muestras de preset del panel de ajustes eran cuadrados con un tinte del
|
|
659
|
+
color al 18 % y el color dentro; en oscuro salían marrón, oliva, granate…
|
|
660
|
+
seis manchas turbias. Ahora son círculos del color puro y el activo lleva un
|
|
661
|
+
anillo con hueco (`outline` con offset, que funciona igual sobre cristal).
|
|
662
|
+
- El pulgar del interruptor y el del deslizador pasan a `--netzi-thumb`, opaco;
|
|
663
|
+
iban con `--netzi-surface`, que dentro de un panel de cristal es un tinte
|
|
664
|
+
translúcido, y salían como un agujero oscuro con un aro.
|
|
665
|
+
|
|
666
|
+
- f34e282: **El cristal se ve igual en todas las capas, y con grosor.** Venía de una queja
|
|
667
|
+
con razón: «casi todas las ventanas que lo soportan tienen colores o
|
|
668
|
+
transparencia diferente». Lo era, y era medible.
|
|
669
|
+
- **Un solo velo.** El fondo que apaga la app detrás de una capa modal estaba
|
|
670
|
+
escrito a mano en cada componente y no coincidía: `modal`, `drawer` y la paleta
|
|
671
|
+
⌘K usaban `rgba(8,12,20,.55)` con `blur(2px)`, `connection-guard` iba a `.62`
|
|
672
|
+
con `blur(3px)`, y el menú lateral en móvil a `.5` **sin desenfoque**. Ahora
|
|
673
|
+
todos salen de **`--netzi-scrim`** y **`--netzi-scrim-filter`**, que además se
|
|
674
|
+
hunden un punto en tema oscuro (el mismo alfa sobre un fondo ya oscuro apenas
|
|
675
|
+
separaba la capa del contenido).
|
|
676
|
+
- **El canto tiene grosor.** `--netzi-float-glow` pasa de una sola línea de luz
|
|
677
|
+
arriba a **luz arriba + sombra dentro del borde de abajo**. Un filo solo se lee
|
|
678
|
+
como un velo iluminado; los dos juntos, como el canto de una pieza de vidrio.
|
|
679
|
+
- **El velo deja la app viva.** Bajó de `0.55` a `0.28` en claro (y de `.62` a
|
|
680
|
+
`.45` en oscuro), con un desenfoque casi nulo: con el valor anterior, abrir un
|
|
681
|
+
panel dejaba todo el contenido de detrás en un gris muerto. Lo que se difumina
|
|
682
|
+
es lo que hay **bajo el panel**, que es de lo que va el cristal.
|
|
683
|
+
- **La lámina se lee como lámina.** El realce sube a `saturate(200%)` y el brillo
|
|
684
|
+
del filtro a `1.45` en claro, para que el panel salga blanco esmerilado en vez
|
|
685
|
+
de gris sucio. Y el vidrio se abre de verdad, en los dos temas: alfa `0.44` y
|
|
686
|
+
brillo `1.25` en claro (antes `0.70` / `1.2`), alfa `0.12` y brillo `0.56` en
|
|
687
|
+
oscuro (antes `0.62` / `0.68`), y solo 10 px de desenfoque (antes 28), para
|
|
688
|
+
que se vea lo que hay debajo. El punto lo eligió el usuario probando cinco
|
|
689
|
+
niveles del más denso al más abierto, y se quedó el más abierto; con lo de
|
|
690
|
+
antes, un panel se leía como una placa gris opaca. Lo que cede es el caso
|
|
691
|
+
extremo de un plano del color contrario debajo (blanco puro en oscuro, negro
|
|
692
|
+
puro en claro): ahí el texto secundario —dos niveles reforzado, `#d8dee6` en
|
|
693
|
+
oscuro y `#2a333c` en claro— se queda en 4.1-4.2:1, y el primario no baja de
|
|
694
|
+
4.5:1 en ningún caso. Contra el fondo del kit, la tinta y un gris medio (una
|
|
695
|
+
tarjeta o una foto, ya promediadas por el desenfoque) todo pasa de 5:1;
|
|
696
|
+
`tokens-contrast.spec.ts` fija los suelos.
|
|
697
|
+
- **Lo que va dentro de un panel de cristal también es cristal.** Las tarjetas
|
|
698
|
+
del panel de ajustes, la burbuja de un comentario en las notificaciones o el
|
|
699
|
+
hover de un botón pintaban `--netzi-surface*` opaco dentro de una capa
|
|
700
|
+
translúcida. Llegan `--netzi-float-surface`, `-2` y `-3` —tintes translúcidos
|
|
701
|
+
con cristal, las superficies de siempre sin él— y cada capa flotante re-escopa
|
|
702
|
+
las tres superficies a ellos, con lo que todo lo anidado los hereda sin que
|
|
703
|
+
ningún componente tenga que saberlo. Son tintes oscuros en los dos temas
|
|
704
|
+
(una tarjeta es más gris que la lámina); en claro el texto secundario baja un
|
|
705
|
+
punto más para compensar, y el guardián verifica los suelos sobre cada tinte.
|
|
706
|
+
- **La burbuja del valor del slider ya no tapa lo que tiene encima.** Flotaba
|
|
707
|
+
fuera de su caja y se montaba sobre el rótulo: en el panel de ajustes, «TAMAÑO
|
|
708
|
+
DE LETRA» se leía «TAMAÑO DE LET». Ahora el control reserva su hueco cuando
|
|
709
|
+
lleva burbuja.
|
|
710
|
+
- **Al `netzi-cron-picker` le faltaba el filo** (era la única de las quince capas
|
|
711
|
+
sin él) y ya lo lleva.
|
|
712
|
+
|
|
713
|
+
Va con un guardián en la suite que compara **todas** las capas entre sí y falla si
|
|
714
|
+
alguien vuelve a escribir un velo o un desenfoque a mano, o deja una capa sin
|
|
715
|
+
filo. Es lo único que caza esto: leyendo un componente suelto no se ve.
|
|
716
|
+
|
|
717
|
+
- 62a66c3: **Fondo ambiental (`ambient`), y el shell ya no cambia de tono al abrir una capa.**
|
|
718
|
+
- **Fondo ambiental.** Nuevo eje del tema (`NetziThemeService.setAmbient`,
|
|
719
|
+
interruptor «Fondo ambiental» en `netzi-settings`, `data-ambient="on"` en la
|
|
720
|
+
raíz): manchas de color suaves —primario del preset, morado y verde— debajo del
|
|
721
|
+
contenido, que el layout pinta bajo `--netzi-bg` y que se ven a través del
|
|
722
|
+
topbar y del sidebar de cristal. Salió de comparar el kit con una referencia:
|
|
723
|
+
el mismo cristal, sobre un fondo liso, se ve como una placa gris; sobre esto,
|
|
724
|
+
como vidrio. Los porcentajes son bajos y el texto se sigue leyendo encima
|
|
725
|
+
(`--netzi-text-3` sobre la mancha más fuerte: 4.4:1 en claro, 4.6:1 en
|
|
726
|
+
oscuro). Se apaga solo en alto contraste. Token: `--netzi-ambient`.
|
|
727
|
+
- **El shell ya no apaga su filtro bajo una capa modal.** Se hacía por frames
|
|
728
|
+
(30 → 51 medidos) con la premisa de que el velo lo tapaba, y era falsa: el velo
|
|
729
|
+
es translúcido y el topbar daba un salto de tono, sin transición, justo al
|
|
730
|
+
abrir un modal o un drawer. Fuera. `NetziOverlayService` y su marca
|
|
731
|
+
`data-netzi-overlay` se quedan, para que la app reaccione a «hay algo encima».
|
|
732
|
+
|
|
733
|
+
- f2c3dbf: **Llega la lente del canto (opt-in) y `NetziOverlayService`, la cuenta de capas
|
|
734
|
+
modales abiertas.**
|
|
735
|
+
|
|
736
|
+
Salió de intentar la refracción del cristal de Apple. **No se puede hacer hoy**, y
|
|
737
|
+
queda comprobado: Chromium acepta `backdrop-filter: url(#filtro-svg)` y luego lo
|
|
738
|
+
**ignora** —el mismo filtro aplicado como `filter` normal sí deforma el
|
|
739
|
+
contenido—, y Safari ni lo acepta. Así que el fondo no se puede curvar.
|
|
740
|
+
|
|
741
|
+
Lo que sí se puede, y lo que salió midiendo:
|
|
742
|
+
- **`NetziOverlayService`** lleva la cuenta de las capas modales abiertas
|
|
743
|
+
(modal, drawer, ⌘K, aviso de conexión) y marca el documento con
|
|
744
|
+
`data-netzi-overlay="open"`, para que la app pueda reaccionar (pausar una
|
|
745
|
+
animación cara, un vídeo de fondo). Se cuenta en vez de marcar un booleano
|
|
746
|
+
porque las capas se apilan (un drawer que abre un modal de confirmación).
|
|
747
|
+
Con esa marca el kit apagaba el filtro del topbar y del sidebar bajo el velo
|
|
748
|
+
(30 → 51 fps medidos) y **se descartó**: el velo es translúcido y el salto de
|
|
749
|
+
tono del shell se veía al abrir. Antes coherencia que frames.
|
|
750
|
+
- **La lente del canto** (`data-glass-lens="on"`): el borde de modal, drawer y ⌘K
|
|
751
|
+
lleva su propio desenfoque, más fuerte que el del interior, y eso da la
|
|
752
|
+
sensación de espesor. Es **opt-in** porque es una segunda capa de
|
|
753
|
+
`backdrop-filter`: con una sola capa en pantalla sale **gratis** (60 fps), pero
|
|
754
|
+
apilada con el shell cae a **26**.
|
|
755
|
+
|
|
756
|
+
De paso, `netzi-command` pasa a pintar su cristal en una capa aparte como el
|
|
757
|
+
modal y el drawer: tenerlo en el propio elemento habría hecho que el anillo
|
|
758
|
+
filtrara sobre un fondo ya filtrado.
|
|
759
|
+
|
|
760
|
+
## 0.1.0-beta.4
|
|
761
|
+
|
|
762
|
+
### Minor Changes
|
|
763
|
+
|
|
764
|
+
- 38da044: **Contraste del texto: los tres niveles pasan WCAG AA en los cuatro escenarios.**
|
|
765
|
+
`--netzi-text-3` era el token de **todos** los rótulos secundarios del kit —etiquetas,
|
|
766
|
+
ayudas, pies, metadatos, placeholders— y no llegaba al mínimo en ningún tema (2.73 y 2.52
|
|
767
|
+
en claro, 3.77 y 4.12 en oscuro, con 4.5:1 exigido). El modo `[data-contrast='high']`, que
|
|
768
|
+
existe justo para esto, subía `border`, `border-2` y `text-2` pero **no lo tocaba**.
|
|
769
|
+
|
|
770
|
+
Cada nivel pasa a tener un papel, y no son tres grados de gris intercambiables:
|
|
771
|
+
- **`--netzi-text-2` es todo el texto secundario** (`#637381` → `#5c6b78` en claro). Sube
|
|
772
|
+
porque el valor anterior tampoco llegaba sobre `--netzi-surface-3` (4.31:1), la
|
|
773
|
+
superficie que la auditoría original no miró y que usan chips, badges, kbd y pestañas.
|
|
774
|
+
- **`--netzi-text-3` queda reservado a lo NO textual** —iconos decorativos, chevrons,
|
|
775
|
+
separadores, líneas, la barra de redimensionar y los estados deshabilitados— y sube a
|
|
776
|
+
`#7a8996` para cumplir el 3:1 de SC 1.4.11. Ya no es una trampa esperando a que alguien
|
|
777
|
+
lo use para un rótulo.
|
|
778
|
+
- **`[data-contrast='high']` redefine también `text-3`**: cada nivel toma el valor del de
|
|
779
|
+
encima, así que el modo cumple 4.5:1 incluso donde se haya usado `text-3` para texto.
|
|
780
|
+
|
|
781
|
+
En el kit se han migrado a `--netzi-text-2` las **67 declaraciones que sí pintan texto** en
|
|
782
|
+
34 componentes (data-table, command, clock, date, time, combobox, select, notifications,
|
|
783
|
+
layout, richtext, table, stat, stepper, contacts, dropzone, chart…), y se han quitado dos
|
|
784
|
+
`opacity` que anulaban el token por debajo: los días del mes contiguo del calendario
|
|
785
|
+
quedaban en 2.25:1 efectivo y la guía del pie de imagen del editor en 3:1. Las 43
|
|
786
|
+
declaraciones restantes siguen en `text-3` a propósito, porque no son texto.
|
|
787
|
+
|
|
788
|
+
Además, **el path de `netzi-page-header` marca la página actual reforzándola**
|
|
789
|
+
(`--netzi-text` + peso 600) en vez de atenuarla, igual que ya hacía `netzi-breadcrumb`.
|
|
790
|
+
|
|
791
|
+
Los ratios están medidos sobre el propio `tokens.css` y verificados por
|
|
792
|
+
`tokens-contrast.spec.ts`: si un valor deja de cumplir, la suite se pone roja.
|
|
793
|
+
|
|
794
|
+
- 059475f: **Los colores semánticos y el primario cumplen contraste como texto.** Tenían dos
|
|
795
|
+
papeles y no valían para los dos: el saturado es de **relleno** (un fondo, un punto
|
|
796
|
+
de estado, una barra de gráfica), y como **texto** sobre superficie clara no llegaba
|
|
797
|
+
ni de lejos. Medido: los badges daban 1.46-2.36:1, el semántico suelto 1.63-2.78:1
|
|
798
|
+
y el blanco sobre el primario azul —el preset por defecto— **2.68:1** en los dos
|
|
799
|
+
temas.
|
|
800
|
+
|
|
801
|
+
**Tokens nuevos, uno por color**: `--netzi-blue-text`, `--netzi-green-text`,
|
|
802
|
+
`--netzi-yellow-text`, `--netzi-red-text`, `--netzi-purple-text` y
|
|
803
|
+
`--netzi-primary-text`, este último redefinido **por preset** (el primario es
|
|
804
|
+
themeable, así que su versión legible también). Oscurecidos en claro; en oscuro casi
|
|
805
|
+
todos sirven crudos y solo el rojo y el morado piden un punto de luz. Cada uno
|
|
806
|
+
cumple 4.5:1 sobre las cuatro superficies **y sobre su propio tinte**, que es el
|
|
807
|
+
fondo del badge y el caso peor.
|
|
808
|
+
|
|
809
|
+
Migradas las **69 declaraciones `color:`** de 41 archivos. Los rellenos
|
|
810
|
+
(`background`, `border-color`, el `fill` de una barra) **no se tocan**: ahí el
|
|
811
|
+
saturado es el correcto.
|
|
812
|
+
|
|
813
|
+
**La tinta sobre un relleno sólido pasa a ser la que cumple sobre ESE color**, no
|
|
814
|
+
una fija. `--netzi-on-primary` y `--netzi-on-accent` pasan a tinta oscura: es lo que
|
|
815
|
+
el kit ya hacía con los presets verde, naranja y cyan, así que unifica en vez de
|
|
816
|
+
inventar y no cambia ningún color de marca. El morado es el único que se queda en
|
|
817
|
+
blanco, porque es el único donde la oscura no cumple (4.13 frente a 4.57).
|
|
818
|
+
|
|
819
|
+
**Tres `color: #fff` en duro** que ninguna migración de tokens podía alcanzar y que
|
|
820
|
+
ningún tema tocaba: el contador de notificaciones (2.78:1 sobre el rojo), el número
|
|
821
|
+
del paso con error del stepper y la marca del checkbox del select. Más la marca del
|
|
822
|
+
sidebar, que fijaba su tinta en duro sobre el degradado.
|
|
823
|
+
|
|
824
|
+
**Y un guardián nuevo** para que no vuelva a colarse: el spec falla si aparece un
|
|
825
|
+
`color:` con un literal en vez de un token, nombrando archivo y declaración.
|
|
826
|
+
|
|
827
|
+
De paso se simplifica el cristal: el refuerzo del texto pasa a declararse en el
|
|
828
|
+
propio eje `[data-glass='on']` con literales, en vez de redefinir `--netzi-text-2`
|
|
829
|
+
en cada una de las 15 capas apuntando a un token intermedio. Menos indirección y una
|
|
830
|
+
declaración por tema en lugar de treinta.
|
|
831
|
+
|
|
832
|
+
- 959d2fc: **Superficies de cristal para las capas flotantes.** Nuevo eje de tema
|
|
833
|
+
`data-glass="on"` (`NetziThemeService.setGlass()`, con su interruptor en
|
|
834
|
+
`netzi-settings`): las capas que se pintan **encima** del contenido —topbar,
|
|
835
|
+
sidebar, paneles de select/combobox/date/time/cron/teléfono, popover y todo lo que
|
|
836
|
+
lo usa (menú, notificaciones, contactos, cuenta, idioma, menús de la tabla), modal,
|
|
837
|
+
drawer, paleta ⌘K, toasts, menú de tabla del editor y el aviso de conexión— pasan a
|
|
838
|
+
ser translúcidas con el fondo desenfocado y saturado. Las superficies de
|
|
839
|
+
**contenido** (tarjetas, secciones, tablas) siguen opacas a propósito.
|
|
840
|
+
|
|
841
|
+
Los componentes no saben nada del cristal: consumen tokens nuevos
|
|
842
|
+
(`--netzi-float-bg`, `--netzi-float-border`, `--netzi-float-border-2`,
|
|
843
|
+
`--netzi-float-filter`, `--netzi-float-text-2`, `--netzi-float-text-3`) que con el
|
|
844
|
+
eje apagado valen exactamente lo mismo que los de siempre.
|
|
845
|
+
|
|
846
|
+
**El suelo de contraste no lo pone solo el alfa.** Sobre cristal el texto se lee
|
|
847
|
+
contra lo que haya debajo, que cambia al scrollear, así que el caso a cumplir es el
|
|
848
|
+
fondo más contrario posible. Taparlo con opacidad exige alfa 0.82, y a 0.82 esto ya
|
|
849
|
+
no parece cristal; en su lugar el propio `backdrop-filter` **acota el fondo** antes
|
|
850
|
+
de componerlo —`contrast(0.6)` comprime su rango y `brightness()` lo empuja al tono
|
|
851
|
+
de la capa (`1.2` en claro, `0.66` en oscuro)—, y con eso bastan **0.70** de alfa en
|
|
852
|
+
claro y **0.62** en oscuro: se ve lo de detrás y el peor caso sigue dando **4.64:1**
|
|
853
|
+
(negro puro debajo) y **4.66:1** (blanco puro debajo), con el texto de la capa subido
|
|
854
|
+
un nivel. `tokens-contrast.spec.ts` modela la cadena entera, no solo el alfa. Las
|
|
855
|
+
capas llevan además un filo especular (`--netzi-float-glow`), que es lo que hace que
|
|
856
|
+
una superficie translúcida se lea como cristal y no como un velo.
|
|
857
|
+
|
|
858
|
+
**El desenfoque no va en las capas que hospedan controles anclados.** Un
|
|
859
|
+
`backdrop-filter` distinto de `none` convierte al elemento en bloque contenedor de
|
|
860
|
+
sus descendientes `position: fixed`: medido, un hijo fijo saltaba de (0,0) al origen
|
|
861
|
+
del contenedor. Como el topbar, el sidebar, el popover, el modal, el drawer y el
|
|
862
|
+
panel de fecha hospedan controles que se anclan al viewport, en esos el filtro va en
|
|
863
|
+
una capa `::before` aparte. El panel de `netzi-date` además pasa a scrollear en un
|
|
864
|
+
envoltorio interior, para que su capa de cristal no se desplace con el contenido.
|
|
865
|
+
|
|
866
|
+
**`netzi-tooltip` se queda opaco a propósito.** Es tinta invertida
|
|
867
|
+
(`--netzi-text` de fondo) sobre un texto diminuto y efímero, que es justo donde la
|
|
868
|
+
translucidez más estorba y menos aporta; el cristal ahí sería un peaje de
|
|
869
|
+
legibilidad sin ganancia visual.
|
|
870
|
+
|
|
871
|
+
Degradación automática, sin JS: con `prefers-reduced-transparency: reduce` y donde
|
|
872
|
+
no haya `backdrop-filter`, la superficie opaca de siempre.
|
|
873
|
+
|
|
874
|
+
- af3207d: **Alias semánticos de estado, alias por simetría y un tinte marcado.** Toda app
|
|
875
|
+
da por hechos `--netzi-success` / `--netzi-warning` / `--netzi-danger` /
|
|
876
|
+
`--netzi-info`, y hasta ahora solo existían los colores crudos
|
|
877
|
+
(`--netzi-green`…). El problema no es el nombre: un token que no existe **no
|
|
878
|
+
falla**. La declaración entera se descarta y el elemento se queda sin fondo, sin
|
|
879
|
+
color o sin radio, sin un aviso en build ni en consola. El propio kit lo tenía:
|
|
880
|
+
`netzi-cron-picker` pintaba el borde y la nota del campo con error con
|
|
881
|
+
`var(--netzi-danger)` y llevaba desde el primer día marcándolos en gris.
|
|
882
|
+
- Los cuatro estados, en crudo y como texto (`--netzi-danger-text`…), declarados
|
|
883
|
+
como **referencia** al color de marca, no como copia.
|
|
884
|
+
- Alias por simetría: `--netzi-surface-1`, `--netzi-text-1` y
|
|
885
|
+
`--netzi-radius-md`, que son los nombres que se escriben al ver el `-2`.
|
|
886
|
+
- **`--netzi-primary-tint-strong`** (22 % en claro, 28 % en oscuro): el tinte del
|
|
887
|
+
10 % está calibrado para superficies grandes y en una pieza pequeña se pierde
|
|
888
|
+
contra el panel (1.13:1). Este llega a 1.32:1. Su tinta es `--netzi-text`; el
|
|
889
|
+
suave no se puede subir porque es el techo de `--netzi-primary-text`.
|
|
890
|
+
- Un **guardián en la suite** (`tokens-declarados.spec.ts`) recorre todo el CSS
|
|
891
|
+
del kit y falla si un `var(--netzi-*)` apunta a un token que nadie declara, que
|
|
892
|
+
es como se destapó lo del cron.
|
|
893
|
+
|
|
894
|
+
### Patch Changes
|
|
895
|
+
|
|
896
|
+
- 1175b77: Alturas de control estandarizadas: todos los inputs de valor (input, select,
|
|
897
|
+
número, password, teléfono, combobox, moneda, color, búsqueda, fecha, hora) y el
|
|
898
|
+
botón comparten una **altura fija por tamaño** (sm 36 / md 44 / lg 52 px;
|
|
899
|
+
compacta 32/40/46) vía tokens `--netzi-control-h-{sm,md,lg}`, así alinean exacto
|
|
900
|
+
al ponerlos en fila. Los inputs de valor ganan un input `size` (sm/md/lg). Las
|
|
901
|
+
alturas escalan con `--netzi-font-scale`. Se corrige el botón `lg` (antes medía
|
|
902
|
+
igual que `md`). Multilínea (textarea, tags) quedan como excepción con
|
|
903
|
+
`min-height`.
|
|
904
|
+
- 1175b77: **Los README de los paquetes ya dicen qué registry usar, y por qué el otro es
|
|
905
|
+
peligroso.** Ninguno documentaba la configuración del scope `@netzi`: el de `ui` solo
|
|
906
|
+
decía `pnpm add …` y el de `tokens` remitía al `.npmrc` "del repo", que un consumidor
|
|
907
|
+
externo no tiene. Como el README **viaja dentro del paquete**, es el sitio por el que se
|
|
908
|
+
enteran los de fuera.
|
|
909
|
+
|
|
910
|
+
Ahora los dos traen la línea del endpoint del **proyecto** y el aviso de que el endpoint
|
|
911
|
+
de **grupo** reenvía al npm público cualquier `@netzi/*` que no encuentre
|
|
912
|
+
(`302 → registry.npmjs.org`), que el scope `@netzi` **no está reclamado** en npmjs.org y
|
|
913
|
+
que apagar el reenvío en los ajustes del grupo **no lo evita** (issue #16).
|
|
914
|
+
|
|
915
|
+
- 1175b77: El **`CHANGELOG.md` ahora se incluye en el paquete publicado**. Antes solo se
|
|
916
|
+
empaquetaba el `README.md` (ng-packagr lo copia solo; el CHANGELOG no estaba en los
|
|
917
|
+
`assets` de `@netzi/ui` ni en el `files` de `@netzi/tokens`), así que quien instalaba
|
|
918
|
+
el paquete no veía el historial de cambios. Se añade `./CHANGELOG.md` a los assets de
|
|
919
|
+
`@netzi/ui` y a `files` de `@netzi/tokens`. Aplica desde la próxima publicación.
|
|
920
|
+
|
|
921
|
+
## 0.1.0-beta.3
|
|
922
|
+
|
|
923
|
+
### Minor Changes
|
|
924
|
+
|
|
925
|
+
- 13ebbcd: Nueva **escala de espaciado** `--netzi-space-0..8` (base 4px: 0/2/4/8/12/16/24/32/48).
|
|
926
|
+
Da a las apps tokens de gaps/paddings coherentes con el sistema, en vez de píxeles/rem
|
|
927
|
+
sueltos. Bajo `[data-density='compact']` los pasos medios/grandes se reducen (4→10, 5→12,
|
|
928
|
+
6→20, 7→28, 8→40), coherente con la densidad de los controles; los pasos finos no cambian.
|
|
929
|
+
Documentada en el README de tokens, en el showcase de tokens (sección "Espaciado") y en
|
|
930
|
+
Storybook (Fundamentos/Espaciado). Cierra #34.
|
|
931
|
+
|
|
932
|
+
## 0.1.0-beta.2
|
|
933
|
+
|
|
934
|
+
### Patch Changes
|
|
935
|
+
|
|
936
|
+
- 1e27de5: El **`CHANGELOG.md` ahora se incluye en el paquete publicado**. Antes solo se
|
|
937
|
+
empaquetaba el `README.md` (ng-packagr lo copia solo; el CHANGELOG no estaba en los
|
|
938
|
+
`assets` de `@netzi/ui` ni en el `files` de `@netzi/tokens`), así que quien instalaba
|
|
939
|
+
el paquete no veía el historial de cambios. Se añade `./CHANGELOG.md` a los assets de
|
|
940
|
+
`@netzi/ui` y a `files` de `@netzi/tokens`. Aplica desde la próxima publicación.
|
|
941
|
+
|
|
942
|
+
## 0.1.0-beta.1
|
|
943
|
+
|
|
944
|
+
### Patch Changes
|
|
945
|
+
|
|
946
|
+
- 145ff48: Alturas de control estandarizadas: todos los inputs de valor (input, select,
|
|
947
|
+
número, password, teléfono, combobox, moneda, color, búsqueda, fecha, hora) y el
|
|
948
|
+
botón comparten una **altura fija por tamaño** (sm 36 / md 44 / lg 52 px;
|
|
949
|
+
compacta 32/40/46) vía tokens `--netzi-control-h-{sm,md,lg}`, así alinean exacto
|
|
950
|
+
al ponerlos en fila. Los inputs de valor ganan un input `size` (sm/md/lg). Las
|
|
951
|
+
alturas escalan con `--netzi-font-scale`. Se corrige el botón `lg` (antes medía
|
|
952
|
+
igual que `md`). Multilínea (textarea, tags) quedan como excepción con
|
|
953
|
+
`min-height`.
|
|
954
|
+
|
|
955
|
+
## 0.1.0-beta.0
|
|
956
|
+
|
|
957
|
+
Primera beta pública de los tokens (reinicio de numeración: el canal beta
|
|
958
|
+
arranca aquí; el desarrollo previo vive en la historia de git).
|
|
959
|
+
|
|
960
|
+
Incluye: superficies y texto para tema claro/oscuro, color primario con
|
|
961
|
+
presets (`[data-preset]`) y tinte derivado, tonos semánticos, contraste alto,
|
|
962
|
+
densidad compacta, radios (`--netzi-radius-sm/-/lg`), sombras, tipografía con
|
|
963
|
+
familia configurable y **escala global de tamaño de letra**
|
|
964
|
+
(`--netzi-font-scale`), y base CSS con herencia correcta de color en
|
|
965
|
+
controles. Override por CSS para white-label.
|