orbital-ds 0.6.2 → 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/AGENTS.md +20 -0
- package/README.md +87 -73
- package/components.manifest.json +2 -1
- package/contract.json +168 -162
- package/dist/styles.css +32 -10
- package/dist/themes/friendly.css +318 -310
- package/dist/themes/friendly.scoped.css +318 -310
- package/dist/themes/qratia.css +8 -0
- package/dist/themes/qratia.scoped.css +10 -2
- package/dist/themes/tactile.css +430 -415
- package/dist/themes/tactile.meta.json +75 -9
- package/dist/themes/tactile.scoped.css +430 -415
- package/dist/themes/twitter.css +298 -290
- package/dist/themes/twitter.meta.json +54 -7
- package/dist/themes/twitter.scoped.css +298 -290
- package/dist/themes/zyro.css +389 -381
- package/dist/themes/zyro.scoped.css +389 -381
- package/dist/ui/sidebar.js +1 -1
- package/dist/ui/tooltip.js +1 -1
- package/docs/CONTRACT.md +1 -1
- package/package.json +1 -1
- package/scripts/doctor.mjs +29 -0
- package/scripts/init.mjs +351 -89
package/AGENTS.md
CHANGED
|
@@ -58,3 +58,23 @@ Si `pnpm check:ds` falla, **corrige la causa**; no lo desactives ni lo rodees.
|
|
|
58
58
|
|
|
59
59
|
Copia `themes/qratia.css` (o `zyro.css`), cambia valores, no quites ninguno, añade
|
|
60
60
|
`<tema>.fonts.css` con el `@import url()` de sus fuentes y ejecuta `pnpm check:ds`.
|
|
61
|
+
|
|
62
|
+
## Estándar de integración (cómo debe ajustarse una app)
|
|
63
|
+
|
|
64
|
+
Para que una app (o un agente que la edite) use orbital-ds sin romper nada:
|
|
65
|
+
|
|
66
|
+
1. **La marca vive solo en `brand.css`.** Ninguna regla de color propia fuera de ese fichero; jamás se edita el paquete.
|
|
67
|
+
2. **Solo variables públicas.** Nada de variables privadas de un tema: pueden renombrarse. Usa `--ds-*` y los tokens del contrato (`--zw-*` de `tactile` están obsoletas: usa `--ds-key-outline`, `--ds-key-edge` y `--ds-marker`).
|
|
68
|
+
3. **Sin `!important` ni selectores propios** para vencer a la librería (lateral, raíl, botones). Si algo no se puede ajustar con un token, es un hueco de la librería: abre un issue.
|
|
69
|
+
4. **El tema se elige con un solo `@import`** (o `pnpm theme`). Los temas con ámbito (`*.scoped.css`) son solo para un banco de pruebas; la marca (`brand.css`) gana siempre, también sobre ellos.
|
|
70
|
+
5. **Patrón de página.** La cabecera lleva solo botón de menú, título y, siempre visibles, idioma y tema (y avisos si la app los tiene). El subtítulo y las acciones de la vista van al inicio del contenido, centrado en un ancho máximo; solo un lienzo (mapa, kanban, editor) ocupa todo el ancho.
|
|
71
|
+
6. **Cada tema se documenta y se elige informado.** Lee `orbital-ds/themes/<tema>.guide.md` y su ficha `<tema>.meta.json` (esencia, gesto firma, paleta, accesibilidad, qué valores son aproximados) antes de usar o ajustar un tema.
|
|
72
|
+
7. **Comprueba antes de dar algo por bueno:** `pnpm exec orbital-ds-doctor --css src/brand.css` y el `verify` de la app.
|
|
73
|
+
|
|
74
|
+
### Accesibilidad (WCAG 2.2)
|
|
75
|
+
|
|
76
|
+
- **Mínimo exigible: AA.** Texto 4,5:1; texto grande y controles 3:1. `pnpm check:ds` falla si un par principal de texto sobre su superficie (texto/fondo, tarjeta, popover, primario, secundario, lateral, destructivo) o un texto de estado (info, danger, warning, success, neutral) baja de 4,5:1.
|
|
77
|
+
- **Objetivo: AAA en el texto del cuerpo** (7:1 para texto/fondo y texto/tarjeta). Se mide con `pnpm check:ds -- --aaa` y avisa, no falla: WCAG no aconseja exigir AAA a todo el sitio. Hoy todos los temas lo cumplen.
|
|
78
|
+
- **Excepciones declaradas, nunca silenciosas.** Si un tema no puede cumplir un par (el azul de marca de Twitter con texto blanco da 3:1), lo declara en su ficha, en `a11y.exceptions`, con su porqué; el doctor lo muestra como aviso.
|
|
79
|
+
- **Foco siempre visible** (anillo de 3:1 como mínimo) y sin que otro elemento lo tape.
|
|
80
|
+
- **Una marca nueva debe volver a pasar el doctor.** Cambiar `--primary` obliga a revisar `--primary-foreground`, `--link` y `--ring`.
|
package/README.md
CHANGED
|
@@ -1,73 +1,87 @@
|
|
|
1
|
-
# orbital-ds
|
|
2
|
-
|
|
3
|
-
Sistema de diseño genérico: **estructura común + temas intercambiables + ~60 componentes**
|
|
4
|
-
sobre [Base UI](https://base-ui.com) y Tailwind v4 (los de shadcn en su versión Base UI).
|
|
5
|
-
|
|
6
|
-
- `styles.css` — la ESTRUCTURA: mapea variables de tema a utilidades de Tailwind y define los
|
|
7
|
-
tokens semánticos (radios, alturas, sombras, espaciado, capas, movimiento, foco, materiales)
|
|
8
|
-
y la capa base. No lleva colores ni fuentes.
|
|
9
|
-
- `themes/<tema>.css` — un TEMA: paleta (claro/oscuro), radio base y tipografía.
|
|
10
|
-
Hoy: `qratia` y `zyro` (cristal). Añadir otro = añadir otro fichero.
|
|
11
|
-
- `themes/<tema>.fonts.css` — las fuentes del tema (un `@import url()`; va el primero).
|
|
12
|
-
- `ui/*` — componentes, uno por fichero (`orbital-ds/ui/button`, …): quien no usa gráficos
|
|
13
|
-
no necesita `recharts`, quien no usa el calendario no necesita `react-day-picker`.
|
|
14
|
-
- `contract.json` + `pnpm check:ds` — el contrato de tema y su comprobación.
|
|
15
|
-
|
|
16
|
-
## Uso en una app (Tailwind v4)
|
|
17
|
-
|
|
18
|
-
```css
|
|
19
|
-
@import 'orbital-ds/themes/qratia.fonts.css'; /* fuentes: lo primero */
|
|
20
|
-
@import 'tailwindcss';
|
|
21
|
-
@plugin '@tailwindcss/typography';
|
|
22
|
-
@import 'tw-animate-css';
|
|
23
|
-
@import 'orbital-ds/styles.css'; /* estructura */
|
|
24
|
-
@import 'orbital-ds/themes/qratia.css'; /* tema (después de la estructura) */
|
|
25
|
-
@source '../node_modules/orbital-ds/dist'; /* que Tailwind vea las clases del paquete */
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { Button } from 'orbital-ds/ui/button';
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Cambiar de identidad = cambiar `qratia` por `zyro` en esas dos líneas de tema/fuentes.
|
|
33
|
-
Detalle del contrato, tokens y reglas de nombres en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
34
|
-
|
|
35
|
-
##
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
`
|
|
70
|
-
|
|
71
|
-
##
|
|
72
|
-
|
|
73
|
-
|
|
1
|
+
# orbital-ds
|
|
2
|
+
|
|
3
|
+
Sistema de diseño genérico: **estructura común + temas intercambiables + ~60 componentes**
|
|
4
|
+
sobre [Base UI](https://base-ui.com) y Tailwind v4 (los de shadcn en su versión Base UI).
|
|
5
|
+
|
|
6
|
+
- `styles.css` — la ESTRUCTURA: mapea variables de tema a utilidades de Tailwind y define los
|
|
7
|
+
tokens semánticos (radios, alturas, sombras, espaciado, capas, movimiento, foco, materiales)
|
|
8
|
+
y la capa base. No lleva colores ni fuentes.
|
|
9
|
+
- `themes/<tema>.css` — un TEMA: paleta (claro/oscuro), radio base y tipografía.
|
|
10
|
+
Hoy: `qratia` y `zyro` (cristal). Añadir otro = añadir otro fichero.
|
|
11
|
+
- `themes/<tema>.fonts.css` — las fuentes del tema (un `@import url()`; va el primero).
|
|
12
|
+
- `ui/*` — componentes, uno por fichero (`orbital-ds/ui/button`, …): quien no usa gráficos
|
|
13
|
+
no necesita `recharts`, quien no usa el calendario no necesita `react-day-picker`.
|
|
14
|
+
- `contract.json` + `pnpm check:ds` — el contrato de tema y su comprobación.
|
|
15
|
+
|
|
16
|
+
## Uso en una app (Tailwind v4)
|
|
17
|
+
|
|
18
|
+
```css
|
|
19
|
+
@import 'orbital-ds/themes/qratia.fonts.css'; /* fuentes: lo primero */
|
|
20
|
+
@import 'tailwindcss';
|
|
21
|
+
@plugin '@tailwindcss/typography';
|
|
22
|
+
@import 'tw-animate-css';
|
|
23
|
+
@import 'orbital-ds/styles.css'; /* estructura */
|
|
24
|
+
@import 'orbital-ds/themes/qratia.css'; /* tema (después de la estructura) */
|
|
25
|
+
@source '../node_modules/orbital-ds/dist'; /* que Tailwind vea las clases del paquete */
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { Button } from 'orbital-ds/ui/button';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Cambiar de identidad = cambiar `qratia` por `zyro` en esas dos líneas de tema/fuentes.
|
|
33
|
+
Detalle del contrato, tokens y reglas de nombres en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
34
|
+
|
|
35
|
+
## Generar la marca desde un color (asistente)
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
pnpm exec orbital-ds-init # asistente interactivo
|
|
39
|
+
pnpm exec orbital-ds-init --primary "#1D63D8" # sin preguntas (CI, scripts)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
A partir del **color primario** (hex, `rgb()`, `hsl()` u `oklch()`) deriva en OKLCH los neutros teñidos
|
|
43
|
+
(papel, tinta, tarjeta, bordes, lateral), el texto sobre el primario, el enlace y el foco, en piel clara y
|
|
44
|
+
oscura, y **comprueba el contraste** (AA 4,5:1). Si un color no llega, lo ajusta lo mínimo y te lo dice.
|
|
45
|
+
Escribe solo un bloque delimitado en `brand.css`; con `--update` lo reescribe y lo tuyo de fuera no se
|
|
46
|
+
toca. Opciones: `--theme`, `--accent`, `--no-marker` (apaga el rotulador de `tactile`), `--dry-run`,
|
|
47
|
+
`--yes`, `--out`. Sin dependencias.
|
|
48
|
+
|
|
49
|
+
## Guía de cada tema
|
|
50
|
+
|
|
51
|
+
Cada tema lleva su documentación, que viaja con el paquete:
|
|
52
|
+
|
|
53
|
+
- `orbital-ds/themes/<tema>.guide.md` — guía de diseño: esencia, gesto firma, principios, referencias (qué se tomó de cada una), paleta, tipografía, formas, accesibilidad y estado de los valores (confirmados, aproximados o de diseño propio).
|
|
54
|
+
- `orbital-ds/themes/<tema>.meta.json` — la misma ficha legible por máquina.
|
|
55
|
+
|
|
56
|
+
`pnpm check:ds` falla si a un tema le falta alguna de las dos. Un tema nuevo debe nacer con ambas.
|
|
57
|
+
|
|
58
|
+
## Marca de una app
|
|
59
|
+
|
|
60
|
+
Lo propio de cada app (color principal, acento, radio, fuentes) va en **su** `src/brand.css`,
|
|
61
|
+
importado después del tema. Ninguna actualización de orbital-ds lo toca. `pnpm exec orbital-ds-init`
|
|
62
|
+
lo crea la primera vez. Detalle en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
63
|
+
|
|
64
|
+
## Regla
|
|
65
|
+
|
|
66
|
+
Ningún componente lleva valores propios (colores, medidas, sombras, z-index, duraciones):
|
|
67
|
+
pide un hueco a una variable. Para cambiar el aspecto se cambia el tema, no el componente.
|
|
68
|
+
Si un componente necesita un hueco nuevo, se AÑADE el token con un valor que deje el aspecto
|
|
69
|
+
como estaba. `pnpm check:ds` lo comprueba.
|
|
70
|
+
|
|
71
|
+
## Desarrollo
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pnpm install
|
|
75
|
+
pnpm verify # doctor + typecheck + build
|
|
76
|
+
pnpm check:ds # solo el contrato de tema y los valores fijos
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Peers obligatorios: `react`, `react-dom`, `@base-ui/react`, `tailwindcss`, `tailwind-merge`,
|
|
80
|
+
`class-variance-authority`, `clsx`, `lucide-react`, `tw-animate-css`.
|
|
81
|
+
Opcionales (solo si usas ese componente): `recharts`, `sonner`, `next-themes`, `cmdk`,
|
|
82
|
+
`date-fns` + `react-day-picker`, `embla-carousel-react`, `input-otp`,
|
|
83
|
+
`react-resizable-panels`, `@shadcn/react`.
|
|
84
|
+
|
|
85
|
+
## Licencia
|
|
86
|
+
|
|
87
|
+
MIT © Fractalia Systems
|
package/components.manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "orbital-ds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"engine": "@base-ui/react",
|
|
5
5
|
"docs": [
|
|
6
6
|
"README.md",
|
|
@@ -1256,6 +1256,7 @@
|
|
|
1256
1256
|
],
|
|
1257
1257
|
"slots": [
|
|
1258
1258
|
"tooltip",
|
|
1259
|
+
"tooltip-arrow",
|
|
1259
1260
|
"tooltip-content",
|
|
1260
1261
|
"tooltip-provider",
|
|
1261
1262
|
"tooltip-trigger"
|
package/contract.json
CHANGED
|
@@ -1,162 +1,168 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version":
|
|
3
|
-
"descripcion": "Contrato de tema de orbital-ds: todo tema (themes/*.css) debe definir estos tokens en :root. Nombres en inglés estándar; los de shadcn sin prefijo; los propios con --ds-. baseTheme es el tema aplicado siempre (los demás se aplican encima, con ámbito).",
|
|
4
|
-
"root": [
|
|
5
|
-
"radius",
|
|
6
|
-
"background",
|
|
7
|
-
"foreground",
|
|
8
|
-
"card",
|
|
9
|
-
"card-foreground",
|
|
10
|
-
"popover",
|
|
11
|
-
"popover-foreground",
|
|
12
|
-
"primary",
|
|
13
|
-
"primary-foreground",
|
|
14
|
-
"secondary",
|
|
15
|
-
"secondary-foreground",
|
|
16
|
-
"muted",
|
|
17
|
-
"muted-foreground",
|
|
18
|
-
"accent",
|
|
19
|
-
"accent-foreground",
|
|
20
|
-
"destructive",
|
|
21
|
-
"destructive-foreground",
|
|
22
|
-
"border",
|
|
23
|
-
"input",
|
|
24
|
-
"ring",
|
|
25
|
-
"chart-1",
|
|
26
|
-
"chart-2",
|
|
27
|
-
"chart-3",
|
|
28
|
-
"chart-4",
|
|
29
|
-
"chart-5",
|
|
30
|
-
"sidebar",
|
|
31
|
-
"sidebar-foreground",
|
|
32
|
-
"sidebar-primary",
|
|
33
|
-
"sidebar-primary-foreground",
|
|
34
|
-
"sidebar-accent",
|
|
35
|
-
"sidebar-accent-foreground",
|
|
36
|
-
"sidebar-border",
|
|
37
|
-
"sidebar-ring",
|
|
38
|
-
"danger",
|
|
39
|
-
"danger-soft",
|
|
40
|
-
"warning",
|
|
41
|
-
"warning-soft",
|
|
42
|
-
"success",
|
|
43
|
-
"success-soft",
|
|
44
|
-
"info",
|
|
45
|
-
"info-soft",
|
|
46
|
-
"neutral",
|
|
47
|
-
"neutral-soft",
|
|
48
|
-
"link",
|
|
49
|
-
"link-hover",
|
|
50
|
-
"inset",
|
|
51
|
-
"inset-foreground",
|
|
52
|
-
"brand",
|
|
53
|
-
"brand-bright"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"ds-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"
|
|
128
|
-
"
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
"
|
|
133
|
-
"
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
"
|
|
148
|
-
"
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
"
|
|
153
|
-
"
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
"
|
|
158
|
-
"
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
1
|
+
{
|
|
2
|
+
"version": 4,
|
|
3
|
+
"descripcion": "Contrato de tema de orbital-ds: todo tema (themes/*.css) debe definir estos tokens en :root. Nombres en inglés estándar; los de shadcn sin prefijo; los propios con --ds-. baseTheme es el tema aplicado siempre (los demás se aplican encima, con ámbito).",
|
|
4
|
+
"root": [
|
|
5
|
+
"radius",
|
|
6
|
+
"background",
|
|
7
|
+
"foreground",
|
|
8
|
+
"card",
|
|
9
|
+
"card-foreground",
|
|
10
|
+
"popover",
|
|
11
|
+
"popover-foreground",
|
|
12
|
+
"primary",
|
|
13
|
+
"primary-foreground",
|
|
14
|
+
"secondary",
|
|
15
|
+
"secondary-foreground",
|
|
16
|
+
"muted",
|
|
17
|
+
"muted-foreground",
|
|
18
|
+
"accent",
|
|
19
|
+
"accent-foreground",
|
|
20
|
+
"destructive",
|
|
21
|
+
"destructive-foreground",
|
|
22
|
+
"border",
|
|
23
|
+
"input",
|
|
24
|
+
"ring",
|
|
25
|
+
"chart-1",
|
|
26
|
+
"chart-2",
|
|
27
|
+
"chart-3",
|
|
28
|
+
"chart-4",
|
|
29
|
+
"chart-5",
|
|
30
|
+
"sidebar",
|
|
31
|
+
"sidebar-foreground",
|
|
32
|
+
"sidebar-primary",
|
|
33
|
+
"sidebar-primary-foreground",
|
|
34
|
+
"sidebar-accent",
|
|
35
|
+
"sidebar-accent-foreground",
|
|
36
|
+
"sidebar-border",
|
|
37
|
+
"sidebar-ring",
|
|
38
|
+
"danger",
|
|
39
|
+
"danger-soft",
|
|
40
|
+
"warning",
|
|
41
|
+
"warning-soft",
|
|
42
|
+
"success",
|
|
43
|
+
"success-soft",
|
|
44
|
+
"info",
|
|
45
|
+
"info-soft",
|
|
46
|
+
"neutral",
|
|
47
|
+
"neutral-soft",
|
|
48
|
+
"link",
|
|
49
|
+
"link-hover",
|
|
50
|
+
"inset",
|
|
51
|
+
"inset-foreground",
|
|
52
|
+
"brand",
|
|
53
|
+
"brand-bright",
|
|
54
|
+
"ds-sidebar-icon",
|
|
55
|
+
"ds-sidebar-icon-stroke",
|
|
56
|
+
"ds-sidebar-rail-w",
|
|
57
|
+
"ds-sidebar-rail-item",
|
|
58
|
+
"ds-sidebar-logo",
|
|
59
|
+
"ds-sidebar-sep-inset"
|
|
60
|
+
],
|
|
61
|
+
"fonts": [
|
|
62
|
+
"ds-font-sans"
|
|
63
|
+
],
|
|
64
|
+
"dark": {
|
|
65
|
+
"descripcion": "Recomendados en .dark (si faltan, el tema hereda el valor claro y doctor avisa).",
|
|
66
|
+
"avisar_si_falta": [
|
|
67
|
+
"background",
|
|
68
|
+
"foreground",
|
|
69
|
+
"card",
|
|
70
|
+
"card-foreground",
|
|
71
|
+
"popover",
|
|
72
|
+
"popover-foreground",
|
|
73
|
+
"primary",
|
|
74
|
+
"primary-foreground",
|
|
75
|
+
"muted",
|
|
76
|
+
"muted-foreground",
|
|
77
|
+
"border",
|
|
78
|
+
"input",
|
|
79
|
+
"ring",
|
|
80
|
+
"danger",
|
|
81
|
+
"warning",
|
|
82
|
+
"success",
|
|
83
|
+
"info",
|
|
84
|
+
"link"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"baseTheme": "qratia",
|
|
88
|
+
"brand": {
|
|
89
|
+
"descripcion": "Grupo ESTABLE de variables que una app suele personalizar en su fichero de marca (brand.css). Renombrar o quitar una es versión MAYOR. Todas están también en `root` salvo las --ds-*.",
|
|
90
|
+
"tokens": [
|
|
91
|
+
{
|
|
92
|
+
"name": "primary",
|
|
93
|
+
"example": "oklch(0.55 0.2 260)",
|
|
94
|
+
"about": "color de acción principal (botones, foco)"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "primary-foreground",
|
|
98
|
+
"example": "#ffffff",
|
|
99
|
+
"about": "texto sobre el color principal (comprueba el contraste)"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "ring",
|
|
103
|
+
"example": "oklch(0.55 0.2 260)",
|
|
104
|
+
"about": "anillo de foco; suele ir igual que primary"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "link",
|
|
108
|
+
"example": "oklch(0.5 0.15 260)",
|
|
109
|
+
"about": "texto de enlace: más oscuro que primary para tener contraste"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "link-hover",
|
|
113
|
+
"example": "oklch(0.42 0.13 260)",
|
|
114
|
+
"about": "enlace al pasar el ratón"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "brand",
|
|
118
|
+
"example": "oklch(0.7 0.13 220)",
|
|
119
|
+
"about": "acento de marca (detalles, selección)"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "brand-bright",
|
|
123
|
+
"example": "oklch(0.8 0.13 220)",
|
|
124
|
+
"about": "acento de marca sobre fondos oscuros"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "sidebar-primary",
|
|
128
|
+
"example": "oklch(0.8 0.13 220)",
|
|
129
|
+
"about": "acento dentro del sidebar"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "sidebar-primary-foreground",
|
|
133
|
+
"example": "#04121c",
|
|
134
|
+
"about": "texto sobre el acento del sidebar"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "sidebar-accent-foreground",
|
|
138
|
+
"example": "oklch(0.85 0.1 220)",
|
|
139
|
+
"about": "texto del destino activo del sidebar"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"name": "accent-foreground",
|
|
143
|
+
"example": "oklch(0.5 0.15 260)",
|
|
144
|
+
"about": "texto sobre superficies de acento suave"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "chart-1",
|
|
148
|
+
"example": "oklch(0.55 0.2 260)",
|
|
149
|
+
"about": "primera serie de las gráficas: la marca"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "radius",
|
|
153
|
+
"example": "12px",
|
|
154
|
+
"about": "redondez base (en temas cuya rampa deriva de ella)"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"name": "ds-font-sans",
|
|
158
|
+
"example": "'Inter', system-ui, sans-serif",
|
|
159
|
+
"about": "fuente del cuerpo (carga la fuente en tu app)"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"name": "ds-font-display",
|
|
163
|
+
"example": "'Sora', system-ui, sans-serif",
|
|
164
|
+
"about": "fuente de los titulares"
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
}
|
package/dist/styles.css
CHANGED
|
@@ -194,6 +194,11 @@
|
|
|
194
194
|
--ds-sidebar-ring: 1px;
|
|
195
195
|
--ds-sidebar-edge: 0 solid transparent;
|
|
196
196
|
--ds-sidebar-rail-w: 4rem; /* ancho del lateral contraído (raíl de iconos) */
|
|
197
|
+
--ds-sidebar-rail-item: 2.5rem; /* lado del botón de cada destino en el raíl */
|
|
198
|
+
--ds-sidebar-icon: 1.125rem; /* tamaño de los iconos del lateral */
|
|
199
|
+
--ds-sidebar-icon-stroke: 2; /* grosor del trazo de esos iconos */
|
|
200
|
+
--ds-sidebar-logo: 2rem; /* ficha del logo y del avatar del lateral */
|
|
201
|
+
--ds-sidebar-sep-inset: 0rem; /* margen lateral de los separadores (negativo = de borde a borde) */
|
|
197
202
|
--ds-sidebar-item-radius: var(--ds-radius-md);
|
|
198
203
|
--ds-sidebar-item-h: 2.5rem;
|
|
199
204
|
|
|
@@ -435,15 +440,27 @@
|
|
|
435
440
|
* TAMAÑO Y ALINEACIÓN DE LA NAVEGACIÓN (los `!important` baten a las
|
|
436
441
|
* utilidades que el primitivo trae escritas).
|
|
437
442
|
* EXPANDIDO: filas de altura `--ds-sidebar-item-h` con icono de 18px.
|
|
438
|
-
* COLAPSADO: botón de
|
|
439
|
-
* raíl
|
|
443
|
+
* COLAPSADO: botón cuadrado de `--ds-sidebar-rail-item` con el icono centrado,
|
|
444
|
+
* sin etiqueta, y el botón centrado en el raíl (`--ds-sidebar-rail-w`).
|
|
440
445
|
*/
|
|
441
446
|
[data-sidebar='menu-button'] {
|
|
442
447
|
min-height: var(--ds-sidebar-item-h);
|
|
443
448
|
}
|
|
444
449
|
[data-sidebar='menu-button'] svg {
|
|
445
|
-
width:
|
|
446
|
-
height:
|
|
450
|
+
width: var(--ds-sidebar-icon) !important;
|
|
451
|
+
height: var(--ds-sidebar-icon) !important;
|
|
452
|
+
stroke-width: var(--ds-sidebar-icon-stroke);
|
|
453
|
+
}
|
|
454
|
+
/* Logo / avatar del lateral (botones lg: marca y cuenta) */
|
|
455
|
+
[data-sidebar='menu-button'][data-size='lg'] > :first-child {
|
|
456
|
+
width: var(--ds-sidebar-logo);
|
|
457
|
+
height: var(--ds-sidebar-logo);
|
|
458
|
+
flex: 0 0 var(--ds-sidebar-logo);
|
|
459
|
+
}
|
|
460
|
+
/* Separadores: alineados con las filas (0) o de borde a borde (negativo) */
|
|
461
|
+
[data-slot='sidebar-separator'] {
|
|
462
|
+
margin-inline: var(--ds-sidebar-sep-inset);
|
|
463
|
+
width: auto;
|
|
447
464
|
}
|
|
448
465
|
|
|
449
466
|
[data-collapsible='icon'] [data-slot='sidebar-header'],
|
|
@@ -451,14 +468,19 @@
|
|
|
451
468
|
[data-collapsible='icon'] [data-slot='sidebar-group'] {
|
|
452
469
|
padding-inline: 0.75rem;
|
|
453
470
|
}
|
|
471
|
+
/* Raíl: tecla cuadrada, centrada, con el icono centrado dentro y sin etiqueta */
|
|
454
472
|
[data-collapsible='icon'] [data-sidebar='menu-button'] {
|
|
455
|
-
width:
|
|
456
|
-
height:
|
|
457
|
-
|
|
473
|
+
width: var(--ds-sidebar-rail-item) !important;
|
|
474
|
+
height: var(--ds-sidebar-rail-item) !important;
|
|
475
|
+
min-height: var(--ds-sidebar-rail-item);
|
|
476
|
+
padding: 0 !important;
|
|
477
|
+
gap: 0;
|
|
478
|
+
justify-content: center;
|
|
479
|
+
margin-inline: auto;
|
|
458
480
|
}
|
|
459
|
-
|
|
460
|
-
[data-collapsible='icon'] [data-sidebar='menu-button'][data-size='lg'] {
|
|
461
|
-
|
|
481
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'] > span:last-child:not(:first-child),
|
|
482
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'][data-size='lg'] > :not(:first-child) {
|
|
483
|
+
display: none;
|
|
462
484
|
}
|
|
463
485
|
|
|
464
486
|
/*
|