@eduardoalvarez/arrecife 0.4.0 → 0.5.1

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(),
@@ -2857,9 +3121,19 @@ function Footer({
2857
3121
  className,
2858
3122
  ...props
2859
3123
  }) {
2860
- return /* @__PURE__ */ jsxRuntime.jsx("footer", { className: cn("border-hairline w-full border-t", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md py-step-xl gap-step-lg mx-auto flex flex-col", children: [
2861
- brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", children: brand2 }) : null,
2862
- children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }) : null,
3124
+ const firma = /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "meta", tone: "muted", as: "p", className: "ml-auto shrink-0", children: [
3125
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "text-accent", children: [
3126
+ "$",
3127
+ " "
3128
+ ] }),
3129
+ "cd ~/",
3130
+ naming.domain,
3131
+ "/",
3132
+ year
3133
+ ] });
3134
+ const filas = [
3135
+ brand2 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", children: brand2 }, "marca") : null,
3136
+ children ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }, "enlaces") : null,
2863
3137
  social && social.length > 0 ? (
2864
3138
  // 18px de separación, del documento. No es un escalón de `spacing`:
2865
3139
  // es el ritmo de una fila de iconos, no el de una página.
@@ -2874,18 +3148,16 @@ function Footer({
2874
3148
  ),
2875
3149
  children: red.icon
2876
3150
  }
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
2888
- ] })
3151
+ ) }, red.href)) }, "redes")
3152
+ ) : null
3153
+ ].filter(Boolean);
3154
+ const [primera, ...resto] = filas;
3155
+ 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: [
3156
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "gap-step-md flex flex-wrap items-center", children: [
3157
+ primera ?? null,
3158
+ firma
3159
+ ] }),
3160
+ resto
2889
3161
  ] }) });
2890
3162
  }
2891
3163
  function FooterLink({ asChild = false, className, ...props }) {
@@ -3023,7 +3295,10 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
3023
3295
  ...props,
3024
3296
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-wide px-step-md h-nav gap-step-lg mx-auto flex items-center", children: [
3025
3297
  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" }),
3298
+ 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: [
3299
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted font-mono text-meta select-none", children: "~/" }),
3300
+ children
3301
+ ] }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
3027
3302
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "gap-step-sm flex shrink-0 items-center", children: actions }) : null
3028
3303
  ] })
3029
3304
  }
@@ -3043,8 +3318,10 @@ function NavItem({ active = false, asChild = false, className, children, ...prop
3043
3318
  ),
3044
3319
  ...props,
3045
3320
  children: [
3046
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-text-muted", children: "./" }),
3047
- children
3321
+ active ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-accent", children: "[" }) : null,
3322
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: active ? "text-accent" : "text-text-muted", children: "./" }),
3323
+ children,
3324
+ active ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-accent", children: "]" }) : null
3048
3325
  ]
3049
3326
  }
3050
3327
  ) });
@@ -3296,10 +3573,28 @@ function SidebarNav({
3296
3573
  }
3297
3574
  );
3298
3575
  }
3299
- function Stat({ value, label, tone = "neutral", progress, className, ...props }) {
3576
+ function Stat({
3577
+ value,
3578
+ label,
3579
+ tone = "neutral",
3580
+ progress,
3581
+ icon,
3582
+ description,
3583
+ className,
3584
+ ...props
3585
+ }) {
3300
3586
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(SUPERFICIE_TARJETA, "p-step-lg gap-step-xs flex flex-col", className), ...props, children: [
3587
+ /* @__PURE__ */ jsxRuntime.jsxs(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: [
3588
+ icon ? (
3589
+ // `aria-hidden` no hace falta: los glifos del sistema ya lo traen
3590
+ // puesto. Lo que sí hace falta es que no encoja al lado de un título
3591
+ // largo, porque un icono aplastado se lee como otro icono.
3592
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0", children: icon })
3593
+ ) : null,
3594
+ label
3595
+ ] }),
3301
3596
  /* @__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 }),
3597
+ description ? /* @__PURE__ */ jsxRuntime.jsx(Text, { variant: "ui", tone: "secondary", as: "p", children: description }) : null,
3303
3598
  typeof progress === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
3304
3599
  Progress,
3305
3600
  {
@@ -3421,20 +3716,36 @@ function Logo({
3421
3716
  sobre = "oscuro",
3422
3717
  basePath = RUTA_ASSETS,
3423
3718
  soloIsotipo = false,
3719
+ conLema = false,
3424
3720
  className,
3425
3721
  ...props
3426
3722
  }) {
3723
+ const conAleta = /* @__PURE__ */ jsxRuntime.jsx(
3724
+ Isotipo,
3725
+ {
3726
+ sobre,
3727
+ basePath,
3728
+ alt: soloIsotipo ? naming.wordmark : "",
3729
+ className: conLema ? "h-9 w-auto" : "h-7 w-auto"
3730
+ }
3731
+ );
3732
+ const wordmark = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark });
3733
+ if (soloIsotipo) {
3734
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: conAleta });
3735
+ }
3736
+ if (conLema) {
3737
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-sm inline-flex items-center", className), ...props, children: [
3738
+ conAleta,
3739
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "bg-hairline h-8 w-px shrink-0" }),
3740
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
3741
+ wordmark,
3742
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.corto })
3743
+ ] })
3744
+ ] });
3745
+ }
3427
3746
  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 })
3747
+ conAleta,
3748
+ wordmark
3438
3749
  ] });
3439
3750
  }
3440
3751
 
@@ -3520,6 +3831,7 @@ exports.AuthorCard = AuthorCard;
3520
3831
  exports.Avatar = Avatar;
3521
3832
  exports.AvatarFallback = AvatarFallback;
3522
3833
  exports.AvatarImage = AvatarImage;
3834
+ exports.AvatarUpload = AvatarUpload;
3523
3835
  exports.Badge = Badge;
3524
3836
  exports.Blockquote = Blockquote;
3525
3837
  exports.Breadcrumb = Breadcrumb;
@@ -3561,6 +3873,7 @@ exports.DropdownMenuSubContent = DropdownMenuSubContent;
3561
3873
  exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
3562
3874
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
3563
3875
  exports.EmptyState = EmptyState;
3876
+ exports.EventCalendar = EventCalendar;
3564
3877
  exports.Footer = Footer;
3565
3878
  exports.FooterLink = FooterLink;
3566
3879
  exports.HOVER_TARJETA = HOVER_TARJETA;
@@ -3636,12 +3949,7 @@ exports.TalkCard = TalkCard;
3636
3949
  exports.Text = Text;
3637
3950
  exports.Textarea = Textarea;
3638
3951
  exports.ThemeToggle = ThemeToggle;
3639
- exports.Toast = Toast;
3640
3952
  exports.ToastAction = ToastAction;
3641
- exports.ToastDescription = ToastDescription;
3642
- exports.ToastProvider = ToastProvider;
3643
- exports.ToastTitle = ToastTitle;
3644
- exports.ToastViewport = ToastViewport;
3645
3953
  exports.Toaster = Toaster;
3646
3954
  exports.Tooltip = Tooltip;
3647
3955
  exports.TooltipContent = TooltipContent;