meticulous-ui 3.2.7 → 3.2.9

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 (54) hide show
  1. package/README.md +26 -0
  2. package/hooks/index.js +46 -0
  3. package/hooks/useCopyToClipboard.js +14 -0
  4. package/hooks/useDebounce.js +11 -0
  5. package/hooks/useEventListener.js +15 -0
  6. package/hooks/useFirstRender.js +10 -0
  7. package/hooks/useIntersectionObserver.js +13 -0
  8. package/hooks/useInterval.js +14 -0
  9. package/hooks/useIsMounted.js +10 -0
  10. package/hooks/useLocalStorage.js +28 -0
  11. package/hooks/useMediaQuery.js +11 -0
  12. package/hooks/useOnlineStatus.js +13 -0
  13. package/hooks/useOutsideClick.js +14 -0
  14. package/hooks/usePrevious.js +10 -0
  15. package/hooks/useSessionStorage.js +28 -0
  16. package/hooks/useThrottle.js +16 -0
  17. package/hooks/useTimeout.js +14 -0
  18. package/hooks/useToggle.js +10 -0
  19. package/hooks/useUnmount.js +10 -0
  20. package/hooks/useWindowSize.js +14 -0
  21. package/index.js +26 -22
  22. package/package.json +3 -1
  23. package/reactUtils/composeProviders.js +5 -0
  24. package/reactUtils/createContextHook.js +12 -0
  25. package/reactUtils/createPortalNode.js +7 -0
  26. package/reactUtils/index.js +19 -0
  27. package/reactUtils/lazyImport.js +7 -0
  28. package/reactUtils/memoCompare.js +5 -0
  29. package/reactUtils/withErrorBoundary.js +24 -0
  30. package/reactUtils/withSuspense.js +9 -0
  31. package/utils/auditLog.js +12 -0
  32. package/utils/createPubSub.js +11 -0
  33. package/utils/deepFreeze.js +7 -0
  34. package/utils/fadeIn.js +10 -0
  35. package/utils/fadeOut.js +8 -0
  36. package/utils/featureGate.js +4 -0
  37. package/utils/filterByKey.js +4 -0
  38. package/utils/fuzzySearch.js +16 -0
  39. package/utils/identity.js +4 -0
  40. package/utils/index.js +153 -103
  41. package/utils/logInfo.js +8 -0
  42. package/utils/logWarn.js +8 -0
  43. package/utils/measurePerformance.js +12 -0
  44. package/utils/multiSort.js +11 -0
  45. package/utils/noop.js +5 -0
  46. package/utils/once.js +7 -0
  47. package/utils/paginate.js +13 -0
  48. package/utils/permissionGuard.js +4 -0
  49. package/utils/pipe.js +4 -0
  50. package/utils/singleton.js +7 -0
  51. package/utils/smoothScroll.js +14 -0
  52. package/utils/trackEvent.js +8 -0
  53. package/utils/trackPageView.js +12 -0
  54. package/utils/waitForTransitionEnd.js +9 -0
package/README.md CHANGED
@@ -159,6 +159,32 @@ import blue from 'meticulous-ui/colors/blue';
159
159
  | **Error Handling** | `logError`, `captureException`, `safeJSONParse`, `safeJSONStringify`, `fallback` |
160
160
  | **Auth** | `isAuthenticated`, `getToken`, `setToken`, `removeToken`, `decodeJWT`, `hasPermission` |
161
161
  | **Feature Flags** | `isFeatureEnabled`, `getVariant` |
162
+ | **Enterprise** | `trackEvent`, `trackPageView`, `measurePerformance`, `featureGate`, `permissionGuard`, `auditLog`, `logInfo`, `logWarn`, `captureException` |
163
+ | **Filter** | `fuzzySearch`, `filterByKey`, `multiSort`, `paginate` |
164
+ | **Animation** | `fadeIn`, `fadeOut`, `smoothScroll`, `waitForTransitionEnd` |
165
+ | **Function** | `once`, `noop`, `identity`, `pipe`, `singleton`, `createPubSub`, `deepFreeze` |
166
+
167
+ ## 📦 React Helper Functions
168
+
169
+ | Function | Description |
170
+ | ------------------- | ---------------------------------------------------------------------------------- |
171
+ | `createContextHook` | Creates a React context + typed hook pair; throws if consumed outside its Provider |
172
+ | `composeProviders` | Merges N provider components into one wrapper, eliminating the provider pyramid |
173
+ | `lazyImport` | Extends `React.lazy` to work with named exports, not just default exports |
174
+ | `withErrorBoundary` | HOC wrapping a component in an error boundary with a configurable fallback |
175
+ | `withSuspense` | HOC wrapping a component in `<Suspense>` with a co-located fallback UI |
176
+ | `memoCompare` | Typed wrapper around `React.memo` with a custom equality comparator |
177
+ | `createPortalNode` | Creates and appends a DOM node to `document.body` for use as a portal container |
178
+
179
+ ## 📦 Hooks
180
+
181
+ | Category | Hooks |
182
+ | --------------- | --------------------------------------------------------------------------------------------------------------------- |
183
+ | **State** | `usePrevious`, `useDebounce`, `useThrottle`, `useToggle` |
184
+ | **Lifecycle** | `useIsMounted`, `useUnmount`, `useFirstRender`, `useTimeout`, `useInterval` |
185
+ | **DOM/Browser** | `useEventListener`, `useIntersectionObserver`, `useMediaQuery`, `useOutsideClick`, `useWindowSize`, `useOnlineStatus` |
186
+ | **Storage** | `useLocalStorage`, `useSessionStorage` |
187
+ | **Utility** | `useCopyToClipboard` |
162
188
 
163
189
  ## 🌱 Features
164
190
 
