@eduardoalvarez/arrecife 0.2.0 → 0.4.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
@@ -1,11 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var classVarianceAuthority = require('class-variance-authority');
3
+ var AccordionPrimitive = require('@radix-ui/react-accordion');
4
4
  var clsx = require('clsx');
5
5
  var tailwindMerge = require('tailwind-merge');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
- var AvatarPrimitive = require('@radix-ui/react-avatar');
7
+ var classVarianceAuthority = require('class-variance-authority');
8
+ var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
8
9
  var reactSlot = require('@radix-ui/react-slot');
10
+ var AvatarPrimitive = require('@radix-ui/react-avatar');
9
11
  var locale = require('date-fns/locale');
10
12
  var reactDayPicker = require('react-day-picker');
11
13
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
@@ -20,8 +22,8 @@ var SeparatorPrimitive = require('@radix-ui/react-separator');
20
22
  var SwitchPrimitive = require('@radix-ui/react-switch');
21
23
  var TabsPrimitive = require('@radix-ui/react-tabs');
22
24
  var ToastPrimitive = require('@radix-ui/react-toast');
23
- var TooltipPrimitive = require('@radix-ui/react-tooltip');
24
25
  var react = require('react');
26
+ var TooltipPrimitive = require('@radix-ui/react-tooltip');
25
27
 
26
28
  function _interopNamespace(e) {
27
29
  if (e && e.__esModule) return e;
@@ -41,6 +43,8 @@ function _interopNamespace(e) {
41
43
  return Object.freeze(n);
42
44
  }
43
45
 
46
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
47
+ var AlertDialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(AlertDialogPrimitive);
44
48
  var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
45
49
  var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
46
50
  var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
@@ -220,11 +224,11 @@ var control = {
220
224
  icon: 42
221
225
  };
222
226
  var spacing = {
223
- xs: 8,
224
- sm: 12,
225
- md: 16,
226
- lg: 26,
227
- xl: 40,
227
+ stepXs: 8,
228
+ stepSm: 12,
229
+ stepMd: 16,
230
+ stepLg: 26,
231
+ stepXl: 40,
228
232
  section: 96
229
233
  };
230
234
  var size = {
@@ -249,6 +253,10 @@ var sintaxis = {
249
253
  /** `markup.deleted`, `invalid`. */
250
254
  invalido: dark.error
251
255
  };
256
+ var series = {
257
+ dark: [dark.accent, dark.warm, brand.body, dark.textMuted],
258
+ light: [light.accent, light.warm, brand.body, light.textMuted]
259
+ };
252
260
  var profundo = "#0D2129";
253
261
  var gradient = {
254
262
  dark: {
@@ -299,15 +307,99 @@ var tokens = {
299
307
  size,
300
308
  gradient,
301
309
  sintaxis,
310
+ series,
302
311
  shadow,
303
312
  motion,
304
313
  tagline,
305
314
  naming
306
315
  };
316
+
317
+ // src/tema/index.ts
318
+ var TEMA_CLAVE = "arrecife-tema";
319
+ var TEMA_ATRIBUTO = "data-theme";
320
+ var TEMA_EVENTO = "arrecife:tema";
321
+ var esTema = (valor) => valor === "dark" || valor === "light";
322
+ function temaActual() {
323
+ if (typeof document === "undefined") return "dark";
324
+ const puesto = document.documentElement.getAttribute(TEMA_ATRIBUTO);
325
+ return esTema(puesto) ? puesto : "dark";
326
+ }
327
+ function temaGuardado() {
328
+ if (typeof localStorage === "undefined") return null;
329
+ try {
330
+ const valor = localStorage.getItem(TEMA_CLAVE);
331
+ return esTema(valor) ? valor : null;
332
+ } catch {
333
+ return null;
334
+ }
335
+ }
336
+ function temaPreferido() {
337
+ const guardado = temaGuardado();
338
+ if (guardado) return guardado;
339
+ if (typeof matchMedia === "undefined") return "dark";
340
+ return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
341
+ }
342
+ function aplicarTema(tema, persistir = true) {
343
+ if (typeof document === "undefined") return;
344
+ document.documentElement.setAttribute(TEMA_ATRIBUTO, tema);
345
+ document.documentElement.style.colorScheme = tema;
346
+ if (persistir) {
347
+ try {
348
+ localStorage.setItem(TEMA_CLAVE, tema);
349
+ } catch {
350
+ }
351
+ }
352
+ dispatchEvent(new CustomEvent(TEMA_EVENTO, { detail: tema }));
353
+ }
354
+ function alternarTema() {
355
+ const siguiente = temaActual() === "dark" ? "light" : "dark";
356
+ aplicarTema(siguiente);
357
+ return siguiente;
358
+ }
359
+ function escucharTema(alCambiar) {
360
+ if (typeof window === "undefined") return () => {
361
+ };
362
+ const propio = (evento) => {
363
+ const detalle = evento.detail;
364
+ if (esTema(detalle)) alCambiar(detalle);
365
+ };
366
+ const otraPestana = (evento) => {
367
+ if (evento.key !== TEMA_CLAVE) return;
368
+ const tema = esTema(evento.newValue) ? evento.newValue : temaPreferido();
369
+ aplicarTema(tema, false);
370
+ alCambiar(tema);
371
+ };
372
+ addEventListener(TEMA_EVENTO, propio);
373
+ addEventListener("storage", otraPestana);
374
+ return () => {
375
+ removeEventListener(TEMA_EVENTO, propio);
376
+ removeEventListener("storage", otraPestana);
377
+ };
378
+ }
379
+ var scriptTema = [
380
+ "(function () {",
381
+ " var CLAVE = " + JSON.stringify(TEMA_CLAVE) + ";",
382
+ " function resolver() {",
383
+ " try {",
384
+ " var guardado = localStorage.getItem(CLAVE);",
385
+ ' if (guardado === "dark" || guardado === "light") return guardado;',
386
+ " } catch (e) {}",
387
+ ' return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";',
388
+ " }",
389
+ " function aplicar() {",
390
+ " var tema = resolver();",
391
+ " document.documentElement.setAttribute(" + JSON.stringify(TEMA_ATRIBUTO) + ", tema);",
392
+ " document.documentElement.style.colorScheme = tema;",
393
+ " }",
394
+ " aplicar();",
395
+ ' document.addEventListener("astro:after-swap", aplicar);',
396
+ "})();"
397
+ ].join("\n");
398
+ var kebab = (nombre) => nombre.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
307
399
  var escalas = Object.keys(typeScale);
308
400
  var radios = Object.keys(radius);
309
- var espacios = Object.keys(spacing);
310
- var controles = Object.keys(control).map((nombre) => `control-${nombre}`);
401
+ var espacios = Object.keys(spacing).map(kebab);
402
+ var controles = Object.keys(control).map((nombre) => `control-${kebab(nombre)}`);
311
403
  var twMerge = tailwindMerge.extendTailwindMerge({
312
404
  extend: {
313
405
  classGroups: {
@@ -324,7 +416,165 @@ var twMerge = tailwindMerge.extendTailwindMerge({
324
416
  function cn(...inputs) {
325
417
  return twMerge(clsx.clsx(inputs));
326
418
  }
327
- var alert = classVarianceAuthority.cva("w-full rounded-card border p-md font-sans text-ui", {
419
+ function Glyph({ children, ...props }) {
420
+ return /* @__PURE__ */ jsxRuntime.jsx(
421
+ "svg",
422
+ {
423
+ viewBox: "0 0 16 16",
424
+ width: "1em",
425
+ height: "1em",
426
+ fill: "none",
427
+ stroke: "currentColor",
428
+ strokeWidth: 1.75,
429
+ strokeLinecap: "round",
430
+ strokeLinejoin: "round",
431
+ "aria-hidden": "true",
432
+ focusable: "false",
433
+ ...props,
434
+ children
435
+ }
436
+ );
437
+ }
438
+ var Check = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
439
+ var Minus = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.5 8h9" }) });
440
+ var ChevronDown = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6l4 4 4-4" }) });
441
+ var ChevronUp = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4-4 4 4" }) });
442
+ var ChevronLeft = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4L6 8l4 4" }) });
443
+ var ChevronRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4l4 4-4 4" }) });
444
+ var Close = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
445
+ var Copy = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
446
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
447
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
448
+ ] });
449
+ var ArrowUpRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
450
+ var Ellipsis = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
451
+ var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
452
+ "svg",
453
+ {
454
+ viewBox: "0 0 16 16",
455
+ width: "1em",
456
+ height: "1em",
457
+ fill: "none",
458
+ stroke: "currentColor",
459
+ strokeWidth: 2,
460
+ strokeLinecap: "round",
461
+ "aria-hidden": "true",
462
+ focusable: "false",
463
+ className: "motion-safe:animate-spin",
464
+ ...props,
465
+ children: [
466
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
467
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
468
+ ]
469
+ }
470
+ );
471
+ var Sol = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
472
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "3" }),
473
+ /* @__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" })
474
+ ] });
475
+ var Luna = (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" }) });
476
+ function GlifoMedia({ children, ...props }) {
477
+ return /* @__PURE__ */ jsxRuntime.jsx(
478
+ "svg",
479
+ {
480
+ xmlns: "http://www.w3.org/2000/svg",
481
+ viewBox: "0 0 24 24",
482
+ fill: "none",
483
+ "aria-hidden": "true",
484
+ focusable: "false",
485
+ ...props,
486
+ children
487
+ }
488
+ );
489
+ }
490
+ var Play = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
491
+ var Pause = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
492
+ var Retry = (props) => /* @__PURE__ */ jsxRuntime.jsx(
493
+ GlifoMedia,
494
+ {
495
+ stroke: "currentColor",
496
+ strokeWidth: 2,
497
+ strokeLinecap: "round",
498
+ strokeLinejoin: "round",
499
+ ...props,
500
+ 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" })
501
+ }
502
+ );
503
+ var GoBackSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
504
+ /* @__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" }),
505
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
506
+ /* @__PURE__ */ jsxRuntime.jsx(
507
+ "path",
508
+ {
509
+ 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",
510
+ strokeLinejoin: "round"
511
+ }
512
+ )
513
+ ] });
514
+ var AdvanceSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
515
+ /* @__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" }),
516
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
517
+ /* @__PURE__ */ jsxRuntime.jsx(
518
+ "path",
519
+ {
520
+ 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",
521
+ strokeLinejoin: "round"
522
+ }
523
+ )
524
+ ] });
525
+ var VolumeOn = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { 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" }) });
526
+ var VolumeMuted = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { 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" }) });
527
+ function Accordion({ className, ...props }) {
528
+ return /* @__PURE__ */ jsxRuntime.jsx(
529
+ AccordionPrimitive__namespace.Root,
530
+ {
531
+ className: cn("border-hairline w-full border-t", className),
532
+ ...props
533
+ }
534
+ );
535
+ }
536
+ function AccordionItem({
537
+ className,
538
+ ...props
539
+ }) {
540
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Item, { className: cn("border-hairline border-b", className), ...props });
541
+ }
542
+ function AccordionTrigger({
543
+ className,
544
+ children,
545
+ headingLevel = 3,
546
+ ...props
547
+ }) {
548
+ const Encabezado = `h${headingLevel}`;
549
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Encabezado, { children: /* @__PURE__ */ jsxRuntime.jsxs(
550
+ AccordionPrimitive__namespace.Trigger,
551
+ {
552
+ className: cn(
553
+ "gap-step-sm py-step-sm flex w-full cursor-pointer items-center justify-between text-left",
554
+ "font-sans text-lead font-medium text-text-primary",
555
+ "transition-standard",
556
+ "hover:text-accent",
557
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
558
+ "disabled:pointer-events-none disabled:opacity-50",
559
+ "[&[data-state=open]>svg]:rotate-180",
560
+ className
561
+ ),
562
+ ...props,
563
+ children: [
564
+ children,
565
+ /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, { className: "text-text-muted shrink-0" })
566
+ ]
567
+ }
568
+ ) }) });
569
+ }
570
+ function AccordionContent({
571
+ className,
572
+ children,
573
+ ...props
574
+ }) {
575
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Content, { className: "overflow-hidden", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pb-step-md font-sans text-ui text-text-secondary max-w-measure", className), children }) });
576
+ }
577
+ var alert = classVarianceAuthority.cva("w-full rounded-card border p-step-md font-sans text-ui", {
328
578
  variants: {
329
579
  variant: {
330
580
  accent: "text-text-secondary",
@@ -377,7 +627,7 @@ function Alert({
377
627
  role: tono === "error" ? "alert" : "status",
378
628
  className: cn(alert({ variant, enfasis }), className),
379
629
  ...props,
380
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm flex items-start", children: [
630
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex items-start", children: [
381
631
  /* @__PURE__ */ jsxRuntime.jsx(
382
632
  "span",
383
633
  {
@@ -387,13 +637,183 @@ function Alert({
387
637
  }
388
638
  ),
389
639
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
390
- title ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-xs text-text-primary font-medium", children: title }) : null,
640
+ title ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-step-xs text-text-primary font-medium", children: title }) : null,
391
641
  children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-measure", children }) : null
392
642
  ] })
393
643
  ] })
394
644
  }
395
645
  );
396
646
  }
