framepexls-ui-lib 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/AppTopbar.js +1 -1
  2. package/dist/AppTopbar.mjs +1 -1
  3. package/dist/AvatarGroup.js +7 -2
  4. package/dist/AvatarGroup.mjs +7 -2
  5. package/dist/Badge.js +6 -1
  6. package/dist/Badge.mjs +6 -1
  7. package/dist/Breadcrumb.js +46 -2
  8. package/dist/Breadcrumb.mjs +46 -2
  9. package/dist/Button.js +8 -2
  10. package/dist/Button.mjs +8 -2
  11. package/dist/CalendarPanel.js +45 -26
  12. package/dist/CalendarPanel.mjs +45 -26
  13. package/dist/Card.js +7 -2
  14. package/dist/Card.mjs +7 -2
  15. package/dist/Checkbox.js +51 -18
  16. package/dist/Checkbox.mjs +51 -18
  17. package/dist/ColorPicker.js +9 -4
  18. package/dist/ColorPicker.mjs +9 -4
  19. package/dist/ComboSelect.js +10 -3
  20. package/dist/ComboSelect.mjs +10 -3
  21. package/dist/DateTimeField.js +7 -1
  22. package/dist/DateTimeField.mjs +7 -1
  23. package/dist/Dropdown.js +13 -9
  24. package/dist/Dropdown.mjs +13 -9
  25. package/dist/Input.js +23 -0
  26. package/dist/Input.mjs +23 -0
  27. package/dist/KpiCard.js +26 -2
  28. package/dist/KpiCard.mjs +26 -2
  29. package/dist/Link.js +16 -2
  30. package/dist/Link.mjs +16 -2
  31. package/dist/MediaCard.js +18 -11
  32. package/dist/MediaCard.mjs +18 -11
  33. package/dist/MediaSelector.js +9 -8
  34. package/dist/MediaSelector.mjs +9 -8
  35. package/dist/MotionProvider.d.mts +9 -0
  36. package/dist/MotionProvider.d.ts +9 -0
  37. package/dist/MotionProvider.js +29 -0
  38. package/dist/MotionProvider.mjs +9 -0
  39. package/dist/MultiComboSelect.js +6 -4
  40. package/dist/MultiComboSelect.mjs +6 -4
  41. package/dist/Pagination.js +65 -29
  42. package/dist/Pagination.mjs +65 -29
  43. package/dist/ReviewHistory.js +8 -6
  44. package/dist/ReviewHistory.mjs +8 -6
  45. package/dist/SearchInput.js +16 -2
  46. package/dist/SearchInput.mjs +16 -2
  47. package/dist/Select.js +10 -3
  48. package/dist/Select.mjs +10 -3
  49. package/dist/Sidebar.js +20 -2
  50. package/dist/Sidebar.mjs +20 -2
  51. package/dist/StatCard.js +17 -1
  52. package/dist/StatCard.mjs +19 -3
  53. package/dist/Steps.js +51 -37
  54. package/dist/Steps.mjs +51 -37
  55. package/dist/StorageUsage.js +6 -2
  56. package/dist/StorageUsage.mjs +6 -2
  57. package/dist/Table.d.mts +5 -1
  58. package/dist/Table.d.ts +5 -1
  59. package/dist/Table.js +31 -4
  60. package/dist/Table.mjs +30 -4
  61. package/dist/Textarea.js +42 -17
  62. package/dist/Textarea.mjs +43 -18
  63. package/dist/TimePopover.js +115 -82
  64. package/dist/TimePopover.mjs +115 -82
  65. package/dist/Toast.js +0 -4
  66. package/dist/Toast.mjs +0 -4
  67. package/dist/Tooltip.js +28 -19
  68. package/dist/Tooltip.mjs +28 -19
  69. package/dist/UploadCard.js +34 -21
  70. package/dist/UploadCard.mjs +34 -21
  71. package/dist/animations-CHrNeawW.d.mts +28 -0
  72. package/dist/animations-CHrNeawW.d.ts +28 -0
  73. package/dist/animations.d.mts +2 -0
  74. package/dist/animations.d.ts +2 -0
  75. package/dist/animations.js +75 -0
  76. package/dist/animations.mjs +42 -0
  77. package/dist/index.d.mts +4 -1
  78. package/dist/index.d.ts +4 -1
  79. package/dist/index.js +8 -0
  80. package/dist/index.mjs +18 -13
  81. package/package.json +1 -1
