framepexls-ui-lib 0.1.14 → 0.1.15

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.
@@ -51,27 +51,27 @@ const SIZE = {
51
51
  md: { text: "text-sm", padX: "px-3.5", padY: "py-2", height: "h-9", icon: "h-4 w-4" }
52
52
  };
53
53
  const ACTIVE_SOFT = {
54
- rose: "border-blue-300 bg-blue-50/80 text-blue-700 dark:border-blue-400/40 dark:bg-blue-500/10 dark:text-blue-200",
54
+ rose: "border-rose-300 bg-rose-50/80 text-rose-700 dark:border-rose-400/40 dark:bg-rose-500/10 dark:text-rose-200",
55
55
  sky: "border-sky-300 bg-sky-50/80 text-sky-700 dark:border-sky-400/40 dark:bg-sky-500/10 dark:text-sky-200",
56
- violet: "border-blue-300 bg-blue-50/80 text-blue-700 dark:border-blue-400/40 dark:bg-blue-500/10 dark:text-blue-200",
56
+ violet: "border-violet-300 bg-violet-50/80 text-violet-700 dark:border-violet-400/40 dark:bg-violet-500/10 dark:text-violet-200",
57
57
  emerald: "border-emerald-300 bg-emerald-50/80 text-emerald-700 dark:border-emerald-400/40 dark:bg-emerald-500/10 dark:text-emerald-200",
58
58
  indigo: "border-indigo-300 bg-indigo-50/80 text-indigo-700 dark:border-indigo-400/40 dark:bg-indigo-500/10 dark:text-indigo-200",
59
59
  amber: "border-amber-300 bg-amber-50/80 text-amber-700 dark:border-amber-400/40 dark:bg-amber-500/10 dark:text-amber-200",
60
60
  slate: "border-slate-300 bg-slate-50/80 text-slate-700 dark:border-slate-400/40 dark:bg-slate-500/10 dark:text-slate-200"
61
61
  };
62
62
  const ACTIVE_OUTLINE = {
63
- rose: "border-blue-400 text-blue-700 dark:text-blue-200",
63
+ rose: "border-rose-400 text-rose-700 dark:text-rose-200",
64
64
  sky: "border-sky-400 text-sky-700 dark:text-sky-200",
65
- violet: "border-blue-400 text-blue-700 dark:text-blue-200",
65
+ violet: "border-violet-400 text-violet-700 dark:text-violet-200",
66
66
  emerald: "border-emerald-400 text-emerald-700 dark:text-emerald-200",
67
67
  indigo: "border-indigo-400 text-indigo-700 dark:text-indigo-200",
68
68
  amber: "border-amber-400 text-amber-700 dark:text-amber-200",
69
69
  slate: "border-slate-400 text-slate-700 dark:text-slate-200"
70
70
  };
