@eduardoalvarez/arrecife 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +121 -1
  3. package/dist/brand/index.cjs +29 -10
  4. package/dist/brand/index.d.cts +9 -1
  5. package/dist/brand/index.d.ts +9 -1
  6. package/dist/brand/index.js +4 -2
  7. package/dist/chart/index.cjs +287 -0
  8. package/dist/chart/index.d.cts +127 -0
  9. package/dist/chart/index.d.ts +127 -0
  10. package/dist/chart/index.js +103 -0
  11. package/dist/chunk-KPZNNMV5.js +83 -0
  12. package/dist/chunk-MLKGABMK.js +7 -0
  13. package/dist/chunk-NHS7ETKJ.js +27 -0
  14. package/dist/{chunk-I7GYZD2A.js → chunk-TSPJOM6K.js} +5 -7
  15. package/dist/chunk-UOWIDFCB.js +81 -0
  16. package/dist/{chunk-VSMW2CT4.js → chunk-VPT32GPG.js} +2 -1
  17. package/dist/{chunk-ND45OQOC.js → chunk-YZ2SDOVZ.js} +29 -35
  18. package/dist/chunk-ZEOQKRQ7.js +19 -0
  19. package/dist/form/index.cjs +301 -0
  20. package/dist/form/index.d.cts +86 -0
  21. package/dist/form/index.d.ts +86 -0
  22. package/dist/form/index.js +84 -0
  23. package/dist/index.cjs +1094 -293
  24. package/dist/index.d.cts +452 -37
  25. package/dist/index.d.ts +452 -37
  26. package/dist/index.js +963 -373
  27. package/dist/label-DuTvJGxD.d.cts +14 -0
  28. package/dist/label-DuTvJGxD.d.ts +14 -0
  29. package/dist/og/index.js +2 -1
  30. package/dist/shiki/index.js +2 -1
  31. package/dist/tema/index.cjs +94 -0
  32. package/dist/tema/index.d.cts +110 -0
  33. package/dist/tema/index.d.ts +110 -0
  34. package/dist/tema/index.js +2 -0
  35. package/dist/tokens/index.cjs +6 -0
  36. package/dist/tokens/index.d.cts +33 -1
  37. package/dist/tokens/index.d.ts +33 -1
  38. package/dist/tokens/index.js +3 -2
  39. package/dist/tokens/theme.css +43 -0
  40. package/llms.txt +351 -44
  41. package/package.json +31 -2
package/dist/index.cjs CHANGED
@@ -1,11 +1,14 @@
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');
11
+ var react = require('react');
9
12
  var locale = require('date-fns/locale');
10
13
  var reactDayPicker = require('react-day-picker');
11
14
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
@@ -21,7 +24,7 @@ var SwitchPrimitive = require('@radix-ui/react-switch');
21
24
  var TabsPrimitive = require('@radix-ui/react-tabs');
22
25
  var ToastPrimitive = require('@radix-ui/react-toast');
23
26
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
24
- var react = require('react');
27
+ var dateFns = require('date-fns');
25
28
 
