@eduardoalvarez/arrecife 0.6.0 → 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 (42) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +185 -20
  3. package/dist/brand/index.js +3 -3
  4. package/dist/chart/index.js +3 -3
  5. package/dist/{chunk-XKYHTOUJ.js → chunk-2WPWEIMD.js} +1 -1
  6. package/dist/chunk-45HVCTB7.js +70 -0
  7. package/dist/{chunk-DKCN7BAL.js → chunk-727HCBD4.js} +1 -1
  8. package/dist/{chunk-25YNFCIF.js → chunk-E6KFUSKB.js} +6 -3
  9. package/dist/{chunk-6O3KWB6P.js → chunk-JN3IS5OS.js} +2 -2
  10. package/dist/{chunk-O4TAH7YJ.js → chunk-OMKSESQB.js} +27 -3
  11. package/dist/{chunk-PMN7NR3G.js → chunk-TA7TLWW4.js} +1 -1
  12. package/dist/{chunk-JMOOFZ3B.js → chunk-WGNIRIN7.js} +1 -1
  13. package/dist/doctor.mjs +166 -0
  14. package/dist/form/index.js +4 -4
  15. package/dist/icons/index.cjs +149 -0
  16. package/dist/icons/index.d.cts +94 -0
  17. package/dist/icons/index.d.ts +94 -0
  18. package/dist/icons/index.js +28 -0
  19. package/dist/index-DlAO2JZs.d.cts +47 -0
  20. package/dist/index-DlAO2JZs.d.ts +47 -0
  21. package/dist/index.cjs +279 -103
  22. package/dist/index.d.cts +186 -57
  23. package/dist/index.d.ts +186 -57
  24. package/dist/index.js +262 -179
  25. package/dist/og/index.cjs +3 -2
  26. package/dist/og/index.js +1 -1
  27. package/dist/shiki/index.js +1 -1
  28. package/dist/social/index.cjs +67 -0
  29. package/dist/social/index.d.cts +2 -0
  30. package/dist/social/index.d.ts +2 -0
  31. package/dist/social/index.js +2 -0
  32. package/dist/tokens/index.cjs +27 -3
  33. package/dist/tokens/index.d.cts +33 -6
  34. package/dist/tokens/index.d.ts +33 -6
  35. package/dist/tokens/index.js +2 -2
  36. package/dist/tokens/theme.css +33 -3
  37. package/dist/variants/index.cjs +6 -3
  38. package/dist/variants/index.d.cts +4 -1
  39. package/dist/variants/index.d.ts +4 -1
  40. package/dist/variants/index.js +1 -1
  41. package/llms.txt +363 -30
  42. package/package.json +24 -2
package/dist/og/index.cjs CHANGED
@@ -39,7 +39,8 @@ var dark = {
39
39
  warm: "#F2A65A"};
