@eduardoalvarez/arrecife 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +185 -20
  3. package/dist/brand/index.js +3 -3
  4. package/dist/chart/index.js +3 -3
  5. package/dist/{chunk-XKYHTOUJ.js → chunk-2WPWEIMD.js} +1 -1
  6. package/dist/chunk-45HVCTB7.js +70 -0
  7. package/dist/{chunk-DKCN7BAL.js → chunk-727HCBD4.js} +1 -1
  8. package/dist/{chunk-25YNFCIF.js → chunk-E6KFUSKB.js} +6 -3
  9. package/dist/{chunk-6O3KWB6P.js → chunk-JN3IS5OS.js} +2 -2
  10. package/dist/{chunk-O4TAH7YJ.js → chunk-OMKSESQB.js} +27 -3
  11. package/dist/{chunk-PMN7NR3G.js → chunk-TA7TLWW4.js} +1 -1
  12. package/dist/{chunk-JMOOFZ3B.js → chunk-WGNIRIN7.js} +1 -1
  13. package/dist/doctor.mjs +166 -0
  14. package/dist/form/index.js +4 -4
  15. package/dist/icons/index.cjs +149 -0
  16. package/dist/icons/index.d.cts +94 -0
  17. package/dist/icons/index.d.ts +94 -0
  18. package/dist/icons/index.js +28 -0
  19. package/dist/index-DlAO2JZs.d.cts +47 -0
  20. package/dist/index-DlAO2JZs.d.ts +47 -0
  21. package/dist/index.cjs +279 -103
  22. package/dist/index.d.cts +186 -57
  23. package/dist/index.d.ts +186 -57
  24. package/dist/index.js +262 -179
  25. package/dist/og/index.cjs +3 -2
  26. package/dist/og/index.js +1 -1
  27. package/dist/shiki/index.js +1 -1
  28. package/dist/social/index.cjs +67 -0
  29. package/dist/social/index.d.cts +2 -0
  30. package/dist/social/index.d.ts +2 -0
  31. package/dist/social/index.js +2 -0
  32. package/dist/tokens/index.cjs +27 -3
  33. package/dist/tokens/index.d.cts +33 -6
  34. package/dist/tokens/index.d.ts +33 -6
  35. package/dist/tokens/index.js +2 -2
  36. package/dist/tokens/theme.css +33 -3
  37. package/dist/variants/index.cjs +6 -3
  38. package/dist/variants/index.d.cts +4 -1
  39. package/dist/variants/index.d.ts +4 -1
  40. package/dist/variants/index.js +1 -1
  41. package/llms.txt +363 -30
  42. package/package.json +24 -2
package/dist/index.js CHANGED
@@ -1,28 +1,29 @@
1
1
  'use client';
2
- export { tokens } from './chunk-PMN7NR3G.js';
2
+ import { Label } from './chunk-727HCBD4.js';
3
+ export { Label } from './chunk-727HCBD4.js';
4
+ import { Text } from './chunk-WGNIRIN7.js';
5
+ export { Text } from './chunk-WGNIRIN7.js';
6
+ export { tokens } from './chunk-TA7TLWW4.js';
3
7
  import { toggleTheme, currentTheme, watchTheme } from './chunk-GCRII2KQ.js';
4
8
  export { THEME_ATTRIBUTE, THEME_EVENT, THEME_KEY, applyTheme, currentTheme, preferredTheme, storedTheme, themeScript, toggleTheme, watchTheme } from './chunk-GCRII2KQ.js';
5
- import { alert, button, avatar, badge, category, metric, CARD_SURFACE, CARD } from './chunk-25YNFCIF.js';
6
- export { CARD, CARD_HOVER, CARD_SURFACE, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, category as categoryBadgeVariants, metric as metricBadgeVariants } from './chunk-25YNFCIF.js';
7
- import { MascotFace, Mascot } from './chunk-6O3KWB6P.js';
8
- export { Isotype, Logo, Mascot, MascotFace } from './chunk-6O3KWB6P.js';
9
- export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from './chunk-CKRSQPTX.js';
10
- import { Label } from './chunk-DKCN7BAL.js';
11
- export { Label } from './chunk-DKCN7BAL.js';
12
- import { Text } from './chunk-JMOOFZ3B.js';
13
- export { Text } from './chunk-JMOOFZ3B.js';
9
+ import { alert, button, avatar, badge, category, metric, CARD_SURFACE, CARD } from './chunk-E6KFUSKB.js';
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-E6KFUSKB.js';
14
11
  export { text as textVariants } from './chunk-ODBFN44D.js';
15
- import { cn } from './chunk-XKYHTOUJ.js';
16
- export { cn } from './chunk-XKYHTOUJ.js';
17
- import { naming } from './chunk-O4TAH7YJ.js';
18
- export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from './chunk-O4TAH7YJ.js';
19
- import { __export } from './chunk-MLKGABMK.js';
12
+ import { MascotFace, Mascot } from './chunk-JN3IS5OS.js';
13
+ export { Isotype, Logo, Mascot, MascotFace } from './chunk-JN3IS5OS.js';
14
+ export { social_exports as social } from './chunk-45HVCTB7.js';
15
+ import { cn } from './chunk-2WPWEIMD.js';
16
+ export { cn } from './chunk-2WPWEIMD.js';
17
+ export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from './chunk-CKRSQPTX.js';
18
+ import { naming } from './chunk-OMKSESQB.js';
19
+ export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from './chunk-OMKSESQB.js';
20
+ import './chunk-MLKGABMK.js';
20
21
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
21
22
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
22
23
  import { cva } from 'class-variance-authority';
23
24
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
24
25
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
25
- import { useId, useState, useEffect, useSyncExternalStore, useRef, useCallback } from 'react';
26
+ import { createContext, useId, useState, useEffect, useSyncExternalStore, useRef, useCallback, useContext } from 'react';
26
27
  import { Slot } from '@radix-ui/react-slot';
27
28
  import { es } from 'date-fns/locale';
28
29
  import { DayPicker } from 'react-day-picker';