647
+ var button = classVarianceAuthority.cva(
648
+ [
649
+ "inline-flex cursor-pointer items-center justify-center gap-step-xs whitespace-nowrap select-none",
650
+ "rounded-control font-sans font-medium",
651
+ "transition-standard",
652
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
653
+ "disabled:pointer-events-none disabled:opacity-50",
654
+ "[&_svg]:shrink-0"
655
+ ],
656
+ {
657
+ variants: {
658
+ variant: {
659
+ primary: [
660
+ "bg-accent text-accent-on hover:bg-accent-hover",
661
+ "light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
662
+ ],
663
+ conversion: "bg-warm text-warm-on hover:bg-warm-hover",
664
+ secondary: [
665
+ "border-hairline-hover border bg-transparent text-text-primary",
666
+ "hover:border-accent hover:text-accent"
667
+ ],
668
+ tertiary: [
669
+ "bg-transparent font-mono font-normal text-text-secondary",
670
+ "hover:text-accent hover:underline hover:underline-offset-4"
671
+ ]
672
+ },
673
+ size: {
674
+ sm: "h-8 px-control-sm text-label",
675
+ md: "h-10 px-control-md text-ui",
676
+ lg: "h-12 px-control-lg text-lead",
677
+ /** Cuadrado 42×42, sin texto. Lleva `aria-label` obligatorio. */
678
+ icon: "size-control-icon p-0"
679
+ }
680
+ },
681
+ compoundVariants: [
682
+ /**
683
+ * El terciario no tiene caja: ni padding horizontal ni alto de control.
684
+ * Va aquí y no como `px-0` en la variante para que gane al `px-*` del
685
+ * tamaño sin depender del orden en que cva concatena las clases.
686
+ */
687
+ { variant: "tertiary", size: ["sm", "md", "lg"], class: "h-auto px-0" }
688
+ ],
689
+ defaultVariants: { variant: "primary", size: "md" }
690
+ }
691
+ );
692
+ function Button({
693
+ className,
694
+ variant,
695
+ size: size2,
696
+ asChild = false,
697
+ loading = false,
698
+ icon,
699
+ children,
700
+ disabled,
701
+ ...props
702
+ }) {
703
+ if (asChild) {
704
+ return /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
705
+ }
706
+ return /* @__PURE__ */ jsxRuntime.jsxs(
707
+ "button",
708
+ {
709
+ className: cn(button({ variant, size: size2 }), className),
710
+ disabled: disabled === true || loading,
711
+ "aria-busy": loading || void 0,
712
+ ...props,
713
+ children: [
714
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : icon,
715
+ children
716
+ ]
717
+ }
718
+ );
719
+ }
720
+ var AlertDialog = AlertDialogPrimitive__namespace.Root;
721
+ var AlertDialogTrigger = AlertDialogPrimitive__namespace.Trigger;
722
+ function AlertDialogOverlay({
723
+ className,
724
+ ...props
725
+ }) {
726
+ return /* @__PURE__ */ jsxRuntime.jsx(
727
+ AlertDialogPrimitive__namespace.Overlay,
728
+ {
729
+ className: cn("bg-brand-hull/70 fixed inset-0 z-50", className),
730
+ ...props
731
+ }
732
+ );
733
+ }
734
+ function AlertDialogContent({
735
+ className,
736
+ children,
737
+ ...props
738
+ }) {
739
+ return /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogPrimitive__namespace.Portal, { children: [
740
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogOverlay, {}),
741
+ /* @__PURE__ */ jsxRuntime.jsx(
742
+ AlertDialogPrimitive__namespace.Content,
743
+ {
744
+ className: cn(
745
+ "fixed top-1/2 left-1/2 z-50 w-full max-w-content -translate-x-1/2 -translate-y-1/2",
746
+ "gap-step-md p-step-lg flex flex-col",
747
+ "rounded-panel border-border bg-surface shadow-standard border",
748
+ "text-text-primary font-sans",
749
+ className
750
+ ),
751
+ ...props,
752
+ children
753
+ }
754
+ )
755
+ ] });
756
+ }
757
+ function AlertDialogHeader({ className, ...props }) {
758
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-step-xs flex flex-col", className), ...props });
759
+ }
760
+ function AlertDialogFooter({ className, ...props }) {
761
+ return /* @__PURE__ */ jsxRuntime.jsx(
762
+ "div",
763
+ {
764
+ className: cn("gap-step-sm flex flex-col-reverse sm:flex-row sm:justify-end", className),
765
+ ...props
766
+ }
767
+ );
768
+ }
769
+ function AlertDialogTitle({
770
+ className,
771
+ ...props
772
+ }) {
773
+ return /* @__PURE__ */ jsxRuntime.jsx(
774
+ AlertDialogPrimitive__namespace.Title,
775
+ {
776
+ className: cn("text-h3 font-display text-text-primary", className),
777
+ ...props
778
+ }
779
+ );
780
+ }
781
+ function AlertDialogDescription({
782
+ className,
783
+ ...props
784
+ }) {
785
+ return /* @__PURE__ */ jsxRuntime.jsx(
786
+ AlertDialogPrimitive__namespace.Description,
787
+ {
788
+ className: cn("text-ui text-text-secondary max-w-measure", className),
789
+ ...props
790
+ }
791
+ );
792
+ }
793
+ function AlertDialogCancel({
794
+ className,
795
+ ...props
796
+ }) {
797
+ return /* @__PURE__ */ jsxRuntime.jsx(
798
+ AlertDialogPrimitive__namespace.Cancel,
799
+ {
800
+ className: cn(button({ variant: "secondary" }), className),
801
+ ...props
802
+ }
803
+ );
804
+ }
805
+ function AlertDialogAction({
806
+ className,
807
+ ...props
808
+ }) {
809
+ return /* @__PURE__ */ jsxRuntime.jsx(
810
+ AlertDialogPrimitive__namespace.Action,
811
+ {
812
+ className: cn(button({ variant: "primary" }), className),
813
+ ...props
814
+ }
815
+ );
816
+ }
397
817
  var avatar = classVarianceAuthority.cva(
398
818
  "relative flex shrink-0 overflow-hidden rounded-pill bg-surface-raised border border-hairline",
399
819
  {
@@ -433,7 +853,7 @@ function AvatarFallback({
433
853
  );
434
854
  }
435
855
  var badge = classVarianceAuthority.cva(
436
- ["inline-flex items-center gap-xs", "rounded-chip px-xs py-0.5", "font-sans text-tag", "transition-standard"],
856
+ ["inline-flex items-center gap-step-xs", "rounded-chip px-step-xs py-0.5", "font-sans text-tag", "transition-standard"],
437
857
  {
438
858
  variants: {
439
859
  variant: {
@@ -453,8 +873,8 @@ function Badge({ className, variant, ...props }) {
453
873
  }
454
874
  var categoria = classVarianceAuthority.cva(
455
875
  [
456
- "inline-flex items-center gap-xs",
457
- "rounded-pill px-sm py-0.5",
876
+ "inline-flex items-center gap-step-xs",
877
+ "rounded-pill px-step-sm py-0.5",
458
878
  "font-mono text-chip",
459
879
  "border transition-standard"
460
880
  ],
@@ -478,192 +898,16 @@ function CategoryBadge({ className, active = false, ...props }) {
478
898
  }
479
899
  );
480
900
  }
481
- var metrica = ["inline-flex items-center gap-xs", "rounded-pill", "font-mono text-chip text-text-muted"];
901
+ var metrica = ["inline-flex items-center gap-step-xs", "rounded-pill", "font-mono text-chip text-text-muted"];
482
902
  function MetricBadge({ className, boxed = false, ...props }) {
483
903
  return /* @__PURE__ */ jsxRuntime.jsx(
484
904
  "span",
485
905
  {
486
- className: cn(metrica, boxed && "border-hairline px-sm py-0.5 border", className),
906
+ className: cn(metrica, boxed && "border-hairline px-step-sm py-0.5 border", className),
487
907
  ...props
488
908
  }
489
909
  );
490
910
  }
491
- function Glyph({ children, ...props }) {
492
- return /* @__PURE__ */ jsxRuntime.jsx(
493
- "svg",
494
- {
495
- viewBox: "0 0 16 16",
496
- width: "1em",
497
- height: "1em",
498
- fill: "none",
499
- stroke: "currentColor",
500
- strokeWidth: 1.75,
501
- strokeLinecap: "round",
502
- strokeLinejoin: "round",
503
- "aria-hidden": "true",
504
- focusable: "false",
505
- ...props,
506
- children
507
- }
508
- );
509
- }
510
- var Check = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
511
- var Minus = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.5 8h9" }) });
512
- var ChevronDown = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6l4 4 4-4" }) });
513
- var ChevronUp = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4-4 4 4" }) });
514
- var ChevronLeft = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4L6 8l4 4" }) });
515
- var ChevronRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4l4 4-4 4" }) });
516
- var Close = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
517
- var Copy = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
518
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
519
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
520
- ] });
521
- var ArrowUpRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
522
- var Ellipsis = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
523
- var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
524
- "svg",
525
- {
526
- viewBox: "0 0 16 16",
527
- width: "1em",
528
- height: "1em",
529
- fill: "none",
530
- stroke: "currentColor",
531
- strokeWidth: 2,
532
- strokeLinecap: "round",
533
- "aria-hidden": "true",
534
- focusable: "false",
535
- className: "motion-safe:animate-spin",
536
- ...props,
537
- children: [
538
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
539
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
540
- ]
541
- }
542
- );
543
- function GlifoMedia({ children, ...props }) {
544
- return /* @__PURE__ */ jsxRuntime.jsx(
545
- "svg",
546
- {
547
- xmlns: "http://www.w3.org/2000/svg",
548
- viewBox: "0 0 24 24",
549
- fill: "none",
550
- "aria-hidden": "true",
551
- focusable: "false",
552
- ...props,
553
- children
554
- }
555
- );
556
- }
557
- var Play = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
558
- var Pause = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
559
- var Retry = (props) => /* @__PURE__ */ jsxRuntime.jsx(
560
- GlifoMedia,
561
- {
562
- stroke: "currentColor",
563
- strokeWidth: 2,
564
- strokeLinecap: "round",
565
- strokeLinejoin: "round",
566
- ...props,
567
- 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" })
568
- }
569
- );
570
- var GoBackSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
571
- /* @__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" }),
572
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
573
- /* @__PURE__ */ jsxRuntime.jsx(
574
- "path",
575
- {
576
- 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",
577
- strokeLinejoin: "round"
578
- }
579
- )
580
- ] });
581
- var AdvanceSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
582
- /* @__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" }),
583
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
584
- /* @__PURE__ */ jsxRuntime.jsx(
585
- "path",
586
- {
587
- 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",
588
- strokeLinejoin: "round"
589
- }
590
- )
591
- ] });
592
- var VolumeOn = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { 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" }) });
593
- var VolumeMuted = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { 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" }) });
594
- var button = classVarianceAuthority.cva(
595
- [
596
- "inline-flex cursor-pointer items-center justify-center gap-xs whitespace-nowrap select-none",
597
- "rounded-control font-sans font-medium",
598
- "transition-standard",
599
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
600
- "disabled:pointer-events-none disabled:opacity-50",
601
- "[&_svg]:shrink-0"
602
- ],
603
- {
604
- variants: {
605
- variant: {
606
- primary: [
607
- "bg-accent text-accent-on hover:bg-accent-hover",
608
- "light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
609
- ],
610
- conversion: "bg-warm text-warm-on hover:bg-warm-hover",
611
- secondary: [
612
- "border-hairline-hover border bg-transparent text-text-primary",
613
- "hover:border-accent hover:text-accent"
614
- ],
615
- tertiary: [
616
- "bg-transparent font-mono font-normal text-text-secondary",
617
- "hover:text-accent hover:underline hover:underline-offset-4"
618
- ]
619
- },
620
- size: {
621
- sm: "h-8 px-control-sm text-label",
622
- md: "h-10 px-control-md text-ui",
623
- lg: "h-12 px-control-lg text-lead",
624
- /** Cuadrado 42×42, sin texto. Lleva `aria-label` obligatorio. */
625
- icon: "size-control-icon p-0"
626
- }
627
- },
628
- compoundVariants: [
629
- /**
630
- * El terciario no tiene caja: ni padding horizontal ni alto de control.
631
- * Va aquí y no como `px-0` en la variante para que gane al `px-*` del
632
- * tamaño sin depender del orden en que cva concatena las clases.
633
- */
634
- { variant: "tertiary", size: ["sm", "md", "lg"], class: "h-auto px-0" }
635
- ],
636
- defaultVariants: { variant: "primary", size: "md" }
637
- }
638
- );
639
- function Button({
640
- className,
641
- variant,
642
- size: size2,
643
- asChild = false,
644
- loading = false,
645
- icon,
646
- children,
647
- disabled,
648
- ...props
649
- }) {
650
- if (asChild) {
651
- return /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
652
- }
653
- return /* @__PURE__ */ jsxRuntime.jsxs(
654
- "button",
655
- {
656
- className: cn(button({ variant, size: size2 }), className),
657
- disabled: disabled === true || loading,
658
- "aria-busy": loading || void 0,
659
- ...props,
660
- children: [
661
- loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : icon,
662
- children
663
- ]
664
- }
665
- );
666
- }
667
911
  function Calendar({
668
912
  className,
669
913
  classNames,
@@ -702,8 +946,8 @@ function Calendar({
702
946
  // la raíz, y sin esto se ancla al primer ancestro posicionado —o al
703
947
  // viewport— y las flechas acaban en los bordes de la página.
704
948
  root: cn("relative", fullWidth ? "w-full" : "w-fit"),
705
- months: cn("gap-md flex flex-col sm:flex-row", fullWidth && "w-full"),
706
- month: cn("gap-sm flex flex-col", fullWidth && "min-w-0 flex-1"),
949
+ months: cn("gap-step-md flex flex-col sm:flex-row", fullWidth && "w-full"),
950
+ month: cn("gap-step-sm flex flex-col", fullWidth && "min-w-0 flex-1"),
707
951
  month_caption: "h-8 flex items-center justify-center",
708
952
  caption_label: "text-ui font-sans font-medium text-text-primary capitalize",
709
953
  nav: "absolute inset-x-0 top-0 flex items-center justify-between",
@@ -731,7 +975,7 @@ function Calendar({
731
975
  range_start: "[&_button]:bg-accent [&_button]:text-accent-on [&_button]:rounded-r-none",
732
976
  range_middle: "[&_button]:bg-surface-raised [&_button]:text-text-primary [&_button]:rounded-none",
733
977
  range_end: "[&_button]:bg-accent [&_button]:text-accent-on [&_button]:rounded-l-none",
734
- footer: "text-label font-sans text-text-secondary pt-sm",
978
+ footer: "text-label font-sans text-text-secondary pt-step-sm",
735
979
  ...classNames
736
980
  },
737
981
  components: {
@@ -821,7 +1065,7 @@ function Card({ className, ...props }) {
821
1065
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(SUPERFICIE_TARJETA, className), ...props });
822
1066
  }
823
1067
  function CardHeader({ className, ...props }) {
824
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-xs p-lg flex flex-col", className), ...props });
1068
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-step-xs p-step-lg flex flex-col", className), ...props });
825
1069
  }
826
1070
  function CardTitle({ className, ...props }) {
827
1071
  return /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className, ...props });
@@ -830,13 +1074,13 @@ function CardDescription({ className, ...props }) {
830
1074
  return /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className, ...props });
831
1075
  }
832
1076
  function CardContent({ className, ...props }) {
833
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("px-lg pb-lg", className), ...props });
1077
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("px-step-lg pb-step-lg", className), ...props });
834
1078
  }
