@eduardoalvarez/arrecife 0.9.0 → 0.11.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 (41) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +111 -70
  3. package/dist/brand/index.cjs +9 -3
  4. package/dist/brand/index.d.cts +45 -6
  5. package/dist/brand/index.d.ts +45 -6
  6. package/dist/brand/index.js +2 -3
  7. package/dist/chart/index.cjs +26 -4
  8. package/dist/chart/index.d.cts +19 -3
  9. package/dist/chart/index.d.ts +19 -3
  10. package/dist/chart/index.js +26 -5
  11. package/dist/{chunk-MPZBF2TZ.js → chunk-RKGKO2TW.js} +11 -5
  12. package/dist/chunk-ZSCSKCTY.js +26 -0
  13. package/dist/form/index.js +0 -1
  14. package/dist/icons/index.d.cts +19 -10
  15. package/dist/icons/index.d.ts +19 -10
  16. package/dist/icons/index.js +2 -27
  17. package/dist/index.cjs +277 -401
  18. package/dist/index.d.cts +114 -13
  19. package/dist/index.d.ts +114 -13
  20. package/dist/index.js +211 -203
  21. package/dist/og/index.js +0 -1
  22. package/dist/shiki/index.js +0 -1
  23. package/dist/theme/index.js +0 -1
  24. package/dist/tokens/index.js +0 -1
  25. package/dist/tokens/theme.css +21 -1
  26. package/dist/variants/index.js +0 -1
  27. package/llms.txt +99 -138
  28. package/package.json +18 -30
  29. package/dist/chunk-HOADZ6GS.js +0 -72
  30. package/dist/chunk-LXRGQKMG.js +0 -145
  31. package/dist/chunk-MLKGABMK.js +0 -7
  32. package/dist/index-BbRplw_B.d.cts +0 -58
  33. package/dist/index-BbRplw_B.d.ts +0 -58
  34. package/dist/social/data.cjs +0 -161
  35. package/dist/social/data.d.cts +0 -161
  36. package/dist/social/data.d.ts +0 -161
  37. package/dist/social/data.js +0 -2
  38. package/dist/social/index.cjs +0 -153
  39. package/dist/social/index.d.cts +0 -2
  40. package/dist/social/index.d.ts +0 -2
  41. package/dist/social/index.js +0 -3