@@ -182,7 +183,7 @@ function AccordionTrigger({
182
183
  "font-sans text-lead font-medium text-text-primary",
183
184
  "transition-standard",
184
185
  "hover:text-accent",
185
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
186
+ "focus-ring",
186
187
  "disabled:pointer-events-none disabled:opacity-50",
187
188
  "[&[data-state=open]>svg]:rotate-180",
188
189
  className
@@ -418,7 +419,7 @@ function AvatarUpload({
418
419
  "transition-standard hover:text-accent hover:border-accent",
419
420
  // Focus lives on the input, which is hidden: without this, tabbing to
420
421
  // the control shows up nowhere.
421
- "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-accent",
422
+ "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-3 has-[:focus-visible]:outline-accent",
422
423
  disabled && "pointer-events-none opacity-50"
423
424
  ),
424
425
  children: [
@@ -507,14 +508,14 @@ function Calendar({
507
508
  "rounded-chip inline-flex items-center justify-center",
508
509
  "transition-standard cursor-pointer",
509
510
  "hover:bg-surface-raised",
510
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
511
+ "focus-ring",
511
512
  "disabled:pointer-events-none disabled:opacity-50"
512
513
  ].join(" ");
513
514
  const navigation = [
514
515
  "size-8 rounded-chip inline-flex items-center justify-center",
515
516
  "text-text-secondary transition-standard cursor-pointer",
516
517
  "hover:bg-surface-raised hover:text-text-primary",
517
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
518
+ "focus-ring",
518
519
  "disabled:pointer-events-none disabled:opacity-50"
519
520
  ].join(" ");
520
521
  return /* @__PURE__ */ jsx(
@@ -599,7 +600,7 @@ function Checkbox({ className, ...props }) {
599
600
  "rounded-chip border-border bg-surface size-5 shrink-0 cursor-pointer border",
600
601
  "text-accent-on transition-standard",
601
602
  "hover:border-hairline-hover",
602
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
603
+ "focus-ring",
603
604
  "disabled:pointer-events-none disabled:opacity-50",
604
605
  "data-[state=checked]:border-accent data-[state=checked]:bg-accent",
605
606
  "data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent",
@@ -642,7 +643,7 @@ function DateField({
642
643
  "font-mono text-ui text-text-primary",
643
644
  "transition-standard",
644
645
  "hover:border-hairline-hover",
645
- "focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
646
+ "focus-visible:border-accent focus-ring",
646
647
  "disabled:pointer-events-none disabled:opacity-50",
647
648
  "data-[invalid]:border-error data-[invalid]:focus-visible:outline-error",
648
649
  // The native indicator inherits the active theme's scheme.
@@ -696,7 +697,7 @@ function DialogContent({
696
697
  "rounded-chip text-text-muted absolute top-4 right-4 flex size-8 cursor-pointer items-center justify-center",
697
698
  "transition-standard",
698
699
  "hover:bg-surface-raised hover:text-text-primary",
699
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
700
+ "focus-ring"
700
701
  ),
701
702
  children: /* @__PURE__ */ jsx(Close, {})
702
703
  }
@@ -845,7 +846,7 @@ function Input({ className, invalid = false, ...props }) {
845
846
  "font-sans text-ui text-text-primary placeholder:text-text-muted",
846
847
  "transition-standard",
847
848
  "hover:border-hairline-hover",
848
- "focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
849
+ "focus-visible:border-accent focus-ring",
849
850
  "disabled:pointer-events-none disabled:opacity-50",
850
851
  "data-[invalid]:border-error data-[invalid]:focus-visible:outline-error",
851
852
  "file:mr-step-sm file:border-0 file:bg-transparent file:font-sans file:text-label file:text-text-secondary",
@@ -882,7 +883,7 @@ function PaginationLink({ className, isActive = false, ...props }) {
882
883
  "font-sans text-ui text-text-secondary",
883
884
  "transition-standard",
884
885
  "hover:bg-surface hover:text-text-primary",
885
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
886
+ "focus-ring",
886
887
  isActive && "bg-surface-raised text-text-primary",
887
888
  className
888
889
  ),
@@ -897,7 +898,7 @@ function PaginationPrevious({ className, ...props }) {
897
898
  ] });
898
899
  }
899
900
  function PaginationNext({ className, ...props }) {
900
- return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina next", className: cn("gap-step-xs", className), ...props, children: [
901
+ return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina siguiente", className: cn("gap-step-xs", className), ...props, children: [
901
902
  "Siguiente",
902
903
  /* @__PURE__ */ jsx(ChevronRight, {})
903
904
  ] });
@@ -967,7 +968,7 @@ function RadioGroupItem({ className, ...props }) {
967
968
  "rounded-pill border-border bg-surface size-5 shrink-0 cursor-pointer border",
968
969
  "transition-standard",
969
970
  "hover:border-hairline-hover",
970
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
971
+ "focus-ring",
971
972
  "disabled:pointer-events-none disabled:opacity-50",
972
973
  "data-[state=checked]:border-accent",
973
974
  className
@@ -994,7 +995,7 @@ function SelectTrigger({
994
995
  "font-sans text-ui text-text-primary",
995
996
  "transition-standard",
996
997
  "hover:border-hairline-hover",
997
- "focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
998
+ "focus-visible:border-accent focus-ring",
998
999
  "disabled:pointer-events-none disabled:opacity-50",
999
1000
  "data-[placeholder]:text-text-muted",
1000
1001
  className
@@ -1144,7 +1145,7 @@ function SheetContent({ className, side, children, ...props }) {
1144
1145
  "rounded-chip text-text-muted absolute top-4 right-4 flex size-8 cursor-pointer items-center justify-center",
1145
1146
  "transition-standard",
1146
1147
  "hover:bg-surface-raised hover:text-text-primary",
1147
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
1148
+ "focus-ring"
1148
1149
  ),
1149
1150
  children: /* @__PURE__ */ jsx(Close, {})
1150
1151
  }
@@ -1219,7 +1220,7 @@ function Switch({ className, ...props }) {
1219
1220
  "rounded-pill border-border bg-surface-raised inline-flex h-6 w-11 shrink-0 cursor-pointer items-center border",
1220
1221
  "transition-standard",
1221
1222
  "hover:border-hairline-hover",
1222
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1223
+ "focus-ring",
1223
1224
  "disabled:pointer-events-none disabled:opacity-50",
1224
1225
  "data-[state=checked]:border-accent data-[state=checked]:bg-accent",
1225
1226
  className
@@ -1320,7 +1321,7 @@ function TabsTrigger({
1320
1321
  "font-sans text-label text-text-secondary",
1321
1322
  "transition-standard",
1322
1323
  "hover:text-text-primary",
1323
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1324
+ "focus-ring",
1324
1325
  "disabled:pointer-events-none disabled:opacity-50",
1325
1326
  "data-[state=active]:bg-surface-raised data-[state=active]:text-text-primary",
1326
1327
  className
@@ -1337,7 +1338,7 @@ function TabsContent({
1337
1338
  TabsPrimitive.Content,
1338
1339
  {
1339
1340
  className: cn(
1340
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1341
+ "focus-ring",
1341
1342
  className
1342
1343
  ),
1343
1344
  ...props
@@ -1356,7 +1357,7 @@ function Textarea({ className, invalid = false, ...props }) {
1356
1357
  "font-sans text-ui text-text-primary placeholder:text-text-muted",
1357
1358
  "transition-standard",
1358
1359
  "hover:border-hairline-hover",
1359
- "focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1360
+ "focus-visible:border-accent focus-ring",
1360
1361
  "disabled:pointer-events-none disabled:opacity-50",
1361
1362
  "data-[invalid]:border-error data-[invalid]:focus-visible:outline-error",
1362
1363
  className
@@ -1411,7 +1412,7 @@ function Toast({ className, variant, children, ...props }) {
1411
1412
  "rounded-chip text-text-muted absolute top-3 right-3 flex size-7 cursor-pointer items-center justify-center",
1412
1413
  "transition-standard",
1413
1414
  "hover:bg-surface-raised hover:text-text-primary",
1414
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
1415
+ "focus-ring"
1415
1416
  ),
1416
1417
  children: /* @__PURE__ */ jsx(Close, {})
1417
1418
  }
@@ -1653,21 +1654,21 @@ function ProgressBar({
1653
1654
  }
1654
1655
  );
1655
1656
  }
1656
- var CONTROL = "rounded-chip transition-standard cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent";
1657
+ var CONTROL = "rounded-chip transition-standard cursor-pointer focus-ring";
1657
1658
  function SkipButton({
1658
- segundos,
1659
+ seconds,
1659
1660
  className,
1660
1661
  size: size2,
1661
- onSaltar
1662
+ onSkip
1662
1663
  }) {
1663
1664
  return /* @__PURE__ */ jsx(
1664
1665
  "button",
1665
1666
  {
1666
1667
  type: "button",
1667
- onClick: () => onSaltar(segundos),
1668
+ onClick: () => onSkip(seconds),
1668
1669
  className: cn("text-text-muted hover:text-text-primary", CONTROL, className),
1669
- "aria-label": segundos < 0 ? "Retroceder 15 segundos" : "Adelantar 15 segundos",
1670
- children: segundos < 0 ? /* @__PURE__ */ jsx(GoBackSeconds, { className: size2 }) : /* @__PURE__ */ jsx(AdvanceSeconds, { className: size2 })
1670
+ "aria-label": seconds < 0 ? "Retroceder 15 segundos" : "Adelantar 15 segundos",
1671
+ children: seconds < 0 ? /* @__PURE__ */ jsx(GoBackSeconds, { className: size2 }) : /* @__PURE__ */ jsx(AdvanceSeconds, { className: size2 })
1671
1672
  }
1672
1673
  );
1673
1674
  }
@@ -1699,8 +1700,8 @@ function SpeedButton({
1699
1700
  function Volume({
1700
1701
  size: size2,
1701
1702
  width,
1702
- silenciado,
1703
- volumen,
1703
+ muted,
1704
+ volume,
1704
1705
  onMute,
1705
1706
  onVolumeChange
1706
1707
  }) {
@@ -1711,8 +1712,8 @@ function Volume({
1711
1712
  type: "button",
1712
1713
  onClick: onMute,
1713
1714
  className: cn("text-text-muted hover:text-text-primary p-1", CONTROL),
1714
- "aria-label": silenciado ? "Activar sonido" : "Silenciar",
1715
- children: silenciado || volumen === 0 ? /* @__PURE__ */ jsx(VolumeMuted, { className: size2 }) : /* @__PURE__ */ jsx(VolumeOn, { className: size2 })
1715
+ "aria-label": muted ? "Activar sonido" : "Silenciar",
1716
+ children: muted || volume === 0 ? /* @__PURE__ */ jsx(VolumeMuted, { className: size2 }) : /* @__PURE__ */ jsx(VolumeOn, { className: size2 })
1716
1717
  }
1717
1718
  ),
1718
1719
  /* @__PURE__ */ jsx(
@@ -1722,20 +1723,20 @@ function Volume({
1722
1723
  min: "0",
1723
1724
  max: "1",
1724
1725
  step: "0.1",
1725
- value: silenciado ? 0 : volumen,
1726
+ value: muted ? 0 : volume,
1726
1727
  onChange: onVolumeChange,
1727
1728
  className: cn(
1728
1729
  "bg-surface-raised rounded-pill h-1 cursor-pointer appearance-none",
1729
1730
  "[accent-color:var(--color-accent)]",
1730
1731
  width
1731
1732
  ),
1732
- "aria-label": "Volume"
1733
+ "aria-label": "Volumen"
1733
1734
  }
1734
1735
  )
1735
1736
  ] });
1736
1737
  }
1737
- function PlayIcon({ className, cargando, error, playing }) {
1738
- if (cargando) return /* @__PURE__ */ jsx(Spinner, { className: cn("motion-safe:animate-spin", className) });
1738
+ function PlayIcon({ className, loading, error, playing }) {
1739
+ if (loading) return /* @__PURE__ */ jsx(Spinner, { className: cn("motion-safe:animate-spin", className) });
1739
1740
  if (error) return /* @__PURE__ */ jsx(Retry, { className });
1740
1741
  if (playing) return /* @__PURE__ */ jsx(Pause, { className });
1741
1742
  return /* @__PURE__ */ jsx(Play, { className });
@@ -1755,7 +1756,7 @@ function PlayButton({
1755
1756
  onClick: onToggle,
1756
1757
  className: cn(
1757
1758
  "text-accent-on transition-standard cursor-pointer",
1758
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1759
+ "focus-ring",
1759
1760
  state.error ? "bg-error hover:bg-error/80" : "bg-accent hover:bg-accent-hover",
1760
1761
  className
1761
1762
  ),
@@ -1924,7 +1925,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
1924
1925
  );
1925
1926
  const progress = duration > 0 ? currentTime / duration * 100 : 0;
1926
1927
  const playLabel = hasError ? "Reintentar" : isPlaying ? "Pausar" : "Reproducir";
1927
- const playState = { cargando: isLoading, error: hasError, playing: isPlaying };
1928
+ const playState = { loading: isLoading, error: hasError, playing: isPlaying };
1928
1929
  const pointer = {
1929
1930
  onPointerDown: handlePointerDown,
1930
1931
  onPointerMove: handlePointerMove,
@@ -1965,7 +1966,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
1965
1966
  ] })
1966
1967
  ] }),
1967
1968
  /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
1968
- /* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
1969
+ /* @__PURE__ */ jsx(SkipButton, { seconds: -15, className: "p-1.5", size: "w-5 h-5", onSkip: skip }),
1969
1970
  /* @__PURE__ */ jsx(
1970
1971
  PlayButton,
1971
1972
  {
@@ -1976,7 +1977,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
1976
1977
  ...playState
1977
1978
  }
1978
1979
  ),
1979
- /* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
1980
+ /* @__PURE__ */ jsx(SkipButton, { seconds: 15, className: "p-1.5", size: "w-5 h-5", onSkip: skip }),
1980
1981
  /* @__PURE__ */ jsx(
1981
1982
  SpeedButton,
1982
1983
  {
@@ -2005,7 +2006,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2005
2006
  ] }),
2006
2007
  /* @__PURE__ */ jsx("div", { className: "mb-step-md", children: /* @__PURE__ */ jsx(ProgressBar, { height: "h-1.5", knob: 14, progress, ...pointer }) }),
2007
2008
  /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
2008
- /* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-2", size: "w-6 h-6", onSaltar: skip }),
2009
+ /* @__PURE__ */ jsx(SkipButton, { seconds: -15, className: "p-2", size: "w-6 h-6", onSkip: skip }),
2009
2010
  /* @__PURE__ */ jsx(
2010
2011
  PlayButton,
2011
2012
  {
@@ -2017,7 +2018,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2017
2018
  ...playState
2018
2019
  }
2019
2020
  ),
2020
- /* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-2", size: "w-6 h-6", onSaltar: skip }),
2021
+ /* @__PURE__ */ jsx(SkipButton, { seconds: 15, className: "p-2", size: "w-6 h-6", onSkip: skip }),
2021
2022
  /* @__PURE__ */ jsxs("div", { className: "gap-step-sm ml-auto flex items-center", children: [
2022
2023
  /* @__PURE__ */ jsx(
2023
2024
  SpeedButton,
@@ -2032,8 +2033,8 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2032
2033
  {
2033
2034
  size: "w-4 h-4",
2034
2035
  width: "w-16",
2035
- silenciado: isMuted,
2036
- volumen: volume,
2036
+ muted: isMuted,
2037
+ volume,
2037
2038
  onMute: toggleMute,
2038
2039
  onVolumeChange: handleVolumeChange
2039
2040
  }
@@ -2055,7 +2056,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2055
2056
  ] }),
2056
2057
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
2057
2058
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
2058
- /* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
2059
+ /* @__PURE__ */ jsx(SkipButton, { seconds: -15, className: "p-1.5", size: "w-5 h-5", onSkip: skip }),
2059
2060
  /* @__PURE__ */ jsx(
2060
2061
  PlayButton,
2061
2062
  {
@@ -2066,7 +2067,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2066
2067
  ...playState
2067
2068
  }
2068
2069
  ),
2069
- /* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip })
2070
+ /* @__PURE__ */ jsx(SkipButton, { seconds: 15, className: "p-1.5", size: "w-5 h-5", onSkip: skip })
2070
2071
  ] }),
2071
2072
  /* @__PURE__ */ jsx(
2072
2073
  SpeedButton,
@@ -2091,7 +2092,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2091
2092
  ] }),
2092
2093
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
2093
2094
  /* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex items-center", children: [
2094
- /* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-2", size: "w-5 h-5", onSaltar: skip }),
2095
+ /* @__PURE__ */ jsx(SkipButton, { seconds: -15, className: "p-2", size: "w-5 h-5", onSkip: skip }),
2095
2096
  /* @__PURE__ */ jsx(
2096
2097
  PlayButton,
2097
2098
  {
@@ -2102,7 +2103,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2102
2103
  ...playState
2103
2104
  }
2104
2105
  ),
2105
- /* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-2", size: "w-5 h-5", onSaltar: skip })
2106
+ /* @__PURE__ */ jsx(SkipButton, { seconds: 15, className: "p-2", size: "w-5 h-5", onSkip: skip })
2106
2107
  ] }),
2107
2108
  /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
2108
2109
  /* @__PURE__ */ jsx(
@@ -2118,8 +2119,8 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2118
2119
  {
2119
2120
  size: "w-5 h-5",
2120
2121
  width: "w-20",
2121
- silenciado: isMuted,
2122
- volumen: volume,
2122
+ muted: isMuted,
2123
+ volume,
2123
2124
  onMute: toggleMute,
2124
2125
  onVolumeChange: handleVolumeChange
2125
2126
  }
@@ -2145,7 +2146,7 @@ function Blockquote({ children, author, source, className, ...props }) {
2145
2146
  }
2146
2147
  );
2147
2148
  }
2148
- var LINK = "transition-standard hover:text-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent rounded-chip cursor-pointer";
2149
+ var LINK = "transition-standard hover:text-accent focus-ring rounded-chip cursor-pointer";
2149
2150
  function Breadcrumb({
2150
2151
  items,
2151
2152
  homeHref = "/",
@@ -2206,7 +2207,7 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2206
2207
  "gap-step-xs rounded-chip flex items-center px-2 py-1",
2207
2208
  "text-label font-mono text-text-muted cursor-pointer",
2208
2209
  "transition-standard hover:bg-surface hover:text-text-primary",
2209
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
2210
+ "focus-ring"
2210
2211
  ),
2211
2212
  children: [
2212
2213
  copiado ? /* @__PURE__ */ jsx(Check, { className: "text-accent" }) : /* @__PURE__ */ jsx(Copy, {}),
@@ -2247,20 +2248,32 @@ function CourseCard({
2247
2248
  ] }) });