835
1079
  function CardFooter({ className, ...props }) {
836
1080
  return /* @__PURE__ */ jsxRuntime.jsx(
837
1081
  "div",
838
1082
  {
839
- className: cn("border-hairline px-lg py-md gap-sm flex items-center border-t", className),
1083
+ className: cn("border-hairline px-step-lg py-step-md gap-step-sm flex items-center border-t", className),
840
1084
  ...props
841
1085
  }
842
1086
  );
@@ -887,7 +1131,7 @@ function DateField({
887
1131
  "data-invalid": invalid || void 0,
888
1132
  "aria-invalid": invalid || void 0,
889
1133
  className: cn(
890
- "px-sm h-10 w-full",
1134
+ "px-step-sm h-10 w-full",
891
1135
  "rounded-control border-border bg-surface border",
892
1136
  "font-mono text-ui text-text-primary",
893
1137
  "transition-standard",
@@ -930,7 +1174,7 @@ function DialogContent({
930
1174
  {
931
1175
  className: cn(
932
1176
  "fixed top-1/2 left-1/2 z-50 w-full max-w-content -translate-x-1/2 -translate-y-1/2",
933
- "gap-md p-lg flex flex-col",
1177
+ "gap-step-md p-step-lg flex flex-col",
934
1178
  "rounded-panel border-border bg-surface shadow-standard border",
935
1179
  "text-text-primary font-sans",
936
1180
  className
@@ -957,10 +1201,10 @@ function DialogContent({
957
1201
  ] });
958
1202
  }
959
1203
  function DialogHeader({ className, ...props }) {
960
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-xs flex flex-col pr-8", className), ...props });
1204
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-step-xs flex flex-col pr-8", className), ...props });
961
1205
  }
962
1206
  function DialogFooter({ className, ...props }) {
963
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-sm flex flex-col-reverse sm:flex-row sm:justify-end", className), ...props });
1207
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-step-sm flex flex-col-reverse sm:flex-row sm:justify-end", className), ...props });
964
1208
  }
965
1209
  function DialogTitle({
966
1210
  className,
@@ -997,7 +1241,7 @@ var panel = [
997
1241
  "text-text-primary font-sans"
998
1242
  ];
999
1243
  var item = [
1000
- "rounded-chip px-sm relative flex h-9 cursor-default items-center gap-2 select-none",
1244
+ "rounded-chip px-step-sm relative flex h-9 cursor-default items-center gap-2 select-none",
1001
1245
  "text-ui text-text-secondary transition-standard",
1002
1246
  "data-[highlighted]:bg-surface data-[highlighted]:text-text-primary",
1003
1247
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
@@ -1049,7 +1293,7 @@ function DropdownMenuLabel({
1049
1293
  return /* @__PURE__ */ jsxRuntime.jsx(
1050
1294
  DropdownMenuPrimitive__namespace.Label,
1051
1295
  {
1052
- className: cn("px-sm text-eyebrow font-mono text-text-secondary py-1.5 uppercase", className),
1296
+ className: cn("px-step-sm text-eyebrow font-mono text-text-secondary py-1.5 uppercase", className),
1053
1297
  ...props
1054
1298
  }
1055
1299
  );
@@ -1090,7 +1334,7 @@ function Input({ className, invalid = false, ...props }) {
1090
1334
  "data-invalid": invalid || void 0,
1091
1335
  "aria-invalid": invalid || void 0,
1092
1336
  className: cn(
1093
- "h-10 w-full px-sm",
1337
+ "h-10 w-full px-step-sm",
1094
1338
  "rounded-control border border-border bg-surface",
1095
1339
  "font-sans text-ui text-text-primary placeholder:text-text-muted",
1096
1340
  "transition-standard",
@@ -1098,7 +1342,7 @@ function Input({ className, invalid = false, ...props }) {
1098
1342
  "focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
1099
1343
  "disabled:pointer-events-none disabled:opacity-50",
1100
1344
  "data-[invalid]:border-error data-[invalid]:focus-visible:outline-error",
1101
- "file:mr-sm file:border-0 file:bg-transparent file:font-sans file:text-label file:text-text-secondary",
1345
+ "file:mr-step-sm file:border-0 file:bg-transparent file:font-sans file:text-label file:text-text-secondary",
1102
1346
  className
1103
1347
  ),
1104
1348
  ...props
@@ -1130,7 +1374,7 @@ function Pagination({ className, ...props }) {
1130
1374
  );
1131
1375
  }
1132
1376
  function PaginationContent({ className, ...props }) {
1133
- return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("gap-xs flex flex-row items-center", className), ...props });
1377
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("gap-step-xs flex flex-row items-center", className), ...props });
1134
1378
  }
1135
1379
  function PaginationItem(props) {
1136
1380
  return /* @__PURE__ */ jsxRuntime.jsx("li", { ...props });
@@ -1141,7 +1385,7 @@ function PaginationLink({ className, isActive = false, ...props }) {
1141
1385
  {
1142
1386
  "aria-current": isActive ? "page" : void 0,
1143
1387
  className: cn(
1144
- "rounded-chip px-sm inline-flex h-9 min-w-9 cursor-pointer items-center justify-center",
1388
+ "rounded-chip px-step-sm inline-flex h-9 min-w-9 cursor-pointer items-center justify-center",
1145
1389
  "font-sans text-ui text-text-secondary",
1146
1390
  "transition-standard",
1147
1391
  "hover:bg-surface hover:text-text-primary",
@@ -1154,13 +1398,13 @@ function PaginationLink({ className, isActive = false, ...props }) {
1154
1398
  );
1155
1399
  }
1156
1400
  function PaginationPrevious({ className, ...props }) {
1157
- return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina anterior", className: cn("gap-xs", className), ...props, children: [
1401
+ return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina anterior", className: cn("gap-step-xs", className), ...props, children: [
1158
1402
  /* @__PURE__ */ jsxRuntime.jsx(ChevronLeft, {}),
1159
1403
  "Anterior"
1160
1404
  ] });
1161
1405
  }
1162
1406
  function PaginationNext({ className, ...props }) {
1163
- return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina siguiente", className: cn("gap-xs", className), ...props, children: [
1407
+ return /* @__PURE__ */ jsxRuntime.jsxs(PaginationLink, { "aria-label": "P\xE1gina siguiente", className: cn("gap-step-xs", className), ...props, children: [
1164
1408
  "Siguiente",
1165
1409
  /* @__PURE__ */ jsxRuntime.jsx(ChevronRight, {})
1166
1410
  ] });
@@ -1191,7 +1435,7 @@ function PopoverContent({
1191
1435
  align,
1192
1436
  sideOffset,
1193
1437
  className: cn(
1194
- "z-50 w-72 p-md",
1438
+ "z-50 w-72 p-step-md",
1195
1439
  "rounded-panel border-border bg-surface-raised shadow-standard border",
1196
1440
  "text-text-primary font-sans text-ui",
1197
1441
  "outline-none",
@@ -1220,7 +1464,7 @@ function Progress({ className, value, label, tone = "accent", ...props }) {
1220
1464
  );
1221
1465
  }
1222
1466
  function RadioGroup2({ className, ...props }) {
1223
- return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { className: cn("gap-sm grid", className), ...props });
1467
+ return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { className: cn("gap-step-sm grid", className), ...props });
1224
1468
  }
1225
1469
  function RadioGroupItem({ className, ...props }) {
1226
1470
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1252,7 +1496,7 @@ function SelectTrigger({
1252
1496
  SelectPrimitive__namespace.Trigger,
1253
1497
  {
1254
1498
  className: cn(
1255
- "gap-sm px-sm flex h-10 w-full cursor-pointer items-center justify-between",
1499
+ "gap-step-sm px-step-sm flex h-10 w-full cursor-pointer items-center justify-between",
1256
1500
  "rounded-control border-border bg-surface border",
1257
1501
  "font-sans text-ui text-text-primary",
1258
1502
  "transition-standard",
@@ -1303,7 +1547,7 @@ function SelectLabel({
1303
1547
  return /* @__PURE__ */ jsxRuntime.jsx(
1304
1548
  SelectPrimitive__namespace.Label,
1305
1549
  {
1306
- className: cn("px-sm text-eyebrow font-mono text-text-secondary py-1.5 uppercase", className),
1550
+ className: cn("px-step-sm text-eyebrow font-mono text-text-secondary py-1.5 uppercase", className),
1307
1551
  ...props
1308
1552
  }
1309
1553
  );
@@ -1317,7 +1561,7 @@ function SelectItem({
1317
1561
  SelectPrimitive__namespace.Item,
1318
1562
  {
1319
1563
  className: cn(
1320
- "rounded-chip px-sm relative flex h-9 w-full cursor-default items-center pr-8 select-none",
1564
+ "rounded-chip px-step-sm relative flex h-9 w-full cursor-default items-center pr-8 select-none",
1321
1565
  "text-ui text-text-secondary transition-standard",
1322
1566
  "data-[highlighted]:bg-surface data-[highlighted]:text-text-primary",
1323
1567
  "data-[state=checked]:text-text-primary",
@@ -1419,19 +1663,19 @@ function SheetHeader({ className, ...props }) {
1419
1663
  return /* @__PURE__ */ jsxRuntime.jsx(
1420
1664
  "div",
1421
1665
  {
1422
- className: cn("border-hairline gap-xs p-lg flex flex-col border-b pr-12", className),
1666
+ className: cn("border-hairline gap-step-xs p-step-lg flex flex-col border-b pr-12", className),
1423
1667
  ...props
1424
1668
  }
1425
1669
  );
1426
1670
  }
1427
1671
  function SheetBody({ className, ...props }) {
1428
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("p-lg flex-1 overflow-y-auto", className), ...props });
1672
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("p-step-lg flex-1 overflow-y-auto", className), ...props });
1429
1673
  }
1430
1674
  function SheetFooter({ className, ...props }) {
1431
1675
  return /* @__PURE__ */ jsxRuntime.jsx(
1432
1676
  "div",
1433
1677
  {
1434
- className: cn("border-hairline gap-sm p-lg flex flex-wrap justify-end border-t", className),
1678
+ className: cn("border-hairline gap-step-sm p-step-lg flex flex-wrap justify-end border-t", className),
1435
1679
  ...props
1436
1680
  }
1437
1681
  );
@@ -1542,7 +1786,7 @@ function TableHead({ className, ...props }) {
1542
1786
  "th",
1543
1787
  {
1544
1788
  className: cn(
1545
- "px-sm h-10 text-left align-middle",
1789
+ "px-step-sm h-10 text-left align-middle",
1546
1790
  "text-eyebrow font-mono text-text-muted uppercase",
1547
1791
  className
1548
1792
  ),
@@ -1551,13 +1795,13 @@ function TableHead({ className, ...props }) {
1551
1795
  );
1552
1796
  }
1553
1797
  function TableCell({ className, ...props }) {
1554
- return /* @__PURE__ */ jsxRuntime.jsx("td", { className: cn("px-sm py-sm text-text-secondary align-middle", className), ...props });
1798
+ return /* @__PURE__ */ jsxRuntime.jsx("td", { className: cn("px-step-sm py-step-sm text-text-secondary align-middle", className), ...props });
1555
1799
  }
1556
1800
  function TableCaption({ className, ...props }) {
1557
- return /* @__PURE__ */ jsxRuntime.jsx("caption", { className: cn("mt-sm text-label text-text-muted", className), ...props });
1801
+ return /* @__PURE__ */ jsxRuntime.jsx("caption", { className: cn("mt-step-sm text-label text-text-muted", className), ...props });
1558
1802
  }
1559
1803
  function Tabs({ className, ...props }) {
1560
- return /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Root, { className: cn("gap-md flex flex-col", className), ...props });
1804
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Root, { className: cn("gap-step-md flex flex-col", className), ...props });
1561
1805
  }
1562
1806
  function TabsList({
1563
1807
  className,
@@ -1566,7 +1810,7 @@ function TabsList({
1566
1810
  return /* @__PURE__ */ jsxRuntime.jsx(
1567
1811
  TabsPrimitive__namespace.List,
1568
1812
  {
1569
- className: cn("rounded-control bg-surface gap-xs inline-flex items-center p-1", className),
1813
+ className: cn("rounded-control bg-surface gap-step-xs inline-flex items-center p-1", className),
1570
1814
  ...props
1571
1815
  }
1572
1816
  );
@@ -1579,7 +1823,7 @@ function TabsTrigger({
1579
1823
  TabsPrimitive__namespace.Trigger,
1580
1824
  {
1581
1825
  className: cn(
1582
- "rounded-chip px-sm inline-flex h-8 cursor-pointer items-center justify-center whitespace-nowrap",
1826
+ "rounded-chip px-step-sm inline-flex h-8 cursor-pointer items-center justify-center whitespace-nowrap",
1583
1827
  "font-sans text-label text-text-secondary",
1584
1828
  "transition-standard",
1585
1829
  "hover:text-text-primary",
@@ -1614,7 +1858,7 @@ function Textarea({ className, invalid = false, ...props }) {
1614
1858
  "data-invalid": invalid || void 0,
1615
1859
  "aria-invalid": invalid || void 0,
1616
1860
  className: cn(
1617
- "min-h-24 w-full px-sm py-xs",
1861
+ "min-h-24 w-full px-step-sm py-step-xs",
1618
1862
  "rounded-control border border-border bg-surface",
1619
1863
  "font-sans text-ui text-text-primary placeholder:text-text-muted",
1620
1864
  "transition-standard",
@@ -1638,7 +1882,7 @@ function ToastViewport({
1638
1882
  ToastPrimitive__namespace.Viewport,
1639
1883
  {
1640
1884
  className: cn(
1641
- "gap-sm p-lg fixed right-0 bottom-0 z-50 flex max-h-screen w-full flex-col-reverse",
1885
+ "gap-step-sm p-step-lg fixed right-0 bottom-0 z-50 flex max-h-screen w-full flex-col-reverse",
1642
1886
  "sm:max-w-[420px] sm:flex-col",
1643
1887
  className
1644
1888
  ),
@@ -1648,7 +1892,7 @@ function ToastViewport({
1648
1892
  }
1649
1893
  var toast = classVarianceAuthority.cva(
1650
1894
  [
1651
- "gap-md p-md pr-10 relative flex w-full items-start justify-between",
1895
+ "gap-step-md p-step-md pr-10 relative flex w-full items-start justify-between",
1652
1896
  "rounded-card border bg-surface shadow-standard",
1653
1897
  "font-sans text-ui text-text-secondary"
1654
1898
  ],
@@ -1699,6 +1943,76 @@ function ToastDescription({
1699
1943
  }) {
1700
1944
  return /* @__PURE__ */ jsxRuntime.jsx(ToastPrimitive__namespace.Description, { className: cn("max-w-measure", className), ...props });
1701
1945
  }
1946
+ var avisos = [];
1947
+ var suscriptores = /* @__PURE__ */ new Set();
1948
+ var contador = 0;
1949
+ function emitir(siguientes) {
1950
+ avisos = siguientes;
1951
+ for (const avisar of suscriptores) avisar();
1952
+ }
1953
+ var suscribirse = (avisar) => {
1954
+ suscriptores.add(avisar);
1955
+ return () => {
1956
+ suscriptores.delete(avisar);
1957
+ };
1958
+ };
1959
+ var leer = () => avisos;
1960
+ var VACIO = [];
1961
+ var enServidor = () => VACIO;
1962
+ function crear(mensaje, opciones = {}) {
1963
+ contador += 1;
1964
+ const id = `arrecife-toast-${contador}`;
1965
+ const { description, ...resto } = opciones;
1966
+ emitir([
1967
+ ...avisos,
1968
+ {
1969
+ ...resto,
1970
+ // El primer argumento es la línea principal. Si además llega `title`, el
1971
+ // mensaje pasa a ser la descripción: así `toast('Guardado')` y
1972
+ // `toast('No se pudo guardar', { title: 'Error' })` se leen igual de bien.
1973
+ ...opciones.title ? { description: description ?? mensaje } : { title: mensaje, ...description === void 0 ? {} : { description } },
1974
+ id,
1975
+ abierto: true
1976
+ }
1977
+ ]);
1978
+ return id;
1979
+ }
1980
+ function descartar(id) {
1981
+ emitir(avisos.map((a) => id === void 0 || a.id === id ? { ...a, abierto: false } : a));
1982
+ }
1983
+ function retirar(id) {
1984
+ emitir(avisos.filter((a) => a.id !== id));
1985
+ }
1986
+ var toast2 = Object.assign(crear, {
1987
+ success: (mensaje, opciones = {}) => crear(mensaje, { ...opciones, variant: "success" }),
1988
+ error: (mensaje, opciones = {}) => crear(mensaje, { ...opciones, variant: "error" }),
1989
+ dismiss: descartar
1990
+ });
1991
+ function Toaster({ duration = 5e3, label = "Avisos" }) {
1992
+ const lista = react.useSyncExternalStore(suscribirse, leer, enServidor);
1993
+ return /* @__PURE__ */ jsxRuntime.jsxs(ToastProvider, { duration, label, children: [
1994
+ lista.map(({ id, title, description, variant, duration: propio, action, abierto }) => /* @__PURE__ */ jsxRuntime.jsxs(
1995
+ Toast,
1996
+ {
1997
+ open: abierto,
1998
+ variant: variant ?? "neutral",
1999
+ ...propio === void 0 ? {} : { duration: propio },
2000
+ onOpenChange: (sigue) => {
2001
+ if (!sigue) retirar(id);
2002
+ },
2003
+ children: [
2004
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
2005
+ title ? /* @__PURE__ */ jsxRuntime.jsx(ToastTitle, { children: title }) : null,
2006
+ description ? /* @__PURE__ */ jsxRuntime.jsx(ToastDescription, { children: description }) : null
2007
+ ] }),
2008
+ action
2009
+ ]
2010
+ },
2011
+ id
2012
+ )),
2013
+ /* @__PURE__ */ jsxRuntime.jsx(ToastViewport, {})
2014
+ ] });
2015
+ }
1702
2016
  var TooltipProvider = TooltipPrimitive__namespace.Provider;
1703
2017
  var Tooltip = TooltipPrimitive__namespace.Root;
1704
2018
  var TooltipTrigger = TooltipPrimitive__namespace.Trigger;
@@ -1712,7 +2026,7 @@ function TooltipContent({
1712
2026
  {
1713
2027
  sideOffset,
1714
2028
  className: cn(
1715
- "z-50 px-sm py-1.5",
2029
+ "z-50 px-step-sm py-1.5",
1716
2030
  "rounded-chip border-border bg-surface-raised shadow-standard border",
1717
2031
  "font-sans text-label text-text-primary",
1718
2032
  className
@@ -1738,6 +2052,7 @@ function ArticleCard({
1738
2052
  dateTime,
1739
2053
  readingMinutes,
1740
2054
  tags,
2055
+ headingLevel = 3,
1741
2056
  className,
1742
2057
  ...props
1743
2058
  }) {
@@ -1748,14 +2063,22 @@ function ArticleCard({
1748
2063
  " min de lectura"
1749
2064
  ] }, "lectura") : null
1750
2065
  ].filter(Boolean);
1751
- return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-sm flex h-full flex-col", children: [
1752
- meta.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "gap-xs flex items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-xs flex items-center", children: [
2066
+ return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
2067
+ meta.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-step-xs flex items-center", children: [
1753
2068
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
1754
2069
  m
1755
2070
  ] }, i)) }) : null,
1756
- /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2071
+ /* @__PURE__ */ jsxRuntime.jsx(
2072
+ Text,
2073
+ {
2074
+ as: headingLevel === 2 ? "h2" : "h3",
2075
+ variant: "h3",
2076
+ className: "group-hover:text-accent transition-standard",
2077
+ children: title
2078
+ }
2079
+ ),
1757
2080
  excerpt ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: excerpt }) : null,
1758
- tags && tags.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-xs mt-auto flex flex-wrap pt-sm", children: tags.map((t) => /* @__PURE__ */ jsxRuntime.jsx(CategoryBadge, { children: t }, t)) }) : null
2081
+ tags && tags.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-xs mt-auto flex flex-wrap pt-step-sm", children: tags.map((t) => /* @__PURE__ */ jsxRuntime.jsx(CategoryBadge, { children: t }, t)) }) : null
1759
2082
  ] }) });
1760
2083
  }
1761
2084
  var AVATAR = "size-[52px]";
@@ -1763,16 +2086,16 @@ function iniciales(nombre) {
1763
2086
  return nombre.split(/\s+/).slice(0, 2).map((p) => p[0] ?? "").join("").toUpperCase();
1764
2087
  }
1765
2088
  function AuthorCard({ name, role, src, bio, action, className, ...props }) {
1766
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-lg gap-md flex items-start", className), ...props, children: [
2089
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-step-lg gap-step-md flex items-start", className), ...props, children: [
1767
2090
  /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: cn(AVATAR, "shrink-0"), children: [
1768
2091
  src ? /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src, alt: "" }) : null,
1769
2092
  /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: iniciales(name) })
1770
2093
  ] }),
1771
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs flex min-w-0 flex-1 flex-col", children: [
2094
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex min-w-0 flex-1 flex-col", children: [
1772
2095
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", as: "p", className: "font-medium", children: name }),
1773
2096
  role ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "chip", tone: "muted", as: "p", children: role }) : null,
1774
- bio ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "mt-xs", children: bio }) : null,
1775
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-xs gap-sm flex flex-wrap items-center", children: action }) : null
2097
+ bio ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "mt-step-xs", children: bio }) : null,
2098
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-step-xs gap-step-sm flex flex-wrap items-center", children: action }) : null
1776
2099
  ] })
1777
2100
  ] });
1778
2101
  }
