@eduardoalvarez/arrecife 0.9.0 → 0.10.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/dist/index.cjs CHANGED
@@ -2,13 +2,14 @@
2
2
  'use strict';
3
3
 
4
4
  var classVarianceAuthority = require('class-variance-authority');
5
+ var react = require('@phosphor-icons/react');
5
6
  var AccordionPrimitive = require('@radix-ui/react-accordion');
6
7
  var clsx = require('clsx');
7
8
  var tailwindMerge = require('tailwind-merge');
8
9
  var jsxRuntime = require('react/jsx-runtime');
9
10
  var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
10
11
  var AvatarPrimitive = require('@radix-ui/react-avatar');
11
- var react = require('react');
12
+ var react$1 = require('react');
12
13
  var reactSlot = require('@radix-ui/react-slot');
13
14
  var locale = require('date-fns/locale');
14
15
  var reactDayPicker = require('react-day-picker');
@@ -62,12 +63,6 @@ var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
62
63
  var ToastPrimitive__namespace = /*#__PURE__*/_interopNamespace(ToastPrimitive);
63
64
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
64
65
 
65
- var __defProp = Object.defineProperty;
66
- var __export = (target, all) => {
67
- for (var name in all)
68
- __defProp(target, name, { get: all[name], enumerable: true });
69
- };
70
-
71
66
  // src/tokens/tokens.ts
72
67
  var dark = {
73
68
  background: "#091319",
@@ -671,118 +666,27 @@ var twMerge = tailwindMerge.extendTailwindMerge({
671
666
  function cn(...inputs) {
672
667
  return twMerge(clsx.clsx(inputs));
673
668
  }
674
- function Glyph({ children, ...props }) {
675
- return /* @__PURE__ */ jsxRuntime.jsx(
676
- "svg",
677
- {
678
- viewBox: "0 0 16 16",
679
- width: "1em",
680
- height: "1em",
681
- fill: "none",
682
- stroke: "currentColor",
683
- strokeWidth: 1.75,
684
- strokeLinecap: "round",
685
- strokeLinejoin: "round",
686
- "aria-hidden": "true",
687
- focusable: "false",
688
- ...props,
689
- children
690
- }
691
- );
692
- }
693
- var Check = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
694
- var Minus = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.5 8h9" }) });
695
- var ChevronDown = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6l4 4 4-4" }) });
696
- var ChevronUp = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4-4 4 4" }) });
697
- var ChevronLeft = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4L6 8l4 4" }) });
698
- var ChevronRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4l4 4-4 4" }) });
699
- var Close = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
700
- var Copy = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
701
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
702
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
703
- ] });
704
- var ArrowUpRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
705
- var Ellipsis = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
706
- var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
707
- "svg",
708
- {
709
- viewBox: "0 0 16 16",
710
- width: "1em",
711
- height: "1em",
712
- fill: "none",
713
- stroke: "currentColor",
714
- strokeWidth: 2,
715
- strokeLinecap: "round",
716
- "aria-hidden": "true",
717
- focusable: "false",
718
- className: "motion-safe:animate-spin",
719
- ...props,
720
- children: [
721
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
722
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
723
- ]
724
- }
725
- );
726
- var Camera = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
727
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 5.5h2.6l1-1.5h4.8l1 1.5H14v7.5H2z" }),
728
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "9", r: "2.4" })
729
- ] });
730
- var Sun = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
731
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "3" }),
732
- /* @__PURE__ */ jsxRuntime.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" })
733
- ] });
734
- var Moon = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.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" }) });
735
- function MediaGlyph({ children, ...props }) {
669
+ var ICON_WEIGHT = "regular";
670
+ var TONE_WEIGHT = {
671
+ action: ICON_WEIGHT,
672
+ current: "fill",
673
+ quiet: "light"
674
+ };
675
+ function Icon({ as: Glyph, tone = "action", label, className, ...props }) {
736
676
  return /* @__PURE__ */ jsxRuntime.jsx(
737
- "svg",
677
+ Glyph,
738
678
  {
739
- xmlns: "http://www.w3.org/2000/svg",
740
- viewBox: "0 0 24 24",
741
- fill: "none",
742
- "aria-hidden": "true",
679
+ size: "1em",
680
+ weight: TONE_WEIGHT[tone],
681
+ "aria-hidden": label ? void 0 : true,
682
+ "aria-label": label,
683
+ role: label ? "img" : void 0,
743
684
  focusable: "false",
744
- ...props,
745
- children
685
+ className: cn("shrink-0", className),
686
+ ...props
746
687
  }
747
688
  );
748
689
  }
749
- var Play = (props) => /* @__PURE__ */ jsxRuntime.jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
750
- var Pause = (props) => /* @__PURE__ */ jsxRuntime.jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
751
- var Retry = (props) => /* @__PURE__ */ jsxRuntime.jsx(
752
- MediaGlyph,
753
- {
754
- stroke: "currentColor",
755
- strokeWidth: 2,
756
- strokeLinecap: "round",
757
- strokeLinejoin: "round",
758
- ...props,
759
- children: /* @__PURE__ */ jsxRuntime.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" })
760
- }
761
- );
762
- var GoBackSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
763
- /* @__PURE__ */ jsxRuntime.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" }),
764
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
765
- /* @__PURE__ */ jsxRuntime.jsx(
766
- "path",
767
- {
768
- 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",
769
- strokeLinejoin: "round"
770
- }
771
- )
772
- ] });
773
- var AdvanceSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
774
- /* @__PURE__ */ jsxRuntime.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" }),
775
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
776
- /* @__PURE__ */ jsxRuntime.jsx(
777
- "path",
778
- {
779
- 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",
780
- strokeLinejoin: "round"
781
- }
782
- )
783
- ] });
784
- var VolumeOn = (props) => /* @__PURE__ */ jsxRuntime.jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.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" }) });
785
- var VolumeMuted = (props) => /* @__PURE__ */ jsxRuntime.jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.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" }) });
786
690
  function Accordion({ className, ...props }) {
787
691
  return /* @__PURE__ */ jsxRuntime.jsx(
788
692
  AccordionPrimitive__namespace.Root,
@@ -821,7 +725,7 @@ function AccordionTrigger({
821
725
  ...props,
822
726
  children: [
823
727
  children,
824
- /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, { className: "text-text-muted shrink-0" })
728
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretDown, className: "text-text-muted shrink-0" })
825
729
  ]
826
730
  }