26
29
  function _interopNamespace(e) {
27
30
  if (e && e.__esModule) return e;
@@ -41,6 +44,8 @@ function _interopNamespace(e) {
41
44
  return Object.freeze(n);
42
45
  }
43
46
 
47
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
48
+ var AlertDialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(AlertDialogPrimitive);
44
49
  var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
45
50
  var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
46
51
  var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
@@ -249,6 +254,10 @@ var sintaxis = {
249
254
  /** `markup.deleted`, `invalid`. */
250
255
  invalido: dark.error
251
256
  };
257
+ var series = {
258
+ dark: [dark.accent, dark.warm, brand.body, dark.textMuted],
259
+ light: [light.accent, light.warm, brand.body, light.textMuted]
260
+ };
252
261
  var profundo = "#0D2129";
253
262
  var gradient = {
254
263
  dark: {
@@ -299,11 +308,94 @@ var tokens = {
299
308
  size,
300
309
  gradient,
301
310
  sintaxis,
311
+ series,
302
312
  shadow,
303
313
  motion,
304
314
  tagline,
305
315
  naming
306
316
  };
317
+
318
+ // src/tema/index.ts
319
+ var TEMA_CLAVE = "arrecife-tema";
320
+ var TEMA_ATRIBUTO = "data-theme";
321
+ var TEMA_EVENTO = "arrecife:tema";
322
+ var esTema = (valor) => valor === "dark" || valor === "light";
323
+ function temaActual() {
324
+ if (typeof document === "undefined") return "dark";
325
+ const puesto = document.documentElement.getAttribute(TEMA_ATRIBUTO);
326
+ return esTema(puesto) ? puesto : "dark";
327
+ }
328
+ function temaGuardado() {
329
+ if (typeof localStorage === "undefined") return null;
330
+ try {
331
+ const valor = localStorage.getItem(TEMA_CLAVE);
332
+ return esTema(valor) ? valor : null;
333
+ } catch {
334
+ return null;
335
+ }
336
+ }
337
+ function temaPreferido() {
338
+ const guardado = temaGuardado();
339
+ if (guardado) return guardado;
340
+ if (typeof matchMedia === "undefined") return "dark";
341
+ return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
342
+ }
343
+ function aplicarTema(tema, persistir = true) {
344
+ if (typeof document === "undefined") return;
345
+ document.documentElement.setAttribute(TEMA_ATRIBUTO, tema);
346
+ document.documentElement.style.colorScheme = tema;
347
+ if (persistir) {
348
+ try {
349
+ localStorage.setItem(TEMA_CLAVE, tema);
350
+ } catch {
351
+ }
352
+ }
353
+ dispatchEvent(new CustomEvent(TEMA_EVENTO, { detail: tema }));
354
+ }
355
+ function alternarTema() {
356
+ const siguiente = temaActual() === "dark" ? "light" : "dark";
357
+ aplicarTema(siguiente);
358
+ return siguiente;
359
+ }
360
+ function escucharTema(alCambiar) {
361
+ if (typeof window === "undefined") return () => {
362
+ };
363
+ const propio = (evento) => {
364
+ const detalle = evento.detail;
365
+ if (esTema(detalle)) alCambiar(detalle);
366
+ };
367
+ const otraPestana = (evento) => {
368
+ if (evento.key !== TEMA_CLAVE) return;
369
+ const tema = esTema(evento.newValue) ? evento.newValue : temaPreferido();
370
+ aplicarTema(tema, false);
371
+ alCambiar(tema);
372
+ };
373
+ addEventListener(TEMA_EVENTO, propio);
374
+ addEventListener("storage", otraPestana);
375
+ return () => {
376
+ removeEventListener(TEMA_EVENTO, propio);
377
+ removeEventListener("storage", otraPestana);
378
+ };
379
+ }
380
+ var scriptTema = [
381
+ "(function () {",
382
+ " var CLAVE = " + JSON.stringify(TEMA_CLAVE) + ";",
383
+ " function resolver() {",
384
+ " try {",
385
+ " var guardado = localStorage.getItem(CLAVE);",
386
+ ' if (guardado === "dark" || guardado === "light") return guardado;',
387
+ " } catch (e) {}",
388
+ ' return matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";',
389
+ " }",
390
+ " function aplicar() {",
391
+ " var tema = resolver();",
392
+ " document.documentElement.setAttribute(" + JSON.stringify(TEMA_ATRIBUTO) + ", tema);",
393
+ " document.documentElement.style.colorScheme = tema;",
394
+ " }",
395
+ " aplicar();",
396
+ ' document.addEventListener("astro:after-swap", aplicar);',
397
+ "})();"
398
+ ].join("\n");
307
399
  var kebab = (nombre) => nombre.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
308
400
  var escalas = Object.keys(typeScale);
309
401
  var radios = Object.keys(radius);
@@ -325,6 +417,178 @@ var twMerge = tailwindMerge.extendTailwindMerge({
325
417
  function cn(...inputs) {
326
418
  return twMerge(clsx.clsx(inputs));
327
419
  }
420
+ function Glyph({ children, ...props }) {
421
+ return /* @__PURE__ */ jsxRuntime.jsx(
422
+ "svg",
423
+ {
424
+ viewBox: "0 0 16 16",
425
+ width: "1em",
426
+ height: "1em",
427
+ fill: "none",
428
+ stroke: "currentColor",
429
+ strokeWidth: 1.75,
430
+ strokeLinecap: "round",
431
+ strokeLinejoin: "round",
432
+ "aria-hidden": "true",
433
+ focusable: "false",
434
+ ...props,
435
+ children
436
+ }
437
+ );
438
+ }
439
+ var Check = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
440
+ var Minus = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.5 8h9" }) });
441
+ var ChevronDown = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6l4 4 4-4" }) });
442
+ var ChevronUp = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4-4 4 4" }) });
443
+ var ChevronLeft = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4L6 8l4 4" }) });
444
+ var ChevronRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4l4 4-4 4" }) });
445
+ var Close = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
446
+ var Copy = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
447
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
448
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
449
+ ] });
450
+ var ArrowUpRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
451
+ var Ellipsis = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
452
+ var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
453
+ "svg",
454
+ {
455
+ viewBox: "0 0 16 16",
456
+ width: "1em",
457
+ height: "1em",
458
+ fill: "none",
459
+ stroke: "currentColor",
460
+ strokeWidth: 2,
461
+ strokeLinecap: "round",
462
+ "aria-hidden": "true",
463
+ focusable: "false",
464
+ className: "motion-safe:animate-spin",
465
+ ...props,
466
+ children: [
467
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
468
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
469
+ ]
470
+ }
471
+ );
472
+ var Camara = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
473
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 5.5h2.6l1-1.5h4.8l1 1.5H14v7.5H2z" }),
474
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "9", r: "2.4" })
475
+ ] });
476
+ var Sol = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
477
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "3" }),
478
+ /* @__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" })
479
+ ] });
480
+ 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" }) });
481
+ function GlifoMedia({ children, ...props }) {
482
+ return /* @__PURE__ */ jsxRuntime.jsx(
483
+ "svg",
484
+ {
485
+ xmlns: "http://www.w3.org/2000/svg",
486
+ viewBox: "0 0 24 24",
487
+ fill: "none",
488
+ "aria-hidden": "true",
489
+ focusable: "false",
490
+ ...props,
491
+ children
492
+ }
493
+ );
494
+ }
495
+ var Play = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
496
+ var Pause = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
497
+ var Retry = (props) => /* @__PURE__ */ jsxRuntime.jsx(
498
+ GlifoMedia,
499
+ {
500
+ stroke: "currentColor",
501
+ strokeWidth: 2,
502
+ strokeLinecap: "round",
503
+ strokeLinejoin: "round",
504
+ ...props,
505
+ 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" })
506
+ }
507
+ );
508
+ var GoBackSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
509
+ /* @__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" }),
510
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
511
+ /* @__PURE__ */ jsxRuntime.jsx(
512
+ "path",
513
+ {
514
+ 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",
515
+ strokeLinejoin: "round"
516
+ }
517
+ )
518
+ ] });
519
+ var AdvanceSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
520
+ /* @__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" }),
521
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
522
+ /* @__PURE__ */ jsxRuntime.jsx(
523
+ "path",
524
+ {
525
+ 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",
526
+ strokeLinejoin: "round"
527
+ }
528
+ )
529
+ ] });
530
+ 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" }) });
531
+ 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" }) });
532
+ function Accordion({ className, ...props }) {
533
+ return /* @__PURE__ */ jsxRuntime.jsx(
534
+ AccordionPrimitive__namespace.Root,
535
+ {
536
+ className: cn("border-hairline w-full border-t", className),
537
+ ...props
538
+ }
539
+ );
540
+ }
541
+ function AccordionItem({
542
+ className,
543
+ ...props
544
+ }) {
545
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Item, { className: cn("border-hairline border-b", className), ...props });
546
+ }
547
+ function AccordionTrigger({
548
+ className,
549
+ children,
550
+ headingLevel = 3,
551
+ ...props
552
+ }) {
553
+ const Encabezado = `h${headingLevel}`;
554
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Encabezado, { children: /* @__PURE__ */ jsxRuntime.jsxs(
555
+ AccordionPrimitive__namespace.Trigger,
556
+ {
557
+ className: cn(
558
+ "gap-step-sm py-step-sm flex w-full cursor-pointer items-center justify-between text-left",
559
+ "font-sans text-lead font-medium text-text-primary",
560
+ "transition-standard",
561
+ "hover:text-accent",
562
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
563
+ "disabled:pointer-events-none disabled:opacity-50",
564
+ "[&[data-state=open]>svg]:rotate-180",
565
+ className
566
+ ),
567
+ ...props,
568
+ children: [
569
+ children,
570
+ /* @__PURE__ */ jsxRuntime.jsx(ChevronDown, { className: "text-text-muted shrink-0" })
571
+ ]
572
+ }
573
+ ) }) });
574
+ }
575
+ function AccordionContent({
576
+ className,
577
+ children,
578
+ ...props
579
+ }) {
580
+ return /* @__PURE__ */ jsxRuntime.jsx(
581
+ AccordionPrimitive__namespace.Content,
582
+ {
583
+ className: cn(
584
+ "overflow-hidden",
585
+ "motion-safe:data-[state=open]:desplegar motion-safe:data-[state=closed]:replegar"
586
+ ),
587
+ ...props,
588
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pb-step-md font-sans text-ui text-text-secondary max-w-measure", className), children })
589
+ }
590
+ );
591
+ }
328
592
  var alert = classVarianceAuthority.cva("w-full rounded-card border p-step-md font-sans text-ui", {
329
593
  variants: {
330
594
  variant: {
@@ -395,273 +659,329 @@ function Alert({
395
659
  }
396
660
  );
397
661
  }
398
- var avatar = classVarianceAuthority.cva(
399
- "relative flex shrink-0 overflow-hidden rounded-pill bg-surface-raised border border-hairline",
662
+ var button = classVarianceAuthority.cva(
663
+ [
664
+ "inline-flex cursor-pointer items-center justify-center gap-step-xs whitespace-nowrap select-none",
665
+ "rounded-control font-sans font-medium",
666
+ "transition-standard",
667
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
668
+ "disabled:pointer-events-none disabled:opacity-50",
669
+ "[&_svg]:shrink-0"
670
+ ],
400
671
  {
401
672
  variants: {
673
+ variant: {
674
+ primary: [
675
+ "bg-accent text-accent-on hover:bg-accent-hover",
676
+ "light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
677
+ ],
678
+ conversion: "bg-warm text-warm-on hover:bg-warm-hover",
679
+ secondary: [
680
+ "border-hairline-hover border bg-transparent text-text-primary",
681
+ "hover:border-accent hover:text-accent"
682
+ ],
683
+ tertiary: [
684
+ "bg-transparent font-mono font-normal text-text-secondary",
685
+ "hover:text-accent hover:underline hover:underline-offset-4"
686
+ ]
687
+ },
402
688
  size: {
403
- sm: "size-8",
404
- md: "size-10",
405
- lg: "size-14",
406
- xl: "size-24"
689
+ sm: "h-8 px-control-sm text-label",
690
+ md: "h-10 px-control-md text-ui",
691
+ lg: "h-12 px-control-lg text-lead",
692
+ /** Cuadrado 42×42, sin texto. Lleva `aria-label` obligatorio. */
693
+ icon: "size-control-icon p-0"
407
694
  }
408
695
  },
409
- defaultVariants: { size: "md" }
696
+ compoundVariants: [
697
+ /**
698
+ * El terciario no tiene caja: ni padding horizontal ni alto de control.
699
+ * Va aquí y no como `px-0` en la variante para que gane al `px-*` del
700
+ * tamaño sin depender del orden en que cva concatena las clases.
701
+ */
702
+ { variant: "tertiary", size: ["sm", "md", "lg"], class: "h-auto px-0" }
703
+ ],
704
+ defaultVariants: { variant: "primary", size: "md" }
410
705
  }
411
706
  );
412
- function Avatar({ className, size: size2, ...props }) {
413
- return /* @__PURE__ */ jsxRuntime.jsx(AvatarPrimitive__namespace.Root, { className: cn(avatar({ size: size2 }), className), ...props });
414
- }
415
- function AvatarImage({
707
+ function Button({
416
708
  className,
709
+ variant,
710
+ size: size2,
711
+ asChild = false,
712
+ loading = false,
713
+ icon,
714
+ children,
715
+ disabled,
417
716
  ...props
418
717
  }) {
419
- return /* @__PURE__ */ jsxRuntime.jsx(AvatarPrimitive__namespace.Image, { className: cn("aspect-square size-full object-cover", className), ...props });
718
+ if (asChild) {
719
+ return /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
720
+ }
721
+ return /* @__PURE__ */ jsxRuntime.jsxs(
722
+ "button",
723
+ {
724
+ className: cn(button({ variant, size: size2 }), className),
725
+ disabled: disabled === true || loading,
726
+ "aria-busy": loading || void 0,
727
+ ...props,
728
+ children: [
729
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : icon,
730
+ children
731
+ ]
732
+ }
733
+ );
420
734
  }
421
- function AvatarFallback({
735
+ var AlertDialog = AlertDialogPrimitive__namespace.Root;
736
+ var AlertDialogTrigger = AlertDialogPrimitive__namespace.Trigger;
737
+ function AlertDialogOverlay({
422
738
  className,
423
739
  ...props
424
740
  }) {
425
741
  return /* @__PURE__ */ jsxRuntime.jsx(
426
- AvatarPrimitive__namespace.Fallback,
742
+ AlertDialogPrimitive__namespace.Overlay,
427
743
  {
428
- className: cn(
429
- "text-label font-mono text-text-secondary flex size-full items-center justify-center uppercase",
430
- className
431
- ),
744
+ className: cn("bg-brand-hull/70 fixed inset-0 z-50", className),
432
745
  ...props
433
746
  }
434
747
  );
435
748
  }
436
- var badge = classVarianceAuthority.cva(
437
- ["inline-flex items-center gap-step-xs", "rounded-chip px-step-xs py-0.5", "font-sans text-tag", "transition-standard"],
438
- {
439
- variants: {
440
- variant: {
441
- neutral: "bg-surface-raised text-text-secondary",
442
- accent: "bg-accent/8 text-text-primary",
443
- warm: "bg-warm/8 text-text-primary",
444
- success: "bg-success/8 text-text-primary",
445
- warning: "bg-warning/8 text-text-primary",
446
- error: "bg-error/8 text-text-primary"
749
+ function AlertDialogContent({
750
+ className,
751
+ children,
752
+ ...props
753
+ }) {
754
+ return /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogPrimitive__namespace.Portal, { children: [
755
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogOverlay, {}),
756
+ /* @__PURE__ */ jsxRuntime.jsx(
757
+ AlertDialogPrimitive__namespace.Content,
758
+ {
759
+ className: cn(
760
+ "fixed top-1/2 left-1/2 z-50 w-full max-w-content -translate-x-1/2 -translate-y-1/2",
761
+ "gap-step-md p-step-lg flex flex-col",
762
+ "rounded-panel border-border bg-surface shadow-standard border",
763
+ "text-text-primary font-sans",
764
+ className
765
+ ),
766
+ ...props,
767
+ children
447
768
  }
448
- },
449
- defaultVariants: { variant: "neutral" }
450
- }
451
- );
452
- function Badge({ className, variant, ...props }) {
453
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(badge({ variant }), className), ...props });
769
+ )
770
+ ] });
454
771
  }
455
- var categoria = classVarianceAuthority.cva(
456
- [
457
- "inline-flex items-center gap-step-xs",
458
- "rounded-pill px-step-sm py-0.5",
459
- "font-mono text-chip",
460
- "border transition-standard"
461
- ],
462
- {
463
- variants: {
464
- active: {
465
- false: "border-warm/28 bg-transparent text-warm",
466
- true: "border-warm bg-warm text-warm-on"
467
- }
468
- },
469
- defaultVariants: { active: false }
470
- }
471
- );
472
- function CategoryBadge({ className, active = false, ...props }) {
772
+ function AlertDialogHeader({ className, ...props }) {
773
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("gap-step-xs flex flex-col", className), ...props });
774
+ }
775
+ function AlertDialogFooter({ className, ...props }) {
473
776
  return /* @__PURE__ */ jsxRuntime.jsx(
474
- "span",
777
+ "div",
475
778
  {
476
- "data-active": active || void 0,
477
- className: cn(categoria({ active }), className),
779
+ className: cn("gap-step-sm flex flex-col-reverse sm:flex-row sm:justify-end", className),
478
780
  ...props
479
781
  }
480
782
  );
481
783
  }
482
- var metrica = ["inline-flex items-center gap-step-xs", "rounded-pill", "font-mono text-chip text-text-muted"];
483
- function MetricBadge({ className, boxed = false, ...props }) {
784
+ function AlertDialogTitle({
785
+ className,
786
+ ...props
787
+ }) {
484
788
  return /* @__PURE__ */ jsxRuntime.jsx(
485
- "span",
789
+ AlertDialogPrimitive__namespace.Title,
486
790
  {
487
- className: cn(metrica, boxed && "border-hairline px-step-sm py-0.5 border", className),
791
+ className: cn("text-h3 font-display text-text-primary", className),
488
792
  ...props
489
793
  }
490
794
  );
491
795
  }
492
- function Glyph({ children, ...props }) {
796
+ function AlertDialogDescription({
797
+ className,
798
+ ...props
799
+ }) {
493
800
  return /* @__PURE__ */ jsxRuntime.jsx(
494
- "svg",
801
+ AlertDialogPrimitive__namespace.Description,
495
802
  {
496
- viewBox: "0 0 16 16",
497
- width: "1em",
498
- height: "1em",
499
- fill: "none",
500
- stroke: "currentColor",
501
- strokeWidth: 1.75,
502
- strokeLinecap: "round",
503
- strokeLinejoin: "round",
504
- "aria-hidden": "true",
505
- focusable: "false",
506
- ...props,
507
- children
803
+ className: cn("text-ui text-text-secondary max-w-measure", className),
804
+ ...props
508
805
  }
509
806
  );
510
807
  }
511
- var Check = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8.5 6.5 12 13 4.5" }) });
512
- var Minus = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.5 8h9" }) });
513
- var ChevronDown = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 6l4 4 4-4" }) });
514
- var ChevronUp = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4-4 4 4" }) });
515
- var ChevronLeft = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 4L6 8l4 4" }) });
516
- var ChevronRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4l4 4-4 4" }) });
517
- var Close = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) });
518
- var Copy = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
519
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "5.5", y: "5.5", width: "8", height: "8", rx: "1.5" }),
520
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.5 3.5h-7a1.5 1.5 0 0 0-1.5 1.5v7" })
521
- ] });
522
- var ArrowUpRight = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 11l6-6M5.5 5h5.5v5.5" }) });
523
- var Ellipsis = (props) => /* @__PURE__ */ jsxRuntime.jsx(Glyph, { ...props, strokeWidth: 2.25, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 8h.01M8 8h.01M12 8h.01" }) });
524
- var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
525
- "svg",
808
+ function AlertDialogCancel({
809
+ className,
810
+ ...props
811
+ }) {
812
+ return /* @__PURE__ */ jsxRuntime.jsx(
813
+ AlertDialogPrimitive__namespace.Cancel,
814
+ {
815
+ className: cn(button({ variant: "secondary" }), className),
816
+ ...props
817
+ }
818
+ );
819
+ }
820
+ function AlertDialogAction({
821
+ className,
822
+ ...props
823
+ }) {
824
+ return /* @__PURE__ */ jsxRuntime.jsx(
825
+ AlertDialogPrimitive__namespace.Action,
826
+ {
827
+ className: cn(button({ variant: "primary" }), className),
828
+ ...props
829
+ }
830
+ );
831
+ }
832
+ var avatar = classVarianceAuthority.cva(
833
+ "relative flex shrink-0 overflow-hidden rounded-pill bg-surface-raised border border-hairline",
526
834
  {
527
- viewBox: "0 0 16 16",
528
- width: "1em",
529
- height: "1em",
530
- fill: "none",
531
- stroke: "currentColor",
532
- strokeWidth: 2,
533
- strokeLinecap: "round",
534
- "aria-hidden": "true",
535
- focusable: "false",
536
- className: "motion-safe:animate-spin",
537
- ...props,
538
- children: [
539
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6", opacity: 0.3 }),
540
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 2a6 6 0 0 1 6 6" })
541
- ]
835
+ variants: {
836
+ size: {
837
+ sm: "size-8",
838
+ md: "size-10",
839
+ lg: "size-14",
840
+ xl: "size-24"
841
+ }
842
+ },
843
+ defaultVariants: { size: "md" }
542
844
  }
543
845
  );
544
- function GlifoMedia({ children, ...props }) {
846
+ function Avatar({ className, size: size2, ...props }) {
847
+ return /* @__PURE__ */ jsxRuntime.jsx(AvatarPrimitive__namespace.Root, { className: cn(avatar({ size: size2 }), className), ...props });
848
+ }
849
+ function AvatarImage({
850
+ className,
851
+ ...props
852
+ }) {
853
+ return /* @__PURE__ */ jsxRuntime.jsx(AvatarPrimitive__namespace.Image, { className: cn("aspect-square size-full object-cover", className), ...props });
854
+ }
855
+ function AvatarFallback({
856
+ className,
857
+ ...props
858
+ }) {
545
859
  return /* @__PURE__ */ jsxRuntime.jsx(
546
- "svg",
860
+ AvatarPrimitive__namespace.Fallback,
547
861
  {
548
- xmlns: "http://www.w3.org/2000/svg",
549
- viewBox: "0 0 24 24",
550
- fill: "none",
551
- "aria-hidden": "true",
552
- focusable: "false",
553
- ...props,
554
- children
862
+ className: cn(
863
+ "text-label font-mono text-text-secondary flex size-full items-center justify-center uppercase",
864
+ className
865
+ ),
866
+ ...props
555
867
  }
556
868
  );
557
869
  }
558
- var Play = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
559
- var Pause = (props) => /* @__PURE__ */ jsxRuntime.jsx(GlifoMedia, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
560
- var Retry = (props) => /* @__PURE__ */ jsxRuntime.jsx(
561
- GlifoMedia,
870
+ function AvatarUpload({
871
+ src,
872
+ fallback,
873
+ onSelectFile,
874
+ accept = "image/*",
875
+ label = "Cambiar la foto",
876
+ size: size2,
877
+ disabled = false,
878
+ className,
879
+ ...props
880
+ }) {
881
+ const id = react.useId();
882
+ const [previa, setPrevia] = react.useState(null);
883
+ react.useEffect(() => {
884
+ if (!previa) return;
885
+ return () => URL.revokeObjectURL(previa);
886
+ }, [previa]);
887
+ function elegir(evento) {
888
+ const archivo = evento.target.files?.[0];
889
+ if (!archivo) return;
890
+ setPrevia(URL.createObjectURL(archivo));
891
+ onSelectFile?.(archivo);
892
+ evento.target.value = "";
893
+ }
894
+ const imagen = previa ?? src;
895
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative inline-flex", className), ...props, children: [
896
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { size: size2, children: [
897
+ imagen ? /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: imagen, alt: "" }) : null,
898
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: fallback })
899
+ ] }),
900
+ /* @__PURE__ */ jsxRuntime.jsxs(
901
+ "label",
902
+ {
903
+ htmlFor: id,
904
+ className: cn(
905
+ "rounded-pill absolute -right-1 -bottom-1 flex size-6 cursor-pointer items-center justify-center",
906
+ "border-hairline bg-surface-raised text-text-secondary border",
907
+ "transition-standard hover:text-accent hover:border-accent",
908
+ // El foco vive en el input, que está oculto: sin esto, tabular hasta
909
+ // el control no se ve por ninguna parte.
910
+ "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-accent",
911
+ disabled && "pointer-events-none opacity-50"
912
+ ),
913
+ children: [
914
+ /* @__PURE__ */ jsxRuntime.jsx(Camara, { "aria-hidden": "true" }),
915
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label }),
916
+ /* @__PURE__ */ jsxRuntime.jsx(
917
+ "input",
918
+ {
919
+ id,
920
+ type: "file",
921
+ accept,
922
+ disabled,
923
+ onChange: elegir,
924
+ className: "sr-only"
925
+ }
926
+ )
927
+ ]
928
+ }
929
+ )
930
+ ] });
931
+ }
932
+ var badge = classVarianceAuthority.cva(
933
+ ["inline-flex items-center gap-step-xs", "rounded-chip px-step-xs py-0.5", "font-sans text-tag", "transition-standard"],
562
934
  {
563
- stroke: "currentColor",
564
- strokeWidth: 2,
565
- strokeLinecap: "round",
566
- strokeLinejoin: "round",
567
- ...props,
568
- 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" })
935
+ variants: {
936
+ variant: {
937
+ neutral: "bg-surface-raised text-text-secondary",
938
+ accent: "bg-accent/8 text-text-primary",
939
+ warm: "bg-warm/8 text-text-primary",
940
+ success: "bg-success/8 text-text-primary",
941
+ warning: "bg-warning/8 text-text-primary",
942
+ error: "bg-error/8 text-text-primary"
943
+ }
944
+ },
945
+ defaultVariants: { variant: "neutral" }
569
946
  }
570
947
  );