package/dist/index.js CHANGED
@@ -9,16 +9,15 @@ export { THEME_ATTRIBUTE, THEME_EVENT, THEME_KEY, applyTheme, currentTheme, pref
9
9
  import { alert, button, avatar, badge, category, metric, CARD_SURFACE, CARD } from './chunk-XXDATT3A.js';
10
10
  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-XXDATT3A.js';
11
11
  export { text as textVariants } from './chunk-ODBFN44D.js';
12
- import { MascotFace, Mascot } from './chunk-MPZBF2TZ.js';
13
- export { Isotype, Logo, Mascot, MascotFace } from './chunk-MPZBF2TZ.js';
14
- export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from './chunk-CKRSQPTX.js';
15
- export { social_exports as social } from './chunk-HOADZ6GS.js';
16
- import './chunk-LXRGQKMG.js';
12
+ import { MascotFace, Mascot } from './chunk-RKGKO2TW.js';
13
+ export { Isotype, Logo, Mascot, MascotFace } from './chunk-RKGKO2TW.js';
14
+ import { Icon } from './chunk-ZSCSKCTY.js';
17
15
  import { cn } from './chunk-FAAGZG7A.js';
18
16
  export { cn } from './chunk-FAAGZG7A.js';
17
+ export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from './chunk-CKRSQPTX.js';
19
18
  import { naming } from './chunk-FGFNK72B.js';
20
19
  export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from './chunk-FGFNK72B.js';
21
- import './chunk-MLKGABMK.js';
20
+ import { CaretDown, XCircle, Warning, CheckCircle, Info, Camera, CircleNotch, CaretLeft, CaretRight, Minus, Check, X, DotsThree, CaretUp, Copy, ArrowUpRight, TrendDown, TrendUp, Sun, Moon, WarningCircle, Waveform, ArrowCounterClockwise, ArrowClockwise, SpeakerSlash, SpeakerHigh, ArrowsClockwise, Pause, Play } from '@phosphor-icons/react';
22
21
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
23
22
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
24
23
  import { cva } from 'class-variance-authority';
@@ -42,118 +41,6 @@ import * as ToastPrimitive from '@radix-ui/react-toast';
42
41
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
43
42
  import { format } from 'date-fns';
44
43
 
45
- function Glyph({ children, ...props }) {
46
- return /* @__PURE__ */ jsx(
47
- "svg",
48
- {
49
- viewBox: "0 0 16 16",
50
- width: "1em",
51
- height: "1em",
52
- fill: "none",
53
- stroke: "currentColor",
54
- strokeWidth: 1.75,
55
- strokeLinecap: "round",
56
- strokeLinejoin: "round",
57
- "aria-hidden": "true",
58
- focusable: "false",
59
- ...props,
60
- children
61
- }
62
- );
63
- }
64
- var Check = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
65
- var Minus = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M3.5 8h9" }) });
66
- var ChevronDown = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M4 6l4 4 4-4" }) });
67
- var ChevronUp = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M4 10l4-4 4 4" }) });
68
- var ChevronLeft = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M10 4L6 8l4 4" }) });
69
- var ChevronRight = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M6 4l4 4-4 4" }) });
70
- var Close = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
71
- var Copy = (props) => /* @__PURE__ */ jsxs(Glyph, { ...props, children: [
72
- /* @__PURE__ */ jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
73
- /* @__PURE__ */ jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
74
- ] });
75
- var ArrowUpRight = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
76
- var Ellipsis = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
77
- var Spinner = (props) => /* @__PURE__ */ jsxs(
78
- "svg",
79
- {
80
- viewBox: "0 0 16 16",
81
- width: "1em",
82
- height: "1em",
83
- fill: "none",
84
- stroke: "currentColor",
85
- strokeWidth: 2,
86
- strokeLinecap: "round",
87
- "aria-hidden": "true",
88
- focusable: "false",
89
- className: "motion-safe:animate-spin",
90
- ...props,
91
- children: [
92
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
93
- /* @__PURE__ */ jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
94
- ]
95
- }
96
- );
97
- var Camera = (props) => /* @__PURE__ */ jsxs(Glyph, { ...props, children: [
98
- /* @__PURE__ */ jsx("path", { d: "M2 5.5h2.6l1-1.5h4.8l1 1.5H14v7.5H2z" }),
99
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "9", r: "2.4" })
100
- ] });
101
- var Sun = (props) => /* @__PURE__ */ jsxs(Glyph, { ...props, children: [
102
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "3" }),
103
- /* @__PURE__ */ jsx("path", { d: "M8 1.5v1.2M8 13.3v1.2M14.5 8h-1.2M2.7 8H1.5M12.6 3.4l-.85.85M4.25 11.75l-.85.85M12.6 12.6l-.85-.85M4.25 4.25l-.85-.85" })
104
- ] });
105
- var Moon = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M13.5 9.4A5.8 5.8 0 0 1 6.6 2.5a5.8 5.8 0 1 0 6.9 6.9Z" }) });
106
- function MediaGlyph({ children, ...props }) {
107
- return /* @__PURE__ */ jsx(
108
- "svg",
109
- {
110
- xmlns: "http://www.w3.org/2000/svg",
111
- viewBox: "0 0 24 24",
112
- fill: "none",
113
- "aria-hidden": "true",
114
- focusable: "false",
115
- ...props,
116
- children
117
- }
118
- );
119
- }
120
- var Play = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M8 5v14l11-7z" }) });
121
- var Pause = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
122
- var Retry = (props) => /* @__PURE__ */ jsx(
123
- MediaGlyph,
124
- {
125
- stroke: "currentColor",
126
- strokeWidth: 2,
127
- strokeLinecap: "round",
128
- strokeLinejoin: "round",
129
- ...props,
130
- children: /* @__PURE__ */ jsx("path", { d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" })
131
- }
132
- );
133
- var GoBackSeconds = (props) => /* @__PURE__ */ jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
134
- /* @__PURE__ */ jsx("path", { d: "M16.5 8.5H13.8604C13.6452 8.5 13.4541 8.63772 13.386 8.84189L12.7194 10.8419C12.6114 11.1657 12.8524 11.5 13.1937 11.5H14.5C15.6046 11.5 16.5 12.3954 16.5 13.5C16.5 14.6046 15.6046 15.5 14.5 15.5H12.5" }),
135
- /* @__PURE__ */ jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
136
- /* @__PURE__ */ jsx(
137
- "path",
138
- {
139
- d: "M14 4.5L12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C8.7288 22 5.82446 20.4293 4 18.001M8 2.83209C6.87754 3.32251 5.86251 4.01303 5 4.85857C3.14864 6.67349 2 9.20261 2 12C2 12.6849 2.06886 13.3538 2.20004 14",
140
- strokeLinejoin: "round"
141
- }
142
- )
143
- ] });
144
- var AdvanceSeconds = (props) => /* @__PURE__ */ jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
145
- /* @__PURE__ */ jsx("path", { d: "M16.5 8.5H13.8604C13.6452 8.5 13.4541 8.63772 13.386 8.84189L12.7194 10.8419C12.6114 11.1657 12.8524 11.5 13.1937 11.5H14.5C15.6046 11.5 16.5 12.3954 16.5 13.5C16.5 14.6046 15.6046 15.5 14.5 15.5H12.5" }),
146
- /* @__PURE__ */ jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
147
- /* @__PURE__ */ jsx(
148
- "path",
149
- {
150
- d: "M10 4.5L12 2C6.47715 2 2 6.47715 2 12C2 12.6849 2.06886 13.3538 2.20004 14M16 2.83209C19.5318 4.3752 22 7.89936 22 12C22 17.5228 17.5228 22 12 22C8.72852 22 5.82443 20.4287 4 18",
151
- strokeLinejoin: "round"
152
- }
153
- )
154
- ] });
155
- var VolumeOn = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z" }) });
156
- var VolumeMuted = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z" }) });
157
44
  function Accordion({ className, ...props }) {
158
45
  return /* @__PURE__ */ jsx(
159
46
  AccordionPrimitive.Root,
@@ -192,7 +79,7 @@ function AccordionTrigger({
192
79
  ...props,
193
80
  children: [
194
81
  children,
195
- /* @__PURE__ */ jsx(ChevronDown, { className: "text-text-muted shrink-0" })
82
+ /* @__PURE__ */ jsx(Icon, { as: CaretDown, className: "text-text-muted shrink-0" })
196
83
  ]
197
84
  }
198
85
  ) }) });
@@ -221,10 +108,10 @@ var colorGlyph = {
221
108
  error: "text-error"
222
109
  };
223
110
  var GLYPH = {
224
- accent: "\u2726",
225
- success: "\u2713",
226
- warning: "!",
227
- error: "\u2715"
111
+ accent: Info,
112
+ success: CheckCircle,
113
+ warning: Warning,
114
+ error: XCircle
228
115
  };