@@ -1891,7 +2214,7 @@ function Volumen({
1891
2214
  onSilenciar,
1892
2215
  onCambiarVolumen
1893
2216
  }) {
1894
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs hidden items-center sm:flex", children: [
2217
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs hidden items-center sm:flex", children: [
1895
2218
  /* @__PURE__ */ jsxRuntime.jsx(
1896
2219
  "button",
1897
2220
  {
@@ -2138,8 +2461,8 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2138
2461
  ...puntero
2139
2462
  }
2140
2463
  ),
2141
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-surface/95 border-accent/25 border-t backdrop-blur-md", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm px-md flex items-center py-5", children: [
2142
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs flex shrink-0 items-center", children: [
2464
+ /* @__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: [
2465
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex shrink-0 items-center", children: [
2143
2466
  /* @__PURE__ */ jsxRuntime.jsx(Onda, { grosor: "w-[2px]", alto: "h-4", sonando: isPlaying }),
2144
2467
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-accent hidden uppercase sm:block", children: "Narraci\xF3n" })
2145
2468
  ] }),
@@ -2156,7 +2479,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2156
2479
  /* @__PURE__ */ jsxRuntime.jsx(
2157
2480
  BotonPlay,
2158
2481
  {
2159
- className: "rounded-pill px-sm gap-xs flex items-center py-1.5",
2482
+ className: "rounded-pill px-step-sm gap-step-xs flex items-center py-1.5",
2160
2483
  tamano: "w-4 h-4",
2161
2484
  etiqueta: etiquetaPlay,
2162
2485
  onAlternar: togglePlay,
@@ -2181,7 +2504,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2181
2504
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2182
2505
  /* @__PURE__ */ jsxRuntime.jsx("audio", { ref: audioRef, src, preload: "metadata" }),
2183
2506
  /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: staticRef, children: [
2184
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm mb-md flex items-center", children: [
2507
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm mb-step-md flex items-center", children: [
2185
2508
  /* @__PURE__ */ jsxRuntime.jsx(Onda, { grosor: "w-[3px]", alto: "h-5", sonando: isPlaying }),
2186
2509
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-accent uppercase", children: "Narraci\xF3n de audio" }),
2187
2510
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-chip font-mono text-text-muted ml-auto tabular-nums", children: [
@@ -2190,13 +2513,13 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2190
2513
  formatTime(duration)
2191
2514
  ] })