827
731
  ) }) });
@@ -850,10 +754,10 @@ var colorGlyph = {
850
754
  error: "text-error"
851
755
  };
852
756
  var GLYPH = {
853
- accent: "\u2726",
854
- success: "\u2713",
855
- warning: "!",
856
- error: "\u2715"
757
+ accent: react.Info,
758
+ success: react.CheckCircle,
759
+ warning: react.Warning,
760
+ error: react.XCircle
857
761
  };
858
762
  function Alert({
859
763
  className,
@@ -875,9 +779,8 @@ function Alert({
875
779
  /* @__PURE__ */ jsxRuntime.jsx(
876
780
  "span",
877
781
  {
878
- "aria-hidden": "true",
879
- className: cn("font-mono text-ui leading-normal select-none", colorGlyph[tone]),
880
- children: icon ?? GLYPH[tone]
782
+ className: cn("text-ui flex h-[1lh] shrink-0 items-center leading-normal", colorGlyph[tone]),
783
+ children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: GLYPH[tone] })
881
784
  }
882
785
  ),
883
786
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -1020,9 +923,9 @@ function AvatarUpload({
1020
923
  className,
1021
924
  ...props
1022
925
  }) {
1023
- const id = react.useId();
1024
- const [preview, setPreview] = react.useState(null);
1025
- react.useEffect(() => {
926
+ const id = react$1.useId();
927
+ const [preview, setPreview] = react$1.useState(null);
928
+ react$1.useEffect(() => {
1026
929
  if (!preview) return;
1027
930
  return () => URL.revokeObjectURL(preview);
1028
931
  }, [preview]);
@@ -1053,7 +956,7 @@ function AvatarUpload({
1053
956
  disabled && "pointer-events-none opacity-50"
1054
957
  ),
1055
958
  children: [
1056
- /* @__PURE__ */ jsxRuntime.jsx(Camera, { "aria-hidden": "true" }),
959
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Camera, "aria-hidden": "true" }),
1057
960
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label }),
1058
961
  /* @__PURE__ */ jsxRuntime.jsx(
1059
962
  "input",
@@ -1115,7 +1018,7 @@ function Button({
1115
1018
  "aria-busy": loading || void 0,
1116
1019
  ...props,
1117
1020
  children: [
1118
- loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : icon,
1021
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CircleNotch, className: "motion-safe:animate-spin" }) : icon,
1119
1022
  children
1120
1023
  ]
1121
1024
  }
@@ -1192,7 +1095,7 @@ function Calendar({
1192
1095
  ...classNames
1193
1096
  },
1194
1097
  components: {
1195
- Chevron: ({ orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsxRuntime.jsx(ChevronLeft, { ...rest }) : /* @__PURE__ */ jsxRuntime.jsx(ChevronRight, { ...rest })
1098
+ Chevron: ({ orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretLeft, ...rest }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretRight, ...rest })
1196
1099
  },
1197
1100
  ...props
1198
1101
  }
@@ -1271,7 +1174,7 @@ function Checkbox({ className, ...props }) {
1271
1174
  className
1272
1175
  ),
1273
1176
  ...props,
1274
- children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "flex items-center justify-center text-[13px]", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx(Minus, {}) : /* @__PURE__ */ jsxRuntime.jsx(Check, {}) })
1177
+ children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "flex items-center justify-center text-[13px]", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Minus }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Check }) })
1275
1178
  }
1276
1179
  );
1277
1180
  }
@@ -1363,7 +1266,7 @@ function DialogContent({
1363
1266
  "hover:bg-surface-raised hover:text-text-primary",
1364
1267
  "focus-ring"
1365
1268
  ),
1366
- children: /* @__PURE__ */ jsxRuntime.jsx(Close, {})
1269
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.X })
1367
1270
  }
1368
1271
  )
1369
1272
  ]
@@ -1443,7 +1346,7 @@ function DropdownMenuCheckboxItem({
1443
1346
  ...props
1444
1347
  }) {
1445
1348
  return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenuPrimitive__namespace.CheckboxItem, { className: cn(item, "pl-8", className), ...props, children: [
1446
- /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { className: "text-accent absolute left-2 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Check, {}) }),
1349
+ /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { className: "text-accent absolute left-2 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Check }) }),
1447
1350
  children
1448
1351
  ] });
1449
1352
  }
@@ -1487,7 +1390,7 @@ function DropdownMenuSubTrigger({
1487
1390
  ...props,
1488
1391
  children: [
1489
1392
  children,
1490
- /* @__PURE__ */ jsxRuntime.jsx(ChevronRight, { className: "text-text-muted ml-auto" })
1393
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretRight, className: "text-text-muted ml-auto" })
1491
1394
  ]
1492
1395
  }
1493
1396
  );
@@ -1545,7 +1448,13 @@ function Pagination({ className, ...props }) {
1545
1448
  );
1546
1449
  }
1547
1450
  function PaginationContent({ className, ...props }) {
1548
- return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("gap-step-xs flex flex-row items-center", className), ...props });
1451
+ return /* @__PURE__ */ jsxRuntime.jsx(
1452
+ "ul",
1453
+ {
1454
+ className: cn("gap-step-xs flex flex-row flex-wrap items-center justify-center", className),
1455
+ ...props
1456
+ }
1457
+ );
1549
1458
  }
1550
1459
  function PaginationItem(props) {
1551
1460
  return /* @__PURE__ */ jsxRuntime.jsx("li", { ...props });
@@ -1570,14 +1479,14 @@ function PaginationLink({ className, isActive = false, ...props }) {
1570
1479
  }
1571
1480
  function PaginationPrevious({ className, ...props }) {
1572
1481
  return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina anterior", className: cn("gap-step-xs", className), ...props, children: [
1573
- /* @__PURE__ */ jsxRuntime.jsx(ChevronLeft, {}),
1482
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretLeft }),
1574
1483
  "Anterior"
1575
1484
  ] });
1576
1485
  }
