@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/CHANGELOG.md +27 -0
- package/README.md +34 -1
- package/dist/brand/index.cjs +29 -10
- package/dist/brand/index.d.cts +9 -1
- package/dist/brand/index.d.ts +9 -1
- package/dist/brand/index.js +1 -1
- package/dist/{chunk-TB3IYPOD.js → chunk-YZ2SDOVZ.js} +27 -11
- package/dist/index.cjs +345 -37
- package/dist/index.d.cts +135 -18
- package/dist/index.d.ts +135 -18
- package/dist/index.js +320 -25
- package/dist/tokens/theme.css +27 -0
- package/llms.txt +59 -32
- package/package.json +1 -1
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(
|
|
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
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
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
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
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
|
|
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-
|
|
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({
|
|
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: "
|
|
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
|
-
|
|
3429
|
-
|
|
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;
|