2192
2515
  ] }),
2193
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-md", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-1.5", perilla: 14, progreso: progress, ...puntero }) }),
2194
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm flex items-center", children: [
2516
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-step-md", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-1.5", perilla: 14, progreso: progress, ...puntero }) }),
2517
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex items-center", children: [
2195
2518
  /* @__PURE__ */ jsxRuntime.jsx(BotonSalto, { segundos: -15, className: "p-2", tamano: "w-6 h-6", onSaltar: skip }),
2196
2519
  /* @__PURE__ */ jsxRuntime.jsx(
2197
2520
  BotonPlay,
2198
2521
  {
2199
- className: "rounded-pill px-lg gap-xs text-ui flex items-center py-2 font-medium",
2522
+ className: "rounded-pill px-step-lg gap-step-xs text-ui flex items-center py-2 font-medium",
2200
2523
  tamano: "w-4 h-4",
2201
2524
  etiqueta: etiquetaPlay,
2202
2525
  texto: etiquetaPlay,
@@ -2205,7 +2528,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2205
2528
  }
2206
2529
  ),
2207
2530
  /* @__PURE__ */ jsxRuntime.jsx(BotonSalto, { segundos: 15, className: "p-2", tamano: "w-6 h-6", onSaltar: skip }),
2208
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm ml-auto flex items-center", children: [
2531
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm ml-auto flex items-center", children: [
2209
2532
  /* @__PURE__ */ jsxRuntime.jsx(
2210
2533
  BotonVelocidad,
2211
2534
  {
@@ -2235,8 +2558,8 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2235
2558
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2236
2559
  /* @__PURE__ */ jsxRuntime.jsx("audio", { ref: audioRef, src, preload: "metadata" }),
2237
2560
  /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: staticRef, className: "w-full", children: [
2238
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-xs", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-1.5", perilla: 12, progreso: progress, ...puntero }) }),
2239
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-chip font-mono text-text-muted mb-sm flex justify-between", children: [
2561
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-step-xs", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-1.5", perilla: 12, progreso: progress, ...puntero }) }),
2562
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-chip font-mono text-text-muted mb-step-sm flex justify-between", children: [
2240
2563
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(currentTime) }),
2241
2564
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(duration) })
2242
2565
  ] }),
@@ -2268,16 +2591,16 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2268
2591
  flotanteJsx
2269
2592
  ] });
2270
2593
  }
2271
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-surface rounded-control border-border p-md w-full border", children: [
2594
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-surface rounded-control border-border p-step-md w-full border", children: [
2272
2595
  /* @__PURE__ */ jsxRuntime.jsx("audio", { ref: audioRef, src, preload: "metadata" }),