229
116
  function Alert({
230
117
  className,
@@ -246,9 +133,8 @@ function Alert({
246
133
  /* @__PURE__ */ jsx(
247
134
  "span",
248
135
  {
249
- "aria-hidden": "true",
250
- className: cn("font-mono text-ui leading-normal select-none", colorGlyph[tone]),
251
- children: icon ?? GLYPH[tone]
136
+ className: cn("text-ui flex h-[1lh] shrink-0 items-center leading-normal", colorGlyph[tone]),
137
+ children: icon ?? /* @__PURE__ */ jsx(Icon, { as: GLYPH[tone] })
252
138
  }
253
139
  ),
254
140
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -424,7 +310,7 @@ function AvatarUpload({
424
310
  disabled && "pointer-events-none opacity-50"
425
311
  ),
426
312
  children: [
427
- /* @__PURE__ */ jsx(Camera, { "aria-hidden": "true" }),
313
+ /* @__PURE__ */ jsx(Icon, { as: Camera, "aria-hidden": "true" }),
428
314
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: label }),
429
315
  /* @__PURE__ */ jsx(
430
316
  "input",
@@ -486,7 +372,7 @@ function Button({
486
372
  "aria-busy": loading || void 0,
487
373
  ...props,
488
374
  children: [
489
- loading ? /* @__PURE__ */ jsx(Spinner, {}) : icon,
375
+ loading ? /* @__PURE__ */ jsx(Icon, { as: CircleNotch, className: "motion-safe:animate-spin" }) : icon,
490
376
  children
491
377
  ]
492
378
  }
@@ -563,7 +449,7 @@ function Calendar({
563
449
  ...classNames
564
450
  },
565
451
  components: {
566
- Chevron: ({ orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsx(ChevronLeft, { ...rest }) : /* @__PURE__ */ jsx(ChevronRight, { ...rest })
452
+ Chevron: ({ orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsx(Icon, { as: CaretLeft, ...rest }) : /* @__PURE__ */ jsx(Icon, { as: CaretRight, ...rest })
567
453
  },
568
454
  ...props
569
455
  }
@@ -608,7 +494,7 @@ function Checkbox({ className, ...props }) {
608
494
  className
609
495
  ),
610
496
  ...props,
611
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-[13px]", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx(Minus, {}) : /* @__PURE__ */ jsx(Check, {}) })
497
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-[13px]", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx(Icon, { as: Minus }) : /* @__PURE__ */ jsx(Icon, { as: Check }) })
612
498
  }
613
499
  );
614
500
  }
@@ -700,7 +586,7 @@ function DialogContent({
700
586
  "hover:bg-surface-raised hover:text-text-primary",
701
587
  "focus-ring"
702
588
  ),
703
- children: /* @__PURE__ */ jsx(Close, {})
589
+ children: /* @__PURE__ */ jsx(Icon, { as: X })
704
590
  }
705
591
  )
706
592
  ]
@@ -780,7 +666,7 @@ function DropdownMenuCheckboxItem({
780
666
  ...props
781
667
  }) {
782
668
  return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, { className: cn(item, "pl-8", className), ...props, children: [
783
- /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { className: "text-accent absolute left-2 flex items-center", children: /* @__PURE__ */ jsx(Check, {}) }),
669
+ /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { className: "text-accent absolute left-2 flex items-center", children: /* @__PURE__ */ jsx(Icon, { as: Check }) }),
784
670
  children
785
671
  ] });
786
672
  }
@@ -824,7 +710,7 @@ function DropdownMenuSubTrigger({
824
710
  ...props,
825
711
  children: [
826
712
  children,
827
- /* @__PURE__ */ jsx(ChevronRight, { className: "text-text-muted ml-auto" })
713
+ /* @__PURE__ */ jsx(Icon, { as: CaretRight, className: "text-text-muted ml-auto" })
828
714
  ]
829
715
  }
830
716
  );
@@ -869,7 +755,13 @@ function Pagination({ className, ...props }) {
869
755
  );
870
756
  }
871
757
  function PaginationContent({ className, ...props }) {
872
- return /* @__PURE__ */ jsx("ul", { className: cn("gap-step-xs flex flex-row items-center", className), ...props });
758
+ return /* @__PURE__ */ jsx(
759
+ "ul",
760
+ {
761
+ className: cn("gap-step-xs flex flex-row flex-wrap items-center justify-center", className),
762
+ ...props
763
+ }
764
+ );
873
765
  }
874
766
  function PaginationItem(props) {
875
767
  return /* @__PURE__ */ jsx("li", { ...props });
@@ -894,14 +786,14 @@ function PaginationLink({ className, isActive = false, ...props }) {
894
786
  }
895
787
  function PaginationPrevious({ className, ...props }) {
896
788
  return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina anterior", className: cn("gap-step-xs", className), ...props, children: [
897
- /* @__PURE__ */ jsx(ChevronLeft, {}),
789
+ /* @__PURE__ */ jsx(Icon, { as: CaretLeft }),
898
790
  "Anterior"
899
791
  ] });
900
792
  }
901
793
  function PaginationNext({ className, ...props }) {
902
794
  return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina siguiente", className: cn("gap-step-xs", className), ...props, children: [
903
795
  "Siguiente",
904
- /* @__PURE__ */ jsx(ChevronRight, {})
796
+ /* @__PURE__ */ jsx(Icon, { as: CaretRight })
905
797
  ] });
