@eduardoalvarez/arrecife 0.4.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.
package/dist/index.cjs CHANGED
@@ -8,6 +8,7 @@ var classVarianceAuthority = require('class-variance-authority');
8
8
  var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
9
9
  var reactSlot = require('@radix-ui/react-slot');
10
10
  var AvatarPrimitive = require('@radix-ui/react-avatar');
11
+ var react = require('react');
11
12
  var locale = require('date-fns/locale');
12
13
  var reactDayPicker = require('react-day-picker');
13
14
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
@@ -22,8 +23,8 @@ var SeparatorPrimitive = require('@radix-ui/react-separator');
22
23
  var SwitchPrimitive = require('@radix-ui/react-switch');
23
24
  var TabsPrimitive = require('@radix-ui/react-tabs');
24
25
  var ToastPrimitive = require('@radix-ui/react-toast');
25
- var react = require('react');
26
26
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
27
+ var dateFns = require('date-fns');
27
28
 
28
29
  function _interopNamespace(e) {
29
30
  if (e && e.__esModule) return e;
@@ -468,6 +469,10 @@ var Spinner = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
468
469
  ]
469
470
  }
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
+ ] });
471
476
  var Sol = (props) => /* @__PURE__ */ jsxRuntime.jsxs(Glyph, { ...props, children: [
472
477
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "3" }),
473
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" })
@@ -572,7 +577,17 @@ function AccordionContent({
572
577
  children,
573
578
  ...props
574
579
  }) {
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 }) });
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
+ );
576
591
  }
577
592
  var alert = classVarianceAuthority.cva("w-full rounded-card border p-step-md font-sans text-ui", {
578
593
  variants: {
@@ -852,6 +867,68 @@ function AvatarFallback({
852
867
  }
853
868
  );
854
869
  }
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
+ }
855
932
  var badge = classVarianceAuthority.cva(
856
933
  ["inline-flex items-center gap-step-xs", "rounded-chip px-step-xs py-0.5", "font-sans text-tag", "transition-standard"],
857
934
  {
@@ -2849,6 +2926,193 @@ function EmptyState({
2849
2926
  }
2850
2927
  );
2851
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
+ }
2852
3116
  function Footer({
2853
3117
  social,
2854
3118
  year = (/* @__PURE__ */ new Date()).getFullYear(),
@@ -2860,31 +3124,33 @@ function Footer({
2860
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: [
2861
3125
  brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", children: brand2 }) : null,
2862
3126
  children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }) : null,
2863
- social && social.length > 0 ? (
2864
- // 18px de separación, del documento. No es un escalón de `spacing`:
2865
- // es el ritmo de una fila de iconos, no el de una página.
2866
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex items-center gap-[18px]", children: social.map((red) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
2867
- "a",
2868
- {
2869
- href: red.href,
2870
- "aria-label": red.label,
2871
- className: cn(
2872
- "text-text-muted hover:text-accent transition-standard block cursor-pointer text-[19px]",
2873
- "rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
2874
- ),
2875
- children: red.icon
2876
- }
2877
- ) }, red.href)) })
2878
- ) : null,
2879
- /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "meta", tone: "muted", as: "p", children: [
2880
- /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "text-accent", children: [
2881
- "$",
2882
- " "
2883
- ] }),
2884
- "cd ~/",
2885
- naming.domain,
2886
- "/",
2887
- 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
+ ] })
2888
3154
  ] })
2889
3155
  ] }) });
2890
3156
  }
@@ -3023,7 +3289,10 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
3023
3289
  ...props,
3024
3290
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md h-nav gap-step-lg mx-auto flex items-center", children: [
3025
3291
  brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: brand2 }) : 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" }),
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" }),
3027
3296
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
3028
3297
  ] })
3029
3298
  }
@@ -3043,8 +3312,10 @@ function NavItem({ active = false, asChild = false, className, children, ...prop
3043
3312
  ),
3044
3313
  ...props,
3045
3314
  children: [
3046
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted", children: "./" }),
3047
- 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
3048
3319
  ]
3049
3320
  }
3050
3321
  ) });
@@ -3296,10 +3567,28 @@ function SidebarNav({
3296
3567
  }
3297
3568
  );
3298
3569
  }
3299
- 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
+ }) {
3300
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
+ ] }),
3301
3590
  /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "stat", as: "p", tone: tone === "alerta" ? "warm" : "accent", children: value }),
3302
- /* @__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,
3303
3592
  typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
3304
3593
  Progress,
3305
3594
  {
@@ -3421,20 +3710,36 @@ function Logo({
3421
3710
  sobre = "oscuro",
3422
3711
  basePath = RUTA_ASSETS,
3423
3712
  soloIsotipo = false,
3713
+ conLema = false,
3424
3714
  className,
3425
3715
  ...props
3426
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
+ }
3427
3740
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
3428
- /* @__PURE__ */ jsxRuntime.jsx(
3429
- Isotipo,
3430
- {
3431
- sobre,
3432
- basePath,
3433
- alt: soloIsotipo ? naming.wordmark : "",
3434
- className: "h-7 w-auto"
3435
- }
3436
- ),
3437
- 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
3438
3743
  ] });
3439
3744
  }
3440
3745
 
@@ -3520,6 +3825,7 @@ exports.AuthorCard = AuthorCard;
3520
3825
  exports.Avatar = Avatar;
3521
3826
  exports.AvatarFallback = AvatarFallback;
3522
3827
  exports.AvatarImage = AvatarImage;
3828
+ exports.AvatarUpload = AvatarUpload;
3523
3829
  exports.Badge = Badge;
3524
3830
  exports.Blockquote = Blockquote;
3525
3831
  exports.Breadcrumb = Breadcrumb;
@@ -3561,6 +3867,7 @@ exports.DropdownMenuSubContent = DropdownMenuSubContent;
3561
3867
  exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
3562
3868
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
3563
3869
  exports.EmptyState = EmptyState;
3870
+ exports.EventCalendar = EventCalendar;
3564
3871
  exports.Footer = Footer;
3565
3872
  exports.FooterLink = FooterLink;
3566
3873
  exports.HOVER_TARJETA = HOVER_TARJETA;
@@ -3636,12 +3943,7 @@ exports.TalkCard = TalkCard;
3636
3943
  exports.Text = Text;
3637
3944
  exports.Textarea = Textarea;
3638
3945
  exports.ThemeToggle = ThemeToggle;
3639
- exports.Toast = Toast;
3640
3946
  exports.ToastAction = ToastAction;
3641
- exports.ToastDescription = ToastDescription;
3642
- exports.ToastProvider = ToastProvider;
3643
- exports.ToastTitle = ToastTitle;
3644
- exports.ToastViewport = ToastViewport;
3645
3947
  exports.Toaster = Toaster;
3646
3948
  exports.Tooltip = Tooltip;
3647
3949
  exports.TooltipContent = TooltipContent;