2273
- title ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui font-sans text-text-secondary mb-sm truncate", children: title }) : null,
2274
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-sm", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-2", perilla: 16, progreso: progress, ...puntero }) }),
2275
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-chip font-mono text-text-muted mb-sm flex justify-between", children: [
2596
+ title ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui font-sans text-text-secondary mb-step-sm truncate", children: title }) : null,
2597
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-step-sm", children: /* @__PURE__ */ jsxRuntime.jsx(BarraProgreso, { alto: "h-2", perilla: 16, progreso: progress, ...puntero }) }),
2598
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-chip font-mono text-text-muted mb-step-sm flex justify-between", children: [
2276
2599
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(currentTime) }),
2277
2600
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTime(duration) })
2278
2601
  ] }),
2279
2602
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
2280
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs flex items-center", children: [
2603
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex items-center", children: [
2281
2604
  /* @__PURE__ */ jsxRuntime.jsx(BotonSalto, { segundos: -15, className: "p-2", tamano: "w-5 h-5", onSaltar: skip }),
2282
2605
  /* @__PURE__ */ jsxRuntime.jsx(
2283
2606
  BotonPlay,
@@ -2291,7 +2614,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
2291
2614
  ),
2292
2615
  /* @__PURE__ */ jsxRuntime.jsx(BotonSalto, { segundos: 15, className: "p-2", tamano: "w-5 h-5", onSaltar: skip })
2293
2616
  ] }),
2294
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm flex items-center", children: [
2617
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex items-center", children: [
2295
2618
  /* @__PURE__ */ jsxRuntime.jsx(
2296
2619
  BotonVelocidad,
2297
2620
  {
@@ -2319,11 +2642,11 @@ function Blockquote({ children, author, source, className, ...props }) {
2319
2642
  return /* @__PURE__ */ jsxRuntime.jsxs(
2320
2643
  "blockquote",
2321
2644
  {
2322
- className: cn("border-accent pl-md my-lg border-l-2", className),
2645
+ className: cn("border-accent pl-step-md my-step-lg border-l-2", className),
2323
2646
  ...props,
2324
2647
  children: [
2325
2648
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children }),
2326
- author || source ? /* @__PURE__ */ jsxRuntime.jsx("footer", { className: "mt-sm", children: /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "label", tone: "muted", as: "span", children: [
2649
+ author || source ? /* @__PURE__ */ jsxRuntime.jsx("footer", { className: "mt-step-sm", children: /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "label", tone: "muted", as: "span", children: [
2327
2650
  author ? /* @__PURE__ */ jsxRuntime.jsx("cite", { className: "not-italic", children: author }) : null,
2328
2651
  author && source ? " \xB7 " : null,
2329
2652
  source
@@ -2342,11 +2665,11 @@ function Breadcrumb({
2342
2665
  ...props
2343
2666
  }) {
2344
2667
  const enlace = (href, contenido) => linkAsChild ? /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: ENLACE, children: linkAsChild({ href, children: contenido }) }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: ENLACE, children: contenido });
2345
- return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Ruta", className: cn("font-mono text-meta text-text-muted", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("ol", { className: "gap-xs flex flex-wrap items-center", children: [
2668
+ return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Ruta", className: cn("font-mono text-meta text-text-muted", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("ol", { className: "gap-step-xs flex flex-wrap items-center", children: [
2346
2669
  /* @__PURE__ */ jsxRuntime.jsx("li", { children: enlace(homeHref, /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": homeLabel, children: "~" })) }),
2347
2670
  items.map((item2, i) => {
2348
2671
  const ultimo = i === items.length - 1;
2349
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "gap-xs flex items-center", children: [
2672
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "gap-step-xs flex items-center", children: [
2350
2673
  /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-border", children: "/" }),
2351
2674
  item2.href && !ultimo ? enlace(item2.href, item2.label) : /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-current": ultimo ? "page" : void 0, className: "text-text-secondary", children: item2.label })
2352
2675
  ] }, i);
@@ -2376,7 +2699,7 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2376
2699
  ),
2377
2700
  ...props,
2378
2701
  children: [
2379
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-hairline px-sm flex items-center justify-between border-b py-1.5", children: [
2702
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-hairline px-step-sm flex items-center justify-between border-b py-1.5", children: [
2380
2703
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: [
2381
2704
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-accent", children: "\u276F" }),
2382
2705
  " ",
@@ -2390,7 +2713,7 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2390
2713
  "aria-label": copiado ? "C\xF3digo copiado" : "Copiar c\xF3digo",
2391
2714
  "aria-live": "polite",
2392
2715
  className: cn(
2393
- "gap-xs rounded-chip flex items-center px-2 py-1",
2716
+ "gap-step-xs rounded-chip flex items-center px-2 py-1",
2394
2717
  "text-label font-mono text-text-muted cursor-pointer",
2395
2718
  "transition-standard hover:bg-surface hover:text-text-primary",
2396
2719
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
@@ -2402,7 +2725,7 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
2402
2725
  }
2403
2726
  ) : null
2404
2727
  ] }),
2405
- /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "p-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed", children })
2728
+ /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "p-step-md font-mono text-meta text-text-primary overflow-x-auto leading-relaxed", children })
2406
2729
  ]
2407
2730
  }
2408
2731
  );
@@ -2416,15 +2739,15 @@ function CourseCard({
2416
2739
  className,
2417
2740
  ...props
2418
2741
  }) {
2419
- return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-sm flex h-full flex-col", children: [
2742
+ return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
2420
2743
  status ? /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warm", children: status }) }) : null,
2421
2744
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2422
2745
  summary ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-3", children: summary }) : null,
2423
- meta && meta.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-xs flex flex-wrap items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-xs flex items-center", children: [
2746
+ meta && meta.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-step-xs flex flex-wrap items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-step-xs flex items-center", children: [
2424
2747
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
2425
2748
  m
2426
2749
  ] }, i)) }) : null,
2427
- typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs mt-auto flex flex-col pt-sm", children: [
2750
+ typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs mt-auto flex flex-col pt-step-sm", children: [
2428
2751
  /* @__PURE__ */ jsxRuntime.jsx(Progress, { value: progress, tone: "warm", label: `Progreso del curso: ${progress}%` }),
2429
2752
  /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "label", tone: "muted", as: "p", children: [
2430
2753
  progress,
@@ -2515,13 +2838,13 @@ function EmptyState({
2515
2838
  return /* @__PURE__ */ jsxRuntime.jsxs(
2516
2839
  "div",
2517
2840
  {
2518
- className: cn(SUPERFICIE_TARJETA, "p-lg gap-sm flex flex-col items-center text-center", className),
2841
+ className: cn(SUPERFICIE_TARJETA, "p-step-lg gap-step-sm flex flex-col items-center text-center", className),
2519
2842
  ...props,
2520
2843
  children: [
2521
2844
  /* @__PURE__ */ jsxRuntime.jsx(CaraDeMascota, { expresion, className: CARA, basePath }),
2522
2845
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", as: "p", className: "font-medium", children: title }),
2523
2846
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "max-w-measure font-normal", children: description }) : null,
2524
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-xs", children: action }) : null
2847
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-step-xs", children: action }) : null
2525
2848
  ]
2526
2849
  }
2527
2850
  );
@@ -2530,11 +2853,13 @@ function Footer({
2530
2853
  social,
2531
2854
  year = (/* @__PURE__ */ new Date()).getFullYear(),
2532
2855
  children,
2856
+ brand: brand2,
2533
2857
  className,
2534
2858
  ...props
2535
2859
  }) {
2536
- return /* @__PURE__ */ jsxRuntime.jsx("footer", { className: cn("border-hairline w-full border-t", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-md py-xl gap-lg mx-auto flex flex-col", children: [
2537
- children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-md flex flex-wrap items-center", children }) : null,
2860
+ return /* @__PURE__ */ jsxRuntime.jsx("footer", { className: cn("border-hairline w-full border-t", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md py-step-xl gap-step-lg mx-auto flex flex-col", children: [
2861
+ brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", children: brand2 }) : null,
2862
+ children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }) : null,
2538
2863
  social && social.length > 0 ? (
2539
2864
  // 18px de separación, del documento. No es un escalón de `spacing`:
2540
2865
  // es el ritmo de una fila de iconos, no el de una página.
@@ -2584,27 +2909,55 @@ function Hero({
2584
2909
  action,
2585
2910
  pose,
2586
2911
  basePath,
2912
+ variant = "cabecera",
2587
2913
  className,
2588
2914
  ...props
2589
2915
  }) {
2916
+ const centrado = variant === "centrado";
2590
2917
  return /* @__PURE__ */ jsxRuntime.jsxs(
2591
2918
  "section",
2592
2919
  {
2593
2920
  className: cn(
2594
2921
  "degradado-hero rounded-panel border-hairline relative overflow-hidden border",
2595
2922
  // 44 arriba, 40 a los lados y abajo. Del documento.
2596
- "px-xl pt-[44px] pb-xl",
2923
+ "px-step-xl pt-[44px] pb-step-xl",
2597
2924
  className
2598
2925
  ),
2599
2926
  ...props,
2600
2927
  children: [
2601
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-md flex flex-col md:max-w-[62%]", children: [
2602
- eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
2603
- /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h1", variant: "display", children: title }),
2604
- description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
2605
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-sm mt-xs flex flex-wrap items-center", children: action }) : null
2606
- ] }),
2607
- pose ? /* @__PURE__ */ jsxRuntime.jsx(
2928
+ centrado && pose ? /* @__PURE__ */ jsxRuntime.jsx(
2929
+ Mascota,
2930
+ {
2931
+ pose,
2932
+ basePath,
2933
+ className: "mb-step-md mx-auto w-48 md:w-56"
2934
+ }
2935
+ ) : null,
2936
+ /* @__PURE__ */ jsxRuntime.jsxs(
2937
+ "div",
2938
+ {
2939
+ className: cn(
2940
+ "gap-step-md flex flex-col",
2941
+ centrado ? "items-center text-center" : "md:max-w-[62%]"
2942
+ ),
2943
+ children: [
2944
+ eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
2945
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h1", variant: "display", children: title }),
2946
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
2947
+ action ? /* @__PURE__ */ jsxRuntime.jsx(
2948
+ "div",
2949
+ {
2950
+ className: cn(
2951
+ "gap-step-sm mt-step-xs flex flex-wrap items-center",
2952
+ centrado && "justify-center"
2953
+ ),
2954
+ children: action
2955
+ }
2956
+ ) : null
2957
+ ]
2958
+ }
2959
+ ),
2960
+ !centrado && pose ? /* @__PURE__ */ jsxRuntime.jsx(
2608
2961
  Mascota,
2609
2962
  {
2610
2963
  pose,
@@ -2612,7 +2965,7 @@ function Hero({
2612
2965
  className: cn(
2613
2966
  // En móvil, en el flujo y bajo los botones. Desde md, sangrando por
2614
2967
  // la esquina inferior derecha.
2615
- "mt-lg mx-auto w-40",
2968
+ "mt-step-lg mx-auto w-40",
2616
2969
  "md:mt-0 md:absolute md:right-0 md:-bottom-4 md:mx-0 md:w-64"
2617
2970
  )
2618
2971
  }
@@ -2634,11 +2987,11 @@ function LinkRow({
2634
2987
  return /* @__PURE__ */ jsxRuntime.jsx(
2635
2988
  Tarjeta,
2636
2989
  {
2637
- className: cn("px-md py-sm", className),
2990
+ className: cn("px-step-md py-step-sm", className),
2638
2991
  ...props,
2639
2992
  rel,
2640
2993
  ...target ? { target } : {},
2641
- children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-sm flex items-center", children: [
2994
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-step-sm flex items-center", children: [
2642
2995
  icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-text-muted group-hover:text-accent transition-standard shrink-0 text-2xl", children: icon }) : null,
2643
2996
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
2644
2997
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "span", variant: "ui", className: "group-hover:text-accent transition-standard block font-medium", children: name }),
@@ -2668,10 +3021,10 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
2668
3021
  className
2669
3022
  ),
2670
3023
  ...props,
2671
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-md h-nav gap-lg mx-auto flex items-center", children: [
3024
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md h-nav gap-step-lg mx-auto flex items-center", children: [
2672
3025
  brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: brand2 }) : null,
2673
- children ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Principal", className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-md flex items-center", children }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
2674
- actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-sm flex shrink-0 items-center", children: actions }) : null
3026
+ children ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Principal", className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-step-md flex items-center", children }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
3027
+ actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
2675
3028
  ] })
2676
3029
  }
2677
3030
  );
@@ -2709,6 +3062,10 @@ function NewsletterForm({
2709
3062
  submitLabel = "Suscribirme",
2710
3063
  placeholder = "tu@correo.dev",
2711
3064
  fieldLabel = "Correo electr\xF3nico",
3065
+ nameField = false,
3066
+ nameLabel = "Nombre",
3067
+ namePlaceholder = "C\xF3mo te llamas",
3068
+ nameInputProps,
2712
3069
  className,
2713
3070
  ...props
2714
3071
  }) {
@@ -2719,53 +3076,74 @@ function NewsletterForm({
2719
3076
  evento.preventDefault();
2720
3077
  const datos = new FormData(evento.currentTarget);
2721
3078
  const correo = String(datos.get("email") ?? "");
2722
- onSubmitEmail?.(correo);
3079
+ const nombre = nameField ? String(datos.get("name") ?? "") : void 0;
3080
+ onSubmitEmail?.(correo, nombre);
2723
3081
  }
3082
+ const boton = /* @__PURE__ */ jsxRuntime.jsx(
3083
+ Button,
3084
+ {
3085
+ type: "submit",
3086
+ variant: "conversion",
3087
+ loading: enviando,
3088
+ className: cn("disabled:opacity-60", nameField && "sm:self-start"),
3089
+ children: submitLabel
3090
+ }
3091
+ );
2724
3092
  return /* @__PURE__ */ jsxRuntime.jsxs(
2725
3093
  "section",
2726
3094
  {
2727
3095
  className: cn(
2728
- "degradado-seccion rounded-panel border-hairline p-lg gap-md flex flex-col border",
3096
+ "degradado-seccion rounded-panel border-hairline p-step-lg gap-step-md flex flex-col border",
2729
3097
  className
2730
3098
  ),
2731
3099
  ...props,
2732
3100
  children: [
2733
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs flex flex-col", children: [
3101
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-col", children: [
2734
3102
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h2", variant: "h3", children: title }),
2735
3103
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", children: description }) : null
2736
3104
  ] }),
2737
- /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: enviar, className: "gap-sm flex flex-col sm:flex-row sm:items-end", noValidate: true, children: [
2738
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-xs flex flex-1 flex-col", children: [
2739
- /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: id, children: fieldLabel }),
2740
- /* @__PURE__ */ jsxRuntime.jsx(
2741
- Input,
2742
- {
2743
- id,
2744
- name: "email",
2745
- type: "email",
2746
- autoComplete: "email",
2747
- required: true,
2748
- placeholder,
2749
- disabled: enviando,
2750
- invalid: error,
2751
- "aria-describedby": state === "exito" || error ? `${id}-aviso` : void 0
2752
- }
2753
- )
3105
+ /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: enviar, className: "gap-step-sm flex flex-col", noValidate: true, children: [
3106
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex flex-col sm:flex-row sm:items-end", children: [
3107
+ nameField ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
3108
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: `${id}-nombre`, children: nameLabel }),
3109
+ /* @__PURE__ */ jsxRuntime.jsx(
3110
+ Input,
3111
+ {
3112
+ id: `${id}-nombre`,
3113
+ name: "name",
3114
+ type: "text",
3115
+ autoComplete: "name",
3116
+ required: true,
3117
+ placeholder: namePlaceholder,
3118
+ disabled: enviando,
3119
+ ...nameInputProps
3120
+ }
3121
+ )
3122
+ ] }) : null,
3123
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
3124
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: id, children: fieldLabel }),
3125
+ /* @__PURE__ */ jsxRuntime.jsx(
3126
+ Input,
3127
+ {
3128
+ id,
3129
+ name: "email",
3130
+ type: "email",
3131
+ autoComplete: "email",
3132
+ required: true,
3133
+ placeholder,
3134
+ disabled: enviando,
3135
+ invalid: error,
3136
+ "aria-describedby": state === "exito" || error ? `${id}-aviso` : void 0
3137
+ }
3138
+ )
3139
+ ] }),
3140
+ nameField ? null : boton
2754
3141
  ] }),