40
40
  var light = {
41
41
  background: "#F6F2EA",
42
- surfaceRaised: "#EFE9DE",
42
+ // paper
43
+ surface: "#FFFFFF",
43
44
  // hairline on card hover
44
45
  textPrimary: "#0B1524",
45
46
  // 16.40:1
@@ -64,7 +65,7 @@ var gradient = {
64
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 = {
package/dist/og/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ASSETS_PATH, faces, poses, fins } from '../chunk-CKRSQPTX.js';
2
- import { fonts, dark, light, naming, gradient, tagline, typeScale } from '../chunk-O4TAH7YJ.js';
2
+ import { fonts, dark, light, naming, gradient, tagline, typeScale } from '../chunk-OMKSESQB.js';
3
3
  import '../chunk-MLKGABMK.js';
4
4
 
5
5
  // src/og/templates.ts
@@ -1,4 +1,4 @@
1
- import { syntax } from '../chunk-O4TAH7YJ.js';
1
+ import { syntax } from '../chunk-OMKSESQB.js';
2
2
  import '../chunk-MLKGABMK.js';
3
3
 
4
4
  // src/shiki/theme.ts
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/social/index.tsx
6
+ function Brand({ children, ...props }) {
7
+ return /* @__PURE__ */ jsxRuntime.jsx(
8
+ "svg",
9
+ {
10
+ viewBox: "0 0 24 24",
11
+ width: "1em",
12
+ height: "1em",
13
+ fill: "currentColor",
14
+ "aria-hidden": "true",
15
+ focusable: "false",
16
+ ...props,
17
+ children
18
+ }
19
+ );
20
+ }
21
+ function Functional({ children, ...props }) {
22
+ return /* @__PURE__ */ jsxRuntime.jsx(
23
+ "svg",
24
+ {
25
+ viewBox: "0 0 24 24",
26
+ width: "1em",
27
+ height: "1em",
28
+ fill: "none",
29
+ stroke: "currentColor",
30
+ strokeWidth: 1.6,
31
+ strokeLinecap: "round",
32
+ strokeLinejoin: "round",
33
+ "aria-hidden": "true",
34
+ focusable: "false",
35
+ ...props,
36
+ children
37
+ }
38
+ );
39
+ }
40
+ var GitHub = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 .5C5.73.5.5 5.73.5 12a11.5 11.5 0 0 0 7.86 10.91c.58.1.79-.25.79-.55 0-.27-.01-1.18-.02-2.14-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.55-.29-5.24-1.28-5.24-5.69 0-1.26.45-2.29 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11 11 0 0 1 5.79 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.76.12 3.05.74.8 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.68.41.36.78 1.06.78 2.14 0 1.55-.01 2.79-.01 3.17 0 .3.2.66.79.55A11.5 11.5 0 0 0 23.5 12C23.5 5.73 18.27.5 12 .5Z" }) });
41
+ var LinkedIn = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9h4v12H3V9Zm7 0h3.8v1.71h.05a4.17 4.17 0 0 1 3.75-2.06c4.01 0 4.75 2.64 4.75 6.07V21h-4v-5.4c0-1.29-.02-2.95-1.8-2.95-1.8 0-2.08 1.4-2.08 2.85V21h-3.97V9Z" }) });
42
+ var X = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17.53 3h3.06l-6.69 7.64L21.75 21h-6.16l-4.83-6.3L5.25 21H2.19l7.15-8.17L2.5 3h6.32l4.36 5.77L17.53 3Zm-1.07 16.17h1.7L7.62 4.74H5.8l10.66 14.43Z" }) });
43
+ var Instagram = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2.16c3.2 0 3.58.01 4.85.07 1.17.05 1.8.25 2.23.41.56.22.96.48 1.38.9.42.42.68.82.9 1.38.16.42.36 1.06.41 2.23.06 1.27.07 1.65.07 4.85s-.01 3.58-.07 4.85c-.05 1.17-.25 1.8-.41 2.23-.22.56-.48.96-.9 1.38-.42.42-.82.68-1.38.9-.42.16-1.06.36-2.23.41-1.27.06-1.65.07-4.85.07s-3.58-.01-4.85-.07c-1.17-.05-1.8-.25-2.23-.41-.56-.22-.96-.48-1.38-.9-.42-.42-.68-.82-.9-1.38-.16-.42-.36-1.06-.41-2.23C2.17 15.58 2.16 15.2 2.16 12s.01-3.58.07-4.85c.05-1.17.25-1.8.41-2.23.22-.56.48-.96.9-1.38.42-.42.82-.68 1.38-.9.42-.16 1.06-.36 2.23-.41C8.42 2.17 8.8 2.16 12 2.16Zm0 3.68a6.16 6.16 0 1 0 0 12.32 6.16 6.16 0 0 0 0-12.32Zm0 10.16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Zm7.85-10.4a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0Z" }) });
44
+ var Discord = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20.32 5.56A18.5 18.5 0 0 0 15.7 4.1a.07.07 0 0 0-.07.04c-.2.36-.42.82-.58 1.19a17 17 0 0 0-5.1 0c-.16-.38-.39-.83-.59-1.19a.07.07 0 0 0-.07-.04c-1.6.28-3.15.77-4.62 1.46a.06.06 0 0 0-.03.03C1.66 10 .9 14.28 1.28 18.5a.08.08 0 0 0 .03.05 18.6 18.6 0 0 0 5.6 2.84.07.07 0 0 0 .08-.03c.43-.59.81-1.21 1.14-1.86a.07.07 0 0 0-.04-.1c-.6-.23-1.18-.51-1.74-.83a.07.07 0 0 1-.01-.12l.35-.27a.07.07 0 0 1 .07-.01 13.3 13.3 0 0 0 11.3 0 .07.07 0 0 1 .08.01l.34.27c.04.04.04.1-.01.12-.55.33-1.13.6-1.74.83a.07.07 0 0 0-.04.1c.34.65.72 1.27 1.14 1.86a.07.07 0 0 0 .08.03 18.5 18.5 0 0 0 5.6-2.84.07.07 0 0 0 .04-.05c.45-4.88-.75-9.12-3.18-12.88a.06.06 0 0 0-.03-.03ZM8.4 15.93c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.9 2.25-2.02 2.25Zm7.22 0c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.89 2.25-2.02 2.25Z" }) });
45
+ var YouTube = (props) => /* @__PURE__ */ jsxRuntime.jsx(Brand, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M23.5 6.9a3 3 0 0 0-2.12-2.12C19.5 4.27 12 4.27 12 4.27s-7.5 0-9.38.51A3 3 0 0 0 .5 6.9 31.3 31.3 0 0 0 0 12a31.3 31.3 0 0 0 .5 5.1 3 3 0 0 0 2.12 2.12c1.88.51 9.38.51 9.38.51s7.5 0 9.38-.51a3 3 0 0 0 2.12-2.12A31.3 31.3 0 0 0 24 12a31.3 31.3 0 0 0-.5-5.1ZM9.6 15.6V8.4l6.24 3.6-6.24 3.6Z" }) });
46
+ var Rss = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Functional, { ...props, children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16" }),
48
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "5", cy: "19", r: "1.6", fill: "currentColor", stroke: "none" })
49
+ ] });
50
+ var Email = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Functional, { ...props, children: [
51
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2.75", y: "4.75", width: "18.5", height: "14.5", rx: "2" }),
52
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" })
53
+ ] });
54
+ var Newsletter = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Functional, { ...props, children: [
55
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 8.5a6 6 0 1 0-12 0c0 5-2 6.5-2 6.5h16s-2-1.5-2-6.5" }),
56
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M13.7 19a2 2 0 0 1-3.4 0" })
57
+ ] });
58
+
59
+ exports.Discord = Discord;
60
+ exports.Email = Email;
61
+ exports.GitHub = GitHub;
62
+ exports.Instagram = Instagram;
63
+ exports.LinkedIn = LinkedIn;
64
+ exports.Newsletter = Newsletter;
65
+ exports.Rss = Rss;
66
+ exports.X = X;
67
+ exports.YouTube = YouTube;
@@ -0,0 +1,2 @@
1
+ import 'react';
2
+ export { D as Discord, E as Email, G as GitHub, I as Instagram, L as LinkedIn, N as Newsletter, R as Rss, S as SocialIconProps, X, Y as YouTube } from '../index-DlAO2JZs.cjs';
@@ -0,0 +1,2 @@
1
+ import 'react';
2
+ export { D as Discord, E as Email, G as GitHub, I as Instagram, L as LinkedIn, N as Newsletter, R as Rss, S as SocialIconProps, X, Y as YouTube } from '../index-DlAO2JZs.js';
@@ -0,0 +1,2 @@
1
+ export { Discord, Email, GitHub, Instagram, LinkedIn, Newsletter, Rss, X, YouTube } from '../chunk-45HVCTB7.js';
2
+ import '../chunk-MLKGABMK.js';
@@ -215,6 +215,30 @@ var spacing = {
215
215
  var size = {
216
216
  /** Navigation bar height. */
217
217
  nav: 64,
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,
218
242
  /** Reading column width. */
219
243
  content: 760,
220
244
  /** Maximum page width. */
@@ -247,9 +271,9 @@ var gradient = {
247
271
  og: `linear-gradient(145deg, ${dark.background} 55%, ${deep} 100%)`
248
272
  },
249
273
  light: {
250
- hero: `linear-gradient(160deg, ${light.background} 60%, ${light.surfaceRaised} 100%)`,
251
- section: `linear-gradient(150deg, ${light.surface} 0%, ${light.surfaceRaised} 100%)`,
252
- 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%)`
253
277
  }
254
278
  };
255
279
  var shadow = {
@@ -397,6 +397,30 @@ declare const spacing: {
397
397
  declare const size: {
398
398
  /** Navigation bar height. */
399
399
  readonly nav: 64;
400
+ /**
401
+ * The bar when it shares the screen with a sidebar.
402
+ *
403
+ * It is not «a smaller bar because it looks better». At 64 the header of an
404
+ * app shell competes with the rail beside it for the same corner, and the two
405
+ * together eat the top of the content area. 56 is what `cursos` had arrived at
406
+ * on its own, and it is the same reasoning as `control.iconSm`: the one admin
407
+ * app of the five is denser than the four reading sites. See
408
+ * `docs/decisions.md` § 30.
409
+ */
410
+ readonly navCompact: 56;
411
+ /**
412
+ * The admin sidebar, and the rail it collapses to.
413
+ *
414
+ * They are tokens and not the consumer's `w-*` because a collapsible sidebar
415
+ * has to know BOTH: the layout beside it reserves one of the two, and two
416
+ * numbers written by hand in two files drift the first time one of them moves.
417
+ * A sidebar that never collapses is still just a box the layout sizes.
418
+ *
419
+ * 56 is the rail: `navCompact`'s height, so a panel's bar and its rail meet in
420
+ * a square corner instead of a step.
421
+ */
422
+ readonly sidebar: 256;
423
+ readonly sidebarRail: 56;
400
424
  /** Reading column width. */
401
425
  readonly content: 760;
402
426
  /** Maximum page width. */
@@ -478,9 +502,9 @@ declare const gradient: {
478
502
  readonly og: "linear-gradient(145deg, #091319 55%, #0D2129 100%)";
479
503
  };
480
504
  readonly light: {
481
- readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #EFE9DE 100%)";
482
- readonly section: "linear-gradient(150deg, #FFFFFF 0%, #EFE9DE 100%)";
483
- readonly og: "linear-gradient(145deg, #F6F2EA 55%, #EFE9DE 100%)";
505
+ readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #FFFFFF 100%)";
506
+ readonly section: "linear-gradient(150deg, #FFFFFF 0%, #F6F2EA 100%)";
507
+ readonly og: "linear-gradient(145deg, #F6F2EA 55%, #FFFFFF 100%)";
484
508
  };
485
509
  };
486
510
  /** A single level. There is no elevation scale. */
@@ -711,6 +735,9 @@ declare const tokens: {
711
735
  };
712
736
  readonly size: {
713
737
  readonly nav: 64;
738
+ readonly navCompact: 56;
739
+ readonly sidebar: 256;
740
+ readonly sidebarRail: 56;
714
741
  readonly content: 760;
715
742
  readonly wide: 1180;
716
743
  };
@@ -721,9 +748,9 @@ declare const tokens: {
721
748
  readonly og: "linear-gradient(145deg, #091319 55%, #0D2129 100%)";
722
749
  };
723
750
  readonly light: {
724
- readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #EFE9DE 100%)";
725
- readonly section: "linear-gradient(150deg, #FFFFFF 0%, #EFE9DE 100%)";
726
- readonly og: "linear-gradient(145deg, #F6F2EA 55%, #EFE9DE 100%)";
751
+ readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #FFFFFF 100%)";
752
+ readonly section: "linear-gradient(150deg, #FFFFFF 0%, #F6F2EA 100%)";
753
+ readonly og: "linear-gradient(145deg, #F6F2EA 55%, #FFFFFF 100%)";
727
754
  };
728
755
  };
729
756
  readonly syntax: {
@@ -397,6 +397,30 @@ declare const spacing: {
397
397
  declare const size: {
398
398
  /** Navigation bar height. */
399
399
  readonly nav: 64;
400
+ /**
401
+ * The bar when it shares the screen with a sidebar.
402
+ *
403
+ * It is not «a smaller bar because it looks better». At 64 the header of an
404
+ * app shell competes with the rail beside it for the same corner, and the two
405
+ * together eat the top of the content area. 56 is what `cursos` had arrived at
406
+ * on its own, and it is the same reasoning as `control.iconSm`: the one admin
407
+ * app of the five is denser than the four reading sites. See
408
+ * `docs/decisions.md` § 30.
409
+ */
410
+ readonly navCompact: 56;
411
+ /**
412
+ * The admin sidebar, and the rail it collapses to.
413
+ *
414
+ * They are tokens and not the consumer's `w-*` because a collapsible sidebar
415
+ * has to know BOTH: the layout beside it reserves one of the two, and two
416
+ * numbers written by hand in two files drift the first time one of them moves.
417
+ * A sidebar that never collapses is still just a box the layout sizes.
418
+ *
419
+ * 56 is the rail: `navCompact`'s height, so a panel's bar and its rail meet in
420
+ * a square corner instead of a step.
421
+ */
422
+ readonly sidebar: 256;
423
+ readonly sidebarRail: 56;
400
424
  /** Reading column width. */
401
425
  readonly content: 760;
402
426
  /** Maximum page width. */
@@ -478,9 +502,9 @@ declare const gradient: {
478
502
  readonly og: "linear-gradient(145deg, #091319 55%, #0D2129 100%)";
479
503
  };
480
504
  readonly light: {
481
- readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #EFE9DE 100%)";
482
- readonly section: "linear-gradient(150deg, #FFFFFF 0%, #EFE9DE 100%)";
483
- readonly og: "linear-gradient(145deg, #F6F2EA 55%, #EFE9DE 100%)";
505
+ readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #FFFFFF 100%)";
506
+ readonly section: "linear-gradient(150deg, #FFFFFF 0%, #F6F2EA 100%)";
507
+ readonly og: "linear-gradient(145deg, #F6F2EA 55%, #FFFFFF 100%)";
484
508
  };
485
509
  };
486
510
  /** A single level. There is no elevation scale. */
@@ -711,6 +735,9 @@ declare const tokens: {
711
735
  };
712
736
  readonly size: {
713
737
  readonly nav: 64;
738
+ readonly navCompact: 56;
739
+ readonly sidebar: 256;
740
+ readonly sidebarRail: 56;
714
741
  readonly content: 760;
715
742
  readonly wide: 1180;
716
743
  };
@@ -721,9 +748,9 @@ declare const tokens: {
721
748
  readonly og: "linear-gradient(145deg, #091319 55%, #0D2129 100%)";
722
749
  };
723
750
  readonly light: {
724
- readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #EFE9DE 100%)";
725
- readonly section: "linear-gradient(150deg, #FFFFFF 0%, #EFE9DE 100%)";
726
- readonly og: "linear-gradient(145deg, #F6F2EA 55%, #EFE9DE 100%)";
751
+ readonly hero: "linear-gradient(160deg, #F6F2EA 60%, #FFFFFF 100%)";
752
+ readonly section: "linear-gradient(150deg, #FFFFFF 0%, #F6F2EA 100%)";
753
+ readonly og: "linear-gradient(145deg, #F6F2EA 55%, #FFFFFF 100%)";
727
754
  };
728
755
  };
729
756
  readonly syntax: {
@@ -1,3 +1,3 @@
1
- export { tokens } from '../chunk-PMN7NR3G.js';
2
- export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from '../chunk-O4TAH7YJ.js';
1
+ export { tokens } from '../chunk-TA7TLWW4.js';
2
+ export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from '../chunk-OMKSESQB.js';
3
3
  import '../chunk-MLKGABMK.js';
@@ -123,6 +123,9 @@
123
123
  --spacing-control-icon-sm: 32px;
124
124
 
125
125
  --spacing-nav: 64px;
126
+ --spacing-nav-compact: 56px;
127
+ --spacing-sidebar: 256px;
128
+ --spacing-sidebar-rail: 56px;
126
129
  --container-content: 760px;
127
130
  --container-wide: 1180px;
128
131
  --container-measure: 68ch;
@@ -204,9 +207,9 @@
204
207
  --color-series-3: #3E7CB1;
205
208
  --color-series-4: #626A75;
206
209
 
207
- --gradient-hero: linear-gradient(160deg, #F6F2EA 60%, #EFE9DE 100%);
208
- --gradient-section: linear-gradient(150deg, #FFFFFF 0%, #EFE9DE 100%);
209
- --gradient-og: linear-gradient(145deg, #F6F2EA 55%, #EFE9DE 100%);
210
+ --gradient-hero: linear-gradient(160deg, #F6F2EA 60%, #FFFFFF 100%);
211
+ --gradient-section: linear-gradient(150deg, #FFFFFF 0%, #F6F2EA 100%);
212
+ --gradient-og: linear-gradient(145deg, #F6F2EA 55%, #FFFFFF 100%);
210
213
  }
211
214
 
212
215
  /* --- the system's two gradients, as utilities -------------------------------
@@ -335,6 +338,33 @@
335
338
  animation: arrecife-slide-out-bottom var(--duration-standard) var(--ease-standard);
336
339
  }
337
340
 
341
+ /* --- the focus ring ---------------------------------------------------------
342
+ The document gives it once, on the primary button: «focus ring 2px #35D6C0 +
343
+ offset 3px». The code had it as three classes copied to twenty-nine call
344
+ sites in twenty-four files, all of them at offset 2, and three audits in a row
345
+ said so — the value was never argued down to 2, it was copied from the first
346
+ component and inherited by the next twenty-eight.
347
+
348
+ It is one utility for the reason § 15 gives: a list kept in sync by hand with
349
+ another list ends up out of sync. Twenty-nine copies is twenty-nine chances to
350
+ write the next one at offset 2 again, and nothing was checking.
351
+
352
+ focus-ring-warm exists for the ONE control the ring cannot be biolume on:
353
+ the conversion button is the system's only sand fill, and a biolume ring
354
+ around it puts both of the brand's accents in the same three pixels. It sets
355
+ only the color, so the width and the offset stay in one place. */
356
+ @utility focus-ring {
357
+ &:focus-visible {
358
+ outline: 2px solid var(--color-accent);
359
+ outline-offset: 3px;
360
+ }
361
+ }
362
+ @utility focus-ring-warm {
363
+ &:focus-visible {
364
+ outline-color: var(--color-warm);
365
+ }
366
+ }
367
+
338
368
  /* The system's only transition, as a utility. States are communicated with
339
369
  border and color, not with movement: this class cannot animate anything else. */
340
370
  @utility transition-standard {
@@ -8,7 +8,7 @@ var button = classVarianceAuthority.cva(
8
8
  "inline-flex cursor-pointer items-center justify-center gap-step-xs whitespace-nowrap select-none",
9
9
  "rounded-control font-sans font-medium",
10
10
  "transition-standard",
11
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
11
+ "focus-ring",
12
12
  "disabled:pointer-events-none disabled:opacity-50",
13
13
  "[&_svg]:shrink-0"
14
14
  ],
@@ -19,7 +19,10 @@ var button = classVarianceAuthority.cva(
19
19
  "bg-accent text-accent-on hover:bg-accent-hover",
20
20
  "light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
21
21
  ],
22
- conversion: "bg-warm text-warm-on hover:bg-warm-hover",
22
+ // The one control whose focus ring is not biolume. It is the system's
23
+ // only sand fill, and a biolume ring three pixels off a sand button puts
24
+ // both of the brand's accents in the same glance. See `decisions.md` § 37.
25
+ conversion: "bg-warm text-warm-on hover:bg-warm-hover focus-ring-warm",
23
26
  secondary: [
24
27
  "border-hairline-hover border bg-transparent text-text-primary",
25
28
  "hover:border-accent hover:text-accent"
@@ -177,7 +180,7 @@ var CARD = [
177
180
  "group block cursor-pointer",
178
181
  CARD_SURFACE,
179
182
  CARD_HOVER,
180
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
183
+ "focus-ring"
181
184
  ];
182
185
 
183
186
  exports.CARD = CARD;
@@ -174,7 +174,10 @@ declare const avatar: (props?: ({
174
174
  * hand: that project ships no framework JavaScript and cannot import a
175
175
  * component, so until now it copied the class list into its Astro. The copy had
176
176
  * already drifted once — the hero gradient sat at `55%` and `#e9eeea` against
177
- * the token's `60%` and `#EFE9DE`, and nothing compared them.
177
+ * the token's `60%` and, at the time, `#EFE9DE`. Nothing compared them. The
178
+ * light gradient's second stop is `#FFFFFF` since § 9 was measured, which is the
179
+ * same lesson from the other side: a copied value goes stale when the original
180
+ * moves, and only the original is ever right.
178
181
  */
179
182
  declare const CARD_SURFACE = "rounded-card border-hairline bg-surface border";
180
183
  /** Rule 6's hover: the border only. Applied where the card is clickable. */
@@ -174,7 +174,10 @@ declare const avatar: (props?: ({
174
174
  * hand: that project ships no framework JavaScript and cannot import a
175
175
  * component, so until now it copied the class list into its Astro. The copy had
176
176
  * already drifted once — the hero gradient sat at `55%` and `#e9eeea` against
177
- * the token's `60%` and `#EFE9DE`, and nothing compared them.
177
+ * the token's `60%` and, at the time, `#EFE9DE`. Nothing compared them. The
178
+ * light gradient's second stop is `#FFFFFF` since § 9 was measured, which is the
179
+ * same lesson from the other side: a copied value goes stale when the original
180
+ * moves, and only the original is ever right.
178
181
  */
179
182
  declare const CARD_SURFACE = "rounded-card border-hairline bg-surface border";
180
183
  /** Rule 6's hover: the border only. Applied where the card is clickable. */
@@ -1,3 +1,3 @@
1
- export { CARD, CARD_HOVER, CARD_SURFACE, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, category as categoryBadgeVariants, metric as metricBadgeVariants } from '../chunk-25YNFCIF.js';
1
+ export { CARD, CARD_HOVER, CARD_SURFACE, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, category as categoryBadgeVariants, metric as metricBadgeVariants } from '../chunk-E6KFUSKB.js';
2
2
  export { text as textVariants } from '../chunk-ODBFN44D.js';
3
3
  import '../chunk-MLKGABMK.js';