@eduardoalvarez/arrecife 0.5.1 → 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 +45 -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 +1047 -914
  28. package/dist/index.d.cts +769 -777
  29. package/dist/index.d.ts +769 -777
  30. package/dist/index.js +608 -660
  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
@@ -3,144 +3,175 @@
3
3
  // src/tokens/tokens.ts
4
4
  var dark = {
5
5
  background: "#091319",
6
- // abismo · fondo de página
6
+ // abyss · page background
7
7
  surface: "#10202B",
8
- // fosa · tarjetas y paneles
8
+ // trench · cards and panels
9
9
  surfaceRaised: "#17303E",
10
- // corriente · menús, tabs activos
10
+ // current · menus, active tabs
11
11
  border: "#22414F",
12
- // bordes de control
12
+ // control borders
13
13
  hairline: "#1E3441",
14
- // divisiones sutiles
14
+ // subtle dividers
15
15
  hairlineHover: "#2C4D5D",
16
- // hairline en hover de tarjeta
16
+ // hairline on card hover
17
17
  textPrimary: "#EDF4F3",
18
- // espuma 16.84:1
18
+ // foam 16.84:1
19
19
  textSecondary: "#A7BCC4",
20
- // bruma 9.50:1
20
+ // haze 9.50:1
21
21
  textMuted: "#71919C",
22
- // plancton 5.57:1 nunca bajo 13px
22
+ // plankton 5.57:1 never under 13px
23
23
  accent: "#35D6C0",
24
- // bioluz 10.31:1 interactivo
24
+ // biolume 10.31:1 interactive
25
25
  accentHover: "#5FE3D1",
26
26
  accentOn: "#06171A",
27
- // tinta sobre bioluz
27
+ // ink over biolume
28
28
  warm: "#F2A65A",
29
- // arena 9.28:1 humano y conversión
29
+ // sand 9.28:1 human and conversion
30
30
  warmHover: "#F7BB7D",
31
31
  warmOn: "#2A1605",
32
- // tinta sobre arena
32
+ // ink over sand
33
33
  success: "#4FB477",
34
34
  warning: "#E8A33D",
35
- error: "#E15757"
36
- // 4.51:1 sobre surface
35
+ error: "#E15757",
36
+ // 4.51:1 over surface
37
+ /**
38
+ * The destructive fill. It is NOT `error`, and the difference is the role.
39
+ *
40
+ * `error` is a TEXT color: it has to read against a dark surface, so it sits
41
+ * mid-red. `danger` is a FILL: what has to read is the ink ON TOP of it, so it
42
+ * goes lighter. Same reasoning as `accent` and `accentOn` — one is measured
43
+ * against the page, the other against what it carries.
44
+ *
45
+ * Measured: ink 6.53:1 over the fill and 7.92:1 over the hover; the fill
46
+ * itself 6.71:1 over abyss, 5.94 over surface and 4.91 over surfaceRaised, so
47
+ * the outline variant reads as text on all three.
48
+ */
49
+ danger: "#F4736B",
50
+ dangerHover: "#F78D86",
51
+ dangerOn: "#2B0A08"
52
+ // ink over danger 6.53:1
37
53
  };