package/hooks/index.js ADDED
@@ -0,0 +1,46 @@
1
+ import o from "./usePrevious.js";
2
+ import r from "./useDebounce.js";
3
+ import e from "./useThrottle.js";
4
+ import m from "./useIsMounted.js";
5
+ import t from "./useEventListener.js";
6
+ import i from "./useIntersectionObserver.js";
7
+ import s from "./useMediaQuery.js";
8
+ import u from "./useLocalStorage.js";
9
+ import p from "./useSessionStorage.js";
10
+ import f from "./useOutsideClick.js";
11
+ import n from "./useWindowSize.js";
12
+ import a from "./useOnlineStatus.js";
13
+ import d from "./useCopyToClipboard.js";
14
+ import l from "./useToggle.js";
15
+ import c from "./useTimeout.js";
16
+ import S from "./useInterval.js";
17
+ import g from "./useUnmount.js";
18
+ import v from "./useFirstRender.js";
19
+ const R = {
20
+ // state
21
+ usePrevious: o,
22
+ useDebounce: r,
23
+ useThrottle: e,
24
+ useToggle: l,
25
+ // lifecycle
26
+ useIsMounted: m,
27
+ useUnmount: g,
28
+ useFirstRender: v,
29
+ useTimeout: c,
30
+ useInterval: S,
31
+ // dom / browser
32
+ useEventListener: t,
33
+ useIntersectionObserver: i,
34
+ useMediaQuery: s,
35
+ useOutsideClick: f,
36
+ useWindowSize: n,
37
+ useOnlineStatus: a,
38
+ // storage
39
+ useLocalStorage: u,
40
+ useSessionStorage: p,
41
+ // utility
42
+ useCopyToClipboard: d
43
+ };
44
+ export {
45
+ R as default
46
+ };
@@ -0,0 +1,14 @@
1
+ import { useState as a } from "react";
2
+ const c = () => {
3
+ const [e, t] = a(!1);
4
+ return [e, async (o) => {
5
+ try {
6
+ await navigator.clipboard.writeText(o), t(!0), setTimeout(() => t(!1), 2e3);
7
+ } catch {
8
+ t(!1);
9
+ }
10
+ }];
11
+ };
12
+ export {
13
+ c as default
14
+ };
@@ -0,0 +1,11 @@
1
+ import { useState as c, useEffect as n } from "react";
2
+ const d = (e, t) => {
3
+ const [o, s] = c(e);
4
+ return n(() => {
5
+ const u = setTimeout(() => s(e), t);
6
+ return () => clearTimeout(u);
7
+ }, [e, t]), o;
8
+ };
9
+ export {
10
+ d as default
11
+ };
@@ -0,0 +1,15 @@
1
+ import { useRef as o, useEffect as c } from "react";
2
+ const f = (r, s, e = window) => {
3
+ const t = o(s);
4
+ c(() => {
5
+ t.current = s;
6
+ }, [s]), c(() => {
7
+ const n = e && "current" in e ? e.current : e;
8
+ if (!(n != null && n.addEventListener)) return;
9
+ const u = (i) => t.current(i);
10
+ return n.addEventListener(r, u), () => n.removeEventListener(r, u);
11
+ }, [r, e]);
12
+ };
13
+ export {
14
+ f as default
15
+ };
@@ -0,0 +1,10 @@
1
+ import { useRef as r, useEffect as t } from "react";
2
+ const u = () => {
3
+ const e = r(!0);
4
+ return t(() => {
5
+ e.current = !1;
6
+ }, []), e.current;
7
+ };
8
+ export {
9
+ u as default
10
+ };
@@ -0,0 +1,13 @@
1
+ import { useState as u, useEffect as l } from "react";
2
+ const b = (r, e = {}) => {
3
+ const [s, o] = u(null);
4
+ return l(() => {
5
+ const t = r.current;
6
+ if (!t) return;
7
+ const n = new IntersectionObserver(([c]) => o(c), e);
8
+ return n.observe(t), () => n.disconnect();
9
+ }, [r, e.threshold, e.root, e.rootMargin]), s;
10
+ };
11
+ export {
12
+ b as default
13
+ };
@@ -0,0 +1,14 @@
1
+ import { useRef as u, useEffect as n } from "react";
2
+ const o = (e, r) => {
3
+ const t = u(e);
4
+ n(() => {
5
+ t.current = e;
6
+ }, [e]), n(() => {
7
+ if (r === null) return;
8
+ const s = setInterval(() => t.current(), r);
9
+ return () => clearInterval(s);
10
+ }, [r]);
11
+ };
12
+ export {
13
+ o as default
14
+ };
@@ -0,0 +1,10 @@
1
+ import { useRef as t, useEffect as r } from "react";
2
+ const s = () => {
3
+ const e = t(!1);
4
+ return r(() => (e.current = !0, () => {
5
+ e.current = !1;
6
+ }), []), e;
7
+ };
8
+ export {
9
+ s as default
10
+ };
@@ -0,0 +1,28 @@
1
+ import { useState as n } from "react";
2
+ const g = (e, o) => {
3
+ const [r, c] = n(() => {
4
+ try {
5
+ const t = localStorage.getItem(e);
6
+ return t !== null ? JSON.parse(t) : o;
7
+ } catch {
8
+ return o;
9
+ }
10
+ });
11
+ return [r, (t) => {
12
+ const s = typeof t == "function" ? t(r) : t;
13
+ c(s);
14
+ try {
15
+ localStorage.setItem(e, JSON.stringify(s));
16
+ } catch {
17
+ }
18
+ }, () => {
19
+ c(o);
20
+ try {
21
+ localStorage.removeItem(e);
22
+ } catch {
23
+ }
24
+ }];
25
+ };
26
+ export {
27
+ g as default
28
+ };
@@ -0,0 +1,11 @@
1
+ import { useState as o, useEffect as r } from "react";
2
+ const h = (e) => {
3
+ const [n, s] = o(() => window.matchMedia(e).matches);
4
+ return r(() => {
5
+ const t = window.matchMedia(e), a = (c) => s(c.matches);
6
+ return t.addEventListener("change", a), () => t.removeEventListener("change", a);
7
+ }, [e]), n;
8
+ };
9
+ export {
10
+ h as default
11
+ };
@@ -0,0 +1,13 @@
1
+ import { useState as o, useEffect as s } from "react";
2
+ const f = () => {
3
+ const [i, e] = o(navigator.onLine);
4
+ return s(() => {
5
+ const n = () => e(!0), t = () => e(!1);
6
+ return window.addEventListener("online", n), window.addEventListener("offline", t), () => {
7
+ window.removeEventListener("online", n), window.removeEventListener("offline", t);
8
+ };
9
+ }, []), i;
10
+ };
11
+ export {
12
+ f as default
13
+ };
@@ -0,0 +1,14 @@
1
+ import { useEffect as r } from "react";
2
+ const u = (e, n) => {
3
+ r(() => {
4
+ const t = (o) => {
5
+ e.current && !e.current.contains(o.target) && n(o);
6
+ };
7
+ return document.addEventListener("mousedown", t), document.addEventListener("touchstart", t), () => {
8
+ document.removeEventListener("mousedown", t), document.removeEventListener("touchstart", t);
9
+ };
10
+ }, [e, n]);
11
+ };
12
+ export {
13
+ u as default
14
+ };
@@ -0,0 +1,10 @@
1
+ import { useRef as t, useEffect as u } from "react";
2
+ const n = (r) => {
3
+ const e = t(void 0);
4
+ return u(() => {
5
+ e.current = r;
6
+ }), e.current;
7
+ };
8
+ export {
9
+ n as default
10
+ };
@@ -0,0 +1,28 @@
1
+ import { useState as c } from "react";
2
+ const g = (e, s) => {
3
+ const [o, r] = c(() => {
4
+ try {
5
+ const t = sessionStorage.getItem(e);
6
+ return t !== null ? JSON.parse(t) : s;
7
+ } catch {
8
+ return s;
9
+ }
10
+ });
11
+ return [o, (t) => {
12
+ const n = typeof t == "function" ? t(o) : t;
13
+ r(n);
14
+ try {
15
+ sessionStorage.setItem(e, JSON.stringify(n));
16
+ } catch {
17
+ }
18
+ }, () => {
19
+ r(s);
20
+ try {
21
+ sessionStorage.removeItem(e);
22
+ } catch {
23
+ }
24
+ }];
25
+ };
26
+ export {
27
+ g as default
28
+ };
@@ -0,0 +1,16 @@
1
+ import { useState as c, useRef as u, useEffect as i } from "react";
2
+ const f = (t, e) => {
3
+ const [r, n] = c(t), o = u(Date.now());
4
+ return i(() => {
5
+ const s = e - (Date.now() - o.current), a = setTimeout(
6
+ () => {
7
+ n(t), o.current = Date.now();
8
+ },
9
+ Math.max(0, s)
10
+ );
11
+ return () => clearTimeout(a);
12
+ }, [t, e]), r;
13
+ };
14
+ export {
15
+ f as default
16
+ };
@@ -0,0 +1,14 @@
1
+ import { useRef as s, useEffect as u } from "react";
2
+ const f = (e, t) => {
3
+ const r = s(e);
4
+ u(() => {
5
+ r.current = e;
6
+ }, [e]), u(() => {
7
+ if (t === null) return;
8
+ const o = setTimeout(() => r.current(), t);
9
+ return () => clearTimeout(o);
10
+ }, [t]);
11
+ };
12
+ export {
13
+ f as default
14
+ };
@@ -0,0 +1,10 @@
1
+ import { useState as u, useCallback as r } from "react";
2
+ const f = (o = !1) => {
3
+ const [t, a] = u(o), l = r((e) => {
4
+ a((s) => typeof e == "boolean" ? e : !s);
5
+ }, []);
6
+ return [t, l];
7
+ };
8
+ export {
9
+ f as default
10
+ };
@@ -0,0 +1,10 @@
1
+ import { useRef as u, useEffect as r } from "react";
2
+ const s = (e) => {
3
+ const t = u(e);
4
+ r(() => {
5
+ t.current = e;
6
+ }, [e]), r(() => () => t.current(), []);
7
+ };
8
+ export {
9
+ s as default
10
+ };
@@ -0,0 +1,14 @@
1
+ import { useState as t, useEffect as r } from "react";
2
+ const w = () => {
3
+ const [i, n] = t({
4
+ width: window.innerWidth,
5
+ height: window.innerHeight
6
+ });
7
+ return r(() => {
8
+ const e = () => n({ width: window.innerWidth, height: window.innerHeight });
9
+ return window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
10
+ }, []), i;
11
+ };
12
+ export {
13
+ w as default
14
+ };
package/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  import { default as a } from "./components/Pagination/Pagination.js";
2
2
  import { default as r, ToastContainer as f } from "./components/Toast/Toast.js";