2248
2249
  }
2249
2250
  var FACE = "w-[66px] max-w-none";
2250
- function EmptyState({
2251
- expression,
2252
- title,
2253
- description,
2254
- action,
2255
- basePath,
2256
- className,
2257
- ...props
2258
- }) {
2251
+ function EmptyState(props) {
2252
+ if (props.variant === "inline") {
2253
+ const { variant: variant2, title: title2, description: description2, action: action2, icon, className: className2, ...rest2 } = props;
2254
+ return /* @__PURE__ */ jsxs(
2255
+ "div",
2256
+ {
2257
+ className: cn(
2258
+ "py-step-lg px-step-md gap-step-xs flex flex-col items-center text-center",
2259
+ className2
2260
+ ),
2261
+ ...rest2,
2262
+ children: [
2263
+ icon ? /* @__PURE__ */ jsx("span", { className: "text-text-muted shrink-0", children: icon }) : null,
2264
+ /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "muted", as: "p", className: "max-w-measure", children: title2 }),
2265
+ description2 ? /* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "max-w-measure font-normal", children: description2 }) : null,
2266
+ action2 ? /* @__PURE__ */ jsx("div", { className: "mt-step-xs", children: action2 }) : null
2267
+ ]
2268
+ }
2269
+ );
2270
+ }
2271
+ const { variant, title, description, action, expression, basePath, className, ...rest } = props;
2259
2272
  return /* @__PURE__ */ jsxs(
2260
2273
  "div",
2261
2274
  {
2262
2275
  className: cn(CARD_SURFACE, "p-step-lg gap-step-sm flex flex-col items-center text-center", className),
2263
- ...props,
2276
+ ...rest,
2264
2277
  children: [
2265
2278
  /* @__PURE__ */ jsx(MascotFace, { expression, className: FACE, basePath }),
2266
2279
  /* @__PURE__ */ jsx(Text, { variant: "ui", as: "p", className: "font-medium", children: title }),
@@ -2449,7 +2462,7 @@ function EventCalendar({
2449
2462
  ] }),
2450
2463
  /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex flex-wrap items-center", children: [
2451
2464
  /* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", children: editing ? "Guardar" : "A\xF1adir" }),
2452
- editing ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "tertiary", size: "sm", onClick: cancel, children: "./cancel" }) : null
2465
+ editing ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "tertiary", size: "sm", onClick: cancel, children: "./cancelar" }) : null
2453
2466
  ] })
2454
2467
  ] }) : null
2455
2468
  ]
@@ -2495,7 +2508,7 @@ function Footer({
2495
2508
  "aria-label": socialLink.label,
2496
2509
  className: cn(
2497
2510
  "text-text-muted hover:text-accent transition-standard block cursor-pointer text-[19px]",
2498
- "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
2511
+ "rounded-chip focus-ring"
2499
2512
  ),
2500
2513
  children: socialLink.icon
2501
2514
  }
@@ -2518,7 +2531,7 @@ function FooterLink({ asChild = false, className, ...props }) {
2518
2531
  {
2519
2532
  className: cn(
2520
2533
  "font-mono text-meta text-text-secondary hover:text-accent transition-standard cursor-pointer",
2521
- "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2534
+ "rounded-chip focus-ring",
2522
2535
  className
2523
2536
  ),
2524
2537
  ...props
@@ -2631,7 +2644,7 @@ function LinkRow({
2631
2644
  }
2632
2645
  );
2633
2646
  }
2634
- function Nav({ brand: brand2, children, actions, className, ...props }) {
2647
+ function Nav({ brand: brand2, children, actions, size: size2 = "default", className, ...props }) {
2635
2648
  return /* @__PURE__ */ jsx(
2636
2649
  "header",
2637
2650
  {
@@ -2644,14 +2657,23 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
2644
2657
  className
2645
2658
  ),
2646
2659
  ...props,
2647
- children: /* @__PURE__ */ jsxs("div", { className: "max-w-wide px-step-md h-nav gap-step-lg mx-auto flex items-center", children: [
2648
- brand2 ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: brand2 }) : null,
2649
- 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: [
2650
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
2651
- children
2652
- ] }) }) : /* @__PURE__ */ jsx("div", { className: "flex-1" }),
2653
- actions ? /* @__PURE__ */ jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
2654
- ] })
2660
+ children: /* @__PURE__ */ jsxs(
2661
+ "div",
2662
+ {
2663
+ className: cn(
2664
+ "max-w-wide px-step-md gap-step-lg mx-auto flex items-center",
2665
+ size2 === "compact" ? "h-nav-compact" : "h-nav"
2666
+ ),
2667
+ children: [
2668
+ brand2 ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: brand2 }) : null,
2669
+ 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: [
2670
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
2671
+ children
2672
+ ] }) }) : /* @__PURE__ */ jsx("div", { className: "flex-1" }),
2673
+ actions ? /* @__PURE__ */ jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
2674
+ ]
2675
+ }
2676
+ )
2655
2677
  }