1577
1486
  function PaginationNext({ className, ...props }) {
1578
1487
  return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina siguiente", className: cn("gap-step-xs", className), ...props, children: [
1579
1488
  "Siguiente",
1580
- /* @__PURE__ */ jsxRuntime.jsx(ChevronRight, {})
1489
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretRight })
1581
1490
  ] });
1582
1491
  }
1583
1492
  function PaginationEllipsis({ className, ...props }) {
@@ -1587,7 +1496,7 @@ function PaginationEllipsis({ className, ...props }) {
1587
1496
  "aria-hidden": "true",
1588
1497
  className: cn("text-text-muted flex size-9 items-center justify-center", className),
1589
1498
  ...props,
1590
- children: /* @__PURE__ */ jsxRuntime.jsx(Ellipsis, {})
1499
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.DotsThree })
1591
1500
  }
1592
1501
  );
1593
1502
  }
@@ -1680,7 +1589,7 @@ function SelectTrigger({
1680
1589
  ...props,
1681
1590
  children: [
1682
1591
  children,
1683
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, { className: "text-text-muted" }) })
1592
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretDown, className: "text-text-muted" }) })
1684
1593
  ]
1685
1594
  }
1686
1595
  );
@@ -1704,9 +1613,9 @@ function SelectContent({
1704
1613
  ),
1705
1614
  ...props,
1706
1615
  children: [
1707
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ScrollUpButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ChevronUp, {}) }),
1616
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ScrollUpButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretUp }) }),
1708
1617
  /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Viewport, { className: "p-1", children }),
1709
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ScrollDownButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, {}) })
1618
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ScrollDownButton, { className: "text-text-secondary flex h-6 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CaretDown }) })
1710
1619
  ]
1711
1620
  }
1712
1621
  ) });
@@ -1742,7 +1651,7 @@ function SelectItem({
1742
1651
  ...props,
1743
1652
  children: [
1744
1653
  /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children }),
1745
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { className: "text-accent absolute right-2 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Check, {}) })
1654
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { className: "text-accent absolute right-2 flex items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Check }) })
1746
1655
  ]
1747
1656
  }
1748
1657
  );
@@ -1824,7 +1733,7 @@ function SheetContent({ className, side, children, ...props }) {
1824
1733
  "hover:bg-surface-raised hover:text-text-primary",
1825
1734
  "focus-ring"
1826
1735
  ),
1827
- children: /* @__PURE__ */ jsxRuntime.jsx(Close, {})
1736
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.X })
1828
1737
  }
1829
1738
  )
1830
1739
  ] })
@@ -1987,7 +1896,18 @@ function TabsList({
1987
1896
  return /* @__PURE__ */ jsxRuntime.jsx(
1988
1897
  TabsPrimitive__namespace.List,
1989
1898
  {
1990
- className: cn("rounded-control bg-surface gap-step-xs inline-flex items-center p-1", className),
1899
+ className: cn(
1900
+ "rounded-control bg-surface gap-step-xs inline-flex max-w-full items-center p-1",
1901
+ // The triggers are `whitespace-nowrap` — a tab whose label wraps stops
1902
+ // reading as a tab — so on a narrow screen the list is wider than the
1903
+ // page and takes the whole document with it. It SCROLLS instead: the
1904
+ // list keeps hugging its content up to the width available and gives up
1905
+ // the overflow to itself rather than to the page. Every tab stays
1906
+ // reachable, and reaching one by keyboard scrolls it into view on its
1907
+ // own because focus does that.
1908
+ "overflow-x-auto",
1909
+ className
1910
+ ),
1991
1911
  ...props
1992
1912
  }
1993
1913
  );
@@ -2000,7 +1920,10 @@ function TabsTrigger({
2000
1920
  TabsPrimitive__namespace.Trigger,
2001
1921
  {
2002
1922
  className: cn(
2003
- "rounded-chip px-step-sm inline-flex h-8 cursor-pointer items-center justify-center whitespace-nowrap",
1923
+ // `shrink-0` is what makes the list's `overflow-x-auto` work: without it
1924
+ // the triggers give up their width first and the labels run out of their
1925
+ // own pills instead of the row scrolling.
1926
+ "rounded-chip px-step-sm inline-flex h-8 shrink-0 cursor-pointer items-center justify-center whitespace-nowrap",
2004
1927
  "font-sans text-label text-text-secondary",
2005
1928
  "transition-standard",
2006
1929
  "hover:text-text-primary",
@@ -2077,15 +2000,28 @@ var toast = classVarianceAuthority.cva(
2077
2000
  variants: {
2078
2001
  variant: {
2079
2002
  neutral: "border-border",
2080
- success: "border-success/40",
2081
- error: "border-error/40"
2003
+ success: "border-success bg-linear-to-b from-success/10 to-success/10",
2004
+ error: "border-error bg-linear-to-b from-error/10 to-error/10"
2082
2005
  }
2083
2006
  },
2084
2007
  defaultVariants: { variant: "neutral" }
2085
2008
  }
2086
2009
  );
2010
+ var GLYPH2 = {
2011
+ neutral: null,
2012
+ success: react.CheckCircle,
2013
+ error: react.WarningCircle
2014
+ };
2015
+ var GLYPH_COLOR = {
2016
+ neutral: "",
2017
+ success: "text-success",
2018
+ error: "text-error"
2019
+ };
2087
2020
  function Toast({ className, variant, children, ...props }) {
2021
+ const tone = variant ?? "neutral";
2022
+ const Mark = GLYPH2[tone];
2088
2023
  return /* @__PURE__ */ jsxRuntime.jsxs(ToastPrimitive__namespace.Root, { className: cn(toast({ variant }), className), ...props, children: [
2024
+ Mark ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-ui flex h-[1lh] shrink-0 items-center leading-normal", GLYPH_COLOR[tone]), children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: Mark }) }) : null,
2089
2025
  children,
2090
2026
  /* @__PURE__ */ jsxRuntime.jsx(
2091
2027
  ToastPrimitive__namespace.Close,
@@ -2097,7 +2033,7 @@ function Toast({ className, variant, children, ...props }) {
2097
2033
  "hover:bg-surface-raised hover:text-text-primary",
2098
2034
  "focus-ring"
2099
2035
  ),
2100
- children: /* @__PURE__ */ jsxRuntime.jsx(Close, {})
2036
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.X })
2101
2037
  }
2102
2038
  )
2103
2039
  ] });
@@ -2166,7 +2102,7 @@ var toast2 = Object.assign(create, {
2166
2102
  dismiss: discard
2167
2103
  });
2168
2104
  function Toaster({ duration = 5e3, label = "Avisos" }) {
2169
- const list = react.useSyncExternalStore(subscribe, read, onServer);
2105
+ const list = react$1.useSyncExternalStore(subscribe, read, onServer);
2170
2106
  return /* @__PURE__ */ jsxRuntime.jsxs(ToastProvider, { duration, label, children: [
2171
2107
  list.map(({ id, title, description, variant, duration: own, action, open }) => /* @__PURE__ */ jsxRuntime.jsxs(
2172
2108
  Toast,
@@ -2295,17 +2231,15 @@ function formatTime(seconds) {
2295
2231
  const secs = Math.floor(seconds % 60);
2296
2232
  return `${mins}:${secs.toString().padStart(2, "0")}`;
2297
2233
  }
2298
- var WAVEFORM_HEIGHTS = [35, 65, 100, 65, 35];
2299
2234
  var RATES = [1, 1.25, 1.5, 1.75, 2];
2300
- function Wave({ strokeWidth, height, playing }) {
2301
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-end gap-[2px]", height), "aria-hidden": "true", children: WAVEFORM_HEIGHTS.map((h, i) => /* @__PURE__ */ jsxRuntime.jsx(
2302
- "span",
2235
+ function Wave({ size: size2, playing }) {
2236
+ return /* @__PURE__ */ jsxRuntime.jsx(
2237
+ Icon,
2303
2238
  {
2304
- className: cn("rounded-pill bg-accent transition-standard", strokeWidth),
2305
- style: { height: `${h}%`, opacity: playing ? 1 : 0.3 + h / 100 * 0.4 }
2306
- },
2307
- i
2308
- )) });
2239
+ as: react.Waveform,
2240
+ className: cn("text-accent", size2, playing ? "opacity-100" : "opacity-60")
2241
+ }
2242
+ );
2309
2243
  }
2310
2244
  function ProgressBar({
2311
2245
  height,
@@ -2367,7 +2301,7 @@ function SkipButton({
2367
2301
  onClick: () => onSkip(seconds),
2368
2302
  className: cn("text-text-muted hover:text-text-primary", CONTROL, className),
2369
2303
  "aria-label": seconds < 0 ? "Retroceder 15 segundos" : "Adelantar 15 segundos",
2370
- children: seconds < 0 ? /* @__PURE__ */ jsxRuntime.jsx(GoBackSeconds, { className: size2 }) : /* @__PURE__ */ jsxRuntime.jsx(AdvanceSeconds, { className: size2 })
2304
+ children: seconds < 0 ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.ArrowCounterClockwise, className: size2 }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.ArrowClockwise, className: size2 })
2371
2305
  }
2372
2306
  );
2373
2307
  }
@@ -2412,7 +2346,7 @@ function Volume({
2412
2346
  onClick: onMute,
2413
2347
  className: cn("text-text-muted hover:text-text-primary p-1", CONTROL),
2414
2348
  "aria-label": muted ? "Activar sonido" : "Silenciar",
2415
- children: muted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(VolumeMuted, { className: size2 }) : /* @__PURE__ */ jsxRuntime.jsx(VolumeOn, { className: size2 })
2349
+ children: muted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.SpeakerSlash, className: size2 }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.SpeakerHigh, className: size2 })
2416
2350
  }
2417
2351
  ),
