@codenhub/styles 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +18 -16
- package/README.es.md +62 -0
- package/README.md +28 -22
- package/README.pt-BR.md +62 -0
- package/dist/aesthetics/chunky-tile.css +1 -1
- package/dist/aesthetics/cyber.css +1 -1
- package/dist/aesthetics/glass.css +1 -1
- package/dist/aesthetics/index.css +2 -2
- package/dist/aesthetics/neobrutalism.css +1 -1
- package/dist/aesthetics/pixel.css +1 -1
- package/dist/aesthetics/sketch.css +1 -1
- package/dist/cli.js +189 -0
- package/dist/components.css +2 -2
- package/dist/index.css +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/native.css +2 -2
- package/dist/palette.css +1 -1
- package/dist/theme.css +2 -2
- package/docs/accessibility.md +108 -60
- package/docs/changelog/0.1.1.md +1 -0
- package/docs/changelog/0.2.0.md +1 -0
- package/docs/changelog/0.3.0.md +1 -0
- package/docs/changelog/0.4.0.md +1 -0
- package/docs/changelog/0.5.0.md +8 -3
- package/docs/changelog/0.6.0.md +2 -1
- package/docs/changelog/0.7.0.md +50 -0
- package/docs/changelog/0.8.0.md +70 -0
- package/docs/changelog/index.md +2 -0
- package/docs/concepts.md +188 -46
- package/docs/es/accessibility.md +169 -0
- package/docs/es/concepts.md +212 -0
- package/docs/es/index.md +105 -0
- package/docs/es/integrating/astro.md +35 -0
- package/docs/es/integrating/index.md +75 -0
- package/docs/es/integrating/nextjs.md +67 -0
- package/docs/es/integrating/svelte.md +45 -0
- package/docs/es/integrating/tailwind.md +148 -0
- package/docs/es/integrating/vue.md +31 -0
- package/docs/es/integrating/without-a-bundler.md +238 -0
- package/docs/es/setup.md +188 -0
- package/docs/es/usage/aesthetics.md +282 -0
- package/docs/es/usage/buttons.md +135 -0
- package/docs/es/usage/composing.md +168 -0
- package/docs/es/usage/content-and-layout.md +219 -0
- package/docs/es/usage/customizing.md +304 -0
- package/docs/es/usage/feedback.md +157 -0
- package/docs/es/usage/forms.md +256 -0
- package/docs/es/usage/index.md +33 -0
- package/docs/es/usage/presets.md +92 -0
- package/docs/es/usage/solo.md +86 -0
- package/docs/es/usage/theming.md +309 -0
- package/docs/es/usage/tooltips.md +127 -0
- package/docs/index.md +86 -26
- package/docs/integrating/astro.md +3 -4
- package/docs/integrating/index.md +46 -13
- package/docs/integrating/nextjs.md +3 -4
- package/docs/integrating/svelte.md +5 -4
- package/docs/integrating/tailwind.md +89 -6
- package/docs/integrating/vue.md +3 -4
- package/docs/integrating/without-a-bundler.md +237 -0
- package/docs/pt-BR/accessibility.md +169 -0
- package/docs/pt-BR/concepts.md +212 -0
- package/docs/pt-BR/index.md +105 -0
- package/docs/pt-BR/integrating/astro.md +35 -0
- package/docs/pt-BR/integrating/index.md +75 -0
- package/docs/pt-BR/integrating/nextjs.md +67 -0
- package/docs/pt-BR/integrating/svelte.md +45 -0
- package/docs/pt-BR/integrating/tailwind.md +148 -0
- package/docs/pt-BR/integrating/vue.md +31 -0
- package/docs/pt-BR/integrating/without-a-bundler.md +238 -0
- package/docs/pt-BR/setup.md +188 -0
- package/docs/pt-BR/usage/aesthetics.md +282 -0
- package/docs/pt-BR/usage/buttons.md +135 -0
- package/docs/pt-BR/usage/composing.md +168 -0
- package/docs/pt-BR/usage/content-and-layout.md +219 -0
- package/docs/pt-BR/usage/customizing.md +304 -0
- package/docs/pt-BR/usage/feedback.md +157 -0
- package/docs/pt-BR/usage/forms.md +256 -0
- package/docs/pt-BR/usage/index.md +33 -0
- package/docs/pt-BR/usage/presets.md +92 -0
- package/docs/pt-BR/usage/solo.md +86 -0
- package/docs/pt-BR/usage/theming.md +309 -0
- package/docs/pt-BR/usage/tooltips.md +127 -0
- package/docs/setup.md +142 -91
- package/docs/usage/aesthetics.md +89 -73
- package/docs/usage/buttons.md +112 -40
- package/docs/usage/composing.md +109 -92
- package/docs/usage/content-and-layout.md +160 -125
- package/docs/usage/customizing.md +117 -41
- package/docs/usage/feedback.md +138 -71
- package/docs/usage/forms.md +201 -107
- package/docs/usage/index.md +22 -14
- package/docs/usage/presets.md +91 -0
- package/docs/usage/solo.md +85 -0
- package/docs/usage/theming.md +273 -118
- package/docs/usage/tooltips.md +90 -49
- package/llms-full.txt +2820 -1298
- package/llms.txt +24 -22
- package/package.json +134 -91
- package/{dist/tw → tw}/aesthetics/chunky-tile.css +107 -29
- package/{dist/tw → tw}/aesthetics/cyber.css +88 -40
- package/{dist/tw → tw}/aesthetics/glass.css +257 -61
- package/{dist/tw → tw}/aesthetics/neobrutalism.css +113 -20
- package/{dist/tw → tw}/aesthetics/pixel.css +93 -8
- package/tw/aesthetics/sketch.css +417 -0
- package/{dist/tw → tw}/box.css +105 -9
- package/tw/components/button.css +11 -0
- package/tw/components/button.rules.css +187 -0
- package/tw/components/feedback.css +11 -0
- package/{dist/tw/components/feedback.css → tw/components/feedback.rules.css} +136 -32
- package/tw/components/form.css +11 -0
- package/{dist/tw/components/form.css → tw/components/form.rules.css} +577 -125
- package/tw/components/index.css +16 -0
- package/tw/components/rules.css +41 -0
- package/tw/components/surface.css +11 -0
- package/tw/components/surface.rules.css +222 -0
- package/tw/components/tooltip.css +11 -0
- package/{dist/tw/components/tooltip.css → tw/components/tooltip.rules.css} +43 -27
- package/{dist/tw → tw}/corner.css +18 -12
- package/{dist/tw → tw}/elevation.css +23 -17
- package/{dist/tw → tw}/index.css +12 -10
- package/tw/index.d.ts +1 -0
- package/tw/intent.css +312 -0
- package/tw/modifiers.css +127 -0
- package/tw/native.css +320 -0
- package/tw/presentation.css +139 -0
- package/tw/reset.css +10 -0
- package/{dist/tw/reset.css → tw/reset.rules.css} +21 -22
- package/tw/size.css +34 -0
- package/tw/surface.css +9 -0
- package/tw/surface.rules.css +212 -0
- package/{dist/tw → tw}/theme.css +121 -45
- package/tw/typography.css +8 -0
- package/{dist/tw/typography.css → tw/typography.rules.css} +0 -3
- package/{dist/tw → tw}/utilities/content.css +212 -50
- package/tw/utilities/index.css +11 -0
- package/tw/utilities/layout.css +208 -0
- package/tw/utilities/rules.css +8 -0
- package/dist/tw/aesthetics/sketch.css +0 -333
- package/dist/tw/components/button.css +0 -139
- package/dist/tw/components/index.css +0 -36
- package/dist/tw/components/loader.css +0 -116
- package/dist/tw/components/surface.css +0 -175
- package/dist/tw/intent.css +0 -228
- package/dist/tw/native.css +0 -203
- package/dist/tw/palette.css +0 -460
- package/dist/tw/presentation.css +0 -68
- package/dist/tw/surface.css +0 -61
- package/dist/tw/utilities/index.css +0 -6
- package/dist/tw/utilities/layout.css +0 -130
- /package/{dist/tw → tw}/aesthetics/index.css +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Accesibilidad
|
|
3
|
+
description: Lo que hace el CSS con el foco, los estados, el movimiento, el contraste, los colores forzados y el texto de derecha a izquierda, y lo que tu aplicación todavía les debe a sus usuarios.
|
|
4
|
+
order: 5
|
|
5
|
+
source: 88ce6c4707ee04ac76cdb5e6b31dcca399a5327e
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Accesibilidad
|
|
9
|
+
|
|
10
|
+
La pantalla de ajustes está construida, y el CSS ha hecho su parte por el camino: cada campo muestra dónde está el foco, un email inválido se vuelve rojo y el spinner se detiene para los usuarios que piden menos movimiento. El resto depende de tu HTML y tu JavaScript. Este paquete da estilo a los estados; no aporta elementos semánticos, atributos ARIA, comportamiento de teclado, gestión del foco, validación ni el momento de los anuncios.
|
|
11
|
+
|
|
12
|
+
Esta página enumera las dos mitades: lo que aporta el CSS y lo que tu aplicación tiene que añadir.
|
|
13
|
+
|
|
14
|
+
## Lo que aporta el CSS
|
|
15
|
+
|
|
16
|
+
### Foco y estado
|
|
17
|
+
|
|
18
|
+
| Característica | Comportamiento |
|
|
19
|
+
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
20
|
+
| `:focus-visible` | Un contorno de foco en cada elemento, dibujado con `--focus-ring`, `--focus-ring-width` y `--focus-ring-offset`. En un componente con un relleno de más de la mitad de intensidad, como un botón `.solid.primary`, una línea de 2px del color de la página recorre el interior del anillo, así que el anillo sigue visible sobre un relleno de su mismo color. |
|
|
21
|
+
| Foco en controles de formulario | `.ipt`, `.textarea` y `.select` dibujan el contorno de foco y cambian su borde al color de la intención. El texto escrito en un campo con una clase de intención usa el tono legible de esa intención, `--intent-strong`. |
|
|
22
|
+
| Controles inválidos | `aria-invalid="true"` en un control de formulario vuelve destructivos su borde, su color de foco y el texto escrito, este último en el tono legible destructivo. Un checkbox, un radio o un switch se dibuja exactamente igual que su versión `.destructive`, marca de activado incluida. |
|
|
23
|
+
| Controles deshabilitados | `disabled`, `aria-disabled="true"`, `data-disabled` y `.disabled` muestran el cursor y la opacidad de deshabilitado, y un control deshabilitado no reacciona al hover, tampoco dentro de un `.input-group`. |
|
|
24
|
+
| Estado abierto | `data-state="open"` en un `.tooltip` muestra su burbuja sin hover ni foco, y `data-state="closed"` la oculta aunque tenga hover o foco. Ningún otro componente lee ninguno de los dos. |
|
|
25
|
+
| `<dialog>` nativo | Un `<dialog>` con `.card`, `.panel`, `.surface` o una clase propia que hace `@apply surface` permanece oculto hasta que se abre, y se abre centrado. Un margen que pongas en el diálogo, como utilidad o en tu propio CSS, sigue sobrescribiendo el centrado, salvo que una utilidad de margen no lo hace cuando tu clase aplica `surface` en CSS plano; consulta [Personalización → Helpers de composición](./usage/customizing.md#helpers-de-composición). Con la [hoja de estilos sin clases](./setup.md#html-sin-clases), un `<dialog>` simple es una `.card.floating` y se comporta igual; con los demás puntos de entrada, un diálogo sin ninguna de estas clases no se toca. Atrapar el foco, cerrar con Escape y dejar inerte la página de detrás es cosa de tu aplicación. |
|
|
26
|
+
|
|
27
|
+
### Contenido visualmente oculto
|
|
28
|
+
|
|
29
|
+
`.visually-hidden` oculta contenido en pantalla y lo mantiene para los lectores de pantalla, como hace el `<caption>` de la tabla de claves de API en [Contenido y layout → Tablas](./usage/content-and-layout.md#tablas). Viene con las utilidades de layout: en `.`, `./native`, `./tw`, `./tw/native` y `./tw/utilities`. No está en `./components` ni en los puntos de entrada de componentes `./tw/components` y `./tw/*`.
|
|
30
|
+
|
|
31
|
+
### Límites de los controles
|
|
32
|
+
|
|
33
|
+
WCAG 1.4.11 pide que el límite de un control que necesitas ver para usarlo tenga un contraste de al menos 3:1 con lo que lo rodea.
|
|
34
|
+
|
|
35
|
+
| Característica | Comportamiento |
|
|
36
|
+
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
37
|
+
| Controles de texto en reposo | El borde de un control de texto reposa más claro que el borde completo de su intención, por debajo de 3:1 a propósito, para que el hover y el foco tengan un tono más intenso al que cambiar. [Contraste aumentado](#contraste-aumentado) lo dibuja completo. |
|
|
38
|
+
| Toggles | `.checkbox`, `.radio` y `.switch` dibujan su borde completo, porque el borde es lo único que muestra una casilla sin marcar. Un `.switch` con su propio `.edgeless` es la excepción, más abajo. |
|
|
39
|
+
| `.edgeless` desde un contenedor | Lo ignoran todos los controles de texto y toggles: un contenedor no puede quitar el borde de un campo o toggle que contiene. |
|
|
40
|
+
| `.edgeless` en el control | `.ipt`, `.textarea`, `.select` y `.switch` pierden su borde y dejan de cumplir 1.4.11 en reposo. `.switch.ghost` conserva su borde incluso entonces, porque sin relleno y sin borde nada mostraría el carril. |
|
|
41
|
+
| `.checkbox`, `.radio` | Siempre dibujan su borde, venga `.edgeless` de un contenedor o lo lleven ellos mismos. `.edgeless` en ellos no está soportado. |
|
|
42
|
+
| Carril de progreso | A propósito, la parte rellena lleva el valor y el carril es un fondo discreto. El carril por defecto, `.soft.edgeless`, mide aproximadamente de 1.1:1 a 1.3:1 frente a la página. La parte rellena mide al menos 3:1 frente a ese carril para todas las intenciones excepto warning en claro (unos 2.7:1) e info en oscuro (unos 2.9:1). Donde el propio carril deba cumplir 1.4.11, usa `.ghost.edged` con una clase de intención; consulta [Contornos de progreso](#contornos-de-progreso) más abajo. |
|
|
43
|
+
|
|
44
|
+
### Contornos de progreso
|
|
45
|
+
|
|
46
|
+
En un `.progress.ghost.edged`, el carril es la página, y tanto su contorno como la parte rellena se dibujan en el color de la intención. Medido frente a la página, sin estética:
|
|
47
|
+
|
|
48
|
+
| Intención | Página clara | Página oscura | Cumple 3:1 |
|
|
49
|
+
| -------------- | ------------ | ------------- | ----------------------------------------------------------------------------- |
|
|
50
|
+
| `.primary` | 18.96:1 | 18.96:1 | Sí |
|
|
51
|
+
| `.secondary` | 7.47:1 | 7.63:1 | Sí |
|
|
52
|
+
| `.success` | 5.14:1 | 3.69:1 | Sí |
|
|
53
|
+
| `.warning` | 3.06:1 | 6.20:1 | Sí |
|
|
54
|
+
| `.destructive` | 5.80:1 | 3.27:1 | Sí |
|
|
55
|
+
| `.info` | 6.17:1 | 3.07:1 | Sí |
|
|
56
|
+
| Sin intención | 2.48:1 | 1.91:1 | No: el contorno no cumple, aunque la parte rellena, en el color del texto, sí |
|
|
57
|
+
|
|
58
|
+
Sin clase de intención, el contorno es el gris discreto de los bordes, `--color-border`. Para que un carril neutro cumpla 1.4.11, dale a la barra una clase de intención, o define `--progress-edge` con un color más intenso, como `var(--color-accent)`, que mide 7.47:1 en una página clara y 7.63:1 en una oscura. Warning en una página clara e info en una oscura superan 3:1 por poco margen, así que vuelve a medir si cambias esos colores.
|
|
59
|
+
|
|
60
|
+
### Movimiento y transparencia
|
|
61
|
+
|
|
62
|
+
| Característica | Comportamiento |
|
|
63
|
+
| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
64
|
+
| Movimiento reducido, componentes | Con `prefers-reduced-motion: reduce`, cada componente detiene sus propias transiciones y animaciones: el brillo del skeleton y del progreso, la barra indeterminada, el tooltip, las marcas de los toggles y el movimiento de la pulsación. La pulsación en sí sigue ocurriendo, al instante, con el aspecto por defecto y con cada estética y clase solo, porque es la señal de que un clic se registró. |
|
|
65
|
+
| Movimiento reducido, toda la página | El reset también acorta todas las demás animaciones y transiciones de la página. |
|
|
66
|
+
| Transparencia reducida | Con `prefers-reduced-transparency: reduce`, y con colores forzados, `.glass`, `.glass-liquid` y `.glass-solo` pierden su desenfoque y su lente y se vuelven opacos. |
|
|
67
|
+
|
|
68
|
+
La regla de movimiento reducido de cada componente viene con el componente, así que cada punto de entrada que lo incluye respeta el movimiento reducido sin el reset, incluidos `@codenhub/styles/components`, `@codenhub/styles/tw/components` y cada punto de entrada de componente `/tw/*`. Los puntos de entrada completo y native añaden la regla del reset para toda la página.
|
|
69
|
+
|
|
70
|
+
La regla del reset es `!important` dentro de la capa `base`, y un `!important` con capa gana a uno sin capa, así que tu propio `!important` no puede volver a activar una animación. Para mantener una en marcha para los usuarios que piden movimiento reducido, como un spinner de subida que consideres esencial, declárala `!important` en una capa ordenada antes de `base`. La primera sentencia `@layer` que lee el navegador fija el orden, así que la tuya va antes del paquete:
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
@layer essential-motion, theme, base, components, utilities;
|
|
74
|
+
@import "@codenhub/styles";
|
|
75
|
+
|
|
76
|
+
@layer essential-motion {
|
|
77
|
+
@media (prefers-reduced-motion: reduce) {
|
|
78
|
+
.upload-spinner {
|
|
79
|
+
animation-duration: 1s !important;
|
|
80
|
+
animation-iteration-count: infinite !important;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Respetar el movimiento reducido no es todo lo que se pide. El movimiento que sigue en marcha junto al contenido, como un brillo que queda en una tarjeta después de que ha cargado, necesita una forma de detenerlo para todos los usuarios; consulta [Feedback → Animación que no se detiene](./usage/feedback.md#animación-que-no-se-detiene).
|
|
87
|
+
|
|
88
|
+
### Contraste aumentado
|
|
89
|
+
|
|
90
|
+
Con `prefers-contrast: more`, los bordes que el paquete dibuja por debajo de 3:1 a propósito se dibujan a 3:1 o más frente a lo que tienen al lado, en ambos temas. El texto, los rellenos sólidos y los anillos de foco ya cumplen sus proporciones y no cambian. `prefers-contrast: less` no se lee.
|
|
91
|
+
|
|
92
|
+
| Característica | Comportamiento |
|
|
93
|
+
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
94
|
+
| Controles de texto | `.ipt`, `.textarea`, `.select` e `.input-group` reposan con su borde completo, así que el hover y el foco ya no cambian su tono. El anillo de foco es el mismo. |
|
|
95
|
+
| Bordes neutros | `--color-border` toma un gris más intenso, `neutral-600` en claro y `neutral-400` en oscuro, así que el borde de una tarjeta, un divisor, las líneas de una tabla y el borde de un botón o badge neutro cumplen 3:1. Si defines `--color-border` tú mismo, tu color se conserva; mídelo. |
|
|
96
|
+
| Bordes de intención | El borde de una intención toma su tono fuerte, `--color-<intent>-strong`, así que `.edged` en un `.alert`, `.panel`, `.badge`, `.kbd`, `.code` o `.pre` `.soft` cumple 3:1 tanto frente a su relleno como frente a la página, en todas las intenciones. |
|
|
97
|
+
| Carril de progreso | El carril dibuja un contorno en su color de borde, que cumple 3:1 con o sin clase de intención. `.edgeless` en la barra o en un contenedor lo sigue quitando. |
|
|
98
|
+
| Glass | `.glass`, `.glass-liquid` y `.glass-solo` pierden su desenfoque y su lente y se vuelven opacos, como con la transparencia reducida, y su línea blanca pasa a ser un borde gris. |
|
|
99
|
+
| Chunky tile | `.chunky-tile` dibuja las piezas y las superficies con el gris más intenso que usan sus controles. |
|
|
100
|
+
|
|
101
|
+
Lo que quitas sigue quitado: `.edgeless` en un control sigue eliminando su borde, y un `.panel` sigue sin tenerlo salvo que añadas `.edged`.
|
|
102
|
+
|
|
103
|
+
### Color y contraste
|
|
104
|
+
|
|
105
|
+
Las mediciones de abajo corresponden a los colores incluidos. En cuanto cambies un token de color, vuelve a medir tus propios pares; [Temas → Cambiar el color de marca](./usage/theming.md#cambiar-el-color-de-marca) muestra qué pares comprobar.
|
|
106
|
+
|
|
107
|
+
| Característica | Comportamiento |
|
|
108
|
+
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
109
|
+
| Etiquetas rellenas | La etiqueta `.solid` de cada intención cumple 4.5:1 (WCAG 1.4.3) como texto normal, en ambos temas. La más baja es success, con 5.14:1. |
|
|
110
|
+
| Texto de warning | `--color-warning-contrast` es casi negro, no el color de la página, porque un ámbar lo bastante oscuro para llevar texto blanco ya no parece ámbar. |
|
|
111
|
+
| Rellenos parciales | El color de texto de contraste solo aparece en rellenos por encima de la mitad de intensidad, así que el relleno limitado de un control de texto conserva el color de texto propio de la intención. |
|
|
112
|
+
| Color de intención en oscuro | En modo oscuro, una etiqueta `.soft` o `.ghost` usa el tono `-300` de su intención, así que conserva su matiz en lugar de volverse blanca. |
|
|
113
|
+
| Texto sobre un padre con relleno | Un componente neutro que no es `.solid`, como un badge en un `.btn.primary` o un botón ghost en una `.card.solid.primary`, imprime en el color de texto de su padre en lugar del de la página, así que conserva el contraste del padre. |
|
|
114
|
+
| Impresión | Una página se imprime con el tema claro, y los componentes con relleno imprimen su fondo (`print-color-adjust: exact`), así que el texto de contraste nunca cae sobre papel en blanco. Una utilidad `dark:` se sigue aplicando al imprimir; consulta [Temas → Impresión](./usage/theming.md#impresión). |
|
|
115
|
+
| Marcas de los toggles | Una marca activada mide al menos 3:1 frente a cada relleno que su presentación pueda darle, en ambos temas. |
|
|
116
|
+
| Rellenos soft con borde | `.edged` en un `.alert`, `.panel`, `.badge`, `.kbd`, `.code` o `.pre` `.soft` dibuja un borde que mide menos de 3:1 frente al relleno del 12% en algunas intenciones, cuáles depende del tema. Mide el par antes de confiar en ese borde como límite de un control. [Contraste aumentado](#contraste-aumentado) lleva todos ellos a 3:1. |
|
|
117
|
+
|
|
118
|
+
### Colores forzados y dirección
|
|
119
|
+
|
|
120
|
+
| Característica | Comportamiento |
|
|
121
|
+
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
122
|
+
| Colores forzados | Con `forced-colors: active`, los bordes, los estados activados, el chevron de un `.select` y el valor de una barra de progreso siguen visibles, dibujados con colores del sistema, bajo cualquier estética. Una estética que dibuja su borde como una sombra interior, como `.pixel`, dibuja en su lugar un borde real. El cristal se vuelve opaco, porque los colores forzados conservan la transparencia de un fondo. |
|
|
123
|
+
| Dirección del texto | Con `dir="rtl"`, la barra de las citas, el icono de la alerta, el relleno del progreso, el divisor vertical, la perilla del switch, la alineación de las tablas y el chevron de un select cambian de lado. No hace falta ninguna clase. |
|
|
124
|
+
|
|
125
|
+
Con colores forzados, `.text-control`, `.ipt`, `.textarea`, `.select`, los toggles y tu propia clase que hace `@apply text-control` muestran un contorno de foco `Highlight` de 2px. Dentro de un `.input-group`, el grupo dibuja el anillo del campo y el control interior no dibuja ninguno, así que un campo con foco muestra un solo anillo. El punto de entrada native da el mismo contorno a los inputs de texto, selects, textareas, checkboxes y radios sin clase.
|
|
126
|
+
|
|
127
|
+
Los checkboxes, radios y switches usan los colores del sistema `Canvas`, `CanvasText`, `Highlight` y `HighlightText`, así que activado y desactivado siguen siendo distinguibles: un toggle activado se rellena con `Highlight` y su marca es `HighlightText`, tanto en las clases como en el punto de entrada native. La forma, el tamaño y el espaciado no cambian.
|
|
128
|
+
|
|
129
|
+
Una barra `.progress` hace lo mismo: su parte rellena es `CanvasText` sobre un carril `Canvas` con un contorno `CanvasText`, sea cual sea su intención o su presentación, así que una barra a medio llenar no se confunde con una vacía. El brillo de `.active` no se dibuja.
|
|
130
|
+
|
|
131
|
+
## Lo que hace falta fuera del CSS
|
|
132
|
+
|
|
133
|
+
Usa el elemento HTML que corresponde a lo que hace el componente, y añade el comportamiento que el CSS no puede dar.
|
|
134
|
+
|
|
135
|
+
| Interfaz | Lo que añade tu aplicación |
|
|
136
|
+
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
137
|
+
| Botones | `<button>` para acciones y `<a href>` para navegación. Un nombre accesible, como `aria-label`, en cada `.btn.icon`. |
|
|
138
|
+
| Formularios | Un `<label>` para cada control, el `type` correcto, validación y `aria-describedby` enlazando pistas y errores. Mantén las pistas y los errores fuera del `<label>`, y dale a un `.switch` `role="switch"`. |
|
|
139
|
+
| Alertas | `role="status"` para una confirmación como "Perfil guardado", o `role="alert"` para un error que necesita atención inmediata. |
|
|
140
|
+
| Toasts | Una región live, una forma de cerrarlo, reglas de foco y una pausa en cualquier temporizador. |
|
|
141
|
+
| Tooltips | Un `id` real y `role="tooltip"` en la burbuja, referenciado desde el `aria-describedby` del disparador. El cierre con Escape escribiendo `data-state="closed"`; consulta [Tooltips](./usage/tooltips.md#hover-permanencia-y-escape). La burbuja ya admite hover. |
|
|
142
|
+
| Progreso | Un elemento `<progress>`, o `role="progressbar"` o `role="meter"` con valores ARIA, cuando el valor debe anunciarse. |
|
|
143
|
+
| Skeletons | `aria-hidden="true"` en los elementos visuales de carga, incluido un spinner que aportes tú, y el estado de carga anunciado de otra forma cuando haga falta. |
|
|
144
|
+
| Movimiento continuo | Una forma de pausar, detener u ocultar el movimiento que no es esencial; consulta [Feedback → Animación que no se detiene](./usage/feedback.md#animación-que-no-se-detiene). |
|
|
145
|
+
| Popovers, modales | Atrapar el foco, cerrar con Escape, un fondo inerte, etiquetas y roles. |
|
|
146
|
+
|
|
147
|
+
## Atributos de estado
|
|
148
|
+
|
|
149
|
+
Prefiere los atributos nativos:
|
|
150
|
+
|
|
151
|
+
```html
|
|
152
|
+
<button class="btn primary" disabled>Saving…</button> <input class="ipt" type="email" aria-invalid="true" aria-describedby="email-error" />
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Usa atributos ARIA o data donde el elemento o tu librería de componentes no tenga uno nativo:
|
|
156
|
+
|
|
157
|
+
```html
|
|
158
|
+
<a class="btn secondary" aria-disabled="true">Export data</a>
|
|
159
|
+
<span class="tooltip" data-state="open">
|
|
160
|
+
<button type="button" class="tooltip-icon" aria-label="About public profiles" aria-describedby="public-profile-help">?</button>
|
|
161
|
+
<span class="tooltip-bubble" role="tooltip" id="public-profile-help">Anyone with the link can see your name and photo.</span>
|
|
162
|
+
</span>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`aria-disabled="true"` indica a las tecnologías de asistencia que el control está deshabilitado, pero no impide un clic ni una pulsación de tecla. Usa el atributo `disabled`, o detén la acción en JavaScript.
|
|
166
|
+
|
|
167
|
+
## Siguiente paso
|
|
168
|
+
|
|
169
|
+
Con esto termina el orden de lectura. La [Introducción](./index.md) enlaza todas las páginas, y [Composición](./usage/composing.md), [Personalización](./usage/customizing.md) y [Contenido y layout](./usage/content-and-layout.md) son las páginas de consulta para más adelante.
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Construir una pantalla
|
|
3
|
+
description: Maqueta la página de ajustes, define su tipografía y añade tarjetas y botones mientras aprendes qué son la intención, el relleno, el borde y la estética.
|
|
4
|
+
order: 3
|
|
5
|
+
source: 8fa5ed2f6fb9a2786f61301f94bbe806649d7e1d
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Construir una pantalla
|
|
9
|
+
|
|
10
|
+
Esta página convierte la estructura vacía de [Configuración inicial](./setup.md) en la primera parte real de la pantalla de ajustes: un encabezado de página, una tarjeta de perfil con los botones Guardar y Cancelar, y un resumen del plan junto a una tarjeta de uso. Por el camino presenta las tres decisiones que toma cada componente, intención, presentación y estética, justo cuando la pantalla necesita cada una. Todo lo demás en esta documentación se apoya en este modelo.
|
|
11
|
+
|
|
12
|
+
## La pantalla más pequeña
|
|
13
|
+
|
|
14
|
+
Un encabezado de página y una tarjeta con un botón:
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<main class="section">
|
|
18
|
+
<div class="section-content narrow stack">
|
|
19
|
+
<h1 class="text-title">Account settings</h1>
|
|
20
|
+
<section class="card stack">
|
|
21
|
+
<h2 class="text-title-sm">Profile</h2>
|
|
22
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
23
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
24
|
+
</section>
|
|
25
|
+
</div>
|
|
26
|
+
</main>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Cada clase hace una sola cosa:
|
|
30
|
+
|
|
31
|
+
- `.section` da espacio a la página: un margen lateral adaptable (de 1 a 2rem) y un espacio generoso arriba y abajo (de 4 a 7rem).
|
|
32
|
+
- `.section-content` centra una columna con un ancho máximo; `.narrow` lo deja en 48rem en lugar de 80rem, un ancho cómodo para un formulario.
|
|
33
|
+
- `.stack` coloca sus hijos en vertical con una separación de 1rem.
|
|
34
|
+
- `.text-title` y `.text-title-sm` definen el tamaño de los encabezados: 1.875rem en negrita y 1.25rem en seminegrita.
|
|
35
|
+
- `.card` es un contenedor con borde, esquinas redondeadas y 1.25rem de relleno interior.
|
|
36
|
+
- `.btn` crea un botón, y `.primary` le da el color principal.
|
|
37
|
+
|
|
38
|
+
Los encabezados no toman su tamaño de la etiqueta: el reset le da a un `<h1>` sin clase de tipografía el mismo tamaño y peso que el texto que lo rodea. Así la estructura del documento, qué nivel de encabezado es un elemento, queda separada del tamaño con el que quieres que se vea. Si quieres que los encabezados reciban estilo automáticamente, consulta [Configuración inicial → HTML sin clases](./setup.md#html-sin-clases).
|
|
39
|
+
|
|
40
|
+
## Maquetar la página
|
|
41
|
+
|
|
42
|
+
Tres helpers de layout cubren la mayoría de las pantallas, y los tres usan la misma separación, `--layout-gap` (1rem):
|
|
43
|
+
|
|
44
|
+
- `.stack` para listas verticales de bloques.
|
|
45
|
+
- `.cluster` para una fila que salta de línea cuando se queda sin espacio, como un grupo de botones. Añade `.between` para llevar el primer y el último elemento a extremos opuestos.
|
|
46
|
+
- `.auto-grid` para una cuadrícula de tarjetas iguales que añade o quita columnas según cambia el espacio. Una columna nunca es más estrecha que `--layout-grid-min` (16rem), salvo que lo sea el propio contenedor.
|
|
47
|
+
|
|
48
|
+
`.tight` (0.5rem) y `.loose` (1.5rem) cambian la separación del layout en el que están. Un layout anidado dentro conserva su propia separación.
|
|
49
|
+
|
|
50
|
+
Añade un encabezado y pon los botones en una fila:
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<main class="section">
|
|
54
|
+
<div class="section-content narrow stack loose">
|
|
55
|
+
<header class="stack tight">
|
|
56
|
+
<h1 class="text-title">Account settings</h1>
|
|
57
|
+
<p>Manage your profile, plan, and security.</p>
|
|
58
|
+
</header>
|
|
59
|
+
|
|
60
|
+
<section class="card stack" aria-labelledby="profile-title">
|
|
61
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
62
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
63
|
+
<div class="cluster">
|
|
64
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
65
|
+
<button class="btn ghost" type="button">Cancel</button>
|
|
66
|
+
</div>
|
|
67
|
+
</section>
|
|
68
|
+
</div>
|
|
69
|
+
</main>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
[Contenido y layout](./usage/content-and-layout.md) enumera todos los helpers de layout, incluidos `.view`, `.divider` y `.visually-hidden`, y la escala tipográfica completa.
|
|
73
|
+
|
|
74
|
+
## Intención: qué color
|
|
75
|
+
|
|
76
|
+
El botón Guardar es `.primary` y el botón Cancelar no tiene intención, lo que lo hace neutro. Una clase de intención elige un rol de color:
|
|
77
|
+
|
|
78
|
+
| Clase | Úsala para | Color por defecto |
|
|
79
|
+
| -------------- | ---------------------------------------- | ------------------------------------------- |
|
|
80
|
+
| _ninguna_ | Cualquier cosa sin un significado propio | Los grises de texto y de borde de la página |
|
|
81
|
+
| `.primary` | La acción principal de una pantalla | Casi negro en claro, casi blanco en oscuro |
|
|
82
|
+
| `.secondary` | Una segunda acción, más discreta | Gris medio |
|
|
83
|
+
| `.success` | Confirmaciones y estados completados | Verde esmeralda |
|
|
84
|
+
| `.warning` | Algo que pronto necesita atención | Ámbar, con texto oscuro |
|
|
85
|
+
| `.destructive` | Eliminar, revocar y errores | Rojo rosado |
|
|
86
|
+
| `.info` | Avisos neutros y ayuda | Índigo |
|
|
87
|
+
|
|
88
|
+
La intención se queda en el elemento que la lleva. Poner `.destructive` en una `<section>` no vuelve rojos todos los botones de dentro; la escribes en cada botón. Es deliberado: un contenedor que cambiara en silencio el color de todo lo que contiene también volvería rojo el botón Cancelar de una zona de peligro roja.
|
|
89
|
+
|
|
90
|
+
`.neutral` nombra explícitamente el valor por defecto. Rara vez lo necesitas, porque no poner ninguna clase de intención ya significa neutro; importa donde el color vendría de otra parte, como en una fila de tabla, que hereda la intención de su tabla.
|
|
91
|
+
|
|
92
|
+
## Presentación: cuánto color
|
|
93
|
+
|
|
94
|
+
El botón Cancelar es `.ghost`: sin relleno, solo texto de color, así que se percibe como menos importante que Guardar. Ese es el eje de presentación, dos decisiones independientes:
|
|
95
|
+
|
|
96
|
+
- **Relleno:** `.solid` rellena el componente con el color de su intención y cambia el texto al color de contraste. `.soft` mezcla un tinte claro del 12% y mantiene el texto en el color de la intención. `.ghost` no tiene relleno en reposo.
|
|
97
|
+
- **Borde:** `.edged` dibuja un borde en el color de la intención; `.edgeless` no dibuja ninguno.
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<button class="btn primary">Save changes</button>
|
|
101
|
+
<button class="btn primary soft">Preview</button>
|
|
102
|
+
<button class="btn primary ghost edged">Export data</button>
|
|
103
|
+
<button class="btn ghost">Cancel</button>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Cada componente tiene su propio valor por defecto cuando no se aplica ninguna clase de presentación. Un botón es sólido y sin borde. Una tarjeta no tiene relleno y tiene borde. Un campo de formulario no tiene relleno y tiene borde. [Composición](./usage/composing.md#valores-por-defecto-de-los-componentes) enumera el valor por defecto de cada componente.
|
|
107
|
+
|
|
108
|
+
A diferencia de la intención, la presentación se hereda. Un `.soft` en un contenedor vuelve soft todo lo que hay dentro salvo que un elemento diga otra cosa, y una clase en el propio elemento siempre gana a una heredada de un contenedor:
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<div class="cluster soft">
|
|
112
|
+
<button class="btn primary">Soft primary</button>
|
|
113
|
+
<button class="btn success">Soft success</button>
|
|
114
|
+
<button class="btn primary solid">Solid: its own class wins</button>
|
|
115
|
+
</div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Algunos componentes limitan lo que puede hacer la presentación, para proteger algo que necesitan. Un campo de formulario que hereda un contenedor `.solid` se rellena solo hasta el 6%, para que el texto escrito siga siendo legible. Un checkbox siempre conserva su borde, porque el borde es lo único que muestra una casilla sin marcar. Estos límites aparecen con cada componente y están reunidos en [Composición](./usage/composing.md).
|
|
119
|
+
|
|
120
|
+
## Terminar la primera pantalla
|
|
121
|
+
|
|
122
|
+
Añade un resumen del plan junto a una tarjeta de uso en una cuadrícula, y dale al resumen un tinte primario soft para que destaque como el estado actual de la cuenta:
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<main class="section">
|
|
126
|
+
<div class="section-content narrow stack loose">
|
|
127
|
+
<header class="stack tight">
|
|
128
|
+
<h1 class="text-title">Account settings</h1>
|
|
129
|
+
<p>Manage your profile, plan, and security.</p>
|
|
130
|
+
</header>
|
|
131
|
+
|
|
132
|
+
<section class="card stack" aria-labelledby="profile-title">
|
|
133
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
134
|
+
<p>Your name appears on invoices and shared projects.</p>
|
|
135
|
+
<div class="cluster">
|
|
136
|
+
<button class="btn primary" type="button">Save changes</button>
|
|
137
|
+
<button class="btn ghost" type="button">Cancel</button>
|
|
138
|
+
</div>
|
|
139
|
+
</section>
|
|
140
|
+
|
|
141
|
+
<div class="auto-grid">
|
|
142
|
+
<section class="card soft primary stack tight" aria-labelledby="plan-title">
|
|
143
|
+
<h2 class="text-label" id="plan-title">Current plan</h2>
|
|
144
|
+
<p class="text-title-sm">Team, billed yearly</p>
|
|
145
|
+
<p class="text-body">Renews on 12 March 2027.</p>
|
|
146
|
+
</section>
|
|
147
|
+
<section class="card stack tight" aria-labelledby="usage-title">
|
|
148
|
+
<h2 class="text-label" id="usage-title">Storage</h2>
|
|
149
|
+
<p class="text-title-sm">48 GB of 100 GB</p>
|
|
150
|
+
<p class="text-body">Shared by 6 members.</p>
|
|
151
|
+
</section>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</main>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
En una ventana ancha las dos tarjetas quedan una al lado de la otra; cuando la columna es demasiado estrecha para dos columnas de 16rem más la separación entre ellas, se apilan. La página de [Feedback](./usage/feedback.md) convierte el número de la tarjeta de almacenamiento en una barra de uso.
|
|
158
|
+
|
|
159
|
+
Una `.card` reposa a una unidad de profundidad, pero en el aspecto base esa profundidad no tiene sombra visible; aparece cuando una estética la dibuja o cuando añades `.raised` o `.floating`. [Composición → Elevación](./usage/composing.md#elevación) explica la profundidad.
|
|
160
|
+
|
|
161
|
+
## Estética: de qué está hecho
|
|
162
|
+
|
|
163
|
+
El tercer eje cambia el material de todo lo que contiene: esquinas, grosor del borde, sombras y a veces la fuente. Necesita su propio import (consulta [Configuración inicial → Añadir una estética](./setup.md#añadir-una-estética-opcional)):
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<main class="section neobrutalism">
|
|
167
|
+
<!-- La misma pantalla de ajustes: esquinas rectas, líneas gruesas y oscuras, sombras duras desplazadas -->
|
|
168
|
+
</main>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Como la presentación, una estética se hereda, y un componente dentro de ella puede llevar otra distinta. No la necesitas para construir la pantalla; [Estéticas](./usage/aesthetics.md) compara las seis.
|
|
172
|
+
|
|
173
|
+
## Vocabulario de esta documentación
|
|
174
|
+
|
|
175
|
+
Algunas páginas describen cómo se pinta un componente. Estas palabras tienen un único significado cada una:
|
|
176
|
+
|
|
177
|
+
| Palabra | Significado |
|
|
178
|
+
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
179
|
+
| Relleno | Cuánto del color de la intención cubre el componente, del 0% (`.ghost`) al 100% (`.solid`). |
|
|
180
|
+
| Tope | El relleno máximo que permite un componente. Por ejemplo, un campo de formulario limita un relleno heredado al 6%. |
|
|
181
|
+
| Placa | La superficie pintada del componente: el relleno, mezclado sobre el fondo. |
|
|
182
|
+
| Fondo | El color sobre el que se mezcla el relleno. Normalmente se ve la propia página a través; unos pocos componentes definen la suya, como el tinte claro de la intención bajo `.kbd` y `.code`. |
|
|
183
|
+
| Borde | El contorno del componente. Es distinto de las líneas divisorias, las líneas dentro de una tabla. |
|
|
184
|
+
| Tinta | Un color que se usa para dibujar líneas: el borde, las líneas divisorias de una tabla, la marca de un checkbox. "Tinta de texto" es el color del texto impreso sobre una placa. |
|
|
185
|
+
| Material | Lo que cambia una estética: radio y forma de las esquinas, grosor y estilo del borde, sombra y transparencia. |
|
|
186
|
+
| Losa | Una sombra dura, sin desenfoque, desplazada hacia abajo y hacia un lado, como la que dibujan `.neobrutalism` y `.chunky-tile`. |
|
|
187
|
+
| Elevación | Cuánta de la sombra disponible toma un elemento: ninguna (`.flat`), una unidad (`.raised`) o dos (`.floating`). |
|
|
188
|
+
|
|
189
|
+
## Los tokens detrás de las clases
|
|
190
|
+
|
|
191
|
+
Cada clase lee custom properties de CSS, llamadas tokens, así que puedes cambiar el resultado sin reescribir una clase:
|
|
192
|
+
|
|
193
|
+
| Tipo | Controla | Dónde se enumeran |
|
|
194
|
+
| ------------ | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
195
|
+
| Color | La paleta: colores de intención, texto, bordes y fondos, para claro y oscuro. | [Temas → Tokens de color](./usage/theming.md#tokens-de-color) |
|
|
196
|
+
| Base | Anchos y separaciones del layout, radios de esquina, altura de los controles, foco, movimiento. | [Temas → Tokens base](./usage/theming.md#tokens-base) |
|
|
197
|
+
| Intención | Los huecos de color que lee un componente después de que una clase de intención elige un rol. | [Temas → Tokens de intención](./usage/theming.md#tokens-de-intención) |
|
|
198
|
+
| Presentación | Los porcentajes de relleno y de borde que definen las clases de presentación. | [Personalización → Tokens de presentación](./usage/customizing.md#tokens-de-presentación) |
|
|
199
|
+
| Material | Radio, grosor del borde, geometría de la sombra y transparencia. | [Personalización → Tokens de material](./usage/customizing.md#tokens-de-material) |
|
|
200
|
+
| Estética | Un control por estética, como `--pixel-unit` o `--tile-lift`. | [Personalización → Tokens de estética](./usage/customizing.md#tokens-de-estética) |
|
|
201
|
+
|
|
202
|
+
Los tokens de color y los tokens base son lo que la mayoría de las aplicaciones cambia primero, para ajustarse a una marca. El resto es de más bajo nivel: los componentes los leen, y las clases de presentación y de estética los definen por ti.
|
|
203
|
+
|
|
204
|
+
## Límites que conviene conocer ya
|
|
205
|
+
|
|
206
|
+
- **La intención no se hereda.** Escríbela en cada elemento que la muestre. La única excepción son las filas de tabla.
|
|
207
|
+
- **Las clases solo dan estilo.** `<div class="btn">` parece un botón, pero no puede recibir el foco ni pulsarse con el teclado. Usa `<button>` o `<a href>`, y consulta [Accesibilidad](./accessibility.md).
|
|
208
|
+
- **Una combinación que la documentación no describe no está soportada.** Puede que se renderice, pero puede cambiar en cualquier versión; consulta [Introducción → Qué se considera soportado](./index.md#qué-se-considera-soportado).
|
|
209
|
+
|
|
210
|
+
## Siguiente paso
|
|
211
|
+
|
|
212
|
+
La pantalla tiene una acción principal y una discreta. [Botones](./usage/buttons.md) añade el resto: una acción destructiva para la zona de peligro, botones de icono, tamaños y estados deshabilitados.
|
package/docs/es/index.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introducción
|
|
3
|
+
description: Para qué sirve @codenhub/styles, qué cuesta y en qué orden leer esta documentación.
|
|
4
|
+
source: 5f82b6a4d492bdb5ea73406f256d307f775fa1ea
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# @codenhub/styles
|
|
8
|
+
|
|
9
|
+
`@codenhub/styles` te permite construir una interfaz coherente y con temas escribiendo nombres de clase sobre HTML normal. Importas una hoja de estilos y obtienes tokens, un reset, helpers de layout y de tipografía, y clases para botones, campos de formulario, alertas, tarjetas, tablas y tooltips. No hay JavaScript que cargar ni una librería de componentes que envolver: un `<button class="btn primary">` es toda la integración.
|
|
10
|
+
|
|
11
|
+
Esta documentación construye una pequeña pantalla de principio a fin: una página de ajustes de cuenta con un formulario de perfil, un resumen del plan y una zona de peligro. Cada página le añade algo, así que al final habrás visto todas las partes del paquete trabajando juntas en lugar de por separado.
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<main class="section">
|
|
15
|
+
<div class="section-content narrow stack">
|
|
16
|
+
<h1 class="text-title">Account settings</h1>
|
|
17
|
+
<form class="card stack">
|
|
18
|
+
<h2 class="text-title-sm">Profile</h2>
|
|
19
|
+
<div class="field">
|
|
20
|
+
<label class="label" for="display-name">Display name</label>
|
|
21
|
+
<input class="ipt" id="display-name" name="display-name" value="Ada Lovelace" />
|
|
22
|
+
</div>
|
|
23
|
+
<div class="cluster">
|
|
24
|
+
<button class="btn primary" type="submit">Save changes</button>
|
|
25
|
+
<button class="btn ghost" type="reset">Cancel</button>
|
|
26
|
+
</div>
|
|
27
|
+
</form>
|
|
28
|
+
</div>
|
|
29
|
+
</main>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Tres decisiones por componente
|
|
33
|
+
|
|
34
|
+
Cada componente responde con clases a tres preguntas independientes, así que un aspecto nuevo nunca necesita una nueva variante del componente:
|
|
35
|
+
|
|
36
|
+
- **Intención: ¿qué color?** `.primary`, `.secondary`, `.success`, `.warning`, `.destructive` o `.info`. Si no pones ninguna, es neutro.
|
|
37
|
+
- **Presentación: ¿cuánto de ese color?** `.solid`, `.soft` o `.ghost` definen el relleno; `.edged` o `.edgeless` definen el borde.
|
|
38
|
+
- **Estética: ¿de qué está hecho?** Una clase opcional, como `.neobrutalism` o `.glass`, cambia las esquinas, el grosor del borde, las sombras y la tipografía de todo lo que contiene.
|
|
39
|
+
|
|
40
|
+
`<button class="btn destructive ghost edged">Delete account</button>` es un botón rojo con contorno, y envolver la página en `.pixel` lo convierte en uno de pixel art sin tocar el botón. [Construir una pantalla](./concepts.md) presenta cada eje a medida que la página de ajustes lo necesita.
|
|
41
|
+
|
|
42
|
+
## CSS compilado o código fuente de Tailwind
|
|
43
|
+
|
|
44
|
+
El paquete ofrece las mismas clases de dos formas:
|
|
45
|
+
|
|
46
|
+
- **CSS compilado**, listo para usar. Impórtalo desde cualquier bundler o enlaza el archivo desde un CDN. No necesitas Tailwind.
|
|
47
|
+
- **Código fuente de Tailwind CSS v4**, en `@codenhub/styles/tw`. Úsalo cuando tu proyecto ya usa Tailwind v4, para que tu build compile el paquete junto con tus propias utilidades y tu tema.
|
|
48
|
+
|
|
49
|
+
[Configuración inicial](./setup.md) te ayuda a elegir.
|
|
50
|
+
|
|
51
|
+
## Lo que no hace
|
|
52
|
+
|
|
53
|
+
- **Sin JavaScript.** No hay runtime, ni bindings para frameworks, ni código generado. Todo lo que necesite un script, como abrir un diálogo, cambiar de tema o cerrar un tooltip, es código tuyo.
|
|
54
|
+
- **Sin semántica ni comportamiento.** Las clases pintan elementos; no añaden semántica HTML, ARIA, manejo del teclado, gestión del foco, validación ni anuncios. [Accesibilidad](./accessibility.md) marca el límite exacto.
|
|
55
|
+
- **Sin cambio de tema.** Elegir claro u oscuro es una clase o un atributo que pones tú. El paquete independiente `@codenhub/theme` puede recordar y aplicar esa elección por ti.
|
|
56
|
+
- **Sin fuentes ni iconos.** No se descarga ningún archivo de fuente. Las estéticas que quieren una fuente especial usan una fuente del sistema hasta que tú aportes una. Los iconos, incluidos los spinners de carga, vienen de tu propio conjunto de iconos, como `@codenhub/icons`.
|
|
57
|
+
- **Sin alias de compatibilidad.** Una clase o un token eliminado aparece en el changelog, no se conserva con su nombre antiguo.
|
|
58
|
+
|
|
59
|
+
## Contrapartidas
|
|
60
|
+
|
|
61
|
+
Conoce estos costes antes de adoptarlo:
|
|
62
|
+
|
|
63
|
+
- **Los nombres de clase son cortos y no llevan prefijo.** `.primary`, `.success`, `.dark`, `.label`, `.field`, `.section`, `.stack`, `.flat` y `.ghost` son nombres globales. Otra hoja de estilos en la misma página que los use choca con esta. El paquete está en [capas de cascada](./setup.md#capas-de-cascada), así que tu propio CSS sin capa gana en caso de choque, pero las reglas de una librería de terceros para el mismo nombre se siguen aplicando junto a las del paquete.
|
|
64
|
+
- **Las hojas de estilos completas son grandes antes de comprimir.** En el momento de escribir esto, minificada, la hoja de estilos completa ocupa unos 198 KB, `/native` unos 295 KB y `/components` unos 159 KB. Servidas con gzip ocupan unos 17 KB, 22 KB y 13 KB. Los archivos específicos son mucho más pequeños: `/theme` ocupa unos 12 KB (3 KB con gzip) y una estética, de 4 a 14 KB (de 1 a 2 KB con gzip). La mayor parte del tamaño es composición que cada componente repite, y por eso la compresión elimina tanto. Un archivo compilado incluye todas las clases, las use una página o no. Para incluir solo las clases que usan tus páginas, compila el paquete en tu propio build: con [Tailwind CSS v4](./integrating/tailwind.md) cuando el proyecto lo usa, o con el [comando `build`](./integrating/without-a-bundler.md#generar-solo-las-clases-que-usas) del paquete en cualquier otro proyecto. Así, una página con un botón recibe de 26 a 28 KB minificados, y unos 6 KB con gzip. Si no, importa el punto de entrada más reducido que cubra una página; consulta [Configuración inicial → Todos los puntos de entrada](./setup.md#todos-los-puntos-de-entrada).
|
|
65
|
+
- **`--color-foreground` es un fondo, no un color de texto.** Es el tono un paso por encima de la página sobre el que se apoya una tarjeta o un panel discreto. El color de texto es `--color-text`.
|
|
66
|
+
- **Cuatro colores de hover son valores fijos.** `--color-success-hover`, `--color-warning-hover`, `--color-destructive-hover` y `--color-info-hover` están precalculados, porque mezclarlos en vivo hacía fallar WebKit. Si sobrescribes solo `--color-success`, su hover conserva el tono anterior, así que reemplaza la familia completa; consulta [Temas → Tokens de color](./usage/theming.md#tokens-de-color).
|
|
67
|
+
- **Solo navegadores modernos.** Chrome 123, Safari 17.5 o Firefox 128 y posteriores. No hay una capa de respaldo para navegadores antiguos.
|
|
68
|
+
|
|
69
|
+
## Qué se considera soportado
|
|
70
|
+
|
|
71
|
+
Una combinación de clases está soportada cuando esta documentación la describe y la demo pública en [demo.codenhub.dev/styles](https://demo.codenhub.dev/styles/) la muestra. La demo renderiza los fixtures de prueba del paquete, incluidas las matrices completas de intención, presentación y estética, con el CSS compilado. Una combinación que ni está documentada ni aparece en la demo puede seguir produciendo CSS, pero no se mantiene y puede cambiar en cualquier versión.
|
|
72
|
+
|
|
73
|
+
La demo se reconstruye desde la rama principal, no desde cada versión. Puede mostrar trabajo que todavía no se ha publicado, así que, cuando la demo y esta documentación no coinciden sobre una versión publicada, mandan la documentación y el [changelog](../changelog/index.md) de esa versión.
|
|
74
|
+
|
|
75
|
+
## Versionado
|
|
76
|
+
|
|
77
|
+
El paquete está por debajo de 1.0 y sigue la [regla del versionado semántico para las versiones 0.x](https://semver.org/#spec-item-4): la superficie pública todavía puede cambiar entre versiones menores.
|
|
78
|
+
|
|
79
|
+
- Una versión menor, como de 0.7.0 a 0.8.0, puede romper la compatibilidad. Puede renombrar o eliminar una clase o un token, o cambiar un valor por defecto. Cada cambio incompatible aparece en **Changed** o **Removed** en la página del [changelog](../changelog/index.md) de esa versión, con lo que debes usar en su lugar.
|
|
80
|
+
- Una versión de parche, como de 0.7.0 a 0.7.1, nunca rompe la compatibilidad.
|
|
81
|
+
|
|
82
|
+
El rango por defecto de npm para una nueva dependencia, `^0.7.0`, ya acepta solo parches, porque por debajo de 1.0 un rango con caret no pasa a la siguiente versión menor. Lee el changelog antes de subirlo. Cuando enlaces un archivo desde un CDN, pon la versión exacta en la URL; consulta [Sin bundler](./integrating/without-a-bundler.md).
|
|
83
|
+
|
|
84
|
+
Los cambios incompatibles no se suavizan con alias porque el modelo todavía se está asentando, y mantener cada nombre antiguo junto a su reemplazo haría crecer la superficie en cada versión. Un cambio de nombre o una eliminación suele costar un buscar y reemplazar al actualizar; un valor por defecto que cambia puede requerir que reajustes tu propio CSS.
|
|
85
|
+
|
|
86
|
+
## Orden de lectura
|
|
87
|
+
|
|
88
|
+
La primera vez, léelas en orden. Cada página añade algo a la pantalla de ajustes y termina indicando la siguiente.
|
|
89
|
+
|
|
90
|
+
1. [Configuración inicial](./setup.md): instala el paquete, elige entre CSS compilado o código fuente de Tailwind y renderiza la estructura vacía de la página.
|
|
91
|
+
2. [Integración](./integrating/index.md): solo si usas Next.js, Vue, Svelte, Astro, Tailwind v4 o ningún bundler. Cada guía te devuelve al camino principal.
|
|
92
|
+
3. [Construir una pantalla](./concepts.md): maqueta la página, define su tipografía y añade una tarjeta y un botón Guardar, aprendiendo por el camino la intención, el relleno y el borde.
|
|
93
|
+
4. [Uso](./usage/index.md): el resto de la pantalla, en orden:
|
|
94
|
+
- [Botones](./usage/buttons.md): acciones secundarias y destructivas, tamaños, botones de icono y estados deshabilitados.
|
|
95
|
+
- [Formularios](./usage/forms.md): campos con etiqueta, pistas, errores, iconos, selects, checkboxes, radios y switches.
|
|
96
|
+
- [Feedback](./usage/feedback.md): un estado de guardado, una alerta de éxito, un badge del plan, un placeholder de carga y una barra de uso.
|
|
97
|
+
- [Tooltips](./usage/tooltips.md): ayuda de campo que funciona con ratón, con teclado y con lector de pantalla.
|
|
98
|
+
- [Temas](./usage/theming.md): modo claro y oscuro, colores de marca y tus propias intenciones.
|
|
99
|
+
- [Estéticas](./usage/aesthetics.md): cambia el estilo de toda la pantalla con una sola clase.
|
|
100
|
+
- [Clases solo](./usage/solo.md): pinta una estética sobre un componente al que este paquete no da estilo.
|
|
101
|
+
- [Composición](./usage/composing.md), [Personalización](./usage/customizing.md) y [Contenido y layout](./usage/content-and-layout.md): páginas de consulta con cada regla de eje, token, valor por defecto y clase helper.
|
|
102
|
+
- [Preajustes](./usage/presets.md): define un aspecto una sola vez, para una región, un tema o tu propia clase de componente, en lugar de repetirlo en cada elemento.
|
|
103
|
+
5. [Accesibilidad](./accessibility.md): lo que el CSS resuelve por ti y lo que tu aplicación todavía debe hacer.
|
|
104
|
+
|
|
105
|
+
El [changelog](../changelog/index.md) enumera cada versión y lo que cambió en ella.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Astro
|
|
3
|
+
description: Cargar la hoja de estilos en una aplicación Astro.
|
|
4
|
+
order: 5
|
|
5
|
+
source: 4f93b3a6e0d1cd24a0b7d0eb6050cc98690cd598
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Astro
|
|
9
|
+
|
|
10
|
+
Astro renderiza los componentes de forma estática por defecto, pero el import de una hoja de estilos global sigue necesitando hacerse una sola vez: desde un layout compartido, no desde páginas o islas individuales.
|
|
11
|
+
|
|
12
|
+
## Importar la hoja de estilos
|
|
13
|
+
|
|
14
|
+
```astro
|
|
15
|
+
---
|
|
16
|
+
// src/layouts/Layout.astro
|
|
17
|
+
import "@codenhub/styles";
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<html lang="en">
|
|
21
|
+
<body>
|
|
22
|
+
<slot />
|
|
23
|
+
</body>
|
|
24
|
+
</html>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Cada página que usa este layout carga la hoja de estilos una vez. ¿Usas Tailwind CSS v4? Importa en su lugar `@codenhub/styles/tw` a través de la integración de Tailwind para Astro; consulta [Tailwind CSS v4](./tailwind.md), incluido cuándo hace falta realmente un `@source` explícito.
|
|
28
|
+
|
|
29
|
+
## Forzar un tema
|
|
30
|
+
|
|
31
|
+
Aplica `.dark` o `.light` en `<html>` para forzar un tema en lugar de seguir la preferencia del sistema; consulta [Temas → Claro y oscuro](../usage/theming.md#claro-y-oscuro).
|
|
32
|
+
|
|
33
|
+
## Siguiente paso
|
|
34
|
+
|
|
35
|
+
Vuelve al camino principal: [Construir una pantalla](../concepts.md) añade la primera tarjeta y el primer formulario a la página de ajustes. [Configuración inicial → Todos los puntos de entrada](../setup.md#todos-los-puntos-de-entrada) enumera todas las demás hojas de estilos que puedes importar.
|