71
71
  const ACTIVE_GLASS = {
72
- rose: "border-blue-300 bg-gradient-to-br from-blue-50 to-blue-50/0 text-blue-700 dark:from-blue-400/10 dark:text-blue-200",
72
+ rose: "border-rose-300 bg-gradient-to-br from-rose-50 to-rose-50/0 text-rose-700 dark:from-rose-400/10 dark:text-rose-200",
73
73
  sky: "border-sky-300 bg-gradient-to-br from-sky-50 to-sky-50/0 text-sky-700 dark:from-sky-400/10 dark:text-sky-200",
74
- violet: "border-blue-300 bg-gradient-to-br from-blue-50 to-blue-50/0 text-blue-700 dark:from-blue-400/10 dark:text-blue-200",
74
+ violet: "border-violet-300 bg-gradient-to-br from-violet-50 to-violet-50/0 text-violet-700 dark:from-violet-400/10 dark:text-violet-200",
75
75
  emerald: "border-emerald-300 bg-gradient-to-br from-emerald-50 to-emerald-50/0 text-emerald-700 dark:from-emerald-400/10 dark:text-emerald-200",
76
76
  indigo: "border-indigo-300 bg-gradient-to-br from-indigo-50 to-indigo-50/0 text-indigo-700 dark:from-indigo-400/10 dark:text-indigo-200",
77
77
  amber: "border-amber-300 bg-gradient-to-br from-amber-50 to-amber-50/0 text-amber-700 dark:from-amber-400/10 dark:text-amber-200",
@@ -167,9 +167,9 @@ function CheckboxPillsGroup({
167
167
  className: cx(
168
168
  "grid place-items-center rounded-full",
169
169
  {
170
- rose: "bg-blue-500/10 text-blue-600",
170
+ rose: "bg-rose-500/10 text-rose-600",
171
171
  sky: "bg-sky-500/10 text-sky-600",
172
- violet: "bg-blue-500/10 text-blue-600",
172
+ violet: "bg-violet-500/10 text-violet-600",
173
173
  emerald: "bg-emerald-500/10 text-emerald-600",
174
174
  indigo: "bg-indigo-500/10 text-indigo-600",
175
175
  amber: "bg-amber-500/10 text-amber-600",
@@ -18,27 +18,27 @@ const SIZE = {
18
18
  md: { text: "text-sm", padX: "px-3.5", padY: "py-2", height: "h-9", icon: "h-4 w-4" }
19
19
  };
20
20
  const ACTIVE_SOFT = {
21
- rose: "border-blue-300 bg-blue-50/80 text-blue-700 dark:border-blue-400/40 dark:bg-blue-500/10 dark:text-blue-200",
21
+ rose: "border-rose-300 bg-rose-50/80 text-rose-700 dark:border-rose-400/40 dark:bg-rose-500/10 dark:text-rose-200",
22
22
  sky: "border-sky-300 bg-sky-50/80 text-sky-700 dark:border-sky-400/40 dark:bg-sky-500/10 dark:text-sky-200",
23
- violet: "border-blue-300 bg-blue-50/80 text-blue-700 dark:border-blue-400/40 dark:bg-blue-500/10 dark:text-blue-200",
23
+ violet: "border-violet-300 bg-violet-50/80 text-violet-700 dark:border-violet-400/40 dark:bg-violet-500/10 dark:text-violet-200",
24
24
  emerald: "border-emerald-300 bg-emerald-50/80 text-emerald-700 dark:border-emerald-400/40 dark:bg-emerald-500/10 dark:text-emerald-200",
25
25
  indigo: "border-indigo-300 bg-indigo-50/80 text-indigo-700 dark:border-indigo-400/40 dark:bg-indigo-500/10 dark:text-indigo-200",
26
26
  amber: "border-amber-300 bg-amber-50/80 text-amber-700 dark:border-amber-400/40 dark:bg-amber-500/10 dark:text-amber-200",
27
27
  slate: "border-slate-300 bg-slate-50/80 text-slate-700 dark:border-slate-400/40 dark:bg-slate-500/10 dark:text-slate-200"
28
28
  };
29
29
  const ACTIVE_OUTLINE = {
30
- rose: "border-blue-400 text-blue-700 dark:text-blue-200",
30
+ rose: "border-rose-400 text-rose-700 dark:text-rose-200",
31
31
  sky: "border-sky-400 text-sky-700 dark:text-sky-200",
32
- violet: "border-blue-400 text-blue-700 dark:text-blue-200",
32
+ violet: "border-violet-400 text-violet-700 dark:text-violet-200",
33
33
  emerald: "border-emerald-400 text-emerald-700 dark:text-emerald-200",
34
34
  indigo: "border-indigo-400 text-indigo-700 dark:text-indigo-200",
35
35
  amber: "border-amber-400 text-amber-700 dark:text-amber-200",
36
36
  slate: "border-slate-400 text-slate-700 dark:text-slate-200"
37
37
  };
38
38
  const ACTIVE_GLASS = {
39
- rose: "border-blue-300 bg-gradient-to-br from-blue-50 to-blue-50/0 text-blue-700 dark:from-blue-400/10 dark:text-blue-200",
39
+ rose: "border-rose-300 bg-gradient-to-br from-rose-50 to-rose-50/0 text-rose-700 dark:from-rose-400/10 dark:text-rose-200",
40
40
  sky: "border-sky-300 bg-gradient-to-br from-sky-50 to-sky-50/0 text-sky-700 dark:from-sky-400/10 dark:text-sky-200",
41
- violet: "border-blue-300 bg-gradient-to-br from-blue-50 to-blue-50/0 text-blue-700 dark:from-blue-400/10 dark:text-blue-200",
41
+ violet: "border-violet-300 bg-gradient-to-br from-violet-50 to-violet-50/0 text-violet-700 dark:from-violet-400/10 dark:text-violet-200",
42
42
  emerald: "border-emerald-300 bg-gradient-to-br from-emerald-50 to-emerald-50/0 text-emerald-700 dark:from-emerald-400/10 dark:text-emerald-200",
43
43
  indigo: "border-indigo-300 bg-gradient-to-br from-indigo-50 to-indigo-50/0 text-indigo-700 dark:from-indigo-400/10 dark:text-indigo-200",
44
44
  amber: "border-amber-300 bg-gradient-to-br from-amber-50 to-amber-50/0 text-amber-700 dark:from-amber-400/10 dark:text-amber-200",
@@ -134,9 +134,9 @@ function CheckboxPillsGroup({
134
134
  className: cx(
135
135
  "grid place-items-center rounded-full",
136
136
  {
137
- rose: "bg-blue-500/10 text-blue-600",
137
+ rose: "bg-rose-500/10 text-rose-600",
138
138
  sky: "bg-sky-500/10 text-sky-600",
139
- violet: "bg-blue-500/10 text-blue-600",
139
+ violet: "bg-violet-500/10 text-violet-600",
140
140
  emerald: "bg-emerald-500/10 text-emerald-600",
141
141
  indigo: "bg-indigo-500/10 text-indigo-600",
142
142
  amber: "bg-amber-500/10 text-amber-600",
@@ -0,0 +1,28 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+ import { PillsOption, CheckboxPillsGroupProps } from './CheckboxPillsGroup.mjs';
4
+
5
+ type FilterGroup = {
6
+ key: string;
7
+ label?: React__default.ReactNode;
8
+ options: PillsOption[];
9
+ value: string[];
10
+ multiple?: boolean;
11
+ pillsProps?: Omit<CheckboxPillsGroupProps, "options" | "value" | "onChange" | "multiple" | "label">;
12
+ onChange?: (next: string[]) => void;
13
+ };
14
+ type FiltersMultiSelectProps = {
15
+ groups: FilterGroup[];
16
+ onChange?: (nextByKey: Record<string, string[]>, changedKey: string) => void;
17
+ className?: string;
18
+ gap?: number | string;
19
+ color?: "rose" | "sky" | "violet" | "emerald" | "indigo" | "amber" | "slate";
20
+ open?: boolean;
21
+ onToggleOpen?: React__default.Dispatch<React__default.SetStateAction<boolean>>;
22
+ triggerLabel?: React__default.ReactNode;
23
+ showActiveCount?: boolean;
24
+ align?: "start" | "end";
25
+ };
26
+ declare function FiltersMultiSelect({ groups, onChange, className, gap, color, open: controlledOpen, onToggleOpen, triggerLabel, showActiveCount, align, }: FiltersMultiSelectProps): react_jsx_runtime.JSX.Element;
27
+
28
+ export { type FilterGroup, type FiltersMultiSelectProps, FiltersMultiSelect as default };
@@ -0,0 +1,28 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+ import { PillsOption, CheckboxPillsGroupProps } from './CheckboxPillsGroup.js';
4
+
5
+ type FilterGroup = {
6
+ key: string;
7
+ label?: React__default.ReactNode;
8
+ options: PillsOption[];
9
+ value: string[];
10
+ multiple?: boolean;
11
+ pillsProps?: Omit<CheckboxPillsGroupProps, "options" | "value" | "onChange" | "multiple" | "label">;
12
+ onChange?: (next: string[]) => void;
13
+ };
14
+ type FiltersMultiSelectProps = {
15
+ groups: FilterGroup[];
16
+ onChange?: (nextByKey: Record<string, string[]>, changedKey: string) => void;
17
+ className?: string;
18
+ gap?: number | string;
19
+ color?: "rose" | "sky" | "violet" | "emerald" | "indigo" | "amber" | "slate";
20
+ open?: boolean;
21
+ onToggleOpen?: React__default.Dispatch<React__default.SetStateAction<boolean>>;
22
+ triggerLabel?: React__default.ReactNode;
23
+ showActiveCount?: boolean;
24
+ align?: "start" | "end";
25
+ };
26
+ declare function FiltersMultiSelect({ groups, onChange, className, gap, color, open: controlledOpen, onToggleOpen, triggerLabel, showActiveCount, align, }: FiltersMultiSelectProps): react_jsx_runtime.JSX.Element;
27
+
28
+ export { type FilterGroup, type FiltersMultiSelectProps, FiltersMultiSelect as default };
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var FiltersMultiSelect_exports = {};
31
+ __export(FiltersMultiSelect_exports, {
32
+ default: () => FiltersMultiSelect
33
+ });
34
+ module.exports = __toCommonJS(FiltersMultiSelect_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = __toESM(require("react"));
37
+ var import_react2 = require("motion/react");
38
+ var import_CheckboxPillsGroup = __toESM(require("./CheckboxPillsGroup"));
39
+ var import_Button = __toESM(require("./Button"));
40
+ const clsx = (...a) => a.filter(Boolean).join(" ");
41
+ function FiltersMultiSelect({
42
+ groups,
43
+ onChange,
44
+ className,
45
+ gap = 12,
46
+ color,
47
+ open: controlledOpen,
48
+ onToggleOpen,
49
+ triggerLabel = "Filtros",
50
+ showActiveCount = true,
51
+ align = "start"
52
+ }) {
53
+ const currentMap = import_react.default.useMemo(() => {
54
+ const m = {};
55
+ for (const g of groups) m[g.key] = Array.isArray(g.value) ? g.value : [];
56
+ return m;
57
+ }, [groups]);
58
+ const [uncontrolledOpen, setUncontrolledOpen] = import_react.default.useState(false);
59
+ const isControlled = typeof controlledOpen === "boolean" && typeof onToggleOpen === "function";
60
+ const open = isControlled ? controlledOpen : uncontrolledOpen;
61
+ const setOpen = isControlled ? onToggleOpen : setUncontrolledOpen;
62
+ const rootRef = import_react.default.useRef(null);
63
+ import_react.default.useEffect(() => {
64
+ const onDocClick = (e) => {
65
+ if (!open) return;
66
+ if (!rootRef.current) return;
67
+ if (!rootRef.current.contains(e.target)) setOpen(false);
68
+ };
69
+ window.addEventListener("click", onDocClick);
70
+ return () => window.removeEventListener("click", onDocClick);
71
+ }, [open, setOpen]);
72
+ const onGroupChange = (key, next, cb) => {
73
+ cb == null ? void 0 : cb(next);
74
+ if (onChange) {
75
+ const m = { ...currentMap, [key]: next };
76
+ onChange(m, key);
77
+ }
78
+ };
79
+ const activeCount = import_react.default.useMemo(
80
+ () => Object.values(currentMap).reduce((acc, arr) => acc + (Array.isArray(arr) ? arr.length : 0), 0),
81
+ [currentMap]
82
+ );
83
+ const panelStyle = typeof gap === "number" ? { gap } : { gap: void 0 };
84
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: rootRef, className: clsx("relative inline-block", className), children: [
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
86
+ import_Button.default,
87
+ {
88
+ unstyled: true,
89
+ onClick: (e) => {
90
+ e.stopPropagation();
91
+ setOpen((v) => !v);
92
+ },
93
+ className: clsx(
94
+ "relative inline-flex items-center gap-2 min-h-[44px] rounded-2xl border border-slate-200 bg-white px-3 pr-9 text-sm text-slate-900 shadow-sm outline-none transition",
95
+ "hover:bg-white focus:ring-4 focus:ring-slate-900/5 focus:border-slate-300",
96
+ "dark:border-white/10 dark:bg-white/10 dark:text-slate-100 dark:focus:ring-white/10"
97
+ ),
98
+ children: [
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: triggerLabel }),
100
+ showActiveCount && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "rounded-full bg-slate-100 px-2 py-0.5 text-xs text-slate-700 dark:bg-white/10 dark:text-slate-200", children: activeCount }),
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 inline-flex h-7 w-7 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-600 dark:border-white/10 dark:bg-white/5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", className: clsx("h-4 w-4 transition", open && "rotate-180"), fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m6 9 6 6 6-6" }) }) })
102
+ ]
103
+ }
104
+ ),
105
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react2.AnimatePresence, { children: open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ import_react2.motion.div,
107
+ {
108
+ initial: { opacity: 0, y: 6 },
109
+ animate: { opacity: 1, y: 0 },
110
+ exit: { opacity: 0, y: -6 },
111
+ className: clsx(
112
+ "absolute z-20 mt-2 w-[min(96vw,720px)] overflow-hidden rounded-2xl border border-slate-200 bg-white p-3 shadow-xl dark:border-white/10 dark:bg-[#0e0d0e]",
113
+ align === "end" ? "right-0" : "left-0"
114
+ ),
115
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap", style: panelStyle, children: groups.map((g) => {
116
+ var _a, _b, _c;
117
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
118
+ import_CheckboxPillsGroup.default,
119
+ {
120
+ size: "sm",
121
+ options: g.options,
122
+ value: g.value,
123
+ onChange: (next) => onGroupChange(g.key, next, g.onChange),
124
+ multiple: (_a = g.multiple) != null ? _a : true,
125
+ label: g.label,
126
+ ...{
127
+ ...g.pillsProps,
128
+ color: (_c = (_b = g.pillsProps) == null ? void 0 : _b.color) != null ? _c : color
129
+ }
130
+ }
131
+ ) }, g.key);
132
+ }) })
133
+ }
134
+ ) })
135
+ ] });
136
+ }
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import { AnimatePresence, motion } from "motion/react";
5
+ import CheckboxPillsGroup from "./CheckboxPillsGroup";
6
+ import Button from "./Button";
7
+ const clsx = (...a) => a.filter(Boolean).join(" ");
8
+ function FiltersMultiSelect({
9
+ groups,
10
+ onChange,
11
+ className,
12
+ gap = 12,
13
+ color,
14
+ open: controlledOpen,
15
+ onToggleOpen,
16
+ triggerLabel = "Filtros",
17
+ showActiveCount = true,
18
+ align = "start"
19
+ }) {
20
+ const currentMap = React.useMemo(() => {
21
+ const m = {};
22
+ for (const g of groups) m[g.key] = Array.isArray(g.value) ? g.value : [];
23
+ return m;
24
+ }, [groups]);
25
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);
26
+ const isControlled = typeof controlledOpen === "boolean" && typeof onToggleOpen === "function";
27
+ const open = isControlled ? controlledOpen : uncontrolledOpen;
28
+ const setOpen = isControlled ? onToggleOpen : setUncontrolledOpen;
29
+ const rootRef = React.useRef(null);
30
+ React.useEffect(() => {
31
+ const onDocClick = (e) => {
32
+ if (!open) return;
33
+ if (!rootRef.current) return;
34
+ if (!rootRef.current.contains(e.target)) setOpen(false);
35
+ };
36
+ window.addEventListener("click", onDocClick);
37
+ return () => window.removeEventListener("click", onDocClick);
38
+ }, [open, setOpen]);
39
+ const onGroupChange = (key, next, cb) => {
40
+ cb == null ? void 0 : cb(next);
41
+ if (onChange) {
42
+ const m = { ...currentMap, [key]: next };
43
+ onChange(m, key);
44
+ }
45
+ };
46
+ const activeCount = React.useMemo(
47
+ () => Object.values(currentMap).reduce((acc, arr) => acc + (Array.isArray(arr) ? arr.length : 0), 0),
48
+ [currentMap]
49
+ );
50
+ const panelStyle = typeof gap === "number" ? { gap } : { gap: void 0 };
51
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: clsx("relative inline-block", className), children: [
52
+ /* @__PURE__ */ jsxs(
53
+ Button,
54
+ {
55
+ unstyled: true,
56
+ onClick: (e) => {
57
+ e.stopPropagation();
58
+ setOpen((v) => !v);
59
+ },
60
+ className: clsx(
61
+ "relative inline-flex items-center gap-2 min-h-[44px] rounded-2xl border border-slate-200 bg-white px-3 pr-9 text-sm text-slate-900 shadow-sm outline-none transition",
62
+ "hover:bg-white focus:ring-4 focus:ring-slate-900/5 focus:border-slate-300",
63
+ "dark:border-white/10 dark:bg-white/10 dark:text-slate-100 dark:focus:ring-white/10"
64
+ ),
65
+ children: [
66
+ /* @__PURE__ */ jsx("span", { children: triggerLabel }),
67
+ showActiveCount && /* @__PURE__ */ jsx("span", { className: "rounded-full bg-slate-100 px-2 py-0.5 text-xs text-slate-700 dark:bg-white/10 dark:text-slate-200", children: activeCount }),
68
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 inline-flex h-7 w-7 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-600 dark:border-white/10 dark:bg-white/5", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: clsx("h-4 w-4 transition", open && "rotate-180"), fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) }) })
69
+ ]
70
+ }
71
+ ),
72
+ /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(
73
+ motion.div,
74
+ {
75
+ initial: { opacity: 0, y: 6 },
76
+ animate: { opacity: 1, y: 0 },
77
+ exit: { opacity: 0, y: -6 },
78
+ className: clsx(
79
+ "absolute z-20 mt-2 w-[min(96vw,720px)] overflow-hidden rounded-2xl border border-slate-200 bg-white p-3 shadow-xl dark:border-white/10 dark:bg-[#0e0d0e]",
80
+ align === "end" ? "right-0" : "left-0"
81
+ ),
82
+ children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap", style: panelStyle, children: groups.map((g) => {
83
+ var _a, _b, _c;
84
+ return /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(
85
+ CheckboxPillsGroup,
86
+ {
87
+ size: "sm",
88
+ options: g.options,
89
+ value: g.value,
90
+ onChange: (next) => onGroupChange(g.key, next, g.onChange),
91
+ multiple: (_a = g.multiple) != null ? _a : true,
92
+ label: g.label,
93
+ ...{
94
+ ...g.pillsProps,
95
+ color: (_c = (_b = g.pillsProps) == null ? void 0 : _b.color) != null ? _c : color
96
+ }
97
+ }
98
+ ) }, g.key);
99
+ }) })
100
+ }
101
+ ) })
102
+ ] });
103
+ }
104
+ export {
105
+ FiltersMultiSelect as default
106
+ };
@@ -98,7 +98,7 @@ function MediaSelector({
98
98
  setOpenPicker(false);
99
99
  onClose == null ? void 0 : onClose();
100
100
  } }),