906
798
  }
907
799
  function PaginationEllipsis({ className, ...props }) {
@@ -911,7 +803,7 @@ function PaginationEllipsis({ className, ...props }) {
911
803
  "aria-hidden": "true",
912
804
  className: cn("text-text-muted flex size-9 items-center justify-center", className),
913
805
  ...props,
914
- children: /* @__PURE__ */ jsx(Ellipsis, {})
806
+ children: /* @__PURE__ */ jsx(Icon, { as: DotsThree })
915
807
  }
916
808
  );
917
809
  }
@@ -1004,7 +896,7 @@ function SelectTrigger({
1004
896
  ...props,
1005
897
  children: [
1006
898
  children,
1007
- /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDown, { className: "text-text-muted" }) })
899
+ /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(Icon, { as: CaretDown, className: "text-text-muted" }) })
1008
900
  ]
1009
901
  }
1010
902
  );
@@ -1028,9 +920,9 @@ function SelectContent({
1028
920
  ),
1029
921
  ...props,
1030
922
  children: [
1031
- /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx(ChevronUp, {}) }),
923
+ /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { as: CaretUp }) }),
1032
924
  /* @__PURE__ */ jsx(SelectPrimitive.Viewport, { className: "p-1", children }),
1033
- /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx(ChevronDown, {}) })
925
+ /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { as: CaretDown }) })
1034
926
  ]
1035
927
  }
1036
928
  ) });
@@ -1066,7 +958,7 @@ function SelectItem({
1066
958
  ...props,
1067
959
  children: [
1068
960
  /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children }),
1069
- /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { className: "text-accent absolute right-2 flex items-center", children: /* @__PURE__ */ jsx(Check, {}) })
961
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { className: "text-accent absolute right-2 flex items-center", children: /* @__PURE__ */ jsx(Icon, { as: Check }) })
1070
962
  ]
1071
963
  }
1072
964
  );
@@ -1148,7 +1040,7 @@ function SheetContent({ className, side, children, ...props }) {
1148
1040
  "hover:bg-surface-raised hover:text-text-primary",
1149
1041
  "focus-ring"
1150
1042
  ),
1151
- children: /* @__PURE__ */ jsx(Close, {})
1043
+ children: /* @__PURE__ */ jsx(Icon, { as: X })
1152
1044
  }
1153
1045
  )
1154
1046
  ] })
