@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,256 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Formularios
|
|
3
|
+
description: Campos con etiqueta, pistas y errores, iconos y prefijos fijos, selects y toggles de checkbox, radio y switch.
|
|
4
|
+
order: 2
|
|
5
|
+
source: 00e6a57cfd62f524fde5a550af721786edd7a5dd
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Formularios
|
|
9
|
+
|
|
10
|
+
La tarjeta de perfil tiene un botón Guardar pero nada que guardar. Esta página la completa: un nombre visible con una pista, una dirección de email que muestra un error de validación, una dirección de perfil con un prefijo fijo, un select de idioma y los toggles de notificaciones, facturación y visibilidad del perfil. El paquete da estilo a cada control; tu HTML aporta las etiquetas, la validación y los mensajes de error, y esta página muestra cómo conectarlos.
|
|
11
|
+
|
|
12
|
+
## Un campo con etiqueta
|
|
13
|
+
|
|
14
|
+
Un campo es una etiqueta, un control y una pista opcional, apilados:
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<div class="field">
|
|
18
|
+
<label class="label" for="display-name">Display name</label>
|
|
19
|
+
<input class="ipt" id="display-name" name="display-name" aria-describedby="display-name-hint" />
|
|
20
|
+
<span class="hint" id="display-name-hint">Shown on invoices and shared projects.</span>
|
|
21
|
+
</div>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `.field` apila sus hijos con una separación pequeña (0.35rem) y ocupa todo el ancho.
|
|
25
|
+
- `.label` define el texto de la etiqueta: 1rem, peso medio.
|
|
26
|
+
- `.hint` es un texto de ayuda más pequeño y en color secundario. Mantenlo fuera del `<label>` y apunta `aria-describedby` a él, para que un lector de pantalla lo anuncie como descripción en lugar de leerlo como parte del nombre del campo.
|
|
27
|
+
- `.ipt` da estilo a un `<input>`. Usa `.textarea` para un `<textarea>` y `.select` para un `<select>`.
|
|
28
|
+
|
|
29
|
+
Un control de texto mide al menos 2.5rem de alto (`--control-height`), la misma altura que un botón por defecto, así que un campo y un botón quedan alineados en una fila. Su aspecto por defecto es sin relleno y con borde. Un `.textarea` mide al menos 7rem de alto y se puede redimensionar en vertical.
|
|
30
|
+
|
|
31
|
+
### Tamaños
|
|
32
|
+
|
|
33
|
+
`.ipt`, `.select`, `.textarea` e `.input-group` aceptan las clases de tamaño del botón, así que un campo pequeño y un botón pequeño quedan alineados en una fila:
|
|
34
|
+
|
|
35
|
+
| Clase | Altura | Relleno lateral | Texto |
|
|
36
|
+
| ----------- | ------ | --------------- | --------- |
|
|
37
|
+
| `.sm` | 2rem | 0.625rem | 0.875rem |
|
|
38
|
+
| por defecto | 2.5rem | 0.75rem | heredado |
|
|
39
|
+
| `.lg` | 3rem | 1rem | 1.0625rem |
|
|
40
|
+
|
|
41
|
+
Las esquinas escalan con el tamaño, como las de un botón. Un `.textarea` conserva su altura mínima de 7rem en todos los tamaños; la clase cambia su texto, su relleno y sus esquinas. Define el tamaño de un `.input-group` en el grupo, no en el control de dentro: el control y sus adornos toman el tamaño de texto del grupo.
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<div class="cluster tight">
|
|
45
|
+
<input class="ipt sm" aria-label="Coupon code" />
|
|
46
|
+
<button class="btn sm" type="button">Apply</button>
|
|
47
|
+
</div>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Mostrar un error de validación
|
|
51
|
+
|
|
52
|
+
Marca el control como inválido con `aria-invalid="true"` y dale al mensaje de error `.hint.destructive`:
|
|
53
|
+
|
|
54
|
+
```html
|
|
55
|
+
<div class="field">
|
|
56
|
+
<label class="label" for="email">Email</label>
|
|
57
|
+
<input class="ipt" type="email" id="email" name="email" value="ada@" aria-invalid="true" aria-describedby="email-error" />
|
|
58
|
+
<span class="hint destructive" id="email-error">Enter a full email address, such as ada@example.com.</span>
|
|
59
|
+
</div>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Un control inválido dibuja su borde, su anillo de foco y el texto escrito en el color destructivo, tenga la clase de intención que tenga. El texto usa el tono legible de ese color, `--intent-strong`, para que siga siendo legible sobre la página. El paquete solo pinta el estado: decidir que el valor es inválido, poner y quitar `aria-invalid` y escribir el mensaje es cosa de tu código. Quita `aria-invalid` en cuanto el valor vuelva a ser válido; si lo dejas puesto, el campo sigue en rojo. En un checkbox, un radio o un switch, `aria-invalid="true"` dibuja el toggle exactamente igual que `.destructive`, marca de activado incluida.
|
|
63
|
+
|
|
64
|
+
Un `.hint` acepta cualquiera de las seis intenciones incorporadas, no solo `.destructive`: `.hint.success` confirma que se aceptó un valor, y `.hint.warning` señala uno que está permitido pero es inusual. Cada uno se muestra en el tono legible de su intención, `--intent-strong`, que mantiene 4.5:1 frente a la página en los dos temas. Un `.hint` sin intención, con `.neutral` o con una [intención que definiste tú](./theming.md#tu-propia-intención), se queda en el color secundario. Solo lo colorea una clase en el propio `.hint`; una intención en el campo o en un contenedor que lo rodee no lo hace.
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<input class="ipt success" id="username" value="ada" aria-describedby="username-hint" /> <span class="hint success" id="username-hint">That username is available.</span>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Montar el formulario de perfil
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<form class="card stack" aria-labelledby="profile-title">
|
|
74
|
+
<h2 class="text-title-sm" id="profile-title">Profile</h2>
|
|
75
|
+
|
|
76
|
+
<div class="field">
|
|
77
|
+
<label class="label" for="display-name">Display name</label>
|
|
78
|
+
<input class="ipt" id="display-name" name="display-name" value="Ada Lovelace" aria-describedby="display-name-hint" />
|
|
79
|
+
<span class="hint" id="display-name-hint">Shown on invoices and shared projects.</span>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div class="field">
|
|
83
|
+
<label class="label" for="email">Email</label>
|
|
84
|
+
<input class="ipt" type="email" id="email" name="email" value="ada@example.com" />
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div class="field">
|
|
88
|
+
<label class="label" for="bio">Bio</label>
|
|
89
|
+
<textarea class="textarea" id="bio" name="bio" rows="3"></textarea>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div class="field">
|
|
93
|
+
<label class="label" for="language">Language</label>
|
|
94
|
+
<select class="select" id="language" name="language">
|
|
95
|
+
<option>English</option>
|
|
96
|
+
<option>Português</option>
|
|
97
|
+
<option>Español</option>
|
|
98
|
+
</select>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<div class="cluster">
|
|
102
|
+
<button class="btn primary" type="submit">Save changes</button>
|
|
103
|
+
<button class="btn ghost" type="reset">Cancel</button>
|
|
104
|
+
</div>
|
|
105
|
+
</form>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Un `.select` dibuja su propia flecha. Con `multiple` o con un `size` mayor que 1 se convierte en un cuadro de lista: sin flecha y tan alto como las filas que muestra. La lista de opciones abierta la dibujan el navegador y el sistema operativo, así que no toma el aspecto del paquete.
|
|
109
|
+
|
|
110
|
+
## Añadir un icono o un prefijo fijo
|
|
111
|
+
|
|
112
|
+
`.input-group` pone un icono o un fragmento de texto dentro del borde de un campo. El grupo dibuja el borde, el fondo, el anillo de foco y los estados inválido y deshabilitado; el control de dentro renuncia a los suyos, así que el borde se dibuja una sola vez. Coloca el adorno antes del control para ponerlo al principio, o después para ponerlo al final. Un grupo mide lo mismo que un campo solo, así que queda alineado con los campos y los botones que tiene al lado.
|
|
113
|
+
|
|
114
|
+
La dirección del perfil siempre empieza con el mismo host, así que es un prefijo fijo:
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<div class="field">
|
|
118
|
+
<label class="label" for="profile-url">Profile address</label>
|
|
119
|
+
<div class="input-group" style="--input-group-gap: 0">
|
|
120
|
+
<span>app.example.com/u/</span>
|
|
121
|
+
<input class="ipt" id="profile-url" name="profile-url" value="ada" />
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
La separación entre el control y su adorno es `--input-group-gap`, 0.5rem por defecto. Eso le va bien a un icono, pero un texto que debe leerse como parte del valor parece roto con un espacio detrás, así que el ejemplo la pone a `0`. Defínela en el propio `.input-group`: el grupo declara su propio valor por defecto, así que un valor definido en un elemento padre no tiene efecto. Es una de las seis [variables públicas de componente](./customizing.md#variables-de-componente).
|
|
127
|
+
|
|
128
|
+
Una búsqueda de miembros, con un icono al principio (las clases `ic-lucide-*` necesitan `@codenhub/icons` cargado; consulta [Botones → Cargar los iconos](./buttons.md#cargar-los-iconos)):
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<div class="field">
|
|
132
|
+
<label class="label" for="member-search">Find a member</label>
|
|
133
|
+
<div class="input-group">
|
|
134
|
+
<i class="ic-lucide-search" aria-hidden="true"></i>
|
|
135
|
+
<input class="ipt" type="search" id="member-search" name="q" />
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Un `.select` también funciona en un grupo. El grupo quita el relleno lateral del control, excepto al final de un select de una sola fila, que conserva 1.75rem para que el texto de la opción elegida no quede bajo la flecha.
|
|
141
|
+
|
|
142
|
+
Cualquier elemento sirve como adorno: una clase de icono, un `<svg>` en línea, un `<img>` o texto. El paquete no incluye iconos para los campos, porque una imagen incorporada no podría seguir tu color de texto, tu tema ni tu estética.
|
|
143
|
+
|
|
144
|
+
El grupo lee la intención y la presentación igual que un `.ipt` solo: `.input-group.primary` colorea el borde y el texto escrito, y `.input-group.soft.edgeless` es un campo hundido en la página. Pon la intención en el grupo, no en el control de dentro: el grupo dibuja el campo, así que el texto del control toma la intención del grupo y una clase de intención en el control no tiene efecto. `aria-invalid="true"` o `disabled` en el control de dentro se aplica a todo el grupo, y lo mismo si cualquiera de los dos está en el propio grupo. El anillo de foco del grupo aparece cuando su campo tiene el foco, así que, a diferencia de un campo solo, también se muestra después de un clic con el ratón. Un botón dentro del grupo, como un botón para borrar, dibuja su propio anillo cuando tiene el foco, y el grupo no dibuja ninguno: un solo anillo marca siempre el único control que tiene el foco.
|
|
145
|
+
|
|
146
|
+
## Decoraciones del navegador
|
|
147
|
+
|
|
148
|
+
Algunos tipos de input traen botones integrados: el botón del selector de un campo de fecha u hora, las flechas arriba y abajo de un campo numérico y el botón de borrar de un campo de búsqueda. El paquete los conserva, porque cada uno también hace algo: el botón del selector es la única forma de abrir el selector con el ratón, y el botón de borrar vacía el campo.
|
|
149
|
+
|
|
150
|
+
`.unadorned` los quita, para un campo en el que dibujas los tuyos. Ponlo en el control o en su `.input-group`. Quitar una decoración quita lo que hacía, así que conecta tú mismo su reemplazo: `input.showPicker()` abre un selector, `stepUp()` y `stepDown()` sustituyen a las flechas, y poner `value` a `""` y lanzar un evento `input` sustituye a un botón de borrar. Escribir sigue funcionando en cualquier caso. Firefox no ofrece ninguna forma de quitar el botón de su selector de fecha, así que se queda.
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<div class="field">
|
|
154
|
+
<label class="label" for="member-filter">Find a member</label>
|
|
155
|
+
<div class="input-group unadorned">
|
|
156
|
+
<i class="ic-lucide-search" aria-hidden="true"></i>
|
|
157
|
+
<input class="ipt" type="search" id="member-filter" name="q" />
|
|
158
|
+
<button class="btn icon ghost p-xs" type="button" aria-label="Clear search">
|
|
159
|
+
<i class="ic-lucide-x" aria-hidden="true"></i>
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
El botón de borrar de arriba es un `<button>` real con un nombre accesible. Un botón dentro de un grupo conserva sus propias clases: un `.btn.ghost` no tiene relleno y, como cualquier botón por defecto, tampoco borde, así que queda dentro del borde del campo sin dibujar uno propio.
|
|
166
|
+
|
|
167
|
+
## Toggles
|
|
168
|
+
|
|
169
|
+
La pantalla de ajustes tiene tres tipos de toggle: un checkbox para activar los emails de facturas, botones de radio para elegir un periodo de facturación y un switch para hacer público el perfil. Cada clase va en un `<input>` nativo del tipo correspondiente:
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<fieldset class="stack tight">
|
|
173
|
+
<legend class="label">Notifications</legend>
|
|
174
|
+
<label class="cluster tight">
|
|
175
|
+
<input class="checkbox" type="checkbox" name="invoice-email" checked />
|
|
176
|
+
Email me when an invoice is ready
|
|
177
|
+
</label>
|
|
178
|
+
</fieldset>
|
|
179
|
+
|
|
180
|
+
<fieldset class="stack tight">
|
|
181
|
+
<legend class="label">Billing period</legend>
|
|
182
|
+
<label class="cluster tight">
|
|
183
|
+
<input class="radio" type="radio" name="period" value="monthly" />
|
|
184
|
+
Monthly
|
|
185
|
+
</label>
|
|
186
|
+
<label class="cluster tight">
|
|
187
|
+
<input class="radio" type="radio" name="period" value="yearly" checked />
|
|
188
|
+
Yearly, two months free
|
|
189
|
+
</label>
|
|
190
|
+
</fieldset>
|
|
191
|
+
|
|
192
|
+
<label class="cluster tight">
|
|
193
|
+
<input class="switch primary" type="checkbox" role="switch" name="public-profile" />
|
|
194
|
+
Public profile
|
|
195
|
+
</label>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- `.checkbox` va en `type="checkbox"`, `.radio` en `type="radio"` y `.switch` en `type="checkbox"`. Dale tú mismo `role="switch"` a un switch, para que se anuncie como activado o desactivado en lugar de marcado.
|
|
199
|
+
- `.cluster.tight` en el `<label>` alinea el control con su texto y deja una separación de 0.5rem.
|
|
200
|
+
- Un checkbox con la propiedad `indeterminate` activada, para un grupo en el que solo algunos elementos están marcados, muestra un guion, y lo mantiene aunque también esté `checked`, como hace el checkbox propio del navegador. Actívala desde un script (`input.indeterminate = true`); no hay atributo para ello.
|
|
201
|
+
|
|
202
|
+
### Colores marcado y sin marcar
|
|
203
|
+
|
|
204
|
+
Una clase de intención define el color de marcado. Sin intención, un toggle marcado se rellena con el color del texto y la marca se dibuja en el color de la página: una casilla negra con un tick blanco en una página clara. A diferencia de un botón neutro, un toggle neutro se rellena por completo cuando está marcado.
|
|
205
|
+
|
|
206
|
+
La presentación solo cambia el aspecto sin marcar. Todos los toggles reposan en `.soft`; una vez marcados, cada uno tiene un único aspecto sea cual sea su presentación:
|
|
207
|
+
|
|
208
|
+
| Toggle | Relleno sin marcar | Marcado |
|
|
209
|
+
| -------------------- | ------------------ | ------------------------------------------------------- |
|
|
210
|
+
| `.ghost` | 0% | Relleno del 100%, con la marca en el color de contraste |
|
|
211
|
+
| `.soft`, por defecto | 12% | Relleno del 100%, con la marca en el color de contraste |
|
|
212
|
+
| `.solid` | 40% | Relleno del 100%, con la marca en el color de contraste |
|
|
213
|
+
|
|
214
|
+
Un checkbox marcado y un switch marcado recortan su marca sobre la placa rellena. Un radio marcado engrosa su anillo hasta el doble del grosor de línea en reposo, con un máximo de 3px, toma en él el color completo de la intención y muestra un punto. El límite de 3px evita que el anillo se trague el punto bajo una estética de línea gruesa.
|
|
215
|
+
|
|
216
|
+
`.checkbox` y `.radio` siempre dibujan su borde, incluso con `.edgeless`, porque el borde es lo único que muestra una casilla sin marcar. `.switch.ghost` también conserva su borde, ya que sin relleno y sin borde nada marcaría el carril. Estos casos aparecen en [Composición](./composing.md#referencia-de-ejes-por-componente).
|
|
217
|
+
|
|
218
|
+
Una estética que dibuja su borde como sombra interior, como `.pixel`, no puede hacer esa sombra más ancha que el grosor del borde del toggle. Un checkbox de 16px o un switch de 20px no tiene espacio para un anillo interior más grueso sin tapar la marca. Esto solo importa si defines tú mismo `--ui-shadow-spread`; consulta [Personalización → Tokens de material](./customizing.md#tokens-de-material).
|
|
219
|
+
|
|
220
|
+
## Relleno y borde en los controles de texto
|
|
221
|
+
|
|
222
|
+
Los controles de texto aceptan intención, que colorea el borde, el anillo de foco y el texto escrito, este último en el tono legible de la intención (`--intent-strong`). También aceptan los dos ejes de presentación. Su relleno tiene un tope bajo, para que el texto escrito siga siendo legible:
|
|
223
|
+
|
|
224
|
+
| En un control de texto | Relleno |
|
|
225
|
+
| ------------------------------------------------------- | ------- |
|
|
226
|
+
| `.ghost`, por defecto | 0% |
|
|
227
|
+
| Cualquier relleno de un contenedor (`.soft` o `.solid`) | 6% |
|
|
228
|
+
| `.soft` en el control | 12% |
|
|
229
|
+
| `.solid` en el control | 20% |
|
|
230
|
+
|
|
231
|
+
El relleno de un contenedor está pensado para las superficies que contiene, así que un campo al que nadie ha puesto clase solo toma un tenue 6%. Pon la clase en el propio campo para tener más.
|
|
232
|
+
|
|
233
|
+
El borde funciona igual. Un `.edgeless` heredado de un contenedor se ignora, para que una barra de herramientas no pueda dejar un campo sin borde visible. Un `.edgeless` escrito en el propio control sí se respeta: así es como pides un campo sin borde. Un campo sin borde no cumple el requisito de contraste WCAG 1.4.11 para el límite de un control, así que nunca es un valor por defecto; su anillo de foco sigue mostrándose.
|
|
234
|
+
|
|
235
|
+
```html
|
|
236
|
+
<input class="ipt success" placeholder="Matches your current password" />
|
|
237
|
+
<input class="ipt soft edged" placeholder="Tinted, with a border" />
|
|
238
|
+
<input class="ipt soft edgeless" placeholder="Sunk into the page" />
|
|
239
|
+
<div class="soft">
|
|
240
|
+
<input class="ipt" placeholder="A container's .soft gives a 6% tint" />
|
|
241
|
+
</div>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
En reposo, el borde de un campo es deliberadamente más claro que 3:1 frente a la página, para que el hover y el foco tengan un cambio visible que hacer. [Accesibilidad → Límites de los controles](../accessibility.md#límites-de-los-controles) explica esta contrapartida y cómo conseguir un borde más intenso.
|
|
245
|
+
|
|
246
|
+
## Controles deshabilitados
|
|
247
|
+
|
|
248
|
+
`disabled`, `aria-disabled="true"`, `data-disabled` o `.disabled` en un control lo dibujan con opacidad reducida y un cursor de no permitido. Como con los botones, solo el atributo `disabled` impide la entrada; los demás solo cambian el aspecto.
|
|
249
|
+
|
|
250
|
+
## Construir tu propio control
|
|
251
|
+
|
|
252
|
+
Para un control de tipo texto que el paquete no incluye, `.text-control` le da a un elemento los mismos estilos de borde, placeholder, hover, foco, inválido y deshabilitado que `.ipt`, sin su altura ni su relleno. [Personalización → Helpers de composición](./customizing.md#helpers-de-composición) lo explica junto con las demás piezas.
|
|
253
|
+
|
|
254
|
+
## Siguiente paso
|
|
255
|
+
|
|
256
|
+
El formulario se puede rellenar y enviar. [Feedback](./feedback.md) muestra lo que hace la pantalla a continuación: un botón Guardar que indica que está guardando, un mensaje de éxito, un badge del plan y una barra de uso de almacenamiento.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Visión general
|
|
3
|
+
description: Las guías que terminan la pantalla de ajustes y, después, las páginas de consulta con cada clase, token y valor por defecto.
|
|
4
|
+
group: Uso
|
|
5
|
+
order: 4
|
|
6
|
+
source: ccdf1949cd4f7688574d6f4fae9ad2cf34465fb3
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Uso
|
|
10
|
+
|
|
11
|
+
Estas guías terminan la pantalla de ajustes que empezó en [Construir una pantalla](../concepts.md). Lee las siete primeras en orden: cada una añade una parte de la pantalla y da por hechas las anteriores. Las tres siguientes son páginas de consulta; las guías te enviarán a ellas cuando necesiten la tabla completa, y puedes volver siempre que necesites un valor por defecto o una regla. La última, Preajustes, es para cuando la pantalla ya funciona y te has cansado de escribir las mismas clases.
|
|
12
|
+
|
|
13
|
+
Guías, en orden:
|
|
14
|
+
|
|
15
|
+
1. [Botones](./buttons.md): la acción destructiva de la zona de peligro, botones de icono, tamaños, enlaces con aspecto de botón y estados deshabilitados, además de cómo cargar iconos.
|
|
16
|
+
2. [Formularios](./forms.md): el formulario de perfil, con etiquetas, pistas, errores de validación, un input con un icono o un prefijo fijo, un select y toggles de checkbox, radio y switch.
|
|
17
|
+
3. [Feedback](./feedback.md): lo que muestra la pantalla mientras guarda y después: un botón de carga, una alerta de éxito, un badge del plan, un placeholder de carga y una barra de uso de almacenamiento.
|
|
18
|
+
4. [Tooltips](./tooltips.md): texto de ayuda junto a un campo de formulario, cómo conectarlo para quienes usan teclado y lector de pantalla, y dónde puede quedar recortado un tooltip.
|
|
19
|
+
5. [Temas](./theming.md): modo claro y oscuro, reemplazar la paleta con los colores de marca y definir una intención propia, con las tablas completas de tokens de color y tokens base.
|
|
20
|
+
6. [Estéticas](./aesthetics.md): los seis aspectos opcionales, lo que cambia cada uno y sus límites.
|
|
21
|
+
7. [Clases solo](./solo.md): pintar una estética sobre un componente de otra librería.
|
|
22
|
+
|
|
23
|
+
Páginas de consulta:
|
|
24
|
+
|
|
25
|
+
- [Composición](./composing.md): las reglas completas para combinar intención, presentación y elevación, los valores por defecto de cada componente y qué ejes lee cada uno.
|
|
26
|
+
- [Personalización](./customizing.md): tokens de presentación y de material, controles de las estéticas, las seis variables públicas de componente, la paleta generada y los helpers de composición para construir tus propios componentes.
|
|
27
|
+
- [Contenido y layout](./content-and-layout.md): todos los helpers de layout, la escala tipográfica, tarjetas y paneles, tablas, citas, código y teclas.
|
|
28
|
+
|
|
29
|
+
Cuando la pantalla funcione:
|
|
30
|
+
|
|
31
|
+
- [Preajustes](./presets.md): define un aspecto una sola vez, con clases de eje en un contenedor, tokens de tema y de material, o tus propias clases de componente hechas con `@apply`.
|
|
32
|
+
|
|
33
|
+
Cuando termines, [Accesibilidad](../accessibility.md) reúne lo que el CSS hace por ti y lo que tu aplicación todavía les debe a sus usuarios.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Preajustes
|
|
3
|
+
description: Tres formas de definir un aspecto una sola vez en lugar de en cada elemento, y cuándo recurrir a cada una.
|
|
4
|
+
order: 11
|
|
5
|
+
source: 308b21076223635a3323bcfecb70abe3a9e6d1c7
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Preajustes
|
|
9
|
+
|
|
10
|
+
A estas alturas, la pantalla de ajustes dice `btn primary soft sm` en una docena de sitios, y cambiar de opinión significa cambiar una docena de sitios. Esta página cubre las tres formas de definir un aspecto una sola vez: clases de eje en un contenedor, tokens de tema y de material, y tus propias clases de componente hechas con `@apply`. Cada una encaja con un tipo distinto de "una sola vez".
|
|
11
|
+
|
|
12
|
+
## Cuál usar
|
|
13
|
+
|
|
14
|
+
| Quieres | Recurre a |
|
|
15
|
+
| ------------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
|
|
16
|
+
| Que todos los componentes de una región compartan un relleno, un borde o un material | [Clases de eje en un contenedor](#clases-de-eje-en-un-contenedor) |
|
|
17
|
+
| Otros colores, esquinas, bordes o profundidad para una página o una región | [Tokens de tema y de material](#tokens-de-tema-y-de-material) |
|
|
18
|
+
| Un nombre para una receta que repites, como "el botón de guardar" | [Tus propias clases de componente](#tus-propias-clases-de-componente) |
|
|
19
|
+
|
|
20
|
+
Se combinan. Una región puede definir un token de material, estar bajo una estética y contener tu propia clase de botón, y cada elemento puede seguir sobrescribiendo lo que hereda.
|
|
21
|
+
|
|
22
|
+
## Clases de eje en un contenedor
|
|
23
|
+
|
|
24
|
+
Algunas clases funcionan en un contenedor además de en un componente, y todo lo que hay dentro las toma:
|
|
25
|
+
|
|
26
|
+
- Las clases de presentación: `.solid`, `.soft`, `.ghost`, `.edged` y `.edgeless`.
|
|
27
|
+
- Los patrones de esquina: `.cut-diagonal` y `.cut-diagonal-reverse`.
|
|
28
|
+
- Las [estéticas](./aesthetics.md), como `.glass` o `.pixel`.
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<div class="cluster soft edged">
|
|
32
|
+
<button class="btn primary" type="button">Negrita</button>
|
|
33
|
+
<button class="btn" type="button">Cursiva</button>
|
|
34
|
+
<button class="btn destructive solid" type="button">Quitar formato</button>
|
|
35
|
+
</div>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Los botones de la barra son soft y con borde, y el último pide su propio relleno. Una clase en el elemento siempre gana a la de un contenedor.
|
|
39
|
+
|
|
40
|
+
Los demás ejes no se heredan. La intención, la elevación (`.flat`, `.raised`, `.floating`) y el tamaño (`.sm`, `.lg`) cambian solo el elemento en el que están, así que una barra `.sm` no encoge sus botones; [Composición → Combinar clases](./composing.md#combinar-clases) explica por qué. Una clase de estética también define su propio patrón de esquina en su región, así que un `.cut-diagonal` por encima de una región `.pixel` no llega a su interior.
|
|
41
|
+
|
|
42
|
+
Usa una clase de contenedor cuando el aspecto pertenece a la región, como una barra lateral discreta, y no a los componentes que contiene.
|
|
43
|
+
|
|
44
|
+
## Tokens de tema y de material
|
|
45
|
+
|
|
46
|
+
Los tokens son propiedades personalizadas de CSS. Defínelo en `:root` y toda la página lo sigue; defínelo en un elemento y solo lo sigue lo que hay dentro. Llegan más lejos que las clases, porque los componentes los leen al dibujarse:
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
.admin {
|
|
50
|
+
--radius-control: 0.25rem;
|
|
51
|
+
--radius-surface: 0.5rem;
|
|
52
|
+
--border-width: 2px;
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Cada botón, campo, burbuja de tooltip y superficie dentro de `.admin` toma las esquinas más cerradas y el borde más grueso, sin una clase en ninguno de ellos. Las casillas de verificación, `.kbd` y `.code` mantienen su propia esquina más pequeña, `--radius-small`.
|
|
57
|
+
|
|
58
|
+
Las tablas están donde se explican los tokens, así que esta página no las repite:
|
|
59
|
+
|
|
60
|
+
- [Temas → Tokens de color](./theming.md#tokens-de-color): colores de marca y de estado, en los dos temas.
|
|
61
|
+
- [Temas → Tokens base](./theming.md#tokens-base): esquinas, grosor del borde, altura de los controles, anillo de foco, profundidad y movimiento.
|
|
62
|
+
- [Personalización → Tokens de presentación](./customizing.md#tokens-de-presentación): cuánto aportan un relleno, un borde o un hover.
|
|
63
|
+
- [Personalización → Tokens de material](./customizing.md#tokens-de-material): lo que define una estética, y que puedes definir tú, como `--ui-radius`.
|
|
64
|
+
- [Personalización → Tokens de estética](./customizing.md#tokens-de-estética): los controles de cada estética, como `--neo-offset`.
|
|
65
|
+
|
|
66
|
+
Usa tokens cuando el cambio es un valor, como un color o una esquina, y no una elección entre clases.
|
|
67
|
+
|
|
68
|
+
## Tus propias clases de componente
|
|
69
|
+
|
|
70
|
+
Con los puntos de entrada de código fuente de Tailwind, cada componente, helper y clase de eje es una utilidad de Tailwind, así que una clase tuya puede llevar la receta completa:
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
@import "@codenhub/styles/tw";
|
|
74
|
+
|
|
75
|
+
@utility btn-save {
|
|
76
|
+
@apply btn primary soft sm;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<button class="btn-save" type="submit">Guardar cambios</button>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`btn-save` se comporta como `btn primary soft sm` escrito completo, con estéticas y hover incluidos, y cambiar la receta cambia todos los botones de guardar. Los modificadores que pertenecen a un componente, como `.tight` en `.stack` o `.icon` en `.btn`, también son utilidades, así que `@apply btn icon` te da un botón de icono propio. [Tailwind CSS v4 → Construir tus propios componentes con `@apply`](../integrating/tailwind.md#construir-tus-propios-componentes-con-apply) tiene las reglas, incluido por qué `@utility` es mejor que una regla simple.
|
|
85
|
+
|
|
86
|
+
Con el CSS compilado no hay `@apply`. Guarda la receta en un solo lugar del otro lado: un parcial de plantilla, un componente de tu framework o una constante como `const saveButton = "btn primary soft sm"`.
|
|
87
|
+
|
|
88
|
+
Usa tu propia clase cuando la misma combinación nombra una sola cosa de tu diseño, como el botón de guardar o la tarjeta de plan.
|
|
89
|
+
|
|
90
|
+
## Siguiente paso
|
|
91
|
+
|
|
92
|
+
[Accesibilidad](../accessibility.md) enumera lo que el CSS hace por tus usuarios y lo que tu aplicación todavía les debe.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Clases solo
|
|
3
|
+
description: Cómo pintar una estética sobre un elemento de otra librería, como un toast o un diálogo, y qué lee e ignora una clase solo.
|
|
4
|
+
order: 7
|
|
5
|
+
source: c44308a8768737292529d4f93b703b3fa200255a
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Clases solo
|
|
9
|
+
|
|
10
|
+
Supón que la pantalla de ajustes muestra "Perfil guardado" en un toast de una librería de notificaciones, no en la alerta de este paquete. Bajo `.neobrutalism`, cada tarjeta y cada botón tienen el contorno grueso y la sombra dura, y el toast no: una clase de estética solo define valores que leen los componentes de este paquete, así que no cambia nada en un elemento al que el paquete no da estilo. Una clase solo pinta la estética directamente sobre el único elemento que la lleva:
|
|
11
|
+
|
|
12
|
+
```html
|
|
13
|
+
<div class="toast neobrutalism-solo success" role="status">Profile saved.</div>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Las seis clases solo
|
|
17
|
+
|
|
18
|
+
Cada estética incluye su clase solo en el mismo punto de entrada, y una clase solo no necesita que se cargue nada más:
|
|
19
|
+
|
|
20
|
+
```css
|
|
21
|
+
/* La única hoja de estilos de este paquete en la página. */
|
|
22
|
+
@import "@codenhub/styles/aesthetics/glass";
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<div class="toast glass-solo">A pane over whatever is behind it.</div>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Estética | Clase solo | Pinta |
|
|
30
|
+
| --------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
31
|
+
| `.glass` | `.glass-solo` | Un fondo translúcido, un borde de brillo fino, el desenfoque, una sombra suave de dos capas y la esquina de superficie. Con `.glass-liquid`, el cristal liquid, dibujado en su `::before` y su `::after`. |
|
|
32
|
+
| `.neobrutalism` | `.neobrutalism-solo` | Un borde de tinta de 2px, esquinas rectas y la sombra dura desplazada. |
|
|
33
|
+
| `.pixel` | `.pixel-solo` | El contorno escalonado, el anillo interior en lugar de un borde y la fuente pixelada. |
|
|
34
|
+
| `.chunky-tile` | `.chunky-tile-solo` | La esquina de baldosa, un borde de 2px, la barra de debajo y la fuente redondeada. |
|
|
35
|
+
| `.cyber` | `.cyber-solo` | La diagonal de superficie (la diagonal de control en un botón o un enlace), un borde de 1px, el resplandor y la fuente. |
|
|
36
|
+
| `.sketch` | `.sketch-solo` | Esquinas elípticas irregulares (un contorno más marcado en un panel, uno más suelto en un botón o un enlace, y otras pequeñas y redondeadas con `.sketch-rounded`), una línea de tinta continua de 1px, la sombra desplazada de 2px y la fuente manuscrita. |
|
|
37
|
+
|
|
38
|
+
No pongas una clase solo en los propios componentes de este paquete. Una `.card` ya dibuja su relleno, su borde y su intención, y una clase solo pintaría encima un segundo borde y un segundo relleno. Usa ahí la clase de estética; también funciona en un único elemento: `<button class="btn pixel">`.
|
|
39
|
+
|
|
40
|
+
## Lo que lee una clase solo
|
|
41
|
+
|
|
42
|
+
Un elemento solo acepta las mismas clases de presentación, intención y elevación que aceptaría una `.card`:
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<div class="toast pixel-solo edgeless">No ring</div>
|
|
46
|
+
<div class="toast glass-solo solid success">An opaque green pane</div>
|
|
47
|
+
<div class="toast neobrutalism-solo flat">No offset shadow</div>
|
|
48
|
+
|
|
49
|
+
<section class="soft edged">
|
|
50
|
+
<div class="toast chunky-tile-solo info">Soft and edged from the container, info from itself</div>
|
|
51
|
+
</section>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Qué | De dónde se lee |
|
|
55
|
+
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
56
|
+
| Relleno y borde (`.solid`, `.edged`, …) | Del elemento o de cualquier contenedor: la presentación se hereda, como en los componentes. |
|
|
57
|
+
| Intención (`.success`, …) | Solo del elemento, como en los componentes. Un contenedor `.success` deja neutro un elemento solo que esté dentro. |
|
|
58
|
+
| Elevación (`.flat`, `.raised`, …) | Solo del elemento, como en los componentes. Escala la sombra desplazada, la barra y la sombra de sketch. |
|
|
59
|
+
| La estética que lo rodea (`.pixel`, …) | Nunca. Consulta [Lo que una clase solo ignora](#lo-que-una-clase-solo-ignora). |
|
|
60
|
+
|
|
61
|
+
Sin ninguna de esas clases, una clase solo pinta solo el material (borde, esquina, profundidad, contorno, desenfoque, fuente y pulsación) y deja el fondo y el color de texto propios del elemento como estaban.
|
|
62
|
+
|
|
63
|
+
- **Solo las seis intenciones incluidas.** Una clase solo toma la intención únicamente de `.primary`, `.secondary`, `.success`, `.warning`, `.destructive` e `.info`. Una clase de intención que hayas definido tú, como en [Temas → Tu propia intención](./theming.md#tu-propia-intención), no se lee, y el elemento se dibuja neutro. Para dar un color propio a un elemento solo, cambia el tema de una de las intenciones incluidas en él o en un contenedor, como describe esa sección.
|
|
64
|
+
- **El relleno es una capa sobre el fondo propio del elemento.** Cinco de las seis pintan el relleno como una sombra interior y no definen `background`, así que un toast solo `.soft` es un tinte sobre lo que el toast ya fuera, y uno `.solid` con una intención de color es opaco. Glass define su propio fondo, porque el fondo translúcido es su material, y mezcla el relleno encima. Un `.solid` neutro es un tinte del 20%, no el gris opaco que dibuja un componente.
|
|
65
|
+
- **El color del texto presupone el tema.** Solo se define donde se pide un relleno o una intención, y es el color que el tema usa sobre la página o sobre el relleno. En un elemento cuyo fondo propio no sigue al tema, como un toast blanco en una página oscura, una intención `.soft` o `.ghost` puede poner texto claro sobre un fondo claro; usa `.solid` o quita la intención.
|
|
66
|
+
- **No hay tinte de hover.** No se sabe si un elemento solo es clicable, así que no recibe el color de hover que recibe un `.btn`.
|
|
67
|
+
- **Lee los controles de su estética y los tokens del tema, con los valores incluidos como respaldo.** `--glass-radius-surface`, `--neo-offset`, `--pixel-unit`, `--tile-lift`, `--tile-radius`, `--cyber-cut`, `--cyber-shape`, `--cyber-shape-surface`, `--cyber-glow`, `--cyber-ink`, `--sketch-radius`, `--sketch-radius-surface`, `--sketch-radius-rounded`, `--sketch-radius-surface-rounded` y los tokens de fuente como `--font-sketch` funcionan todos, definidos en el elemento o en cualquier ancestro. Con el tema cargado, sigue al tema; sin él, se renderiza con el aspecto incluido.
|
|
68
|
+
- **Los valores oscuros necesitan un esquema de color.** Los pares claro/oscuro usan `light-dark()`, que sigue el `color-scheme` del elemento. El tema del paquete lo define; una página sin el tema obtiene los valores claros.
|
|
69
|
+
- **Las clases que lee vienen del tema.** `.solid`, `.edgeless`, `.success`, `.flat` y las demás vienen en la hoja de estilos base y en `@codenhub/styles/theme`. Con solo un punto de entrada de estética en la página, esas clases no hacen nada, y la clase solo pinta su aspecto sin clases.
|
|
70
|
+
|
|
71
|
+
## Lo que una clase solo ignora
|
|
72
|
+
|
|
73
|
+
- **La estética que lo rodea.** No lee ninguno de los valores que define una clase de estética, ni `--elevation-color`. Un `.glass-solo` dentro de una región `.pixel` conserva sus propias esquinas, y `--ui-radius` o `--ui-border-width` definidos en él o por encima no hacen nada. Ajústalo mediante sus controles.
|
|
74
|
+
- **Sus propios hijos.** Un elemento solo no es una región de estética. Un componente dentro de él conserva el aspecto de la página que lo rodea, incluso con `.glass-liquid` o `.sketch-rounded` junto a la clase solo. Solo transmite lo que transmite cualquier contenedor: la fuente de la clase solo, y el relleno o el borde de una clase de presentación que lleve, así que una `.card` dentro de un cristal `.glass-solo.solid` es solid, como dentro de cualquier contenedor `.solid`.
|
|
75
|
+
- **La sombra de glass y `.flat`.** `.flat` no quita la sombra de `.glass-solo`, igual que no la quita bajo `.glass`.
|
|
76
|
+
|
|
77
|
+
## Cómo gana y cuándo se mueve
|
|
78
|
+
|
|
79
|
+
- **Gana a los estilos de la otra librería.** Las reglas no tienen capa y tienen un solo nivel de clase, así que ganan a las reglas con capa de un componente, y a las de especificidad cero, se carguen donde se carguen. Una regla ajena sin capa que sea más específica, o igual de específica y posterior en la página, sigue ganando. La otra cara es que una utilidad de Tailwind en el mismo elemento, como `rounded-none`, pierde frente a la clase solo: ajústalo mediante sus controles.
|
|
80
|
+
- **Solo pulsa una acción.** Neobrutalism, chunky tile y cyber pulsan un `button`, un `a[href]`, un `[role="button"]`, un `summary` o un `input` de tipo botón que no esté deshabilitado. Todo lo demás se queda quieto, así que un toast no se hunde al hacer clic. La etiqueta más gruesa de chunky tile sigue la misma regla.
|
|
81
|
+
- **No toca el movimiento de un contenedor.** Solo una acción toma la `transition` de la pulsación, y la pulsación mueve el elemento mediante las propiedades `translate` y `scale`, no `transform`. Un toast conserva sus propias transiciones y su propio `transform`. En una acción, la `transition` de la pulsación reemplaza la que tuviera el elemento.
|
|
82
|
+
- **El movimiento reducido conserva la pulsación y quita su movimiento.** Con `prefers-reduced-motion: reduce`, neobrutalism, chunky tile y cyber siguen pulsando, pero al instante: el elemento cae en su sombra o su barra, o se encoge, sin recorrer la distancia.
|
|
83
|
+
|
|
84
|
+
## Siguiente paso
|
|
85
|
+
|
|
86
|
+
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 el CSS hace por tus usuarios y lo que tu aplicación todavía les debe.
|