2755
- /* @__PURE__ */ jsxRuntime.jsx(
2756
- Button,
2757
- {
2758
- type: "submit",
2759
- variant: "conversion",
2760
- loading: enviando,
2761
- className: "disabled:opacity-60",
2762
- children: submitLabel
2763
- }
2764
- )
3142
+ nameField ? boton : null
2765
3143
  ] }),
2766
3144
  state === "exito" ? /* @__PURE__ */ jsxRuntime.jsx(Alert, { id: `${id}-aviso`, variant: "success", enfasis: "fuerte", children: successMessage }) : null,
2767
3145
  error ? /* @__PURE__ */ jsxRuntime.jsx(Alert, { id: `${id}-aviso`, variant: "error", enfasis: "fuerte", children: errorMessage }) : null,
2768
- disclaimer ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm flex items-center", children: [
3146
+ disclaimer ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex items-center", children: [
2769
3147
  expresion ? /* @__PURE__ */ jsxRuntime.jsx(CaraDeMascota, { expresion, basePath, className: "w-10 max-w-none" }) : null,
2770
3148
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "font-normal", children: disclaimer })
2771
3149
  ] }) : null
@@ -2773,11 +3151,11 @@ function NewsletterForm({
2773
3151
  }
2774
3152
  );
2775
3153
  }
2776
- var cabecera = classVarianceAuthority.cva("gap-sm flex flex-col", {
3154
+ var cabecera = classVarianceAuthority.cva("gap-step-sm flex flex-col", {
2777
3155
  variants: {
2778
3156
  size: {
2779
3157
  display: "py-section",
2780
- page: "py-xl"
3158
+ page: "py-step-xl"
2781
3159
  }
2782
3160
  },
2783
3161
  defaultVariants: { size: "page" }
@@ -2796,9 +3174,65 @@ function PageHeader({
2796
3174
  eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
2797
3175
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as, variant: size2 === "display" ? "display" : "h1", className: "max-w-measure", children: title }),
2798
3176
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
2799
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-sm mt-sm flex flex-wrap items-center", children: action }) : null
3177
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm mt-step-sm flex flex-wrap items-center", children: action }) : null
2800
3178
  ] });
2801
3179
  }
3180
+ function ScrollingProgressBar({
3181
+ target,
3182
+ tone = "accent",
3183
+ sticky = true,
3184
+ className,
3185
+ ...props
3186
+ }) {
3187
+ const [avance, setAvance] = react.useState(0);
3188
+ const pendiente = react.useRef(0);
3189
+ react.useEffect(() => {
3190
+ const medir = () => {
3191
+ pendiente.current = 0;
3192
+ const elemento = target?.current;
3193
+ const inicio = elemento ? elemento.getBoundingClientRect().top + scrollY : 0;
3194
+ const alto = elemento ? elemento.offsetHeight : document.documentElement.scrollHeight;
3195
+ const recorrible = alto - innerHeight;
3196
+ if (recorrible <= 0) {
3197
+ setAvance(scrollY >= inicio ? 100 : 0);
3198
+ return;
3199
+ }
3200
+ const recorrido = scrollY - inicio;
3201
+ setAvance(Math.min(100, Math.max(0, recorrido / recorrible * 100)));
3202
+ };
3203
+ const alMoverse = () => {
3204
+ if (pendiente.current) return;
3205
+ pendiente.current = requestAnimationFrame(medir);
3206
+ };
3207
+ medir();
3208
+ addEventListener("scroll", alMoverse, { passive: true });
3209
+ addEventListener("resize", alMoverse);
3210
+ return () => {
3211
+ if (pendiente.current) cancelAnimationFrame(pendiente.current);
3212
+ removeEventListener("scroll", alMoverse);
3213
+ removeEventListener("resize", alMoverse);
3214
+ };
3215
+ }, [target]);
3216
+ return /* @__PURE__ */ jsxRuntime.jsx(
3217
+ "div",
3218
+ {
3219
+ "aria-hidden": "true",
3220
+ className: cn(
3221
+ "h-1 w-full overflow-hidden",
3222
+ sticky && "sticky top-0 z-40",
3223
+ className
3224
+ ),
3225
+ ...props,
3226
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3227
+ "div",
3228
+ {
3229
+ className: cn("h-full", tone === "warm" ? "bg-warm" : "bg-accent"),
3230
+ style: { width: `${avance}%` }
3231
+ }
3232
+ )
3233
+ }
3234
+ );
3235
+ }
2802
3236
  function SidebarItem({
2803
3237
  active = false,
2804
3238
  asChild = false,
@@ -2813,7 +3247,7 @@ function SidebarItem({
2813
3247
  {
2814
3248
  "aria-current": active ? "page" : void 0,
2815
3249
  className: cn(
2816
- "rounded-chip px-sm gap-xs flex cursor-pointer items-center py-1.5",
3250
+ "rounded-chip px-step-sm gap-step-xs flex cursor-pointer items-center py-1.5",
2817
3251
  "font-mono text-meta transition-standard",
2818
3252
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2819
3253
  // El activo es fondo `surfaceRaised` y tinta primaria, igual que
@@ -2847,14 +3281,14 @@ function SidebarNav({
2847
3281
  {
2848
3282
  "aria-label": typeof title === "string" ? title : "Administraci\xF3n",
2849
3283
  className: cn(
2850
- "border-hairline bg-surface p-sm gap-sm flex h-full flex-col border-r",
3284
+ "border-hairline bg-surface p-step-sm gap-step-sm flex h-full flex-col border-r",
2851
3285
  className
2852
3286
  ),
2853
3287
  ...props,
2854
3288
  children: [
2855
- title ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "px-sm", children: title }) : null,
3289
+ title ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "px-step-sm", children: title }) : null,
2856
3290
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-0.5 flex flex-1 flex-col", children }),
2857
- pie.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "border-hairline px-sm pt-sm border-t", children: pie.map((p, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
3291
+ pie.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "border-hairline px-step-sm pt-step-sm border-t", children: pie.map((p, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
2858
3292
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: " \xB7 " }) : null,
2859
3293
  p
2860
3294
  ] }, i)) }) : null
@@ -2863,7 +3297,7 @@ function SidebarNav({
2863
3297
  );
2864
3298
  }
2865
3299
  function Stat({ value, label, tone = "neutral", progress, className, ...props }) {
2866
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-lg gap-xs flex flex-col", className), ...props, children: [
3300
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-step-lg gap-step-xs flex flex-col", className), ...props, children: [
2867
3301
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "stat", as: "p", tone: tone === "alerta" ? "warm" : "accent", children: value }),
2868
3302
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", children: label }),
2869
3303
  typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -2872,7 +3306,7 @@ function Stat({ value, label, tone = "neutral", progress, className, ...props })
2872
3306
  value: progress,
2873
3307
  tone: tone === "alerta" ? "warm" : "accent",
2874
3308
  label: `${label}: ${progress}%`,
2875
- className: "mt-sm"
3309
+ className: "mt-step-sm"
2876
3310
  }