@@ -1311,7 +1203,18 @@ function TabsList({
1311
1203
  return /* @__PURE__ */ jsx(
1312
1204
  TabsPrimitive.List,
1313
1205
  {
1314
- className: cn("rounded-control bg-surface gap-step-xs inline-flex items-center p-1", className),
1206
+ className: cn(
1207
+ "rounded-control bg-surface gap-step-xs inline-flex max-w-full items-center p-1",
1208
+ // The triggers are `whitespace-nowrap` — a tab whose label wraps stops
1209
+ // reading as a tab — so on a narrow screen the list is wider than the
1210
+ // page and takes the whole document with it. It SCROLLS instead: the
1211
+ // list keeps hugging its content up to the width available and gives up
1212
+ // the overflow to itself rather than to the page. Every tab stays
1213
+ // reachable, and reaching one by keyboard scrolls it into view on its
1214
+ // own because focus does that.
1215
+ "overflow-x-auto",
1216
+ className
1217
+ ),
1315
1218
  ...props
1316
1219
  }
1317
1220
  );
@@ -1324,7 +1227,10 @@ function TabsTrigger({
1324
1227
  TabsPrimitive.Trigger,
1325
1228
  {
1326
1229
  className: cn(
1327
- "rounded-chip px-step-sm inline-flex h-8 cursor-pointer items-center justify-center whitespace-nowrap",
1230
+ // `shrink-0` is what makes the list's `overflow-x-auto` work: without it
1231
+ // the triggers give up their width first and the labels run out of their
1232
+ // own pills instead of the row scrolling.
1233
+ "rounded-chip px-step-sm inline-flex h-8 shrink-0 cursor-pointer items-center justify-center whitespace-nowrap",
1328
1234
  "font-sans text-label text-text-secondary",
1329
1235
  "transition-standard",
1330
1236
  "hover:text-text-primary",
@@ -1401,15 +1307,28 @@ var toast = cva(
1401
1307
  variants: {
1402
1308
  variant: {
1403
1309
  neutral: "border-border",
1404
- success: "border-success/40",
1405
- error: "border-error/40"
1310
+ success: "border-success bg-linear-to-b from-success/10 to-success/10",
1311
+ error: "border-error bg-linear-to-b from-error/10 to-error/10"
1406
1312
  }
1407
1313
  },
1408
1314
  defaultVariants: { variant: "neutral" }
1409
1315
  }
1410
1316
  );
1317
+ var GLYPH2 = {
1318
+ neutral: null,
1319
+ success: CheckCircle,
1320
+ error: WarningCircle
1321
+ };
1322
+ var GLYPH_COLOR = {
1323
+ neutral: "",
1324
+ success: "text-success",
1325
+ error: "text-error"
1326
+ };
1411
1327
  function Toast({ className, variant, children, ...props }) {
1328
+ const tone = variant ?? "neutral";
1329
+ const Mark = GLYPH2[tone];
1412
1330
  return /* @__PURE__ */ jsxs(ToastPrimitive.Root, { className: cn(toast({ variant }), className), ...props, children: [
1331
+ Mark ? /* @__PURE__ */ jsx("span", { className: cn("text-ui flex h-[1lh] shrink-0 items-center leading-normal", GLYPH_COLOR[tone]), children: /* @__PURE__ */ jsx(Icon, { as: Mark }) }) : null,
1413
1332
  children,
1414
1333
  /* @__PURE__ */ jsx(
1415
1334
  ToastPrimitive.Close,
@@ -1421,7 +1340,7 @@ function Toast({ className, variant, children, ...props }) {
1421
1340
  "hover:bg-surface-raised hover:text-text-primary",
1422
1341
  "focus-ring"
1423
1342
  ),
1424
- children: /* @__PURE__ */ jsx(Close, {})
1343
+ children: /* @__PURE__ */ jsx(Icon, { as: X })
1425
1344
  }
1426
1345
  )
1427
1346
  ] });
@@ -1619,17 +1538,15 @@ function formatTime(seconds) {
1619
1538
  const secs = Math.floor(seconds % 60);
1620
1539
  return `${mins}:${secs.toString().padStart(2, "0")}`;
1621
1540
  }
1622
- var WAVEFORM_HEIGHTS = [35, 65, 100, 65, 35];
1623
1541
  var RATES = [1, 1.25, 1.5, 1.75, 2];
1624
- function Wave({ strokeWidth, height, playing }) {
1625
- return /* @__PURE__ */ jsx("div", { className: cn("flex items-end gap-[2px]", height), "aria-hidden": "true", children: WAVEFORM_HEIGHTS.map((h, i) => /* @__PURE__ */ jsx(
1626
- "span",
1542
+ function Wave({ size: size2, playing }) {
1543
+ return /* @__PURE__ */ jsx(
1544
+ Icon,
1627
1545
  {
1628
- className: cn("rounded-pill bg-accent transition-standard", strokeWidth),
1629
- style: { height: `${h}%`, opacity: playing ? 1 : 0.3 + h / 100 * 0.4 }
1630
- },
1631
- i
1632
- )) });
1546
+ as: Waveform,
1547
+ className: cn("text-accent", size2, playing ? "opacity-100" : "opacity-60")
1548
+ }
1549
+ );
1633
1550
  }
1634
1551
  function ProgressBar({
1635
1552
  height,
@@ -1691,7 +1608,7 @@ function SkipButton({
1691
1608
  onClick: () => onSkip(seconds),
1692
1609
  className: cn("text-text-muted hover:text-text-primary", CONTROL, className),
1693
1610
  "aria-label": seconds < 0 ? "Retroceder 15 segundos" : "Adelantar 15 segundos",
1694
- children: seconds < 0 ? /* @__PURE__ */ jsx(GoBackSeconds, { className: size2 }) : /* @__PURE__ */ jsx(AdvanceSeconds, { className: size2 })
1611
+ children: seconds < 0 ? /* @__PURE__ */ jsx(Icon, { as: ArrowCounterClockwise, className: size2 }) : /* @__PURE__ */ jsx(Icon, { as: ArrowClockwise, className: size2 })
1695
1612
  }
1696
1613
  );
1697
1614
  }
@@ -1736,7 +1653,7 @@ function Volume({
1736
1653
  onClick: onMute,
1737
1654
  className: cn("text-text-muted hover:text-text-primary p-1", CONTROL),
1738
1655
  "aria-label": muted ? "Activar sonido" : "Silenciar",
1739
- children: muted || volume === 0 ? /* @__PURE__ */ jsx(VolumeMuted, { className: size2 }) : /* @__PURE__ */ jsx(VolumeOn, { className: size2 })
1656
+ children: muted || volume === 0 ? /* @__PURE__ */ jsx(Icon, { as: SpeakerSlash, className: size2 }) : /* @__PURE__ */ jsx(Icon, { as: SpeakerHigh, className: size2 })
1740
1657
  }
1741
1658
  ),
1742
1659
  /* @__PURE__ */ jsx(
@@ -1759,10 +1676,11 @@ function Volume({
1759
1676
  ] });
1760
1677
  }
1761
1678
  function PlayIcon({ className, loading, error, playing }) {
1762
- if (loading) return /* @__PURE__ */ jsx(Spinner, { className: cn("motion-safe:animate-spin", className) });
1763
- if (error) return /* @__PURE__ */ jsx(Retry, { className });
1764
- if (playing) return /* @__PURE__ */ jsx(Pause, { className });
1765
- return /* @__PURE__ */ jsx(Play, { className });
1679
+ if (loading)
1680
+ return /* @__PURE__ */ jsx(Icon, { as: CircleNotch, className: cn("motion-safe:animate-spin", className) });
1681
+ if (error) return /* @__PURE__ */ jsx(Icon, { as: ArrowsClockwise, className });
1682
+ if (playing) return /* @__PURE__ */ jsx(Icon, { as: Pause, className });
1683
+ return /* @__PURE__ */ jsx(Icon, { as: Play, className });
1766
1684
  }
1767
1685
  function PlayButton({
1768
1686
  className,
@@ -1977,7 +1895,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
1977
1895
  ),
1978
1896
  /* @__PURE__ */ jsx("div", { className: "bg-surface/95 border-accent/25 border-t backdrop-blur-md", children: /* @__PURE__ */ jsxs("div", { className: "gap-step-sm px-step-md flex items-center py-5", children: [
1979
1897
  /* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex shrink-0 items-center", children: [
1980
- /* @__PURE__ */ jsx(Wave, { strokeWidth: "w-[2px]", height: "h-4", playing: isPlaying }),
1898
+ /* @__PURE__ */ jsx(Wave, { size: "size-4", playing: isPlaying }),
1981
1899
  /* @__PURE__ */ jsx("span", { className: "text-eyebrow font-mono text-accent hidden uppercase sm:block", children: "Narraci\xF3n" })
1982
1900
  ] }),
1983
1901
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -2019,7 +1937,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2019
1937
  /* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
2020
1938
  /* @__PURE__ */ jsxs("div", { ref: staticRef, children: [
2021
1939
  /* @__PURE__ */ jsxs("div", { className: "gap-step-sm mb-step-md flex items-center", children: [
2022
- /* @__PURE__ */ jsx(Wave, { strokeWidth: "w-[3px]", height: "h-5", playing: isPlaying }),
1940
+ /* @__PURE__ */ jsx(Wave, { size: "size-5", playing: isPlaying }),
2023
1941
  /* @__PURE__ */ jsx("span", { className: "text-eyebrow font-mono text-accent uppercase", children: "Narraci\xF3n de audio" }),
2024
1942
  /* @__PURE__ */ jsxs("span", { className: "text-chip font-mono text-text-muted ml-auto tabular-nums", children: [
2025
1943
  formatTime(currentTime),
@@ -2233,13 +2151,26 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2233
2151
  "focus-ring"
2234
2152
  ),
2235
2153
  children: [
2236
- copiado ? /* @__PURE__ */ jsx(Check, { className: "text-accent" }) : /* @__PURE__ */ jsx(Copy, {}),
2154
+ copiado ? /* @__PURE__ */ jsx(Icon, { as: Check, className: "text-accent" }) : /* @__PURE__ */ jsx(Icon, { as: Copy }),
2237
2155
  copiado ? "Copiado" : "Copiar"
2238
2156
  ]
2239
2157
  }
2240
2158
  ) : null
2241
2159
  ] }),
2242
- /* @__PURE__ */ jsx("pre", { className: "p-step-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed", children })
2160
+ /* @__PURE__ */ jsx(
2161
+ "pre",
2162
+ {
2163
+ tabIndex: 0,
2164
+ className: cn(
2165
+ "p-step-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed",
2166
+ // `focus-ring-inset` and not the plain ring: the root carries
2167
+ // `overflow-hidden` so its corners hold, and it clips an outward ring
2168
+ // on three sides. See the note beside the utility in build-tokens.mjs.
2169
+ "focus-ring focus-ring-inset"
2170
+ ),
2171
+ children
2172
+ }
2173
+ )
2243
2174
  ]
2244
2175
  }
2245
2176
  );
@@ -2250,25 +2181,62 @@ function CourseCard({
2250
2181
  meta,
2251
2182
  status,
2252
2183
  progress,
2184
+ media,
2185
+ footer,
2253
2186
  className,
2254
2187
  ...props
2255
2188
  }) {
2256
- return /* @__PURE__ */ jsx(CardShell, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
2257
- status ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge, { variant: "warm", children: status }) }) : null,
2258
- /* @__PURE__ */ jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2259
- summary ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-3", children: summary }) : null,
2260
- meta && meta.length > 0 ? /* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-step-xs flex flex-wrap items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxs("span", { className: "gap-step-xs flex items-center", children: [
2261
- i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
2262
- m
2263
- ] }, i)) }) : null,
2264
- typeof progress === "number" ? /* @__PURE__ */ jsxs("div", { className: "gap-step-xs mt-auto flex flex-col pt-step-sm", children: [
2265
- /* @__PURE__ */ jsx(Progress, { value: progress, tone: "warm", label: `Progreso del curso: ${progress}%` }),
2266
- /* @__PURE__ */ jsxs(Text, { variant: "label", tone: "muted", as: "p", children: [
2267
- progress,
2268
- "% cursado"
2269
- ] })
2270
- ] }) : null
2271
- ] }) });
2189
+ const hasProgress = typeof progress === "number";
2190
+ return (
2191
+ // `overflow-hidden` only with a cover: it is what rounds the cover's top
2192
+ // corners to the card's. It clips the content and not the `<a>` itself, so
2193
+ // the focus ring — an outline three pixels outside — still shows.
2194
+ /* @__PURE__ */ jsx(
2195
+ CardShell,
2196
+ {
2197
+ className: cn("p-step-lg", media ? "overflow-hidden" : null, className),
2198
+ ...props,
2199
+ children: /* @__PURE__ */ jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
2200
+ media ? (
2201
+ // The bleed is the card's own padding, negated. A call site that
2202
+ // changes the padding through `className` has to change this too, and
2203
+ // that is the trade for keeping the padding on the shell like every
2204
+ // other card instead of in a second place only when there is a cover.
2205
+ /* @__PURE__ */ jsx("div", { className: "-mx-step-lg -mt-step-lg mb-step-xs", children: media })
2206
+ ) : null,
2207
+ status ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge, { variant: "warm", children: status }) }) : null,
2208
+ /* @__PURE__ */ jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2209
+ summary ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-3", children: summary }) : null,
2210
+ meta && meta.length > 0 ? /* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-step-xs flex flex-wrap items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxs("span", { className: "gap-step-xs flex items-center", children: [
2211
+ i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
2212
+ m
2213
+ ] }, i)) }) : null,
2214
+ hasProgress ? /* @__PURE__ */ jsxs("div", { className: "gap-step-xs mt-auto flex flex-col pt-step-sm", children: [
2215
+ /* @__PURE__ */ jsx(Progress, { value: progress, tone: "warm", label: `Progreso del curso: ${progress}%` }),
2216
+ /* @__PURE__ */ jsxs(Text, { variant: "label", tone: "muted", as: "p", children: [
2217
+ progress,
2218
+ "% cursado"
2219
+ ] })
2220
+ ] }) : null,
2221
+ footer ? (
2222
+ // Only one of the two takes `mt-auto`. Two auto margins in one column
2223
+ // split the free space between them, and the progress bar would float
2224
+ // halfway down the card.
2225
+ /* @__PURE__ */ jsx(
2226
+ "div",
2227
+ {
2228
+ className: cn(
2229
+ "gap-step-sm pt-step-sm flex flex-wrap items-center justify-between",
2230
+ hasProgress ? null : "mt-auto"
2231
+ ),
2232
+ children: footer
2233
+ }
2234
+ )
2235
+ ) : null
2236
+ ] })
2237
+ }
2238
+ )
2239
+ );
2272
2240
  }
