@eduardoalvarez/arrecife 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +868 -467
  3. package/dist/brand/index.cjs +112 -95
  4. package/dist/brand/index.d.cts +40 -39
  5. package/dist/brand/index.d.ts +40 -39
  6. package/dist/brand/index.js +5 -4
  7. package/dist/catalog-D13txprv.d.cts +78 -0
  8. package/dist/catalog-D13txprv.d.ts +78 -0
  9. package/dist/chart/index.cjs +100 -83
  10. package/dist/chart/index.d.cts +66 -66
  11. package/dist/chart/index.d.ts +66 -66
  12. package/dist/chart/index.js +14 -12
  13. package/dist/chunk-2WPWEIMD.js +27 -0
  14. package/dist/chunk-45HVCTB7.js +70 -0
  15. package/dist/{chunk-ZEOQKRQ7.js → chunk-727HCBD4.js} +1 -1
  16. package/dist/chunk-CKRSQPTX.js +36 -0
  17. package/dist/chunk-E6KFUSKB.js +144 -0
  18. package/dist/chunk-GCRII2KQ.js +86 -0
  19. package/dist/{chunk-YZ2SDOVZ.js → chunk-JN3IS5OS.js} +30 -30
  20. package/dist/chunk-ODBFN44D.js +45 -0
  21. package/dist/chunk-OMKSESQB.js +300 -0
  22. package/dist/{chunk-VPT32GPG.js → chunk-TA7TLWW4.js} +2 -2
  23. package/dist/chunk-WGNIRIN7.js +42 -0
  24. package/dist/doctor.mjs +166 -0
  25. package/dist/form/index.cjs +109 -92
  26. package/dist/form/index.d.cts +43 -42
  27. package/dist/form/index.d.ts +43 -42
  28. package/dist/form/index.js +25 -23
  29. package/dist/icons/index.cjs +149 -0
  30. package/dist/icons/index.d.cts +94 -0
  31. package/dist/icons/index.d.ts +94 -0
  32. package/dist/icons/index.js +28 -0
  33. package/dist/index-DlAO2JZs.d.cts +47 -0
  34. package/dist/index-DlAO2JZs.d.ts +47 -0
  35. package/dist/index.cjs +1292 -983
  36. package/dist/index.d.cts +927 -806
  37. package/dist/index.d.ts +927 -806
  38. package/dist/index.js +809 -778
  39. package/dist/{label-DuTvJGxD.d.ts → label-MgHFKnFy.d.cts} +3 -3
  40. package/dist/{label-DuTvJGxD.d.cts → label-MgHFKnFy.d.ts} +3 -3
  41. package/dist/og/index.cjs +133 -132
  42. package/dist/og/index.d.cts +93 -89
  43. package/dist/og/index.d.ts +93 -89
  44. package/dist/og/index.js +106 -106
  45. package/dist/shiki/index.cjs +28 -30
  46. package/dist/shiki/index.d.cts +4 -4
  47. package/dist/shiki/index.d.ts +4 -4
  48. package/dist/shiki/index.js +12 -12
  49. package/dist/social/index.cjs +67 -0
  50. package/dist/social/index.d.cts +2 -0
  51. package/dist/social/index.d.ts +2 -0
  52. package/dist/social/index.js +2 -0
  53. package/dist/theme/index.cjs +97 -0
  54. package/dist/theme/index.d.cts +144 -0
  55. package/dist/theme/index.d.ts +144 -0
  56. package/dist/theme/index.js +2 -0
  57. package/dist/tokens/index.cjs +159 -88
  58. package/dist/tokens/index.d.cts +277 -165
  59. package/dist/tokens/index.d.ts +277 -165
  60. package/dist/tokens/index.js +2 -2
  61. package/dist/tokens/theme.css +165 -100
  62. package/dist/variants/index.cjs +195 -0
  63. package/dist/variants/index.d.cts +195 -0
  64. package/dist/variants/index.d.ts +195 -0
  65. package/dist/variants/index.js +3 -0
  66. package/llms.txt +1145 -746
  67. package/package.json +42 -11
  68. package/dist/catalogo-Du5ID-Hi.d.cts +0 -77
  69. package/dist/catalogo-Du5ID-Hi.d.ts +0 -77
  70. package/dist/chunk-E3OMP2DL.js +0 -36
  71. package/dist/chunk-KPZNNMV5.js +0 -83
  72. package/dist/chunk-NHS7ETKJ.js +0 -27
  73. package/dist/chunk-TSPJOM6K.js +0 -229
  74. package/dist/chunk-UOWIDFCB.js +0 -81
  75. package/dist/tema/index.cjs +0 -94
  76. package/dist/tema/index.d.cts +0 -110
  77. package/dist/tema/index.d.ts +0 -110
  78. package/dist/tema/index.js +0 -2