3
- import { default as d } from "./components/Spinner/Spinner.js";
4
- import { default as s } from "./components/Loader/Loader.js";
3
+ import { default as l } from "./components/Spinner/Spinner.js";
4
+ import { default as d } from "./components/Loader/Loader.js";
5
5
  import { default as m } from "./components/PageLoader/PageLoader.js";
6
6
  import { default as n } from "./components/OtpInput/OtpInput.js";
7
7
  import { default as c } from "./components/Dropdown/Dropdown.js";
8
8
  import { default as C } from "./components/RootComponent/RootComponent.js";
9
9
  import { default as T } from "./components/Selectbox/Selectbox.js";
10
- import { default as S } from "./components/Button/Button.js";
11
- import { default as h } from "./components/Timer/Timer.js";
12
- import { default as R } from "./components/Shimmer/Shimmer.js";
13
- import { default as w } from "./components/VideoPlayer/VideoPlayer.js";
14
- import { default as B } from "./components/Image/Image.js";
15
- import { default as F } from "./components/Carousel/Carousel.js";
16
- import { default as H } from "./components/Typography/Headings/index.js";
17
- import { default as U } from "./components/Typography/P/P.js";
10
+ import { default as I } from "./components/Button/Button.js";
11
+ import { default as b } from "./components/Timer/Timer.js";
12
+ import { default as L } from "./components/Shimmer/Shimmer.js";
13
+ import { default as U } from "./components/VideoPlayer/VideoPlayer.js";
14
+ import { default as y } from "./components/Image/Image.js";
15
+ import { default as D } from "./components/Carousel/Carousel.js";
16
+ import { default as G } from "./components/Typography/Headings/index.js";
17
+ import { default as O } from "./components/Typography/P/P.js";
18
18
  import { default as j } from "./components/Input/Input/Input.js";
