@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/CHANGELOG.md +20 -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 +349 -47
- package/dist/index.d.cts +130 -18
- package/dist/index.d.ts +130 -18
- package/dist/index.js +324 -35
- 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(),
|
|
@@ -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
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
"
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
/* @__PURE__ */ jsxRuntime.jsxs("
|
|
2881
|
-
"
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
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
|
|
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-
|
|
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({
|
|
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: "
|
|
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
|
-
|
|
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 })
|
|
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;
|