571
- var GoBackSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
572
- /* @__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" }),
573
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
574
- /* @__PURE__ */ jsxRuntime.jsx(
575
- "path",
576
- {
577
- 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",
578
- strokeLinejoin: "round"
579
- }
580
- )
581
- ] });
582
- var AdvanceSeconds = (props) => /* @__PURE__ */ jsxRuntime.jsxs(GlifoMedia, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
583
- /* @__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" }),
584
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
585
- /* @__PURE__ */ jsxRuntime.jsx(
586
- "path",
587
- {
588
- 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",
589
- strokeLinejoin: "round"
590
- }
591
- )
592
- ] });
593
- 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" }) });
594
- 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" }) });
595
- var button = classVarianceAuthority.cva(
948
+ function Badge({ className, variant, ...props }) {
949
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(badge({ variant }), className), ...props });
950
+ }
951
+ var categoria = classVarianceAuthority.cva(
596
952
  [
597
- "inline-flex cursor-pointer items-center justify-center gap-step-xs whitespace-nowrap select-none",
598
- "rounded-control font-sans font-medium",
599
- "transition-standard",
600
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
601
- "disabled:pointer-events-none disabled:opacity-50",
602
- "[&_svg]:shrink-0"
953
+ "inline-flex items-center gap-step-xs",
954
+ "rounded-pill px-step-sm py-0.5",
955
+ "font-mono text-chip",
956
+ "border transition-standard"
603
957
  ],
604
958
  {
605
959
  variants: {
606
- variant: {
607
- primary: [
608
- "bg-accent text-accent-on hover:bg-accent-hover",
609
- "light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
610
- ],
611
- conversion: "bg-warm text-warm-on hover:bg-warm-hover",
612
- secondary: [
613
- "border-hairline-hover border bg-transparent text-text-primary",
614
- "hover:border-accent hover:text-accent"
615
- ],
616
- tertiary: [
617
- "bg-transparent font-mono font-normal text-text-secondary",
618
- "hover:text-accent hover:underline hover:underline-offset-4"
619
- ]
620
- },
621
- size: {
622
- sm: "h-8 px-control-sm text-label",
623
- md: "h-10 px-control-md text-ui",
624
- lg: "h-12 px-control-lg text-lead",
625
- /** Cuadrado 42×42, sin texto. Lleva `aria-label` obligatorio. */
626
- icon: "size-control-icon p-0"
960
+ active: {
961
+ false: "border-warm/28 bg-transparent text-warm",
962
+ true: "border-warm bg-warm text-warm-on"
627
963
  }
628
964
  },
629
- compoundVariants: [
630
- /**
631
- * El terciario no tiene caja: ni padding horizontal ni alto de control.
632
- * Va aquí y no como `px-0` en la variante para que gane al `px-*` del
633
- * tamaño sin depender del orden en que cva concatena las clases.
634
- */
635
- { variant: "tertiary", size: ["sm", "md", "lg"], class: "h-auto px-0" }
636
- ],
637
- defaultVariants: { variant: "primary", size: "md" }
965
+ defaultVariants: { active: false }
638
966
  }
639
967
  );
640
- function Button({
641
- className,
642
- variant,
643
- size: size2,
644
- asChild = false,
645
- loading = false,
646
- icon,
647
- children,
648
- disabled,
649
- ...props
650
- }) {
651
- if (asChild) {
652
- return /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
653
- }
654
- return /* @__PURE__ */ jsxRuntime.jsxs(
655
- "button",
968
+ function CategoryBadge({ className, active = false, ...props }) {
969
+ return /* @__PURE__ */ jsxRuntime.jsx(
970
+ "span",
656
971
  {
657
- className: cn(button({ variant, size: size2 }), className),
658
- disabled: disabled === true || loading,
659
- "aria-busy": loading || void 0,
660
- ...props,
661
- children: [
662
- loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : icon,
663
- children
664
- ]
972
+ "data-active": active || void 0,
973
+ className: cn(categoria({ active }), className),
974
+ ...props
975
+ }
976
+ );
977
+ }
978
+ var metrica = ["inline-flex items-center gap-step-xs", "rounded-pill", "font-mono text-chip text-text-muted"];
979
+ function MetricBadge({ className, boxed = false, ...props }) {
980
+ return /* @__PURE__ */ jsxRuntime.jsx(
981
+ "span",
982
+ {
983
+ className: cn(metrica, boxed && "border-hairline px-step-sm py-0.5 border", className),
984
+ ...props
665
985
  }
666
986
  );
667
987
  }
@@ -1700,6 +2020,76 @@ function ToastDescription({
1700
2020
  }) {
1701
2021
  return /* @__PURE__ */ jsxRuntime.jsx(ToastPrimitive__namespace.Description, { className: cn("max-w-measure", className), ...props });
1702
2022
  }
2023
+ var avisos = [];
2024
+ var suscriptores = /* @__PURE__ */ new Set();
2025
+ var contador = 0;
2026
+ function emitir(siguientes) {
2027
+ avisos = siguientes;
2028
+ for (const avisar of suscriptores) avisar();
2029
+ }
2030
+ var suscribirse = (avisar) => {
2031
+ suscriptores.add(avisar);
2032
+ return () => {
2033
+ suscriptores.delete(avisar);
2034
+ };
2035
+ };
2036
+ var leer = () => avisos;
2037
+ var VACIO = [];
2038
+ var enServidor = () => VACIO;
2039
+ function crear(mensaje, opciones = {}) {
2040
+ contador += 1;
2041
+ const id = `arrecife-toast-${contador}`;
2042
+ const { description, ...resto } = opciones;
2043
+ emitir([
2044
+ ...avisos,
2045
+ {
2046
+ ...resto,
2047
+ // El primer argumento es la línea principal. Si además llega `title`, el
2048
+ // mensaje pasa a ser la descripción: así `toast('Guardado')` y
2049
+ // `toast('No se pudo guardar', { title: 'Error' })` se leen igual de bien.
2050
+ ...opciones.title ? { description: description ?? mensaje } : { title: mensaje, ...description === void 0 ? {} : { description } },
2051
+ id,
2052
+ abierto: true
2053
+ }
2054
+ ]);
2055
+ return id;
2056
+ }
2057
+ function descartar(id) {
2058
+ emitir(avisos.map((a) => id === void 0 || a.id === id ? { ...a, abierto: false } : a));
2059
+ }
2060
+ function retirar(id) {
2061
+ emitir(avisos.filter((a) => a.id !== id));
2062
+ }
2063
+ var toast2 = Object.assign(crear, {
2064
+ success: (mensaje, opciones = {}) => crear(mensaje, { ...opciones, variant: "success" }),
2065
+ error: (mensaje, opciones = {}) => crear(mensaje, { ...opciones, variant: "error" }),
2066
+ dismiss: descartar
2067
+ });
2068
+ function Toaster({ duration = 5e3, label = "Avisos" }) {
2069
+ const lista = react.useSyncExternalStore(suscribirse, leer, enServidor);
2070
+ return /* @__PURE__ */ jsxRuntime.jsxs(ToastProvider, { duration, label, children: [
2071
+ lista.map(({ id, title, description, variant, duration: propio, action, abierto }) => /* @__PURE__ */ jsxRuntime.jsxs(
2072
+ Toast,
2073
+ {
2074
+ open: abierto,
2075
+ variant: variant ?? "neutral",
2076
+ ...propio === void 0 ? {} : { duration: propio },
2077
+ onOpenChange: (sigue) => {
2078
+ if (!sigue) retirar(id);
2079
+ },
2080
+ children: [
2081
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
2082
+ title ? /* @__PURE__ */ jsxRuntime.jsx(ToastTitle, { children: title }) : null,
2083
+ description ? /* @__PURE__ */ jsxRuntime.jsx(ToastDescription, { children: description }) : null
2084
+ ] }),
2085
+ action
2086
+ ]
2087
+ },
2088
+ id
2089
+ )),
2090
+ /* @__PURE__ */ jsxRuntime.jsx(ToastViewport, {})
2091
+ ] });
2092
+ }
1703
2093
  var TooltipProvider = TooltipPrimitive__namespace.Provider;