2418
2352
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -2435,10 +2369,11 @@ function Volume({
2435
2369
  ] });
2436
2370
  }
2437
2371
  function PlayIcon({ className, loading, error, playing }) {
2438
- if (loading) return /* @__PURE__ */ jsxRuntime.jsx(Spinner, { className: cn("motion-safe:animate-spin", className) });
2439
- if (error) return /* @__PURE__ */ jsxRuntime.jsx(Retry, { className });
2440
- if (playing) return /* @__PURE__ */ jsxRuntime.jsx(Pause, { className });
2441
- return /* @__PURE__ */ jsxRuntime.jsx(Play, { className });
2372
+ if (loading)
2373
+ return /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.CircleNotch, className: cn("motion-safe:animate-spin", className) });
2374
+ if (error) return /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.ArrowsClockwise, className });
2375
+ if (playing) return /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Pause, className });
2376
+ return /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Play, className });
2442
2377
  }
2443
2378
  function PlayButton({
2444
2379
  className,
@@ -2468,21 +2403,21 @@ function PlayButton({
2468
2403
  );
2469
2404
  }
2470
2405
  function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2471
- const audioRef = react.useRef(null);
2472
- const staticRef = react.useRef(null);
2473
- const isDragging = react.useRef(false);
2474
- const hasTrackedPlay = react.useRef(false);
2475
- const [isPlaying, setIsPlaying] = react.useState(false);
2476
- const [currentTime, setCurrentTime] = react.useState(0);
2477
- const [duration, setDuration] = react.useState(0);
2478
- const [isLoading, setIsLoading] = react.useState(false);
2479
- const [hasError, setHasError] = react.useState(false);
2480
- const [volume, setVolume] = react.useState(1);
2481
- const [isMuted, setIsMuted] = react.useState(false);
2482
- const [playbackRate, setPlaybackRate] = react.useState(1);
2483
- const [isStaticVisible, setIsStaticVisible] = react.useState(true);
2406
+ const audioRef = react$1.useRef(null);
2407
+ const staticRef = react$1.useRef(null);
2408
+ const isDragging = react$1.useRef(false);
2409
+ const hasTrackedPlay = react$1.useRef(false);
2410
+ const [isPlaying, setIsPlaying] = react$1.useState(false);
2411
+ const [currentTime, setCurrentTime] = react$1.useState(0);
2412
+ const [duration, setDuration] = react$1.useState(0);
2413
+ const [isLoading, setIsLoading] = react$1.useState(false);
2414
+ const [hasError, setHasError] = react$1.useState(false);
2415
+ const [volume, setVolume] = react$1.useState(1);
2416
+ const [isMuted, setIsMuted] = react$1.useState(false);
2417
+ const [playbackRate, setPlaybackRate] = react$1.useState(1);
2418
+ const [isStaticVisible, setIsStaticVisible] = react$1.useState(true);
2484
2419
  const floating = mode === "banner" || mode === "compact";
2485
- react.useEffect(() => {
2420
+ react$1.useEffect(() => {
2486
2421
  const audio = audioRef.current;
2487
2422
  if (!audio) return;
2488
2423
  const handleTimeUpdate = () => setCurrentTime(audio.currentTime);
@@ -2523,7 +2458,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2523
2458
  audio.removeEventListener("playing", handlePlaying);
2524
2459
  };
2525
2460
  }, []);
2526
- react.useEffect(() => {
2461
+ react$1.useEffect(() => {
2527
2462
  if (!floating || !staticRef.current) return;
2528
2463
  const observer = new IntersectionObserver(
2529
2464
  (entries) => {
@@ -2535,7 +2470,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2535
2470
  observer.observe(staticRef.current);
2536
2471
  return () => observer.disconnect();
2537
2472
  }, [floating]);
2538
- const togglePlay = react.useCallback(async () => {
2473
+ const togglePlay = react$1.useCallback(async () => {
2539
2474
  const audio = audioRef.current;
2540
2475
  if (!audio) return;
2541
2476
  if (isPlaying) {
@@ -2559,7 +2494,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2559
2494
  }
2560
2495
  }
2561
2496
  }, [isPlaying, onFirstPlay, title]);
2562
- const seekTo = react.useCallback(
2497
+ const seekTo = react$1.useCallback(
2563
2498
  (e) => {
2564
2499
  const audio = audioRef.current;
2565
2500
  if (!audio) return;
@@ -2569,7 +2504,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2569
2504
  },
2570
2505
  [duration]
2571
2506
  );
2572
- const handlePointerDown = react.useCallback(
2507
+ const handlePointerDown = react$1.useCallback(
2573
2508
  (e) => {
2574
2509
  e.currentTarget.setPointerCapture(e.pointerId);
2575
2510
  isDragging.current = true;
@@ -2577,18 +2512,18 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2577
2512
  },
2578
2513
  [seekTo]
2579
2514
  );
2580
- const handlePointerMove = react.useCallback(
2515
+ const handlePointerMove = react$1.useCallback(
2581
2516
  (e) => {
2582
2517
  if (!isDragging.current) return;
2583
2518
  seekTo(e);
2584
2519
  },
2585
2520
  [seekTo]
2586
2521
  );
2587
- const handlePointerUp = react.useCallback((e) => {
2522
+ const handlePointerUp = react$1.useCallback((e) => {
2588
2523
  e.currentTarget.releasePointerCapture(e.pointerId);
2589
2524
  isDragging.current = false;
2590
2525
  }, []);
2591
- const handleVolumeChange = react.useCallback((e) => {
2526
+ const handleVolumeChange = react$1.useCallback((e) => {
2592
2527
  const audio = audioRef.current;
2593
2528
  if (!audio) return;
2594
2529
  const newVolume = parseFloat(e.target.value);
@@ -2596,7 +2531,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2596
2531
  audio.volume = newVolume;
2597
2532
  setIsMuted(newVolume === 0);
2598
2533
  }, []);
2599
- const toggleMute = react.useCallback(() => {
2534
+ const toggleMute = react$1.useCallback(() => {
2600
2535
  const audio = audioRef.current;
2601
2536
  if (!audio) return;
2602
2537
  if (isMuted) {
@@ -2607,14 +2542,14 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2607
2542
  setIsMuted(true);
2608
2543
  }
2609
2544
  }, [isMuted, volume]);
2610
- const handlePlaybackRateChange = react.useCallback(() => {
2545
+ const handlePlaybackRateChange = react$1.useCallback(() => {
2611
2546
  const audio = audioRef.current;
2612
2547
  if (!audio) return;
2613
2548
  const nextRate = RATES[(RATES.indexOf(playbackRate) + 1) % RATES.length] ?? 1;
2614
2549
  audio.playbackRate = nextRate;
2615
2550
  setPlaybackRate(nextRate);
2616
2551
  }, [playbackRate]);
2617
- const skip = react.useCallback(
2552
+ const skip = react$1.useCallback(
2618
2553
  (seconds) => {
2619
2554
  const audio = audioRef.current;
2620
2555
  if (!audio) return;
@@ -2653,7 +2588,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2653
2588
  ),
2654
2589
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-surface/95 border-accent/25 border-t backdrop-blur-md", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm px-step-md flex items-center py-5", children: [
2655
2590
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex shrink-0 items-center", children: [
2656
- /* @__PURE__ */ jsxRuntime.jsx(Wave, { strokeWidth: "w-[2px]", height: "h-4", playing: isPlaying }),
2591
+ /* @__PURE__ */ jsxRuntime.jsx(Wave, { size: "size-4", playing: isPlaying }),
2657
2592
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-accent hidden uppercase sm:block", children: "Narraci\xF3n" })
2658
2593
  ] }),
2659
2594
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
@@ -2695,7 +2630,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2695
2630
  /* @__PURE__ */ jsxRuntime.jsx("audio", { ref: audioRef, src, preload: "metadata" }),
2696
2631
  /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: staticRef, children: [
2697
2632
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm mb-step-md flex items-center", children: [
2698
- /* @__PURE__ */ jsxRuntime.jsx(Wave, { strokeWidth: "w-[3px]", height: "h-5", playing: isPlaying }),
2633
+ /* @__PURE__ */ jsxRuntime.jsx(Wave, { size: "size-5", playing: isPlaying }),
2699
2634
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-accent uppercase", children: "Narraci\xF3n de audio" }),
2700
2635
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-chip font-mono text-text-muted ml-auto tabular-nums", children: [
2701
2636
  formatTime(currentTime),
@@ -2867,9 +2802,9 @@ function Breadcrumb({
2867
2802
  ] }) });
2868
2803
  }
2869
2804
  function CodeBlock({ children, language, copyText, className, ...props }) {
2870
- const [copiado, setCopiado] = react.useState(false);
2871
- const timer = react.useRef(null);
2872
- const copy = react.useCallback(async () => {
2805
+ const [copiado, setCopiado] = react$1.useState(false);
2806
+ const timer = react$1.useRef(null);
2807
+ const copy = react$1.useCallback(async () => {
2873
2808
  if (!copyText) return;
2874
2809
  try {
2875
2810
  await navigator.clipboard.writeText(copyText);
@@ -2909,13 +2844,26 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2909
2844
  "focus-ring"
2910
2845
  ),
2911
2846
  children: [
2912
- copiado ? /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "text-accent" }) : /* @__PURE__ */ jsxRuntime.jsx(Copy, {}),
2847
+ copiado ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Check, className: "text-accent" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Copy }),
2913
2848
  copiado ? "Copiado" : "Copiar"
2914
2849
  ]
2915
2850
  }
2916
2851
  ) : null
2917
2852
  ] }),
2918
- /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "p-step-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed", children })
2853
+ /* @__PURE__ */ jsxRuntime.jsx(
2854
+ "pre",
2855
+ {
2856
+ tabIndex: 0,
2857
+ className: cn(
2858
+ "p-step-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed",
2859
+ // `focus-ring-inset` and not the plain ring: the root carries
2860
+ // `overflow-hidden` so its corners hold, and it clips an outward ring
2861
+ // on three sides. See the note beside the utility in build-tokens.mjs.
2862
+ "focus-ring focus-ring-inset"
2863
+ ),
2864
+ children
2865
+ }
2866
+ )
2919
2867
  ]
2920
2868
  }
2921
2869
  );
@@ -3071,13 +3019,13 @@ function EventCalendar({
3071
3019
  className,
3072
3020
  ...props
3073
3021
  }) {
3074
- const id = react.useId();
3075
- const [diaInterno, setDiaInterno] = react.useState(() => selected ?? /* @__PURE__ */ new Date());
3022
+ const id = react$1.useId();
3023
+ const [diaInterno, setDiaInterno] = react$1.useState(() => selected ?? /* @__PURE__ */ new Date());
3076
3024
  const day = selected ?? diaInterno;
3077
- const [month, setMonth] = react.useState(() => day);
3078
- const [editing, setEditing] = react.useState(null);
3079
- const [title, setTitle] = react.useState("");
3080
- const [when, setWhen] = react.useState("");
3025
+ const [month, setMonth] = react$1.useState(() => day);
3026
+ const [editing, setEditing] = react$1.useState(null);
3027
+ const [title, setTitle] = react$1.useState("");
3028
+ const [when, setWhen] = react$1.useState("");
3081
3029
  const editable = Boolean(onCreateEvent ?? onUpdateEvent);
3082
3030
  const ofTheDay = events.filter((e) => sameDay(e.start, day)).sort((a, b) => a.start.getTime() - b.start.getTime());
3083
3031
  function pickDay(nuevo) {
@@ -3239,7 +3187,7 @@ function EventCalendar({
3239
3187
  ] });
3240
3188
  }
3241
3189
  function SocialRow({ social }) {
3242
- return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap items-center gap-[18px]", children: social.map((socialLink) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
3190
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap items-center justify-center gap-[18px] sm:justify-start", children: social.map((socialLink) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
3243
3191
  "a",
3244
3192
  {
3245
3193
  href: socialLink.href,
@@ -3337,16 +3285,23 @@ function Footer({
3337
3285
  };
3338
3286
  return /* @__PURE__ */ jsxRuntime.jsxs(Shell, { className, ...rest, children: [
3339
3287
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xl flex flex-col md:flex-row md:justify-between", children: [
3340
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex max-w-xs flex-col", children: [
3288
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex max-w-xs flex-col items-center text-center md:items-start md:text-left", children: [
3341
3289
  brand2,
3342
3290
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
3343
3291
  social && social.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(SocialRow, { social }) : null,
3344
3292
  action
3345
3293
  ] }),
3346
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-lg grid grid-cols-2 sm:grid-cols-3", children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex flex-col", children: [
3347
- /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "h3", children: column.title }),
3348
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-step-xs flex flex-col", children: column.links.map((columnLink) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: link(columnLink.href, columnLink.external, columnLink.label) }, columnLink.href)) })
3349
- ] }, column.title)) })
3294
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-lg grid grid-cols-1 min-[420px]:grid-cols-2 sm:grid-cols-3", children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsxs(
3295
+ "div",
3296
+ {
3297
+ className: "gap-step-sm flex flex-col items-center text-center md:items-start md:text-left",
3298
+ children: [
3299
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "h3", children: column.title }),
3300
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-step-xs flex flex-col", children: column.links.map((columnLink) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: link(columnLink.href, columnLink.external, columnLink.label) }, columnLink.href)) })
3301
+ ]
3302
+ },
3303
+ column.title
3304
+ )) })
3350
3305
  ] }),
