@eduardoalvarez/arrecife 0.5.0 → 0.6.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 (66) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +706 -470
  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-25YNFCIF.js +141 -0
  14. package/dist/{chunk-YZ2SDOVZ.js → chunk-6O3KWB6P.js} +30 -30
  15. package/dist/chunk-CKRSQPTX.js +36 -0
  16. package/dist/{chunk-ZEOQKRQ7.js → chunk-DKCN7BAL.js} +1 -1
  17. package/dist/chunk-GCRII2KQ.js +86 -0
  18. package/dist/chunk-JMOOFZ3B.js +42 -0
  19. package/dist/chunk-O4TAH7YJ.js +276 -0
  20. package/dist/chunk-ODBFN44D.js +45 -0
  21. package/dist/{chunk-VPT32GPG.js → chunk-PMN7NR3G.js} +2 -2
  22. package/dist/chunk-XKYHTOUJ.js +27 -0
  23. package/dist/form/index.cjs +109 -92
  24. package/dist/form/index.d.cts +43 -42
  25. package/dist/form/index.d.ts +43 -42
  26. package/dist/form/index.js +25 -23
  27. package/dist/index.cjs +1068 -929
  28. package/dist/index.d.cts +770 -773
  29. package/dist/index.d.ts +770 -773
  30. package/dist/index.js +629 -675
  31. package/dist/{label-DuTvJGxD.d.ts → label-MgHFKnFy.d.cts} +3 -3
  32. package/dist/{label-DuTvJGxD.d.cts → label-MgHFKnFy.d.ts} +3 -3
  33. package/dist/og/index.cjs +130 -130
  34. package/dist/og/index.d.cts +93 -89
  35. package/dist/og/index.d.ts +93 -89
  36. package/dist/og/index.js +106 -106
  37. package/dist/shiki/index.cjs +28 -30
  38. package/dist/shiki/index.d.cts +4 -4
  39. package/dist/shiki/index.d.ts +4 -4
  40. package/dist/shiki/index.js +12 -12
  41. package/dist/theme/index.cjs +97 -0
  42. package/dist/theme/index.d.cts +144 -0
  43. package/dist/theme/index.d.ts +144 -0
  44. package/dist/theme/index.js +2 -0
  45. package/dist/tokens/index.cjs +133 -86
  46. package/dist/tokens/index.d.cts +246 -161
  47. package/dist/tokens/index.d.ts +246 -161
  48. package/dist/tokens/index.js +2 -2
  49. package/dist/tokens/theme.css +133 -98
  50. package/dist/variants/index.cjs +192 -0
  51. package/dist/variants/index.d.cts +192 -0
  52. package/dist/variants/index.d.ts +192 -0
  53. package/dist/variants/index.js +3 -0
  54. package/llms.txt +810 -744
  55. package/package.json +20 -11
  56. package/dist/catalogo-Du5ID-Hi.d.cts +0 -77
  57. package/dist/catalogo-Du5ID-Hi.d.ts +0 -77
  58. package/dist/chunk-E3OMP2DL.js +0 -36
  59. package/dist/chunk-KPZNNMV5.js +0 -83
  60. package/dist/chunk-NHS7ETKJ.js +0 -27
  61. package/dist/chunk-TSPJOM6K.js +0 -229
  62. package/dist/chunk-UOWIDFCB.js +0 -81
  63. package/dist/tema/index.cjs +0 -94
  64. package/dist/tema/index.d.cts +0 -110
  65. package/dist/tema/index.d.ts +0 -110
  66. package/dist/tema/index.js +0 -2
@@ -1,11 +1,12 @@
1
+ 'use client';
1
2
  'use strict';
2
3
 
3
4
  var clsx = require('clsx');
4
5
  var tailwindMerge = require('tailwind-merge');
5
6
  var jsxRuntime = require('react/jsx-runtime');
6
7
 
