@netzi/tokens 0.1.0-beta.8
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 +389 -0
- package/LICENSE.md +33 -0
- package/README.md +344 -0
- package/package.json +40 -0
- package/styles/base.css +89 -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 +64 -0
- package/styles/index.css +7 -0
- package/styles/tokens.css +665 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# @netzi/tokens
|
|
2
|
+
|
|
3
|
+
## 0.1.0-beta.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c57b4f0: **Publicación en el npm público con licencia propietaria de uso libre** (ADR 0005).
|
|
8
|
+
Los paquetes pasan a `registry.npmjs.org` con `access: public`, `homepage`
|
|
9
|
+
(<https://ui.netzi.tech>), `bugs` (netzi.tech@gmail.com) y `LICENSE.md` dentro:
|
|
10
|
+
instalar y usar es libre en cualquier aplicación; redistribuir o derivar, no. El
|
|
11
|
+
tarball deja de llevar sourcemaps (exponían el TypeScript original) y `files` deja
|
|
12
|
+
fuera todo lo que no sea el compilado, los tipos, las hojas y la documentación.
|
|
13
|
+
|
|
14
|
+
## 0.1.0-beta.7
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- effd0cd: **Fuentes de marca autoalojadas** (#59). `fonts.css` importaba Plus Jakarta Sans
|
|
19
|
+
y Fira Code desde Google Fonts: toda app que lo usara mandaba la IP de cada
|
|
20
|
+
visitante a Google antes de ningún consentimiento (políticas 14 y 08b). Ahora las
|
|
21
|
+
dos familias viajan **dentro del paquete** como fuentes variables woff2
|
|
22
|
+
(`styles/fonts/`, ~95 KB) en dos subconjuntos, `latin` y `latin-ext` (ç, ñ, ß, ã,
|
|
23
|
+
l·l), con `font-display: swap` y sus licencias OFL-1.1 al lado. La importación
|
|
24
|
+
no cambia (`@import '@netzi/tokens/fonts.css'`); Vite y el CLI de Angular
|
|
25
|
+
reescriben las rutas y copian los archivos al build. Un guardián impide que
|
|
26
|
+
ninguna hoja publicada vuelva a cargar algo de fuera.
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- 0ff1e00: **Contraste (WCAG 1.4.3) en botón `soft`, anuncios y página de estado** (#56).
|
|
31
|
+
axe sobre las 58 páginas del playground, en claro y oscuro:
|
|
32
|
+
- `netzi-button variant="soft"` escribía con `--netzi-primary-dark` (4.34:1 en
|
|
33
|
+
claro, **2.85:1** en oscuro) y su hover era un azul literal que ignoraba el
|
|
34
|
+
preset. Ahora escribe con `--netzi-primary-text` (garantizado a 4.5:1 sobre el
|
|
35
|
+
tinte en los seis presets y los dos temas) y el hover usa
|
|
36
|
+
`--netzi-primary-tint-strong`. El hover y la sombra del botón primario también
|
|
37
|
+
dejan de ser azul fijo: siguen al preset.
|
|
38
|
+
- `netzi-announcement` de éxito (**2.7:1**) y peligro (4.2:1) mezclaban el acento
|
|
39
|
+
demasiado claro para el texto blanco; las mezclas bajan al 50 % y 65 % y las
|
|
40
|
+
tintas pasan a tokens (`--netzi-on-primary-dark`, `--netzi-on-accent`). Un
|
|
41
|
+
guardián mide cada mezcla como la calcula el navegador.
|
|
42
|
+
- El código gigante de `netzi-status-page` (ilustración al 12 %) pasa a ser
|
|
43
|
+
decoración de verdad: `aria-hidden` y el número pintado por CSS desde
|
|
44
|
+
`data-code`. El estado lo dan el título y la descripción de `netzi-result`.
|
|
45
|
+
- README de tokens: `--netzi-primary` / `--netzi-blue` y compañía son relleno;
|
|
46
|
+
para texto van sus `-text`.
|
|
47
|
+
|
|
48
|
+
Los placeholders de `netzi-input` / `netzi-number` que citaba la incidencia no
|
|
49
|
+
se reproducen: usan `--netzi-text-2` (5.5:1 sobre blanco) y axe no los marca en
|
|
50
|
+
ninguna página.
|
|
51
|
+
|
|
52
|
+
## 0.1.0-beta.6
|
|
53
|
+
|
|
54
|
+
### Minor Changes
|
|
55
|
+
|
|
56
|
+
- 0adae8d: **Escala tipográfica** (#51). El kit publicaba tamaños solo para sus controles
|
|
57
|
+
(`--netzi-control-fs-*`); el texto que no es un control —líneas secundarias,
|
|
58
|
+
pies, metadatos, títulos— no tenía token, cada app se inventaba el suyo y
|
|
59
|
+
`var(--netzi-font-size-xs)`, que parece existir, se descartaba en silencio.
|
|
60
|
+
Llegan `--netzi-font-size-xs/sm/md/lg/xl/2xl/3xl` (11 · 12.5 · 14 · 16 · 18 ·
|
|
61
|
+
22 · 28 px, sacados de lo que el kit ya usa; `md` = 14px es el 100 % de
|
|
62
|
+
`--netzi-font-scale`, con el que todos escalan), `--netzi-line-height-none/
|
|
63
|
+
tight/normal/relaxed` (1 / 1.25 / 1.5 / 1.65) y
|
|
64
|
+
`--netzi-font-weight-regular…extrabold` (400–800, los cortes que carga
|
|
65
|
+
`fonts.css`). La densidad compacta no los cambia. Documentados en el README de
|
|
66
|
+
tokens y en el showcase («Tipografía»); un guardián fija la escala, el anclaje
|
|
67
|
+
en 14 y que todo tamaño multiplique la escala de accesibilidad.
|
|
68
|
+
|
|
69
|
+
## 0.1.0-beta.5
|
|
70
|
+
|
|
71
|
+
### Minor Changes
|
|
72
|
+
|
|
73
|
+
- ba4ed7a: **Interruptor, checkbox y radio: primario oscuro con la marca blanca; y las
|
|
74
|
+
muestras de preset, redondas y del color puro.**
|
|
75
|
+
- El interruptor encendido llevaba el pulgar casi negro (`--netzi-on-primary`)
|
|
76
|
+
sobre el azul claro, porque sobre ese azul el blanco no llega a 3:1. Negro
|
|
77
|
+
sobre azul se veía raro (queja literal). Los tres controles de selección pasan
|
|
78
|
+
a pintar el estado activo con `--netzi-primary-dark` y encima el nuevo
|
|
79
|
+
`--netzi-on-primary-dark`, blanco en todos los presets: pasa de 3:1 en cada uno
|
|
80
|
+
y en los dos temas, y la pista encendida se distingue del fondo (el morado
|
|
81
|
+
oscuro sube un punto en tema oscuro para eso). Lo fija el guardián.
|
|
82
|
+
- Las muestras de preset del panel de ajustes eran cuadrados con un tinte del
|
|
83
|
+
color al 18 % y el color dentro; en oscuro salían marrón, oliva, granate…
|
|
84
|
+
seis manchas turbias. Ahora son círculos del color puro y el activo lleva un
|
|
85
|
+
anillo con hueco (`outline` con offset, que funciona igual sobre cristal).
|
|
86
|
+
- El pulgar del interruptor y el del deslizador pasan a `--netzi-thumb`, opaco;
|
|
87
|
+
iban con `--netzi-surface`, que dentro de un panel de cristal es un tinte
|
|
88
|
+
translúcido, y salían como un agujero oscuro con un aro.
|
|
89
|
+
|
|
90
|
+
- f34e282: **El cristal se ve igual en todas las capas, y con grosor.** Venía de una queja
|
|
91
|
+
con razón: «casi todas las ventanas que lo soportan tienen colores o
|
|
92
|
+
transparencia diferente». Lo era, y era medible.
|
|
93
|
+
- **Un solo velo.** El fondo que apaga la app detrás de una capa modal estaba
|
|
94
|
+
escrito a mano en cada componente y no coincidía: `modal`, `drawer` y la paleta
|
|
95
|
+
⌘K usaban `rgba(8,12,20,.55)` con `blur(2px)`, `connection-guard` iba a `.62`
|
|
96
|
+
con `blur(3px)`, y el menú lateral en móvil a `.5` **sin desenfoque**. Ahora
|
|
97
|
+
todos salen de **`--netzi-scrim`** y **`--netzi-scrim-filter`**, que además se
|
|
98
|
+
hunden un punto en tema oscuro (el mismo alfa sobre un fondo ya oscuro apenas
|
|
99
|
+
separaba la capa del contenido).
|
|
100
|
+
- **El canto tiene grosor.** `--netzi-float-glow` pasa de una sola línea de luz
|
|
101
|
+
arriba a **luz arriba + sombra dentro del borde de abajo**. Un filo solo se lee
|
|
102
|
+
como un velo iluminado; los dos juntos, como el canto de una pieza de vidrio.
|
|
103
|
+
- **El velo deja la app viva.** Bajó de `0.55` a `0.28` en claro (y de `.62` a
|
|
104
|
+
`.45` en oscuro), con un desenfoque casi nulo: con el valor anterior, abrir un
|
|
105
|
+
panel dejaba todo el contenido de detrás en un gris muerto. Lo que se difumina
|
|
106
|
+
es lo que hay **bajo el panel**, que es de lo que va el cristal.
|
|
107
|
+
- **La lámina se lee como lámina.** El realce sube a `saturate(200%)` y el brillo
|
|
108
|
+
del filtro a `1.45` en claro, para que el panel salga blanco esmerilado en vez
|
|
109
|
+
de gris sucio. Y el vidrio se abre de verdad, en los dos temas: alfa `0.44` y
|
|
110
|
+
brillo `1.25` en claro (antes `0.70` / `1.2`), alfa `0.12` y brillo `0.56` en
|
|
111
|
+
oscuro (antes `0.62` / `0.68`), y solo 10 px de desenfoque (antes 28), para
|
|
112
|
+
que se vea lo que hay debajo. El punto lo eligió el usuario probando cinco
|
|
113
|
+
niveles del más denso al más abierto, y se quedó el más abierto; con lo de
|
|
114
|
+
antes, un panel se leía como una placa gris opaca. Lo que cede es el caso
|
|
115
|
+
extremo de un plano del color contrario debajo (blanco puro en oscuro, negro
|
|
116
|
+
puro en claro): ahí el texto secundario —dos niveles reforzado, `#d8dee6` en
|
|
117
|
+
oscuro y `#2a333c` en claro— se queda en 4.1-4.2:1, y el primario no baja de
|
|
118
|
+
4.5:1 en ningún caso. Contra el fondo del kit, la tinta y un gris medio (una
|
|
119
|
+
tarjeta o una foto, ya promediadas por el desenfoque) todo pasa de 5:1;
|
|
120
|
+
`tokens-contrast.spec.ts` fija los suelos.
|
|
121
|
+
- **Lo que va dentro de un panel de cristal también es cristal.** Las tarjetas
|
|
122
|
+
del panel de ajustes, la burbuja de un comentario en las notificaciones o el
|
|
123
|
+
hover de un botón pintaban `--netzi-surface*` opaco dentro de una capa
|
|
124
|
+
translúcida. Llegan `--netzi-float-surface`, `-2` y `-3` —tintes translúcidos
|
|
125
|
+
con cristal, las superficies de siempre sin él— y cada capa flotante re-escopa
|
|
126
|
+
las tres superficies a ellos, con lo que todo lo anidado los hereda sin que
|
|
127
|
+
ningún componente tenga que saberlo. Son tintes oscuros en los dos temas
|
|
128
|
+
(una tarjeta es más gris que la lámina); en claro el texto secundario baja un
|
|
129
|
+
punto más para compensar, y el guardián verifica los suelos sobre cada tinte.
|
|
130
|
+
- **La burbuja del valor del slider ya no tapa lo que tiene encima.** Flotaba
|
|
131
|
+
fuera de su caja y se montaba sobre el rótulo: en el panel de ajustes, «TAMAÑO
|
|
132
|
+
DE LETRA» se leía «TAMAÑO DE LET». Ahora el control reserva su hueco cuando
|
|
133
|
+
lleva burbuja.
|
|
134
|
+
- **Al `netzi-cron-picker` le faltaba el filo** (era la única de las quince capas
|
|
135
|
+
sin él) y ya lo lleva.
|
|
136
|
+
|
|
137
|
+
Va con un guardián en la suite que compara **todas** las capas entre sí y falla si
|
|
138
|
+
alguien vuelve a escribir un velo o un desenfoque a mano, o deja una capa sin
|
|
139
|
+
filo. Es lo único que caza esto: leyendo un componente suelto no se ve.
|
|
140
|
+
|
|
141
|
+
- 62a66c3: **Fondo ambiental (`ambient`), y el shell ya no cambia de tono al abrir una capa.**
|
|
142
|
+
- **Fondo ambiental.** Nuevo eje del tema (`NetziThemeService.setAmbient`,
|
|
143
|
+
interruptor «Fondo ambiental» en `netzi-settings`, `data-ambient="on"` en la
|
|
144
|
+
raíz): manchas de color suaves —primario del preset, morado y verde— debajo del
|
|
145
|
+
contenido, que el layout pinta bajo `--netzi-bg` y que se ven a través del
|
|
146
|
+
topbar y del sidebar de cristal. Salió de comparar el kit con una referencia:
|
|
147
|
+
el mismo cristal, sobre un fondo liso, se ve como una placa gris; sobre esto,
|
|
148
|
+
como vidrio. Los porcentajes son bajos y el texto se sigue leyendo encima
|
|
149
|
+
(`--netzi-text-3` sobre la mancha más fuerte: 4.4:1 en claro, 4.6:1 en
|
|
150
|
+
oscuro). Se apaga solo en alto contraste. Token: `--netzi-ambient`.
|
|
151
|
+
- **El shell ya no apaga su filtro bajo una capa modal.** Se hacía por frames
|
|
152
|
+
(30 → 51 medidos) con la premisa de que el velo lo tapaba, y era falsa: el velo
|
|
153
|
+
es translúcido y el topbar daba un salto de tono, sin transición, justo al
|
|
154
|
+
abrir un modal o un drawer. Fuera. `NetziOverlayService` y su marca
|
|
155
|
+
`data-netzi-overlay` se quedan, para que la app reaccione a «hay algo encima».
|
|
156
|
+
|
|
157
|
+
- f2c3dbf: **Llega la lente del canto (opt-in) y `NetziOverlayService`, la cuenta de capas
|
|
158
|
+
modales abiertas.**
|
|
159
|
+
|
|
160
|
+
Salió de intentar la refracción del cristal de Apple. **No se puede hacer hoy**, y
|
|
161
|
+
queda comprobado: Chromium acepta `backdrop-filter: url(#filtro-svg)` y luego lo
|
|
162
|
+
**ignora** —el mismo filtro aplicado como `filter` normal sí deforma el
|
|
163
|
+
contenido—, y Safari ni lo acepta. Así que el fondo no se puede curvar.
|
|
164
|
+
|
|
165
|
+
Lo que sí se puede, y lo que salió midiendo:
|
|
166
|
+
- **`NetziOverlayService`** lleva la cuenta de las capas modales abiertas
|
|
167
|
+
(modal, drawer, ⌘K, aviso de conexión) y marca el documento con
|
|
168
|
+
`data-netzi-overlay="open"`, para que la app pueda reaccionar (pausar una
|
|
169
|
+
animación cara, un vídeo de fondo). Se cuenta en vez de marcar un booleano
|
|
170
|
+
porque las capas se apilan (un drawer que abre un modal de confirmación).
|
|
171
|
+
Con esa marca el kit apagaba el filtro del topbar y del sidebar bajo el velo
|
|
172
|
+
(30 → 51 fps medidos) y **se descartó**: el velo es translúcido y el salto de
|
|
173
|
+
tono del shell se veía al abrir. Antes coherencia que frames.
|
|
174
|
+
- **La lente del canto** (`data-glass-lens="on"`): el borde de modal, drawer y ⌘K
|
|
175
|
+
lleva su propio desenfoque, más fuerte que el del interior, y eso da la
|
|
176
|
+
sensación de espesor. Es **opt-in** porque es una segunda capa de
|
|
177
|
+
`backdrop-filter`: con una sola capa en pantalla sale **gratis** (60 fps), pero
|
|
178
|
+
apilada con el shell cae a **26**.
|
|
179
|
+
|
|
180
|
+
De paso, `netzi-command` pasa a pintar su cristal en una capa aparte como el
|
|
181
|
+
modal y el drawer: tenerlo en el propio elemento habría hecho que el anillo
|
|
182
|
+
filtrara sobre un fondo ya filtrado.
|
|
183
|
+
|
|
184
|
+
## 0.1.0-beta.4
|
|
185
|
+
|
|
186
|
+
### Minor Changes
|
|
187
|
+
|
|
188
|
+
- 38da044: **Contraste del texto: los tres niveles pasan WCAG AA en los cuatro escenarios.**
|
|
189
|
+
`--netzi-text-3` era el token de **todos** los rótulos secundarios del kit —etiquetas,
|
|
190
|
+
ayudas, pies, metadatos, placeholders— y no llegaba al mínimo en ningún tema (2.73 y 2.52
|
|
191
|
+
en claro, 3.77 y 4.12 en oscuro, con 4.5:1 exigido). El modo `[data-contrast='high']`, que
|
|
192
|
+
existe justo para esto, subía `border`, `border-2` y `text-2` pero **no lo tocaba**.
|
|
193
|
+
|
|
194
|
+
Cada nivel pasa a tener un papel, y no son tres grados de gris intercambiables:
|
|
195
|
+
- **`--netzi-text-2` es todo el texto secundario** (`#637381` → `#5c6b78` en claro). Sube
|
|
196
|
+
porque el valor anterior tampoco llegaba sobre `--netzi-surface-3` (4.31:1), la
|
|
197
|
+
superficie que la auditoría original no miró y que usan chips, badges, kbd y pestañas.
|
|
198
|
+
- **`--netzi-text-3` queda reservado a lo NO textual** —iconos decorativos, chevrons,
|
|
199
|
+
separadores, líneas, la barra de redimensionar y los estados deshabilitados— y sube a
|
|
200
|
+
`#7a8996` para cumplir el 3:1 de SC 1.4.11. Ya no es una trampa esperando a que alguien
|
|
201
|
+
lo use para un rótulo.
|
|
202
|
+
- **`[data-contrast='high']` redefine también `text-3`**: cada nivel toma el valor del de
|
|
203
|
+
encima, así que el modo cumple 4.5:1 incluso donde se haya usado `text-3` para texto.
|
|
204
|
+
|
|
205
|
+
En el kit se han migrado a `--netzi-text-2` las **67 declaraciones que sí pintan texto** en
|
|
206
|
+
34 componentes (data-table, command, clock, date, time, combobox, select, notifications,
|
|
207
|
+
layout, richtext, table, stat, stepper, contacts, dropzone, chart…), y se han quitado dos
|
|
208
|
+
`opacity` que anulaban el token por debajo: los días del mes contiguo del calendario
|
|
209
|
+
quedaban en 2.25:1 efectivo y la guía del pie de imagen del editor en 3:1. Las 43
|
|
210
|
+
declaraciones restantes siguen en `text-3` a propósito, porque no son texto.
|
|
211
|
+
|
|
212
|
+
Además, **el path de `netzi-page-header` marca la página actual reforzándola**
|
|
213
|
+
(`--netzi-text` + peso 600) en vez de atenuarla, igual que ya hacía `netzi-breadcrumb`.
|
|
214
|
+
|
|
215
|
+
Los ratios están medidos sobre el propio `tokens.css` y verificados por
|
|
216
|
+
`tokens-contrast.spec.ts`: si un valor deja de cumplir, la suite se pone roja.
|
|
217
|
+
|
|
218
|
+
- 059475f: **Los colores semánticos y el primario cumplen contraste como texto.** Tenían dos
|
|
219
|
+
papeles y no valían para los dos: el saturado es de **relleno** (un fondo, un punto
|
|
220
|
+
de estado, una barra de gráfica), y como **texto** sobre superficie clara no llegaba
|
|
221
|
+
ni de lejos. Medido: los badges daban 1.46-2.36:1, el semántico suelto 1.63-2.78:1
|
|
222
|
+
y el blanco sobre el primario azul —el preset por defecto— **2.68:1** en los dos
|
|
223
|
+
temas.
|
|
224
|
+
|
|
225
|
+
**Tokens nuevos, uno por color**: `--netzi-blue-text`, `--netzi-green-text`,
|
|
226
|
+
`--netzi-yellow-text`, `--netzi-red-text`, `--netzi-purple-text` y
|
|
227
|
+
`--netzi-primary-text`, este último redefinido **por preset** (el primario es
|
|
228
|
+
themeable, así que su versión legible también). Oscurecidos en claro; en oscuro casi
|
|
229
|
+
todos sirven crudos y solo el rojo y el morado piden un punto de luz. Cada uno
|
|
230
|
+
cumple 4.5:1 sobre las cuatro superficies **y sobre su propio tinte**, que es el
|
|
231
|
+
fondo del badge y el caso peor.
|
|
232
|
+
|
|
233
|
+
Migradas las **69 declaraciones `color:`** de 41 archivos. Los rellenos
|
|
234
|
+
(`background`, `border-color`, el `fill` de una barra) **no se tocan**: ahí el
|
|
235
|
+
saturado es el correcto.
|
|
236
|
+
|
|
237
|
+
**La tinta sobre un relleno sólido pasa a ser la que cumple sobre ESE color**, no
|
|
238
|
+
una fija. `--netzi-on-primary` y `--netzi-on-accent` pasan a tinta oscura: es lo que
|
|
239
|
+
el kit ya hacía con los presets verde, naranja y cyan, así que unifica en vez de
|
|
240
|
+
inventar y no cambia ningún color de marca. El morado es el único que se queda en
|
|
241
|
+
blanco, porque es el único donde la oscura no cumple (4.13 frente a 4.57).
|
|
242
|
+
|
|
243
|
+
**Tres `color: #fff` en duro** que ninguna migración de tokens podía alcanzar y que
|
|
244
|
+
ningún tema tocaba: el contador de notificaciones (2.78:1 sobre el rojo), el número
|
|
245
|
+
del paso con error del stepper y la marca del checkbox del select. Más la marca del
|
|
246
|
+
sidebar, que fijaba su tinta en duro sobre el degradado.
|
|
247
|
+
|
|
248
|
+
**Y un guardián nuevo** para que no vuelva a colarse: el spec falla si aparece un
|
|
249
|
+
`color:` con un literal en vez de un token, nombrando archivo y declaración.
|
|
250
|
+
|
|
251
|
+
De paso se simplifica el cristal: el refuerzo del texto pasa a declararse en el
|
|
252
|
+
propio eje `[data-glass='on']` con literales, en vez de redefinir `--netzi-text-2`
|
|
253
|
+
en cada una de las 15 capas apuntando a un token intermedio. Menos indirección y una
|
|
254
|
+
declaración por tema en lugar de treinta.
|
|
255
|
+
|
|
256
|
+
- 959d2fc: **Superficies de cristal para las capas flotantes.** Nuevo eje de tema
|
|
257
|
+
`data-glass="on"` (`NetziThemeService.setGlass()`, con su interruptor en
|
|
258
|
+
`netzi-settings`): las capas que se pintan **encima** del contenido —topbar,
|
|
259
|
+
sidebar, paneles de select/combobox/date/time/cron/teléfono, popover y todo lo que
|
|
260
|
+
lo usa (menú, notificaciones, contactos, cuenta, idioma, menús de la tabla), modal,
|
|
261
|
+
drawer, paleta ⌘K, toasts, menú de tabla del editor y el aviso de conexión— pasan a
|
|
262
|
+
ser translúcidas con el fondo desenfocado y saturado. Las superficies de
|
|
263
|
+
**contenido** (tarjetas, secciones, tablas) siguen opacas a propósito.
|
|
264
|
+
|
|
265
|
+
Los componentes no saben nada del cristal: consumen tokens nuevos
|
|
266
|
+
(`--netzi-float-bg`, `--netzi-float-border`, `--netzi-float-border-2`,
|
|
267
|
+
`--netzi-float-filter`, `--netzi-float-text-2`, `--netzi-float-text-3`) que con el
|
|
268
|
+
eje apagado valen exactamente lo mismo que los de siempre.
|
|
269
|
+
|
|
270
|
+
**El suelo de contraste no lo pone solo el alfa.** Sobre cristal el texto se lee
|
|
271
|
+
contra lo que haya debajo, que cambia al scrollear, así que el caso a cumplir es el
|
|
272
|
+
fondo más contrario posible. Taparlo con opacidad exige alfa 0.82, y a 0.82 esto ya
|
|
273
|
+
no parece cristal; en su lugar el propio `backdrop-filter` **acota el fondo** antes
|
|
274
|
+
de componerlo —`contrast(0.6)` comprime su rango y `brightness()` lo empuja al tono
|
|
275
|
+
de la capa (`1.2` en claro, `0.66` en oscuro)—, y con eso bastan **0.70** de alfa en
|
|
276
|
+
claro y **0.62** en oscuro: se ve lo de detrás y el peor caso sigue dando **4.64:1**
|
|
277
|
+
(negro puro debajo) y **4.66:1** (blanco puro debajo), con el texto de la capa subido
|
|
278
|
+
un nivel. `tokens-contrast.spec.ts` modela la cadena entera, no solo el alfa. Las
|
|
279
|
+
capas llevan además un filo especular (`--netzi-float-glow`), que es lo que hace que
|
|
280
|
+
una superficie translúcida se lea como cristal y no como un velo.
|
|
281
|
+
|
|
282
|
+
**El desenfoque no va en las capas que hospedan controles anclados.** Un
|
|
283
|
+
`backdrop-filter` distinto de `none` convierte al elemento en bloque contenedor de
|
|
284
|
+
sus descendientes `position: fixed`: medido, un hijo fijo saltaba de (0,0) al origen
|
|
285
|
+
del contenedor. Como el topbar, el sidebar, el popover, el modal, el drawer y el
|
|
286
|
+
panel de fecha hospedan controles que se anclan al viewport, en esos el filtro va en
|
|
287
|
+
una capa `::before` aparte. El panel de `netzi-date` además pasa a scrollear en un
|
|
288
|
+
envoltorio interior, para que su capa de cristal no se desplace con el contenido.
|
|
289
|
+
|
|
290
|
+
**`netzi-tooltip` se queda opaco a propósito.** Es tinta invertida
|
|
291
|
+
(`--netzi-text` de fondo) sobre un texto diminuto y efímero, que es justo donde la
|
|
292
|
+
translucidez más estorba y menos aporta; el cristal ahí sería un peaje de
|
|
293
|
+
legibilidad sin ganancia visual.
|
|
294
|
+
|
|
295
|
+
Degradación automática, sin JS: con `prefers-reduced-transparency: reduce` y donde
|
|
296
|
+
no haya `backdrop-filter`, la superficie opaca de siempre.
|
|
297
|
+
|
|
298
|
+
- af3207d: **Alias semánticos de estado, alias por simetría y un tinte marcado.** Toda app
|
|
299
|
+
da por hechos `--netzi-success` / `--netzi-warning` / `--netzi-danger` /
|
|
300
|
+
`--netzi-info`, y hasta ahora solo existían los colores crudos
|
|
301
|
+
(`--netzi-green`…). El problema no es el nombre: un token que no existe **no
|
|
302
|
+
falla**. La declaración entera se descarta y el elemento se queda sin fondo, sin
|
|
303
|
+
color o sin radio, sin un aviso en build ni en consola. El propio kit lo tenía:
|
|
304
|
+
`netzi-cron-picker` pintaba el borde y la nota del campo con error con
|
|
305
|
+
`var(--netzi-danger)` y llevaba desde el primer día marcándolos en gris.
|
|
306
|
+
- Los cuatro estados, en crudo y como texto (`--netzi-danger-text`…), declarados
|
|
307
|
+
como **referencia** al color de marca, no como copia.
|
|
308
|
+
- Alias por simetría: `--netzi-surface-1`, `--netzi-text-1` y
|
|
309
|
+
`--netzi-radius-md`, que son los nombres que se escriben al ver el `-2`.
|
|
310
|
+
- **`--netzi-primary-tint-strong`** (22 % en claro, 28 % en oscuro): el tinte del
|
|
311
|
+
10 % está calibrado para superficies grandes y en una pieza pequeña se pierde
|
|
312
|
+
contra el panel (1.13:1). Este llega a 1.32:1. Su tinta es `--netzi-text`; el
|
|
313
|
+
suave no se puede subir porque es el techo de `--netzi-primary-text`.
|
|
314
|
+
- Un **guardián en la suite** (`tokens-declarados.spec.ts`) recorre todo el CSS
|
|
315
|
+
del kit y falla si un `var(--netzi-*)` apunta a un token que nadie declara, que
|
|
316
|
+
es como se destapó lo del cron.
|
|
317
|
+
|
|
318
|
+
### Patch Changes
|
|
319
|
+
|
|
320
|
+
- 1175b77: Alturas de control estandarizadas: todos los inputs de valor (input, select,
|
|
321
|
+
número, password, teléfono, combobox, moneda, color, búsqueda, fecha, hora) y el
|
|
322
|
+
botón comparten una **altura fija por tamaño** (sm 36 / md 44 / lg 52 px;
|
|
323
|
+
compacta 32/40/46) vía tokens `--netzi-control-h-{sm,md,lg}`, así alinean exacto
|
|
324
|
+
al ponerlos en fila. Los inputs de valor ganan un input `size` (sm/md/lg). Las
|
|
325
|
+
alturas escalan con `--netzi-font-scale`. Se corrige el botón `lg` (antes medía
|
|
326
|
+
igual que `md`). Multilínea (textarea, tags) quedan como excepción con
|
|
327
|
+
`min-height`.
|
|
328
|
+
- 1175b77: **Los README de los paquetes ya dicen qué registry usar, y por qué el otro es
|
|
329
|
+
peligroso.** Ninguno documentaba la configuración del scope `@netzi`: el de `ui` solo
|
|
330
|
+
decía `pnpm add …` y el de `tokens` remitía al `.npmrc` "del repo", que un consumidor
|
|
331
|
+
externo no tiene. Como el README **viaja dentro del paquete**, es el sitio por el que se
|
|
332
|
+
enteran los de fuera.
|
|
333
|
+
|
|
334
|
+
Ahora los dos traen la línea del endpoint del **proyecto** y el aviso de que el endpoint
|
|
335
|
+
de **grupo** reenvía al npm público cualquier `@netzi/*` que no encuentre
|
|
336
|
+
(`302 → registry.npmjs.org`), que el scope `@netzi` **no está reclamado** en npmjs.org y
|
|
337
|
+
que apagar el reenvío en los ajustes del grupo **no lo evita** (issue #16).
|
|
338
|
+
|
|
339
|
+
- 1175b77: El **`CHANGELOG.md` ahora se incluye en el paquete publicado**. Antes solo se
|
|
340
|
+
empaquetaba el `README.md` (ng-packagr lo copia solo; el CHANGELOG no estaba en los
|
|
341
|
+
`assets` de `@netzi/ui` ni en el `files` de `@netzi/tokens`), así que quien instalaba
|
|
342
|
+
el paquete no veía el historial de cambios. Se añade `./CHANGELOG.md` a los assets de
|
|
343
|
+
`@netzi/ui` y a `files` de `@netzi/tokens`. Aplica desde la próxima publicación.
|
|
344
|
+
|
|
345
|
+
## 0.1.0-beta.3
|
|
346
|
+
|
|
347
|
+
### Minor Changes
|
|
348
|
+
|
|
349
|
+
- 13ebbcd: Nueva **escala de espaciado** `--netzi-space-0..8` (base 4px: 0/2/4/8/12/16/24/32/48).
|
|
350
|
+
Da a las apps tokens de gaps/paddings coherentes con el sistema, en vez de píxeles/rem
|
|
351
|
+
sueltos. Bajo `[data-density='compact']` los pasos medios/grandes se reducen (4→10, 5→12,
|
|
352
|
+
6→20, 7→28, 8→40), coherente con la densidad de los controles; los pasos finos no cambian.
|
|
353
|
+
Documentada en el README de tokens, en el showcase de tokens (sección "Espaciado") y en
|
|
354
|
+
Storybook (Fundamentos/Espaciado). Cierra #34.
|
|
355
|
+
|
|
356
|
+
## 0.1.0-beta.2
|
|
357
|
+
|
|
358
|
+
### Patch Changes
|
|
359
|
+
|
|
360
|
+
- 1e27de5: El **`CHANGELOG.md` ahora se incluye en el paquete publicado**. Antes solo se
|
|
361
|
+
empaquetaba el `README.md` (ng-packagr lo copia solo; el CHANGELOG no estaba en los
|
|
362
|
+
`assets` de `@netzi/ui` ni en el `files` de `@netzi/tokens`), así que quien instalaba
|
|
363
|
+
el paquete no veía el historial de cambios. Se añade `./CHANGELOG.md` a los assets de
|
|
364
|
+
`@netzi/ui` y a `files` de `@netzi/tokens`. Aplica desde la próxima publicación.
|
|
365
|
+
|
|
366
|
+
## 0.1.0-beta.1
|
|
367
|
+
|
|
368
|
+
### Patch Changes
|
|
369
|
+
|
|
370
|
+
- 145ff48: Alturas de control estandarizadas: todos los inputs de valor (input, select,
|
|
371
|
+
número, password, teléfono, combobox, moneda, color, búsqueda, fecha, hora) y el
|
|
372
|
+
botón comparten una **altura fija por tamaño** (sm 36 / md 44 / lg 52 px;
|
|
373
|
+
compacta 32/40/46) vía tokens `--netzi-control-h-{sm,md,lg}`, así alinean exacto
|
|
374
|
+
al ponerlos en fila. Los inputs de valor ganan un input `size` (sm/md/lg). Las
|
|
375
|
+
alturas escalan con `--netzi-font-scale`. Se corrige el botón `lg` (antes medía
|
|
376
|
+
igual que `md`). Multilínea (textarea, tags) quedan como excepción con
|
|
377
|
+
`min-height`.
|
|
378
|
+
|
|
379
|
+
## 0.1.0-beta.0
|
|
380
|
+
|
|
381
|
+
Primera beta pública de los tokens (reinicio de numeración: el canal beta
|
|
382
|
+
arranca aquí; el desarrollo previo vive en la historia de git).
|
|
383
|
+
|
|
384
|
+
Incluye: superficies y texto para tema claro/oscuro, color primario con
|
|
385
|
+
presets (`[data-preset]`) y tinte derivado, tonos semánticos, contraste alto,
|
|
386
|
+
densidad compacta, radios (`--netzi-radius-sm/-/lg`), sombras, tipografía con
|
|
387
|
+
familia configurable y **escala global de tamaño de letra**
|
|
388
|
+
(`--netzi-font-scale`), y base CSS con herencia correcta de color en
|
|
389
|
+
controles. Override por CSS para white-label.
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Licencia de uso de Netzi UI (@netzi/ui y @netzi/tokens)
|
|
2
|
+
|
|
3
|
+
Copyright © 2026 Netzi Tech. Todos los derechos reservados.
|
|
4
|
+
|
|
5
|
+
Netzi Tech concede a quien obtenga este paquete desde el registro público de npm
|
|
6
|
+
una licencia **gratuita, mundial, no exclusiva e intransferible** para:
|
|
7
|
+
|
|
8
|
+
1. **Instalar y usar** el paquete, tal cual se distribuye, en aplicaciones propias o
|
|
9
|
+
de terceros, con o sin fines comerciales.
|
|
10
|
+
2. **Incorporarlo** a los artefactos compilados de esas aplicaciones (bundles) y
|
|
11
|
+
distribuir dichos artefactos.
|
|
12
|
+
|
|
13
|
+
No se concede ningún otro derecho. En particular, **no está permitido**:
|
|
14
|
+
|
|
15
|
+
- redistribuir el paquete por separado, ni total ni parcialmente, en ningún otro
|
|
16
|
+
registro, repositorio o medio;
|
|
17
|
+
- modificar, descompilar, desofuscar o crear obras derivadas del paquete, salvo lo
|
|
18
|
+
estrictamente necesario para integrarlo en una aplicación;
|
|
19
|
+
- retirar o alterar este aviso, las marcas o las atribuciones incluidas;
|
|
20
|
+
- usar el nombre «Netzi» o sus marcas para promocionar productos derivados sin
|
|
21
|
+
autorización escrita.
|
|
22
|
+
|
|
23
|
+
Las tipografías incluidas (Plus Jakarta Sans y Fira Code) se distribuyen bajo la SIL
|
|
24
|
+
Open Font License 1.1, que acompaña a cada fuente y prevalece sobre esta licencia
|
|
25
|
+
para esos archivos.
|
|
26
|
+
|
|
27
|
+
EL PAQUETE SE ENTREGA «TAL CUAL», SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA,
|
|
28
|
+
INCLUIDAS LAS DE COMERCIALIZACIÓN, IDONEIDAD PARA UN FIN CONCRETO Y NO INFRACCIÓN.
|
|
29
|
+
EN NINGÚN CASO NETZI TECH RESPONDERÁ POR DAÑOS DERIVADOS DEL USO DEL PAQUETE.
|
|
30
|
+
|
|
31
|
+
Esta licencia aplica a la versión del paquete que la acompaña. Netzi Tech podrá
|
|
32
|
+
publicar versiones futuras bajo otros términos, incluidas licencias de pago; cada
|
|
33
|
+
versión lleva la licencia que le corresponde. Contacto: <netzi.tech@gmail.com>.
|