38
54
  var light = {
39
55
  background: "#F6F2EA",
40
- // papel
56
+ // paper
41
57
  surface: "#FFFFFF",
42
58
  surfaceRaised: "#EFE9DE",
43
59
  border: "#E6DFD2",
44
60
  hairline: "#EBE6DC",
45
61
  hairlineHover: "#D3C8B2",
46
- // hairline en hover de tarjeta
62
+ // hairline on card hover
47
63
  textPrimary: "#0B1524",
48
64
  // 16.40:1
49
65
  textSecondary: "#3D4B58",
50
66
  textMuted: "#626A75",
51
- // 4.53:1 sobre surfaceRaised
67
+ // 4.53:1 over surfaceRaised
52
68
  accent: "#0D7C6F",
53
- // bioluz oscura 4.55:1
69
+ // dark biolume 4.55:1
54
70
  accentHover: "#0C7466",
55
71
  accentOn: "#FFFFFF",
56
72
  warm: "#A65B27",
57
- // arena oscura 4.54:1
73
+ // dark sand 4.54:1
58
74
  warmHover: "#96511F",
59
75
  warmOn: "#FFF7EE",
60
76
  success: "#0F6B52",
61
77
  warning: "#8D6111",
62
- // 4.51:1 sobre surfaceRaised
63
- error: "#C0392B"
78
+ // 4.51:1 over surfaceRaised
79
+ error: "#C0392B",
80
+ /**
81
+ * In light mode `danger` and `error` land on the same hex, and that is not an
82
+ * oversight: over paper a red dark enough to carry white ink is also the red
83
+ * that reads as text. In dark they part company because the fill has to be
84
+ * lighter than the text color, not darker.
85
+ *
86
+ * Measured: ink 5.11:1 over the fill and 6.61:1 over the hover; the fill
87
+ * itself 4.87:1 over paper, 5.44 over surface and 4.50 over surfaceRaised —
88
+ * the last one is exactly on the AA line, which is where every light semantic
89
+ * in this palette sits.
90
+ */
91
+ danger: "#C0392B",
92
+ dangerHover: "#A32F22",
93
+ dangerOn: "#FFF6F4"
94
+ // 5.11:1 over danger
64
95
  };
65
96
  var colors = { dark, light };
66
97
  var brand = {
67
- /** Cuerpo de la mascota. 4.22:1 → SOLO relleno, NUNCA texto. */
98
+ /** The mascot's body. 4.22:1 → FILL ONLY, NEVER text. */
68
99
  body: "#3E7CB1",
69
- /** Patrón de manchas. */
100
+ /** Spot pattern. */
70
101
  spots: "#C2D7E7",
71
- /** Casco · contorno y fondo de bloques de código. */
102
+ /** Hull · outline, and the background of code blocks. */
72
103
  hull: "#0B1524"
73
104
  };
74
105
  var fonts = {
75
- /** SOLO titulares y números grandes. Nunca cuerpo. */
106
+ /** Headlines and large numbers ONLY. Never body copy. */
76
107
  display: '"Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif',
77
- /** Cuerpo e interfaz. */
108
+ /** Body and interface. */
78
109
  sans: '"Geist", ui-sans-serif, system-ui, sans-serif',
79
- /** Código, rutas, etiquetas, metadatos, firma CLI. */
110
+ /** Code, paths, labels, metadata, the CLI signature. */
80
111
  mono: '"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace'
81
112
  };