1704
2094
  var Tooltip = TooltipPrimitive__namespace.Root;
1705
2095
  var TooltipTrigger = TooltipPrimitive__namespace.Trigger;
@@ -1739,6 +2129,7 @@ function ArticleCard({
1739
2129
  dateTime,
1740
2130
  readingMinutes,
1741
2131
  tags,
2132
+ headingLevel = 3,
1742
2133
  className,
1743
2134
  ...props
1744
2135
  }) {
@@ -1754,7 +2145,15 @@ function ArticleCard({
1754
2145
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
1755
2146
  m
1756
2147
  ] }, i)) }) : null,
1757
- /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
2148
+ /* @__PURE__ */ jsxRuntime.jsx(
2149
+ Text,
2150
+ {
2151
+ as: headingLevel === 2 ? "h2" : "h3",
2152
+ variant: "h3",
2153
+ className: "group-hover:text-accent transition-standard",
2154
+ children: title
2155
+ }
2156
+ ),
1758
2157
  excerpt ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: excerpt }) : null,
1759
2158
  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
1760
2159
  ] }) });
@@ -2527,40 +2926,231 @@ function EmptyState({
2527
2926
  }
2528
2927
  );
2529
2928
  }
2929
+ var mismoDia = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
2930
+ function aValorDeCampo(fecha) {
2931
+ const dos = (n) => String(n).padStart(2, "0");
2932
+ return `${fecha.getFullYear()}-${dos(fecha.getMonth() + 1)}-${dos(fecha.getDate())}T${dos(
2933
+ fecha.getHours()
2934
+ )}:${dos(fecha.getMinutes())}`;
2935
+ }
2936
+ function EventCalendar({
2937
+ events,
2938
+ onCreateEvent,
2939
+ onUpdateEvent,
2940
+ onDeleteEvent,
2941
+ selected,
2942
+ onSelectDay,
2943
+ formatDay = (dia) => dateFns.format(dia, "EEEE d 'de' MMMM", { locale: locale.es }),
2944
+ formatTime: formatTime2 = (fecha) => dateFns.format(fecha, "HH:mm", { locale: locale.es }),
2945
+ emptyMessage = "Nada en este d\xEDa.",
2946
+ className,
2947
+ ...props
2948
+ }) {
2949
+ const id = react.useId();
2950
+ const [diaInterno, setDiaInterno] = react.useState(() => selected ?? /* @__PURE__ */ new Date());
2951
+ const dia = selected ?? diaInterno;
2952
+ const [mes, setMes] = react.useState(() => dia);
2953
+ const [editando, setEditando] = react.useState(null);
2954
+ const [titulo, setTitulo] = react.useState("");
2955
+ const [cuando, setCuando] = react.useState("");
2956
+ const editable = Boolean(onCreateEvent ?? onUpdateEvent);
2957
+ const delDia = events.filter((e) => mismoDia(e.start, dia)).sort((a, b) => a.start.getTime() - b.start.getTime());
2958
+ function elegirDia(nuevo) {
2959
+ if (!nuevo) return;
2960
+ setDiaInterno(nuevo);
2961
+ setMes(nuevo);
2962
+ onSelectDay?.(nuevo);
2963
+ cancelar();
2964
+ }
2965
+ function cancelar() {
2966
+ setEditando(null);
2967
+ setTitulo("");
2968
+ setCuando("");
2969
+ }
2970
+ function editar(evento) {
2971
+ setEditando(evento.id);
2972
+ setTitulo(evento.title);
2973
+ setCuando(aValorDeCampo(evento.start));
2974
+ }
2975
+ function enviar(e) {
2976
+ e.preventDefault();
2977
+ if (!titulo.trim() || !cuando) return;
2978
+ const start = new Date(cuando);
2979
+ if (Number.isNaN(start.getTime())) return;
2980
+ if (editando) {
2981
+ const previo = events.find((ev) => ev.id === editando);
2982
+ if (previo) onUpdateEvent?.({ ...previo, title: titulo.trim(), start });
2983
+ } else {
2984
+ onCreateEvent?.({ title: titulo.trim(), start });
2985
+ }
2986
+ cancelar();
2987
+ }
2988
+ const conEvento = events.map((e) => e.start);
2989
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("gap-step-lg flex flex-col md:flex-row md:items-start", className), ...props, children: [
2990
+ /* @__PURE__ */ jsxRuntime.jsx(
2991
+ Calendar,
2992
+ {
2993
+ mode: "single",
2994
+ selected: dia,
2995
+ onSelect: elegirDia,
2996
+ month: mes,
2997
+ onMonthChange: setMes,
2998
+ modifiers: { conEvento },
2999
+ modifiersClassNames: {
3000
+ // El punto va bajo el número, no encima del fondo del día: sobre el
3001
+ // seleccionado —que es bioluz sólido— un punto de acento desaparece.
3002
+ // `after:` en Tailwind v4 ya trae `content: ""`, así que no hace falta
3003
+ // declararlo con un valor arbitrario.
3004
+ conEvento: cn(
3005
+ "after:bg-accent after:absolute after:bottom-1 after:left-1/2",
3006
+ "after:size-1 after:-translate-x-1/2 after:rounded-pill",
3007
+ "[&[data-selected=true]]:after:bg-accent-on"
3008
+ )
3009
+ },
3010
+ className: "shrink-0"
3011
+ }
3012
+ ),
3013
+ /* @__PURE__ */ jsxRuntime.jsxs(
3014
+ "section",
3015
+ {
3016
+ "aria-labelledby": `${id}-dia`,
3017
+ className: "border-hairline rounded-card p-step-md gap-step-md flex min-w-0 flex-1 flex-col border",
3018
+ children: [
3019
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", id: `${id}-dia`, className: "first-letter:uppercase", children: formatDay(dia) }),
3020
+ delDia.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-step-xs flex flex-col", children: delDia.map((evento) => /* @__PURE__ */ jsxRuntime.jsxs(
3021
+ "li",
3022
+ {
3023
+ className: "border-hairline gap-step-sm py-step-xs flex items-center border-b last:border-b-0",
3024
+ children: [
3025
+ /* @__PURE__ */ jsxRuntime.jsx(
3026
+ Text,
3027
+ {
3028
+ as: "span",
3029
+ variant: "meta",
3030
+ tone: evento.tone === "warm" ? "warm" : "accent",
3031
+ className: "shrink-0 tabular-nums",
3032
+ children: /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: evento.start.toISOString(), children: formatTime2(evento.start) })
3033
+ }
3034
+ ),
3035
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "span", variant: "ui", className: "min-w-0 flex-1 truncate", children: evento.title }),
3036
+ onUpdateEvent ? /* @__PURE__ */ jsxRuntime.jsx(
3037
+ Button,
3038
+ {
3039
+ variant: "tertiary",
3040
+ size: "sm",
3041
+ onClick: () => editar(evento),
3042
+ "aria-label": `Editar \xAB${evento.title}\xBB`,
3043
+ children: "./editar"
3044
+ }
3045
+ ) : null,
3046
+ onDeleteEvent ? /* @__PURE__ */ jsxRuntime.jsxs(AlertDialog, { children: [
3047
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "tertiary", size: "sm", "aria-label": `Borrar \xAB${evento.title}\xBB`, children: "./borrar" }) }),
3048
+ /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogContent, { children: [
3049
+ /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogHeader, { children: [
3050
+ /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogTitle, { children: [
3051
+ "Borrar \xAB",
3052
+ evento.title,
3053
+ "\xBB"
3054
+ ] }),
3055
+ /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogDescription, { children: [
3056
+ "Se borra del ",
3057
+ formatDay(evento.start),
3058
+ " a las ",
3059
+ formatTime2(evento.start),
3060
+ ". No se puede deshacer."
3061
+ ] })
3062
+ ] }),
3063
+ /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogFooter, { children: [
3064
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogCancel, { children: "Mejor no" }),
3065
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogAction, { onClick: () => onDeleteEvent(evento.id), children: "Borrar el evento" })
3066
+ ] })
3067
+ ] })
3068
+ ] }) : null
3069
+ ]
3070
+ },
3071
+ evento.id
3072
+ )) }) : (
3073
+ // `EmptyState` no: lleva una cara de la mascota, y la mascota tiene
3074
+ // siete sitios contados donde puede aparecer. Un día vacío de una
3075
+ // agenda no es uno de ellos — y en un mes de treinta días, la mitad lo
3076
+ // serían.
3077
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "p", variant: "ui", tone: "muted", children: emptyMessage })
3078
+ ),
3079
+ editable ? /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: enviar, className: "gap-step-sm border-hairline pt-step-md flex flex-col border-t", children: [
3080
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-col", children: [
3081
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: `${id}-titulo`, children: "T\xEDtulo" }),
3082
+ /* @__PURE__ */ jsxRuntime.jsx(
3083
+ Input,
3084
+ {
3085
+ id: `${id}-titulo`,
3086
+ value: titulo,
3087
+ onChange: (e) => setTitulo(e.target.value),
3088
+ placeholder: "Publicar el art\xEDculo",
3089
+ required: true
3090
+ }
3091
+ )
3092
+ ] }),
3093
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-col", children: [
3094
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: `${id}-cuando`, children: "Cu\xE1ndo" }),
3095
+ /* @__PURE__ */ jsxRuntime.jsx(
3096
+ DateField,
3097
+ {
3098
+ id: `${id}-cuando`,
3099
+ withTime: true,
3100
+ value: cuando,
3101
+ onChange: (e) => setCuando(e.target.value),
3102
+ required: true
3103
+ }
3104
+ )
3105
+ ] }),
3106
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex flex-wrap items-center", children: [
3107
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", size: "sm", children: editando ? "Guardar" : "A\xF1adir" }),
3108
+ editando ? /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "tertiary", size: "sm", onClick: cancelar, children: "./cancelar" }) : null
3109
+ ] })
3110
+ ] }) : null
3111
+ ]
3112
+ }
3113
+ )
3114
+ ] });
3115
+ }
2530
3116
  function Footer({
2531
3117
  social,
2532
3118
  year = (/* @__PURE__ */ new Date()).getFullYear(),
2533
3119
  children,
3120
+ brand: brand2,
2534
3121
  className,
2535
3122
  ...props
2536
3123
  }) {
2537
3124
  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: [
3125
+ brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", children: brand2 }) : null,
2538
3126
  children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }) : null,
