@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
@@ -4,10 +4,10 @@ import * as LabelPrimitive from '@radix-ui/react-label';
4
4
 
5
5
  type LabelProps = ComponentPropsWithoutRef<typeof LabelPrimitive.Root>;
6
6
  /**
7
- * La escala `label`: 13px, que es el mínimo absoluto en pantalla del sistema.
7
+ * The `label` scale: 13px, which is the system's absolute minimum on screen.
8
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.
9
+ * It dims together with the control when that control is disabled, so the
10
+ * label-control pair always reads as a single unit.
11
11
  */
12
12
  declare function Label({ className, ...props }: LabelProps): react.JSX.Element;
13
13
 
@@ -4,10 +4,10 @@ import * as LabelPrimitive from '@radix-ui/react-label';
4
4
 
5
5
  type LabelProps = ComponentPropsWithoutRef<typeof LabelPrimitive.Root>;
6
6
  /**
7
- * La escala `label`: 13px, que es el mínimo absoluto en pantalla del sistema.
7
+ * The `label` scale: 13px, which is the system's absolute minimum on screen.
8
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.
9
+ * It dims together with the control when that control is disabled, so the
10
+ * label-control pair always reads as a single unit.
11
11
  */
12
12
  declare function Label({ className, ...props }: LabelProps): react.JSX.Element;
13
13
 
