framepexls-ui-lib 0.3.8 → 0.3.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.
@@ -74,6 +74,7 @@ function ComboSelect({
74
74
  var _a;
75
75
  const [query, _setQuery] = import_react.default.useState("");
76
76
  const [open, setOpen] = import_react.default.useState(false);
77
+ const closingUntil = import_react.default.useRef(0);
77
78
  const [activeIdx, setActiveIdx] = import_react.default.useState(0);
78
79
  const setQ = import_react.default.useCallback(
79
80
  (q) => {
@@ -91,6 +92,7 @@ function ComboSelect({
91
92
  return flat.find((o) => o.value === value) || null;
92
93
  }, [options, value, sections]);
93
94
  const closeDropdown = import_react.default.useCallback(() => {
95
+ closingUntil.current = (typeof performance !== "undefined" ? performance.now() : Date.now()) + 200;
94
96
  setOpen(false);
95
97
  if (clearQueryOnSelect) setQ("");
96
98
  requestAnimationFrame(() => {
@@ -126,14 +128,24 @@ function ComboSelect({
126
128
  const onPointerDownCapture = (e) => {
127
129
  if (isOutside(e)) closeDropdown();
128
130
  };
131
+ const onMouseDown = (e) => {
132
+ if (isOutside(e)) closeDropdown();
133
+ };
134
+ const onTouchStart = (e) => {
135
+ if (isOutside(e)) closeDropdown();
136
+ };
129
137
  const onKeyDown2 = (e) => {
130
138
  if (!open) return;
131
139
  if (e.key === "Escape") closeDropdown();
132
140
  };
133
141
  window.addEventListener("pointerdown", onPointerDownCapture, true);
142
+ window.addEventListener("mousedown", onMouseDown, true);
143
+ window.addEventListener("touchstart", onTouchStart, true);
134
144
  window.addEventListener("keydown", onKeyDown2, true);
135
145
  return () => {
136
146
  window.removeEventListener("pointerdown", onPointerDownCapture, true);
147
+ window.removeEventListener("mousedown", onMouseDown, true);
148
+ window.removeEventListener("touchstart", onTouchStart, true);
137
149
  window.removeEventListener("keydown", onKeyDown2, true);
138
150
  };
139
151
  }, [open, isOutside, closeDropdown]);
@@ -401,7 +413,11 @@ function ComboSelect({
401
413
  setQ(e.target.value);
402
414
  if (!open) setOpen(true);
403
415
  },
404
- onFocus: () => setOpen(true),
416
+ onFocus: () => {
417
+ const now = typeof performance !== "undefined" ? performance.now() : Date.now();
418
+ if (now < closingUntil.current) return;
419
+ setOpen(true);
420
+ },
405
421
  onKeyDown,
406
422
  placeholder,
407
423
  disabled,
@@ -41,6 +41,7 @@ function ComboSelect({
41
41
  var _a;
42
42
  const [query, _setQuery] = React.useState("");
43
43
  const [open, setOpen] = React.useState(false);
44
+ const closingUntil = React.useRef(0);
44
45
  const [activeIdx, setActiveIdx] = React.useState(0);
45
46
  const setQ = React.useCallback(
46
47
  (q) => {
@@ -58,6 +59,7 @@ function ComboSelect({
58
59
  return flat.find((o) => o.value === value) || null;
59
60
  }, [options, value, sections]);
60
61
  const closeDropdown = React.useCallback(() => {
62
+ closingUntil.current = (typeof performance !== "undefined" ? performance.now() : Date.now()) + 200;
61
63
  setOpen(false);
62
64
  if (clearQueryOnSelect) setQ("");
63
65
  requestAnimationFrame(() => {
@@ -93,14 +95,24 @@ function ComboSelect({
93
95
  const onPointerDownCapture = (e) => {
94
96
  if (isOutside(e)) closeDropdown();
95
97
  };
98
+ const onMouseDown = (e) => {
99
+ if (isOutside(e)) closeDropdown();
100
+ };
101
+ const onTouchStart = (e) => {
102
+ if (isOutside(e)) closeDropdown();
103
+ };
96
104
  const onKeyDown2 = (e) => {
97
105
  if (!open) return;
98
106
  if (e.key === "Escape") closeDropdown();
99
107
  };
100
108
  window.addEventListener("pointerdown", onPointerDownCapture, true);
109
+ window.addEventListener("mousedown", onMouseDown, true);
110
+ window.addEventListener("touchstart", onTouchStart, true);
101
111
  window.addEventListener("keydown", onKeyDown2, true);
102
112
  return () => {
103
113
  window.removeEventListener("pointerdown", onPointerDownCapture, true);
114
+ window.removeEventListener("mousedown", onMouseDown, true);
115
+ window.removeEventListener("touchstart", onTouchStart, true);
104
116
  window.removeEventListener("keydown", onKeyDown2, true);
105
117
  };
106
118
  }, [open, isOutside, closeDropdown]);
@@ -368,7 +380,11 @@ function ComboSelect({
368
380
  setQ(e.target.value);
369
381
  if (!open) setOpen(true);
370
382
  },
371
- onFocus: () => setOpen(true),
383
+ onFocus: () => {
384
+ const now = typeof performance !== "undefined" ? performance.now() : Date.now();
385
+ if (now < closingUntil.current) return;
386
+ setOpen(true);
387
+ },
372
388
  onKeyDown,
373
389
  placeholder,
374
390
  disabled,
package/dist/Dialog.js CHANGED
@@ -58,24 +58,46 @@ const sizeToMaxW = {
58
58
  function useLockBodyScroll(open) {
59
59
  (0, import_react.useEffect)(() => {
60
60
  if (!open) return;
61
+ const w = window;
61
62
  const root = document.documentElement;
62
63
  const body = document.body;
63
- const prevOverflowRoot = root.style.overflow;
64
- const prevOverflowBody = body.style.overflow;
65
- const prevPadRightRoot = root.style.paddingRight;
66
- const prevPadRightBody = body.style.paddingRight;
67
- const scrollbarW = window.innerWidth - root.clientWidth;
68
- root.style.overflow = "hidden";
69
- body.style.overflow = body.style.overflow || "";
70
- if (scrollbarW > 0) {
71
- root.style.paddingRight = `${scrollbarW}px`;
72
- body.style.paddingRight = `${scrollbarW}px`;
64
+ if (!w.__fx_scroll_lock) {
65
+ w.__fx_scroll_lock = {
66
+ count: 0,
67
+ prev: {
68
+ rootOverflow: root.style.overflow,
69
+ bodyOverflow: body.style.overflow,
70
+ rootPad: root.style.paddingRight,
71
+ bodyPad: body.style.paddingRight
72
+ }
73
+ };
74
+ }
75
+ w.__fx_scroll_lock.count++;
76
+ if (w.__fx_scroll_lock.count === 1) {
77
+ const scrollbarW = window.innerWidth - root.clientWidth;
78
+ w.__fx_scroll_lock.prev = {
79
+ rootOverflow: root.style.overflow,
80
+ bodyOverflow: body.style.overflow,
81
+ rootPad: root.style.paddingRight,
82
+ bodyPad: body.style.paddingRight
83
+ };
84
+ root.style.overflow = "hidden";
85
+ if (scrollbarW > 0) {
86
+ root.style.paddingRight = `${scrollbarW}px`;
87
+ body.style.paddingRight = `${scrollbarW}px`;
88
+ }
73
89
  }
74
90
  return () => {
75
- root.style.overflow = prevOverflowRoot;
76
- body.style.overflow = prevOverflowBody;
77
- root.style.paddingRight = prevPadRightRoot;
78
- body.style.paddingRight = prevPadRightBody;
91
+ const st = w.__fx_scroll_lock;
92
+ if (!st) return;
93
+ st.count = Math.max(0, st.count - 1);
94
+ if (st.count === 0) {
95
+ root.style.overflow = st.prev.rootOverflow;
96
+ body.style.overflow = st.prev.bodyOverflow;
97
+ root.style.paddingRight = st.prev.rootPad;
98
+ body.style.paddingRight = st.prev.bodyPad;
99
+ w.__fx_scroll_lock = null;
100
+ }
79
101
  };
80
102
  }, [open]);
81
103
  }
package/dist/Dialog.mjs CHANGED
@@ -18,24 +18,46 @@ const sizeToMaxW = {
18
18
  function useLockBodyScroll(open) {
19
19
  useEffect(() => {
20
20
  if (!open) return;
21
+ const w = window;
21
22
  const root = document.documentElement;
22
23
  const body = document.body;
23
- const prevOverflowRoot = root.style.overflow;
24
- const prevOverflowBody = body.style.overflow;
25
- const prevPadRightRoot = root.style.paddingRight;
26
- const prevPadRightBody = body.style.paddingRight;
27
- const scrollbarW = window.innerWidth - root.clientWidth;
28
- root.style.overflow = "hidden";
29
- body.style.overflow = body.style.overflow || "";
30
- if (scrollbarW > 0) {
31
- root.style.paddingRight = `${scrollbarW}px`;
32
- body.style.paddingRight = `${scrollbarW}px`;
24
+ if (!w.__fx_scroll_lock) {
25
+ w.__fx_scroll_lock = {
26
+ count: 0,
27
+ prev: {
28
+ rootOverflow: root.style.overflow,
29
+ bodyOverflow: body.style.overflow,
30
+ rootPad: root.style.paddingRight,
31
+ bodyPad: body.style.paddingRight
32
+ }
33
+ };
34
+ }
35
+ w.__fx_scroll_lock.count++;
36
+ if (w.__fx_scroll_lock.count === 1) {
37
+ const scrollbarW = window.innerWidth - root.clientWidth;
38
+ w.__fx_scroll_lock.prev = {
39
+ rootOverflow: root.style.overflow,
40
+ bodyOverflow: body.style.overflow,
41
+ rootPad: root.style.paddingRight,
42
+ bodyPad: body.style.paddingRight
43
+ };
44
+ root.style.overflow = "hidden";
45
+ if (scrollbarW > 0) {
46
+ root.style.paddingRight = `${scrollbarW}px`;
47
+ body.style.paddingRight = `${scrollbarW}px`;
48
+ }
33
49
  }
34
50
  return () => {
35
- root.style.overflow = prevOverflowRoot;
36
- body.style.overflow = prevOverflowBody;
37
- root.style.paddingRight = prevPadRightRoot;
38
- body.style.paddingRight = prevPadRightBody;
51
+ const st = w.__fx_scroll_lock;
52
+ if (!st) return;
53
+ st.count = Math.max(0, st.count - 1);
54
+ if (st.count === 0) {
55
+ root.style.overflow = st.prev.rootOverflow;
56
+ body.style.overflow = st.prev.bodyOverflow;
57
+ root.style.paddingRight = st.prev.rootPad;
58
+ body.style.paddingRight = st.prev.bodyPad;
59
+ w.__fx_scroll_lock = null;
60
+ }
39
61
  };
40
62
  }, [open]);
41
63
  }
package/dist/Drawer.js CHANGED
@@ -54,10 +54,40 @@ function Root({
54
54
  className
55
55
  }) {
56
56
  import_react.default.useEffect(() => {
57
- if (open) document.body.style.overflow = "hidden";
58
- else document.body.style.overflow = "";
57
+ const w = window;
58
+ const acquire = () => {
59
+ const root = document.documentElement;
60
+ const body = document.body;
61
+ if (!w.__fx_scroll_lock) {
62
+ w.__fx_scroll_lock = { count: 0, prev: { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight } };
63
+ }
64
+ w.__fx_scroll_lock.count++;
65
+ if (w.__fx_scroll_lock.count === 1) {
66
+ const scrollbarW = window.innerWidth - root.clientWidth;
67
+ w.__fx_scroll_lock.prev = { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight };
68
+ root.style.overflow = "hidden";
69
+ if (scrollbarW > 0) {
70
+ root.style.paddingRight = `${scrollbarW}px`;
71
+ body.style.paddingRight = `${scrollbarW}px`;
72
+ }
73
+ }
74
+ return () => {
75
+ const st = w.__fx_scroll_lock;
76
+ if (!st) return;
77
+ st.count = Math.max(0, st.count - 1);
78
+ if (st.count === 0) {
79
+ root.style.overflow = st.prev.rootOverflow;
80
+ body.style.overflow = st.prev.bodyOverflow;
81
+ root.style.paddingRight = st.prev.rootPad;
82
+ body.style.paddingRight = st.prev.bodyPad;
83
+ w.__fx_scroll_lock = null;
84
+ }
85
+ };
86
+ };
87
+ let release = null;
88
+ if (open) release = acquire();
59
89
  return () => {
60
- document.body.style.overflow = "";
90
+ if (release) release();
61
91
  };
62
92
  }, [open]);
63
93
  import_react.default.useEffect(() => {
package/dist/Drawer.mjs CHANGED
@@ -17,10 +17,40 @@ function Root({
17
17
  className
18
18
  }) {
19
19
  React.useEffect(() => {
20
- if (open) document.body.style.overflow = "hidden";
21
- else document.body.style.overflow = "";
20
+ const w = window;
21
+ const acquire = () => {
22
+ const root = document.documentElement;
23
+ const body = document.body;
24
+ if (!w.__fx_scroll_lock) {
25
+ w.__fx_scroll_lock = { count: 0, prev: { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight } };
26
+ }
27
+ w.__fx_scroll_lock.count++;
28
+ if (w.__fx_scroll_lock.count === 1) {
29
+ const scrollbarW = window.innerWidth - root.clientWidth;
30
+ w.__fx_scroll_lock.prev = { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight };
31
+ root.style.overflow = "hidden";
32
+ if (scrollbarW > 0) {
33
+ root.style.paddingRight = `${scrollbarW}px`;
34
+ body.style.paddingRight = `${scrollbarW}px`;
35
+ }
36
+ }
37
+ return () => {
38
+ const st = w.__fx_scroll_lock;
39
+ if (!st) return;
40
+ st.count = Math.max(0, st.count - 1);
41
+ if (st.count === 0) {
42
+ root.style.overflow = st.prev.rootOverflow;
43
+ body.style.overflow = st.prev.bodyOverflow;
44
+ root.style.paddingRight = st.prev.rootPad;
45
+ body.style.paddingRight = st.prev.bodyPad;
46
+ w.__fx_scroll_lock = null;
47
+ }
48
+ };
49
+ };
50
+ let release = null;
51
+ if (open) release = acquire();
22
52
  return () => {
23
- document.body.style.overflow = "";
53
+ if (release) release();
24
54
  };
25
55
  }, [open]);
26
56
  React.useEffect(() => {
package/dist/Dropdown.js CHANGED
@@ -153,7 +153,7 @@ function Trigger({
153
153
  className: [
154
154
  "inline-flex items-center gap-2 rounded-xl border border-slate-300/70 bg-white px-3 py-2",
155
155
  "text-sm font-medium text-slate-700 shadow-sm hover:bg-slate-50 active:scale-[0.98]",
156
- "dark:border-white/10 dark:bg-[var(--fx-surface)] dark:text-slate-200 dark:hover:bg-[var(--fx-surface)]",
156
+ "dark:border-white/10 dark:bg-[var(--fx-surface)] dark:text-slate-200 dark:hover:bg-white/10",
157
157
  className
158
158
  ].join(" "),
159
159
  ...safe,
package/dist/Dropdown.mjs CHANGED
@@ -123,7 +123,7 @@ function Trigger({
123
123
  className: [
124
124
  "inline-flex items-center gap-2 rounded-xl border border-slate-300/70 bg-white px-3 py-2",
125
125
  "text-sm font-medium text-slate-700 shadow-sm hover:bg-slate-50 active:scale-[0.98]",
126
- "dark:border-white/10 dark:bg-[var(--fx-surface)] dark:text-slate-200 dark:hover:bg-[var(--fx-surface)]",
126
+ "dark:border-white/10 dark:bg-[var(--fx-surface)] dark:text-slate-200 dark:hover:bg-white/10",
127
127
  className
128
128
  ].join(" "),
129
129
  ...safe,
@@ -67,7 +67,7 @@ function MultiComboSelect({
67
67
  [selectedSet, onChange]
68
68
  );
69
69
  import_react.default.useEffect(() => {
70
- const onPointerDownCapture = (e) => {
70
+ const closeIfOutside = (e) => {
71
71
  var _a;
72
72
  const t = e.target;
73
73
  const inRoot = !!rootRef.current && rootRef.current.contains(t);
@@ -75,10 +75,6 @@ function MultiComboSelect({
75
75
  if (!inRoot && !inListbox) {
76
76
  const input = (_a = rootRef.current) == null ? void 0 : _a.querySelector('input[role="combobox"]');
77
77
  if (input) {
78
- try {
79
- input.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
80
- } catch {
81
- }
82
78
  try {
83
79
  input.blur();
84
80
  } catch {
@@ -86,8 +82,17 @@ function MultiComboSelect({
86
82
  }
87
83
  }
88
84
  };
85
+ const onPointerDownCapture = (e) => closeIfOutside(e);
86
+ const onMouseDown = (e) => closeIfOutside(e);
87
+ const onTouchStart = (e) => closeIfOutside(e);
89
88
  window.addEventListener("pointerdown", onPointerDownCapture, true);
90
- return () => window.removeEventListener("pointerdown", onPointerDownCapture, true);
89
+ window.addEventListener("mousedown", onMouseDown, true);
90
+ window.addEventListener("touchstart", onTouchStart, true);
91
+ return () => {
92
+ window.removeEventListener("pointerdown", onPointerDownCapture, true);
93
+ window.removeEventListener("mousedown", onMouseDown, true);
94
+ window.removeEventListener("touchstart", onTouchStart, true);
95
+ };
91
96
  }, []);
92
97
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: rootRef, children: [
93
98
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -34,7 +34,7 @@ function MultiComboSelect({
34
34
  [selectedSet, onChange]
35
35
  );
36
36
  React.useEffect(() => {
37
- const onPointerDownCapture = (e) => {
37
+ const closeIfOutside = (e) => {
38
38
  var _a;
39
39
  const t = e.target;
40
40
  const inRoot = !!rootRef.current && rootRef.current.contains(t);
@@ -42,10 +42,6 @@ function MultiComboSelect({
42
42
  if (!inRoot && !inListbox) {
43
43
  const input = (_a = rootRef.current) == null ? void 0 : _a.querySelector('input[role="combobox"]');
44
44
  if (input) {
45
- try {
46
- input.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape", bubbles: true }));
47
- } catch {
48
- }
49
45
  try {
50
46
  input.blur();
51
47
  } catch {
@@ -53,8 +49,17 @@ function MultiComboSelect({
53
49
  }
54
50
  }
55
51
  };
52
+ const onPointerDownCapture = (e) => closeIfOutside(e);
53
+ const onMouseDown = (e) => closeIfOutside(e);
54
+ const onTouchStart = (e) => closeIfOutside(e);
56
55
  window.addEventListener("pointerdown", onPointerDownCapture, true);
57
- return () => window.removeEventListener("pointerdown", onPointerDownCapture, true);
56
+ window.addEventListener("mousedown", onMouseDown, true);
57
+ window.addEventListener("touchstart", onTouchStart, true);
58
+ return () => {
59
+ window.removeEventListener("pointerdown", onPointerDownCapture, true);
60
+ window.removeEventListener("mousedown", onMouseDown, true);
61
+ window.removeEventListener("touchstart", onTouchStart, true);
62
+ };
58
63
  }, []);
59
64
  return /* @__PURE__ */ jsxs("div", { ref: rootRef, children: [
60
65
  /* @__PURE__ */ jsx(
package/dist/Sidebar.js CHANGED
@@ -188,10 +188,40 @@ function Sidebar({
188
188
  });
189
189
  };
190
190
  (0, import_react.useEffect)(() => {
191
- if (drawerOpen) document.body.style.overflow = "hidden";
192
- else document.body.style.overflow = "";
191
+ const w = window;
192
+ const acquire = () => {
193
+ const root = document.documentElement;
194
+ const body = document.body;
195
+ if (!w.__fx_scroll_lock) {
196
+ w.__fx_scroll_lock = { count: 0, prev: { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight } };
197
+ }
198
+ w.__fx_scroll_lock.count++;
199
+ if (w.__fx_scroll_lock.count === 1) {
200
+ const scrollbarW = window.innerWidth - root.clientWidth;
201
+ w.__fx_scroll_lock.prev = { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight };
202
+ root.style.overflow = "hidden";
203
+ if (scrollbarW > 0) {
204
+ root.style.paddingRight = `${scrollbarW}px`;
205
+ body.style.paddingRight = `${scrollbarW}px`;
206
+ }
207
+ }
208
+ return () => {
209
+ const st = w.__fx_scroll_lock;
210
+ if (!st) return;
211
+ st.count = Math.max(0, st.count - 1);
212
+ if (st.count === 0) {
213
+ root.style.overflow = st.prev.rootOverflow;
214
+ body.style.overflow = st.prev.bodyOverflow;
215
+ root.style.paddingRight = st.prev.rootPad;
216
+ body.style.paddingRight = st.prev.bodyPad;
217
+ w.__fx_scroll_lock = null;
218
+ }
219
+ };
220
+ };
221
+ let release = null;
222
+ if (drawerOpen) release = acquire();
193
223
  return () => {
194
- document.body.style.overflow = "";
224
+ if (release) release();
195
225
  };
196
226
  }, [drawerOpen]);
197
227
  const groups = (0, import_react.useMemo)(() => groupItems(items), [items]);
package/dist/Sidebar.mjs CHANGED
@@ -155,10 +155,40 @@ function Sidebar({
155
155
  });
156
156
  };
157
157
  useEffect(() => {
158
- if (drawerOpen) document.body.style.overflow = "hidden";
159
- else document.body.style.overflow = "";
158
+ const w = window;
159
+ const acquire = () => {
160
+ const root = document.documentElement;
161
+ const body = document.body;
162
+ if (!w.__fx_scroll_lock) {
163
+ w.__fx_scroll_lock = { count: 0, prev: { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight } };
164
+ }
165
+ w.__fx_scroll_lock.count++;
166
+ if (w.__fx_scroll_lock.count === 1) {
167
+ const scrollbarW = window.innerWidth - root.clientWidth;
168
+ w.__fx_scroll_lock.prev = { rootOverflow: root.style.overflow, bodyOverflow: body.style.overflow, rootPad: root.style.paddingRight, bodyPad: body.style.paddingRight };
169
+ root.style.overflow = "hidden";
170
+ if (scrollbarW > 0) {
171
+ root.style.paddingRight = `${scrollbarW}px`;
172
+ body.style.paddingRight = `${scrollbarW}px`;
173
+ }
174
+ }
175
+ return () => {
176
+ const st = w.__fx_scroll_lock;
177
+ if (!st) return;
178
+ st.count = Math.max(0, st.count - 1);
179
+ if (st.count === 0) {
180
+ root.style.overflow = st.prev.rootOverflow;
181
+ body.style.overflow = st.prev.bodyOverflow;
182
+ root.style.paddingRight = st.prev.rootPad;
183
+ body.style.paddingRight = st.prev.bodyPad;
184
+ w.__fx_scroll_lock = null;
185
+ }
186
+ };
187
+ };
188
+ let release = null;
189
+ if (drawerOpen) release = acquire();
160
190
  return () => {
161
- document.body.style.overflow = "";
191
+ if (release) release();
162
192
  };
163
193
  }, [drawerOpen]);
164
194
  const groups = useMemo(() => groupItems(items), [items]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "framepexls-ui-lib",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Componentes UI de Framepexls para React/Next.",