2273
2241
  var FACE = "w-[66px] max-w-none";
2274
2242
  function EmptyState(props) {
@@ -2494,7 +2462,7 @@ function EventCalendar({
2494
2462
  ] });
2495
2463
  }
2496
2464
  function SocialRow({ social }) {
2497
- return /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap items-center gap-[18px]", children: social.map((socialLink) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
2465
+ return /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap items-center justify-center gap-[18px] sm:justify-start", children: social.map((socialLink) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
2498
2466
  "a",
2499
2467
  {
2500
2468
  href: socialLink.href,
@@ -2592,16 +2560,23 @@ function Footer({
2592
2560
  };
2593
2561
  return /* @__PURE__ */ jsxs(Shell, { className, ...rest, children: [
2594
2562
  /* @__PURE__ */ jsxs("div", { className: "gap-step-xl flex flex-col md:flex-row md:justify-between", children: [
2595
- /* @__PURE__ */ jsxs("div", { className: "gap-step-md flex max-w-xs flex-col", children: [
2563
+ /* @__PURE__ */ jsxs("div", { className: "gap-step-md flex max-w-xs flex-col items-center text-center md:items-start md:text-left", children: [
2596
2564
  brand2,
2597
2565
  description ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
2598
2566
  social && social.length > 0 ? /* @__PURE__ */ jsx(SocialRow, { social }) : null,
2599
2567
  action
2600
2568
  ] }),
2601
- /* @__PURE__ */ jsx("div", { className: "gap-step-lg grid grid-cols-2 sm:grid-cols-3", children: columns.map((column) => /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex flex-col", children: [
2602
- /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "h3", children: column.title }),
2603
- /* @__PURE__ */ jsx("ul", { className: "gap-step-xs flex flex-col", children: column.links.map((columnLink) => /* @__PURE__ */ jsx("li", { children: link(columnLink.href, columnLink.external, columnLink.label) }, columnLink.href)) })
2604
- ] }, column.title)) })
2569
+ /* @__PURE__ */ jsx("div", { className: "gap-step-lg grid grid-cols-1 min-[420px]:grid-cols-2 sm:grid-cols-3", children: columns.map((column) => /* @__PURE__ */ jsxs(
2570
+ "div",
2571
+ {
2572
+ className: "gap-step-sm flex flex-col items-center text-center md:items-start md:text-left",
2573
+ children: [
2574
+ /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "h3", children: column.title }),
2575
+ /* @__PURE__ */ jsx("ul", { className: "gap-step-xs flex flex-col", children: column.links.map((columnLink) => /* @__PURE__ */ jsx("li", { children: link(columnLink.href, columnLink.external, columnLink.label) }, columnLink.href)) })
2576
+ ]
2577
+ },
2578
+ column.title
2579
+ )) })
2605
2580
  ] }),
2606
2581
  /* @__PURE__ */ jsx("div", { className: "border-hairline mt-step-xl pt-step-lg border-t", children: /* @__PURE__ */ jsx(Signature, { year, href: signatureHref, domain, className: "text-center sm:text-right" }) })
2607
2582
  ] });