19
19
  import { default as v } from "./components/Input/Textarea/Textarea.js";
20
20
  import { default as A } from "./components/Input/Checkbox/Checkbox.js";
@@ -22,32 +22,36 @@ import { default as J } from "./components/Input/RadioGroup/RadioGroup.js";
22
22
  import { default as M } from "./components/Input/FileUploader/FileUploader.js";
23
23
  import { default as Q } from "./colors/index.js";
24
24
  import { default as X } from "./utils/index.js";
25
- import { default as Z } from "./components/Icons/index.js";
25
+ import { default as Z } from "./hooks/index.js";
26
+ import { default as $ } from "./reactUtils/index.js";
27
+ import { default as eo } from "./components/Icons/index.js";
26
28
  export {
27
- S as Button,
28
- F as Carousel,
29
+ I as Button,
30
+ D as Carousel,
29
31
  A as Checkbox,
30
32
  c as Dropdown,
31
33
  M as FileUploader,
32
- H as Headings,
33
- B as Image,
34
+ G as Headings,
35
+ y as Image,
34
36
  j as Input,
35
- s as Loader,
37
+ d as Loader,
36
38
  n as OtpInput,
37
- U as P,
39
+ O as P,
38
40
  m as PageLoader,
39
41
  a as Pagination,
40
42
  J as RadioGroup,
41
43
  C as RootComponent,
42
44
  T as Selectbox,
43
- R as Shimmer,
44
- d as Spinner,
45
+ L as Shimmer,
46
+ l as Spinner,
45
47
  v as Textarea,
46
- h as Timer,
48
+ b as Timer,
47
49
  r as Toast,
48
50
  f as ToastContainer,
49
- w as VideoPlayer,
51
+ U as VideoPlayer,
50
52
  Q as colors,
51
- Z as icons,
53
+ Z as hooks,
54
+ eo as icons,
55
+ $ as reactUtils,
52
56
  X as utils
53
57
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meticulous-ui",
3
- "version": "3.2.7",
3
+ "version": "3.2.9",
4
4
  "license": "ISC",
5
5
  "description": "A comprehensive React UI component library with a wide range of customizable components, icons, colors, and utilities for building modern web applications.",
6
6
  "main": "./index.js",
@@ -18,6 +18,8 @@
18
18
  "colors",
19
19
  "components",
20
20
  "utils",
21
+ "hooks",
22
+ "reactUtils",
21
23
  "package.json",
22
24
  "README.md"
23
25
  ],