2656
2678
  );
2657
2679
  }
@@ -2663,7 +2685,7 @@ function NavItem({ active = false, asChild = false, className, children, ...prop
2663
2685
  "aria-current": active ? "page" : void 0,
2664
2686
  className: cn(
2665
2687
  "font-mono text-meta transition-standard cursor-pointer",
2666
- "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2688
+ "rounded-chip focus-ring",
2667
2689
  active ? "text-accent underline decoration-1 underline-offset-4" : "text-text-secondary hover:text-accent",
2668
2690
  className
2669
2691
  ),
@@ -2682,14 +2704,14 @@ function NewsletterForm({
2682
2704
  description,
2683
2705
  state = "idle",
2684
2706
  onSubmitEmail,
2685
- successMessage = "Ya est\xE1s dentro. Te llega un email cada dos semanas, y nada m\xE1s.",
2686
- errorMessage = "No se pudo suscribir ese email. Rev\xEDsalo y vuelve a intentar.",
2707
+ successMessage = "Ya est\xE1s dentro. Te llega un correo cada dos semanas, y nada m\xE1s.",
2708
+ errorMessage = "No se pudo suscribir ese correo. Rev\xEDsalo y vuelve a intentar.",
2687
2709
  disclaimer,
2688
2710
  expression,
2689
2711
  basePath,
2690
2712
  submitLabel = "Suscribirme",
2691
2713
  placeholder = "tu@email.dev",
2692
- fieldLabel = "Email electr\xF3nico",
2714
+ fieldLabel = "Correo electr\xF3nico",
2693
2715
  nameField = false,
2694
2716
  nameLabel = "Nombre",
2695
2717
  namePlaceholder = "C\xF3mo te llamas",
@@ -2885,23 +2907,27 @@ function ScrollingProgressBar({
2885
2907
  }
2886
2908
  );
2887
2909
  }
2910
+ var Collapsed = createContext(false);
2888
2911
  function SidebarItem({
2889
2912
  active = false,
2890
2913
  asChild = false,
2891
2914
  badge: badge2,
2915
+ icon,
2892
2916
  className,
2893
2917
  children,
2894
2918
  ...props
2895
2919
  }) {
2896
2920
  const Root17 = asChild ? Slot : "a";
2921
+ const collapsed = useContext(Collapsed);
2897
2922
  return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
2898
2923
  Root17,
2899
2924
  {
2900
2925
  "aria-current": active ? "page" : void 0,
2901
2926
  className: cn(
2902
2927
  "rounded-chip px-step-sm gap-step-xs flex cursor-pointer items-center py-1.5",
2928
+ collapsed && "justify-center",
2903
2929
  "font-mono text-meta transition-standard",
2904
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2930
+ "focus-ring",
2905
2931
  // The active item is `surfaceRaised` with primary ink, same as
2906
2932
  // `TabsTrigger`. NOT biolume: `tokens.ts` says so explicitly — light
2907
2933
  // accent passes over background and over surface, but over
@@ -2913,15 +2939,57 @@ function SidebarItem({
2913
2939
  ),
2914
2940
  ...props,
2915
2941
  children: [
2916
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: active ? "text-accent" : "text-text-muted", children: "\u25B8" }),
2917
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children }),
2918
- badge2 ? /* @__PURE__ */ jsx("span", { className: "text-text-muted shrink-0", children: badge2 }) : null
2942
+ icon ? (
2943
+ // A shade bigger than the 13px mono label, which is what keeps it
2944
+ // reading as a glyph rather than as a character in the word.
2945
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-body shrink-0", children: icon })
2946
+ ) : /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: active ? "text-accent" : "text-text-muted", children: "\u25B8" }),
2947
+ /* @__PURE__ */ jsx("span", { className: collapsed ? "sr-only" : "min-w-0 flex-1 truncate", children }),
2948
+ badge2 ? /* @__PURE__ */ jsx("span", { className: cn("text-text-muted", collapsed ? "sr-only" : "shrink-0"), children: badge2 }) : null
2919
2949
  ]
2920
2950
  }