2539
- social && social.length > 0 ? (
2540
- // 18px de separación, del documento. No es un escalón de `spacing`:
2541
- // es el ritmo de una fila de iconos, no el de una página.
2542
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex items-center gap-[18px]", children: social.map((red) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
2543
- "a",
2544
- {
2545
- href: red.href,
2546
- "aria-label": red.label,
2547
- className: cn(
2548
- "text-text-muted hover:text-accent transition-standard block cursor-pointer text-[19px]",
2549
- "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
2550
- ),
2551
- children: red.icon
2552
- }
2553
- ) }, red.href)) })
2554
- ) : null,
2555
- /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "meta", tone: "muted", as: "p", children: [
2556
- /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "text-accent", children: [
2557
- "$",
2558
- " "
2559
- ] }),
2560
- "cd ~/",
2561
- naming.domain,
2562
- "/",
2563
- year
3127
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex flex-wrap items-center", children: [
3128
+ social && social.length > 0 ? (
3129
+ // 18px de separación, del documento. No es un escalón de `spacing`:
3130
+ // es el ritmo de una fila de iconos, no el de una página.
3131
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex items-center gap-[18px]", children: social.map((red) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
3132
+ "a",
3133
+ {
3134
+ href: red.href,
3135
+ "aria-label": red.label,
3136
+ className: cn(
3137
+ "text-text-muted hover:text-accent transition-standard block cursor-pointer text-[19px]",
3138
+ "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
3139
+ ),
3140
+ children: red.icon
3141
+ }
3142
+ ) }, red.href)) })
3143
+ ) : null,
3144
+ /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "meta", tone: "muted", as: "p", className: "ml-auto", children: [
3145
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "text-accent", children: [
3146
+ "$",
3147
+ " "
3148
+ ] }),
3149
+ "cd ~/",
3150
+ naming.domain,
3151
+ "/",
3152
+ year
3153
+ ] })
2564
3154
  ] })
