@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
@@ -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,43 +213,67 @@ 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
+ /**
219
+ * The bar when it shares the screen with a sidebar.
220
+ *
221
+ * It is not «a smaller bar because it looks better». At 64 the header of an
222
+ * app shell competes with the rail beside it for the same corner, and the two
223
+ * together eat the top of the content area. 56 is what `cursos` had arrived at
224
+ * on its own, and it is the same reasoning as `control.iconSm`: the one admin
225
+ * app of the five is denser than the four reading sites. See
226
+ * `docs/decisions.md` § 30.
227
+ */
228
+ navCompact: 56,
229
+ /**
230
+ * The admin sidebar, and the rail it collapses to.
231
+ *
232
+ * They are tokens and not the consumer's `w-*` because a collapsible sidebar
233
+ * has to know BOTH: the layout beside it reserves one of the two, and two
234
+ * numbers written by hand in two files drift the first time one of them moves.
235
+ * A sidebar that never collapses is still just a box the layout sizes.
236
+ *
237
+ * 56 is the rail: `navCompact`'s height, so a panel's bar and its rail meet in
238
+ * a square corner instead of a step.
239
+ */
240
+ sidebar: 256,
241
+ sidebarRail: 56,
242
+ /** Reading column width. */
172
243
  content: 760,
173
- /** Ancho máximo de página. */
244
+ /** Maximum page width. */
174
245
  wide: 1180
175
246
  };
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. */
247
+ var syntax = {
248
+ /** The hull. It is the block background in both modes. */
249
+ background: brand.hull,
250
+ /** Identifiers, functions, types, variables. */
251
+ identifier: dark.textPrimary,
252
+ /** Strings, numbers, booleans, null. */
182
253
  literal: dark.accent,
183
- /** Palabras clave, control de flujo, `import`, `this`. */
184
- palabraClave: dark.warm,
185
- /** Comentarios y puntuación. */
186
- comentario: dark.textMuted,
254
+ /** Keywords, control flow, `import`, `this`. */
255
+ keyword: dark.warm,
256
+ /** Comments and punctuation. */
257
+ comment: dark.textMuted,
187
258
  /** `markup.deleted`, `invalid`. */
188
- invalido: dark.error
259
+ invalid: dark.error
189
260
  };
190
261
  var series = {
191
262
  dark: [dark.accent, dark.warm, brand.body, dark.textMuted],
192
263
  light: [light.accent, light.warm, brand.body, light.textMuted]
193
264
  };
194
- var profundo = "#0D2129";
265
+ var deep = "#0D2129";
195
266
  var gradient = {
196
267
  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%)`
268
+ hero: `linear-gradient(160deg, ${dark.background} 60%, ${deep} 100%)`,
269
+ section: `linear-gradient(150deg, ${dark.surface} 0%, ${deep} 100%)`,
270
+ /** The one used by the article OG template. 145°, from the document. */
271
+ og: `linear-gradient(145deg, ${dark.background} 55%, ${deep} 100%)`
201
272
  },
202
273
  light: {
203
- hero: `linear-gradient(160deg, ${light.background} 60%, ${light.surfaceRaised} 100%)`,
204
- seccion: `linear-gradient(150deg, ${light.surface} 0%, ${light.surfaceRaised} 100%)`,
205
- og: `linear-gradient(145deg, ${light.background} 55%, ${light.surfaceRaised} 100%)`
274
+ hero: `linear-gradient(160deg, ${light.background} 60%, ${light.surface} 100%)`,
275
+ section: `linear-gradient(150deg, ${light.surface} 0%, ${light.background} 100%)`,
276
+ og: `linear-gradient(145deg, ${light.background} 55%, ${light.surface} 100%)`
206
277
  }
207
278
  };
208
279
  var shadow = {
@@ -215,16 +286,16 @@ var motion = {
215
286
  };
216
287
  var tagline = {
217
288
  /** 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",
289
+ long: "Ayudo a equipos de ingenier\xEDa a escalar con criterio",
290
+ /** Header, one line. */
291
+ short: "Ayudo a equipos a escalar con criterio",
221
292
  /** LinkedIn. */
222
293
  en: "Helping engineering teams scale with judgment"
223
294
  };
224
295
  var naming = {
225
296
  wordmark: "Eduardo \xC1lvarez",
226
297
  mascot: "Tiburonc\xEDn",
227
- /** El dominio, para la firma CLI del footer: `$ cd ~/eduardoalvarez.dev/2026`. */
298
+ /** The domain, for the footer CLI signature: `$ cd ~/eduardoalvarez.dev/2026`. */
228
299
  domain: "eduardoalvarez.dev"
229
300
  };
230
301
 
@@ -240,7 +311,7 @@ var tokens = {
240
311
  spacing,
241
312
  size,
242
313
  gradient,
243
- sintaxis,
314
+ syntax,
244
315
  series,
245
316
  shadow,
246
317
  motion,
@@ -261,9 +332,9 @@ exports.naming = naming;
261
332
  exports.radius = radius;
262
333
  exports.series = series;
263
334
  exports.shadow = shadow;
264
- exports.sintaxis = sintaxis;
265
335
  exports.size = size;
266
336
  exports.spacing = spacing;
337
+ exports.syntax = syntax;
267
338
  exports.tagline = tagline;
268
339
  exports.tokens = tokens;
269
340
  exports.typeScale = typeScale;