7
- // src/brand/catalogo.ts
8
- var caras = {
8
+ // src/brand/catalog.ts
9
+ var faces = {
9
10
  annoyed: "face-annoyed.png",
10
11
  confused: "face-confused.png",
11
12
  hearts: "face-hearts.png",
@@ -20,76 +21,76 @@ var poses = {
20
21
  peek: "pose-peek.png",
21
22
  surf: "pose-surf.png"
22
23
  };
23
- var aletas = {
24
- /** Dos azules. Para fondos claros. */
24
+ var fins = {
25
+ /** Two blues. For light backgrounds. */
25
26
  color: "fin.png",
26
- /** Silueta a una tinta. Para fondos oscuros. */
27
- espuma: "fin-foam.png"
27
+ /** Single-ink silhouette. For dark backgrounds. */
28
+ foam: "fin-foam.png"
28
29
  };
29
- var usoDeCara = {
30
- wink: "Formularios, nota al pie amable",
31
- waiting: "Sin resultados, estado de espera",
32
- laughing: "\xC9xito, suscripci\xF3n confirmada",
33
- shades: "M\xF3dulo o curso completado",
34
- hearts: "Agradecimiento, OG de art\xEDculo",
35
- confused: "404, p\xE1gina no encontrada",
36
- annoyed: "Error del servidor, fallo de build"
30
+ var faceUsage = {
31
+ wink: "Forms, a friendly footnote",
32
+ waiting: "No results, waiting state",
33
+ laughing: "Success, subscription confirmed",
34
+ shades: "Module or course completed",
35
+ hearts: "Gratitude, article OG",
36
+ confused: "404, page not found",
37
+ annoyed: "Server error, build failure"
37
38
  };
38
- var RUTA_ASSETS = "/brand";
39
- var listaCaras = Object.keys(caras);
40
- var listaPoses = Object.keys(poses);
39
+ var ASSETS_PATH = "/brand";
40
+ var faceList = Object.keys(faces);
41
+ var poseList = Object.keys(poses);
41
42
  var typeScale = {
42
43
  display: { family: "display", size: 76, lineHeight: 0.96, weight: 800, tracking: "-0.035em" },
43
- /** Métricas grandes. Números, no prosa: interlineado 1 y sin descendentes. */
44
+ /** Large metrics. Numbers, not prose: line height 1 and no descenders. */
44
45
  stat: { family: "display", size: 46, lineHeight: 1, weight: 800, tracking: "-0.035em" },
45
46
  h1: { family: "display", size: 44, lineHeight: 1.05, weight: 700, tracking: "-0.03em" },
46
47
  h2: { family: "display", size: 30, lineHeight: 1.1, weight: 600, tracking: "-0.02em" },
47
48
  h3: { family: "display", size: 25, lineHeight: 1.15, weight: 600, tracking: "-0.02em" },
48
49
  body: { family: "sans", size: 18, lineHeight: 1.75, weight: 400 },
49
50
  /**
50
- * 17px. El botón grande y la bajada de las páginas internas.
51
+ * 17px. The large button, and the deck on interior pages.
51
52
  *
52
- * Entra como escalón propio porque el documento lo usa DOS veces y en piezas
53
- * distintas: «lg 15px 30px r12» con texto de 17, y «h1 44/700 · bajada 17px ·
54
- * párrafo de contexto 15px». Un solo uso no habría justificado partir la
55
- * distancia entre `ui` (15) y `body` (18); dos sí.
53
+ * It earns its own step because the identity document uses it TWICE, in two
54
+ * different pieces: «lg 15/30 r12» with 17px text, and «h1 44/700 · deck 17px
55
+ * · context paragraph 15px». One use would not have justified splitting the
56
+ * gap between `ui` (15) and `body` (18); two did.
56
57
  */
57
58
  lead: { family: "sans", size: 17, lineHeight: 1.5, weight: 400 },
58
59
  ui: { family: "sans", size: 15, lineHeight: 1.6, weight: 400 },
59
60
  label: { family: "sans", size: 13, lineHeight: 1.5, weight: 500 },
60
61
  /**
61
- * La escala de las etiquetas de estado: sans 12.5/500, cuadrada.
62
+ * The status-badge scale: sans 12.5/500, squared off.
62
63
  *
63
- * Es medio píxel por debajo de `label`, y esta vez el medio píxel sí importa:
64
- * una etiqueta de estado va dentro de una tabla o al lado de un título, y a 13
65
- * competía con el texto que acompaña. El documento la da en 12.5 y se ve.
64
+ * That is half a pixel below `label`, and this time the half pixel matters: a
65
+ * status badge sits inside a table or next to a title, and at 13 it competed
66
+ * with the text it accompanies. The document specifies 12.5 and it shows.
66
67
  */
67
68
  tag: { family: "sans", size: 12.5, lineHeight: 1.4, weight: 500 },
68
69
  /**
69
- * La escala de categoría y métrica: mono 11.5.
70
+ * The category and metric scale: mono 11.5.
70
71
  *
71
- * Rompe el suelo de `limits.minScreenPx`, y es a propósito. Ese suelo protege
72
- * al TEXTO —lo que se lee en una frase—, y una píldora de una palabra no es
73
- * texto corrido: es una marca. El contraste sigue medido y pasa AA (plancton
74
- * 5.57:1 sobre abismo), que es la parte que no se negocia.
72
+ * It breaks the floor set by `limits.minScreenPx`, deliberately. That floor
73
+ * protects TEXT — what you read in a sentence — and a one-word pill is not
74
+ * running text: it is a mark. Contrast is still measured and still passes AA
75
+ * (plankton 5.57:1 over abyss), which is the part that is not negotiable.
75
76
  *
76
- * A 13 las tres familias de etiqueta salían del tamaño de un botón pequeño y
77
- * pesaban más que el título que acompañan. Ver `docs/decisiones.md`.
77
+ * At 13 the three badge families grew past the size of a small button and
78
+ * outweighed the title they accompany. See `docs/decisions.md`.
78
79
  */
79
80
  chip: { family: "mono", size: 11.5, lineHeight: 1.4, weight: 400 },
80
81
  /**
81
- * Mono SIN transformar: fechas, rutas, versiones, nombres de archivo, la firma
82
- * del footer y las métricas de etiqueta. Es la mayoría del mono del sistema.
82
+ * Mono with NO transform: dates, paths, versions, file names, the footer
83
+ * signature and metric labels. It is most of the mono in the system.
83
84
  *
84
- * Existe porque `eyebrow` lleva `uppercase` de fábrica y no es una preferencia
85
- * que se pueda apagar: es la escala del eyebrow. Un `18 ago 2026` en versalitas
86
- * o un `pose-laptop-coffee.png` en mayúsculas están mal, y sin este escalón la
87
- * única salida era un `normal-case` en cada sitio de uso.
85
+ * It exists because `eyebrow` ships `uppercase` and that is not a preference
86
+ * you can switch off: it IS the eyebrow scale. An `18 Aug 2026` in small caps
87
+ * or a `pose-laptop-coffee.png` in all caps are wrong, and without this step
88
+ * the only way out was a `normal-case` at every call site.
88
89
  *
89
- * El documento dice 12.5. Son 13 por la misma razón por la que `textMuted` se
90
- * corrigió: `limits.minScreenPx` es 13 y plancton «nunca bajo 13px». Esta
91
- * escala es justo donde se escriben las metas en muted, así que ponerla en
92
- * 12.5 habría dejado ilegible su uso más común por medio píxel.
90
+ * The document says 12.5. This is 13 for the same reason `textMuted` was
91
+ * corrected: `limits.minScreenPx` is 13 and plankton is «never under 13px».
92
+ * This scale is exactly where muted metadata gets written, so putting it at
93
+ * 12.5 would have made its most common use illegible by half a pixel.
93
94
  */
94
95
  meta: { family: "mono", size: 13, lineHeight: 1.6, weight: 400 },
95
96
  eyebrow: { family: "mono", size: 12, tracking: "0.12em", transform: "uppercase" }
@@ -105,8 +106,24 @@ var control = {
105
106
  sm: 14,
106
107
  md: 22,
107
108
  lg: 30,
108
- /** Botón de icono: cuadrado, sin texto. */
109
- icon: 42
109
+ /** Icon button: square, no text. */
110
+ icon: 42,
111
+ /**
112
+ * The dense icon button, 32×32.
113
+ *
114
+ * 42 is the right measure for a control you hit with a thumb, and the four
115
+ * reading sites are where that fits. `cursos` is the odd one out: it is the
116
+ * only admin app of the set, with three actions per table row, and at 42 the
117
+ * row grows with them — the original used 24 and 28.
118
+ *
119
+ * It is 32 and not 28 because 32 is `sm`'s height. A dense icon button lines
120
+ * up with a small text button, so a toolbar mixing the two stays on one
121
+ * baseline; 28 would have been a fifth height that matches nothing.
122
+ *
123
+ * It does not replace `icon`. A page's primary action stays at 42; this is for
124
+ * a row of a table. See `docs/decisions.md` § 22.
125
+ */
126
+ iconSm: 32
110
127
  };
111
128
  var spacing = {
112
129
  stepXs: 8,
@@ -117,45 +134,45 @@ var spacing = {
117
134
  section: 96
118
135
  };
119
136
  var tagline = {
120
- /** Header, una línea. */
121
- corto: "Ayudo a equipos a escalar con criterio"};
137
+ /** Header, one line. */
138
+ short: "Ayudo a equipos a escalar con criterio"};
122
139
  var naming = {
123
140
  wordmark: "Eduardo \xC1lvarez"};
124
141
 
125
142
  // src/lib/cn.ts
126
- var kebab = (nombre) => nombre.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
127
- var escalas = Object.keys(typeScale);
128
- var radios = Object.keys(radius);
129
- var espacios = Object.keys(spacing).map(kebab);
130
- var controles = Object.keys(control).map((nombre) => `control-${kebab(nombre)}`);
143
+ var kebab = (name) => name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
144
+ var scales = Object.keys(typeScale);
145
+ var radii = Object.keys(radius);
146
+ var namespaces = Object.keys(spacing).map(kebab);
147
+ var controls = Object.keys(control).map((name) => `control-${kebab(name)}`);
131
148
  var twMerge = tailwindMerge.extendTailwindMerge({
132
149
  extend: {
133
150
  classGroups: {
134
- "font-size": [{ text: escalas }],
135
- rounded: [{ rounded: radios }],
136
- p: [{ p: espacios }],
137
- px: [{ px: [...espacios, ...controles] }],
138
- py: [{ py: espacios }],
139
- gap: [{ gap: espacios }],
140
- size: [{ size: controles }]
151
+ "font-size": [{ text: scales }],
152
+ rounded: [{ rounded: radii }],
153
+ p: [{ p: namespaces }],
154
+ px: [{ px: [...namespaces, ...controls] }],
155
+ py: [{ py: namespaces }],
156
+ gap: [{ gap: namespaces }],
157
+ size: [{ size: controls }]
141
158
  }
142
159
  }
143
160
  });
144
161
  function cn(...inputs) {
145
162
  return twMerge(clsx.clsx(inputs));
146
163
  }
147
- function Isotipo({
148
- sobre = "oscuro",
149
- basePath = RUTA_ASSETS,
164
+ function Isotype({
165
+ background = "dark",
166
+ basePath = ASSETS_PATH,
150
167
  alt = "",
151
168
  className,
152
169
  ...props
153
170
  }) {
154
- const archivo = sobre === "oscuro" ? aletas.espuma : aletas.color;
171
+ const file = background === "dark" ? fins.foam : fins.color;
155
172
  return /* @__PURE__ */ jsxRuntime.jsx(
156
173
  "img",
157
174
  {
158
- src: `${basePath}/${archivo}`,
175
+ src: `${basePath}/${file}`,
159
176
  alt,
160
177
  width: 147,
161
178
  height: 111,
@@ -165,44 +182,44 @@ function Isotipo({
165
182
  );
166
183
  }
167
184
  function Logo({
168
- sobre = "oscuro",
169
- basePath = RUTA_ASSETS,
170
- soloIsotipo = false,
171
- conLema = false,
185
+ background = "dark",
186
+ basePath = ASSETS_PATH,
187
+ isotypeOnly = false,
188
+ withTagline = false,
172
189
  className,
173
190
  ...props
174
191
  }) {
175
- const conAleta = /* @__PURE__ */ jsxRuntime.jsx(
176
- Isotipo,
192
+ const withFin = /* @__PURE__ */ jsxRuntime.jsx(
193
+ Isotype,
177
194
  {
178
- sobre,
195
+ background,
179
196
  basePath,
180
- alt: soloIsotipo ? naming.wordmark : "",
181
- className: conLema ? "h-9 w-auto" : "h-7 w-auto"
197
+ alt: isotypeOnly ? naming.wordmark : "",
198
+ className: withTagline ? "h-9 w-auto" : "h-7 w-auto"
182
199
  }
183
200
  );
184
201
  const wordmark = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark });
185
- if (soloIsotipo) {
186
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: conAleta });
202
+ if (isotypeOnly) {
203
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: withFin });
187
204
  }
188
- if (conLema) {
205
+ if (withTagline) {
189
206
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-sm inline-flex items-center", className), ...props, children: [
190
- conAleta,
207
+ withFin,
191
208
  /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "bg-hairline h-8 w-px shrink-0" }),
192
209
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
193
210
  wordmark,
194
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.corto })
211
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.short })
195
212
  ] })