2921
2951
  ) });
2922
2952
  }
2953
+ function SidebarGroup({ label, children, className, ...props }) {
2954
+ const id = useId();
2955
+ const collapsed = useContext(Collapsed);
2956
+ return /* @__PURE__ */ jsxs(
2957
+ "li",
2958
+ {
2959
+ className: cn(
2960
+ "mt-step-md first:mt-0",
2961
+ // In a rail the label has nowhere to go, so the block becomes a rule.
2962
+ // The label itself stays in the accessibility tree naming the list.
2963
+ collapsed && "border-hairline pt-step-md mt-step-sm border-t first:border-t-0",
2964
+ className
2965
+ ),
2966
+ ...props,
2967
+ children: [
2968
+ /* @__PURE__ */ jsx(
2969
+ Text,
2970
+ {
2971
+ variant: "meta",
2972
+ tone: "muted",
2973
+ as: "p",
2974
+ id,
2975
+ className: collapsed ? "sr-only" : "px-step-sm pb-step-xs",
2976
+ children: label
2977
+ }
2978
+ ),
2979
+ /* @__PURE__ */ jsx("ul", { "aria-labelledby": id, className: "gap-0.5 flex flex-col", children })
2980
+ ]
2981
+ }
2982
+ );
2983
+ }
2923
2984
  function SidebarNav({
2924
2985
  title,
2986
+ brand: brand2,
2987
+ mark,
2988
+ user,
2989
+ collapsed = false,
2990
+ onCollapsedChange,
2991
+ collapseLabel = "Plegar el panel",
2992
+ expandLabel = "Desplegar el panel",
2925
2993
  version,
2926
2994
  branch,
2927
2995
  children,
@@ -2929,26 +2997,85 @@ function SidebarNav({
2929
2997
  ...props
2930
2998
  }) {
2931
2999
  const footer = [version, branch].filter(Boolean);
2932
- return /* @__PURE__ */ jsxs(
3000
+ const top = collapsed ? mark : brand2;
3001
+ return /* @__PURE__ */ jsx(Collapsed.Provider, { value: collapsed, children: /* @__PURE__ */ jsxs(
2933
3002
  "nav",
2934
3003
  {
2935
3004
  "aria-label": typeof title === "string" ? title : "Administraci\xF3n",
2936
3005
  className: cn(
2937
3006
  "border-hairline bg-surface p-step-sm gap-step-sm flex h-full flex-col border-r",
3007
+ // The width is the component's only when it can collapse: the layout
3008
+ // beside it has to reserve one of the two, and it cannot know which.
3009
+ // It does NOT transition. The system's only transition animates colour
3010
+ // and border, and a rail that slides is the entrance animation this
3011
+ // library does not have — same call as the `Switch` knob, which changes
3012
+ // position without moving.
3013
+ onCollapsedChange && (collapsed ? "w-sidebar-rail" : "w-sidebar"),
2938
3014
  className
2939
3015
  ),
2940
3016
  ...props,
2941
3017
  children: [
2942
- title ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "px-step-sm", children: title }) : null,
3018
+ top || onCollapsedChange ? /* @__PURE__ */ jsxs(
3019
+ "div",
3020
+ {
3021
+ className: cn(
3022
+ "border-hairline px-step-sm pb-step-sm mb-step-xs gap-step-xs flex items-center border-b",
3023
+ collapsed ? "justify-center" : "justify-between"
3024
+ ),
3025
+ children: [
3026
+ top ? /* @__PURE__ */ jsx("span", { className: "min-w-0", children: top }) : null,
3027
+ onCollapsedChange ? /* @__PURE__ */ jsx(
3028
+ "button",
3029
+ {
3030
+ type: "button",
3031
+ onClick: () => onCollapsedChange(!collapsed),
3032
+ "aria-expanded": !collapsed,
3033
+ "aria-label": collapsed ? expandLabel : collapseLabel,
3034
+ className: cn(
3035
+ "rounded-chip transition-standard shrink-0 cursor-pointer p-1",
3036
+ "text-text-muted hover:text-text-primary hover:bg-surface-raised",
3037
+ "focus-ring"
3038
+ ),
3039
+ children: collapsed ? /* @__PURE__ */ jsx(ChevronRight, {}) : /* @__PURE__ */ jsx(ChevronLeft, {})
3040
+ }
3041
+ ) : null
3042
+ ]
3043
+ }
3044
+ ) : null,
3045
+ title && !collapsed ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "px-step-sm", children: title }) : null,
2943
3046
  /* @__PURE__ */ jsx("ul", { className: "gap-0.5 flex flex-1 flex-col", children }),
2944
- footer.length > 0 ? /* @__PURE__ */ jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "border-hairline px-step-sm pt-step-sm border-t", children: footer.map((p, i) => /* @__PURE__ */ jsxs("span", { children: [
2945
- i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }) : null,
2946
- p
2947
- ] }, i)) }) : null
3047
+ user ? /* @__PURE__ */ jsx(
3048
+ "div",
3049
+ {
3050
+ className: cn(
3051
+ "border-hairline px-step-sm pt-step-sm border-t",
3052
+ collapsed && "flex justify-center"
3053
+ ),
3054
+ children: user
3055
+ }
3056
+ ) : null,
3057
+ footer.length > 0 && !collapsed ? /* @__PURE__ */ jsx(
3058
+ Text,
3059
+ {
3060
+ variant: "meta",
3061
+ tone: "muted",
3062
+ as: "p",
3063
+ className: cn("px-step-sm", user ? "" : "border-hairline pt-step-sm border-t"),
3064
+ children: footer.map((p, i) => /* @__PURE__ */ jsxs("span", { children: [
3065
+ i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }) : null,
3066
+ p
3067
+ ] }, i))
3068
+ }
3069
+ ) : null
2948
3070
  ]