2565
3155
  ] }) });
2566
3156
  }
@@ -2585,9 +3175,11 @@ function Hero({
2585
3175
  action,
2586
3176
  pose,
2587
3177
  basePath,
3178
+ variant = "cabecera",
2588
3179
  className,
2589
3180
  ...props
2590
3181
  }) {
3182
+ const centrado = variant === "centrado";
2591
3183
  return /* @__PURE__ */ jsxRuntime.jsxs(
2592
3184
  "section",
2593
3185
  {
@@ -2599,13 +3191,39 @@ function Hero({
2599
3191
  ),
2600
3192
  ...props,
2601
3193
  children: [
2602
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex flex-col md:max-w-[62%]", children: [
2603
- eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
2604
- /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h1", variant: "display", children: title }),
2605
- description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
2606
- action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm mt-step-xs flex flex-wrap items-center", children: action }) : null
2607
- ] }),
2608
- pose ? /* @__PURE__ */ jsxRuntime.jsx(
3194
+ centrado && pose ? /* @__PURE__ */ jsxRuntime.jsx(
3195
+ Mascota,
3196
+ {
3197
+ pose,
3198
+ basePath,
3199
+ className: "mb-step-md mx-auto w-48 md:w-56"
3200
+ }
3201
+ ) : null,
3202
+ /* @__PURE__ */ jsxRuntime.jsxs(
3203
+ "div",
3204
+ {
3205
+ className: cn(
3206
+ "gap-step-md flex flex-col",
3207
+ centrado ? "items-center text-center" : "md:max-w-[62%]"
3208
+ ),
3209
+ children: [
3210
+ eyebrow ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
3211
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h1", variant: "display", children: title }),
3212
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
3213
+ action ? /* @__PURE__ */ jsxRuntime.jsx(
3214
+ "div",
3215
+ {
3216
+ className: cn(
3217
+ "gap-step-sm mt-step-xs flex flex-wrap items-center",
3218
+ centrado && "justify-center"
3219
+ ),
3220
+ children: action
3221
+ }
3222
+ ) : null
3223
+ ]
3224
+ }
3225
+ ),
3226
+ !centrado && pose ? /* @__PURE__ */ jsxRuntime.jsx(
2609
3227
  Mascota,
2610
3228
  {
2611
3229
  pose,
@@ -2671,7 +3289,10 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
2671
3289
  ...props,
2672
3290
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md h-nav gap-step-lg mx-auto flex items-center", children: [
2673
3291
  brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: brand2 }) : null,
2674
- 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" }),
3292
+ children ? /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Principal", className: "ml-auto min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "gap-step-md flex items-center", children: [
3293
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
3294
+ children
3295
+ ] }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
2675
3296
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
2676
3297
  ] })
2677
3298
  }
@@ -2691,8 +3312,10 @@ function NavItem({ active = false, asChild = false, className, children, ...prop
2691
3312
  ),
2692
3313
  ...props,
2693
3314
  children: [
2694
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted", children: "./" }),
2695
- children
3315
+ active ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-accent", children: "[" }) : null,
3316
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: active ? "text-accent" : "text-text-muted", children: "./" }),
3317
+ children,
3318
+ active ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-accent", children: "]" }) : null
2696
3319
  ]
2697
3320
  }
2698
3321
  ) });