196
213
  ] });
197
214
  }
198
215
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
199
- conAleta,
216
+ withFin,
200
217
  wordmark
201
218
  ] });
202
219
  }
203
- function Mascota({
220
+ function Mascot({
204
221
  pose,
205
- basePath = RUTA_ASSETS,
222
+ basePath = ASSETS_PATH,
206
223
  alt = "",
207
224
  className,
208
225
  ...props
@@ -217,9 +234,9 @@ function Mascota({
217
234
  }
218
235
  );
219
236
  }
220
- function CaraDeMascota({
221
- expresion,
222
- basePath = RUTA_ASSETS,
237
+ function MascotFace({
238
+ expression,
239
+ basePath = ASSETS_PATH,
223
240
  alt = "",
224
241
  className,
225
242
  ...props
@@ -227,7 +244,7 @@ function CaraDeMascota({
227
244
  return /* @__PURE__ */ jsxRuntime.jsx(
228
245
  "img",
229
246
  {
230
- src: `${basePath}/${caras[expresion]}`,
247
+ src: `${basePath}/${faces[expression]}`,
231
248
  alt,
232
249
  className: cn("h-auto w-full max-w-24 select-none", className),
233
250
  ...props
@@ -235,14 +252,14 @@ function CaraDeMascota({
235
252
  );
236
253
  }
237
254
 
238
- exports.CaraDeMascota = CaraDeMascota;
239
- exports.Isotipo = Isotipo;
255
+ exports.ASSETS_PATH = ASSETS_PATH;
256
+ exports.Isotype = Isotype;
240
257
  exports.Logo = Logo;
241
- exports.Mascota = Mascota;
242
- exports.RUTA_ASSETS = RUTA_ASSETS;
243
- exports.aletas = aletas;
244
- exports.caras = caras;
245
- exports.listaCaras = listaCaras;
246
- exports.listaPoses = listaPoses;
258
+ exports.Mascot = Mascot;
259
+ exports.MascotFace = MascotFace;
260
+ exports.faceList = faceList;
261
+ exports.faceUsage = faceUsage;
262
+ exports.faces = faces;
263
+ exports.fins = fins;
264
+ exports.poseList = poseList;
247
265
  exports.poses = poses;
248
- exports.usoDeCara = usoDeCara;
@@ -1,71 +1,72 @@
1
- import { F as Fondo, C as Cara, P as Pose } from '../catalogo-Du5ID-Hi.cjs';
2
- export { A as Aleta, R as RUTA_ASSETS, a as aletas, c as caras, l as listaCaras, b as listaPoses, p as poses, u as usoDeCara } from '../catalogo-Du5ID-Hi.cjs';
1
+ import { B as Background, P as Pose, F as Face } from '../catalog-D13txprv.cjs';
2
+ export { A as ASSETS_PATH, a as Fin, f as faceList, b as faceUsage, c as faces, d as fins, p as poseList, e as poses } from '../catalog-D13txprv.cjs';
3
3
  import * as react from 'react';
4
4
  import { ComponentPropsWithoutRef } from 'react';
5
5
 
6
- type IsotipoProps = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
6
+ type IsotypeProps = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
7
7
  /**
8
- * Sobre qué fondo se monta. Es obligatorio decidirlo, aunque tenga default:
9
- * el cuerpo de la aleta es casi negro, así que la variante de dos azules
10
- * desaparece sobre abismo. Al ser una prop, la regla deja de ser algo que
11
- * recordar.
8
+ * Which background it sits on. Deciding is mandatory even though it has a
9
+ * default: the fin's body is nearly black, so the two-blue variant disappears
10
+ * over abyss. Being a prop, the rule stops being something to remember.
12
11
  */
13
- sobre?: Fondo | undefined;
12
+ background?: Background | undefined;
14
13
  basePath?: string | undefined;
15
- /** Texto alternativo. Vacío cuando el isotipo acompaña a un texto que ya lo nombra. */
14
+ /** Alt text. Empty when the isotype accompanies text that already names it. */
16
15
  alt?: string | undefined;
17
16
  };
18
- declare function Isotipo({ sobre, basePath, alt, className, ...props }: IsotipoProps): react.JSX.Element;
17
+ declare function Isotype({ background, basePath, alt, className, ...props }: IsotypeProps): react.JSX.Element;
19
18
 
20
19
  type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
21
- sobre?: Fondo | undefined;
20
+ background?: Background | undefined;
22
21
  basePath?: string | undefined;
23
- /** Oculta el wordmark y deja solo la aleta, para barras muy estrechas. */
24
- soloIsotipo?: boolean | undefined;
22
+ /** Hides the wordmark and leaves only the fin, for very narrow bars. */
23
+ isotypeOnly?: boolean | undefined;
25
24
  /**
26
- * Añade el lema bajo el wordmark, separado de la aleta por una divisoria.
25
+ * Adds the tagline under the wordmark, separated from the fin by a divider.
27
26
  *
28
- * Es la forma que toma la marca en la barra del sitio. El texto sale de
29
- * `tagline.corto` y no se puede pasar por prop, por lo mismo que el wordmark:
30
- * un lema escrito a mano en cinco proyectos son cinco lemas en seis meses.
27
+ * It is the shape the brand takes in the site's bar. The text comes from
28
+ * `tagline.short` and cannot be passed as a prop, for the same reason as the
29
+ * wordmark: a tagline hand-written across five projects is five taglines in
30
+ * six months.
31
31
  */
32
- conLema?: boolean | undefined;
32
+ withTagline?: boolean | undefined;
33
33
  };
34
34
  /**
35
- * El wordmark sale de `naming.wordmark`, no de una cadena escrita a mano, y
36
- * siempre dice «Eduardo Álvarez». La mascota se llama Tiburoncín y no aparece
37
- * escrita dentro del logo: no hay ninguna prop que permita cambiar el texto.
35
+ * The wordmark comes from `naming.wordmark`, not from a hand-written string, and
36
+ * it always reads «Eduardo Álvarez». The mascot is called Tiburoncín and its
37
+ * name never appears inside the logo: there is no prop that changes the text.
38
38
  *
39
- * Cuando se oculta el wordmark, el nombre sigue llegando al lector de pantalla
40
- * por el `alt` del isotipo. Un logo sin nombre accesible es un logo invisible.
39
+ * When the wordmark is hidden, the name still reaches the screen reader through
40
+ * the isotype's `alt`. A logo with no accessible name is an invisible logo.
41
41
  */
42
- declare function Logo({ sobre, basePath, soloIsotipo, conLema, className, ...props }: LogoProps): react.JSX.Element;
42
+ declare function Logo({ background, basePath, isotypeOnly, withTagline, className, ...props }: LogoProps): react.JSX.Element;
43
43
 
44
44
  type Base = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
45
45
  basePath?: string | undefined;
46
46
  /**
47
- * Texto alternativo. Vacío por defecto: la mascota es ilustración y el texto
48
- * que la acompaña ya dice lo que hay que saber. Se rellena solo cuando la
49
- * imagen aporta información que no está escrita al lado.
47
+ * Alt text. Empty by default: the mascot is illustration and the text beside
48
+ * it already says what there is to know. Fill it in only when the image
49
+ * carries information that is not written next to it.
50
50
  */
51
51
  alt?: string | undefined;
52
52
  };
53
- type MascotaProps = Base & {
53
+ type MascotProps = Base & {
54
54
  pose: Pose;
55
55
  };
56
- /** Tiburoncín de cuerpo entero. */
57
- declare function Mascota({ pose, basePath, alt, className, ...props }: MascotaProps): react.JSX.Element;
58
- type CaraDeMascotaProps = Base & {
59
- expresion: Cara;
56
+ /** Full-body Tiburoncín. */
57
+ declare function Mascot({ pose, basePath, alt, className, ...props }: MascotProps): react.JSX.Element;
58
+ type MascotFaceProps = Base & {
59
+ expression: Face;
60
60
  };
61
61
  /**
62
- * La cabeza de Tiburoncín, con expresión.
62
+ * Tiburoncín's head, with an expression.
63
63
  *
64
- * Las caras van SOLO en estados vacíos, confirmaciones, errores, progreso de
65
- * curso y celebración. Nunca en hero, precios, servicios, contacto ni CV. Por
66
- * eso `EmptyState` recibe una cara y `PageHeader` no: la regla no está escrita
67
- * en una guía que haya que recordar, está en qué componentes la aceptan.
64
+ * Faces go ONLY in empty states, confirmations, errors, course progress and
65
+ * celebration. Never in a hero, pricing, services, contact or CV. That is why
66
+ * `EmptyState` takes a face and `PageHeader` does not: the rule is not written
67
+ * in a guide you have to remember, it is written into which components accept
68
+ * one.
68
69
  */
69
- declare function CaraDeMascota({ expresion, basePath, alt, className, ...props }: CaraDeMascotaProps): react.JSX.Element;
70
+ declare function MascotFace({ expression, basePath, alt, className, ...props }: MascotFaceProps): react.JSX.Element;
70
71
 
71
- export { Cara, CaraDeMascota, type CaraDeMascotaProps, Fondo, Isotipo, type IsotipoProps, Logo, type LogoProps, Mascota, type MascotaProps, Pose };
72
+ export { Background, Face, Isotype, type IsotypeProps, Logo, type LogoProps, Mascot, MascotFace, type MascotFaceProps, type MascotProps, Pose };
@@ -1,71 +1,72 @@
1
- import { F as Fondo, C as Cara, P as Pose } from '../catalogo-Du5ID-Hi.js';
2
- export { A as Aleta, R as RUTA_ASSETS, a as aletas, c as caras, l as listaCaras, b as listaPoses, p as poses, u as usoDeCara } from '../catalogo-Du5ID-Hi.js';
1
+ import { B as Background, P as Pose, F as Face } from '../catalog-D13txprv.js';
2
+ export { A as ASSETS_PATH, a as Fin, f as faceList, b as faceUsage, c as faces, d as fins, p as poseList, e as poses } from '../catalog-D13txprv.js';
3
3
  import * as react from 'react';
4
4
  import { ComponentPropsWithoutRef } from 'react';
5
5
 
6
- type IsotipoProps = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
6
+ type IsotypeProps = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
7
7
  /**
8
- * Sobre qué fondo se monta. Es obligatorio decidirlo, aunque tenga default:
9
- * el cuerpo de la aleta es casi negro, así que la variante de dos azules
10
- * desaparece sobre abismo. Al ser una prop, la regla deja de ser algo que
11
- * recordar.
8
+ * Which background it sits on. Deciding is mandatory even though it has a
9
+ * default: the fin's body is nearly black, so the two-blue variant disappears
10
+ * over abyss. Being a prop, the rule stops being something to remember.
12
11
  */
13
- sobre?: Fondo | undefined;
12
+ background?: Background | undefined;
14
13
  basePath?: string | undefined;
15
- /** Texto alternativo. Vacío cuando el isotipo acompaña a un texto que ya lo nombra. */
14
+ /** Alt text. Empty when the isotype accompanies text that already names it. */
16
15
  alt?: string | undefined;
17
16
  };
18
- declare function Isotipo({ sobre, basePath, alt, className, ...props }: IsotipoProps): react.JSX.Element;
17
+ declare function Isotype({ background, basePath, alt, className, ...props }: IsotypeProps): react.JSX.Element;
19
18
 
20
19
  type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
21
- sobre?: Fondo | undefined;
20
+ background?: Background | undefined;
22
21
  basePath?: string | undefined;
23
- /** Oculta el wordmark y deja solo la aleta, para barras muy estrechas. */
24
- soloIsotipo?: boolean | undefined;
22
+ /** Hides the wordmark and leaves only the fin, for very narrow bars. */
23
+ isotypeOnly?: boolean | undefined;
25
24
  /**
26
- * Añade el lema bajo el wordmark, separado de la aleta por una divisoria.
25
+ * Adds the tagline under the wordmark, separated from the fin by a divider.
27
26
  *
28
- * Es la forma que toma la marca en la barra del sitio. El texto sale de
29
- * `tagline.corto` y no se puede pasar por prop, por lo mismo que el wordmark:
30
- * un lema escrito a mano en cinco proyectos son cinco lemas en seis meses.
27
+ * It is the shape the brand takes in the site's bar. The text comes from
28
+ * `tagline.short` and cannot be passed as a prop, for the same reason as the
29
+ * wordmark: a tagline hand-written across five projects is five taglines in
30
+ * six months.
31
31
  */
32
- conLema?: boolean | undefined;
32
+ withTagline?: boolean | undefined;
33
33
  };
34
34
  /**
35
- * El wordmark sale de `naming.wordmark`, no de una cadena escrita a mano, y
36
- * siempre dice «Eduardo Álvarez». La mascota se llama Tiburoncín y no aparece
37
- * escrita dentro del logo: no hay ninguna prop que permita cambiar el texto.
35
+ * The wordmark comes from `naming.wordmark`, not from a hand-written string, and
36
+ * it always reads «Eduardo Álvarez». The mascot is called Tiburoncín and its
37
+ * name never appears inside the logo: there is no prop that changes the text.
38
38
  *
39
- * Cuando se oculta el wordmark, el nombre sigue llegando al lector de pantalla
40
- * por el `alt` del isotipo. Un logo sin nombre accesible es un logo invisible.
39
+ * When the wordmark is hidden, the name still reaches the screen reader through
40
+ * the isotype's `alt`. A logo with no accessible name is an invisible logo.
41
41
  */
42
- declare function Logo({ sobre, basePath, soloIsotipo, conLema, className, ...props }: LogoProps): react.JSX.Element;
42
+ declare function Logo({ background, basePath, isotypeOnly, withTagline, className, ...props }: LogoProps): react.JSX.Element;
43
43
 
44
44
  type Base = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
45
45
  basePath?: string | undefined;
46
46
  /**
47
- * Texto alternativo. Vacío por defecto: la mascota es ilustración y el texto
48
- * que la acompaña ya dice lo que hay que saber. Se rellena solo cuando la
49
- * imagen aporta información que no está escrita al lado.
47
+ * Alt text. Empty by default: the mascot is illustration and the text beside
48
+ * it already says what there is to know. Fill it in only when the image
49
+ * carries information that is not written next to it.
50
50
  */
51
51
  alt?: string | undefined;
52
52
  };
53
- type MascotaProps = Base & {
53
+ type MascotProps = Base & {
54
54
  pose: Pose;
55
55
  };
56
- /** Tiburoncín de cuerpo entero. */
57
- declare function Mascota({ pose, basePath, alt, className, ...props }: MascotaProps): react.JSX.Element;
58
- type CaraDeMascotaProps = Base & {
59
- expresion: Cara;
56
+ /** Full-body Tiburoncín. */
57
+ declare function Mascot({ pose, basePath, alt, className, ...props }: MascotProps): react.JSX.Element;
58
+ type MascotFaceProps = Base & {
59
+ expression: Face;
60
60
  };
61
61
  /**
62
- * La cabeza de Tiburoncín, con expresión.
62
+ * Tiburoncín's head, with an expression.
63
63
  *
64
- * Las caras van SOLO en estados vacíos, confirmaciones, errores, progreso de
65
- * curso y celebración. Nunca en hero, precios, servicios, contacto ni CV. Por
66
- * eso `EmptyState` recibe una cara y `PageHeader` no: la regla no está escrita
67
- * en una guía que haya que recordar, está en qué componentes la aceptan.
64
+ * Faces go ONLY in empty states, confirmations, errors, course progress and
65
+ * celebration. Never in a hero, pricing, services, contact or CV. That is why
66
+ * `EmptyState` takes a face and `PageHeader` does not: the rule is not written
67
+ * in a guide you have to remember, it is written into which components accept
68
+ * one.
68
69
  */
69
- declare function CaraDeMascota({ expresion, basePath, alt, className, ...props }: CaraDeMascotaProps): react.JSX.Element;
70
+ declare function MascotFace({ expression, basePath, alt, className, ...props }: MascotFaceProps): react.JSX.Element;
70
71
 
71
- export { Cara, CaraDeMascota, type CaraDeMascotaProps, Fondo, Isotipo, type IsotipoProps, Logo, type LogoProps, Mascota, type MascotaProps, Pose };
72
+ export { Background, Face, Isotype, type IsotypeProps, Logo, type LogoProps, Mascot, MascotFace, type MascotFaceProps, type MascotProps, Pose };
@@ -1,5 +1,6 @@
1
- export { CaraDeMascota, Isotipo, Logo, Mascota } from '../chunk-YZ2SDOVZ.js';
2
- export { RUTA_ASSETS, aletas, caras, listaCaras, listaPoses, poses, usoDeCara } from '../chunk-E3OMP2DL.js';
3
- import '../chunk-NHS7ETKJ.js';
4
- import '../chunk-TSPJOM6K.js';
1
+ 'use client';
2
+ export { Isotype, Logo, Mascot, MascotFace } from '../chunk-6O3KWB6P.js';
3
+ export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from '../chunk-CKRSQPTX.js';
4
+ import '../chunk-XKYHTOUJ.js';
5
+ import '../chunk-O4TAH7YJ.js';
5
6
  import '../chunk-MLKGABMK.js';