package/dist/og/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- // src/brand/catalogo.ts
4
- var caras = {
3
+ // src/brand/catalog.ts
4
+ var faces = {
5
5
  annoyed: "face-annoyed.png",
6
6
  confused: "face-confused.png",
7
7
  hearts: "face-hearts.png",
@@ -16,95 +16,96 @@ var poses = {
16
16
  peek: "pose-peek.png",
17
17
  surf: "pose-surf.png"
18
18
  };
19
- var aletas = {
20
- /** Dos azules. Para fondos claros. */
19
+ var fins = {
20
+ /** Two blues. For light backgrounds. */
21
21
  color: "fin.png",
22
- /** Silueta a una tinta. Para fondos oscuros. */
23
- espuma: "fin-foam.png"
22
+ /** Single-ink silhouette. For dark backgrounds. */
23
+ foam: "fin-foam.png"
24
24
  };
25
- var RUTA_ASSETS = "/brand";
25
+ var ASSETS_PATH = "/brand";
26
26
 
27
27
  // src/tokens/tokens.ts
28
28
  var dark = {
29
29
  background: "#091319",
30
- // corriente · menús, tabs activos
30
+ // current · menus, active tabs
31
31
  border: "#22414F",
32
- // hairline en hover de tarjeta
32
+ // hairline on card hover
33
33
  textPrimary: "#EDF4F3",
34
- // espuma 16.84:1
34
+ // foam 16.84:1
35
35
  textSecondary: "#A7BCC4",
36
- // plancton 5.57:1 nunca bajo 13px
36
+ // plankton 5.57:1 never under 13px
37
37
  accent: "#35D6C0",
38
- // tinta sobre bioluz
38
+ // ink over biolume
39
39
  warm: "#F2A65A"};
40
40
  var light = {
41
41
  background: "#F6F2EA",
42
- surfaceRaised: "#EFE9DE",
43
- // hairline en hover de tarjeta
42
+ // paper
43
+ surface: "#FFFFFF",
44
+ // hairline on card hover
44
45
  textPrimary: "#0B1524",
45
46
  // 16.40:1
46
47
  textSecondary: "#3D4B58",
47
48
  warm: "#A65B27"};
48
49
  var fonts = {
49
- /** SOLO titulares y números grandes. Nunca cuerpo. */
50
+ /** Headlines and large numbers ONLY. Never body copy. */
50
51
  display: '"Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif',
51
- /** Cuerpo e interfaz. */
52
+ /** Body and interface. */
52
53
  sans: '"Geist", ui-sans-serif, system-ui, sans-serif',
53
- /** Código, rutas, etiquetas, metadatos, firma CLI. */
54
+ /** Code, paths, labels, metadata, the CLI signature. */
54
55
  mono: '"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace'
55
56
  };
56
57
  var typeScale = {
57
58
  h1: { tracking: "-0.03em" },
58
59
  eyebrow: { tracking: "0.12em"}
59
60
  };
60
- var profundo = "#0D2129";
61
+ var deep = "#0D2129";
61
62
  var gradient = {
62
63
  dark: {
63
- /** El de la plantilla OG de artículo. 145°, del documento. */
64
- og: `linear-gradient(145deg, ${dark.background} 55%, ${profundo} 100%)`
64
+ /** The one used by the article OG template. 145°, from the document. */
65
+ og: `linear-gradient(145deg, ${dark.background} 55%, ${deep} 100%)`
65
66
  },
66
67
  light: {
67
- og: `linear-gradient(145deg, ${light.background} 55%, ${light.surfaceRaised} 100%)`
68
+ og: `linear-gradient(145deg, ${light.background} 55%, ${light.surface} 100%)`
68
69
  }
69
70
  };
70
71
  var tagline = {
71
- /** Header, una línea. */
72
- corto: "Ayudo a equipos a escalar con criterio"};
72
+ /** Header, one line. */
73
+ short: "Ayudo a equipos a escalar con criterio"};
73
74
  var naming = {
74
75
  wordmark: "Eduardo \xC1lvarez",
75
- /** El dominio, para la firma CLI del footer: `$ cd ~/eduardoalvarez.dev/2026`. */
76
+ /** The domain, for the footer CLI signature: `$ cd ~/eduardoalvarez.dev/2026`. */
76
77
  domain: "eduardoalvarez.dev"
77
78
  };
78
79
 
79
- // src/og/plantillas.ts
80
+ // src/og/templates.ts
80
81
  var OG = {
81
82
  width: 1200,
82
83
  height: 630,
83
- margen: 64,
84
- /** Alto máximo de la mascota. */
85
- mascota: 430,
86
- /** La aleta de la firma. */
87
- aletaFirma: 34,
84
+ margin: 64,
85
+ /** The mascot's maximum height. */
86
+ mascot: 430,
87
+ /** The signature's fin. */
88
+ signatureFin: 34,
88
89
  /**
89
- * Hueco que deja la columna cuando la pose va a la izquierda (curso).
90
+ * The gap the column leaves when the pose goes on the left (course).
90
91
  *
91
- * Son 560 y no 420 porque una pose completa a 430 de alto mide ~534 de ancho:
92
- * con el hueco justo, el tiburón se comía el titular. La reserva se mide por
93
- * el ancho real de la pose, no por el margen.
92
+ * It is 560 and not 420 because a full pose at 430 tall measures ~534 wide:
93
+ * with the exact gap, the shark ate into the headline. The reserve is measured
94
+ * by the pose's real width, not by the margin.
94
95
  */
95
- reservaMascota: 560
96
+ mascotReserve: 560
96
97
  };
97
98
  function el(type, props, children) {
98
99
  return { type, props: children === void 0 ? props : { ...props, children } };
99
100
  }
100
- function caja(style, children) {
101
+ function box(style, children) {
101
102
  return el("div", { style: { display: "flex", ...style } }, children);
102
103
  }
103
- function texto(style, contenido) {
104
- return el("div", { style: { display: "flex", ...style } }, contenido);
104
+ function text(style, content) {
105
+ return el("div", { style: { display: "flex", ...style } }, content);
105
106
  }
106
- function eyebrow(contenido, color) {
107
- return texto(
107
+ function eyebrow(content, color) {
108
+ return text(
108
109
  {
109
110
  fontFamily: fonts.mono,
110
111
  fontSize: 20,
@@ -112,11 +113,11 @@ function eyebrow(contenido, color) {
112
113
  textTransform: "uppercase",
113
114
  color
114
115
  },
115
- contenido
116
+ content
116
117
  );
117
118
  }
118
- function titular(contenido, color) {
119
- return texto(
119
+ function headline(content, color) {
120
+ return text(
120
121
  {
121
122
  fontFamily: fonts.display,
122
123
  fontSize: 58,
@@ -124,8 +125,8 @@ function titular(contenido, color) {
124
125
  lineHeight: 1.06,
125
126
  letterSpacing: typeScale.h1.tracking,
126
127
  color,
127
- // 70 % del LIENZO, no de la columna. Con la mascota en su propia columna
128
- // el 70 % relativo daba ~400px y el titular se truncaba a media palabra.
128
+ // 70 % of the CANVAS, not of the column. With the mascot in a column of
129
+ // its own, a relative 70 % gave ~400px and the headline truncated mid-word.
129
130
  maxWidth: OG.width * 0.7,
130
131
  display: "-webkit-box",
131
132
  WebkitBoxOrient: "vertical",
@@ -133,144 +134,144 @@ function titular(contenido, color) {
133
134
  overflow: "hidden",
134
135
  textOverflow: "ellipsis"
135
136
  },
136
- contenido
137
+ content
137
138
  );
138
139
  }
139
- function firma(contenido, color, modo, base) {
140
- return caja({ alignItems: "center", gap: 14 }, [
140
+ function signature(content, color, mode, base) {
141
+ return box({ alignItems: "center", gap: 14 }, [
141
142
  el("img", {
142
143
  alt: "",
143
- src: `${base}/${modo === "oscuro" ? aletas.espuma : aletas.color}`,
144
- height: OG.aletaFirma,
145
- style: { height: OG.aletaFirma }
144
+ src: `${base}/${mode === "dark" ? fins.foam : fins.color}`,
145
+ height: OG.signatureFin,
146
+ style: { height: OG.signatureFin }
146
147
  }),
147
- texto({ fontFamily: fonts.mono, fontSize: 21, color }, contenido)
148
+ text({ fontFamily: fonts.mono, fontSize: 21, color }, content)
148
149
  ]);
149
150
  }
150
- function tarjeta(opciones) {
151
- const columna = caja(
151
+ function card(options) {
152
+ const column = box(
152
153
  {
153
154
  position: "relative",
154
155
  flexDirection: "column",
155
156
  justifyContent: "space-between",
156
157
  width: "100%",
157
158
  height: "100%",
158
- padding: OG.margen,
159
- // Cuando la pose va a la izquierda hay que dejarle el hueco: es lo único
160
- // que cambia de la retícula, y solo lo hace la plantilla de curso.
161
- paddingLeft: opciones.mascotaIzquierda ? OG.reservaMascota : OG.margen
159
+ padding: OG.margin,
160
+ // When the pose goes on the left it needs the gap left for it: it is the
161
+ // only thing that changes in the grid, and only the course template does it.
162
+ paddingLeft: options.mascotaIzquierda ? OG.mascotReserve : OG.margin
162
163
  },
163
164
  [
164
- eyebrow(opciones.eyebrow.texto, opciones.eyebrow.color),
165
- caja({ flexDirection: "column", gap: 18 }, [
166
- titular(opciones.title, opciones.tinta),
167
- opciones.bajada ? texto(
165
+ eyebrow(options.eyebrow.text, options.eyebrow.color),
166
+ box({ flexDirection: "column", gap: 18 }, [
167
+ headline(options.title, options.tinta),
168
+ options.bajada ? text(
168
169
  {
169
170
  fontFamily: fonts.sans,
170
171
  fontSize: 26,
171
- color: opciones.tintaSecundaria,
172
+ color: options.tintaSecundaria,
172
173
  maxWidth: OG.width * 0.7
173
174
  },
174
- opciones.bajada
175
+ options.bajada
175
176
  ) : null
176
177
  ]),
177
- firma(opciones.firma, opciones.firmaColor, opciones.modo, opciones.base)
178
+ signature(options.signature, options.firmaColor, options.mode, options.base)
178
179
  ]
179
180
  );
180
- return caja(
181
+ return box(
181
182
  {
182
183
  position: "relative",
183
184
  width: OG.width,
184
185
  height: OG.height,
185
- backgroundImage: opciones.fondo,
186
- backgroundColor: opciones.modo === "oscuro" ? dark.background : light.background,
186
+ backgroundImage: options.background,
187
+ backgroundColor: options.mode === "dark" ? dark.background : light.background,
187
188
  fontFamily: fonts.sans,
188
189
  overflow: "hidden"
189
190
  },
190
191
  [
191
- opciones.mascota ? caja(
192
+ options.mascot ? box(
192
193
  {
193
194
  position: "absolute",
194
195
  bottom: 0,
195
- ...opciones.mascotaIzquierda ? { left: 0 } : { right: 0 },
196
+ ...options.mascotaIzquierda ? { left: 0 } : { right: 0 },
196
197
  alignItems: "flex-end"
197
198
  },
198
- opciones.mascota
199
+ options.mascot
199
200
  ) : null,
200
- columna
201
+ column
201
202
  ]
202
203
  );
203
204
  }
204
- function mascotaPose(pose, base, alto = OG.mascota) {
205
- return el("img", { alt: "", src: `${base}/${poses[pose]}`, height: alto, style: { height: alto } });
205
+ function mascotPose(pose, base, height = OG.mascot) {
206
+ return el("img", { alt: "", src: `${base}/${poses[pose]}`, height, style: { height } });
206
207
  }
207
- function plantillaArticulo(datos) {
208
- const base = datos.basePath ?? RUTA_ASSETS;
209
- const cara = datos.expresion ?? "hearts";
210
- const meta = [datos.category, datos.readingMinutes ? `${datos.readingMinutes} min` : void 0].filter(Boolean).join(" \xB7 ");
211
- return tarjeta({
212
- modo: "oscuro",
213
- fondo: gradient.dark.og,
214
- eyebrow: { texto: meta || "art\xEDculo", color: dark.warm },
215
- title: datos.title,
216
- firma: naming.domain,
208
+ function articleTemplate(data) {
209
+ const base = data.basePath ?? ASSETS_PATH;
210
+ const face = data.expression ?? "hearts";
211
+ const meta = [data.category, data.readingMinutes ? `${data.readingMinutes} min` : void 0].filter(Boolean).join(" \xB7 ");
212
+ return card({
213
+ mode: "dark",
214
+ background: gradient.dark.og,
215
+ eyebrow: { text: meta || "art\xEDculo", color: dark.warm },
216
+ title: data.title,
217
+ signature: naming.domain,
217
218
  firmaColor: dark.textSecondary,
218
219
  base,
219
220
  tinta: dark.textPrimary,
220
221
  tintaSecundaria: dark.textSecondary,
221
- mascota: el("img", {
222
+ mascot: el("img", {
222
223
  alt: "",
223
- src: `${base}/${caras[cara]}`,
224
+ src: `${base}/${faces[face]}`,
224
225
  height: 300,
225
- style: { height: 300, marginBottom: OG.margen, marginRight: OG.margen }
226
+ style: { height: 300, marginBottom: OG.margin, marginRight: OG.margin }
226
227
  })
227
228
  });
228
229
  }
229
- function plantillaCurso(datos) {
230
- const base = datos.basePath ?? RUTA_ASSETS;
231
- const meta = [datos.modules ? `${datos.modules} m\xF3dulos` : void 0, datos.duration].filter(Boolean).join(" \xB7 ");
232
- return tarjeta({
233
- modo: "claro",
234
- fondo: gradient.light.og,
235
- eyebrow: { texto: "nuevo curso", color: light.warm },
236
- title: datos.title,
230
+ function courseTemplate(data) {
231
+ const base = data.basePath ?? ASSETS_PATH;
232
+ const meta = [data.modules ? `${data.modules} m\xF3dulos` : void 0, data.duration].filter(Boolean).join(" \xB7 ");
233
+ return card({
234
+ mode: "light",
235
+ background: gradient.light.og,
236
+ eyebrow: { text: "nuevo curso", color: light.warm },
237
+ title: data.title,
237
238
  bajada: meta || void 0,
238
- firma: datos.url ?? `cursos.${naming.domain}`,
239
+ signature: data.url ?? `cursos.${naming.domain}`,
239
240
  firmaColor: light.warm,
240
241
  base,
241
242
  tinta: light.textPrimary,
242
243
  tintaSecundaria: light.textSecondary,
243
244
  mascotaIzquierda: true,
244
- mascota: mascotaPose(datos.pose ?? "desk", base)
245
+ mascot: mascotPose(data.pose ?? "desk", base)
245
246
  });
246
247
  }
247
- function plantillaCharla(datos) {
248
- const base = datos.basePath ?? RUTA_ASSETS;
249
- const cabeza = ["charla", datos.event, datos.year].filter(Boolean).join(" \xB7 ");
250
- const pie = [datos.location, datos.event ? void 0 : naming.domain].filter(Boolean).join(" \xB7 ");
251
- return tarjeta({
252
- modo: "oscuro",
253
- fondo: "none",
254
- eyebrow: { texto: cabeza, color: dark.accent },
255
- title: datos.title,
256
- bajada: datos.summary,
257
- firma: pie || naming.domain,
248
+ function talkTemplate(data) {
249
+ const base = data.basePath ?? ASSETS_PATH;
250
+ const head = ["charla", data.event, data.year].filter(Boolean).join(" \xB7 ");
251
+ const footer = [data.location, data.event ? void 0 : naming.domain].filter(Boolean).join(" \xB7 ");
252
+ return card({
253
+ mode: "dark",
254
+ background: "none",
255
+ eyebrow: { text: head, color: dark.accent },
256
+ title: data.title,
257
+ bajada: data.summary,
258
+ signature: footer || naming.domain,
258
259
  firmaColor: dark.textSecondary,
259
260
  base,
260
261
  tinta: dark.textPrimary,
261
262
  tintaSecundaria: dark.textSecondary,
262
- // Sangra: se sale por abajo y por la derecha, como la portada de slide.
263
- mascota: el("img", {
263
+ // It bleeds: it runs off the bottom and the right, like a slide cover.
264
+ mascot: el("img", {
264
265
  alt: "",
265
- src: `${base}/${poses[datos.pose ?? "surf"]}`,
266
+ src: `${base}/${poses[data.pose ?? "surf"]}`,
266
267
  height: 470,
267
268
  style: { height: 470, marginBottom: -46, marginRight: -36 }
268
269
  })
269
270
  });
270
271
  }
271
- function plantillaDefecto(datos = {}) {
272
- const base = datos.basePath ?? RUTA_ASSETS;
273
- return caja(
272
+ function defaultTemplate(data = {}) {
273
+ const base = data.basePath ?? ASSETS_PATH;
274
+ return box(
274
275
  {
275
276
  width: OG.width,
276
277
  height: OG.height,
@@ -279,11 +280,11 @@ function plantillaDefecto(datos = {}) {
279
280
  fontFamily: fonts.sans
280
281
  },
281
282
  [
282
- // Columna de la aleta: 290 de ancho, que es donde cae el divisor.
283
- caja(
283
+ // The fin's column: 290 wide, which is where the divider falls.
284
+ box(
284
285
  { width: 290, height: "100%", alignItems: "center", justifyContent: "center" },
285
- // El halo. Un círculo de bioluz al 12 % detrás de la aleta.
286
- caja(
286
+ // The halo. A circle of biolume at 12 % behind the fin.
287
+ box(
287
288
  {
288
289
  width: 260,
289
290
  height: 260,
@@ -292,21 +293,21 @@ function plantillaDefecto(datos = {}) {
292
293
  alignItems: "center",
293
294
  justifyContent: "center"
294
295
  },
295
- el("img", { alt: "", src: `${base}/${aletas.espuma}`, height: 200, style: { height: 200 } })
296
+ el("img", { alt: "", src: `${base}/${fins.foam}`, height: 200, style: { height: 200 } })
296
297
  )
297
298
  ),
298
- // El divisor, exactamente en x=290.
299
- caja({ width: 1, height: 340, backgroundColor: dark.border }),
300
- caja(
301
- { flexDirection: "column", gap: 20, paddingLeft: OG.margen, paddingRight: OG.margen, flex: 1 },
299
+ // The divider, exactly at x=290.
300
+ box({ width: 1, height: 340, backgroundColor: dark.border }),
301
+ box(
302
+ { flexDirection: "column", gap: 20, paddingLeft: OG.margin, paddingRight: OG.margin, flex: 1 },
302
303
  [
303
- texto(
304
+ text(
304
305
  { fontFamily: fonts.sans, fontSize: 72, fontWeight: 700, color: dark.textPrimary, lineHeight: 1.05 },
305
- datos.title ?? naming.wordmark
306
+ data.title ?? naming.wordmark
306
307
  ),
307
- texto(
308
+ text(
308
309
  { fontFamily: fonts.sans, fontSize: 28, fontWeight: 400, color: dark.textSecondary, lineHeight: 1.4 },
309
- datos.description ?? tagline.corto
310
+ data.description ?? tagline.short
310
311
  )
311
312
  ]
312
313
  )
@@ -315,8 +316,8 @@ function plantillaDefecto(datos = {}) {
315
316
  }
316
317
 
317
318
  exports.OG = OG;
318
- exports.plantillaArticulo = plantillaArticulo;
319
- exports.plantillaBase = tarjeta;
320
- exports.plantillaCharla = plantillaCharla;
321
- exports.plantillaCurso = plantillaCurso;
322
- exports.plantillaDefecto = plantillaDefecto;
319
+ exports.articleTemplate = articleTemplate;
320
+ exports.courseTemplate = courseTemplate;
321
+ exports.defaultTemplate = defaultTemplate;
322
+ exports.plantillaBase = card;
323
+ exports.talkTemplate = talkTemplate;