3351
3306
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-hairline mt-step-xl pt-step-lg border-t", children: /* @__PURE__ */ jsxRuntime.jsx(Signature, { year, href: signatureHref, domain, className: "text-center sm:text-right" }) })
3352
3307
  ] });
@@ -3357,9 +3312,9 @@ function Footer({
3357
3312
  ].filter(Boolean);
3358
3313
  const [first, ...others] = rows;
3359
3314
  return /* @__PURE__ */ jsxRuntime.jsxs(Shell, { className, contentClassName: "gap-step-lg", ...rest, children: [
3360
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex flex-wrap items-center", children: [
3315
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex flex-col items-center sm:flex-row sm:flex-wrap", children: [
3361
3316
  first ?? null,
3362
- /* @__PURE__ */ jsxRuntime.jsx(Signature, { year, href: signatureHref, domain, className: "ml-auto" })
3317
+ /* @__PURE__ */ jsxRuntime.jsx(Signature, { year, href: signatureHref, domain, className: "sm:ml-auto" })
3363
3318
  ] }),
3364
3319
  others
3365
3320
  ] });
@@ -3460,8 +3415,9 @@ function LinkRow({
3460
3415
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "span", variant: "label", tone: "muted", className: "block truncate", children: description }) : null
3461
3416
  ] }),