@@ -2710,6 +3333,10 @@ function NewsletterForm({
2710
3333
  submitLabel = "Suscribirme",
2711
3334
  placeholder = "tu@correo.dev",
2712
3335
  fieldLabel = "Correo electr\xF3nico",
3336
+ nameField = false,
3337
+ nameLabel = "Nombre",
3338
+ namePlaceholder = "C\xF3mo te llamas",
3339
+ nameInputProps,
2713
3340
  className,
2714
3341
  ...props
2715
3342
  }) {
@@ -2720,8 +3347,19 @@ function NewsletterForm({
2720
3347
  evento.preventDefault();
2721
3348
  const datos = new FormData(evento.currentTarget);
2722
3349
  const correo = String(datos.get("email") ?? "");
2723
- onSubmitEmail?.(correo);
3350
+ const nombre = nameField ? String(datos.get("name") ?? "") : void 0;
3351
+ onSubmitEmail?.(correo, nombre);
2724
3352
  }
3353
+ const boton = /* @__PURE__ */ jsxRuntime.jsx(
3354
+ Button,
3355
+ {
3356
+ type: "submit",
3357
+ variant: "conversion",
3358
+ loading: enviando,
3359
+ className: cn("disabled:opacity-60", nameField && "sm:self-start"),
3360
+ children: submitLabel
3361
+ }
3362
+ );
2725
3363
  return /* @__PURE__ */ jsxRuntime.jsxs(
2726
3364
  "section",
2727
3365
  {
@@ -2735,34 +3373,44 @@ function NewsletterForm({
2735
3373
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h2", variant: "h3", children: title }),
2736
3374
  description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", children: description }) : null
2737
3375
  ] }),
2738
- /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: enviar, className: "gap-step-sm flex flex-col sm:flex-row sm:items-end", noValidate: true, children: [
2739
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
2740
- /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: id, children: fieldLabel }),
2741
- /* @__PURE__ */ jsxRuntime.jsx(
2742
- Input,
2743
- {
2744
- id,
2745
- name: "email",
2746
- type: "email",
2747
- autoComplete: "email",
2748
- required: true,
2749
- placeholder,
2750
- disabled: enviando,
2751
- invalid: error,
2752
- "aria-describedby": state === "exito" || error ? `${id}-aviso` : void 0
2753
- }
2754
- )
3376
+ /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: enviar, className: "gap-step-sm flex flex-col", noValidate: true, children: [
3377
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-sm flex flex-col sm:flex-row sm:items-end", children: [
3378
+ nameField ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
3379
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: `${id}-nombre`, children: nameLabel }),
3380
+ /* @__PURE__ */ jsxRuntime.jsx(
3381
+ Input,
3382
+ {
3383
+ id: `${id}-nombre`,
3384
+ name: "name",
3385
+ type: "text",
3386
+ autoComplete: "name",
3387
+ required: true,
3388
+ placeholder: namePlaceholder,
3389
+ disabled: enviando,
3390
+ ...nameInputProps
3391
+ }
3392
+ )
3393
+ ] }) : null,
3394
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
3395
+ /* @__PURE__ */ jsxRuntime.jsx(Label2, { htmlFor: id, children: fieldLabel }),
3396
+ /* @__PURE__ */ jsxRuntime.jsx(
3397
+ Input,
3398
+ {
3399
+ id,
3400
+ name: "email",
3401
+ type: "email",
3402
+ autoComplete: "email",
3403
+ required: true,
3404
+ placeholder,
3405
+ disabled: enviando,
3406
+ invalid: error,
3407
+ "aria-describedby": state === "exito" || error ? `${id}-aviso` : void 0
3408
+ }
3409
+ )
3410
+ ] }),
3411
+ nameField ? null : boton
2755
3412
  ] }),
2756
- /* @__PURE__ */ jsxRuntime.jsx(
2757
- Button,
2758
- {
2759
- type: "submit",
2760
- variant: "conversion",
2761
- loading: enviando,
2762
- className: "disabled:opacity-60",
2763
- children: submitLabel
2764
- }
2765
- )
3413
+ nameField ? boton : null
2766
3414
  ] }),
2767
3415
  state === "exito" ? /* @__PURE__ */ jsxRuntime.jsx(Alert, { id: `${id}-aviso`, variant: "success", enfasis: "fuerte", children: successMessage }) : null,
2768
3416
  error ? /* @__PURE__ */ jsxRuntime.jsx(Alert, { id: `${id}-aviso`, variant: "error", enfasis: "fuerte", children: errorMessage }) : null,
@@ -2800,6 +3448,62 @@ function PageHeader({
2800
3448
  action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm mt-step-sm flex flex-wrap items-center", children: action }) : null
2801
3449
  ] });
2802
3450
  }
3451
+ function ScrollingProgressBar({
3452
+ target,
3453
+ tone = "accent",
3454
+ sticky = true,
3455
+ className,
3456
+ ...props
3457
+ }) {
3458
+ const [avance, setAvance] = react.useState(0);
3459
+ const pendiente = react.useRef(0);
3460
+ react.useEffect(() => {
3461
+ const medir = () => {
3462
+ pendiente.current = 0;
3463
+ const elemento = target?.current;
3464
+ const inicio = elemento ? elemento.getBoundingClientRect().top + scrollY : 0;
3465
+ const alto = elemento ? elemento.offsetHeight : document.documentElement.scrollHeight;
3466
+ const recorrible = alto - innerHeight;
3467
+ if (recorrible <= 0) {
3468
+ setAvance(scrollY >= inicio ? 100 : 0);
3469
+ return;
3470
+ }
3471
+ const recorrido = scrollY - inicio;
3472
+ setAvance(Math.min(100, Math.max(0, recorrido / recorrible * 100)));
3473
+ };
3474
+ const alMoverse = () => {
3475
+ if (pendiente.current) return;
3476
+ pendiente.current = requestAnimationFrame(medir);
3477
+ };
3478
+ medir();
3479
+ addEventListener("scroll", alMoverse, { passive: true });
3480
+ addEventListener("resize", alMoverse);
3481
+ return () => {
3482
+ if (pendiente.current) cancelAnimationFrame(pendiente.current);
3483
+ removeEventListener("scroll", alMoverse);
3484
+ removeEventListener("resize", alMoverse);
3485
+ };
3486
+ }, [target]);
3487
+ return /* @__PURE__ */ jsxRuntime.jsx(
3488
+ "div",
3489
+ {
3490
+ "aria-hidden": "true",
3491
+ className: cn(
3492
+ "h-1 w-full overflow-hidden",
3493
+ sticky && "sticky top-0 z-40",
3494
+ className
3495
+ ),
3496
+ ...props,
3497
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3498
+ "div",
3499
+ {
3500
+ className: cn("h-full", tone === "warm" ? "bg-warm" : "bg-accent"),
3501
+ style: { width: `${avance}%` }
3502
+ }
3503
+ )
3504
+ }
3505
+ );
3506
+ }
2803
3507
  function SidebarItem({
2804
3508
  active = false,
2805
3509
  asChild = false,
@@ -2863,10 +3567,28 @@ function SidebarNav({
2863
3567
  }
2864
3568
  );
2865
3569
  }
2866
- function Stat({ value, label, tone = "neutral", progress, className, ...props }) {
3570
+ function Stat({
3571
+ value,
3572
+ label,
3573
+ tone = "neutral",
3574
+ progress,
3575
+ icon,
3576
+ description,
3577
+ className,
3578
+ ...props
3579
+ }) {
2867
3580
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-step-lg gap-step-xs flex flex-col", className), ...props, children: [
3581
+ /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: [
3582
+ icon ? (
3583
+ // `aria-hidden` no hace falta: los glifos del sistema ya lo traen
3584
+ // puesto. Lo que sí hace falta es que no encoja al lado de un título
3585
+ // largo, porque un icono aplastado se lee como otro icono.
3586
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0", children: icon })
3587
+ ) : null,
3588
+ label
3589
+ ] }),
2868
3590
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "stat", as: "p", tone: tone === "alerta" ? "warm" : "accent", children: value }),
2869
- /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", children: label }),
3591
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
2870
3592
  typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
2871
3593
  Progress,
2872
3594
  {
@@ -2885,6 +3607,7 @@ function TalkCard({
2885
3607
  dateTime,
2886
3608
  location,
2887
3609
  status,
3610
+ description,
2888
3611
  className,
2889
3612
  ...props
2890
3613
  }) {
@@ -2898,12 +3621,43 @@ function TalkCard({
2898
3621
  status ? /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "neutral", children: status }) : null
2899
3622
  ] }),
2900
3623
  /* @__PURE__ */ jsxRuntime.jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
3624
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: description }) : null,
2901
3625
  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: [
2902
3626
  i > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
2903
3627
  m
2904
3628
  ] }, i)) }) : null
2905
3629
  ] }) });
2906
3630
  }