@@ -1,5 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { LayoutGroup, motion } from "framer-motion";
4
+ import { springSm } from "./animations";
3
5
  import Button from "./Button";
4
6
  function Pagination({
5
7
  page,
@@ -23,55 +25,89 @@ function Pagination({
23
25
  return range2;
24
26
  };
25
27
  const range = getRange();
26
- const ACTIVE = {
27
- slate: "bg-slate-600 text-white",
28
- gray: "bg-gray-600 text-white",
29
- zinc: "bg-zinc-600 text-white",
30
- neutral: "bg-neutral-600 text-white",
31
- stone: "bg-stone-600 text-white",
32
- red: "bg-red-600 text-white",
33
- orange: "bg-orange-600 text-white",
34
- amber: "bg-amber-600 text-white",
35
- yellow: "bg-yellow-500 text-slate-900",
36
- lime: "bg-lime-600 text-white",
37
- green: "bg-green-600 text-white",
38
- emerald: "bg-emerald-600 text-white",
39
- teal: "bg-teal-600 text-white",
40
- cyan: "bg-cyan-600 text-white",
41
- sky: "bg-sky-600 text-white",
42
- blue: "bg-blue-600 text-white",
43
- indigo: "bg-indigo-600 text-white",
44
- violet: "bg-violet-600 text-white",
45
- purple: "bg-purple-600 text-white",
46
- fuchsia: "bg-fuchsia-600 text-white",
47
- pink: "bg-pink-600 text-white",
48
- rose: "bg-rose-600 text-white"
28
+ const PILL_BG = {
29
+ slate: "bg-slate-600",
30
+ gray: "bg-gray-600",
31
+ zinc: "bg-zinc-600",
32
+ neutral: "bg-neutral-600",
33
+ stone: "bg-stone-600",
34
+ red: "bg-red-600",
35
+ orange: "bg-orange-600",
36
+ amber: "bg-amber-600",
37
+ yellow: "bg-yellow-500",
38
+ lime: "bg-lime-600",
39
+ green: "bg-green-600",
40
+ emerald: "bg-emerald-600",
41
+ teal: "bg-teal-600",
42
+ cyan: "bg-cyan-600",
43
+ sky: "bg-sky-600",
44
+ blue: "bg-blue-600",
45
+ indigo: "bg-indigo-600",
46
+ violet: "bg-violet-600",
47
+ purple: "bg-purple-600",
48
+ fuchsia: "bg-fuchsia-600",
49
+ pink: "bg-pink-600",
50
+ rose: "bg-rose-600"
51
+ };
52
+ const ACTIVE_TEXT = {
53
+ slate: "text-white",
54
+ gray: "text-white",
55
+ zinc: "text-white",
56
+ neutral: "text-white",
57
+ stone: "text-white",
58
+ red: "text-white",
59
+ orange: "text-white",
60
+ amber: "text-white",
61
+ yellow: "text-slate-900",
62
+ lime: "text-white",
63
+ green: "text-white",
64
+ emerald: "text-white",
65
+ teal: "text-white",
66
+ cyan: "text-white",
67
+ sky: "text-white",
68
+ blue: "text-white",
69
+ indigo: "text-white",
70
+ violet: "text-white",
71
+ purple: "text-white",
72
+ fuchsia: "text-white",
73
+ pink: "text-white",
74
+ rose: "text-white"
49
75
  };
50
76
  const Btn = ({
51
77
  children,
52
78
  active,
53
79
  disabled,
54
80
  onClick
55
- }) => /* @__PURE__ */ jsx(
81
+ }) => /* @__PURE__ */ jsxs(
56
82
  Button,
57
83
  {
58
84
  unstyled: true,
59
85
  disabled,
60
86
  onClick,
61
- className: `h-10 min-w-10 px-3 inline-flex items-center justify-center text-[15px] font-medium transition
62
- ${active ? `${ACTIVE[color]} rounded-2xl shadow-sm` : "rounded-none text-slate-900 hover:bg-white/60"}
87
+ className: `relative h-10 min-w-10 px-3 inline-flex items-center justify-center text-[15px] font-medium transition
88
+ ${active ? `${ACTIVE_TEXT[color]}` : "text-slate-900 hover:bg-white/60"}
63
89
  ${disabled ? "opacity-40 cursor-not-allowed" : ""}`,
64
90
  "aria-current": active ? "page" : void 0,
65
- children
91
+ children: [
92
+ active && /* @__PURE__ */ jsx(
93
+ motion.span,
94
+ {
95
+ layoutId: "pagination-pill",
96
+ transition: springSm,
97
+ className: `absolute inset-0 rounded-2xl ${PILL_BG[color]} shadow-sm`
98
+ }
99
+ ),
100
+ children
101
+ ]
66
102
  }
67
103
  );
68
- return /* @__PURE__ */ jsx("nav", { className: className || "w-full md:w-auto", children: /* @__PURE__ */ jsxs("div", { className: "inline-flex overflow-hidden rounded-2xl border border-slate-200 bg-slate-100/60 shadow-sm dark:border-white/10 dark:bg-white/5", children: [
104
+ return /* @__PURE__ */ jsx("nav", { className: className || "w-full md:w-auto", children: /* @__PURE__ */ jsx(LayoutGroup, { children: /* @__PURE__ */ jsxs("div", { className: "relative inline-flex overflow-hidden rounded-2xl border border-slate-200 bg-slate-100/60 shadow-sm dark:border-white/10 dark:bg-white/5", children: [
69
105
  /* @__PURE__ */ jsx(Btn, { disabled: page === 1, onClick: () => onPageChange(page - 1), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-5 w-5", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { d: "M15 18l-6-6 6-6" }) }) }),
70
106
  range.map(
71
107
  (it, idx) => it === "..." ? /* @__PURE__ */ jsx("span", { className: "h-10 min-w-10 px-3 inline-flex items-center justify-center text-slate-500 dark:text-slate-400", children: "\u2026" }, `dots-${idx}`) : /* @__PURE__ */ jsx(Btn, { active: it === page, onClick: () => onPageChange(it), children: it }, it)
72
108
  ),
73
109
  /* @__PURE__ */ jsx(Btn, { disabled: page === totalPages, onClick: () => onPageChange(page + 1), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-5 w-5", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { d: "M9 6l6 6-6 6" }) }) })
74
- ] }) });
110
+ ] }) }) });
75
111
  }
76
112
  export {
77
113
  Pagination as default
@@ -37,6 +37,8 @@ var import_jsx_runtime = require("react/jsx-runtime");
37
37
  var import_Dialog = __toESM(require("./Dialog"));
38
38
  var import_Button = __toESM(require("./Button"));
39
39
  var import_Badge = __toESM(require("./Badge"));
40
+ var import_framer_motion = require("framer-motion");
41
+ var import_animations = require("./animations");
40
42
  function ReviewHistory({
41
43
  items,
42
44
  loading,
@@ -49,9 +51,9 @@ function ReviewHistory({
49
51
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-xs text-muted", children: loading ? "Cargando\u2026" : `${items.length} total` })
50
52
  ] }),
51
53
  latest.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-sm text-muted", children: "Sin registros" }),
52
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2", children: latest.map((r) => {
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_framer_motion.AnimatePresence, { initial: false, children: latest.map((r) => {
53
55
  var _a;
54
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
56
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_framer_motion.motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -8 }, transition: import_animations.springSm, className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
55
57
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
56
58
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Badge.default, { tone: statusTone(r.status), children: statusLabel(r.status) }) }),
57
59
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-xs text-muted", children: formatDateTime(r.created_at) })
@@ -59,7 +61,7 @@ function ReviewHistory({
59
61
  r.comment && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-sm text-foreground whitespace-pre-line", children: r.comment }),
60
62
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-xs text-muted", children: r.by_name || r.by_email ? `${(_a = r.by_name) != null ? _a : ""} ${r.by_email ? `\xB7 ${r.by_email}` : ""}` : r.user_id ? "Usuario interno" : "Invitado" })
61
63
  ] }, r.id);
62
- }) }),
64
+ }) }) }),
63
65
  items.length > 3 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "pt-1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Button.default, { unstyled: true, className: "text-sm text-blue-600 hover:underline dark:text-blue-400", onClick: onViewAll, children: "Ver todos" }) })
64
66
  ] });
65
67
  }
@@ -72,9 +74,9 @@ function ReviewHistoryDialog({
72
74
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Dialog.default.Header, { title: "Historial de estado", onClose, showClose: true, compact: true }),
73
75
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Dialog.default.Body, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid gap-2", children: [
74
76
  items.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-sm text-muted", children: "Sin registros" }),
75
- items.map((r) => {
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2", children: items.map((r) => {
76
78
  var _a;
77
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
79
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_framer_motion.motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, transition: import_animations.springSm, className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
78
80
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
79
81
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Badge.default, { tone: statusTone(r.status), children: statusLabel(r.status) }) }),
80
82
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-xs text-muted", children: formatDateTime(r.created_at) })
@@ -82,7 +84,7 @@ function ReviewHistoryDialog({
82
84
  r.comment && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-sm text-foreground whitespace-pre-line", children: r.comment }),
83
85
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-xs text-muted", children: r.by_name || r.by_email ? `${(_a = r.by_name) != null ? _a : ""} ${r.by_email ? `\xB7 ${r.by_email}` : ""}` : r.user_id ? "Usuario interno" : "Invitado" })
84
86
  ] }, r.id);
85
- })
87
+ }) })
86
88
  ] }) }),
87
89
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Dialog.default.Footer, { align: "end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Button.default, { variant: "secondary", size: "md", className: "shadow-sm", onClick: onClose, children: "Cerrar" }) })
88
90
  ] });
@@ -3,6 +3,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import Dialog from "./Dialog";
4
4
  import Button from "./Button";
5
5
  import Badge from "./Badge";
6
+ import { AnimatePresence, motion } from "framer-motion";
7
+ import { springSm } from "./animations";
6
8
  function ReviewHistory({
7
9
  items,
8
10
  loading,
@@ -15,9 +17,9 @@ function ReviewHistory({
15
17
  /* @__PURE__ */ jsx("div", { className: "text-xs text-muted", children: loading ? "Cargando\u2026" : `${items.length} total` })
16
18
  ] }),
17
19
  latest.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted", children: "Sin registros" }),
18
- /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: latest.map((r) => {
20
+ /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: latest.map((r) => {
19
21
  var _a;
20
- return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
22
+ return /* @__PURE__ */ jsxs(motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -8 }, transition: springSm, className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
21
23
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
22
24
  /* @__PURE__ */ jsx("div", { className: "font-medium", children: /* @__PURE__ */ jsx(Badge, { tone: statusTone(r.status), children: statusLabel(r.status) }) }),
23
25
  /* @__PURE__ */ jsx("div", { className: "text-xs text-muted", children: formatDateTime(r.created_at) })
@@ -25,7 +27,7 @@ function ReviewHistory({
25
27
  r.comment && /* @__PURE__ */ jsx("div", { className: "mt-1 text-sm text-foreground whitespace-pre-line", children: r.comment }),
26
28
  /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted", children: r.by_name || r.by_email ? `${(_a = r.by_name) != null ? _a : ""} ${r.by_email ? `\xB7 ${r.by_email}` : ""}` : r.user_id ? "Usuario interno" : "Invitado" })
27
29
  ] }, r.id);
28
- }) }),
30
+ }) }) }),
29
31
  items.length > 3 && /* @__PURE__ */ jsx("div", { className: "pt-1", children: /* @__PURE__ */ jsx(Button, { unstyled: true, className: "text-sm text-blue-600 hover:underline dark:text-blue-400", onClick: onViewAll, children: "Ver todos" }) })
30
32
  ] });
31
33
  }
@@ -38,9 +40,9 @@ function ReviewHistoryDialog({
38
40
  /* @__PURE__ */ jsx(Dialog.Header, { title: "Historial de estado", onClose, showClose: true, compact: true }),
39
41
  /* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
40
42
  items.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-sm text-muted", children: "Sin registros" }),
41
- items.map((r) => {
43
+ /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: items.map((r) => {
42
44
  var _a;
43
- return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
45
+ return /* @__PURE__ */ jsxs(motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, transition: springSm, className: "rounded-xl border border-border bg-surface px-3 py-2 text-sm", children: [
44
46
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
45
47
  /* @__PURE__ */ jsx("div", { className: "font-medium", children: /* @__PURE__ */ jsx(Badge, { tone: statusTone(r.status), children: statusLabel(r.status) }) }),
46
48
  /* @__PURE__ */ jsx("div", { className: "text-xs text-muted", children: formatDateTime(r.created_at) })
@@ -48,7 +50,7 @@ function ReviewHistoryDialog({
48
50
  r.comment && /* @__PURE__ */ jsx("div", { className: "mt-1 text-sm text-foreground whitespace-pre-line", children: r.comment }),
49
51
  /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted", children: r.by_name || r.by_email ? `${(_a = r.by_name) != null ? _a : ""} ${r.by_email ? `\xB7 ${r.by_email}` : ""}` : r.user_id ? "Usuario interno" : "Invitado" })
50
52
  ] }, r.id);
51
- })
53
+ }) })
52
54
  ] }) }),
53
55
  /* @__PURE__ */ jsx(Dialog.Footer, { align: "end", children: /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "md", className: "shadow-sm", onClick: onClose, children: "Cerrar" }) })
54
56
  ] });
@@ -34,6 +34,8 @@ __export(SearchInput_exports, {
34
34
  module.exports = __toCommonJS(SearchInput_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_react = __toESM(require("react"));
37
+ var import_framer_motion = require("framer-motion");
38
+ var import_animations = require("./animations");
37
39
  var import_Input = __toESM(require("./Input"));
38
40
  function SearchInput({
39
41
  value,
@@ -71,14 +73,17 @@ function SearchInput({
71
73
  }
72
74
  },
73
75
  rightSlot: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
74
- "svg",
76
+ import_framer_motion.motion.svg,
75
77
  {
76
78
  viewBox: "0 0 24 24",
77
- className: "h-5 w-5 opacity-50",
79
+ className: "h-5 w-5 opacity-60",
78
80
  fill: "none",
79
81
  stroke: "currentColor",
80
82
  strokeWidth: "2",
81
83
  "aria-hidden": "true",
84
+ initial: false,
85
+ animate: { x: value ? 2 : 0, opacity: value ? 0.8 : 0.6 },
86
+ transition: import_animations.microTransition,
82
87
  children: [
83
88
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m21 21-4.3-4.3" }),
84
89
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "11", cy: "11", r: "7" })
@@ -86,6 +91,15 @@ function SearchInput({
86
91
  }
87
92
  )
88
93
  }
94
+ ),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
96
+ import_framer_motion.motion.span,
97
+ {
98
+ className: "pointer-events-none absolute inset-0 rounded-2xl",
99
+ initial: false,
100
+ animate: { boxShadow: value ? "0 0 0 2px rgba(56, 189, 248, 0.15)" : "0 0 0 0 rgba(0,0,0,0)" },
101
+ transition: import_animations.microTransition
102
+ }
89
103
  )
90
104
  ] });
91
105
  }
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
+ import { motion } from "framer-motion";
5
+ import { microTransition } from "./animations";
4
6
  import Input from "./Input";
5
7
  function SearchInput({
6
8
  value,
@@ -38,14 +40,17 @@ function SearchInput({
38
40
  }
39
41
  },
40
42
  rightSlot: /* @__PURE__ */ jsxs(
41
- "svg",
43
+ motion.svg,
42
44
  {
43
45
  viewBox: "0 0 24 24",
44
- className: "h-5 w-5 opacity-50",
46
+ className: "h-5 w-5 opacity-60",
45
47
  fill: "none",
46
48
  stroke: "currentColor",
47
49
  strokeWidth: "2",
48
50
  "aria-hidden": "true",
51
+ initial: false,
52
+ animate: { x: value ? 2 : 0, opacity: value ? 0.8 : 0.6 },
53
+ transition: microTransition,
49
54
  children: [
50
55
  /* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" }),
51
56
  /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "7" })
@@ -53,6 +58,15 @@ function SearchInput({
53
58
  }
54
59
  )
55
60
  }
61
+ ),
62
+ /* @__PURE__ */ jsx(
63
+ motion.span,
64
+ {
65
+ className: "pointer-events-none absolute inset-0 rounded-2xl",
66
+ initial: false,
67
+ animate: { boxShadow: value ? "0 0 0 2px rgba(56, 189, 248, 0.15)" : "0 0 0 0 rgba(0,0,0,0)" },
68
+ transition: microTransition
69
+ }
56
70
  )
57
71
  ] });
58
72
  }
package/dist/Select.js CHANGED
@@ -34,6 +34,8 @@ __export(Select_exports, {
34
34
  module.exports = __toCommonJS(Select_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_react = __toESM(require("react"));
37
+ var import_framer_motion = require("framer-motion");
38
+ var import_animations = require("./animations");
37
39
  var import_Button = __toESM(require("./Button"));
38
40
  const S = {
39
41
  sm: { h: "h-8", text: "text-[13px]", radius: "rounded-xl", padX: "px-3", itemPad: "px-3 py-1.5" },
@@ -223,9 +225,14 @@ function ModernSelect({
223
225
  }
224
226
  )
225
227
  ] }),
226
- open && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
227
- "ul",
228
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_framer_motion.AnimatePresence, { children: open ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
229
+ import_framer_motion.motion.ul,
228
230
  {
231
+ variants: import_animations.popOver,
232
+ initial: "initial",
233
+ animate: "animate",
234
+ exit: "exit",
235
+ transition: import_animations.menuTransition,
229
236
  id: `${selectId}-listbox`,
230
237
  role: "listbox",
231
238
  ref: listRef,
@@ -290,7 +297,7 @@ function ModernSelect({
290
297
  })
291
298
  ]
292
299
  }
293
- ),
300
+ ) : null }),
294
301
  hasError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: errorId, className: "mt-1 text-[12px] text-blue-600", children: typeof error === "string" ? error : "Corrige este campo" }) : hint ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: hintId, className: "mt-1 text-[12px] text-slate-500", children: hint }) : null
295
302
  ] });
296
303
  }
package/dist/Select.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
+ import { AnimatePresence, motion } from "framer-motion";
5
+ import { popOver, menuTransition } from "./animations";
4
6
  import Button from "./Button";
5
7
  const S = {
6
8
  sm: { h: "h-8", text: "text-[13px]", radius: "rounded-xl", padX: "px-3", itemPad: "px-3 py-1.5" },
@@ -190,9 +192,14 @@ function ModernSelect({
190
192
  }
191
193
  )
192
194
  ] }),
193
- open && /* @__PURE__ */ jsxs(
194
- "ul",
195
+ /* @__PURE__ */ jsx(AnimatePresence, { children: open ? /* @__PURE__ */ jsxs(
196
+ motion.ul,
195
197
  {
198
+ variants: popOver,
199
+ initial: "initial",
200
+ animate: "animate",
201
+ exit: "exit",
202
+ transition: menuTransition,
196
203
  id: `${selectId}-listbox`,
197
204
  role: "listbox",
198
205
  ref: listRef,
@@ -257,7 +264,7 @@ function ModernSelect({
257
264
  })
258
265
  ]
259
266
  }
260
- ),
267
+ ) : null }),
261
268
  hasError ? /* @__PURE__ */ jsx("div", { id: errorId, className: "mt-1 text-[12px] text-blue-600", children: typeof error === "string" ? error : "Corrige este campo" }) : hint ? /* @__PURE__ */ jsx("div", { id: hintId, className: "mt-1 text-[12px] text-slate-500", children: hint }) : null
262
269
  ] });
263
270
  }
package/dist/Sidebar.js CHANGED
@@ -415,10 +415,19 @@ function RenderItem({
415
415
  "div",
416
416
  {
417
417
  className: [
418
- "flex w-full min-w-0 items-center rounded-2xl px-3 py-2 text-[15px] transition gap-2",
418
+ "relative flex w-full min-w-0 items-center rounded-2xl px-3 py-2 text-[15px] transition gap-2",
419
419
  isActive ? `${WRAP_ACTIVE[color]} text-slate-900 dark:text-white` : "text-slate-700 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-white/10"
420
420
  ].join(" "),
421
421
  children: [
422
+ isActive && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
423
+ import_framer_motion.motion.span,
424
+ {
425
+ layoutId: "sidebar-active",
426
+ className: `absolute inset-0 rounded-2xl ${WRAP_ACTIVE[color]}`,
427
+ transition: { type: "spring", stiffness: 300, damping: 26 },
428
+ style: { zIndex: 0 }
429
+ }
430
+ ),
422
431
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_Button.default, { unstyled: true, type: "button", onClick: () => go(item.key), className: "flex min-w-0 flex-1 items-center gap-3", children: [
423
432
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
424
433
  "span",
@@ -493,11 +502,20 @@ function RenderItem({
493
502
  onClick: () => go(item.key),
494
503
  title: collapsed ? item.label : void 0,
495
504
  className: [
496
- "group flex w-full min-w-0 items-center gap-3 rounded-2xl px-3 py-2 text-left text-[15px] transition",
505
+ "group relative flex w-full min-w-0 items-center gap-3 rounded-2xl px-3 py-2 text-left text-[15px] transition",
497
506
  active ? `${WRAP_ACTIVE[color]} text-slate-900 dark:text-white` : "text-slate-700 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-white/10",
498
507
  collapsed ? "justify-center" : ""
499
508
  ].join(" "),
500
509
  children: [
510
+ active && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
511
+ import_framer_motion.motion.span,
512
+ {
513
+ layoutId: "sidebar-active",
514
+ className: `absolute inset-0 rounded-2xl ${WRAP_ACTIVE[color]}`,
515
+ transition: { type: "spring", stiffness: 300, damping: 26 },
516
+ style: { zIndex: 0 }
517
+ }
518
+ ),
501
519
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
502
520
  "span",
503
521
  {
package/dist/Sidebar.mjs CHANGED
@@ -382,10 +382,19 @@ function RenderItem({
382
382
  "div",
383
383
  {
384
384
  className: [
385
- "flex w-full min-w-0 items-center rounded-2xl px-3 py-2 text-[15px] transition gap-2",
385
+ "relative flex w-full min-w-0 items-center rounded-2xl px-3 py-2 text-[15px] transition gap-2",
386
386
  isActive ? `${WRAP_ACTIVE[color]} text-slate-900 dark:text-white` : "text-slate-700 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-white/10"
387
387
  ].join(" "),
388
388
  children: [
389
+ isActive && /* @__PURE__ */ jsx(
390
+ motion.span,
391
+ {
392
+ layoutId: "sidebar-active",
393
+ className: `absolute inset-0 rounded-2xl ${WRAP_ACTIVE[color]}`,
394
+ transition: { type: "spring", stiffness: 300, damping: 26 },
395
+ style: { zIndex: 0 }
396
+ }
397
+ ),
389
398
  /* @__PURE__ */ jsxs(Button, { unstyled: true, type: "button", onClick: () => go(item.key), className: "flex min-w-0 flex-1 items-center gap-3", children: [
390
399
  /* @__PURE__ */ jsx(
391
400
  "span",
@@ -460,11 +469,20 @@ function RenderItem({
460
469
  onClick: () => go(item.key),
461
470
  title: collapsed ? item.label : void 0,
462
471
  className: [
463
- "group flex w-full min-w-0 items-center gap-3 rounded-2xl px-3 py-2 text-left text-[15px] transition",
472
+ "group relative flex w-full min-w-0 items-center gap-3 rounded-2xl px-3 py-2 text-left text-[15px] transition",
464
473
  active ? `${WRAP_ACTIVE[color]} text-slate-900 dark:text-white` : "text-slate-700 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-white/10",
465
474
  collapsed ? "justify-center" : ""
466
475
  ].join(" "),
467
476
  children: [
477
+ active && /* @__PURE__ */ jsx(
478
+ motion.span,
479
+ {
480
+ layoutId: "sidebar-active",
481
+ className: `absolute inset-0 rounded-2xl ${WRAP_ACTIVE[color]}`,
482
+ transition: { type: "spring", stiffness: 300, damping: 26 },
483
+ style: { zIndex: 0 }
484
+ }
485
+ ),
468
486
  /* @__PURE__ */ jsx(
469
487
  "span",
470
488
  {
package/dist/StatCard.js CHANGED
@@ -26,14 +26,30 @@ var import_jsx_runtime = require("react/jsx-runtime");
26
26
  var import_framer_motion = require("framer-motion");
27
27
  var import_react = require("react");
28
28
  var import_recharts = require("recharts");
29
+ function MotionNumber({ value, format }) {
30
+ const mv = (0, import_framer_motion.useMotionValue)(value);
31
+ const [display, setDisplay] = (0, import_react.useState)(value);
32
+ const prevRef = (0, import_react.useRef)(value);
33
+ (0, import_react.useEffect)(() => {
34
+ const controls = (0, import_framer_motion.animate)(mv, value, { duration: 0.5, ease: "easeOut" });
35
+ const unsub = mv.on("change", (v) => setDisplay(v));
36
+ prevRef.current = value;
37
+ return () => {
38
+ controls.stop();
39
+ unsub();
40
+ };
41
+ }, [value]);
42
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: format ? format(display) : Math.round(display).toLocaleString() });
43
+ }
29
44
  function StatCard({ title, value, hint, spark }) {
30
45
  var _a;
31
46
  const gid = (0, import_react.useId)();
32
47
  const color = (_a = spark == null ? void 0 : spark.color) != null ? _a : "#10b981";
48
+ const isNumber = typeof value === "number";
33
49
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_framer_motion.motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.25 }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "h-full group relative overflow-hidden rounded-2xl border border-slate-200 bg-white/80 p-4 shadow-sm ring-1 ring-black/5 backdrop-blur transition hover:shadow-md dark:border-white/10 dark:bg-white/5", children: [
34
50
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative z-10", children: [
35
51
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-xs font-medium text-slate-500 dark:text-slate-400", children: title }),
36
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-2xl font-semibold tracking-tight", children: value }),
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-2xl font-semibold tracking-tight", children: isNumber ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MotionNumber, { value }) : value }),
37
53
  hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-1 text-xs text-slate-400", children: hint })
38
54
  ] }),
39
55
  spark && spark.values.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/2 opacity-90", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_recharts.AreaChart, { data: spark.values.map((v, i) => ({ i, v })), margin: { top: 8, bottom: 0, left: 0, right: 0 }, children: [
package/dist/StatCard.mjs CHANGED
@@ -1,16 +1,32 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { motion } from "framer-motion";
4
- import { useId } from "react";
3
+ import { animate, motion, useMotionValue } from "framer-motion";
4
+ import { useEffect, useId, useRef, useState } from "react";
5
5
  import { Area, AreaChart, ResponsiveContainer } from "recharts";
6
+ function MotionNumber({ value, format }) {
7
+ const mv = useMotionValue(value);
8
+ const [display, setDisplay] = useState(value);
9
+ const prevRef = useRef(value);
10
+ useEffect(() => {
11
+ const controls = animate(mv, value, { duration: 0.5, ease: "easeOut" });
12
+ const unsub = mv.on("change", (v) => setDisplay(v));
13
+ prevRef.current = value;
14
+ return () => {
15
+ controls.stop();
16
+ unsub();
17
+ };
18
+ }, [value]);
19
+ return /* @__PURE__ */ jsx("span", { children: format ? format(display) : Math.round(display).toLocaleString() });
20
+ }
6
21
  function StatCard({ title, value, hint, spark }) {
7
22
  var _a;
8
23
  const gid = useId();
9
24
  const color = (_a = spark == null ? void 0 : spark.color) != null ? _a : "#10b981";
25
+ const isNumber = typeof value === "number";
10
26
  return /* @__PURE__ */ jsx(motion.div, { initial: { opacity: 0, y: 8 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.25 }, children: /* @__PURE__ */ jsxs("div", { className: "h-full group relative overflow-hidden rounded-2xl border border-slate-200 bg-white/80 p-4 shadow-sm ring-1 ring-black/5 backdrop-blur transition hover:shadow-md dark:border-white/10 dark:bg-white/5", children: [
11
27
  /* @__PURE__ */ jsxs("div", { className: "relative z-10", children: [
12
28
  /* @__PURE__ */ jsx("div", { className: "text-xs font-medium text-slate-500 dark:text-slate-400", children: title }),
13
- /* @__PURE__ */ jsx("div", { className: "mt-1 text-2xl font-semibold tracking-tight", children: value }),
29
+ /* @__PURE__ */ jsx("div", { className: "mt-1 text-2xl font-semibold tracking-tight", children: isNumber ? /* @__PURE__ */ jsx(MotionNumber, { value }) : value }),
14
30
  hint && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-slate-400", children: hint })
15
31
  ] }),
16
32
  spark && spark.values.length > 1 && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-1/2 opacity-90", children: /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(AreaChart, { data: spark.values.map((v, i) => ({ i, v })), margin: { top: 8, bottom: 0, left: 0, right: 0 }, children: [