@@ -0,0 +1,5 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ const d = (...e) => ({ children: o }) => e.reduceRight((r, s) => /* @__PURE__ */ t(s, { children: r }), o);
3
+ export {
4
+ d as default
5
+ };
@@ -0,0 +1,12 @@
1
+ import { createContext as n, useContext as s } from "react";
2
+ const i = (o) => {
3
+ const e = n(o), r = () => {
4
+ const t = s(e);
5
+ if (t === void 0) throw new Error("useContext must be used inside its Provider");
6
+ return t;
7
+ };
8
+ return [e.Provider, r];
9
+ };
10
+ export {
11
+ i as default
12
+ };
@@ -0,0 +1,7 @@
1
+ const d = (t = "div") => {
2
+ const e = document.createElement(t);
3
+ return document.body.appendChild(e), e;
4
+ };
5
+ export {
6
+ d as default
7
+ };
@@ -0,0 +1,19 @@
1
+ import o from "./createContextHook.js";
2
+ import r from "./composeProviders.js";
3
+ import m from "./lazyImport.js";
4
+ import t from "./withErrorBoundary.js";
5
+ import e from "./withSuspense.js";
6
+ import p from "./memoCompare.js";
7
+ import i from "./createPortalNode.js";
8
+ const u = {
9
+ createContextHook: o,
10
+ composeProviders: r,
11
+ lazyImport: m,
12
+ withErrorBoundary: t,
13
+ withSuspense: e,
14
+ memoCompare: p,
15
+ createPortalNode: i
16
+ };
17
+ export {
18
+ u as default
19
+ };
@@ -0,0 +1,7 @@
1
+ import { lazy as l } from "react";
2
+ const e = (o, t) => ({
3
+ [t]: l(() => o().then((a) => ({ default: a[t] })))
4
+ });
5
+ export {
6
+ e as default
7
+ };
@@ -0,0 +1,5 @@
1
+ import { memo as e } from "react";
2
+ const t = (m, o) => e(m, o);
3
+ export {
4
+ t as default
5
+ };
@@ -0,0 +1,24 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { Component as a } from "react";
3
+ class n extends a {
4
+ constructor(r) {
5
+ super(r), this.state = { hasError: !1, error: null };
6
+ }
7
+ static getDerivedStateFromError(r) {
8
+ return { hasError: !0, error: r };
9
+ }
10
+ render() {
11
+ if (this.state.hasError) {
12
+ const r = this.props.fallback;
13
+ return /* @__PURE__ */ o(r, { error: this.state.error });
14
+ }
15
+ return this.props.children;
16
+ }
17
+ }
18
+ const h = (t, r) => {
19
+ const s = (e) => /* @__PURE__ */ o(n, { fallback: r, children: /* @__PURE__ */ o(t, { ...e }) });
20
+ return s.displayName = `withErrorBoundary(${t.displayName ?? t.name ?? "Component"})`, s;
21
+ };
22
+ export {
23
+ h as default
24
+ };
@@ -0,0 +1,9 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import { Suspense as u } from "react";
3
+ const r = (s, i = null) => {
4
+ const e = (n) => /* @__PURE__ */ t(u, { fallback: i, children: /* @__PURE__ */ t(s, { ...n }) });
5
+ return e.displayName = `withSuspense(${s.displayName ?? s.name ?? "Component"})`, e;
6
+ };
7
+ export {
8
+ r as default
9
+ };
@@ -0,0 +1,12 @@
1
+ const t = (n, o = {}) => {
2
+ const e = {
3
+ action: n,
4
+ metadata: o,
5
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6
+ user: typeof window < "u" ? window.__currentUser ?? null : null
7
+ };
8
+ return typeof window < "u" && typeof window.__auditLogger == "function" ? window.__auditLogger(e) : console.log("[auditLog]", e), e;
9
+ };
10
+ export {
11
+ t as default
12
+ };
@@ -0,0 +1,11 @@
1
+ const i = () => {
2
+ const u = {};
3
+ return { subscribe: (s, b) => ((u[s] ?? (u[s] = [])).push(b), () => {
4
+ u[s] = u[s].filter((c) => c !== b);
5
+ }), publish: (s, ...b) => {
6
+ (u[s] ?? []).forEach((c) => c(...b));
7
+ } };
8
+ };
9
+ export {
10
+ i as default
11
+ };
@@ -0,0 +1,7 @@
1
+ const c = (e) => (Object.getOwnPropertyNames(e).forEach((r) => {
2
+ const t = e[r];
3
+ t && typeof t == "object" && c(t);
4
+ }), Object.freeze(e));
5
+ export {
6
+ c as default
7
+ };
@@ -0,0 +1,10 @@
1
+ const s = (a, t = 300) => {
2
+ a.style.opacity = "0", a.style.display = "", a.style.transition = `opacity ${t}ms ease`, requestAnimationFrame(() => {
3
+ requestAnimationFrame(() => {
4
+ a.style.opacity = "1";
5
+ });
6
+ });
7
+ };
8
+ export {
9
+ s as default
10
+ };
@@ -0,0 +1,8 @@
1
+ const a = (s, t = 300) => {
2
+ s.style.transition = `opacity ${t}ms ease`, s.style.opacity = "0", setTimeout(() => {
3
+ s.style.display = "none";
4
+ }, t);
5
+ };
6
+ export {
7
+ a as default
8
+ };
@@ -0,0 +1,4 @@
1
+ const a = (e) => typeof window < "u" && window.__featureFlags ? !!window.__featureFlags[e] : !1;
2
+ export {
3
+ a as default
4
+ };
@@ -0,0 +1,4 @@
1
+ const r = (e, t, f) => e.filter((l) => l[t] === f);
2
+ export {
3
+ r as default
4
+ };
@@ -0,0 +1,16 @@
1
+ const u = (r, o) => {
2
+ if (!o) return r;
3
+ const n = o.toLowerCase(), s = (t) => {
4
+ let e = 0;
5
+ const f = t.toLowerCase();
6
+ for (const c of n) {
7
+ if (e = f.indexOf(c, e), e === -1) return !1;
8
+ e++;
9
+ }
10
+ return !0;
11
+ };
12
+ return r.filter((t) => typeof t == "string" ? s(t) : Object.values(t).some((e) => typeof e == "string" && s(e)));
13
+ };
14
+ export {
15
+ u as default
16
+ };
@@ -0,0 +1,4 @@
1
+ const e = (t) => t;
2
+ export {
3
+ e as default
4
+ };
package/utils/index.js CHANGED
@@ -7,8 +7,8 @@ import e from "./compose.js";
7
7
  import p from "./deepClone.js";
8
8
  import f from "./flattenObject.js";
9
9
  import a from "./formatCompactNumber.js";
10
- import s from "./formatCurrency.js";
11
- import n from "./formatDate.js";
10
+ import n from "./formatCurrency.js";
11
+ import s from "./formatDate.js";
12
12
  import l from "./formatNumber.js";
13
13
  import c from "./formatTime.js";
14
14
  import d from "./generateInitials.js";
@@ -20,32 +20,32 @@ import T from "./countdown.js";
20
20
  import k from "./differenceInDays.js";
21
21
  import b from "./isEmpty.js";
22
22
  import h from "./isEqual.js";
23
- import E from "./isNonEmptyArray.js";
24
- import P from "./isPast.js";
23
+ import P from "./isNonEmptyArray.js";
24
+ import E from "./isPast.js";
25
25
  import C from "./isToday.js";
26
- import A from "./kebabCase.js";
27
- import L from "./keyBy.js";
26
+ import L from "./kebabCase.js";
27
+ import A from "./keyBy.js";
28
28
  import B from "./maskEmail.js";
29
- import N from "./maskPhone.js";
30
- import I from "./mergeDeep.js";
31
- import q from "./omit.js";
29
+ import I from "./maskPhone.js";
30
+ import w from "./mergeDeep.js";
31
+ import N from "./omit.js";
32
32
  import v from "./percentage.js";