82
113
  var typeScale = {
83
114
  display: { family: "display", size: 76, lineHeight: 0.96, weight: 800, tracking: "-0.035em" },
84
- /** Métricas grandes. Números, no prosa: interlineado 1 y sin descendentes. */
115
+ /** Large metrics. Numbers, not prose: line height 1 and no descenders. */
85
116
  stat: { family: "display", size: 46, lineHeight: 1, weight: 800, tracking: "-0.035em" },
86
117
  h1: { family: "display", size: 44, lineHeight: 1.05, weight: 700, tracking: "-0.03em" },
87
118
  h2: { family: "display", size: 30, lineHeight: 1.1, weight: 600, tracking: "-0.02em" },
88
119
  h3: { family: "display", size: 25, lineHeight: 1.15, weight: 600, tracking: "-0.02em" },
89
120
  body: { family: "sans", size: 18, lineHeight: 1.75, weight: 400 },
90
121
  /**
91
- * 17px. El botón grande y la bajada de las páginas internas.
122
+ * 17px. The large button, and the deck on interior pages.
92
123
  *
93
- * Entra como escalón propio porque el documento lo usa DOS veces y en piezas
94
- * distintas: «lg 15px 30px r12» con texto de 17, y «h1 44/700 · bajada 17px ·
95
- * párrafo de contexto 15px». Un solo uso no habría justificado partir la
96
- * distancia entre `ui` (15) y `body` (18); dos sí.
124
+ * It earns its own step because the identity document uses it TWICE, in two
125
+ * different pieces: «lg 15/30 r12» with 17px text, and «h1 44/700 · deck 17px
126
+ * · context paragraph 15px». One use would not have justified splitting the
127
+ * gap between `ui` (15) and `body` (18); two did.
97
128
  */
98
129
  lead: { family: "sans", size: 17, lineHeight: 1.5, weight: 400 },
99
130
  ui: { family: "sans", size: 15, lineHeight: 1.6, weight: 400 },
100
131
  label: { family: "sans", size: 13, lineHeight: 1.5, weight: 500 },
101
132
  /**
102
- * La escala de las etiquetas de estado: sans 12.5/500, cuadrada.
133
+ * The status-badge scale: sans 12.5/500, squared off.
103
134
  *
104
- * Es medio píxel por debajo de `label`, y esta vez el medio píxel sí importa:
105
- * una etiqueta de estado va dentro de una tabla o al lado de un título, y a 13
106
- * competía con el texto que acompaña. El documento la da en 12.5 y se ve.
135
+ * That is half a pixel below `label`, and this time the half pixel matters: a
136
+ * status badge sits inside a table or next to a title, and at 13 it competed
137
+ * with the text it accompanies. The document specifies 12.5 and it shows.
107
138
  */
108
139
  tag: { family: "sans", size: 12.5, lineHeight: 1.4, weight: 500 },
109
140
  /**
110
- * La escala de categoría y métrica: mono 11.5.
141
+ * The category and metric scale: mono 11.5.
111
142
  *
112
- * Rompe el suelo de `limits.minScreenPx`, y es a propósito. Ese suelo protege
113
- * al TEXTO —lo que se lee en una frase—, y una píldora de una palabra no es
114
- * texto corrido: es una marca. El contraste sigue medido y pasa AA (plancton
115
- * 5.57:1 sobre abismo), que es la parte que no se negocia.
143
+ * It breaks the floor set by `limits.minScreenPx`, deliberately. That floor
144
+ * protects TEXT — what you read in a sentence — and a one-word pill is not
145
+ * running text: it is a mark. Contrast is still measured and still passes AA
146
+ * (plankton 5.57:1 over abyss), which is the part that is not negotiable.
116
147
  *
117
- * A 13 las tres familias de etiqueta salían del tamaño de un botón pequeño y
118
- * pesaban más que el título que acompañan. Ver `docs/decisiones.md`.
148
+ * At 13 the three badge families grew past the size of a small button and
149
+ * outweighed the title they accompany. See `docs/decisions.md`.
119
150
  */
120
151
  chip: { family: "mono", size: 11.5, lineHeight: 1.4, weight: 400 },
121
152
  /**
122
- * Mono SIN transformar: fechas, rutas, versiones, nombres de archivo, la firma
123
- * del footer y las métricas de etiqueta. Es la mayoría del mono del sistema.
153
+ * Mono with NO transform: dates, paths, versions, file names, the footer
154
+ * signature and metric labels. It is most of the mono in the system.
124
155
  *
125
- * Existe porque `eyebrow` lleva `uppercase` de fábrica y no es una preferencia
126
- * que se pueda apagar: es la escala del eyebrow. Un `18 ago 2026` en versalitas
127
- * o un `pose-laptop-coffee.png` en mayúsculas están mal, y sin este escalón la
128
- * única salida era un `normal-case` en cada sitio de uso.
156
+ * It exists because `eyebrow` ships `uppercase` and that is not a preference
157
+ * you can switch off: it IS the eyebrow scale. An `18 Aug 2026` in small caps
158
+ * or a `pose-laptop-coffee.png` in all caps are wrong, and without this step
159
+ * the only way out was a `normal-case` at every call site.
129
160
  *
130
- * El documento dice 12.5. Son 13 por la misma razón por la que `textMuted` se
131
- * corrigió: `limits.minScreenPx` es 13 y plancton «nunca bajo 13px». Esta
132
- * escala es justo donde se escriben las metas en muted, así que ponerla en
133
- * 12.5 habría dejado ilegible su uso más común por medio píxel.
161
+ * The document says 12.5. This is 13 for the same reason `textMuted` was
162
+ * corrected: `limits.minScreenPx` is 13 and plankton is «never under 13px».
163
+ * This scale is exactly where muted metadata gets written, so putting it at
164
+ * 12.5 would have made its most common use illegible by half a pixel.
134
165
  */
135
166
  meta: { family: "mono", size: 13, lineHeight: 1.6, weight: 400 },
136
167
  eyebrow: { family: "mono", size: 12, tracking: "0.12em", transform: "uppercase" }
137
168
  };