3462
3417
  external ? /* @__PURE__ */ jsxRuntime.jsx(
3463
- ArrowUpRight,
3418
+ Icon,
3464
3419
  {
3420
+ as: react.ArrowUpRight,
3465
3421
  className: "text-text-muted group-hover:text-accent transition-standard shrink-0",
3466
3422
  "aria-hidden": "true"
3467
3423
  }
@@ -3487,15 +3443,35 @@ function Nav({ brand: brand2, children, actions, size: size2 = "default", classN
3487
3443
  "div",
3488
3444
  {
3489
3445
  className: cn(
3490
- "max-w-wide px-step-md gap-step-lg mx-auto flex items-center",
3446
+ "max-w-wide px-step-md gap-step-sm sm:gap-step-lg mx-auto flex items-center",
3491
3447
  size2 === "compact" ? "h-nav-compact" : "h-nav"
3492
3448
  ),
3493
3449
  children: [
3494
3450
  brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: brand2 }) : null,
3495
- children ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Principal", className: "ml-auto min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "gap-step-md flex items-center", children: [
3496
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
3497
- children
3498
- ] }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
3451
+ children ? (
3452
+ /*
3453
+ THE ITEM ROW SCROLLS instead of pushing the page sideways.
3454
+
3455
+ `min-w-0` was already here and on its own it does nothing: it lets the
3456
+ nav shrink below its content, and the content then simply overflows
3457
+ the bar. Six mono items at 13px plus the `~/` is around 300px, which
3458
+ fits nowhere under a brand and a theme switch on a 360px screen, and
3459
+ what the reader got was a horizontal scrollbar on the whole document.
3460
+
3461
+ It does NOT hide them below a breakpoint, which is the other obvious
3462
+ answer and the wrong one for a library: hiding the navigation is only
3463
+ safe if something else exposes it, and that something is a drawer the
3464
+ project owns — `eduardoalvarez.dev` composes one out of `Sheet` and
3465
+ puts it in `actions`. A `Nav` that hid its own items would leave every
3466
+ consumer without a drawer with no navigation at all, silently.
3467
+
3468
+ See `docs/decisions/0.10.md` § 54.
3469
+ */
3470
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Principal", className: "ml-auto min-w-0 overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "gap-step-md flex w-max items-center", children: [
3471
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
3472
+ children
3473
+ ] }) })
3474
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
3499
3475
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
3500
3476
  ]