2949
3071
  }
2950
- );
3072
+ ) });
2951
3073
  }
3074
+ var DELTA = {
3075
+ up: { glyph: ChevronUp, label: "sube" },
3076
+ down: { glyph: ChevronDown, label: "baja" },
3077
+ flat: { glyph: Minus, label: "sin cambio" }
3078
+ };
2952
3079
  function Stat({
2953
3080
  value,
2954
3081
  label,
@@ -2956,30 +3083,52 @@ function Stat({
2956
3083
  progress,
2957
3084
  icon,
2958
3085
  description,
3086
+ delta,
3087
+ spark,
2959
3088
  className,
2960
3089
  ...props
2961
3090
  }) {
3091
+ const DeltaGlyph = delta ? DELTA[delta.direction].glyph : null;
2962
3092
  return /* @__PURE__ */ jsxs("div", { className: cn(CARD_SURFACE, "p-step-lg gap-step-xs flex flex-col", className), ...props, children: [
2963
- /* @__PURE__ */ jsxs(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: [
3093
+ /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-start justify-between", children: [
3094
+ /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "min-w-0", children: label }),
2964
3095
  icon ? (
2965
3096
  // `aria-hidden` is not needed: the system's glyphs already carry it.
2966
- // What IS needed is that it does not shrink next to a long title,
2967
- // because a squashed icon reads as a different icon.
2968
- /* @__PURE__ */ jsx("span", { className: "shrink-0", children: icon })
2969
- ) : null,
2970
- label
3097
+ // The circle is a SURFACE — the tint at 10 %, same as an alert's — and
3098
+ // the colour stays on the glyph, which is § 4b and also what keeps it
3099
+ // on the 3:1 graphical threshold instead of text's 4.5.
3100
+ /* @__PURE__ */ jsx(
3101
+ "span",
3102
+ {
3103
+ className: cn(
3104
+ "size-control-icon-sm text-ui flex shrink-0 items-center justify-center rounded-full",
3105
+ tone === "neutral" ? "bg-accent/10 text-accent" : "bg-warm/10 text-warm"
3106
+ ),
3107
+ children: icon
3108
+ }
3109
+ )
3110
+ ) : null
2971
3111
  ] }),
2972
- /* @__PURE__ */ jsx(Text, { variant: "stat", as: "p", tone: tone === "alerta" ? "warm" : "accent", children: value }),
3112
+ /* @__PURE__ */ jsx(Text, { variant: "stat", as: "p", tone: tone === "neutral" ? "primary" : "warm", children: value }),
3113
+ delta && DeltaGlyph ? /* @__PURE__ */ jsxs(Text, { variant: "label", tone: "secondary", as: "p", className: "gap-step-xs flex items-center", children: [
3114
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
3115
+ DELTA[delta.direction].label,
3116
+ " "
3117
+ ] }),
3118
+ /* @__PURE__ */ jsx(DeltaGlyph, { className: "shrink-0" }),
3119
+ delta.value
3120
+ ] }) : null,
2973
3121
  description ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