2877
3311
  ) : null
2878
3312
  ] });
@@ -2884,6 +3318,7 @@ function TalkCard({
2884
3318
  dateTime,
2885
3319
  location,
2886
3320
  status,
3321
+ description,
2887
3322
  className,
2888
3323
  ...props
2889
3324
  }) {
@@ -2891,18 +3326,49 @@ function TalkCard({
2891
3326
  date ? /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime, children: date }, "fecha") : null,
2892
3327
  location ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: location }, "lugar") : null
2893
3328
  ].filter(Boolean);
2894
- return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-sm flex h-full flex-col", children: [
2895
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-sm flex items-start justify-between", children: [
3329
+ return /* @__PURE__ */ jsxRuntime.jsx(Tarjeta, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
3330
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex items-start justify-between", children: [
2896
3331
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: event }),
2897
3332
  status ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "neutral", children: status }) : null
2898
3333
  ] }),
2899
3334
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2900
- pie.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-xs mt-auto flex items-center pt-sm", children: pie.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-xs flex items-center", children: [
3335
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: description }) : null,
3336
+ pie.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "label", tone: "muted", as: "p", className: "gap-step-xs mt-auto flex items-center pt-step-sm", children: pie.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "gap-step-xs flex items-center", children: [
2901
3337
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
2902
3338
  m
2903
3339
  ] }, i)) }) : null
2904
3340
  ] }) });
2905
3341
  }
3342
+ function ThemeToggle({
3343
+ label = "Cambiar de tema",
3344
+ onThemeChange,
3345
+ variant = "secondary",
3346
+ size: size2 = "icon",
3347
+ className,
3348
+ ...props
3349
+ }) {
3350
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3351
+ Button,
3352
+ {
3353
+ type: "button",
3354
+ variant,
3355
+ size: size2,
3356
+ "aria-label": label,
3357
+ className: cn("[&_svg]:size-[19px]", className),
3358
+ onClick: () => onThemeChange?.(alternarTema()),
3359
+ ...props,
3360
+ children: [
3361
+ /* @__PURE__ */ jsxRuntime.jsx(Sol, { className: "light:hidden" }),
3362
+ /* @__PURE__ */ jsxRuntime.jsx(Luna, { className: "hidden light:block" })
3363
+ ]
3364
+ }
3365
+ );
3366
+ }
3367
+ function useTema() {
3368
+ return react.useSyncExternalStore(suscribirse2, temaActual, servidor);
3369
+ }
3370
+ var suscribirse2 = (avisar) => escucharTema(() => avisar());
3371
+ var servidor = () => "dark";
2906
3372
  function TableOfContents({
2907
3373
  items,
2908
3374
  title = "En esta p\xE1gina",
@@ -2911,17 +3377,21 @@ function TableOfContents({
2911
3377
  className,
2912
3378
  ...props
2913
3379
  }) {
2914
- return /* @__PURE__ */ jsxRuntime.jsxs("nav", { "aria-label": typeof title === "string" ? title : "En esta p\xE1gina", className: cn("gap-sm flex flex-col", className), ...props, children: [
3380
+ return /* @__PURE__ */ jsxRuntime.jsxs("nav", { "aria-label": typeof title === "string" ? title : "En esta p\xE1gina", className: cn("gap-step-sm flex flex-col", className), ...props, children: [
2915
3381
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", children: title }),
2916
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "border-hairline gap-xs flex flex-col border-l", children: items.map((item2) => {
3382
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "border-hairline gap-step-xs flex flex-col border-l", children: items.map((item2) => {
2917
3383
  const activo = item2.href === activeHref;
2918
3384
  const clases = cn(
2919
- "px-sm -ml-px block border-l",
3385
+ "px-step-sm -ml-px block border-l",
2920
3386
  "font-sans text-label transition-standard",
2921
3387
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2922
3388
  "cursor-pointer",
2923
- item2.nested && "pl-lg",
2924
- activo ? "border-accent text-accent" : "border-transparent text-text-secondary hover:text-text-primary"
3389
+ item2.nested && "pl-step-lg",
3390
+ "border-transparent text-text-secondary hover:text-text-primary",
3391
+ // El hover del activo se declara con las dos variantes juntas para
3392
+ // que gane al `hover:` de arriba por especificidad y no por el orden
3393
+ // en que Tailwind decida emitir las reglas.
3394
+ "aria-[current]:border-accent aria-[current]:text-accent aria-[current]:hover:text-accent"
2925
3395
  );
2926
3396
  return /* @__PURE__ */ jsxRuntime.jsx("li", { children: linkAsChild ? /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: clases, "aria-current": activo ? "location" : void 0, children: linkAsChild({ href: item2.href, children: item2.label }) }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href: item2.href, className: clases, "aria-current": activo ? "location" : void 0, children: item2.label }) }, item2.href);
2927
3397
  }) })
@@ -2954,7 +3424,7 @@ function Logo({
2954
3424
  className,
2955
3425
  ...props
2956
3426
  }) {
2957
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-xs inline-flex items-center", className), ...props, children: [
3427
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
2958
3428
  /* @__PURE__ */ jsxRuntime.jsx(
2959
3429
  Isotipo,
2960
3430
  {
@@ -3029,7 +3499,21 @@ var Correo = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Funcional, { ...props, c
3029
3499
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" })
3030
3500
  ] });
3031
3501
 
3502
+ exports.Accordion = Accordion;
3503
+ exports.AccordionContent = AccordionContent;
3504
+ exports.AccordionItem = AccordionItem;
3505
+ exports.AccordionTrigger = AccordionTrigger;
3032
3506
  exports.Alert = Alert;
3507
+ exports.AlertDialog = AlertDialog;
3508
+ exports.AlertDialogAction = AlertDialogAction;
3509
+ exports.AlertDialogCancel = AlertDialogCancel;
3510
+ exports.AlertDialogContent = AlertDialogContent;
3511
+ exports.AlertDialogDescription = AlertDialogDescription;
3512
+ exports.AlertDialogFooter = AlertDialogFooter;
3513
+ exports.AlertDialogHeader = AlertDialogHeader;
3514
+ exports.AlertDialogOverlay = AlertDialogOverlay;
3515
+ exports.AlertDialogTitle = AlertDialogTitle;
3516
+ exports.AlertDialogTrigger = AlertDialogTrigger;
3033
3517
  exports.ArticleCard = ArticleCard;
3034
3518
  exports.AudioPlayer = AudioPlayer;
3035
3519
  exports.AuthorCard = AuthorCard;
@@ -3108,6 +3592,7 @@ exports.RUTA_ASSETS = RUTA_ASSETS;
3108
3592
  exports.RadioGroup = RadioGroup2;
3109
3593
  exports.RadioGroupItem = RadioGroupItem;
3110
3594
  exports.SUPERFICIE_TARJETA = SUPERFICIE_TARJETA;
3595
+ exports.ScrollingProgressBar = ScrollingProgressBar;
3111
3596
  exports.Select = Select;
3112
3597
  exports.SelectContent = SelectContent;
3113
3598
  exports.SelectGroup = SelectGroup;
@@ -3131,6 +3616,9 @@ exports.SidebarNav = SidebarNav;
3131
3616
  exports.Skeleton = Skeleton;
3132
3617
  exports.Stat = Stat;
3133
3618
  exports.Switch = Switch;
3619
+ exports.TEMA_ATRIBUTO = TEMA_ATRIBUTO;
3620
+ exports.TEMA_CLAVE = TEMA_CLAVE;
3621
+ exports.TEMA_EVENTO = TEMA_EVENTO;
3134
3622
  exports.Table = Table;
3135
3623
  exports.TableBody = TableBody;
3136
3624
  exports.TableCaption = TableCaption;
@@ -3147,18 +3635,22 @@ exports.TabsTrigger = TabsTrigger;
3147
3635
  exports.TalkCard = TalkCard;
3148
3636
  exports.Text = Text;
3149
3637
  exports.Textarea = Textarea;
3638
+ exports.ThemeToggle = ThemeToggle;
3150
3639
  exports.Toast = Toast;
3151
3640
  exports.ToastAction = ToastAction;
3152
3641
  exports.ToastDescription = ToastDescription;
3153
3642
  exports.ToastProvider = ToastProvider;
3154
3643
  exports.ToastTitle = ToastTitle;
3155
3644
  exports.ToastViewport = ToastViewport;
3645
+ exports.Toaster = Toaster;
3156
3646
  exports.Tooltip = Tooltip;
3157
3647
  exports.TooltipContent = TooltipContent;
3158
3648
  exports.TooltipProvider = TooltipProvider;
3159
3649
  exports.TooltipTrigger = TooltipTrigger;
3160
3650
  exports.alertVariants = alert;
3161
3651
  exports.aletas = aletas;
3652
+ exports.alternarTema = alternarTema;
3653
+ exports.aplicarTema = aplicarTema;
3162
3654
  exports.avatarVariants = avatar;
3163
3655
  exports.badgeVariants = badge;
3164
3656
  exports.brand = brand;
@@ -3169,6 +3661,7 @@ exports.cn = cn;
3169
3661
  exports.colors = colors;
3170
3662
  exports.control = control;
3171
3663
  exports.dark = dark;
3664
+ exports.escucharTema = escucharTema;
3172
3665
  exports.fonts = fonts;
3173
3666
  exports.gradient = gradient;
3174
3667
  exports.light = light;
@@ -3179,13 +3672,20 @@ exports.motion = motion;
3179
3672
  exports.naming = naming;
3180
3673
  exports.poses = poses;
3181
3674
  exports.radius = radius;
3675
+ exports.scriptTema = scriptTema;
3676
+ exports.series = series;
3182
3677
  exports.shadow = shadow;
3183
3678
  exports.sintaxis = sintaxis;
3184
3679
  exports.size = size;
3185
3680
  exports.social = social_exports;
3186
3681
  exports.spacing = spacing;
3187
3682
  exports.tagline = tagline;
3683
+ exports.temaActual = temaActual;
3684
+ exports.temaGuardado = temaGuardado;
3685
+ exports.temaPreferido = temaPreferido;
3188
3686
  exports.textVariants = texto;
3687
+ exports.toast = toast2;
3189
3688
  exports.tokens = tokens;
3190
3689
  exports.typeScale = typeScale;
3690
+ exports.useTema = useTema;
3191
3691
  exports.usoDeCara = usoDeCara;