3501
3477
  }
@@ -3549,13 +3525,13 @@ function NewsletterForm({
3549
3525
  className,
3550
3526
  ...props
3551
3527
  }) {
3552
- const id = react.useId();
3553
- const form = react.useRef(null);
3528
+ const id = react$1.useId();
3529
+ const form = react$1.useRef(null);
3554
3530
  const sending = state === "sending";
3555
3531
  const error = state === "error";
3556
3532
  const nameError = fieldErrors?.name;
3557
3533
  const emailError = fieldErrors?.email;
3558
- react.useEffect(() => {
3534
+ react$1.useEffect(() => {
3559
3535
  if (state === "success" && resetOnSuccess) form.current?.reset();
3560
3536
  }, [state, resetOnSuccess]);
3561
3537
  function submit(event) {
@@ -3684,9 +3660,9 @@ function ScrollingProgressBar({
3684
3660
  className,
3685
3661
  ...props
3686
3662
  }) {
3687
- const [seek, setAvance] = react.useState(0);
3688
- const pendingOne = react.useRef(0);
3689
- react.useEffect(() => {
3663
+ const [seek, setAvance] = react$1.useState(0);
3664
+ const pendingOne = react$1.useRef(0);
3665
+ react$1.useEffect(() => {
3690
3666
  const measure = () => {
3691
3667
  pendingOne.current = 0;
3692
3668
  const element = target?.current;
@@ -3734,9 +3710,9 @@ function ScrollingProgressBar({
3734
3710
  );
3735
3711
  }
3736
3712
  var DELTA = {
3737
- up: { glyph: ChevronUp, label: "sube" },
3738
- down: { glyph: ChevronDown, label: "baja" },
3739
- flat: { glyph: Minus, label: "sin cambio" }
3713
+ up: { glyph: react.TrendUp, label: "sube" },
3714
+ down: { glyph: react.TrendDown, label: "baja" },
3715
+ flat: { glyph: react.Minus, label: "sin cambio" }
3740
3716
  };
3741
3717
  function Stat({
3742
3718
  value,
@@ -3777,7 +3753,7 @@ function Stat({
3777
3753
  DELTA[delta.direction].label,
3778
3754
  " "
3779
3755
  ] }),
3780
- /* @__PURE__ */ jsxRuntime.jsx(DeltaGlyph, { className: "shrink-0" }),
3756
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: DeltaGlyph }),
3781
3757
  delta.value
3782
3758
  ] }) : null,
3783
3759
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
@@ -3867,17 +3843,20 @@ function ThemeToggle({
3867
3843
  size: size2,
3868
3844
  "aria-label": label,
3869
3845
  className: cn("[&_svg]:size-[19px]", className),
3870
- onClick: () => onThemeChange?.(toggleTheme()),
3846
+ onClick: () => {
3847
+ const theme = toggleTheme();
3848
+ onThemeChange?.(theme);
3849
+ },
3871
3850
  ...props,
3872
3851
  children: [
3873
- /* @__PURE__ */ jsxRuntime.jsx(Sun, { className: "light:hidden" }),
3874
- /* @__PURE__ */ jsxRuntime.jsx(Moon, { className: "hidden light:block" })
3852
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Sun, className: "light:hidden" }),
3853
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { as: react.Moon, className: "hidden light:block" })
3875
3854
  ]
3876
3855
  }
3877
3856
  );
3878
3857
  }
3879
3858
  function useTheme() {
3880
- return react.useSyncExternalStore(subscribe2, currentTheme, server);
3859
+ return react$1.useSyncExternalStore(subscribe2, currentTheme, server);
3881
3860
  }
3882
3861
  var subscribe2 = (warn) => watchTheme(() => warn());
3883
3862
  var server = () => "dark";
@@ -3966,160 +3945,6 @@ function Logo({
3966
3945
  ] });
3967
3946
  }
