@eduardoalvarez/arrecife 0.2.0 → 0.4.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/CHANGELOG.md +40 -0
- package/README.md +124 -2
- package/dist/brand/index.cjs +9 -8
- package/dist/brand/index.js +4 -2
- package/dist/chart/index.cjs +287 -0
- package/dist/chart/index.d.cts +127 -0
- package/dist/chart/index.d.ts +127 -0
- package/dist/chart/index.js +103 -0
- package/dist/chunk-KPZNNMV5.js +83 -0
- package/dist/chunk-MLKGABMK.js +7 -0
- package/dist/chunk-NHS7ETKJ.js +27 -0
- package/dist/{chunk-ZL5X6XO7.js → chunk-TB3IYPOD.js} +4 -25
- package/dist/{chunk-DHF63QNM.js → chunk-TSPJOM6K.js} +10 -12
- package/dist/chunk-UOWIDFCB.js +81 -0
- package/dist/{chunk-22OXRTAL.js → chunk-VPT32GPG.js} +2 -1
- package/dist/chunk-ZEOQKRQ7.js +19 -0
- package/dist/form/index.cjs +301 -0
- package/dist/form/index.d.cts +86 -0
- package/dist/form/index.d.ts +86 -0
- package/dist/form/index.js +84 -0
- package/dist/index.cjs +832 -332
- package/dist/index.d.cts +332 -29
- package/dist/index.d.ts +332 -29
- package/dist/index.js +746 -445
- package/dist/label-DuTvJGxD.d.cts +14 -0
- package/dist/label-DuTvJGxD.d.ts +14 -0
- package/dist/og/index.js +2 -1
- package/dist/shiki/index.js +2 -1
- package/dist/tema/index.cjs +94 -0
- package/dist/tema/index.d.cts +110 -0
- package/dist/tema/index.d.ts +110 -0
- package/dist/tema/index.js +2 -0
- package/dist/tokens/index.cjs +11 -5
- package/dist/tokens/index.d.cts +65 -11
- package/dist/tokens/index.d.ts +65 -11
- package/dist/tokens/index.js +3 -2
- package/dist/tokens/theme.css +21 -5
- package/llms.txt +329 -24
- package/package.json +35 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
4
|
+
|
|
5
|
+
type LabelProps = ComponentPropsWithoutRef<typeof LabelPrimitive.Root>;
|
|
6
|
+
/**
|
|
7
|
+
* La escala `label`: 13px, que es el mínimo absoluto en pantalla del sistema.
|
|
8
|
+
*
|
|
9
|
+
* Se atenúa junto al control cuando este está deshabilitado, para que la
|
|
10
|
+
* pareja etiqueta-control se lea siempre como una sola unidad.
|
|
11
|
+
*/
|
|
12
|
+
declare function Label({ className, ...props }: LabelProps): react.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { Label as L, type LabelProps as a };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
4
|
+
|
|
5
|
+
type LabelProps = ComponentPropsWithoutRef<typeof LabelPrimitive.Root>;
|
|
6
|
+
/**
|
|
7
|
+
* La escala `label`: 13px, que es el mínimo absoluto en pantalla del sistema.
|
|
8
|
+
*
|
|
9
|
+
* Se atenúa junto al control cuando este está deshabilitado, para que la
|
|
10
|
+
* pareja etiqueta-control se lea siempre como una sola unidad.
|
|
11
|
+
*/
|
|
12
|
+
declare function Label({ className, ...props }: LabelProps): react.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { Label as L, type LabelProps as a };
|
package/dist/og/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RUTA_ASSETS, caras, poses, aletas } from '../chunk-E3OMP2DL.js';
|
|
2
|
-
import { fonts, dark, light, naming, gradient, tagline, typeScale } from '../chunk-
|
|
2
|
+
import { fonts, dark, light, naming, gradient, tagline, typeScale } from '../chunk-TSPJOM6K.js';
|
|
3
|
+
import '../chunk-MLKGABMK.js';
|
|
3
4
|
|
|
4
5
|
// src/og/plantillas.ts
|
|
5
6
|
var OG = {
|
package/dist/shiki/index.js
CHANGED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/tema/index.ts
|
|
4
|
+
var TEMA_CLAVE = "arrecife-tema";
|
|
5
|
+
var TEMA_ATRIBUTO = "data-theme";
|
|
6
|
+
var TEMA_EVENTO = "arrecife:tema";
|
|
7
|
+
var esTema = (valor) => valor === "dark" || valor === "light";
|
|
8
|
+
function temaActual() {
|
|
9
|
+
if (typeof document === "undefined") return "dark";
|
|
10
|
+
const puesto = document.documentElement.getAttribute(TEMA_ATRIBUTO);
|
|
11
|
+
return esTema(puesto) ? puesto : "dark";
|
|
12
|
+
}
|
|
13
|
+
function temaGuardado() {
|
|
14
|
+
if (typeof localStorage === "undefined") return null;
|
|
15
|
+
try {
|
|
16
|
+
const valor = localStorage.getItem(TEMA_CLAVE);
|
|
17
|
+
return esTema(valor) ? valor : null;
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function temaPreferido() {
|
|
23
|
+
const guardado = temaGuardado();
|
|
24
|
+
if (guardado) return guardado;
|
|
25
|
+
if (typeof matchMedia === "undefined") return "dark";
|
|
26
|
+
return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
|
|
27
|
+
}
|
|
28
|
+
function aplicarTema(tema, persistir = true) {
|
|
29
|
+
if (typeof document === "undefined") return;
|
|
30
|
+
document.documentElement.setAttribute(TEMA_ATRIBUTO, tema);
|
|
31
|
+
document.documentElement.style.colorScheme = tema;
|
|
32
|
+
if (persistir) {
|
|
33
|
+
try {
|
|
34
|
+
localStorage.setItem(TEMA_CLAVE, tema);
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
dispatchEvent(new CustomEvent(TEMA_EVENTO, { detail: tema }));
|
|
39
|
+
}
|
|
40
|
+
function alternarTema() {
|
|
41
|
+
const siguiente = temaActual() === "dark" ? "light" : "dark";
|
|
42
|
+
aplicarTema(siguiente);
|
|
43
|
+
return siguiente;
|
|
44
|
+
}
|
|
45
|
+
function escucharTema(alCambiar) {
|
|
46
|
+
if (typeof window === "undefined") return () => {
|
|
47
|
+
};
|
|
48
|
+
const propio = (evento) => {
|
|
49
|
+
const detalle = evento.detail;
|
|
50
|
+
if (esTema(detalle)) alCambiar(detalle);
|
|
51
|
+
};
|
|
52
|
+
const otraPestana = (evento) => {
|
|
53
|
+
if (evento.key !== TEMA_CLAVE) return;
|
|
54
|
+
const tema = esTema(evento.newValue) ? evento.newValue : temaPreferido();
|
|
55
|
+
aplicarTema(tema, false);
|
|
56
|
+
alCambiar(tema);
|
|
57
|
+
};
|
|
58
|
+
addEventListener(TEMA_EVENTO, propio);
|
|
59
|
+
addEventListener("storage", otraPestana);
|
|
60
|
+
return () => {
|
|
61
|
+
removeEventListener(TEMA_EVENTO, propio);
|
|
62
|
+
removeEventListener("storage", otraPestana);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
var scriptTema = [
|
|
66
|
+
"(function () {",
|
|
67
|
+
" var CLAVE = " + JSON.stringify(TEMA_CLAVE) + ";",
|
|
68
|
+
" function resolver() {",
|
|
69
|
+
" try {",
|
|
70
|
+
" var guardado = localStorage.getItem(CLAVE);",
|
|
71
|
+
' if (guardado === "dark" || guardado === "light") return guardado;',
|
|
72
|
+
" } catch (e) {}",
|
|
73
|
+
' return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";',
|
|
74
|
+
" }",
|
|
75
|
+
" function aplicar() {",
|
|
76
|
+
" var tema = resolver();",
|
|
77
|
+
" document.documentElement.setAttribute(" + JSON.stringify(TEMA_ATRIBUTO) + ", tema);",
|
|
78
|
+
" document.documentElement.style.colorScheme = tema;",
|
|
79
|
+
" }",
|
|
80
|
+
" aplicar();",
|
|
81
|
+
' document.addEventListener("astro:after-swap", aplicar);',
|
|
82
|
+
"})();"
|
|
83
|
+
].join("\n");
|
|
84
|
+
|
|
85
|
+
exports.TEMA_ATRIBUTO = TEMA_ATRIBUTO;
|
|
86
|
+
exports.TEMA_CLAVE = TEMA_CLAVE;
|
|
87
|
+
exports.TEMA_EVENTO = TEMA_EVENTO;
|
|
88
|
+
exports.alternarTema = alternarTema;
|
|
89
|
+
exports.aplicarTema = aplicarTema;
|
|
90
|
+
exports.escucharTema = escucharTema;
|
|
91
|
+
exports.scriptTema = scriptTema;
|
|
92
|
+
exports.temaActual = temaActual;
|
|
93
|
+
exports.temaGuardado = temaGuardado;
|
|
94
|
+
exports.temaPreferido = temaPreferido;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El tema, sin React.
|
|
3
|
+
*
|
|
4
|
+
* La librería define TODO el sistema de temas —`@custom-variant light`, los
|
|
5
|
+
* bloques `[data-theme]`, la paleta de los dos modos— y hasta ahora no exponía
|
|
6
|
+
* lo que lo cambia. `eduardoalvarez.dev` y `links` lo reimplementaban por
|
|
7
|
+
* separado, cada uno con su `localStorage` y su `astro:after-swap`.
|
|
8
|
+
*
|
|
9
|
+
* Este subpaquete no importa React a propósito, igual que `./tokens`, `./og` y
|
|
10
|
+
* `./shiki`: los dos proyectos que más lo necesitan son Astro y uno de ellos no
|
|
11
|
+
* envía JavaScript de framework. Lo que se publica aquí es lo difícil del
|
|
12
|
+
* componente —evitar el parpadeo de la primera pintura y que la elección
|
|
13
|
+
* sobreviva a la navegación—, no el botón. El botón es `ThemeToggle`, vive en la
|
|
14
|
+
* raíz y usa esto por dentro.
|
|
15
|
+
*
|
|
16
|
+
* `check-package-exports.mjs` verifica que `./tema` no arrastra React en el
|
|
17
|
+
* `dist/` publicado, igual que las otras tres subrutas portables.
|
|
18
|
+
*/
|
|
19
|
+
/** Los dos modos. El oscuro es el primario y es el default del sistema. */
|
|
20
|
+
type Tema = 'dark' | 'light';
|
|
21
|
+
/**
|
|
22
|
+
* La clave de `localStorage`.
|
|
23
|
+
*
|
|
24
|
+
* Va con el nombre de la librería porque el `localStorage` es del origen, no
|
|
25
|
+
* del proyecto: un `theme` a secas colisiona con el de cualquier otra cosa que
|
|
26
|
+
* viva en el mismo dominio.
|
|
27
|
+
*/
|
|
28
|
+
declare const TEMA_CLAVE = "arrecife-tema";
|
|
29
|
+
/** El atributo que leen los bloques `[data-theme]` de `theme.css`. */
|
|
30
|
+
declare const TEMA_ATRIBUTO = "data-theme";
|
|
31
|
+
/**
|
|
32
|
+
* El evento que se emite cuando el tema cambia.
|
|
33
|
+
*
|
|
34
|
+
* Existe porque `storage` solo avisa a las OTRAS pestañas: en la que hizo el
|
|
35
|
+
* cambio, nada notifica, y un sitio con dos controles de tema —la cabecera y el
|
|
36
|
+
* pie— se quedaría con uno de los dos mostrando el icono equivocado.
|
|
37
|
+
*/
|
|
38
|
+
declare const TEMA_EVENTO = "arrecife:tema";
|
|
39
|
+
/**
|
|
40
|
+
* El tema que hay puesto ahora mismo, leído del DOM.
|
|
41
|
+
*
|
|
42
|
+
* Del DOM y no de `localStorage` a propósito: el script de la cabecera ya
|
|
43
|
+
* resolvió la preferencia guardada contra la del sistema, y volver a resolverla
|
|
44
|
+
* aquí es la forma de que las dos respuestas se separen.
|
|
45
|
+
*/
|
|
46
|
+
declare function temaActual(): Tema;
|
|
47
|
+
/**
|
|
48
|
+
* La preferencia guardada, si la hay. `null` significa «nadie ha elegido», que
|
|
49
|
+
* no es lo mismo que «eligió oscuro»: sin elección manda el sistema.
|
|
50
|
+
*/
|
|
51
|
+
declare function temaGuardado(): Tema | null;
|
|
52
|
+
/**
|
|
53
|
+
* El tema que corresponde: lo elegido, y si no hay elección, lo que pida el
|
|
54
|
+
* sistema. Sin `prefers-color-scheme` declarado, oscuro, que es el primario.
|
|
55
|
+
*/
|
|
56
|
+
declare function temaPreferido(): Tema;
|
|
57
|
+
/**
|
|
58
|
+
* Pone el tema en el `<html>` y lo persiste.
|
|
59
|
+
*
|
|
60
|
+
* Escribe el atributo SIEMPRE, también cuando es `dark`. El default del sistema
|
|
61
|
+
* no necesita el atributo, pero dejarlo explícito es lo que permite que un
|
|
62
|
+
* subárbol declare el modo contrario —el bloque de código va sobre casco en los
|
|
63
|
+
* dos temas— sin que herede de un `<html>` sin marcar.
|
|
64
|
+
*/
|
|
65
|
+
declare function aplicarTema(tema: Tema, persistir?: boolean): void;
|
|
66
|
+
/** Cambia al contrario y devuelve el que quedó. */
|
|
67
|
+
declare function alternarTema(): Tema;
|
|
68
|
+
/**
|
|
69
|
+
* Se suscribe a los cambios de tema y devuelve la función que cancela.
|
|
70
|
+
*
|
|
71
|
+
* Escucha las dos fuentes: el evento propio —el control de esta pestaña— y
|
|
72
|
+
* `storage`, que es el cambio hecho en otra. Sin la segunda, dos pestañas
|
|
73
|
+
* abiertas se quedan con temas distintos hasta que se recarga una.
|
|
74
|
+
*/
|
|
75
|
+
declare function escucharTema(alCambiar: (tema: Tema) => void): () => void;
|
|
76
|
+
/**
|
|
77
|
+
* El script que va INLINE en el `<head>`, antes de cualquier hoja de estilo.
|
|
78
|
+
*
|
|
79
|
+
* Es la parte difícil y es la que se reescribía en cada proyecto. Sin él, la
|
|
80
|
+
* primera pintura sale con el tema por defecto y el correcto entra un frame
|
|
81
|
+
* después: en un sitio oscuro que el usuario dejó en claro, eso es un
|
|
82
|
+
* fogonazo blanco en cada carga.
|
|
83
|
+
*
|
|
84
|
+
* Tiene que ser una cadena y tiene que ir en línea. Un `<script src>`, aunque
|
|
85
|
+
* sea síncrono, se descarga: el parpadeo vuelve. Por eso esto no es un módulo
|
|
86
|
+
* que se importa, es texto que se inyecta:
|
|
87
|
+
*
|
|
88
|
+
* ```astro
|
|
89
|
+
* ---
|
|
90
|
+
* import { scriptTema } from '@eduardoalvarez/arrecife/tema';
|
|
91
|
+
* ---
|
|
92
|
+
* <head>
|
|
93
|
+
* <script is:inline set:html={scriptTema} />
|
|
94
|
+
* </head>
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* ```tsx
|
|
98
|
+
* // Next, en el layout raíz.
|
|
99
|
+
* <head>
|
|
100
|
+
* <script dangerouslySetInnerHTML={{ __html: scriptTema }} />
|
|
101
|
+
* </head>
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* Reengancha en `astro:after-swap` porque las transiciones de vista de Astro
|
|
105
|
+
* reemplazan el `<html>` entero: sin esa línea, el tema se pierde al navegar y
|
|
106
|
+
* vuelve el fogonazo, esta vez a mitad de sesión.
|
|
107
|
+
*/
|
|
108
|
+
declare const scriptTema: string;
|
|
109
|
+
|
|
110
|
+
export { TEMA_ATRIBUTO, TEMA_CLAVE, TEMA_EVENTO, type Tema, alternarTema, aplicarTema, escucharTema, scriptTema, temaActual, temaGuardado, temaPreferido };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El tema, sin React.
|
|
3
|
+
*
|
|
4
|
+
* La librería define TODO el sistema de temas —`@custom-variant light`, los
|
|
5
|
+
* bloques `[data-theme]`, la paleta de los dos modos— y hasta ahora no exponía
|
|
6
|
+
* lo que lo cambia. `eduardoalvarez.dev` y `links` lo reimplementaban por
|
|
7
|
+
* separado, cada uno con su `localStorage` y su `astro:after-swap`.
|
|
8
|
+
*
|
|
9
|
+
* Este subpaquete no importa React a propósito, igual que `./tokens`, `./og` y
|
|
10
|
+
* `./shiki`: los dos proyectos que más lo necesitan son Astro y uno de ellos no
|
|
11
|
+
* envía JavaScript de framework. Lo que se publica aquí es lo difícil del
|
|
12
|
+
* componente —evitar el parpadeo de la primera pintura y que la elección
|
|
13
|
+
* sobreviva a la navegación—, no el botón. El botón es `ThemeToggle`, vive en la
|
|
14
|
+
* raíz y usa esto por dentro.
|
|
15
|
+
*
|
|
16
|
+
* `check-package-exports.mjs` verifica que `./tema` no arrastra React en el
|
|
17
|
+
* `dist/` publicado, igual que las otras tres subrutas portables.
|
|
18
|
+
*/
|
|
19
|
+
/** Los dos modos. El oscuro es el primario y es el default del sistema. */
|
|
20
|
+
type Tema = 'dark' | 'light';
|
|
21
|
+
/**
|
|
22
|
+
* La clave de `localStorage`.
|
|
23
|
+
*
|
|
24
|
+
* Va con el nombre de la librería porque el `localStorage` es del origen, no
|
|
25
|
+
* del proyecto: un `theme` a secas colisiona con el de cualquier otra cosa que
|
|
26
|
+
* viva en el mismo dominio.
|
|
27
|
+
*/
|
|
28
|
+
declare const TEMA_CLAVE = "arrecife-tema";
|
|
29
|
+
/** El atributo que leen los bloques `[data-theme]` de `theme.css`. */
|
|
30
|
+
declare const TEMA_ATRIBUTO = "data-theme";
|
|
31
|
+
/**
|
|
32
|
+
* El evento que se emite cuando el tema cambia.
|
|
33
|
+
*
|
|
34
|
+
* Existe porque `storage` solo avisa a las OTRAS pestañas: en la que hizo el
|
|
35
|
+
* cambio, nada notifica, y un sitio con dos controles de tema —la cabecera y el
|
|
36
|
+
* pie— se quedaría con uno de los dos mostrando el icono equivocado.
|
|
37
|
+
*/
|
|
38
|
+
declare const TEMA_EVENTO = "arrecife:tema";
|
|
39
|
+
/**
|
|
40
|
+
* El tema que hay puesto ahora mismo, leído del DOM.
|
|
41
|
+
*
|
|
42
|
+
* Del DOM y no de `localStorage` a propósito: el script de la cabecera ya
|
|
43
|
+
* resolvió la preferencia guardada contra la del sistema, y volver a resolverla
|
|
44
|
+
* aquí es la forma de que las dos respuestas se separen.
|
|
45
|
+
*/
|
|
46
|
+
declare function temaActual(): Tema;
|
|
47
|
+
/**
|
|
48
|
+
* La preferencia guardada, si la hay. `null` significa «nadie ha elegido», que
|
|
49
|
+
* no es lo mismo que «eligió oscuro»: sin elección manda el sistema.
|
|
50
|
+
*/
|
|
51
|
+
declare function temaGuardado(): Tema | null;
|
|
52
|
+
/**
|
|
53
|
+
* El tema que corresponde: lo elegido, y si no hay elección, lo que pida el
|
|
54
|
+
* sistema. Sin `prefers-color-scheme` declarado, oscuro, que es el primario.
|
|
55
|
+
*/
|
|
56
|
+
declare function temaPreferido(): Tema;
|
|
57
|
+
/**
|
|
58
|
+
* Pone el tema en el `<html>` y lo persiste.
|
|
59
|
+
*
|
|
60
|
+
* Escribe el atributo SIEMPRE, también cuando es `dark`. El default del sistema
|
|
61
|
+
* no necesita el atributo, pero dejarlo explícito es lo que permite que un
|
|
62
|
+
* subárbol declare el modo contrario —el bloque de código va sobre casco en los
|
|
63
|
+
* dos temas— sin que herede de un `<html>` sin marcar.
|
|
64
|
+
*/
|
|
65
|
+
declare function aplicarTema(tema: Tema, persistir?: boolean): void;
|
|
66
|
+
/** Cambia al contrario y devuelve el que quedó. */
|
|
67
|
+
declare function alternarTema(): Tema;
|
|
68
|
+
/**
|
|
69
|
+
* Se suscribe a los cambios de tema y devuelve la función que cancela.
|
|
70
|
+
*
|
|
71
|
+
* Escucha las dos fuentes: el evento propio —el control de esta pestaña— y
|
|
72
|
+
* `storage`, que es el cambio hecho en otra. Sin la segunda, dos pestañas
|
|
73
|
+
* abiertas se quedan con temas distintos hasta que se recarga una.
|
|
74
|
+
*/
|
|
75
|
+
declare function escucharTema(alCambiar: (tema: Tema) => void): () => void;
|
|
76
|
+
/**
|
|
77
|
+
* El script que va INLINE en el `<head>`, antes de cualquier hoja de estilo.
|
|
78
|
+
*
|
|
79
|
+
* Es la parte difícil y es la que se reescribía en cada proyecto. Sin él, la
|
|
80
|
+
* primera pintura sale con el tema por defecto y el correcto entra un frame
|
|
81
|
+
* después: en un sitio oscuro que el usuario dejó en claro, eso es un
|
|
82
|
+
* fogonazo blanco en cada carga.
|
|
83
|
+
*
|
|
84
|
+
* Tiene que ser una cadena y tiene que ir en línea. Un `<script src>`, aunque
|
|
85
|
+
* sea síncrono, se descarga: el parpadeo vuelve. Por eso esto no es un módulo
|
|
86
|
+
* que se importa, es texto que se inyecta:
|
|
87
|
+
*
|
|
88
|
+
* ```astro
|
|
89
|
+
* ---
|
|
90
|
+
* import { scriptTema } from '@eduardoalvarez/arrecife/tema';
|
|
91
|
+
* ---
|
|
92
|
+
* <head>
|
|
93
|
+
* <script is:inline set:html={scriptTema} />
|
|
94
|
+
* </head>
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* ```tsx
|
|
98
|
+
* // Next, en el layout raíz.
|
|
99
|
+
* <head>
|
|
100
|
+
* <script dangerouslySetInnerHTML={{ __html: scriptTema }} />
|
|
101
|
+
* </head>
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* Reengancha en `astro:after-swap` porque las transiciones de vista de Astro
|
|
105
|
+
* reemplazan el `<html>` entero: sin esa línea, el tema se pierde al navegar y
|
|
106
|
+
* vuelve el fogonazo, esta vez a mitad de sesión.
|
|
107
|
+
*/
|
|
108
|
+
declare const scriptTema: string;
|
|
109
|
+
|
|
110
|
+
export { TEMA_ATRIBUTO, TEMA_CLAVE, TEMA_EVENTO, type Tema, alternarTema, aplicarTema, escucharTema, scriptTema, temaActual, temaGuardado, temaPreferido };
|
package/dist/tokens/index.cjs
CHANGED
|
@@ -158,11 +158,11 @@ var control = {
|
|
|
158
158
|
icon: 42
|
|
159
159
|
};
|
|
160
160
|
var spacing = {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
161
|
+
stepXs: 8,
|
|
162
|
+
stepSm: 12,
|
|
163
|
+
stepMd: 16,
|
|
164
|
+
stepLg: 26,
|
|
165
|
+
stepXl: 40,
|
|
166
166
|
section: 96
|
|
167
167
|
};
|
|
168
168
|
var size = {
|
|
@@ -187,6 +187,10 @@ var sintaxis = {
|
|
|
187
187
|
/** `markup.deleted`, `invalid`. */
|
|
188
188
|
invalido: dark.error
|
|
189
189
|
};
|
|
190
|
+
var series = {
|
|
191
|
+
dark: [dark.accent, dark.warm, brand.body, dark.textMuted],
|
|
192
|
+
light: [light.accent, light.warm, brand.body, light.textMuted]
|
|
193
|
+
};
|
|
190
194
|
var profundo = "#0D2129";
|
|
191
195
|
var gradient = {
|
|
192
196
|
dark: {
|
|
@@ -237,6 +241,7 @@ var tokens = {
|
|
|
237
241
|
size,
|
|
238
242
|
gradient,
|
|
239
243
|
sintaxis,
|
|
244
|
+
series,
|
|
240
245
|
shadow,
|
|
241
246
|
motion,
|
|
242
247
|
tagline,
|
|
@@ -254,6 +259,7 @@ exports.limits = limits;
|
|
|
254
259
|
exports.motion = motion;
|
|
255
260
|
exports.naming = naming;
|
|
256
261
|
exports.radius = radius;
|
|
262
|
+
exports.series = series;
|
|
257
263
|
exports.shadow = shadow;
|
|
258
264
|
exports.sintaxis = sintaxis;
|
|
259
265
|
exports.size = size;
|
package/dist/tokens/index.d.cts
CHANGED
|
@@ -289,12 +289,34 @@ declare const control: {
|
|
|
289
289
|
/** Botón de icono: cuadrado, sin texto. */
|
|
290
290
|
readonly icon: 42;
|
|
291
291
|
};
|
|
292
|
+
/**
|
|
293
|
+
* El ritmo de página. Los cinco escalones llevan `step` en el nombre, y no es
|
|
294
|
+
* decoración: es la corrección de un bug que no dio la cara en ningún sitio.
|
|
295
|
+
*
|
|
296
|
+
* En Tailwind v4, `--spacing-*` no alimenta solo `p-*`, `m-*` y `gap-*`:
|
|
297
|
+
* también resuelve `w-*`, `h-*`, `max-w-*`, `min-w-*`, `basis-*` y `size-*`, y
|
|
298
|
+
* ahí GANA a la escala `--container-*`. Los escalones se llamaban `xs, sm, md,
|
|
299
|
+
* lg, xl`, que son exactamente los nombres de esa escala, así que cualquier
|
|
300
|
+
* proyecto que importara `theme.css` se quedaba con `max-w-sm` valiendo 12px en
|
|
301
|
+
* vez de 384px. Nada avisaba: ni el build, ni los tipos, ni Storybook, ni la
|
|
302
|
+
* suite —la librería no usa esas utilidades por dentro—. Se descubrió en
|
|
303
|
+
* producción, con el párrafo de un hero a una palabra por línea.
|
|
304
|
+
*
|
|
305
|
+
* Redeclarar `--container-sm` NO lo arregla: `--spacing-*` gana la resolución.
|
|
306
|
+
* La única salida es que la librería no use esos nombres.
|
|
307
|
+
*
|
|
308
|
+
* El prefijo sigue el patrón que ya tenía `control`: un grupo con nombre propio
|
|
309
|
+
* dentro del espacio `--spacing-*`. `scripts/check-tokens-namespace.mjs` impide
|
|
310
|
+
* la recaída.
|
|
311
|
+
*
|
|
312
|
+
* `section` no lleva prefijo porque no choca con nada de Tailwind.
|
|
313
|
+
*/
|
|
292
314
|
declare const spacing: {
|
|
293
|
-
readonly
|
|
294
|
-
readonly
|
|
295
|
-
readonly
|
|
296
|
-
readonly
|
|
297
|
-
readonly
|
|
315
|
+
readonly stepXs: 8;
|
|
316
|
+
readonly stepSm: 12;
|
|
317
|
+
readonly stepMd: 16;
|
|
318
|
+
readonly stepLg: 26;
|
|
319
|
+
readonly stepXl: 40;
|
|
298
320
|
readonly section: 96;
|
|
299
321
|
};
|
|
300
322
|
declare const size: {
|
|
@@ -345,6 +367,32 @@ declare const sintaxis: {
|
|
|
345
367
|
/** `markup.deleted`, `invalid`. */
|
|
346
368
|
readonly invalido: "#E15757";
|
|
347
369
|
};
|
|
370
|
+
/**
|
|
371
|
+
* La paleta de series de las gráficas. CUATRO, por el mismo motivo que la de
|
|
372
|
+
* sintaxis: el sistema se comunica con color y borde, no con ruido cromático.
|
|
373
|
+
*
|
|
374
|
+
* Ninguno es un color nuevo. Son cuatro que ya están en la identidad y que se
|
|
375
|
+
* distinguen por TONO, no por luminosidad —turquesa, naranja, azul y gris—,
|
|
376
|
+
* que es la única forma de que sigan siendo cuatro series para quien no
|
|
377
|
+
* distingue rojo y verde. Elegir bioluz y `success` habría dado dos verdes
|
|
378
|
+
* casi idénticos en modo claro.
|
|
379
|
+
*
|
|
380
|
+
* `brand.body` entra aquí y no en el resaltado por la misma regla vista al
|
|
381
|
+
* derecho: el sistema lo restringe a RELLENO y nunca a texto, y una serie de
|
|
382
|
+
* gráfica es relleno. Es igual en los dos modos porque es color de marca.
|
|
383
|
+
*
|
|
384
|
+
* El umbral que aplica es el de objeto gráfico, 3:1 contra el fondo, no el de
|
|
385
|
+
* texto. Medidos contra `background`, los cuatro lo pasan en los dos modos con
|
|
386
|
+
* margen: el peor es `brand.body` sobre papel, con 3.9:1.
|
|
387
|
+
*
|
|
388
|
+
* Una quinta serie no se añade inventando un tono. Si una gráfica necesita
|
|
389
|
+
* cinco categorías, o sobran categorías o hace falta agrupar en «otros»: ver
|
|
390
|
+
* `docs/decisiones.md`.
|
|
391
|
+
*/
|
|
392
|
+
declare const series: {
|
|
393
|
+
readonly dark: readonly ["#35D6C0", "#F2A65A", "#3E7CB1", "#71919C"];
|
|
394
|
+
readonly light: readonly ["#0D7C6F", "#A65B27", "#3E7CB1", "#626A75"];
|
|
395
|
+
};
|
|
348
396
|
declare const gradient: {
|
|
349
397
|
readonly dark: {
|
|
350
398
|
readonly hero: "linear-gradient(160deg, #091319 60%, #0D2129 100%)";
|
|
@@ -401,6 +449,8 @@ type GradientToken = keyof typeof gradient.dark;
|
|
|
401
449
|
type SintaxisToken = keyof typeof sintaxis;
|
|
402
450
|
type SpacingToken = keyof typeof spacing;
|
|
403
451
|
type SizeToken = keyof typeof size;
|
|
452
|
+
/** El índice de una serie de gráfica: 0, 1, 2 o 3. */
|
|
453
|
+
type SeriesToken = 0 | 1 | 2 | 3;
|
|
404
454
|
|
|
405
455
|
/**
|
|
406
456
|
* Punto de entrada de `@eduardoalvarez/arrecife/tokens`.
|
|
@@ -567,11 +617,11 @@ declare const tokens: {
|
|
|
567
617
|
readonly icon: 42;
|
|
568
618
|
};
|
|
569
619
|
readonly spacing: {
|
|
570
|
-
readonly
|
|
571
|
-
readonly
|
|
572
|
-
readonly
|
|
573
|
-
readonly
|
|
574
|
-
readonly
|
|
620
|
+
readonly stepXs: 8;
|
|
621
|
+
readonly stepSm: 12;
|
|
622
|
+
readonly stepMd: 16;
|
|
623
|
+
readonly stepLg: 26;
|
|
624
|
+
readonly stepXl: 40;
|
|
575
625
|
readonly section: 96;
|
|
576
626
|
};
|
|
577
627
|
readonly size: {
|
|
@@ -599,6 +649,10 @@ declare const tokens: {
|
|
|
599
649
|
readonly comentario: "#71919C";
|
|
600
650
|
readonly invalido: "#E15757";
|
|
601
651
|
};
|
|
652
|
+
readonly series: {
|
|
653
|
+
readonly dark: readonly ["#35D6C0", "#F2A65A", "#3E7CB1", "#71919C"];
|
|
654
|
+
readonly light: readonly ["#0D7C6F", "#A65B27", "#3E7CB1", "#626A75"];
|
|
655
|
+
};
|
|
602
656
|
readonly shadow: {
|
|
603
657
|
readonly standard: "0 1px 2px rgba(0, 0, 0, 0.35)";
|
|
604
658
|
};
|
|
@@ -620,4 +674,4 @@ declare const tokens: {
|
|
|
620
674
|
};
|
|
621
675
|
type Tokens = typeof tokens;
|
|
622
676
|
|
|
623
|
-
export { type BrandToken, type ColorMode, type ColorToken, type ControlToken, type FontToken, type GradientToken, type RadiusToken, type SintaxisToken, type SizeToken, type SpacingToken, type Tokens, type TypeScaleToken, brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, shadow, sintaxis, size, spacing, tagline, tokens, typeScale };
|
|
677
|
+
export { type BrandToken, type ColorMode, type ColorToken, type ControlToken, type FontToken, type GradientToken, type RadiusToken, type SeriesToken, type SintaxisToken, type SizeToken, type SpacingToken, type Tokens, type TypeScaleToken, brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, sintaxis, size, spacing, tagline, tokens, typeScale };
|
package/dist/tokens/index.d.ts
CHANGED
|
@@ -289,12 +289,34 @@ declare const control: {
|
|
|
289
289
|
/** Botón de icono: cuadrado, sin texto. */
|
|
290
290
|
readonly icon: 42;
|
|
291
291
|
};
|
|
292
|
+
/**
|
|
293
|
+
* El ritmo de página. Los cinco escalones llevan `step` en el nombre, y no es
|
|
294
|
+
* decoración: es la corrección de un bug que no dio la cara en ningún sitio.
|
|
295
|
+
*
|
|
296
|
+
* En Tailwind v4, `--spacing-*` no alimenta solo `p-*`, `m-*` y `gap-*`:
|
|
297
|
+
* también resuelve `w-*`, `h-*`, `max-w-*`, `min-w-*`, `basis-*` y `size-*`, y
|
|
298
|
+
* ahí GANA a la escala `--container-*`. Los escalones se llamaban `xs, sm, md,
|
|
299
|
+
* lg, xl`, que son exactamente los nombres de esa escala, así que cualquier
|
|
300
|
+
* proyecto que importara `theme.css` se quedaba con `max-w-sm` valiendo 12px en
|
|
301
|
+
* vez de 384px. Nada avisaba: ni el build, ni los tipos, ni Storybook, ni la
|
|
302
|
+
* suite —la librería no usa esas utilidades por dentro—. Se descubrió en
|
|
303
|
+
* producción, con el párrafo de un hero a una palabra por línea.
|
|
304
|
+
*
|
|
305
|
+
* Redeclarar `--container-sm` NO lo arregla: `--spacing-*` gana la resolución.
|
|
306
|
+
* La única salida es que la librería no use esos nombres.
|
|
307
|
+
*
|
|
308
|
+
* El prefijo sigue el patrón que ya tenía `control`: un grupo con nombre propio
|
|
309
|
+
* dentro del espacio `--spacing-*`. `scripts/check-tokens-namespace.mjs` impide
|
|
310
|
+
* la recaída.
|
|
311
|
+
*
|
|
312
|
+
* `section` no lleva prefijo porque no choca con nada de Tailwind.
|
|
313
|
+
*/
|
|
292
314
|
declare const spacing: {
|
|
293
|
-
readonly
|
|
294
|
-
readonly
|
|
295
|
-
readonly
|
|
296
|
-
readonly
|
|
297
|
-
readonly
|
|
315
|
+
readonly stepXs: 8;
|
|
316
|
+
readonly stepSm: 12;
|
|
317
|
+
readonly stepMd: 16;
|
|
318
|
+
readonly stepLg: 26;
|
|
319
|
+
readonly stepXl: 40;
|
|
298
320
|
readonly section: 96;
|
|
299
321
|
};
|
|
300
322
|
declare const size: {
|
|
@@ -345,6 +367,32 @@ declare const sintaxis: {
|
|
|
345
367
|
/** `markup.deleted`, `invalid`. */
|
|
346
368
|
readonly invalido: "#E15757";
|
|
347
369
|
};
|
|
370
|
+
/**
|
|
371
|
+
* La paleta de series de las gráficas. CUATRO, por el mismo motivo que la de
|
|
372
|
+
* sintaxis: el sistema se comunica con color y borde, no con ruido cromático.
|
|
373
|
+
*
|
|
374
|
+
* Ninguno es un color nuevo. Son cuatro que ya están en la identidad y que se
|
|
375
|
+
* distinguen por TONO, no por luminosidad —turquesa, naranja, azul y gris—,
|
|
376
|
+
* que es la única forma de que sigan siendo cuatro series para quien no
|
|
377
|
+
* distingue rojo y verde. Elegir bioluz y `success` habría dado dos verdes
|
|
378
|
+
* casi idénticos en modo claro.
|
|
379
|
+
*
|
|
380
|
+
* `brand.body` entra aquí y no en el resaltado por la misma regla vista al
|
|
381
|
+
* derecho: el sistema lo restringe a RELLENO y nunca a texto, y una serie de
|
|
382
|
+
* gráfica es relleno. Es igual en los dos modos porque es color de marca.
|
|
383
|
+
*
|
|
384
|
+
* El umbral que aplica es el de objeto gráfico, 3:1 contra el fondo, no el de
|
|
385
|
+
* texto. Medidos contra `background`, los cuatro lo pasan en los dos modos con
|
|
386
|
+
* margen: el peor es `brand.body` sobre papel, con 3.9:1.
|
|
387
|
+
*
|
|
388
|
+
* Una quinta serie no se añade inventando un tono. Si una gráfica necesita
|
|
389
|
+
* cinco categorías, o sobran categorías o hace falta agrupar en «otros»: ver
|
|
390
|
+
* `docs/decisiones.md`.
|
|
391
|
+
*/
|
|
392
|
+
declare const series: {
|
|
393
|
+
readonly dark: readonly ["#35D6C0", "#F2A65A", "#3E7CB1", "#71919C"];
|
|
394
|
+
readonly light: readonly ["#0D7C6F", "#A65B27", "#3E7CB1", "#626A75"];
|
|
395
|
+
};
|
|
348
396
|
declare const gradient: {
|
|
349
397
|
readonly dark: {
|
|
350
398
|
readonly hero: "linear-gradient(160deg, #091319 60%, #0D2129 100%)";
|
|
@@ -401,6 +449,8 @@ type GradientToken = keyof typeof gradient.dark;
|
|
|
401
449
|
type SintaxisToken = keyof typeof sintaxis;
|
|
402
450
|
type SpacingToken = keyof typeof spacing;
|
|
403
451
|
type SizeToken = keyof typeof size;
|
|
452
|
+
/** El índice de una serie de gráfica: 0, 1, 2 o 3. */
|
|
453
|
+
type SeriesToken = 0 | 1 | 2 | 3;
|
|
404
454
|
|
|
405
455
|
/**
|
|
406
456
|
* Punto de entrada de `@eduardoalvarez/arrecife/tokens`.
|
|
@@ -567,11 +617,11 @@ declare const tokens: {
|
|
|
567
617
|
readonly icon: 42;
|
|
568
618
|
};
|
|
569
619
|
readonly spacing: {
|
|
570
|
-
readonly
|
|
571
|
-
readonly
|
|
572
|
-
readonly
|
|
573
|
-
readonly
|
|
574
|
-
readonly
|
|
620
|
+
readonly stepXs: 8;
|
|
621
|
+
readonly stepSm: 12;
|
|
622
|
+
readonly stepMd: 16;
|
|
623
|
+
readonly stepLg: 26;
|
|
624
|
+
readonly stepXl: 40;
|
|
575
625
|
readonly section: 96;
|
|
576
626
|
};
|
|
577
627
|
readonly size: {
|
|
@@ -599,6 +649,10 @@ declare const tokens: {
|
|
|
599
649
|
readonly comentario: "#71919C";
|
|
600
650
|
readonly invalido: "#E15757";
|
|
601
651
|
};
|
|
652
|
+
readonly series: {
|
|
653
|
+
readonly dark: readonly ["#35D6C0", "#F2A65A", "#3E7CB1", "#71919C"];
|
|
654
|
+
readonly light: readonly ["#0D7C6F", "#A65B27", "#3E7CB1", "#626A75"];
|
|
655
|
+
};
|
|
602
656
|
readonly shadow: {
|
|
603
657
|
readonly standard: "0 1px 2px rgba(0, 0, 0, 0.35)";
|
|
604
658
|
};
|
|
@@ -620,4 +674,4 @@ declare const tokens: {
|
|
|
620
674
|
};
|
|
621
675
|
type Tokens = typeof tokens;
|
|
622
676
|
|
|
623
|
-
export { type BrandToken, type ColorMode, type ColorToken, type ControlToken, type FontToken, type GradientToken, type RadiusToken, type SintaxisToken, type SizeToken, type SpacingToken, type Tokens, type TypeScaleToken, brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, shadow, sintaxis, size, spacing, tagline, tokens, typeScale };
|
|
677
|
+
export { type BrandToken, type ColorMode, type ColorToken, type ControlToken, type FontToken, type GradientToken, type RadiusToken, type SeriesToken, type SintaxisToken, type SizeToken, type SpacingToken, type Tokens, type TypeScaleToken, brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, sintaxis, size, spacing, tagline, tokens, typeScale };
|
package/dist/tokens/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { tokens } from '../chunk-
|
|
2
|
-
export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, shadow, sintaxis, size, spacing, tagline, typeScale } from '../chunk-
|
|
1
|
+
export { tokens } from '../chunk-VPT32GPG.js';
|
|
2
|
+
export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, sintaxis, size, spacing, tagline, typeScale } from '../chunk-TSPJOM6K.js';
|
|
3
|
+
import '../chunk-MLKGABMK.js';
|