2974
3122
  typeof progress === "number" ? /* @__PURE__ */ jsx(
2975
3123
  Progress,
2976
3124
  {
2977
3125
  value: progress,
2978
- tone: tone === "alerta" ? "warm" : "accent",
3126
+ tone: tone === "neutral" ? "accent" : "warm",
2979
3127
  label: `${label}: ${progress}%`,
2980
3128
  className: "mt-step-sm"
2981
3129
  }
2982
- ) : null
3130
+ ) : null,
3131
+ spark ? /* @__PURE__ */ jsx("div", { className: "mt-auto pt-step-md", children: spark }) : null
2983
3132
  ] });
2984
3133
  }
2985
3134
  function TalkCard({
@@ -3041,7 +3190,7 @@ function TalkCard({
3041
3190
  return /* @__PURE__ */ jsx(CardShell, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsx("article", { className: "gap-step-sm flex h-full flex-col", children: body }) });
3042
3191
  }
3043
3192
  function ThemeToggle({
3044
- label = "Cambiar de theme",
3193
+ label = "Cambiar de tema",
3045
3194
  onThemeChange,
3046
3195
  variant = "secondary",
3047
3196
  size: size2 = "icon",
@@ -3085,7 +3234,7 @@ function TableOfContents({
3085
3234
  const classes = cn(
3086
3235
  "px-step-sm -ml-px block border-l",
3087
3236
  "font-sans text-label transition-standard",
3088
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
3237
+ "focus-ring",
3089
3238
  "cursor-pointer",
3090
3239
  item2.nested && "pl-step-lg",
3091
3240
  "border-transparent text-text-secondary hover:text-text-primary",
@@ -3099,70 +3248,4 @@ function TableOfContents({
3099
3248
  ] });
3100
3249
  }
3101
3250
 
3102
- // src/lib/social.tsx
3103
- var social_exports = {};
3104
- __export(social_exports, {
3105
- Discord: () => Discord,
3106
- Email: () => Email,
3107
- GitHub: () => GitHub,
3108
- Instagram: () => Instagram,
3109
- LinkedIn: () => LinkedIn,
3110
- Newsletter: () => Newsletter,
3111
- Rss: () => Rss,
3112
- X: () => X,
3113
- YouTube: () => YouTube
3114
- });
3115
- function Brand({ children, ...props }) {
3116
- return /* @__PURE__ */ jsx(
3117
- "svg",
3118
- {
3119
- viewBox: "0 0 24 24",
3120
- width: "1em",
3121
- height: "1em",
3122
- fill: "currentColor",
3123
- "aria-hidden": "true",
3124
- focusable: "false",
3125
- ...props,
3126
- children
3127
- }
3128
- );
3129
- }
3130
- function Functional({ children, ...props }) {
3131
- return /* @__PURE__ */ jsx(
3132
- "svg",
3133
- {
3134
- viewBox: "0 0 24 24",
3135
- width: "1em",
3136
- height: "1em",
3137
- fill: "none",
3138
- stroke: "currentColor",
3139
- strokeWidth: 1.6,
3140
- strokeLinecap: "round",
3141
- strokeLinejoin: "round",
3142
- "aria-hidden": "true",
3143
- focusable: "false",
3144
- ...props,
3145
- children
3146
- }
3147
- );
3148
- }
3149
- var GitHub = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 .5C5.73.5.5 5.73.5 12a11.5 11.5 0 0 0 7.86 10.91c.58.1.79-.25.79-.55 0-.27-.01-1.18-.02-2.14-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.55-.29-5.24-1.28-5.24-5.69 0-1.26.45-2.29 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11 11 0 0 1 5.79 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.76.12 3.05.74.8 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.68.41.36.78 1.06.78 2.14 0 1.55-.01 2.79-.01 3.17 0 .3.2.66.79.55A11.5 11.5 0 0 0 23.5 12C23.5 5.73 18.27.5 12 .5Z" }) });
3150
- var LinkedIn = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9h4v12H3V9Zm7 0h3.8v1.71h.05a4.17 4.17 0 0 1 3.75-2.06c4.01 0 4.75 2.64 4.75 6.07V21h-4v-5.4c0-1.29-.02-2.95-1.8-2.95-1.8 0-2.08 1.4-2.08 2.85V21h-3.97V9Z" }) });
3151
- var X = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M17.53 3h3.06l-6.69 7.64L21.75 21h-6.16l-4.83-6.3L5.25 21H2.19l7.15-8.17L2.5 3h6.32l4.36 5.77L17.53 3Zm-1.07 16.17h1.7L7.62 4.74H5.8l10.66 14.43Z" }) });
3152
- var Instagram = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 2.16c3.2 0 3.58.01 4.85.07 1.17.05 1.8.25 2.23.41.56.22.96.48 1.38.9.42.42.68.82.9 1.38.16.42.36 1.06.41 2.23.06 1.27.07 1.65.07 4.85s-.01 3.58-.07 4.85c-.05 1.17-.25 1.8-.41 2.23-.22.56-.48.96-.9 1.38-.42.42-.82.68-1.38.9-.42.16-1.06.36-2.23.41-1.27.06-1.65.07-4.85.07s-3.58-.01-4.85-.07c-1.17-.05-1.8-.25-2.23-.41-.56-.22-.96-.48-1.38-.9-.42-.42-.68-.82-.9-1.38-.16-.42-.36-1.06-.41-2.23C2.17 15.58 2.16 15.2 2.16 12s.01-3.58.07-4.85c.05-1.17.25-1.8.41-2.23.22-.56.48-.96.9-1.38.42-.42.82-.68 1.38-.9.42-.16 1.06-.36 2.23-.41C8.42 2.17 8.8 2.16 12 2.16Zm0 3.68a6.16 6.16 0 1 0 0 12.32 6.16 6.16 0 0 0 0-12.32Zm0 10.16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Zm7.85-10.4a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0Z" }) });
3153
- var Discord = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M20.32 5.56A18.5 18.5 0 0 0 15.7 4.1a.07.07 0 0 0-.07.04c-.2.36-.42.82-.58 1.19a17 17 0 0 0-5.1 0c-.16-.38-.39-.83-.59-1.19a.07.07 0 0 0-.07-.04c-1.6.28-3.15.77-4.62 1.46a.06.06 0 0 0-.03.03C1.66 10 .9 14.28 1.28 18.5a.08.08 0 0 0 .03.05 18.6 18.6 0 0 0 5.6 2.84.07.07 0 0 0 .08-.03c.43-.59.81-1.21 1.14-1.86a.07.07 0 0 0-.04-.1c-.6-.23-1.18-.51-1.74-.83a.07.07 0 0 1-.01-.12l.35-.27a.07.07 0 0 1 .07-.01 13.3 13.3 0 0 0 11.3 0 .07.07 0 0 1 .08.01l.34.27c.04.04.04.1-.01.12-.55.33-1.13.6-1.74.83a.07.07 0 0 0-.04.1c.34.65.72 1.27 1.14 1.86a.07.07 0 0 0 .08.03 18.5 18.5 0 0 0 5.6-2.84.07.07 0 0 0 .04-.05c.45-4.88-.75-9.12-3.18-12.88a.06.06 0 0 0-.03-.03ZM8.4 15.93c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.9 2.25-2.02 2.25Zm7.22 0c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.89 2.25-2.02 2.25Z" }) });
3154
- var YouTube = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M23.5 6.9a3 3 0 0 0-2.12-2.12C19.5 4.27 12 4.27 12 4.27s-7.5 0-9.38.51A3 3 0 0 0 .5 6.9 31.3 31.3 0 0 0 0 12a31.3 31.3 0 0 0 .5 5.1 3 3 0 0 0 2.12 2.12c1.88.51 9.38.51 9.38.51s7.5 0 9.38-.51a3 3 0 0 0 2.12-2.12A31.3 31.3 0 0 0 24 12a31.3 31.3 0 0 0-.5-5.1ZM9.6 15.6V8.4l6.24 3.6-6.24 3.6Z" }) });
3155
- var Rss = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
3156
- /* @__PURE__ */ jsx("path", { d: "M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16" }),
3157
- /* @__PURE__ */ jsx("circle", { cx: "5", cy: "19", r: "1.6", fill: "currentColor", stroke: "none" })
3158
- ] });
3159
- var Email = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
3160
- /* @__PURE__ */ jsx("rect", { x: "2.75", y: "4.75", width: "18.5", height: "14.5", rx: "2" }),
3161
- /* @__PURE__ */ jsx("path", { d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" })
3162
- ] });
3163
- var Newsletter = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
3164
- /* @__PURE__ */ jsx("path", { d: "M18 8.5a6 6 0 1 0-12 0c0 5-2 6.5-2 6.5h16s-2-1.5-2-6.5" }),
3165
- /* @__PURE__ */ jsx("path", { d: "M13.7 19a2 2 0 0 1-3.4 0" })
3166
- ] });
3167
-
3168
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, ArticleCard, AudioPlayer, AuthorCard, Avatar, AvatarFallback, AvatarImage, AvatarUpload, Badge, Blockquote, Breadcrumb, Button, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, Checkbox, Code, CodeBlock, CourseCard, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EventCalendar, Footer, FooterLink, Hero, Input, LinkRow, MetricBadge, Nav, NavItem, NewsletterForm, PageHeader, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup2 as RadioGroup, RadioGroupItem, ScrollingProgressBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SidebarItem, SidebarNav, Skeleton, Stat, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TalkCard, Textarea, ThemeToggle, ToastAction, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, social_exports as social, toast2 as toast, useTheme };
3251
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, ArticleCard, AudioPlayer, AuthorCard, Avatar, AvatarFallback, AvatarImage, AvatarUpload, Badge, Blockquote, Breadcrumb, Button, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, Checkbox, Code, CodeBlock, CourseCard, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EventCalendar, Footer, FooterLink, Hero, Input, LinkRow, MetricBadge, Nav, NavItem, NewsletterForm, PageHeader, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup2 as RadioGroup, RadioGroupItem, ScrollingProgressBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SidebarGroup, SidebarItem, SidebarNav, Skeleton, Stat, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TalkCard, Textarea, ThemeToggle, ToastAction, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, toast2 as toast, useTheme };