3968
3947
 
3969
- // src/social/index.tsx
3970
- var social_exports = {};
3971
- __export(social_exports, {
3972
- Discord: () => Discord,
3973
- Email: () => Email,
3974
- GitHub: () => GitHub,
3975
- Instagram: () => Instagram,
3976
- LinkedIn: () => LinkedIn,
3977
- Newsletter: () => Newsletter,
3978
- Rss: () => Rss,
3979
- Website: () => Website,
3980
- X: () => X,
3981
- YouTube: () => YouTube
3982
- });
3983
-
3984
- // src/social/data.ts
3985
- var SOCIAL_STROKE_WIDTH = 1.6;
3986
- var SOCIAL_VIEW_BOX = "0 0 24 24";
3987
- var gitHubGlyph = {
3988
- kind: "brand",
3989
- shapes: [
3990
- {
3991
- tag: "path",
3992
- 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"
3993
- }
3994
- ]
3995
- };
3996
- var linkedInGlyph = {
3997
- kind: "brand",
3998
- shapes: [
3999
- {
4000
- tag: "path",
4001
- 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"
4002
- }
4003
- ]
4004
- };
4005
- var xGlyph = {
4006
- kind: "brand",
4007
- shapes: [
4008
- {
4009
- tag: "path",
4010
- 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"
4011
- }
4012
- ]
4013
- };
4014
- var instagramGlyph = {
4015
- kind: "brand",
4016
- shapes: [
4017
- {
4018
- tag: "path",
4019
- 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"
4020
- }
4021
- ]
4022
- };
4023
- var discordGlyph = {
4024
- kind: "brand",
4025
- shapes: [
4026
- {
4027
- tag: "path",
4028
- 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"
4029
- }
4030
- ]
4031
- };
4032
- var youTubeGlyph = {
4033
- kind: "brand",
4034
- shapes: [
4035
- {
4036
- tag: "path",
4037
- 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"
4038
- }
4039
- ]
4040
- };
4041
- var rssGlyph = {
4042
- kind: "functional",
4043
- shapes: [
4044
- { tag: "path", d: "M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16" },
4045
- { tag: "circle", cx: 5, cy: 19, r: 1.6, solid: true }
4046
- ]
4047
- };
4048
- var emailGlyph = {
4049
- kind: "functional",
4050
- shapes: [
4051
- { tag: "rect", x: 2.75, y: 4.75, width: 18.5, height: 14.5, rx: 2 },
4052
- { tag: "path", d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" }
4053
- ]
4054
- };
4055
- var newsletterGlyph = {
4056
- kind: "functional",
4057
- shapes: [
4058
- { tag: "path", d: "M18 8.5a6 6 0 1 0-12 0c0 5-2 6.5-2 6.5h16s-2-1.5-2-6.5" },
4059
- { tag: "path", d: "M13.7 19a2 2 0 0 1-3.4 0" }
4060
- ]
4061
- };
4062
- var websiteGlyph = {
4063
- kind: "functional",
4064
- shapes: [
4065
- { tag: "circle", cx: 12, cy: 12, r: 9.25 },
4066
- { tag: "path", d: "M2.75 12h18.5" },
4067
- { tag: "path", d: "M12 2.75a14 14 0 0 1 0 18.5a14 14 0 0 1 0-18.5" }
4068
- ]
4069
- };
4070
- var SOLID = { fill: "currentColor", stroke: "none" };
4071
- function drawShape(shape, index) {
4072
- if (shape.tag === "path") {
4073
- return /* @__PURE__ */ jsxRuntime.jsx("path", { d: shape.d, ...shape.solid ? SOLID : {} }, index);
4074
- }
4075
- if (shape.tag === "circle") {
4076
- return /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: shape.cx, cy: shape.cy, r: shape.r, ...shape.solid ? SOLID : {} }, index);
4077
- }
4078
- return /* @__PURE__ */ jsxRuntime.jsx(
4079
- "rect",
4080
- {
4081
- x: shape.x,
4082
- y: shape.y,
4083
- width: shape.width,
4084
- height: shape.height,
4085
- rx: shape.rx
4086
- },
4087
- index
4088
- );
4089
- }
4090
- function Glyph2({ glyph, ...props }) {
4091
- const brand2 = glyph.kind === "brand";
4092
- return /* @__PURE__ */ jsxRuntime.jsx(
4093
- "svg",
4094
- {
4095
- viewBox: SOCIAL_VIEW_BOX,
4096
- width: "1em",
4097
- height: "1em",
4098
- fill: brand2 ? "currentColor" : "none",
4099
- ...brand2 ? {} : {
4100
- stroke: "currentColor",
4101
- strokeWidth: SOCIAL_STROKE_WIDTH,
4102
- strokeLinecap: "round",
4103
- strokeLinejoin: "round"
4104
- },
4105
- "aria-hidden": "true",
4106
- focusable: "false",
4107
- ...props,
4108
- children: glyph.shapes.map(drawShape)
4109
- }
4110
- );
4111
- }
4112
- var GitHub = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: gitHubGlyph, ...props });
4113
- var LinkedIn = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: linkedInGlyph, ...props });
4114
- var X = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: xGlyph, ...props });
4115
- var Instagram = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: instagramGlyph, ...props });
4116
- var Discord = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: discordGlyph, ...props });
4117
- var YouTube = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: youTubeGlyph, ...props });
4118
- var Rss = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: rssGlyph, ...props });
4119
- var Email = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: emailGlyph, ...props });
4120
- var Newsletter = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: newsletterGlyph, ...props });
4121
- var Website = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph2, { glyph: websiteGlyph, ...props });
4122
-
4123
3948
  exports.ASSETS_PATH = ASSETS_PATH;
4124
3949
  exports.Accordion = Accordion;
4125
3950
  exports.AccordionContent = AccordionContent;
@@ -4293,7 +4118,6 @@ exports.radius = radius;
4293
4118
  exports.series = series;
4294
4119
  exports.shadow = shadow;
4295
4120
  exports.size = size;
4296
- exports.social = social_exports;
4297
4121
  exports.spacing = spacing;
4298
4122
  exports.storedTheme = storedTheme;
4299
4123
  exports.syntax = syntax;