@@ -1,81 +0,0 @@
1
- import { cn } from './chunk-NHS7ETKJ.js';
2
- import { Slot } from '@radix-ui/react-slot';
3
- import { cva } from 'class-variance-authority';
4
- import { jsx } from 'react/jsx-runtime';
5
-
6
- var ETIQUETA = {
7
- display: "h1",
8
- stat: "p",
9
- h1: "h1",
10
- h2: "h2",
11
- h3: "h3",
12
- body: "p",
13
- lead: "p",
14
- ui: "p",
15
- label: "span",
16
- tag: "span",
17
- meta: "p",
18
- chip: "span",
19
- eyebrow: "p"
20
- };
21
- var texto = cva("", {
22
- variants: {
23
- variant: {
24
- display: "text-display font-display",
25
- // Métricas grandes: 46px de display. Es la única escala pensada para un
26
- // número, y por eso el interlineado es 1.
27
- stat: "text-stat font-display",
28
- h1: "text-h1 font-display",
29
- h2: "text-h2 font-display",
30
- h3: "text-h3 font-display",
31
- body: "text-body font-sans",
32
- // 17px: la bajada de las páginas internas y el botón grande.
33
- lead: "text-lead font-sans",
34
- ui: "text-ui font-sans",
35
- label: "text-label font-sans",
36
- // Las dos escalas de etiqueta. `tag` es el estado (sans 12.5/500) y `chip`
37
- // la categoría y la métrica (mono 11.5). Ninguna transforma el texto.
38
- tag: "text-tag font-sans",
39
- chip: "text-chip font-mono",
40
- // Mono SIN transformar: fechas, rutas, versiones, nombres de archivo y la
41
- // firma del footer. Es el escalón que faltaba, y por el que cada sitio de
42
- // uso terminaba escribiendo `variant="eyebrow" className="normal-case"`.
43
- meta: "text-meta font-mono",
44
- // `uppercase` no cabe en un token de tamaño: text-transform no es un
45
- // modificador de --text-*. Por eso lo pone la variante y no theme.css.
46
- eyebrow: "text-eyebrow font-mono uppercase"
47
- },
48
- tone: {
49
- primary: "text-text-primary",
50
- secondary: "text-text-secondary",
51
- muted: "text-text-muted",
52
- accent: "text-accent",
53
- warm: "text-warm",
54
- success: "text-success",
55
- warning: "text-warning",
56
- error: "text-error"
57
- }
58
- },
59
- defaultVariants: { variant: "body", tone: "primary" }
60
- });
61
- function Text({
62
- className,
63
- variant,
64
- tone,
65
- as,
66
- asChild = false,
67
- measure,
68
- children,
69
- ...props
70
- }) {
71
- const escala = variant ?? "body";
72
- const limitar = measure ?? escala === "body";
73
- const clases = cn(texto({ variant, tone }), limitar && "max-w-measure", className);
74
- if (asChild) {
75
- return /* @__PURE__ */ jsx(Slot, { className: clases, ...props, children });
76
- }
77
- const Etiqueta = as ?? ETIQUETA[escala];
78
- return /* @__PURE__ */ jsx(Etiqueta, { className: clases, ...props, children });
79
- }
80
-
81
- export { Text, texto };
@@ -1,94 +0,0 @@
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;
@@ -1,110 +0,0 @@
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 };
@@ -1,110 +0,0 @@
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 };
@@ -1,2 +0,0 @@
1
- export { TEMA_ATRIBUTO, TEMA_CLAVE, TEMA_EVENTO, alternarTema, aplicarTema, escucharTema, scriptTema, temaActual, temaGuardado, temaPreferido } from '../chunk-KPZNNMV5.js';
2
- import '../chunk-MLKGABMK.js';