@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.
- package/CHANGELOG.md +45 -0
- package/README.md +706 -470
- 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-25YNFCIF.js +141 -0
- package/dist/{chunk-YZ2SDOVZ.js → chunk-6O3KWB6P.js} +30 -30
- package/dist/chunk-CKRSQPTX.js +36 -0
- package/dist/{chunk-ZEOQKRQ7.js → chunk-DKCN7BAL.js} +1 -1
- package/dist/chunk-GCRII2KQ.js +86 -0
- package/dist/chunk-JMOOFZ3B.js +42 -0
- package/dist/chunk-O4TAH7YJ.js +276 -0
- package/dist/chunk-ODBFN44D.js +45 -0
- package/dist/{chunk-VPT32GPG.js → chunk-PMN7NR3G.js} +2 -2
- package/dist/chunk-XKYHTOUJ.js +27 -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/index.cjs +1047 -914
- package/dist/index.d.cts +769 -777
- package/dist/index.d.ts +769 -777
- package/dist/index.js +608 -660
- 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 +130 -130
- 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/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 +133 -86
- package/dist/tokens/index.d.cts +246 -161
- package/dist/tokens/index.d.ts +246 -161
- package/dist/tokens/index.js +2 -2
- package/dist/tokens/theme.css +133 -98
- package/dist/variants/index.cjs +192 -0
- package/dist/variants/index.d.cts +192 -0
- package/dist/variants/index.d.ts +192 -0
- package/dist/variants/index.js +3 -0
- package/llms.txt +810 -744
- package/package.json +20 -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
package/dist/tokens/index.cjs
CHANGED
|
@@ -3,144 +3,175 @@
|
|
|
3
3
|
// src/tokens/tokens.ts
|
|
4
4
|
var dark = {
|
|
5
5
|
background: "#091319",
|
|
6
|
-
//
|
|
6
|
+
// abyss · page background
|
|
7
7
|
surface: "#10202B",
|
|
8
|
-
//
|
|
8
|
+
// trench · cards and panels
|
|
9
9
|
surfaceRaised: "#17303E",
|
|
10
|
-
//
|
|
10
|
+
// current · menus, active tabs
|
|
11
11
|
border: "#22414F",
|
|
12
|
-
//
|
|
12
|
+
// control borders
|
|
13
13
|
hairline: "#1E3441",
|
|
14
|
-
//
|
|
14
|
+
// subtle dividers
|
|
15
15
|
hairlineHover: "#2C4D5D",
|
|
16
|
-
// hairline
|
|
16
|
+
// hairline on card hover
|
|
17
17
|
textPrimary: "#EDF4F3",
|
|
18
|
-
//
|
|
18
|
+
// foam 16.84:1
|
|
19
19
|
textSecondary: "#A7BCC4",
|
|
20
|
-
//
|
|
20
|
+
// haze 9.50:1
|
|
21
21
|
textMuted: "#71919C",
|
|
22
|
-
//
|
|
22
|
+
// plankton 5.57:1 never under 13px
|
|
23
23
|
accent: "#35D6C0",
|
|
24
|
-
//
|
|
24
|
+
// biolume 10.31:1 interactive
|
|
25
25
|
accentHover: "#5FE3D1",
|
|
26
26
|
accentOn: "#06171A",
|
|
27
|
-
//
|
|
27
|
+
// ink over biolume
|
|
28
28
|
warm: "#F2A65A",
|
|
29
|
-
//
|
|
29
|
+
// sand 9.28:1 human and conversion
|
|
30
30
|
warmHover: "#F7BB7D",
|
|
31
31
|
warmOn: "#2A1605",
|
|
32
|
-
//
|
|
32
|
+
// ink over sand
|
|
33
33
|
success: "#4FB477",
|
|
34
34
|
warning: "#E8A33D",
|
|
35
|
-
error: "#E15757"
|
|
36
|
-
// 4.51:1
|
|
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
|
-
//
|
|
56
|
+
// paper
|
|
41
57
|
surface: "#FFFFFF",
|
|
42
58
|
surfaceRaised: "#EFE9DE",
|
|
43
59
|
border: "#E6DFD2",
|
|
44
60
|
hairline: "#EBE6DC",
|
|
45
61
|
hairlineHover: "#D3C8B2",
|
|
46
|
-
// hairline
|
|
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
|
|
67
|
+
// 4.53:1 over surfaceRaised
|
|
52
68
|
accent: "#0D7C6F",
|
|
53
|
-
//
|
|
69
|
+
// dark biolume 4.55:1
|
|
54
70
|
accentHover: "#0C7466",
|
|
55
71
|
accentOn: "#FFFFFF",
|
|
56
72
|
warm: "#A65B27",
|
|
57
|
-
//
|
|
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
|
|
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
|
-
/**
|
|
98
|
+
/** The mascot's body. 4.22:1 → FILL ONLY, NEVER text. */
|
|
68
99
|
body: "#3E7CB1",
|
|
69
|
-
/**
|
|
100
|
+
/** Spot pattern. */
|
|
70
101
|
spots: "#C2D7E7",
|
|
71
|
-
/**
|
|
102
|
+
/** Hull · outline, and the background of code blocks. */
|
|
72
103
|
hull: "#0B1524"
|
|
73
104
|
};
|
|
74
105
|
var fonts = {
|
|
75
|
-
/**
|
|
106
|
+
/** Headlines and large numbers ONLY. Never body copy. */
|
|
76
107
|
display: '"Bricolage Grotesque", ui-sans-serif, system-ui, sans-serif',
|
|
77
|
-
/**
|
|
108
|
+
/** Body and interface. */
|
|
78
109
|
sans: '"Geist", ui-sans-serif, system-ui, sans-serif',
|
|
79
|
-
/**
|
|
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
|
-
/**
|
|
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.
|
|
122
|
+
* 17px. The large button, and the deck on interior pages.
|
|
92
123
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
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
|
-
*
|
|
133
|
+
* The status-badge scale: sans 12.5/500, squared off.
|
|
103
134
|
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
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
|
-
*
|
|
141
|
+
* The category and metric scale: mono 11.5.
|
|
111
142
|
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* 5.57:1
|
|
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
|
-
*
|
|
118
|
-
*
|
|
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
|
|
123
|
-
*
|
|
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
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
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
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
* 12.5
|
|
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
|
-
/**
|
|
170
|
+
/** Absolute minimum on screen. */
|
|
140
171
|
minScreenPx: 13,
|
|
141
|
-
/**
|
|
172
|
+
/** Absolute minimum in print. */
|
|
142
173
|
minPrintPt: 12,
|
|
143
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
216
|
+
/** Navigation bar height. */
|
|
170
217
|
nav: 64,
|
|
171
|
-
/**
|
|
218
|
+
/** Reading column width. */
|
|
172
219
|
content: 760,
|
|
173
|
-
/**
|
|
220
|
+
/** Maximum page width. */
|
|
174
221
|
wide: 1180
|
|
175
222
|
};
|
|
176
|
-
var
|
|
177
|
-
/**
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
|
|
181
|
-
/**
|
|
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
|
-
/**
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
|
|
230
|
+
/** Keywords, control flow, `import`, `this`. */
|
|
231
|
+
keyword: dark.warm,
|
|
232
|
+
/** Comments and punctuation. */
|
|
233
|
+
comment: dark.textMuted,
|
|
187
234
|
/** `markup.deleted`, `invalid`. */
|
|
188
|
-
|
|
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
|
|
241
|
+
var deep = "#0D2129";
|
|
195
242
|
var gradient = {
|
|
196
243
|
dark: {
|
|
197
|
-
hero: `linear-gradient(160deg, ${dark.background} 60%, ${
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
og: `linear-gradient(145deg, ${dark.background} 55%, ${
|
|
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
|
-
|
|
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
|
-
|
|
219
|
-
/** Header,
|
|
220
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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;
|