101
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Dialog.default.Body, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-3", children: [
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Dialog.default.Body, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
102
102
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ChartCard.default, { className: "lg:col-span-1", title: "Subir imagen", subtitle: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Arrastra una imagen o selecci\xF3nala" }), right: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
103
103
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Input.default, { unstyled: true, ref: inputRef, type: "file", accept, className: "hidden", onChange: (e) => onFiles(e.target.files) }),
104
104
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Button.default, { onClick: () => {
@@ -65,7 +65,7 @@ function MediaSelector({
65
65
  setOpenPicker(false);
66
66
  onClose == null ? void 0 : onClose();
67
67
  } }),
68
- /* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-3", children: [
68
+ /* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [
69
69
  /* @__PURE__ */ jsx(ChartCard, { className: "lg:col-span-1", title: "Subir imagen", subtitle: /* @__PURE__ */ jsx("span", { children: "Arrastra una imagen o selecci\xF3nala" }), right: /* @__PURE__ */ jsxs(Fragment, { children: [
70
70
  /* @__PURE__ */ jsx(Input, { unstyled: true, ref: inputRef, type: "file", accept, className: "hidden", onChange: (e) => onFiles(e.target.files) }),
71
71
  /* @__PURE__ */ jsx(Button, { onClick: () => {
package/dist/index.d.mts CHANGED
@@ -2,6 +2,7 @@ export { default as Button } from './Button.mjs';
2
2
  export { default as ActionIconButton } from './ActionIconButton.mjs';
3
3
  export { default as Input, InputProps } from './Input.mjs';
4
4
  export { default as CheckboxPillsGroup, CheckboxPillsGroupProps, PillsOption } from './CheckboxPillsGroup.mjs';
5
+ export { FilterGroup, default as FiltersMultiSelect, FiltersMultiSelectProps } from './FiltersMultiSelect.mjs';
5
6
  export { default as Select } from './Select.mjs';
6
7
  export { ComboOption, ComboSection, default as ComboSelect, ComboSelectProps } from './ComboSelect.mjs';
7
8
  export { ColumnItem, default as ColumnSelector } from './ColumnSelector.mjs';
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { default as Button } from './Button.js';
2
2
  export { default as ActionIconButton } from './ActionIconButton.js';
3
3
  export { default as Input, InputProps } from './Input.js';
4
4
  export { default as CheckboxPillsGroup, CheckboxPillsGroupProps, PillsOption } from './CheckboxPillsGroup.js';
5
+ export { FilterGroup, default as FiltersMultiSelect, FiltersMultiSelectProps } from './FiltersMultiSelect.js';
5
6
  export { default as Select } from './Select.js';
6
7
  export { ComboOption, ComboSection, default as ComboSelect, ComboSelectProps } from './ComboSelect.js';
7
8
  export { ColumnItem, default as ColumnSelector } from './ColumnSelector.js';
package/dist/index.js CHANGED
@@ -48,6 +48,7 @@ __export(index_exports, {
48
48
  Drawer: () => import_Drawer.default,
49
49
  Dropdown: () => import_Dropdown.default,
50
50
  EmptyState: () => import_EmptyState.default,
51
+ FiltersMultiSelect: () => import_FiltersMultiSelect.default,
51
52
  InfoGrid: () => import_InfoGrid.default,
52
53
  Input: () => import_Input.default,
53
54
  Link: () => import_Link.default,
@@ -84,6 +85,7 @@ var import_Button = __toESM(require("./Button"));
84
85
  var import_ActionIconButton = __toESM(require("./ActionIconButton"));
85
86
  var import_Input = __toESM(require("./Input"));
86
87
  var import_CheckboxPillsGroup = __toESM(require("./CheckboxPillsGroup"));
88
+ var import_FiltersMultiSelect = __toESM(require("./FiltersMultiSelect"));
87
89
  var import_Select = __toESM(require("./Select"));
88
90
  var import_ComboSelect = __toESM(require("./ComboSelect"));
89
91
  var import_ColumnSelector = __toESM(require("./ColumnSelector"));
@@ -149,6 +151,7 @@ __reExport(index_exports, require("./iconos"), module.exports);
149
151
  Drawer,
150
152
  Dropdown,
151
153
  EmptyState,
154
+ FiltersMultiSelect,
152
155
  InfoGrid,
153
156
  Input,
154
157
  Link,
package/dist/index.mjs CHANGED
@@ -2,98 +2,100 @@ import { default as default2 } from "./Button";
2
2
  import { default as default3 } from "./ActionIconButton";
3
3
  import { default as default4 } from "./Input";
4
4
  import { default as default5 } from "./CheckboxPillsGroup";
5
- import { default as default6 } from "./Select";
6
- import { default as default7 } from "./ComboSelect";
7
- import { default as default8 } from "./ColumnSelector";
8
- import { default as default9 } from "./DateTimeField";
9
- import { default as default10 } from "./Dialog";
5
+ import { default as default6 } from "./FiltersMultiSelect";
6
+ import { default as default7 } from "./Select";
7
+ import { default as default8 } from "./ComboSelect";
8
+ import { default as default9 } from "./ColumnSelector";
9
+ import { default as default10 } from "./DateTimeField";
10
+ import { default as default11 } from "./Dialog";
10
11
  export * from "./Dialog";
11
- import { default as default11 } from "./Dropdown";
12
+ import { default as default12 } from "./Dropdown";
12
13
  export * from "./Dropdown";
13
14
  import { Th, SortTh, Td } from "./Table";
14
- import { default as default12 } from "./Pagination";
15
- import { default as default13 } from "./InfoGrid";
16
- import { default as default14 } from "./ChartCard";
17
- import { default as default15 } from "./UploadCard";
18
- import { default as default16 } from "./MediaCard";
19
- import { default as default17 } from "./MediaSelector";
20
- import { default as default18 } from "./StatCard";
21
- import { default as default19 } from "./Badge";
22
- import { default as default20 } from "./BadgeCluster";
23
- import { default as default21 } from "./Breadcrumb";
24
- import { default as default22 } from "./EmptyState";
25
- import { default as default23 } from "./Money";
26
- import { default as default24 } from "./TimeAgo";
27
- import { default as default25 } from "./AvatarSquare";
28
- import { default as default26 } from "./AvatarGroup";
29
- import { default as default27 } from "./AppTopbar";
30
- import { default as default28 } from "./OrderButton";
31
- import { default as default29 } from "./SearchInput";
32
- import { default as default30 } from "./ReviewHistory";
15
+ import { default as default13 } from "./Pagination";
16
+ import { default as default14 } from "./InfoGrid";
17
+ import { default as default15 } from "./ChartCard";
18
+ import { default as default16 } from "./UploadCard";
19
+ import { default as default17 } from "./MediaCard";
20
+ import { default as default18 } from "./MediaSelector";
21
+ import { default as default19 } from "./StatCard";
22
+ import { default as default20 } from "./Badge";
23
+ import { default as default21 } from "./BadgeCluster";
24
+ import { default as default22 } from "./Breadcrumb";
25
+ import { default as default23 } from "./EmptyState";
26
+ import { default as default24 } from "./Money";
27
+ import { default as default25 } from "./TimeAgo";
28
+ import { default as default26 } from "./AvatarSquare";
29
+ import { default as default27 } from "./AvatarGroup";
30
+ import { default as default28 } from "./AppTopbar";
31
+ import { default as default29 } from "./OrderButton";
32
+ import { default as default30 } from "./SearchInput";
33
+ import { default as default31 } from "./ReviewHistory";
33
34
  import { ReviewHistoryDialog } from "./ReviewHistory";
34
- import { default as default31 } from "./MultiComboSelect";
35
- import { default as default32 } from "./Sidebar";
36
- import { default as default33 } from "./Card";
37
- import { default as default34 } from "./Drawer";
38
- import { default as default35 } from "./Tooltip";
39
- import { default as default36 } from "./Link";
35
+ import { default as default32 } from "./MultiComboSelect";
36
+ import { default as default33 } from "./Sidebar";
37
+ import { default as default34 } from "./Card";
38
+ import { default as default35 } from "./Drawer";
39
+ import { default as default36 } from "./Tooltip";
40
+ import { default as default37 } from "./Link";
40
41
  import { ToastProvider, useToast } from "./Toast";
41
- import { default as default37 } from "./CalendarPanel";
42
- import { default as default38 } from "./TimePopover";
42
+ import { default as default38 } from "./CalendarPanel";
43
+ import { default as default39 } from "./TimePopover";
43
44
  import { WeekPopover, MonthPopover } from "./TimePopover";
44
- import { default as default39 } from "./TimePanel";
45
- import { default as default40 } from "./TimeRangeField";
46
- import { default as default41 } from "./Steps";
45
+ import { default as default40 } from "./TimePanel";
46
+ import { default as default41 } from "./TimeRangeField";
47
+ import { default as default42 } from "./Steps";
47
48
  import { StepsNav } from "./Steps";
48
49
  export * from "./iconos";
49
50
  export {
50
51
  default3 as ActionIconButton,
51
- default27 as AppTopbar,
52
- default26 as AvatarGroup,
53
- default25 as AvatarSquare,
54
- default19 as Badge,
55
- default20 as BadgeCluster,
56
- default21 as Breadcrumb,
52
+ default28 as AppTopbar,
53
+ default27 as AvatarGroup,
54
+ default26 as AvatarSquare,
55
+ default20 as Badge,
56
+ default21 as BadgeCluster,
57
+ default22 as Breadcrumb,
57
58
  default2 as Button,
58
- default37 as CalendarPanel,
59
- default33 as Card,
60
- default14 as ChartCard,
59
+ default38 as CalendarPanel,
60
+ default34 as Card,
61
+ default15 as ChartCard,
61
62
  default5 as CheckboxPillsGroup,
62
- default8 as ColumnSelector,
63
- default7 as ComboSelect,
64
- default9 as DateTimeField,
65
- default10 as Dialog,
66
- default34 as Drawer,
67
- default11 as Dropdown,
68
- default22 as EmptyState,
69
- default13 as InfoGrid,
63
+ default9 as ColumnSelector,
64
+ default8 as ComboSelect,
65
+ default10 as DateTimeField,
66
+ default11 as Dialog,
67
+ default35 as Drawer,
68
+ default12 as Dropdown,
69
+ default23 as EmptyState,
70
+ default6 as FiltersMultiSelect,
71
+ default14 as InfoGrid,
70
72
  default4 as Input,
71
- default36 as Link,
72
- default16 as MediaCard,
73
- default17 as MediaSelector,
74
- default23 as Money,
73
+ default37 as Link,
74
+ default17 as MediaCard,
75
+ default18 as MediaSelector,
76
+ default24 as Money,
75
77
  MonthPopover,
76
- default31 as MultiComboSelect,
77
- default28 as OrderButton,
78
- default12 as Pagination,
79
- default30 as ReviewHistory,
78
+ default32 as MultiComboSelect,
79
+ default29 as OrderButton,
80
+ default13 as Pagination,
81
+ default31 as ReviewHistory,
80
82
  ReviewHistoryDialog,
81
- default29 as SearchInput,
82
- default6 as Select,
83
- default32 as Sidebar,
83
+ default30 as SearchInput,
84
+ default7 as Select,
85
+ default33 as Sidebar,
84
86
  SortTh,
85
- default18 as StatCard,
86
- default41 as Steps,
87
+ default19 as StatCard,
88
+ default42 as Steps,
87
89
  StepsNav,
88
90
  Td,
89
91
  Th,
90
- default24 as TimeAgo,
91
- default39 as TimePanel,
92
- default38 as TimePopover,
93
- default40 as TimeRangeField,
92
+ default25 as TimeAgo,
93
+ default40 as TimePanel,
94
+ default39 as TimePopover,
95
+ default41 as TimeRangeField,
94
96
  ToastProvider,
95
- default35 as Tooltip,
96
- default15 as UploadCard,
97
+ default36 as Tooltip,
98
+ default16 as UploadCard,
97
99
  WeekPopover,
98
100
  useToast
99
101
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "framepexls-ui-lib",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Componentes UI de Framepexls para React/Next.",