@codenhub/styles 0.6.0 → 0.7.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 +61 -0
- package/README.md +21 -16
- package/README.pt-BR.md +61 -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/components.css +2 -2
- package/dist/index.css +2 -2
- package/dist/native.css +2 -2
- package/dist/palette.css +1 -1
- package/dist/theme.css +2 -2
- package/dist/tw/aesthetics/chunky-tile.css +81 -23
- package/dist/tw/aesthetics/cyber.css +86 -29
- package/dist/tw/aesthetics/glass.css +177 -50
- package/dist/tw/aesthetics/neobrutalism.css +98 -22
- package/dist/tw/aesthetics/pixel.css +93 -8
- package/dist/tw/aesthetics/sketch.css +87 -22
- package/dist/tw/box.css +21 -2
- package/dist/tw/components/feedback.css +2 -2
- package/dist/tw/components/form.css +58 -19
- package/dist/tw/components/index.css +3 -4
- package/dist/tw/components/surface.css +15 -6
- package/dist/tw/index.css +1 -1
- package/dist/tw/intent.css +6 -5
- package/dist/tw/native.css +8 -8
- package/dist/tw/palette.css +6 -6
- package/dist/tw/reset.css +15 -15
- package/dist/tw/theme.css +29 -17
- package/dist/tw/utilities/content.css +43 -1
- package/dist/tw/utilities/layout.css +26 -12
- package/docs/accessibility.md +89 -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/index.md +1 -0
- package/docs/concepts.md +188 -46
- package/docs/es/accessibility.md +150 -0
- package/docs/es/concepts.md +212 -0
- package/docs/es/index.md +104 -0
- package/docs/es/integrating/astro.md +35 -0
- package/docs/es/integrating/index.md +47 -0
- package/docs/es/integrating/nextjs.md +67 -0
- package/docs/es/integrating/svelte.md +45 -0
- package/docs/es/integrating/tailwind.md +78 -0
- package/docs/es/integrating/vue.md +31 -0
- package/docs/es/integrating/without-a-bundler.md +115 -0
- package/docs/es/setup.md +180 -0
- package/docs/es/usage/aesthetics.md +276 -0
- package/docs/es/usage/buttons.md +131 -0
- package/docs/es/usage/composing.md +164 -0
- package/docs/es/usage/content-and-layout.md +215 -0
- package/docs/es/usage/customizing.md +298 -0
- package/docs/es/usage/feedback.md +153 -0
- package/docs/es/usage/forms.md +231 -0
- package/docs/es/usage/index.md +29 -0
- package/docs/es/usage/solo.md +84 -0
- package/docs/es/usage/theming.md +296 -0
- package/docs/es/usage/tooltips.md +127 -0
- package/docs/index.md +85 -26
- package/docs/integrating/astro.md +3 -4
- package/docs/integrating/index.md +18 -13
- package/docs/integrating/nextjs.md +3 -4
- package/docs/integrating/svelte.md +5 -4
- package/docs/integrating/tailwind.md +16 -3
- package/docs/integrating/vue.md +3 -4
- package/docs/integrating/without-a-bundler.md +114 -0
- package/docs/pt-BR/accessibility.md +150 -0
- package/docs/pt-BR/concepts.md +212 -0
- package/docs/pt-BR/index.md +104 -0
- package/docs/pt-BR/integrating/astro.md +35 -0
- package/docs/pt-BR/integrating/index.md +47 -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 +78 -0
- package/docs/pt-BR/integrating/vue.md +31 -0
- package/docs/pt-BR/integrating/without-a-bundler.md +115 -0
- package/docs/pt-BR/setup.md +180 -0
- package/docs/pt-BR/usage/aesthetics.md +276 -0
- package/docs/pt-BR/usage/buttons.md +131 -0
- package/docs/pt-BR/usage/composing.md +164 -0
- package/docs/pt-BR/usage/content-and-layout.md +215 -0
- package/docs/pt-BR/usage/customizing.md +298 -0
- package/docs/pt-BR/usage/feedback.md +153 -0
- package/docs/pt-BR/usage/forms.md +231 -0
- package/docs/pt-BR/usage/index.md +29 -0
- package/docs/pt-BR/usage/solo.md +84 -0
- package/docs/pt-BR/usage/theming.md +296 -0
- package/docs/pt-BR/usage/tooltips.md +127 -0
- package/docs/setup.md +134 -91
- package/docs/usage/aesthetics.md +76 -66
- package/docs/usage/buttons.md +108 -40
- package/docs/usage/composing.md +105 -92
- package/docs/usage/content-and-layout.md +157 -126
- package/docs/usage/customizing.md +107 -37
- package/docs/usage/feedback.md +134 -71
- package/docs/usage/forms.md +176 -107
- package/docs/usage/index.md +18 -14
- package/docs/usage/solo.md +83 -0
- package/docs/usage/theming.md +260 -118
- package/docs/usage/tooltips.md +90 -49
- package/llms-full.txt +2358 -1313
- package/llms.txt +24 -22
- package/package.json +25 -32
- package/dist/tw/components/loader.css +0 -116
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sin bundler
|
|
3
|
+
description: Enlazar las hojas de estilos compiladas desde HTML simple, Rails, Django o cualquier aplicación renderizada en el servidor.
|
|
4
|
+
order: 6
|
|
5
|
+
source: 3b29f40d4ca6413f4c0ee8e3a69eb1f8394e2ba6
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Sin bundler
|
|
9
|
+
|
|
10
|
+
Las hojas de estilos compiladas son CSS terminado: cada una es un único archivo sin `@import` ni referencias a otro archivo, y cada imagen que dibuja va incrustada como URL `data:`: las máscaras del tick y del guion del checkbox, y los filtros de lente SVG que usa `.glass-liquid`. Una página puede cargar una con una simple etiqueta `<link>`, desde cualquier servidor, sin paso de build, y la hoja de estilos no hace más peticiones.
|
|
11
|
+
|
|
12
|
+
Lo que necesita una herramienta de build es el _nombre_ del import. `@import "@codenhub/styles"` nombra un paquete, y encontrar el archivo que hay detrás de ese nombre, `node_modules/@codenhub/styles/dist/index.css`, lo hacen herramientas que conocen Node, como Vite, webpack o la CLI de Tailwind, que leen el mapa `exports` del paquete. Un navegador no: resuelve la URL de un `@import` respecto a la hoja de estilos que lo contiene y un `<link href>` respecto a la página, así que un nombre de paquete sin más se convierte en una petición a una ruta que no existe. Sin bundler, enlaza el archivo por su ruta.
|
|
13
|
+
|
|
14
|
+
Los puntos de entrada `/tw` son código fuente de Tailwind y necesitan un build de Tailwind. `/tw/aesthetics` es la excepción, CSS simple sin nada que Tailwind tenga que procesar, pero sin bundler enlaza en su lugar los archivos compilados de `dist/aesthetics/`, como se muestra abajo. Esta página cubre solo los puntos de entrada compilados, para una página que no tiene ningún build de CSS: HTML simple, Rails, Django o cualquier aplicación renderizada en el servidor.
|
|
15
|
+
|
|
16
|
+
## Qué archivo enlazar
|
|
17
|
+
|
|
18
|
+
Cada ruta de import compilada es un archivo en la carpeta `dist/` del paquete:
|
|
19
|
+
|
|
20
|
+
| Ruta de import | Archivo |
|
|
21
|
+
| ------------------------------- | -------------------------------------------------------------- |
|
|
22
|
+
| `@codenhub/styles` | `dist/index.css` |
|
|
23
|
+
| `@codenhub/styles/theme` | `dist/theme.css` |
|
|
24
|
+
| `@codenhub/styles/components` | `dist/components.css` |
|
|
25
|
+
| `@codenhub/styles/native` | `dist/native.css` |
|
|
26
|
+
| `@codenhub/styles/palette` | `dist/palette.css` |
|
|
27
|
+
| `@codenhub/styles/aesthetics` | `dist/aesthetics/index.css` |
|
|
28
|
+
| `@codenhub/styles/aesthetics/*` | `dist/aesthetics/<name>.css`, como `dist/aesthetics/pixel.css` |
|
|
29
|
+
|
|
30
|
+
Enlaza primero el archivo base y después una estética. [Configuración inicial → Todos los puntos de entrada](../setup.md#todos-los-puntos-de-entrada) explica qué contiene cada uno; enlaza un solo archivo base, no varios, porque se solapan.
|
|
31
|
+
|
|
32
|
+
## Desde un CDN
|
|
33
|
+
|
|
34
|
+
jsDelivr y unpkg sirven todos los archivos de cada versión publicada en npm, así que una página puede enlazar uno sin instalar nada:
|
|
35
|
+
|
|
36
|
+
```html
|
|
37
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.7.0/dist/index.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@codenhub/styles@0.7.0/dist/aesthetics/pixel.css" />
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Pon la versión exacta en la URL. Sin ella, el CDN sirve la última versión, y por debajo de 1.0 una versión menor puede renombrar o eliminar una clase; consulta [Versionado](../index.md#versionado).
|
|
41
|
+
|
|
42
|
+
## Desde tu propio servidor
|
|
43
|
+
|
|
44
|
+
Instala el paquete y después sirve su carpeta `dist/` como archivos estáticos:
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
npm install @codenhub/styles
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Cada framework sirve de forma distinta una carpeta de `node_modules`, así que abajo está cada uno. Donde el framework lee la carpeta en su sitio, como hacen Rails y Django, actualizar el paquete y volver a desplegar es todo lo que hace falta para una actualización.
|
|
51
|
+
|
|
52
|
+
### HTML simple
|
|
53
|
+
|
|
54
|
+
Copia `node_modules/@codenhub/styles/dist` en la carpeta que publica tu servidor y después enlázala:
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<link rel="stylesheet" href="/vendor/codenhub-styles/index.css" />
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Repite la copia después de cada actualización, por ejemplo desde un script `postinstall` de npm.
|
|
61
|
+
|
|
62
|
+
### Ruby on Rails
|
|
63
|
+
|
|
64
|
+
Una aplicación Rails construida con `cssbundling-rails` ya usa un bundler: importa el paquete desde `app/assets/stylesheets/application.css` como en [Configuración inicial → Importar la hoja de estilos](../setup.md#importar-la-hoja-de-estilos).
|
|
65
|
+
|
|
66
|
+
Con Propshaft y sin bundler de CSS, añade la carpeta del paquete a las rutas de assets:
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
# config/initializers/assets.rb
|
|
70
|
+
Rails.application.config.assets.paths << Rails.root.join("node_modules/@codenhub")
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Después enlázala desde el layout, por su ruta dentro de esa carpeta:
|
|
74
|
+
|
|
75
|
+
```erb
|
|
76
|
+
<%# app/views/layouts/application.html.erb %>
|
|
77
|
+
<%= stylesheet_link_tag "styles/dist/index" %>
|
|
78
|
+
<%= stylesheet_link_tag "styles/dist/aesthetics/pixel" %>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Apunta la ruta a `node_modules/@codenhub` y no directamente a `dist/`. Propshaft sirve los archivos por su ruta dentro de cada carpeta de assets, así que añadir `dist/` directamente publicaría un `index.css` suelto que choca con cualquier `index.css` tuyo.
|
|
82
|
+
|
|
83
|
+
### Django
|
|
84
|
+
|
|
85
|
+
Añade la carpeta a `STATICFILES_DIRS` con un prefijo, que mantiene sus nombres de archivo separados de tus propios archivos estáticos:
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
# settings.py
|
|
89
|
+
STATICFILES_DIRS = [
|
|
90
|
+
("codenhub-styles", BASE_DIR / "node_modules/@codenhub/styles/dist"),
|
|
91
|
+
]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```django
|
|
95
|
+
{% load static %}
|
|
96
|
+
<link rel="stylesheet" href="{% static 'codenhub-styles/index.css' %}" />
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Laravel
|
|
100
|
+
|
|
101
|
+
Una aplicación Laravel usa Vite por defecto, así que tiene un bundler: importa el paquete desde `resources/css/app.css` como en [Configuración inicial → Importar la hoja de estilos](../setup.md#importar-la-hoja-de-estilos), y carga ese archivo con la directiva `@vite` como de costumbre.
|
|
102
|
+
|
|
103
|
+
## Comprobar que funciona
|
|
104
|
+
|
|
105
|
+
Renderiza un elemento con estilo, como en [Integración → Comprobar que funciona](./index.md#comprobar-que-funciona):
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<button class="btn primary">Save changes</button>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Un botón redondeado relleno con el color principal significa que la hoja de estilos se ha cargado. Si el botón se ve como el predeterminado del navegador, abre el panel de red del navegador: un `404` en la hoja de estilos significa que la ruta o la configuración de archivos estáticos es incorrecta.
|
|
112
|
+
|
|
113
|
+
## Siguiente paso
|
|
114
|
+
|
|
115
|
+
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.
|
package/docs/es/setup.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Configuración inicial
|
|
3
|
+
description: Instala el paquete, elige entre CSS compilado o código fuente de Tailwind y renderiza la estructura base de la página de ajustes.
|
|
4
|
+
order: 1
|
|
5
|
+
source: 20ec2aeb0950fe5b8a045e9b0ac307ca97d0462e
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Configuración inicial
|
|
9
|
+
|
|
10
|
+
Esta página lleva la hoja de estilos a tu proyecto y pone en la página la estructura vacía de la pantalla de ajustes. Hace falta una instalación, un import y una decisión: CSS compilado o código fuente de Tailwind. El resto de la página es referencia a la que puedes volver: cada punto de entrada, la opción sin clases, las capas de cascada y qué falla cuando falta un import.
|
|
11
|
+
|
|
12
|
+
## Instalación
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
pnpm add @codenhub/styles
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`npm install @codenhub/styles` y `yarn add @codenhub/styles` funcionan igual.
|
|
19
|
+
|
|
20
|
+
## Importar la hoja de estilos
|
|
21
|
+
|
|
22
|
+
Importa una vez la hoja de estilos compilada completa, en el archivo CSS que tu aplicación ya carga de forma global:
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
@import "@codenhub/styles";
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Después escribe la estructura de la pantalla de ajustes. Es una sección de página con una columna estrecha y centrada:
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<main class="section">
|
|
32
|
+
<div class="section-content narrow stack">
|
|
33
|
+
<h1 class="text-title">Account settings</h1>
|
|
34
|
+
<p>Manage your profile, plan, and security.</p>
|
|
35
|
+
</div>
|
|
36
|
+
</main>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Si el encabezado aparece con una fuente de título en negrita y compacta, con el párrafo separado debajo, y la columna queda en el centro de una ventana ancha, la hoja de estilos funciona. Si parecen los estilos por defecto del navegador, consulta [Cuando nada tiene estilo](#cuando-nada-tiene-estilo).
|
|
40
|
+
|
|
41
|
+
La hoja de estilos completa incluye el reset, los tokens, los helpers de layout y de tipografía, y todas las clases de componentes. Aplica reglas globales a tu página: el reset, el tema raíz y los anillos de foco. No incluye las estéticas ni el mapeo de elementos sin clases; ambos son imports separados, descritos más abajo.
|
|
42
|
+
|
|
43
|
+
## Elige tu camino
|
|
44
|
+
|
|
45
|
+
Elige uno:
|
|
46
|
+
|
|
47
|
+
- **CSS compilado** (`@codenhub/styles`, el del ejemplo anterior). Úsalo salvo que tengas un motivo para no hacerlo. Funciona cualquier bundler que resuelva imports de CSS desde paquetes, como Vite, webpack o la CLI de Tailwind.
|
|
48
|
+
- **Código fuente de Tailwind CSS v4** (`@codenhub/styles/tw`). Úsalo cuando tu proyecto ya usa Tailwind v4. Tu build compila el paquete junto con tus propias utilidades, así que obtienes una sola hoja de estilos y la variante `dark:` de Tailwind coincide con el tema del paquete. Necesita Tailwind 4.3.2 o posterior, por debajo de 5.
|
|
49
|
+
- **Sin bundler.** Enlaza el archivo compilado desde `node_modules` o desde un CDN con una etiqueta `<link>`.
|
|
50
|
+
|
|
51
|
+
Tu framework puede necesitar su propia configuración, como dónde va la hoja de estilos global en Next.js o en Astro. Cada una de estas guías cubre una configuración y después te devuelve aquí:
|
|
52
|
+
|
|
53
|
+
- [Tailwind CSS v4](./integrating/tailwind.md)
|
|
54
|
+
- [Next.js](./integrating/nextjs.md)
|
|
55
|
+
- [Vue](./integrating/vue.md)
|
|
56
|
+
- [Svelte](./integrating/svelte.md)
|
|
57
|
+
- [Astro](./integrating/astro.md)
|
|
58
|
+
- [Sin bundler](./integrating/without-a-bundler.md)
|
|
59
|
+
|
|
60
|
+
## Añadir una estética (opcional)
|
|
61
|
+
|
|
62
|
+
Las estéticas son hojas de estilos aparte porque la mayoría de las páginas usa una o ninguna. Importa las seis a la vez, o solo la que uses:
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
@import "@codenhub/styles";
|
|
66
|
+
@import "@codenhub/styles/aesthetics/neobrutalism";
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
El orden de los dos imports no importa, porque cada punto de entrada declara las [capas de cascada](#capas-de-cascada) antes de usar alguna. [Estéticas](./usage/aesthetics.md) muestra lo que hace cada una; puedes ignorarlas hasta entonces.
|
|
70
|
+
|
|
71
|
+
## Requisitos
|
|
72
|
+
|
|
73
|
+
- **Navegadores:** Chrome 123, Safari 17.5 o Firefox 128 y posteriores. Los colores usan `light-dark()` y `color-scheme` (Firefox 120). `.input-group` lee el estado inválido y deshabilitado de un control anidado con `:has()` (Firefox 121). Las clases de elevación registran una propiedad que no se hereda con `@property` (Firefox 128); sin ella, una clase de elevación también llegaría a los elementos sin clase que contiene.
|
|
74
|
+
- **Herramientas:** un `@import` con un nombre de paquete necesita una herramienta que resuelva imports de CSS desde paquetes. Si no tienes una, enlaza el archivo compilado por su ruta o desde un CDN; consulta [Sin bundler](./integrating/without-a-bundler.md).
|
|
75
|
+
- **Tailwind:** 4.3.2 o posterior, por debajo de 5, solo para los puntos de entrada de código fuente `/tw`. Es una peer dependency opcional, así que los puntos de entrada compilados no lo instalan.
|
|
76
|
+
- **Tu aplicación:** el paquete no tiene JavaScript. El HTML semántico, ARIA, el comportamiento de teclado, la gestión del foco, la validación y los anuncios son cosa tuya; consulta [Accesibilidad](./accessibility.md).
|
|
77
|
+
|
|
78
|
+
## Cuando nada tiene estilo
|
|
79
|
+
|
|
80
|
+
- **Falta el import o no se carga de forma global.** Las clases no hacen nada hasta que la hoja de estilos está en la página. Impórtala una vez en una hoja de estilos que cargue cada página, no en un componente que puede no renderizarse.
|
|
81
|
+
- **El nombre del paquete no se resuelve.** Un `<link>` simple o una herramienta sin resolución de paquetes CSS no puede leer `@import "@codenhub/styles"`. Enlaza `node_modules/@codenhub/styles/dist/index.css`, o sigue [Sin bundler](./integrating/without-a-bundler.md).
|
|
82
|
+
- **Se carga una ruta `/tw` sin Tailwind.** Los archivos `/tw` son código fuente de Tailwind: contienen `@theme`, `@utility` y `@apply`, que los navegadores no entienden. Tu build de Tailwind tiene que compilarlos; consulta [Tailwind CSS v4](./integrating/tailwind.md).
|
|
83
|
+
- **Falta una clase construida en tiempo de ejecución (solo con código fuente de Tailwind).** Tailwind genera una clase solo cuando encuentra su nombre en tus archivos fuente. Un nombre armado a partir de strings, como `` `btn ${tone}` ``, es invisible para ese escaneo. Escribe los nombres de clase completos, o enuméralos como se describe en [Tailwind CSS v4](./integrating/tailwind.md).
|
|
84
|
+
|
|
85
|
+
### CSS crítico en línea
|
|
86
|
+
|
|
87
|
+
Puedes pegar una hoja de estilos **compilada**, de `dist/` o de la salida de tu propio build, dentro de un elemento HTML `<style>`, por ejemplo para poner en línea el CSS crítico en un head renderizado en el servidor. Ninguno de los archivos compilados contiene la secuencia `</style` que cerraría el elemento antes de tiempo.
|
|
88
|
+
|
|
89
|
+
Eso no se aplica a los archivos `/tw`. Son código fuente de Tailwind, no CSS terminado, así que pegar uno dentro de `<style>` le da al navegador directivas que ignora y las clases nunca se generan. Compílalos primero con Tailwind y después pon en línea el resultado.
|
|
90
|
+
|
|
91
|
+
## Todos los puntos de entrada
|
|
92
|
+
|
|
93
|
+
Los puntos de entrada compilados son CSS terminado. Los puntos de entrada `/tw` publican el código fuente sin compilar desde `dist/tw`, que un build de Tailwind v4 tiene que procesar. Un punto de entrada `/tw` de un solo componente incluye los tokens del tema, así que sus clases funcionan por sí solas.
|
|
94
|
+
|
|
95
|
+
Cada ruta de import resuelve el mismo archivo con las condiciones de exportación `style`, `import` y `default`. Un import de CSS es un efecto secundario, así que asegúrate de que tu bundler no lo descarte como no usado.
|
|
96
|
+
|
|
97
|
+
| Ruta de import | Qué contiene y qué cambia |
|
|
98
|
+
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
99
|
+
| `@codenhub/styles` | Hoja de estilos completa compilada: la salida base y de tema de Tailwind, tokens, tipografía, helpers de layout y de contenido, componentes y el reset. Aplica el reset global, el tema raíz y las reglas de foco. |
|
|
100
|
+
| `@codenhub/styles/theme` | Tokens compilados y las clases de intención, presentación, elevación y patrón de esquinas. Define las propiedades del tema raíz y los selectores claro y oscuro. Sin reset ni componentes. |
|
|
101
|
+
| `@codenhub/styles/palette` | Custom properties `--palette-*` generadas: el color de relleno, de texto y de borde de cada combinación de intención y presentación como valor plano, más los colores planos `border`, `surface` y `text`. Para código que no puede usar el propio paquete; consulta [Personalización → Paleta generada](./usage/customizing.md#paleta-generada). |
|
|
102
|
+
| `@codenhub/styles/components` | Tokens compilados, helpers de tipografía y todas las clases de componentes. Cada componente lleva su propia regla de movimiento reducido, y la corrección para `<dialog>` cerrado viene con `.card`. Sin reset, sin helpers de layout ni de contenido, sin mapeo sin clases. |
|
|
103
|
+
| `@codenhub/styles/native` | La hoja de estilos compilada completa más el [mapeo sin clases](#html-sin-clases) para elementos HTML simples. Aplica el reset y selectores de elemento amplios. |
|
|
104
|
+
| `@codenhub/styles/aesthetics` | Las seis estéticas compiladas, `.neobrutalism`, `.glass`, `.pixel`, `.chunky-tile`, `.cyber` y `.sketch`, cada una con su clase `-solo`. No trae tokens ni componentes propios; impórtalo en cualquier orden. |
|
|
105
|
+
| `@codenhub/styles/aesthetics/*` | Una estética compilada y su clase solo: `/neobrutalism`, `/glass`, `/pixel`, `/chunky-tile`, `/cyber` o `/sketch`. |
|
|
106
|
+
| `@codenhub/styles/tw` | Versión en código fuente de la hoja de estilos completa. Importa el propio Tailwind y después el tema, la tipografía, los helpers, los componentes y el reset. Las mismas reglas globales. |
|
|
107
|
+
| `@codenhub/styles/tw/theme` | Tema, tokens y clases de eje en código fuente. Importa la capa de tema de Tailwind, emite los selectores de tema y define la variante `dark:` del paquete. |
|
|
108
|
+
| `@codenhub/styles/tw/components` | Tema, tipografía, botones, feedback, formularios, superficies y tooltips en código fuente. Sin reset, sin helpers de layout ni de contenido, sin mapeo sin clases. |
|
|
109
|
+
| `@codenhub/styles/tw/surface` | Tema en código fuente más `.surface`, `.card` y `.panel`. |
|
|
110
|
+
| `@codenhub/styles/tw/button` | Tema en código fuente más `.btn`. |
|
|
111
|
+
| `@codenhub/styles/tw/form` | Tema en código fuente más `.field`, `.text-control`, `.ipt`, `.textarea`, `.select`, `.input-group`, `.checkbox`, `.radio` y `.switch`. |
|
|
112
|
+
| `@codenhub/styles/tw/feedback` | Tema en código fuente más `.alert`, `.badge`, `.skeleton` y `.progress`, con sus animaciones. |
|
|
113
|
+
| `@codenhub/styles/tw/tooltip` | Tema en código fuente más las clases de tooltip. |
|
|
114
|
+
| `@codenhub/styles/tw/reset` | Tema, helpers de tipografía y el reset global en código fuente. Cambia la raíz, el body y los elementos, y define reglas de selección, movimiento, foco, barras de desplazamiento y colores forzados. |
|
|
115
|
+
| `@codenhub/styles/tw/native` | Versión en código fuente de `/native`: todo, más el reset y el mapeo sin clases. El efecto global más amplio. |
|
|
116
|
+
| `@codenhub/styles/tw/typography` | Tema en código fuente más los helpers de tipografía. Define los selectores de tema; sin reset, sin mapeo sin clases. |
|
|
117
|
+
| `@codenhub/styles/tw/utilities` | Tema y tipografía en código fuente más los helpers de layout y de contenido. Enumera los nombres de clase del paquete para que Tailwind los genere siempre. |
|
|
118
|
+
| `@codenhub/styles/tw/aesthetics` | Las seis estéticas en código fuente. `/tw/aesthetics/neobrutalism`, `/glass`, `/pixel`, `/chunky-tile`, `/cyber` y `/sketch` publican una cada uno. CSS simple, sin efectos secundarios de tema ni de reset. |
|
|
119
|
+
| `@codenhub/styles/package.json` | El manifiesto del paquete, como JSON. Para herramientas que leen la versión instalada o el mapa de exportaciones; no es una hoja de estilos. |
|
|
120
|
+
|
|
121
|
+
No importes en un mismo build dos puntos de entrada que se solapan, como `@codenhub/styles` y `@codenhub/styles/components`, salvo que el CSS duplicado te resulte aceptable. Elige el punto de entrada más reducido que cubra lo que necesita una página.
|
|
122
|
+
|
|
123
|
+
## HTML sin clases
|
|
124
|
+
|
|
125
|
+
`@codenhub/styles/native` da estilo a elementos HTML simples sin ninguna clase, para contenido al que no puedes añadir clases, como la salida de Markdown o el cuerpo de un CMS. Es la hoja de estilos completa más este mapeo:
|
|
126
|
+
|
|
127
|
+
| Elemento | Con el estilo de |
|
|
128
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
129
|
+
| `h1`, `h2`, `h3`, `h4`, `h5` y `h6` | `.text-title-lg`, `.text-title`, `.text-title-sm`, `.text-label-lg`, `.text-label` |
|
|
130
|
+
| `p`, `li` | `.text-body` |
|
|
131
|
+
| `table` | `.data-table` |
|
|
132
|
+
| `kbd`, `blockquote`, `q`, `code`, `pre` | `.kbd`, `.quote`, `.quote-inline`, `.code`, `.pre` |
|
|
133
|
+
| `hr` | `.divider` |
|
|
134
|
+
| `input` sin tipo, o con tipo `text`, `number`, `email`, `password`, `url`, `tel`, `search`, `month`, `week`, `time`, `date`, `datetime-local` | `.ipt` |
|
|
135
|
+
| `textarea`, `select` | `.textarea`, `.select` |
|
|
136
|
+
| `input type="checkbox"`, `input type="radio"` | `.checkbox`, `.radio` |
|
|
137
|
+
| `button`, `input type="button"`, `type="submit"`, `type="reset"` | `.btn` |
|
|
138
|
+
|
|
139
|
+
```html
|
|
140
|
+
<article>
|
|
141
|
+
<h2>Two-factor authentication</h2>
|
|
142
|
+
<p>Press <kbd>Ctrl</kbd> + <kbd>K</kbd> to open the command menu.</p>
|
|
143
|
+
<label for="code">Verification code</label>
|
|
144
|
+
<input id="code" type="text" inputmode="numeric" />
|
|
145
|
+
<label><input type="checkbox" /> Remember this device</label>
|
|
146
|
+
<button type="submit">Verify</button>
|
|
147
|
+
</article>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Lo que no hace:
|
|
151
|
+
|
|
152
|
+
- **Algunos tipos de input se quedan como están:** `file`, `range`, `color` y `hidden` conservan el aspecto propio del navegador.
|
|
153
|
+
- **Sin switch.** Un checkbox con `role="switch"` se sigue pintando como checkbox; el mapeo no lee roles. A una página que necesita switches le conviene más la hoja de estilos basada en clases.
|
|
154
|
+
- **Los enlaces mantienen el texto que los rodea.** Un enlace dentro de un encabezado conserva el tamaño del encabezado; un enlace nunca recibe estilo de botón.
|
|
155
|
+
- **`pre code` no recibe estilo doble.** El código dentro de un `pre` pierde su propio fondo y su relleno.
|
|
156
|
+
|
|
157
|
+
El mapeo es global: se da estilo a cada elemento de la página que coincida, incluidos los elementos dentro de widgets de terceros. Está en la [capa de cascada](#capas-de-cascada) `base`, así que cualquier clase lo supera. Añade una clase de intención o de presentación a un elemento mapeado, como `<button class="destructive">`, y se aplica igual que en `.btn`.
|
|
158
|
+
|
|
159
|
+
## Capas de cascada
|
|
160
|
+
|
|
161
|
+
Cada punto de entrada pone su CSS en las cuatro capas de cascada de Tailwind y declara su orden antes de usar alguna, así que el resultado no depende de qué archivo se carga primero:
|
|
162
|
+
|
|
163
|
+
| Capa | Contiene |
|
|
164
|
+
| ------------ | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
165
|
+
| `theme` | El tema de Tailwind, los tokens base, los selectores de tema y `/palette`. |
|
|
166
|
+
| `base` | El reset y los estilos de elementos sin clases. |
|
|
167
|
+
| `components` | Las clases de intención, presentación, elevación y estética. |
|
|
168
|
+
| `utilities` | Todos los componentes (`.btn`, `.card`, `.ipt`, etc.), junto a tus propias utilidades de Tailwind. |
|
|
169
|
+
| _sin capa_ | Las sobrescrituras de colores forzados y de movimiento reducido, la corrección para `<dialog>` cerrado y las clases `-solo`. |
|
|
170
|
+
|
|
171
|
+
Lo que eso significa cuando escribes tu propio CSS:
|
|
172
|
+
|
|
173
|
+
- **Tu utilidad o tu CSS sin capa supera a una clase de intención, presentación, elevación o estética** en el mismo elemento. `[--ui-fill:50%]` en un botón `.solid`, `font-serif` en una región `.pixel` o `.my-card { --ui-radius: 0 }` en tu propia hoja de estilos se aplican.
|
|
174
|
+
- **Un componente y tu utilidad comparten la capa `utilities`.** Entre ellos decide la especificidad y después el orden en el código, como entre dos utilidades cualesquiera. Tu CSS sin capa siempre supera a un componente.
|
|
175
|
+
- **El estado supera a tu intención.** Un campo con `aria-invalid="true"` sigue siendo destructivo aunque lleve una utilidad de intención.
|
|
176
|
+
- **Las clases `-solo` no tienen capa a propósito**, para que superen los estilos con capa o de especificidad cero de un componente de terceros. Una regla sin capa más específica, o una igual de específica que se cargue después, sigue superándolas; consulta [Clases solo](./usage/solo.md).
|
|
177
|
+
|
|
178
|
+
## Siguiente paso
|
|
179
|
+
|
|
180
|
+
Con la estructura en la página, continúa con [Construir una pantalla](./concepts.md) para añadir una tarjeta, un encabezado de formulario y un botón Guardar. Si usas uno de los frameworks anteriores y todavía no lo has configurado, hazlo primero.
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Estéticas
|
|
3
|
+
description: Los seis aspectos opcionales, lo que cada uno cambia en un componente, sus controles y sus límites.
|
|
4
|
+
order: 6
|
|
5
|
+
source: 13c01d45553a89f9aeda36d0726b01e7f7879ac9
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Estéticas
|
|
9
|
+
|
|
10
|
+
La pantalla de ajustes tiene tus colores. Una estética cambia de qué están hechos sus componentes: las esquinas, el grosor de los bordes, la sombra y la forma. Pon `.neobrutalism` en el `<main>` de la pantalla de ajustes y cada tarjeta, botón, campo y badge que contiene obtiene esquinas rectas, un contorno grueso en el color de tinta y una sombra dura desplazada, sin perder sus colores. Esta página muestra cómo añadir una y después describe cada una de las seis: qué cambia, el número que puedes ajustar y dónde se comporta de forma distinta al aspecto por defecto.
|
|
11
|
+
|
|
12
|
+
## Añadir una estética
|
|
13
|
+
|
|
14
|
+
Las estéticas vienen en un punto de entrada aparte, así que cárgalo junto a la hoja de estilos:
|
|
15
|
+
|
|
16
|
+
```css
|
|
17
|
+
@import "@codenhub/styles";
|
|
18
|
+
@import "@codenhub/styles/aesthetics";
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
El orden de carga no importa: las clases de estética están en la capa de cascada `components`, y cada punto de entrada declara el orden de las capas antes de usar alguna, así que una estética importada antes de la hoja de estilos base gana exactamente igual que una importada después. Consulta [Configuración inicial → Capas de cascada](../setup.md#capas-de-cascada).
|
|
22
|
+
|
|
23
|
+
Después pon la clase en cualquier elemento. A diferencia de la intención, una estética se hereda: todo lo que hay dentro del elemento la toma.
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<main class="neobrutalism stack">
|
|
27
|
+
<section class="card stack" aria-labelledby="profile-title">…</section>
|
|
28
|
+
<section class="card soft destructive stack" aria-labelledby="danger-title">
|
|
29
|
+
…
|
|
30
|
+
<button class="btn destructive" type="button">Delete account</button>
|
|
31
|
+
</section>
|
|
32
|
+
</main>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
La zona de peligro conserva su rojo: con neobrutalism su contorno y su sombra también son rojos, porque esta estética los dibuja en la propia intención del componente. Para cargar una sola estética en lugar de las seis, impórtala por su nombre, como `@codenhub/styles/aesthetics/neobrutalism`; [Configuración inicial → Todos los puntos de entrada](../setup.md#todos-los-puntos-de-entrada) las enumera.
|
|
36
|
+
|
|
37
|
+
| Clase | Aspecto |
|
|
38
|
+
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
39
|
+
| `.neobrutalism` | Sin radio, un contorno grueso de tinta, una sombra dura desplazada sin desenfoque y una pulsación que mete el elemento en ella. |
|
|
40
|
+
| `.glass` | Superficies translúcidas sobre un fondo desenfocado, con un borde de brillo muy fino. |
|
|
41
|
+
| `.pixel` | Esquinas recortadas en una unidad de la cuadrícula, un contorno grueso dibujado como anillo interior y la `--font-pixel` que aportes tú sobre una monoespaciada. |
|
|
42
|
+
| `.chunky-tile` | Baldosas redondeadas asentadas sobre una barra más oscura de su propio color, con una pulsación que hunde el elemento en su propia barra. |
|
|
43
|
+
| `.cyber` | Esquinas biseladas, un borde fino y brillante, y un resplandor en el propio color del componente. |
|
|
44
|
+
| `.sketch` | Esquinas elípticas variables, una línea de tinta continua con detalles discontinuos, una pequeña sombra desplazada y una fuente manuscrita opcional. |
|
|
45
|
+
|
|
46
|
+
Las estéticas funcionan con todas las combinaciones de relleno y borde. `.ghost.edgeless` quita el relleno y el borde, así que en un componente cuya estética solo se nota a través de ellos y de su sombra, queda poco de la estética; es lo esperado.
|
|
47
|
+
|
|
48
|
+
Una clase de presentación en el elemento sigue ganando a los valores por defecto de la estética. La estética define el grosor del borde; la presentación decide si se dibuja.
|
|
49
|
+
|
|
50
|
+
Una clase de estética en un componente gana a una heredada de un contenedor. Esto incluye las burbujas de tooltip: `.tooltip-bubble.glass` obtiene la burbuja glass completa bajo un ancestro pixel, y `.tooltip-bubble.pixel` obtiene la burbuja escalonada completa bajo un ancestro glass.
|
|
51
|
+
|
|
52
|
+
Tu propio CSS gana a una estética. Las clases de estética están en la capa de cascada `components`, así que una regla de tu propia hoja de estilos sin capa las supera, igual que una utilidad de Tailwind en el mismo elemento, como `font-mono` en una región `.pixel` o `[--ui-radius:0]` en una `.cyber`. Consulta [Configuración inicial → Capas de cascada](../setup.md#capas-de-cascada).
|
|
53
|
+
|
|
54
|
+
La mayoría de las estéticas escalan a partir de un número que puedes definir, como el desplazamiento de la sombra de neobrutalism o el tamaño de un píxel. Son los controles de la estética, y cada sección de abajo nombra los suyos. [Personalización → Tokens de estética](./customizing.md#tokens-de-estética) explica dónde se pueden definir.
|
|
55
|
+
|
|
56
|
+
Para pintar una estética sobre un elemento de otra librería, como un toast o un diálogo, usa su [clase solo](./solo.md).
|
|
57
|
+
|
|
58
|
+
## Neobrutalism
|
|
59
|
+
|
|
60
|
+
La sombra se proyecta en la propia intención del componente, así que un botón success proyecta una sombra verde y una tarjeta destructive una roja. Sin intención, el contorno y la sombra son la tinta: casi negra en una página clara y casi blanca en una oscura. Los campos y los toggles son la excepción. Dibujan el borde de control del tema, como sin estética, porque un checkbox en reposo con contorno casi negro parecería tan llamativo como uno marcado. Lo mismo vale para pixel, cyber y sketch.
|
|
61
|
+
|
|
62
|
+
`--neo-offset` es el control: el desplazamiento de la sombra y la distancia que recorre la pulsación son el mismo número, así que escalar el aspecto escala las dos cosas a la vez.
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<section class="neobrutalism" style="--neo-offset: 6px">
|
|
66
|
+
<button class="btn primary">A deeper shadow</button>
|
|
67
|
+
</section>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Excepciones:**
|
|
71
|
+
|
|
72
|
+
- Los chips de contenido también toman la estética. El borde de una tecla `.kbd` pasa del gris discreto de los bordes a la tinta, y de 1px a 2px, como cualquier otro borde. Un `.code` o un `.pre` no tiene borde por defecto, así que no recibe ninguno; añade `.edged` para darle un borde de tinta.
|
|
73
|
+
- Solo `.btn` y una `.card` que lo active responden al hover y a la pulsación. Una tarjeta lo activa con `.interactive`, o con una de sus dos mitades: `.hoverable` solo para la respuesta al hover, `.pressable` solo para la pulsación; una tarjeta simple, una alerta o un panel es un contenedor y se queda quieto.
|
|
74
|
+
- Una alerta se apoya sobre la sombra desplazada con esta estética, y con ninguna otra. Por lo demás una alerta es plana, pero aquí la sombra es un segundo contorno más que profundidad, y una alerta sin ella parece inacabada junto a todo lo demás. Esto incluye una alerta dentro de una región `.neobrutalism` anidada. `.flat` sigue quitándola y `.floating` sigue duplicándola.
|
|
75
|
+
- El disparador del tooltip toma la esquina cero como todo lo demás y se dibuja cuadrado; `.radio` conserva su círculo.
|
|
76
|
+
|
|
77
|
+
## Glass
|
|
78
|
+
|
|
79
|
+
`.glass` necesita algo detrás que desenfocar. Sobre un fondo de página plano se renderiza como un simple panel translúcido.
|
|
80
|
+
|
|
81
|
+
`--glass-radius` y `--glass-radius-surface` son las esquinas, a `0.75rem` y `1rem`. Glass es más redondeada que la geometría base porque un panel translúcido con una esquina cerrada se percibe como un recorte y no como un cristal.
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<section class="glass" style="--glass-radius-surface: 1.5rem">
|
|
85
|
+
<div class="card">Softer</div>
|
|
86
|
+
</section>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Excepciones:**
|
|
90
|
+
|
|
91
|
+
- Toda superficie en una región glass es de vidrio, incluidas una `.card.soft`, un `.panel` y una `.alert` neutros.
|
|
92
|
+
- El vidrio es el fondo, no el relleno. Una presentación conserva todo su relleno, así que un botón `.solid`, un toggle marcado y una tarjeta o tabla `.solid` son opacos; los cristales esmerilados son los de por defecto, `.soft` y `.ghost`.
|
|
93
|
+
- El desenfoque solo se aplica a `.card`, `.panel`, `.alert`, la burbuja del tooltip y una `.data-table` por defecto o `.soft`. Los controles se quedan sólidos y se apoyan sobre el vidrio: un desenfoque bajo cada control de un grupo denso cuesta una capa compuesta por cada uno y se percibe como ruido. Los controles siguen tomando el radio, el borde y la sombra de la estética.
|
|
94
|
+
- Con `prefers-reduced-transparency: reduce`, las superficies de vidrio pierden el desenfoque y se vuelven opacas.
|
|
95
|
+
- Los botones y una `.card` que lo active se pulsan con el `scale(0.97)` simple; el movimiento reducido lo desactiva.
|
|
96
|
+
- Los controles de texto y los toggles dibujan su línea con la tinta de la página al 55% en lugar del fino borde blanco, que borraría un checkbox sin marcar en una página clara. Es `--ui-control-ink`; defínelo en la región para elegir otro.
|
|
97
|
+
- El marco y las líneas divisorias de una tabla dibujan la tinta de la página al 20%, porque el borde fino desaparece sobre la placa de la tabla. Es `--ui-rule-ink`.
|
|
98
|
+
- Una tabla con un `<caption>` desenfoca detrás del caption además de detrás de sus filas en Chromium y Safari, cuya caja de tabla incluye el caption, y con `.glass-liquid` el borde y el reflejo también enmarcan el caption. Firefox deja el caption fuera del cristal. Donde importe, etiqueta la tabla desde un encabezado exterior con `aria-labelledby`.
|
|
99
|
+
|
|
100
|
+
### Liquid glass
|
|
101
|
+
|
|
102
|
+
`.glass-liquid` es un modificador de glass, inspirado en el Liquid Glass de Apple: esquinas continuas, un borde brillante donde la luz toca el cristal, un desenfoque más ligero, un fondo más claro y una lente que curva lo que hay detrás de una superficie en sus bordes. Ponlo junto a `.glass` en la región, o en una superficie dentro de una región glass.
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<section class="glass glass-liquid">
|
|
106
|
+
<div class="card">A pane that bends the page behind it</div>
|
|
107
|
+
</section>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
La lente la dibuja un filtro SVG en `backdrop-filter`, que Chromium renderiza y Firefox y Safari todavía no. En los demás, el cristal conserva todo menos la lente: el borde brillante, el desenfoque, el fondo y las esquinas, redondeadas en lugar de continuas donde no se dibuja `corner-shape`. No hace falta nada en tu markup: el filtro viene dentro de la hoja de estilos.
|
|
111
|
+
|
|
112
|
+
**Excepciones:**
|
|
113
|
+
|
|
114
|
+
- Llega a `.card`, `.panel`, `.alert`, la burbuja del tooltip y una `.data-table` por defecto o `.soft`. Los controles se quedan sólidos, como con glass, excepto un botón que lo pida: consulta [Botones liquid](#botones-liquid).
|
|
115
|
+
- Dibuja su desenfoque y su lente en el `::before` y el `::after` de cada superficie, así que una superficie dentro de una región liquid no puede llevar un `::before` o `::after` propio. Cada superficie se convierte también en un contexto de apilamiento posicionado; una superficie que posiciones tú conserva tu colocación.
|
|
116
|
+
- Todo lo demás que se esmerila con glass conserva el desenfoque ligero y el fondo más claro de liquid, sin la lente ni el borde brillante: una `<table>` sin clase con `/native`, o un componente propio construido con `@apply surface`.
|
|
117
|
+
- La lente es una erosión de 8px desenfocada sobre 10px en cada superficie, y de 3px desenfocada sobre 3.5px en un botón; su intensidad es fija. Un filtro no puede leer una custom property, así que ninguno de los dos es un control. Las esquinas sí lo son, mediante `--glass-radius` y `--glass-radius-surface`, con valores por defecto mayores: una esquina continua parece más pequeña que una redondeada del mismo radio.
|
|
118
|
+
- Una región de otra estética anidada dentro de una región liquid, o de `.glass` simple, conserva su propio material y no toma capas.
|
|
119
|
+
- Sin `.glass` en el ámbito, solo cambia las esquinas.
|
|
120
|
+
- Con `prefers-reduced-transparency: reduce` desaparecen el desenfoque y la lente y la superficie es opaca, como con glass. Con colores forzados, las capas no dibujan nada.
|
|
121
|
+
- El texto queda sobre un cristal más claro que con glass. Sobre contenido recargado, comprueba que tu texto se sigue leyendo: el fondo es el 30% del color de la página, frente al 45% de glass.
|
|
122
|
+
|
|
123
|
+
#### Botones liquid
|
|
124
|
+
|
|
125
|
+
Un botón es un cristal liquid cuando él mismo lleva `.glass-liquid`, dentro de una región glass. El modificador solo en la región deja todos los botones sólidos: un desenfoque y una lente bajo cada control de una barra de herramientas densa cuestan dos capas compuestas por cada uno y se perciben como ruido, así que el único botón que debe ser de vidrio lo indica.
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<section class="glass glass-liquid">
|
|
129
|
+
<button class="btn primary">Solid, like every control</button>
|
|
130
|
+
<button class="btn ghost glass-liquid">A clear pane</button>
|
|
131
|
+
<button class="btn soft success glass-liquid">A tinted pane</button>
|
|
132
|
+
</section>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- El relleno sigue siendo cosa de la [presentación](./composing.md#presentación). `.ghost` es el cristal transparente y `.soft` el tintado; un botón `.solid` conserva su placa opaca y toma encima el borde brillante y el reflejo. La intención, el tamaño, `.pill`, `.icon`, el hover y la pulsación funcionan como en cualquier botón.
|
|
136
|
+
- También funciona en una región `.glass` simple, y en un botón dentro de una tarjeta liquid.
|
|
137
|
+
- Usa el `::before` y el `::after` del botón, así que un botón liquid no puede llevar uno propio.
|
|
138
|
+
- Un botón liquid deshabilitado conserva el fondo y el borde brillante y pierde el desenfoque y la lente: se atenúa con `opacity`, lo que separa sus capas de la página que tiene detrás.
|
|
139
|
+
- El texto queda sobre lo que haya detrás del botón. Sobre contenido recargado, comprueba que se sigue leyendo, o usa `.solid`.
|
|
140
|
+
- Llega a `.btn`, y a un `<button>` sin clase solo a través de su clase `.btn`: las capas son una lista de clases, a la que no se une el mapeo de elementos de `/native`.
|
|
141
|
+
|
|
142
|
+
## Pixel
|
|
143
|
+
|
|
144
|
+
`--pixel-unit` es un píxel de la cuadrícula imaginaria de baja resolución, `4px` por defecto. Se recorta una unidad cuadrada de cada esquina y el contorno tiene una unidad de grosor, así que el recorte y lo que lo cubre tienen el mismo tamaño.
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<section class="pixel" style="--pixel-unit: 6px">
|
|
148
|
+
<button class="btn primary">Chunkier</button>
|
|
149
|
+
</section>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Excepciones:**
|
|
153
|
+
|
|
154
|
+
- Las esquinas son una unidad o nada. Los chips pequeños son cuadrados en lugar de escalonados: badges, teclas, código en línea, checkboxes y switches. Una unidad menos en cada esquina de un badge de 24px parecería un mordisco, no una esquina.
|
|
155
|
+
- Las tablas, las barras de progreso y los skeletons también son cuadrados. Una tabla no recibe recorte porque en Chromium y WebKit su caja incluye el caption, y el recorte caería en el caption en lugar de en las filas. Las barras de progreso y los skeletons solo toman la esquina cuadrada.
|
|
156
|
+
- Un bloque de código `.pre` es escalonado como una tarjeta. No tiene borde por defecto, así que el recorte se ve sin contorno alrededor.
|
|
157
|
+
- El contorno es un anillo interior, porque un recorte elimina un borde real; por el mismo motivo, el anillo de foco es una segunda capa interior en lugar de un outline. Los dos son el propio borde del elemento y no una sombra, así que el borde responde a `.edged` y `.edgeless` como lo hace un borde: un badge `.edgeless` y un botón `.solid` no dibujan ninguno, una tarjeta `.edged` dibuja uno, y un campo conserva el suyo pida lo que pida un contenedor.
|
|
158
|
+
- El anillo de foco interior lleva dentro una línea de 2px del color de la página. El anillo es del color principal, así que en un botón `.solid.primary` se dibujaría sobre su propio color; la línea es lo que se ve ahí.
|
|
159
|
+
- Con colores forzados desaparecen tanto el anillo como el recorte, porque el sistema elimina todas las sombras de caja: los componentes dibujan un borde real de 2px y esquinas rectas, y `.pixel-solo` un outline hacia dentro.
|
|
160
|
+
- `.radio` y `.tooltip-icon` nunca son escalonados. El círculo es lo que distingue a simple vista un radio de un checkbox, así que un radio sigue siendo redondo. Un disparador de tooltip escalonado de 20px parecería mordido, así que es un cuadrado simple.
|
|
161
|
+
- La `--font-pixel` la aportas tú. El paquete no incluye ningún archivo de fuente, así que la estética no tiene efectos secundarios de red y recurre a la pila monoespaciada.
|
|
162
|
+
- Que los dígitos sean fáciles de leer depende de la fuente que elijas. En tamaños pequeños, como números de página, contadores y badges, algunas fuentes pixeladas dibujan el `2` y el `8`, o el `3` y el `9`, tan parecidos que se confunden. El CSS no puede arreglarlo. Donde importen los números pequeños, elige una fuente con dígitos claramente distintos.
|
|
163
|
+
|
|
164
|
+
## Chunky tile
|
|
165
|
+
|
|
166
|
+
Baldosas redondeadas asentadas sobre una barra más oscura de su propio color, que se aplanan al hacer clic. Es el aspecto que usan las aplicaciones móviles de aprendizaje y los juegos; su nombre describe de qué está hecho y no un producto concreto.
|
|
167
|
+
|
|
168
|
+
`--tile-lift` es la profundidad de la barra y la distancia que recorre una pulsación, `4px` por defecto. Un solo número controla las dos cosas, así que el borde superior baja exactamente la profundidad de la barra y el borde inferior no se mueve. `--tile-radius` es la esquina, `0.75rem`, y es un único valor y no un par control/superficie a propósito: la esquina compartida es lo que hace que un botón y la tarjeta en la que está se perciban como el mismo objeto.
|
|
169
|
+
|
|
170
|
+
```html
|
|
171
|
+
<section class="chunky-tile" style="--tile-lift: 6px; --tile-radius: 0.5rem">
|
|
172
|
+
<button class="btn success">Continue</button>
|
|
173
|
+
</section>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
La barra es un tono más oscuro del propio color del elemento y no una sombra debajo, así que sigue a cada intención: un botón success se apoya sobre un canto verde oscuro, uno destructive sobre un canto rojo oscuro, y una tarjeta simple sobre un canto gris que coincide con la línea que ya dibuja. Medido en la paleta clara, `.btn.success` es `#007a55` sobre `#004c34`. En una página oscura, una superficie casi negra no puede oscurecerse más, así que su barra queda más clara y se percibe como un reborde.
|
|
177
|
+
|
|
178
|
+
**Excepciones:**
|
|
179
|
+
|
|
180
|
+
- Solo se apoya sobre una barra lo que el registro deja en reposo por encima de cero: botones y tarjetas. Un badge, un chip, un campo o un tooltip es plano hasta que pide profundidad con `.raised`, y `.flat` quita la barra a cualquier cosa:
|
|
181
|
+
|
|
182
|
+
```html
|
|
183
|
+
<div class="card soft edgeless info flat">Promo panel, deliberately flat</div>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
- La `--font-rounded` la aportas tú. Una grotesca redondeada y gruesa es buena parte de este aspecto y el paquete no incluye ningún archivo de fuente, así que, si no aportas nada, se usa la pila propia de la página.
|
|
187
|
+
- Las etiquetas se dibujan más gruesas y con algo más de espaciado entre letras, mediante `--ui-label-weight` y `--ui-label-tracking`, así que tu propia utilidad `font-*` o `tracking-*` sigue ganando. Llega a `.btn` y `.badge`, y a un `<button>` sin clase solo donde `/native` le da estilo. Las mayúsculas no se tocan: cómo se redacta una etiqueta es decisión de la aplicación, así que si quieres botones en mayúsculas, escribe esa regla en tu propia hoja de estilos.
|
|
188
|
+
- `.card.interactive` se pulsa como un `.btn`, así que una baldosa de respuesta chunky cae sobre su barra al hacer clic; `.card.pressable` obtiene la misma pulsación por sí sola. Una `.card` simple se queda quieta.
|
|
189
|
+
- El `.primary` incluido es casi negro en una página clara y casi blanco en una oscura, y la barra siempre se mezcla hacia el negro. En una página clara, la barra de un botón primario es casi invisible frente a su cara casi negra (medido `1.04:1`). En una página oscura, la cara casi blanca frente a la misma barra se distingue bien (`2.48:1`). Dale a `.primary` un matiz propio si es la llamada a la acción y necesita la señal de profundidad en los dos temas.
|
|
190
|
+
- En esta estética la profundidad es la barra, nunca una sombra desenfocada. Todo lo que el registro deja plano queda a ras de la página.
|
|
191
|
+
- Los controles dibujan un gris más intenso que las baldosas que los rodean, `neutral-600` en claro y `neutral-400` en oscuro, mediante `--ui-control-ink`, para que un campo se lea como campo dentro de una baldosa.
|
|
192
|
+
|
|
193
|
+
## Cyber
|
|
194
|
+
|
|
195
|
+
Esquinas biseladas, un borde de 1px y un resplandor en el propio color del componente: un botón success brilla en verde, una tarjeta destructive en rojo. El bisel se dibuja con `corner-shape`, así que el borde, el resplandor y el contorno de foco siguen el corte en lugar de quedar recortados por él.
|
|
196
|
+
|
|
197
|
+
Los controles y las superficies toman el corte en diagonales opuestas, así que un botón y la tarjeta que lo rodea se perciben como el mismo material y como cosas distintas: los botones y los campos se cortan arriba a la izquierda y abajo a la derecha; las tarjetas, los paneles y las alertas, arriba a la derecha y abajo a la izquierda. Todo lo que es completamente redondo se corta en puntas: un radio, la perilla de un switch y el icono del tooltip se convierten en rombos, y un botón pill o un badge se convierte en un hexágono con puntas. Los chips pasan a ser cuadrados, así que el checkbox se lee como un cuadrado simple junto al radio en rombo.
|
|
198
|
+
|
|
199
|
+
`--cyber-cut` es el corte en el tamaño por defecto, `0.625rem`. Los controles lo escalan con su escalón de tamaño, así que un botón de icono `.p-xs` toma la mitad y conserva sus esquinas, y el corte sigue siendo de 45 grados exactos. `--cyber-shape` y `--cyber-shape-surface` reemplazan la colocación por defecto con cualquier valor de `border-radius`, usado tal cual. `--cyber-glow` es el desenfoque del resplandor, `8px`. `--cyber-ink` es el color neutro de la línea y del resplandor. Por defecto sigue al tema, casi negro en una página clara y casi blanco en una oscura; defínelo para un neutro neón.
|
|
200
|
+
|
|
201
|
+
```html
|
|
202
|
+
<section class="cyber" style="--cyber-ink: rgb(0 229 255); --cyber-cut: 0.75rem">
|
|
203
|
+
<button class="btn">Open terminal</button>
|
|
204
|
+
</section>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Otras formas están a un valor de distancia. Defínelas en el elemento `.cyber` o en cualquier ancestro. `--ui-radius` definido en un elemento llega a ese elemento y a cada componente de dentro que no defina el suyo. Una forma que definas se usa tal cual y no escala, así que para una forma escalada en un único control usa en su lugar `.cut-diagonal-reverse`.
|
|
208
|
+
|
|
209
|
+
| Forma | Valor |
|
|
210
|
+
| ------------------------------- | --------------------- |
|
|
211
|
+
| Las cuatro esquinas | `0.625rem` |
|
|
212
|
+
| La otra diagonal | `0 0.625rem` |
|
|
213
|
+
| Hexágono (extremos en punta) | `0.625rem / 50%` |
|
|
214
|
+
| Paralelogramo | `0.625rem 0 / 100% 0` |
|
|
215
|
+
| Una muesca, arriba a la derecha | `0 0.625rem 0 0` |
|
|
216
|
+
|
|
217
|
+
```html
|
|
218
|
+
<section class="cyber" style="--cyber-shape: 0.625rem / 50%">
|
|
219
|
+
<button class="btn primary">Hexagonal buttons</button>
|
|
220
|
+
</section>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Un paralelogramo inclina sus lados hacia el contenido, así que dale relleno horizontal adicional a una superficie que lo use.
|
|
224
|
+
|
|
225
|
+
**Excepciones:**
|
|
226
|
+
|
|
227
|
+
- Hoy el bisel solo funciona en Chromium. Firefox y Safari todavía no dibujan `corner-shape`, y ahí la estética deja rectas sus esquinas cortadas en lugar de redondearlas, y lo que es completamente redondo sigue siendo redondo, así que el aspecto se degrada a cuadrado, con línea y con resplandor. Tomará el bisel sin ningún cambio en cuanto un motor lo incluya.
|
|
228
|
+
- El resplandor es un halo, no profundidad, así que todos los componentes lo toman, incluidos campos, badges y alertas, y `.flat` no lo quita. `.raised` y `.floating` no añaden sombra con esta estética.
|
|
229
|
+
- En el tema claro, el resplandor de un componente neutro o `.primary` es su tinta casi negra, que se percibe como una sombra suave y no como luz. El aspecto luce más en una página oscura, o con un `--cyber-ink` con matiz.
|
|
230
|
+
- Un `.btn.icon` simple es un control cuadrado, así que toma la diagonal de control; un `.btn.icon.pill` es redondo, así que se convierte en un rombo.
|
|
231
|
+
- La `--font-cyber` la aportas tú. El paquete no incluye ningún archivo de fuente, así que la estética recurre a la pila monoespaciada.
|
|
232
|
+
- Las mayúsculas no se tocan, por el motivo que da [Chunky tile](#chunky-tile).
|
|
233
|
+
|
|
234
|
+
## Sketch
|
|
235
|
+
|
|
236
|
+
Contornos dibujados a mano: los controles toman esquinas elípticas largas e irregulares, y las tarjetas, los paneles, las alertas y las tablas toman otras más marcadas que no invaden su relleno. Los elementos hermanos van rotando entre cuatro contornos según su posición, y el control de un campo toma la posición de su campo, así que una fila de botones o un formulario apilado no repite una misma forma. La rotación es estable para un orden del DOM dado, no aleatoria en cada renderizado. Cada contorno es un `border-radius` completo, usado tal cual en lugar de escalado por el escalón de tamaño o colocado por `.cut-diagonal`.
|
|
237
|
+
|
|
238
|
+
La línea de tinta de 1px es continua; los checkboxes, los divisores y las líneas divisorias de las tablas son discontinuos. `--ui-line-style: dashed` hace discontinuo cualquier otro componente, y `--ui-rule-style: solid` devuelve un divisor o una tabla a continuo. La sombra dura de 2px es una pequeña señal neutra de profundidad.
|
|
239
|
+
|
|
240
|
+
`--sketch-radius`, `--sketch-radius-surface` y `--sketch-radius-pill` reemplazan los contornos de control, de superficie y de botón pill. Define uno y todas las posiciones toman ese único contorno. Para dar forma a un solo componente, define en él `--ui-radius` (`--ui-radius-surface` en una superficie).
|
|
241
|
+
|
|
242
|
+
```html
|
|
243
|
+
<section class="sketch" style='--font-sketch: "Comic Sans MS", cursive'>
|
|
244
|
+
<button class="btn primary">Send note</button>
|
|
245
|
+
<button class="btn ghost edged" style="--ui-line-style: dashed">Draft note</button>
|
|
246
|
+
</section>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
El botón discontinuo es `ghost edged` porque un botón relleno no tiene una línea separada que hacer discontinua.
|
|
250
|
+
|
|
251
|
+
`.sketch-rounded` cambia las esquinas largas por otras cortas y redondeadas, acotadas para que un elemento ancho conserve rectos sus bordes superior e inferior. Ponlo junto a `.sketch` en la región, o en un componente dentro de ella. `--sketch-radius-rounded` y `--sketch-radius-surface-rounded` son sus controles.
|
|
252
|
+
|
|
253
|
+
```html
|
|
254
|
+
<section class="sketch sketch-rounded">
|
|
255
|
+
<div class="card">
|
|
256
|
+
<button class="btn primary">Rounded action</button>
|
|
257
|
+
</div>
|
|
258
|
+
</section>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Excepciones:**
|
|
262
|
+
|
|
263
|
+
- Sketch nombra los componentes para rotar sus contornos, así que sus contornos solo llegan a los componentes de este paquete; una región de otra estética anidada dentro de una región sketch conserva las esquinas de esa estética.
|
|
264
|
+
- Los chips, como checkboxes, teclas, código, badges, switches y barras de progreso, rotan entre pequeños contornos irregulares definidos en `--ui-radius-tight`. Define ese token en un chip para elegir su forma.
|
|
265
|
+
- Un `.btn.pill` toma una píldora redondeada acotada a su propia altura, para que uno ancho no se convierta en un óvalo. Los badges, las barras de progreso y los switches toman su contorno de chip. Los radios y el icono del tooltip siguen siendo círculos, ligeramente irregulares, para que un radio nunca se confunda con un checkbox. Un `--ui-radius-pill` explícito en un elemento sigue ganando.
|
|
266
|
+
- La `--font-sketch` la aportas tú. El paquete no incluye ninguna fuente manuscrita y recurre a la familia `cursive` de la plataforma.
|
|
267
|
+
- Los botones se pulsan con el `scale(0.97)` simple; el movimiento reducido lo desactiva.
|
|
268
|
+
- El modo de colores forzados dibuja continuos los detalles discontinuos, como cualquier otra línea del material.
|
|
269
|
+
|
|
270
|
+
## Clases solo
|
|
271
|
+
|
|
272
|
+
Una clase de estética no cambia nada en un elemento al que este paquete no da estilo, como un toast de otra librería. Cada estética incluye también una clase solo, como `.glass-solo`, que pinta su aspecto sobre ese único elemento. [Clases solo](./solo.md) las explica.
|
|
273
|
+
|
|
274
|
+
## Siguiente paso
|
|
275
|
+
|
|
276
|
+
[Clases solo](./solo.md) aplica estos aspectos a componentes de otras librerías. Si todos los componentes de tu pantalla vienen de este paquete, las guías terminan aquí: [Composición](./composing.md), [Personalización](./customizing.md) y [Contenido y layout](./content-and-layout.md) son las páginas de consulta, y [Accesibilidad](../accessibility.md) enumera lo que tu aplicación todavía les debe a sus usuarios.
|