3631
+ function ThemeToggle({
3632
+ label = "Cambiar de tema",
3633
+ onThemeChange,
3634
+ variant = "secondary",
3635
+ size: size2 = "icon",
3636
+ className,
3637
+ ...props
3638
+ }) {
3639
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3640
+ Button,
3641
+ {
3642
+ type: "button",
3643
+ variant,
3644
+ size: size2,
3645
+ "aria-label": label,
3646
+ className: cn("[&_svg]:size-[19px]", className),
3647
+ onClick: () => onThemeChange?.(alternarTema()),
3648
+ ...props,
3649
+ children: [
3650
+ /* @__PURE__ */ jsxRuntime.jsx(Sol, { className: "light:hidden" }),
3651
+ /* @__PURE__ */ jsxRuntime.jsx(Luna, { className: "hidden light:block" })
3652
+ ]
3653
+ }
3654
+ );
3655
+ }
3656
+ function useTema() {
3657
+ return react.useSyncExternalStore(suscribirse2, temaActual, servidor);
3658
+ }
3659
+ var suscribirse2 = (avisar) => escucharTema(() => avisar());
3660
+ var servidor = () => "dark";
2907
3661
  function TableOfContents({
2908
3662
  items,
2909
3663
  title = "En esta p\xE1gina",
@@ -2922,7 +3676,11 @@ function TableOfContents({
2922
3676
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
2923
3677
  "cursor-pointer",
2924
3678
  item2.nested && "pl-step-lg",
2925
- activo ? "border-accent text-accent" : "border-transparent text-text-secondary hover:text-text-primary"
3679
+ "border-transparent text-text-secondary hover:text-text-primary",
3680
+ // El hover del activo se declara con las dos variantes juntas para
3681
+ // que gane al `hover:` de arriba por especificidad y no por el orden
3682
+ // en que Tailwind decida emitir las reglas.
3683
+ "aria-[current]:border-accent aria-[current]:text-accent aria-[current]:hover:text-accent"
2926
3684
  );
2927
3685
  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);
2928
3686
  }) })
@@ -2952,20 +3710,36 @@ function Logo({
2952
3710
  sobre = "oscuro",
2953
3711
  basePath = RUTA_ASSETS,
2954
3712
  soloIsotipo = false,
3713
+ conLema = false,
2955
3714
  className,
2956
3715
  ...props
2957
3716
  }) {
3717
+ const conAleta = /* @__PURE__ */ jsxRuntime.jsx(
3718
+ Isotipo,
3719
+ {
3720
+ sobre,
3721
+ basePath,
3722
+ alt: soloIsotipo ? naming.wordmark : "",
3723
+ className: conLema ? "h-9 w-auto" : "h-7 w-auto"
3724
+ }
3725
+ );
3726
+ const wordmark = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark });
3727
+ if (soloIsotipo) {
3728
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: conAleta });
3729
+ }
3730
+ if (conLema) {
3731
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-sm inline-flex items-center", className), ...props, children: [
3732
+ conAleta,
3733
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "bg-hairline h-8 w-px shrink-0" }),
3734
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
3735
+ wordmark,
3736
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.corto })
3737
+ ] })
3738
+ ] });
3739
+ }
2958
3740
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
2959
- /* @__PURE__ */ jsxRuntime.jsx(
2960
- Isotipo,
2961
- {
2962
- sobre,
2963
- basePath,
2964
- alt: soloIsotipo ? naming.wordmark : "",
2965
- className: "h-7 w-auto"
2966
- }
2967
- ),
2968
- soloIsotipo ? null : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark })
3741
+ conAleta,
3742
+ wordmark
2969
3743
  ] });
2970
3744
  }
2971
3745
 
@@ -3030,13 +3804,28 @@ var Correo = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Funcional, { ...props, c
3030
3804
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" })
3031
3805
  ] });
3032
3806
 
3807
+ exports.Accordion = Accordion;
3808
+ exports.AccordionContent = AccordionContent;
3809
+ exports.AccordionItem = AccordionItem;
3810
+ exports.AccordionTrigger = AccordionTrigger;
3033
3811
  exports.Alert = Alert;
3812
+ exports.AlertDialog = AlertDialog;
3813
+ exports.AlertDialogAction = AlertDialogAction;
3814
+ exports.AlertDialogCancel = AlertDialogCancel;
3815
+ exports.AlertDialogContent = AlertDialogContent;
3816
+ exports.AlertDialogDescription = AlertDialogDescription;
3817
+ exports.AlertDialogFooter = AlertDialogFooter;
3818
+ exports.AlertDialogHeader = AlertDialogHeader;
3819
+ exports.AlertDialogOverlay = AlertDialogOverlay;
3820
+ exports.AlertDialogTitle = AlertDialogTitle;
3821
+ exports.AlertDialogTrigger = AlertDialogTrigger;
3034
3822
  exports.ArticleCard = ArticleCard;
3035
3823
  exports.AudioPlayer = AudioPlayer;
3036
3824
  exports.AuthorCard = AuthorCard;
3037
3825
  exports.Avatar = Avatar;
3038
3826
  exports.AvatarFallback = AvatarFallback;
3039
3827
  exports.AvatarImage = AvatarImage;
3828
+ exports.AvatarUpload = AvatarUpload;
3040
3829
  exports.Badge = Badge;
3041
3830
  exports.Blockquote = Blockquote;
3042
3831
  exports.Breadcrumb = Breadcrumb;
@@ -3078,6 +3867,7 @@ exports.DropdownMenuSubContent = DropdownMenuSubContent;
3078
3867
  exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
3079
3868
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
3080
3869
  exports.EmptyState = EmptyState;
3870
+ exports.EventCalendar = EventCalendar;
3081
3871
  exports.Footer = Footer;
3082
3872
  exports.FooterLink = FooterLink;
3083
3873
  exports.HOVER_TARJETA = HOVER_TARJETA;
@@ -3109,6 +3899,7 @@ exports.RUTA_ASSETS = RUTA_ASSETS;
3109
3899
  exports.RadioGroup = RadioGroup2;
3110
3900
  exports.RadioGroupItem = RadioGroupItem;
3111
3901
  exports.SUPERFICIE_TARJETA = SUPERFICIE_TARJETA;
3902
+ exports.ScrollingProgressBar = ScrollingProgressBar;
3112
3903
  exports.Select = Select;
3113
3904
  exports.SelectContent = SelectContent;
3114
3905
  exports.SelectGroup = SelectGroup;
@@ -3132,6 +3923,9 @@ exports.SidebarNav = SidebarNav;
3132
3923
  exports.Skeleton = Skeleton;
3133
3924
  exports.Stat = Stat;
3134
3925
  exports.Switch = Switch;
3926
+ exports.TEMA_ATRIBUTO = TEMA_ATRIBUTO;
3927
+ exports.TEMA_CLAVE = TEMA_CLAVE;
3928
+ exports.TEMA_EVENTO = TEMA_EVENTO;
3135
3929
  exports.Table = Table;
3136
3930
  exports.TableBody = TableBody;
3137
3931
  exports.TableCaption = TableCaption;
@@ -3148,18 +3942,17 @@ exports.TabsTrigger = TabsTrigger;
3148
3942
  exports.TalkCard = TalkCard;
3149
3943
  exports.Text = Text;
3150
3944
  exports.Textarea = Textarea;
3151
- exports.Toast = Toast;
3945
+ exports.ThemeToggle = ThemeToggle;
3152
3946
  exports.ToastAction = ToastAction;
3153
- exports.ToastDescription = ToastDescription;
3154
- exports.ToastProvider = ToastProvider;
3155
- exports.ToastTitle = ToastTitle;
3156
- exports.ToastViewport = ToastViewport;
3947
+ exports.Toaster = Toaster;
3157
3948
  exports.Tooltip = Tooltip;
3158
3949
  exports.TooltipContent = TooltipContent;
3159
3950
  exports.TooltipProvider = TooltipProvider;
3160
3951
  exports.TooltipTrigger = TooltipTrigger;
3161
3952
  exports.alertVariants = alert;
3162
3953
  exports.aletas = aletas;
3954
+ exports.alternarTema = alternarTema;
3955
+ exports.aplicarTema = aplicarTema;
3163
3956
  exports.avatarVariants = avatar;
3164
3957
  exports.badgeVariants = badge;
3165
3958
  exports.brand = brand;
@@ -3170,6 +3963,7 @@ exports.cn = cn;
3170
3963
  exports.colors = colors;
3171
3964
  exports.control = control;
3172
3965
  exports.dark = dark;
3966
+ exports.escucharTema = escucharTema;
3173
3967
  exports.fonts = fonts;
3174
3968
  exports.gradient = gradient;
3175
3969
  exports.light = light;
@@ -3180,13 +3974,20 @@ exports.motion = motion;
3180
3974
  exports.naming = naming;
3181
3975
  exports.poses = poses;
3182
3976
  exports.radius = radius;
3977
+ exports.scriptTema = scriptTema;
3978
+ exports.series = series;
3183
3979
  exports.shadow = shadow;
3184
3980
  exports.sintaxis = sintaxis;
3185
3981
  exports.size = size;
3186
3982
  exports.social = social_exports;
3187
3983
  exports.spacing = spacing;
3188
3984
  exports.tagline = tagline;
3985
+ exports.temaActual = temaActual;
3986
+ exports.temaGuardado = temaGuardado;
3987
+ exports.temaPreferido = temaPreferido;
3189
3988
  exports.textVariants = texto;
3989
+ exports.toast = toast2;
3190
3990
  exports.tokens = tokens;
3191
3991
  exports.typeScale = typeScale;
3992
+ exports.useTema = useTema;
3192
3993
  exports.usoDeCara = usoDeCara;