@@ -2612,9 +2587,9 @@ function Footer({
2612
2587
  ].filter(Boolean);
2613
2588
  const [first, ...others] = rows;
2614
2589
  return /* @__PURE__ */ jsxs(Shell, { className, contentClassName: "gap-step-lg", ...rest, children: [
2615
- /* @__PURE__ */ jsxs("div", { className: "gap-step-md flex flex-wrap items-center", children: [
2590
+ /* @__PURE__ */ jsxs("div", { className: "gap-step-md flex flex-col items-center sm:flex-row sm:flex-wrap", children: [
2616
2591
  first ?? null,
2617
- /* @__PURE__ */ jsx(Signature, { year, href: signatureHref, domain, className: "ml-auto" })
2592
+ /* @__PURE__ */ jsx(Signature, { year, href: signatureHref, domain, className: "sm:ml-auto" })
2618
2593
  ] }),
2619
2594
  others
2620
2595
  ] });
@@ -2715,8 +2690,9 @@ function LinkRow({
2715
2690
  description ? /* @__PURE__ */ jsx(Text, { as: "span", variant: "label", tone: "muted", className: "block truncate", children: description }) : null
2716
2691
  ] }),
2717
2692
  external ? /* @__PURE__ */ jsx(
2718
- ArrowUpRight,
2693
+ Icon,
2719
2694
  {
2695
+ as: ArrowUpRight,
2720
2696
  className: "text-text-muted group-hover:text-accent transition-standard shrink-0",
2721
2697
  "aria-hidden": "true"
2722
2698
  }
@@ -2742,15 +2718,35 @@ function Nav({ brand: brand2, children, actions, size: size2 = "default", classN
2742
2718
  "div",
2743
2719
  {
2744
2720
  className: cn(
2745
- "max-w-wide px-step-md gap-step-lg mx-auto flex items-center",
2721
+ "max-w-wide px-step-md gap-step-sm sm:gap-step-lg mx-auto flex items-center",
2746
2722
  size2 === "compact" ? "h-nav-compact" : "h-nav"
2747
2723
  ),
2748
2724
  children: [
2749
2725
  brand2 ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: brand2 }) : null,
2750
- children ? /* @__PURE__ */ jsx("nav", { "aria-label": "Principal", className: "ml-auto min-w-0", children: /* @__PURE__ */ jsxs("ul", { className: "gap-step-md flex items-center", children: [
2751
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
2752
- children
2753
- ] }) }) : /* @__PURE__ */ jsx("div", { className: "flex-1" }),
2726
+ children ? (
2727
+ /*
2728
+ THE ITEM ROW SCROLLS instead of pushing the page sideways.
2729
+
2730
+ `min-w-0` was already here and on its own it does nothing: it lets the
2731
+ nav shrink below its content, and the content then simply overflows
2732
+ the bar. Six mono items at 13px plus the `~/` is around 300px, which
2733
+ fits nowhere under a brand and a theme switch on a 360px screen, and
2734
+ what the reader got was a horizontal scrollbar on the whole document.
2735
+
2736
+ It does NOT hide them below a breakpoint, which is the other obvious
2737
+ answer and the wrong one for a library: hiding the navigation is only
2738
+ safe if something else exposes it, and that something is a drawer the
2739
+ project owns — `eduardoalvarez.dev` composes one out of `Sheet` and
2740
+ puts it in `actions`. A `Nav` that hid its own items would leave every
2741
+ consumer without a drawer with no navigation at all, silently.
2742
+
2743
+ See `docs/decisions/0.10.md` § 54.
2744
+ */
2745
+ /* @__PURE__ */ jsx("nav", { "aria-label": "Principal", className: "ml-auto min-w-0 overflow-x-auto", children: /* @__PURE__ */ jsxs("ul", { className: "gap-step-md flex w-max items-center", children: [
2746
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
2747
+ children
2748
+ ] }) })
2749
+ ) : /* @__PURE__ */ jsx("div", { className: "flex-1" }),
2754
2750
  actions ? /* @__PURE__ */ jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
2755
2751
  ]
2756
2752
  }
@@ -2922,12 +2918,21 @@ function PageHeader({
2922
2918
  action,
2923
2919
  size: size2,
2924
2920
  as = "h1",
2921
+ titleVariant,
2925
2922
  className,
2926
2923
  ...props
2927
2924
  }) {
2928
2925
  return /* @__PURE__ */ jsxs("header", { className: cn(header({ size: size2 }), className), ...props, children: [
2929
2926
  eyebrow ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
2930
- /* @__PURE__ */ jsx(Text, { as, variant: size2 === "display" ? "display" : "h1", className: "max-w-measure", children: title }),
2927
+ /* @__PURE__ */ jsx(
2928
+ Text,
2929
+ {
2930
+ as,
2931
+ variant: titleVariant ?? (size2 === "display" ? "display" : "h1"),
2932
+ className: "max-w-measure",
2933
+ children: title
2934
+ }
2935
+ ),
2931
2936
  description ? /* @__PURE__ */ jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
2932
2937
  action ? /* @__PURE__ */ jsx("div", { className: "gap-step-sm mt-step-sm flex flex-wrap items-center", children: action }) : null
2933
2938
  ] });
@@ -2989,8 +2994,8 @@ function ScrollingProgressBar({
2989
2994
  );
2990
2995
  }
2991
2996
  var DELTA = {
2992
- up: { glyph: ChevronUp, label: "sube" },
2993
- down: { glyph: ChevronDown, label: "baja" },
2997
+ up: { glyph: TrendUp, label: "sube" },
2998
+ down: { glyph: TrendDown, label: "baja" },
2994
2999
  flat: { glyph: Minus, label: "sin cambio" }
2995
3000
  };
2996
3001
  function Stat({
@@ -3032,7 +3037,7 @@ function Stat({
3032
3037
  DELTA[delta.direction].label,
3033
3038
  " "
3034
3039
  ] }),
3035
- /* @__PURE__ */ jsx(DeltaGlyph, { className: "shrink-0" }),
3040
+ /* @__PURE__ */ jsx(Icon, { as: DeltaGlyph }),
3036
3041
  delta.value
3037
3042
  ] }) : null,
3038
3043
  description ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
@@ -3122,11 +3127,14 @@ function ThemeToggle({
3122
3127
  size: size2,
3123
3128
  "aria-label": label,
3124
3129
  className: cn("[&_svg]:size-[19px]", className),
3125
- onClick: () => onThemeChange?.(toggleTheme()),
3130
+ onClick: () => {
3131
+ const theme = toggleTheme();
3132
+ onThemeChange?.(theme);
3133
+ },
3126
3134
  ...props,
3127
3135
  children: [
3128
- /* @__PURE__ */ jsx(Sun, { className: "light:hidden" }),
3129
- /* @__PURE__ */ jsx(Moon, { className: "hidden light:block" })
3136
+ /* @__PURE__ */ jsx(Icon, { as: Sun, className: "light:hidden" }),
3137
+ /* @__PURE__ */ jsx(Icon, { as: Moon, className: "hidden light:block" })
3130
3138
  ]
3131
3139
  }
3132
3140
  );