138
169
  var limits = {
139
- /** Mínimo absoluto en pantalla. */
170
+ /** Absolute minimum on screen. */
140
171
  minScreenPx: 13,
141
- /** Mínimo absoluto impreso. */
172
+ /** Absolute minimum in print. */
142
173
  minPrintPt: 12,
143
- /** Medida máxima de cuerpo. */
174
+ /** Maximum body measure. */
144
175
  measure: "68ch"
145
176
  };
146
177
  var radius = {
@@ -154,8 +185,24 @@ var control = {
154
185
  sm: 14,
155
186
  md: 22,
156
187
  lg: 30,
157
- /** Botón de icono: cuadrado, sin texto. */
158
- icon: 42
188
+ /** Icon button: square, no text. */
189
+ icon: 42,
190
+ /**
191
+ * The dense icon button, 32×32.
192
+ *
193
+ * 42 is the right measure for a control you hit with a thumb, and the four
194
+ * reading sites are where that fits. `cursos` is the odd one out: it is the
195
+ * only admin app of the set, with three actions per table row, and at 42 the
196
+ * row grows with them — the original used 24 and 28.
197
+ *
198
+ * It is 32 and not 28 because 32 is `sm`'s height. A dense icon button lines
199
+ * up with a small text button, so a toolbar mixing the two stays on one
200
+ * baseline; 28 would have been a fifth height that matches nothing.
201
+ *
202
+ * It does not replace `icon`. A page's primary action stays at 42; this is for
203
+ * a row of a table. See `docs/decisions.md` § 22.
204
+ */
205
+ iconSm: 32
159
206
  };
160
207
  var spacing = {
161
208
  stepXs: 8,
@@ -166,42 +213,42 @@ var spacing = {
166
213
  section: 96
167
214
  };
168
215
  var size = {
169
- /** Alto de la barra de navegación. */
216
+ /** Navigation bar height. */
170
217
  nav: 64,
171
- /** Ancho de columna de lectura. */
218
+ /** Reading column width. */
172
219
  content: 760,
173
- /** Ancho máximo de página. */
220
+ /** Maximum page width. */
174
221
  wide: 1180
175
222
  };
176
- var sintaxis = {
177
- /** El casco. Es el fondo del bloque en los dos modos. */
178
- fondo: brand.hull,
179
- /** Identificadores, funciones, tipos, variables. */
180
- identificador: dark.textPrimary,
181
- /** Cadenas, números, booleanos, null. */
223
+ var syntax = {
224
+ /** The hull. It is the block background in both modes. */
225
+ background: brand.hull,
226
+ /** Identifiers, functions, types, variables. */
227
+ identifier: dark.textPrimary,
228
+ /** Strings, numbers, booleans, null. */
182
229
  literal: dark.accent,
183
- /** Palabras clave, control de flujo, `import`, `this`. */
184
- palabraClave: dark.warm,
185
- /** Comentarios y puntuación. */
186
- comentario: dark.textMuted,
230
+ /** Keywords, control flow, `import`, `this`. */
231
+ keyword: dark.warm,
232
+ /** Comments and punctuation. */
233
+ comment: dark.textMuted,
187
234
  /** `markup.deleted`, `invalid`. */
188
- invalido: dark.error
235
+ invalid: dark.error
189
236
  };
190
237
  var series = {
191
238
  dark: [dark.accent, dark.warm, brand.body, dark.textMuted],
192
239
  light: [light.accent, light.warm, brand.body, light.textMuted]
193
240
  };
194
- var profundo = "#0D2129";
241
+ var deep = "#0D2129";
195
242
  var gradient = {
196
243
  dark: {
197
- hero: `linear-gradient(160deg, ${dark.background} 60%, ${profundo} 100%)`,
198
- seccion: `linear-gradient(150deg, ${dark.surface} 0%, ${profundo} 100%)`,
199
- /** El de la plantilla OG de artículo. 145°, del documento. */
200
- og: `linear-gradient(145deg, ${dark.background} 55%, ${profundo} 100%)`
244
+ hero: `linear-gradient(160deg, ${dark.background} 60%, ${deep} 100%)`,
245
+ section: `linear-gradient(150deg, ${dark.surface} 0%, ${deep} 100%)`,
246
+ /** The one used by the article OG template. 145°, from the document. */
247
+ og: `linear-gradient(145deg, ${dark.background} 55%, ${deep} 100%)`
201
248
  },
202
249
  light: {
203
250
  hero: `linear-gradient(160deg, ${light.background} 60%, ${light.surfaceRaised} 100%)`,
204
- seccion: `linear-gradient(150deg, ${light.surface} 0%, ${light.surfaceRaised} 100%)`,
251
+ section: `linear-gradient(150deg, ${light.surface} 0%, ${light.surfaceRaised} 100%)`,
205
252
  og: `linear-gradient(145deg, ${light.background} 55%, ${light.surfaceRaised} 100%)`
206
253
  }
207
254
  };
@@ -215,16 +262,16 @@ var motion = {
215
262
  };
216
263
  var tagline = {
217
264
  /** Hero. */
218
- largo: "Ayudo a equipos de ingenier\xEDa a escalar con criterio",
219
- /** Header, una línea. */
220
- corto: "Ayudo a equipos a escalar con criterio",
265
+ long: "Ayudo a equipos de ingenier\xEDa a escalar con criterio",
266
+ /** Header, one line. */
267
+ short: "Ayudo a equipos a escalar con criterio",
221
268
  /** LinkedIn. */
222
269
  en: "Helping engineering teams scale with judgment"
223
270
  };
224
271
  var naming = {
225
272
  wordmark: "Eduardo \xC1lvarez",
226
273
  mascot: "Tiburonc\xEDn",
227
- /** El dominio, para la firma CLI del footer: `$ cd ~/eduardoalvarez.dev/2026`. */
274
+ /** The domain, for the footer CLI signature: `$ cd ~/eduardoalvarez.dev/2026`. */
228
275
  domain: "eduardoalvarez.dev"
229
276
  };
230
277
 
@@ -240,7 +287,7 @@ var tokens = {
240
287
  spacing,
241
288
  size,
242
289
  gradient,
243
- sintaxis,
290
+ syntax,
244
291
  series,
245
292
  shadow,
246
293
  motion,
@@ -261,9 +308,9 @@ exports.naming = naming;
261
308
  exports.radius = radius;
262
309
  exports.series = series;
263
310
  exports.shadow = shadow;
264
- exports.sintaxis = sintaxis;
265
311
  exports.size = size;
266
312
  exports.spacing = spacing;
313
+ exports.syntax = syntax;
267
314
  exports.tagline = tagline;
268
315
  exports.tokens = tokens;
269
316
  exports.typeScale = typeScale;