33
- import w from "./pick.js";
34
- import O from "./randomBetween.js";
35
- import x from "./randomInt.js";
36
- import D from "./randomValue.js";
37
- import F from "./removeExtraSpaces.js";
38
- import R from "./roundTo.js";
39
- import z from "./slugify.js";
40
- import J from "./snakeCase.js";
41
- import Q from "./sortBy.js";
42
- import G from "./timeAgo.js";
43
- import M from "./titleCase.js";
44
- import U from "./truncate.js";
45
- import V from "./uniqueBy.js";
46
- import j from "./isEmail.js";
47
- import K from "./isPhone.js";
48
- import W from "./isURL.js";
33
+ import z from "./pick.js";
34
+ import F from "./randomBetween.js";
35
+ import O from "./randomInt.js";
36
+ import q from "./randomValue.js";
37
+ import x from "./removeExtraSpaces.js";
38
+ import D from "./roundTo.js";
39
+ import R from "./slugify.js";
40
+ import G from "./snakeCase.js";
41
+ import J from "./sortBy.js";
42
+ import Q from "./timeAgo.js";
43
+ import V from "./titleCase.js";
44
+ import K from "./truncate.js";
45
+ import M from "./uniqueBy.js";
46
+ import U from "./isEmail.js";
47
+ import W from "./isPhone.js";
48
+ import j from "./isURL.js";
49
49
  import H from "./isPasswordStrong.js";
50
50
  import X from "./isPAN.js";
51
51
  import Y from "./isAadhaar.js";
@@ -61,8 +61,8 @@ import eo from "./isDarkMode.js";
61
61
  import po from "./isOnline.js";
62
62
  import fo from "./copyToClipboard.js";
63
63
  import ao from "./downloadFile.js";
64
- import so from "./openInNewTab.js";
65
- import no from "./getScreenSize.js";
64
+ import no from "./openInNewTab.js";
65
+ import so from "./getScreenSize.js";
66
66
  import lo from "./getQueryParams.js";
67
67
  import co from "./setQueryParam.js";
68
68
  import uo from "./removeQueryParam.js";
@@ -73,32 +73,32 @@ import To from "./isActiveRoute.js";
73
73
  import ko from "./setLocalStorage.js";
74
74
  import bo from "./getLocalStorage.js";
75
75
  import ho from "./removeLocalStorage.js";
76
- import Eo from "./setSessionStorage.js";
77
- import Po from "./getSessionStorage.js";
76
+ import Po from "./setSessionStorage.js";
77
+ import Eo from "./getSessionStorage.js";
78
78
  import Co from "./clearStorage.js";
79
- import Ao from "./debounce.js";
80
- import Lo from "./throttle.js";
79
+ import Lo from "./debounce.js";
80
+ import Ao from "./throttle.js";
81
81
  import Bo from "./memoize.js";
82
- import No from "./lazyLoadComponent.js";
83
- import Io from "./requestIdleTask.js";
84
- import qo from "./rafThrottle.js";
82
+ import Io from "./lazyLoadComponent.js";
83
+ import wo from "./requestIdleTask.js";
84
+ import No from "./rafThrottle.js";
85
85
  import vo from "./scrollToTop.js";
86
- import wo from "./scrollToElement.js";
87
- import Oo from "./lockBodyScroll.js";
88
- import xo from "./unlockBodyScroll.js";
89
- import Do from "./toggleFullscreen.js";
90
- import Fo from "./focusElement.js";
91
- import Ro from "./detectOutsideClick.js";
92
- import zo from "./measureElement.js";
93
- import Jo from "./announceToScreenReader.js";
94
- import Qo from "./trapFocus.js";
95
- import Go from "./generateAriaId.js";
96
- import Mo from "./handleKeyboardNavigation.js";
97
- import Uo from "./logError.js";
98
- import Vo from "./captureException.js";
99
- import jo from "./safeJSONParse.js";
100
- import Ko from "./safeJSONStringify.js";
101
- import Wo from "./fallback.js";
86
+ import zo from "./scrollToElement.js";
87
+ import Fo from "./lockBodyScroll.js";
88
+ import Oo from "./unlockBodyScroll.js";
89
+ import qo from "./toggleFullscreen.js";
90
+ import xo from "./focusElement.js";
91
+ import Do from "./detectOutsideClick.js";
92
+ import Ro from "./measureElement.js";
93
+ import Go from "./announceToScreenReader.js";
94
+ import Jo from "./trapFocus.js";
95
+ import Qo from "./generateAriaId.js";
96
+ import Vo from "./handleKeyboardNavigation.js";
97
+ import Ko from "./logError.js";
98
+ import Mo from "./captureException.js";
99
+ import Uo from "./safeJSONParse.js";
100
+ import Wo from "./safeJSONStringify.js";
101
+ import jo from "./fallback.js";
102
102
  import Ho from "./isAuthenticated.js";
103
103
  import Xo from "./getToken.js";
104
104
  import Yo from "./setToken.js";
@@ -114,40 +114,63 @@ import er from "./parallel.js";
114
114
  import pr from "./sequential.js";
115
115
  import fr from "./safeAsync.js";
116
116
  import ar from "./cancelablePromise.js";
