@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.
- package/CHANGELOG.md +114 -0
- package/README.md +868 -467
- package/dist/brand/index.cjs +112 -95
- package/dist/brand/index.d.cts +40 -39
- package/dist/brand/index.d.ts +40 -39
- package/dist/brand/index.js +5 -4
- package/dist/catalog-D13txprv.d.cts +78 -0
- package/dist/catalog-D13txprv.d.ts +78 -0
- package/dist/chart/index.cjs +100 -83
- package/dist/chart/index.d.cts +66 -66
- package/dist/chart/index.d.ts +66 -66
- package/dist/chart/index.js +14 -12
- package/dist/chunk-2WPWEIMD.js +27 -0
- package/dist/chunk-45HVCTB7.js +70 -0
- package/dist/{chunk-ZEOQKRQ7.js → chunk-727HCBD4.js} +1 -1
- package/dist/chunk-CKRSQPTX.js +36 -0
- package/dist/chunk-E6KFUSKB.js +144 -0
- package/dist/chunk-GCRII2KQ.js +86 -0
- package/dist/{chunk-YZ2SDOVZ.js → chunk-JN3IS5OS.js} +30 -30
- package/dist/chunk-ODBFN44D.js +45 -0
- package/dist/chunk-OMKSESQB.js +300 -0
- package/dist/{chunk-VPT32GPG.js → chunk-TA7TLWW4.js} +2 -2
- package/dist/chunk-WGNIRIN7.js +42 -0
- package/dist/doctor.mjs +166 -0
- package/dist/form/index.cjs +109 -92
- package/dist/form/index.d.cts +43 -42
- package/dist/form/index.d.ts +43 -42
- package/dist/form/index.js +25 -23
- package/dist/icons/index.cjs +149 -0
- package/dist/icons/index.d.cts +94 -0
- package/dist/icons/index.d.ts +94 -0
- package/dist/icons/index.js +28 -0
- package/dist/index-DlAO2JZs.d.cts +47 -0
- package/dist/index-DlAO2JZs.d.ts +47 -0
- package/dist/index.cjs +1292 -983
- package/dist/index.d.cts +927 -806
- package/dist/index.d.ts +927 -806
- package/dist/index.js +809 -778
- package/dist/{label-DuTvJGxD.d.ts → label-MgHFKnFy.d.cts} +3 -3
- package/dist/{label-DuTvJGxD.d.cts → label-MgHFKnFy.d.ts} +3 -3
- package/dist/og/index.cjs +133 -132
- package/dist/og/index.d.cts +93 -89
- package/dist/og/index.d.ts +93 -89
- package/dist/og/index.js +106 -106
- package/dist/shiki/index.cjs +28 -30
- package/dist/shiki/index.d.cts +4 -4
- package/dist/shiki/index.d.ts +4 -4
- package/dist/shiki/index.js +12 -12
- package/dist/social/index.cjs +67 -0
- package/dist/social/index.d.cts +2 -0
- package/dist/social/index.d.ts +2 -0
- package/dist/social/index.js +2 -0
- package/dist/theme/index.cjs +97 -0
- package/dist/theme/index.d.cts +144 -0
- package/dist/theme/index.d.ts +144 -0
- package/dist/theme/index.js +2 -0
- package/dist/tokens/index.cjs +159 -88
- package/dist/tokens/index.d.cts +277 -165
- package/dist/tokens/index.d.ts +277 -165
- package/dist/tokens/index.js +2 -2
- package/dist/tokens/theme.css +165 -100
- package/dist/variants/index.cjs +195 -0
- package/dist/variants/index.d.cts +195 -0
- package/dist/variants/index.d.ts +195 -0
- package/dist/variants/index.js +3 -0
- package/llms.txt +1145 -746
- package/package.json +42 -11
- package/dist/catalogo-Du5ID-Hi.d.cts +0 -77
- package/dist/catalogo-Du5ID-Hi.d.ts +0 -77
- package/dist/chunk-E3OMP2DL.js +0 -36
- package/dist/chunk-KPZNNMV5.js +0 -83
- package/dist/chunk-NHS7ETKJ.js +0 -27
- package/dist/chunk-TSPJOM6K.js +0 -229
- package/dist/chunk-UOWIDFCB.js +0 -81
- package/dist/tema/index.cjs +0 -94
- package/dist/tema/index.d.cts +0 -110
- package/dist/tema/index.d.ts +0 -110
- 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
|
-
*
|
|
7
|
+
* The `label` scale: 13px, which is the system's absolute minimum on screen.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
7
|
+
* The `label` scale: 13px, which is the system's absolute minimum on screen.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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/
|
|
4
|
-
var
|
|
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
|
|
20
|
-
/**
|
|
19
|
+
var fins = {
|
|
20
|
+
/** Two blues. For light backgrounds. */
|
|
21
21
|
color: "fin.png",
|
|
22
|
-
/**
|
|
23
|
-
|
|
22
|
+
/** Single-ink silhouette. For dark backgrounds. */
|
|
23
|
+
foam: "fin-foam.png"
|
|
24
24
|
};
|
|
25
|
-
var
|
|
25
|
+
var ASSETS_PATH = "/brand";
|
|
26
26
|
|
|
27
27
|
// src/tokens/tokens.ts
|
|
28
28
|
var dark = {
|
|
29
29
|
background: "#091319",
|
|
30
|
-
//
|
|
30
|
+
// current · menus, active tabs
|
|
31
31
|
border: "#22414F",
|
|
32
|
-
// hairline
|
|
32
|
+
// hairline on card hover
|
|
33
33
|
textPrimary: "#EDF4F3",
|
|
34
|
-
//
|
|
34
|
+
// foam 16.84:1
|
|
35
35
|
textSecondary: "#A7BCC4",
|
|
36
|
-
//
|
|
36
|
+
// plankton 5.57:1 never under 13px
|
|
37
37
|
accent: "#35D6C0",
|
|
38
|
-
//
|
|
38
|
+
// ink over biolume
|
|
39
39
|
warm: "#F2A65A"};
|
|
40
40
|
var light = {
|
|
41
41
|
background: "#F6F2EA",
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
/**
|
|
50
|
+
/** Headlines and large numbers ONLY. Never body copy. */
|
|
50
51
|
display: '"Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif',
|
|
51
|
-
/**
|
|
52
|
+
/** Body and interface. */
|
|
52
53
|
sans: '"Geist", ui-sans-serif, system-ui, sans-serif',
|
|
53
|
-
/**
|
|
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
|
|
61
|
+
var deep = "#0D2129";
|
|
61
62
|
var gradient = {
|
|
62
63
|
dark: {
|
|
63
|
-
/**
|
|
64
|
-
og: `linear-gradient(145deg, ${dark.background} 55%, ${
|
|
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.
|
|
68
|
+
og: `linear-gradient(145deg, ${light.background} 55%, ${light.surface} 100%)`
|
|
68
69
|
}
|
|
69
70
|
};
|
|
70
71
|
var tagline = {
|
|
71
|
-
/** Header,
|
|
72
|
-
|
|
72
|
+
/** Header, one line. */
|
|
73
|
+
short: "Ayudo a equipos a escalar con criterio"};
|
|
73
74
|
var naming = {
|
|
74
75
|
wordmark: "Eduardo \xC1lvarez",
|
|
75
|
-
/**
|
|
76
|
+
/** The domain, for the footer CLI signature: `$ cd ~/eduardoalvarez.dev/2026`. */
|
|
76
77
|
domain: "eduardoalvarez.dev"
|
|
77
78
|
};
|
|
78
79
|
|
|
79
|
-
// src/og/
|
|
80
|
+
// src/og/templates.ts
|
|
80
81
|
var OG = {
|
|
81
82
|
width: 1200,
|
|
82
83
|
height: 630,
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
|
|
84
|
+
margin: 64,
|
|
85
|
+
/** The mascot's maximum height. */
|
|
86
|
+
mascot: 430,
|
|
87
|
+
/** The signature's fin. */
|
|
88
|
+
signatureFin: 34,
|
|
88
89
|
/**
|
|
89
|
-
*
|
|
90
|
+
* The gap the column leaves when the pose goes on the left (course).
|
|
90
91
|
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
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
|
-
|
|
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
|
|
101
|
+
function box(style, children) {
|
|
101
102
|
return el("div", { style: { display: "flex", ...style } }, children);
|
|
102
103
|
}
|
|
103
|
-
function
|
|
104
|
-
return el("div", { style: { display: "flex", ...style } },
|
|
104
|
+
function text(style, content) {
|
|
105
|
+
return el("div", { style: { display: "flex", ...style } }, content);
|
|
105
106
|
}
|
|
106
|
-
function eyebrow(
|
|
107
|
-
return
|
|
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
|
-
|
|
116
|
+
content
|
|
116
117
|
);
|
|
117
118
|
}
|
|
118
|
-
function
|
|
119
|
-
return
|
|
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 %
|
|
128
|
-
//
|
|
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
|
-
|
|
137
|
+
content
|
|
137
138
|
);
|
|
138
139
|
}
|
|
139
|
-
function
|
|
140
|
-
return
|
|
140
|
+
function signature(content, color, mode, base) {
|
|
141
|
+
return box({ alignItems: "center", gap: 14 }, [
|
|
141
142
|
el("img", {
|
|
142
143
|
alt: "",
|
|
143
|
-
src: `${base}/${
|
|
144
|
-
height: OG.
|
|
145
|
-
style: { height: OG.
|
|
144
|
+
src: `${base}/${mode === "dark" ? fins.foam : fins.color}`,
|
|
145
|
+
height: OG.signatureFin,
|
|
146
|
+
style: { height: OG.signatureFin }
|
|
146
147
|
}),
|
|
147
|
-
|
|
148
|
+
text({ fontFamily: fonts.mono, fontSize: 21, color }, content)
|
|
148
149
|
]);
|
|
149
150
|
}
|
|
150
|
-
function
|
|
151
|
-
const
|
|
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.
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
paddingLeft:
|
|
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(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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:
|
|
172
|
+
color: options.tintaSecundaria,
|
|
172
173
|
maxWidth: OG.width * 0.7
|
|
173
174
|
},
|
|
174
|
-
|
|
175
|
+
options.bajada
|
|
175
176
|
) : null
|
|
176
177
|
]),
|
|
177
|
-
|
|
178
|
+
signature(options.signature, options.firmaColor, options.mode, options.base)
|
|
178
179
|
]
|
|
179
180
|
);
|
|
180
|
-
return
|
|
181
|
+
return box(
|
|
181
182
|
{
|
|
182
183
|
position: "relative",
|
|
183
184
|
width: OG.width,
|
|
184
185
|
height: OG.height,
|
|
185
|
-
backgroundImage:
|
|
186
|
-
backgroundColor:
|
|
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
|
-
|
|
192
|
+
options.mascot ? box(
|
|
192
193
|
{
|
|
193
194
|
position: "absolute",
|
|
194
195
|
bottom: 0,
|
|
195
|
-
...
|
|
196
|
+
...options.mascotaIzquierda ? { left: 0 } : { right: 0 },
|
|
196
197
|
alignItems: "flex-end"
|
|
197
198
|
},
|
|
198
|
-
|
|
199
|
+
options.mascot
|
|
199
200
|
) : null,
|
|
200
|
-
|
|
201
|
+
column
|
|
201
202
|
]
|
|
202
203
|
);
|
|
203
204
|
}
|
|
204
|
-
function
|
|
205
|
-
return el("img", { alt: "", src: `${base}/${poses[pose]}`, height
|
|
205
|
+
function mascotPose(pose, base, height = OG.mascot) {
|
|
206
|
+
return el("img", { alt: "", src: `${base}/${poses[pose]}`, height, style: { height } });
|
|
206
207
|
}
|
|
207
|
-
function
|
|
208
|
-
const base =
|
|
209
|
-
const
|
|
210
|
-
const meta = [
|
|
211
|
-
return
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
eyebrow: {
|
|
215
|
-
title:
|
|
216
|
-
|
|
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
|
-
|
|
222
|
+
mascot: el("img", {
|
|
222
223
|
alt: "",
|
|
223
|
-
src: `${base}/${
|
|
224
|
+
src: `${base}/${faces[face]}`,
|
|
224
225
|
height: 300,
|
|
225
|
-
style: { height: 300, marginBottom: OG.
|
|
226
|
+
style: { height: 300, marginBottom: OG.margin, marginRight: OG.margin }
|
|
226
227
|
})
|
|
227
228
|
});
|
|
228
229
|
}
|
|
229
|
-
function
|
|
230
|
-
const base =
|
|
231
|
-
const meta = [
|
|
232
|
-
return
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
eyebrow: {
|
|
236
|
-
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
|
-
|
|
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
|
-
|
|
245
|
+
mascot: mascotPose(data.pose ?? "desk", base)
|
|
245
246
|
});
|
|
246
247
|
}
|
|
247
|
-
function
|
|
248
|
-
const base =
|
|
249
|
-
const
|
|
250
|
-
const
|
|
251
|
-
return
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
eyebrow: {
|
|
255
|
-
title:
|
|
256
|
-
bajada:
|
|
257
|
-
|
|
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
|
-
//
|
|
263
|
-
|
|
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[
|
|
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
|
|
272
|
-
const base =
|
|
273
|
-
return
|
|
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
|
-
//
|
|
283
|
-
|
|
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
|
-
//
|
|
286
|
-
|
|
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}/${
|
|
296
|
+
el("img", { alt: "", src: `${base}/${fins.foam}`, height: 200, style: { height: 200 } })
|
|
296
297
|
)
|
|
297
298
|
),
|
|
298
|
-
//
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
{ flexDirection: "column", gap: 20, paddingLeft: OG.
|
|
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
|
-
|
|
304
|
+
text(
|
|
304
305
|
{ fontFamily: fonts.sans, fontSize: 72, fontWeight: 700, color: dark.textPrimary, lineHeight: 1.05 },
|
|
305
|
-
|
|
306
|
+
data.title ?? naming.wordmark
|
|
306
307
|
),
|
|
307
|
-
|
|
308
|
+
text(
|
|
308
309
|
{ fontFamily: fonts.sans, fontSize: 28, fontWeight: 400, color: dark.textSecondary, lineHeight: 1.4 },
|
|
309
|
-
|
|
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.
|
|
319
|
-
exports.
|
|
320
|
-
exports.
|
|
321
|
-
exports.
|
|
322
|
-
exports.
|
|
319
|
+
exports.articleTemplate = articleTemplate;
|
|
320
|
+
exports.courseTemplate = courseTemplate;
|
|
321
|
+
exports.defaultTemplate = defaultTemplate;
|
|
322
|
+
exports.plantillaBase = card;
|
|
323
|
+
exports.talkTemplate = talkTemplate;
|