117
- const St = {
117
+ import nr from "./fuzzySearch.js";
118
+ import sr from "./filterByKey.js";
119
+ import lr from "./multiSort.js";
120
+ import cr from "./paginate.js";
121
+ import dr from "./fadeIn.js";
122
+ import ur from "./fadeOut.js";
123
+ import gr from "./smoothScroll.js";
124
+ import yr from "./waitForTransitionEnd.js";
125
+ import Sr from "./trackEvent.js";
126
+ import Tr from "./trackPageView.js";
127
+ import kr from "./measurePerformance.js";
128
+ import br from "./featureGate.js";
129
+ import hr from "./permissionGuard.js";
130
+ import Pr from "./auditLog.js";
131
+ import Er from "./logInfo.js";
132
+ import Cr from "./logWarn.js";
133
+ import Lr from "./once.js";
134
+ import Ar from "./noop.js";
135
+ import Br from "./identity.js";
136
+ import Ir from "./pipe.js";
137
+ import wr from "./singleton.js";
138
+ import Nr from "./createPubSub.js";
139
+ import vr from "./deepFreeze.js";
140
+ const ni = {
118
141
  // string
119
142
  capFirstLetter: o,
120
143
  capitalize: r,
121
144
  camelCase: m,
122
145
  generateInitials: d,
123
- kebabCase: A,
146
+ kebabCase: L,
124
147
  maskEmail: B,
125
- maskPhone: N,
126
- removeExtraSpaces: F,
127
- slugify: z,
128
- snakeCase: J,
129
- titleCase: M,
130
- truncate: U,
148
+ maskPhone: I,
149
+ removeExtraSpaces: x,
150
+ slugify: R,
151
+ snakeCase: G,
152
+ titleCase: V,
153
+ truncate: K,
131
154
  // number
132
155
  clamp: i,
133
156
  formatCompactNumber: a,
134
- formatCurrency: s,
157
+ formatCurrency: n,
135
158
  formatNumber: l,
136
159
  percentage: v,
137
- randomBetween: O,
138
- randomInt: x,
139
- randomValue: D,
140
- roundTo: R,
160
+ randomBetween: F,
161
+ randomInt: O,
162
+ randomValue: q,
163
+ roundTo: D,
141
164
  // date-time
142
165
  addDays: S,
143
166
  countdown: T,
144
167
  differenceInDays: k,
145
- formatDate: n,
168
+ formatDate: s,
146
169
  formatTime: c,
147
170
  getGreetingByTime: u,
148
- isPast: P,
171
+ isPast: E,
149
172
  isToday: C,
150
- timeAgo: G,
173
+ timeAgo: Q,
151
174
  // object / array
152
175
  chunk: t,
153
176
  compose: e,
@@ -157,17 +180,17 @@ const St = {
157
180
  hasEqualProps: y,
158
181
  isEmpty: b,
159
182
  isEqual: h,
160
- isNonEmptyArray: E,
161
- keyBy: L,
162
- mergeDeep: I,
163
- omit: q,
164
- pick: w,
165
- sortBy: Q,
166
- uniqueBy: V,
183
+ isNonEmptyArray: P,
184
+ keyBy: A,
185
+ mergeDeep: w,
186
+ omit: N,
187
+ pick: z,
188
+ sortBy: J,
189
+ uniqueBy: M,
167
190
  // validation
168
- isEmail: j,
169
- isPhone: K,
170
- isURL: W,
191
+ isEmail: U,
192
+ isPhone: W,
193
+ isURL: j,
171
194
  isPasswordStrong: H,
172
195
  isPAN: X,
173
196
  isAadhaar: Y,
@@ -184,8 +207,8 @@ const St = {
184
207
  isOnline: po,
185
208
  copyToClipboard: fo,
186
209
  downloadFile: ao,
187
- openInNewTab: so,
188
- getScreenSize: no,
210
+ openInNewTab: no,
211
+ getScreenSize: so,
189
212
  // routing
190
213
  getQueryParams: lo,
191
214
  setQueryParam: co,
@@ -198,36 +221,36 @@ const St = {
198
221
  setLocalStorage: ko,
199
222
  getLocalStorage: bo,
200
223
  removeLocalStorage: ho,
201
- setSessionStorage: Eo,
202
- getSessionStorage: Po,
224
+ setSessionStorage: Po,
225
+ getSessionStorage: Eo,
203
226
  clearStorage: Co,
204
227
  // performance
205
- debounce: Ao,
206
- throttle: Lo,
228
+ debounce: Lo,
229
+ throttle: Ao,
207
230
  memoize: Bo,
208
- lazyLoadComponent: No,
209
- requestIdleTask: Io,
210
- rafThrottle: qo,
231
+ lazyLoadComponent: Io,
232
+ requestIdleTask: wo,
233
+ rafThrottle: No,
211
234
  // ui / dom
212
235
  scrollToTop: vo,
213
- scrollToElement: wo,
214
- lockBodyScroll: Oo,
215
- unlockBodyScroll: xo,
216
- toggleFullscreen: Do,
217
- focusElement: Fo,
218
- detectOutsideClick: Ro,
219
- measureElement: zo,
236
+ scrollToElement: zo,
237
+ lockBodyScroll: Fo,
238
+ unlockBodyScroll: Oo,
239
+ toggleFullscreen: qo,
240
+ focusElement: xo,
241
+ detectOutsideClick: Do,
242
+ measureElement: Ro,
220
243
  // accessibility
221
- announceToScreenReader: Jo,
222
- trapFocus: Qo,
223
- generateAriaId: Go,
224
- handleKeyboardNavigation: Mo,
244
+ announceToScreenReader: Go,
245
+ trapFocus: Jo,
246
+ generateAriaId: Qo,
247
+ handleKeyboardNavigation: Vo,
225
248
  // error handling
226
- logError: Uo,
227
- captureException: Vo,
228
- safeJSONParse: jo,
229
- safeJSONStringify: Ko,
230
- fallback: Wo,
249
+ logError: Ko,
250
+ captureException: Mo,
251
+ safeJSONParse: Uo,
252
+ safeJSONStringify: Wo,
253
+ fallback: jo,
231
254
  // auth
232
255
  isAuthenticated: Ho,
233
256
  getToken: Xo,
@@ -245,8 +268,35 @@ const St = {
245
268
  parallel: er,
246
269
  sequential: pr,
247
270
  safeAsync: fr,
248
- cancelablePromise: ar
271
+ cancelablePromise: ar,
272
+ // filter
273
+ fuzzySearch: nr,
274
+ filterByKey: sr,
275
+ multiSort: lr,
276
+ paginate: cr,
277
+ // animation
278
+ fadeIn: dr,
279
+ fadeOut: ur,
280
+ smoothScroll: gr,
281
+ waitForTransitionEnd: yr,
282
+ // enterprise
283
+ trackEvent: Sr,
284
+ trackPageView: Tr,
285
+ measurePerformance: kr,
286
+ featureGate: br,
287
+ permissionGuard: hr,
288
+ auditLog: Pr,
289
+ logInfo: Er,
290
+ logWarn: Cr,
291
+ // function
292
+ once: Lr,
293
+ noop: Ar,
294
+ identity: Br,
295
+ pipe: Ir,
296
+ singleton: wr,
297
+ createPubSub: Nr,
298
+ deepFreeze: vr
249
299
  };
250
300
  export {
251
- St as default
301
+ ni as default
252
302
  };
@@ -0,0 +1,8 @@
1
+ const f = (e, t = {}) => {
2
+ var n;
3
+ const o = { level: "info", message: e, ...t, timestamp: (/* @__PURE__ */ new Date()).toISOString() };
4
+ return typeof window < "u" && typeof ((n = window.__logger) == null ? void 0 : n.info) == "function" ? window.__logger.info(o) : console.info("[logInfo]", o), o;
5
+ };
6
+ export {
7
+ f as default
8
+ };
@@ -0,0 +1,8 @@
1
+ const r = (o, t = {}) => {
2
+ var e;
3
+ const n = { level: "warn", message: o, ...t, timestamp: (/* @__PURE__ */ new Date()).toISOString() };
4
+ return typeof window < "u" && typeof ((e = window.__logger) == null ? void 0 : e.warn) == "function" ? window.__logger.warn(n) : console.warn("[logWarn]", n), n;
5
+ };
6
+ export {
7
+ r as default
8
+ };
@@ -0,0 +1,12 @@
1
+ const r = (o) => {
2
+ const e = typeof performance < "u" ? performance.getEntriesByName(o)[0] ?? null : null, n = {
3
+ metric: o,
4
+ duration: (e == null ? void 0 : e.duration) ?? null,
5
+ startTime: (e == null ? void 0 : e.startTime) ?? null,
6
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
7
+ };
8
+ return typeof window < "u" && typeof window.__performanceReporter == "function" ? window.__performanceReporter(n) : console.log("[measurePerformance]", n), n;
9
+ };
10
+ export {
11
+ r as default
12
+ };
@@ -0,0 +1,11 @@
1
+ const u = (f, s) => [...f].sort((o, r) => {
2
+ for (const { key: t, order: n = "asc" } of s) {
3
+ const c = typeof t == "function" ? t(o) : o[t], e = typeof t == "function" ? t(r) : r[t];
4
+ if (c < e) return n === "asc" ? -1 : 1;
5
+ if (c > e) return n === "asc" ? 1 : -1;
6
+ }
7
+ return 0;
8
+ });
9
+ export {
10
+ u as default
11
+ };
package/utils/noop.js ADDED
@@ -0,0 +1,5 @@
1
+ const o = () => {
2
+ };
3
+ export {
4
+ o as default
5
+ };
package/utils/once.js ADDED
@@ -0,0 +1,7 @@
1
+ const u = (l) => {
2
+ let e = !1, t;
3
+ return (...r) => (e || (e = !0, t = l(...r)), t);
4
+ };
5
+ export {
6
+ u as default
7
+ };
@@ -0,0 +1,13 @@
1
+ const c = (a, s, t) => {
2
+ const e = a.length, o = Math.ceil(e / t), n = (s - 1) * t;
3
+ return {
4
+ data: a.slice(n, n + t),
5
+ total: e,
6
+ page: s,
7
+ limit: t,
8
+ totalPages: o
9
+ };
10
+ };
11
+ export {
12
+ c as default
13
+ };
@@ -0,0 +1,4 @@
1
+ const i = (r, e = []) => typeof window < "u" && Array.isArray(window.__userRoles) ? window.__userRoles.includes(r) : Array.isArray(e) && e.includes(r);
2
+ export {
3
+ i as default
4
+ };
package/utils/pipe.js ADDED
@@ -0,0 +1,4 @@
1
+ const c = (...e) => (p) => e.reduce((t, a) => a(t), p);
2
+ export {
3
+ c as default
4
+ };
@@ -0,0 +1,7 @@
1
+ const t = (n) => {
2
+ let e;
3
+ return () => (e === void 0 && (e = n()), e);
4
+ };
5
+ export {
6
+ t as default
7
+ };
@@ -0,0 +1,14 @@
1
+ const u = (o, i = 500) => {
2
+ var t;
3
+ const e = window.scrollY, r = (typeof o == "number" ? o : ((t = o instanceof Element ? o : document.querySelector(o)) == null ? void 0 : t.getBoundingClientRect().top) + window.scrollY) - e;
4
+ let n = null;
5
+ const s = (c) => {
6
+ n || (n = c);
7
+ const d = c - n, l = Math.min(d / i, 1), a = 1 - Math.pow(1 - l, 3);
8
+ window.scrollTo(0, e + r * a), l < 1 && requestAnimationFrame(s);
9
+ };
10
+ requestAnimationFrame(s);
11
+ };
12
+ export {
13
+ u as default
14
+ };
@@ -0,0 +1,8 @@
1
+ const a = (e, o = {}) => {
2
+ var n;
3
+ const t = { name: e, payload: o, timestamp: (/* @__PURE__ */ new Date()).toISOString() };
4
+ return typeof window < "u" && typeof ((n = window.__analytics) == null ? void 0 : n.track) == "function" ? window.__analytics.track(t) : console.log("[trackEvent]", t), t;
5
+ };
6
+ export {
7
+ a as default
8
+ };
@@ -0,0 +1,12 @@
1
+ const o = (t) => {
2
+ var n;
3
+ const e = {
4
+ path: t,
5
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6
+ referrer: typeof document < "u" && document.referrer || null
7
+ };
8
+ return typeof window < "u" && typeof ((n = window.__analytics) == null ? void 0 : n.page) == "function" ? window.__analytics.page(e) : console.log("[trackPageView]", e), e;
9
+ };
10
+ export {
11
+ o as default
12
+ };
@@ -0,0 +1,9 @@
1
+ const a = (n, t) => new Promise((i) => {
2
+ const e = (r) => {
3
+ t && r.propertyName !== t || (n.removeEventListener("transitionend", e), i(r));
4
+ };
5
+ n.addEventListener("transitionend", e);
6
+ });
7
+ export {
8
+ a as default
9
+ };