@zuzjs/ui 0.8.0 → 0.8.2

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 (193) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/comps/Accordion/index.js +1 -1
  3. package/dist/cjs/comps/Actionbar/index.js +1 -1
  4. package/dist/cjs/comps/Alert/index.js +1 -1
  5. package/dist/cjs/comps/AutoComplete/index.d.ts +1 -1
  6. package/dist/cjs/comps/AutoComplete/index.js +3 -2
  7. package/dist/cjs/comps/Avatar/index.js +5 -5
  8. package/dist/cjs/comps/Box/index.js +1 -1
  9. package/dist/cjs/comps/Button/index.js +1 -1
  10. package/dist/cjs/comps/CheckBox/index.d.ts +1 -0
  11. package/dist/cjs/comps/CheckBox/index.js +1 -1
  12. package/dist/cjs/comps/CheckBox/types.d.ts +1 -0
  13. package/dist/cjs/comps/ColorScheme/index.js +1 -1
  14. package/dist/cjs/comps/ContextMenu/index.d.ts +2 -0
  15. package/dist/cjs/comps/ContextMenu/index.js +6 -6
  16. package/dist/cjs/comps/ContextMenu/item.js +1 -1
  17. package/dist/cjs/comps/ContextMenu/types.d.ts +3 -1
  18. package/dist/cjs/comps/CookiesConsent/index.js +1 -1
  19. package/dist/cjs/comps/Cover/index.js +1 -1
  20. package/dist/cjs/comps/Cropper/index.d.ts +8 -0
  21. package/dist/cjs/comps/Cropper/index.js +20 -0
  22. package/dist/cjs/comps/Cropper/types.d.ts +14 -0
  23. package/dist/cjs/comps/Cropper/types.js +5 -0
  24. package/dist/cjs/comps/Crumb/index.d.ts +1 -0
  25. package/dist/cjs/comps/Crumb/index.js +13 -3
  26. package/dist/cjs/comps/Crumb/types.d.ts +1 -0
  27. package/dist/cjs/comps/Drawer/index.js +1 -1
  28. package/dist/cjs/comps/Fab/index.js +1 -1
  29. package/dist/cjs/comps/Filters/index.js +1 -1
  30. package/dist/cjs/comps/Form/index.js +22 -6
  31. package/dist/cjs/comps/Icon/index.js +1 -1
  32. package/dist/cjs/comps/Image/index.js +1 -1
  33. package/dist/cjs/comps/Input/index.d.ts +2 -2
  34. package/dist/cjs/comps/Input/index.js +1 -1
  35. package/dist/cjs/comps/KeyboardKeys/index.js +1 -1
  36. package/dist/cjs/comps/Label/index.js +1 -1
  37. package/dist/cjs/comps/List/index.js +1 -1
  38. package/dist/cjs/comps/Network/index.js +1 -1
  39. package/dist/cjs/comps/Overlay/index.js +1 -1
  40. package/dist/cjs/comps/Pagination/index.js +1 -1
  41. package/dist/cjs/comps/Password/index.d.ts +6 -2
  42. package/dist/cjs/comps/Password/index.js +15 -5
  43. package/dist/cjs/comps/PinInput/index.d.ts +1 -1
  44. package/dist/cjs/comps/PinInput/index.js +8 -3
  45. package/dist/cjs/comps/ProgressBar/index.js +2 -2
  46. package/dist/cjs/comps/Radio/index.js +1 -1
  47. package/dist/cjs/comps/ScrollView/index.js +1 -1
  48. package/dist/cjs/comps/Search/index.d.ts +1 -1
  49. package/dist/cjs/comps/Search/index.js +1 -1
  50. package/dist/cjs/comps/Segmented/index.js +1 -1
  51. package/dist/cjs/comps/Select/index.d.ts +1 -0
  52. package/dist/cjs/comps/Select/index.js +3 -3
  53. package/dist/cjs/comps/Select/types.d.ts +6 -1
  54. package/dist/cjs/comps/Sheet/index.js +1 -1
  55. package/dist/cjs/comps/Sidebar/index.js +1 -1
  56. package/dist/cjs/comps/Slider/index.js +1 -1
  57. package/dist/cjs/comps/Span/index.js +1 -1
  58. package/dist/cjs/comps/Spinner/index.js +1 -1
  59. package/dist/cjs/comps/Switch/index.d.ts +1 -0
  60. package/dist/cjs/comps/Switch/index.js +1 -1
  61. package/dist/cjs/comps/TabView/body.js +1 -1
  62. package/dist/cjs/comps/TabView/index.js +1 -1
  63. package/dist/cjs/comps/TabView/tab.js +1 -1
  64. package/dist/cjs/comps/Table/col.js +1 -1
  65. package/dist/cjs/comps/Table/index.js +56 -2
  66. package/dist/cjs/comps/Table/row.js +1 -1
  67. package/dist/cjs/comps/Text/index.js +1 -1
  68. package/dist/cjs/comps/TextArea/index.js +1 -1
  69. package/dist/cjs/comps/TextWheel/index.js +3 -3
  70. package/dist/cjs/comps/Tooltip/index.js +1 -1
  71. package/dist/cjs/comps/Treeview/index.js +1 -1
  72. package/dist/cjs/comps/Treeview/item.js +1 -1
  73. package/dist/cjs/comps/VideoPlayer/index.js +1 -0
  74. package/dist/cjs/comps/index.d.ts +2 -0
  75. package/dist/cjs/comps/index.js +2 -0
  76. package/dist/cjs/funs/events.d.ts +31 -7
  77. package/dist/cjs/funs/events.js +57 -19
  78. package/dist/cjs/funs/index.d.ts +5 -3
  79. package/dist/cjs/funs/index.js +39 -84
  80. package/dist/cjs/hooks/index.d.ts +4 -0
  81. package/dist/cjs/hooks/index.js +4 -0
  82. package/dist/cjs/hooks/useDB.d.ts +5 -1
  83. package/dist/cjs/hooks/useDB.js +52 -4
  84. package/dist/cjs/hooks/useFacebookPixel.d.ts +11 -0
  85. package/dist/cjs/hooks/useFacebookPixel.js +64 -0
  86. package/dist/cjs/hooks/useGoogleTagManager.d.ts +9 -0
  87. package/dist/cjs/hooks/useGoogleTagManager.js +53 -0
  88. package/dist/cjs/hooks/useImage.js +2 -2
  89. package/dist/cjs/hooks/useImageCropper.d.ts +10 -0
  90. package/dist/cjs/hooks/useImageCropper.js +67 -0
  91. package/dist/cjs/hooks/useUploader.d.ts +46 -0
  92. package/dist/cjs/hooks/useUploader.js +101 -0
  93. package/dist/cjs/hooks/useWebSocket.d.ts +2 -2
  94. package/dist/cjs/hooks/useWebSocket.js +13 -2
  95. package/dist/cjs/types/index.d.ts +3 -0
  96. package/dist/css/styles.css +1 -1
  97. package/dist/esm/comps/Accordion/index.js +1 -1
  98. package/dist/esm/comps/Actionbar/index.js +1 -1
  99. package/dist/esm/comps/Alert/index.js +1 -1
  100. package/dist/esm/comps/AutoComplete/index.d.ts +1 -1
  101. package/dist/esm/comps/AutoComplete/index.js +3 -2
  102. package/dist/esm/comps/Avatar/index.js +5 -5
  103. package/dist/esm/comps/Box/index.js +1 -1
  104. package/dist/esm/comps/Button/index.js +1 -1
  105. package/dist/esm/comps/CheckBox/index.d.ts +1 -0
  106. package/dist/esm/comps/CheckBox/index.js +1 -1
  107. package/dist/esm/comps/CheckBox/types.d.ts +1 -0
  108. package/dist/esm/comps/ColorScheme/index.js +1 -1
  109. package/dist/esm/comps/ContextMenu/index.d.ts +2 -0
  110. package/dist/esm/comps/ContextMenu/index.js +6 -6
  111. package/dist/esm/comps/ContextMenu/item.js +1 -1
  112. package/dist/esm/comps/ContextMenu/types.d.ts +3 -1
  113. package/dist/esm/comps/CookiesConsent/index.js +1 -1
  114. package/dist/esm/comps/Cover/index.js +1 -1
  115. package/dist/esm/comps/Cropper/index.d.ts +8 -0
  116. package/dist/esm/comps/Cropper/index.js +20 -0
  117. package/dist/esm/comps/Cropper/types.d.ts +14 -0
  118. package/dist/esm/comps/Cropper/types.js +5 -0
  119. package/dist/esm/comps/Crumb/index.d.ts +1 -0
  120. package/dist/esm/comps/Crumb/index.js +13 -3
  121. package/dist/esm/comps/Crumb/types.d.ts +1 -0
  122. package/dist/esm/comps/Drawer/index.js +1 -1
  123. package/dist/esm/comps/Fab/index.js +1 -1
  124. package/dist/esm/comps/Filters/index.js +1 -1
  125. package/dist/esm/comps/Form/index.js +22 -6
  126. package/dist/esm/comps/Icon/index.js +1 -1
  127. package/dist/esm/comps/Image/index.js +1 -1
  128. package/dist/esm/comps/Input/index.d.ts +2 -2
  129. package/dist/esm/comps/Input/index.js +1 -1
  130. package/dist/esm/comps/KeyboardKeys/index.js +1 -1
  131. package/dist/esm/comps/Label/index.js +1 -1
  132. package/dist/esm/comps/List/index.js +1 -1
  133. package/dist/esm/comps/Network/index.js +1 -1
  134. package/dist/esm/comps/Overlay/index.js +1 -1
  135. package/dist/esm/comps/Pagination/index.js +1 -1
  136. package/dist/esm/comps/Password/index.d.ts +6 -2
  137. package/dist/esm/comps/Password/index.js +15 -5
  138. package/dist/esm/comps/PinInput/index.d.ts +1 -1
  139. package/dist/esm/comps/PinInput/index.js +8 -3
  140. package/dist/esm/comps/ProgressBar/index.js +2 -2
  141. package/dist/esm/comps/Radio/index.js +1 -1
  142. package/dist/esm/comps/ScrollView/index.js +1 -1
  143. package/dist/esm/comps/Search/index.d.ts +1 -1
  144. package/dist/esm/comps/Search/index.js +1 -1
  145. package/dist/esm/comps/Segmented/index.js +1 -1
  146. package/dist/esm/comps/Select/index.d.ts +1 -0
  147. package/dist/esm/comps/Select/index.js +3 -3
  148. package/dist/esm/comps/Select/types.d.ts +6 -1
  149. package/dist/esm/comps/Sheet/index.js +1 -1
  150. package/dist/esm/comps/Sidebar/index.js +1 -1
  151. package/dist/esm/comps/Slider/index.js +1 -1
  152. package/dist/esm/comps/Span/index.js +1 -1
  153. package/dist/esm/comps/Spinner/index.js +1 -1
  154. package/dist/esm/comps/Switch/index.d.ts +1 -0
  155. package/dist/esm/comps/Switch/index.js +1 -1
  156. package/dist/esm/comps/TabView/body.js +1 -1
  157. package/dist/esm/comps/TabView/index.js +1 -1
  158. package/dist/esm/comps/TabView/tab.js +1 -1
  159. package/dist/esm/comps/Table/col.js +1 -1
  160. package/dist/esm/comps/Table/index.js +56 -2
  161. package/dist/esm/comps/Table/row.js +1 -1
  162. package/dist/esm/comps/Text/index.js +1 -1
  163. package/dist/esm/comps/TextArea/index.js +1 -1
  164. package/dist/esm/comps/TextWheel/index.js +3 -3
  165. package/dist/esm/comps/Tooltip/index.js +1 -1
  166. package/dist/esm/comps/Treeview/index.js +1 -1
  167. package/dist/esm/comps/Treeview/item.js +1 -1
  168. package/dist/esm/comps/VideoPlayer/index.js +1 -0
  169. package/dist/esm/comps/index.d.ts +2 -0
  170. package/dist/esm/comps/index.js +2 -0
  171. package/dist/esm/funs/events.d.ts +31 -7
  172. package/dist/esm/funs/events.js +57 -19
  173. package/dist/esm/funs/index.d.ts +5 -3
  174. package/dist/esm/funs/index.js +39 -84
  175. package/dist/esm/hooks/index.d.ts +4 -0
  176. package/dist/esm/hooks/index.js +4 -0
  177. package/dist/esm/hooks/useDB.d.ts +5 -1
  178. package/dist/esm/hooks/useDB.js +52 -4
  179. package/dist/esm/hooks/useFacebookPixel.d.ts +11 -0
  180. package/dist/esm/hooks/useFacebookPixel.js +64 -0
  181. package/dist/esm/hooks/useGoogleTagManager.d.ts +9 -0
  182. package/dist/esm/hooks/useGoogleTagManager.js +53 -0
  183. package/dist/esm/hooks/useImage.js +2 -2
  184. package/dist/esm/hooks/useImageCropper.d.ts +10 -0
  185. package/dist/esm/hooks/useImageCropper.js +67 -0
  186. package/dist/esm/hooks/useUploader.d.ts +46 -0
  187. package/dist/esm/hooks/useUploader.js +101 -0
  188. package/dist/esm/hooks/useWebSocket.d.ts +2 -2
  189. package/dist/esm/hooks/useWebSocket.js +13 -2
  190. package/dist/esm/types/index.d.ts +3 -0
  191. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  192. package/dist/tsconfig.tsbuildinfo +1 -1
  193. package/package.json +2 -2
@@ -83,5 +83,5 @@ const TRow = (props) => {
83
83
  return _jsxs(Fragment, { children: [selectable && i == 0 && Selector(i, `--selector-${c.id}`, c.id.toString()), ids.includes(String(c.id)) ? _jsx(TColumn, { pubsub: pubsub, idx: i, id: String(c.id), style: styles[String(c.id)], value: c.render ? c.render(data, index) : data[String(c.id).includes(`.`) ? String(c.id).split(`.`).reverse()[0] : c.id] }) : null] }, `--${String(c.id)}-val-${i}`);
84
84
  })] });
85
85
  };
86
- TRow.displayName = `Row`;
86
+ TRow.displayName = `Zuz.Row`;
87
87
  export default TRow;
@@ -10,5 +10,5 @@ const Text = forwardRef((props, ref) => {
10
10
  const Tag = `h${props.h || 1}`;
11
11
  return _jsx(Tag, { ref: ref, style: style, className: className, ...rest, children: html ? _jsx(Span, { dangerouslySetInnerHTML: { __html: html } }) : children });
12
12
  });
13
- Text.displayName = `ZuzUI.Text`;
13
+ Text.displayName = `Zuz.Text`;
14
14
  export default Text;
@@ -9,5 +9,5 @@ const TextArea = forwardRef((props, ref) => {
9
9
  };
10
10
  return _jsx("textarea", { className: `--input --textarea --${variant || Variant.Small} flex ${className}`.trim(), style: { ...style, resize: resize || `none` }, onInput: handleInput, ref: ref, ...rest });
11
11
  });
12
- TextArea.displayName = `ZuzUI.TextArea`;
12
+ TextArea.displayName = `Zuz.TextArea`;
13
13
  export default TextArea;
@@ -17,11 +17,11 @@ const TextWheel = forwardRef((props, ref) => {
17
17
  this.updateValue(v);
18
18
  if (divRef.current) {
19
19
  const chars = v.toString().split('');
20
- divRef.current.querySelectorAll('.wheel-char').forEach((charElement, index) => {
20
+ divRef.current.querySelectorAll('.--wheel-char').forEach((charElement, index) => {
21
21
  const char = chars[index];
22
22
  if (charElement instanceof HTMLElement) {
23
23
  charElement.setAttribute('data-value', char);
24
- const track = charElement.querySelector('.wheel-char-track');
24
+ const track = charElement.querySelector('.--wheel-char-track');
25
25
  if (track instanceof HTMLElement) {
26
26
  track.style.setProperty('--v', char);
27
27
  }
@@ -50,5 +50,5 @@ const TextWheel = forwardRef((props, ref) => {
50
50
  background: `linear-gradient(0deg, ${color}, transparent, transparent, transparent, ${color})`,
51
51
  } })] });
52
52
  });
53
- TextWheel.displayName = `TextWheel`;
53
+ TextWheel.displayName = `Zuz.TextWheel`;
54
54
  export default TextWheel;
@@ -53,5 +53,5 @@ const ToolTip = forwardRef((props, ref) => {
53
53
  when: hovered
54
54
  }, children: _jsx(Text, { className: `--text rel`, children: title }) })] });
55
55
  });
56
- ToolTip.displayName = `ToolTip`;
56
+ ToolTip.displayName = `Zuz.ToolTip`;
57
57
  export default ToolTip;
@@ -22,5 +22,5 @@ const TreeView = forwardRef((props, ref) => {
22
22
  .filter(node => roots.includes(node.tag))
23
23
  .map(node => _jsx(TreeItem, { treeTag: treeViewTag ? `-${treeViewTag}` : ``, selected: selected, onSelect: e => handleSelect(e), icons: icons, meta: node, roots: roots, expanded: node.expanded || false, skeleton: rest.skeleton, nodes: nodes }, `--node-${node.tag}`)) });
24
24
  });
25
- TreeView.displayName = `ZuzUI.TreeView`;
25
+ TreeView.displayName = `Zuz.TreeView`;
26
26
  export default TreeView;
@@ -27,7 +27,7 @@ const TreeItem = forwardRef((props, ref) => {
27
27
  : _nodes.length == 0 ? SVGIcons.chevronBottom : isOpen ? SVGIcons.chevronBottom : SVGIcons.chevronRight }), _jsxs(Button, { className: `--node-meta flex aic`, onClick: (e) => onSelect(tag), children: [((icons?.nodeOpen && icons?.nodeClose) || (isRoot && icons?.rootOpen && icons?.rootClose)) &&
28
28
  _jsx(Icon, { skeleton: rest.skeleton, className: `--node-icon ${isRoot ? `--icon-root` : ``}`, name: icon || (isOpen ?
29
29
  isRoot ? icons?.rootOpen || icons.nodeOpen : icons.nodeOpen
30
- : isRoot ? icons?.rootClose || icons?.nodeClose : icons?.nodeClose) }), _jsx(Text, { ...{ className: `--node-label` }, skeleton: rest.skeleton, children: label })] })] }), isOpen && _nodes.length > 0 && _jsx(Box, { className: `--sub-node tree-sub-node-${tag} flex cols`, children: _nodes.map(node => _jsx(TreeItem, { treeTag: treeTag, selected: selected, onSelect: onSelect, icons: icons, roots: roots, expanded: node.expanded || false, meta: node, nodes: nodes }, `--node-${node.tag}`)) })] });
30
+ : isRoot ? icons?.rootClose || icons?.nodeClose : icons?.nodeClose) }), _jsx(Text, { ...{ className: `--node-label ${isRoot ? `--node-label-root` : ``}`.trim() }, skeleton: rest.skeleton, children: label })] })] }), isOpen && _nodes.length > 0 && _jsx(Box, { className: `--sub-node tree-sub-node-${tag} flex cols`, children: _nodes.map(node => _jsx(TreeItem, { treeTag: treeTag, selected: selected, onSelect: onSelect, icons: icons, roots: roots, expanded: node.expanded || false, meta: node, nodes: nodes }, `--node-${node.tag}`)) })] });
31
31
  });
32
32
  TreeItem.displayName = `TreeItem`;
33
33
  export default TreeItem;
@@ -4,4 +4,5 @@ import Box from "../Box";
4
4
  const VideoPlayer = forwardRef((props, ref) => {
5
5
  return _jsx(Box, { children: _jsx("video", {}) });
6
6
  });
7
+ VideoPlayer.displayName = `Zuz.VideoPlayer`;
7
8
  export default VideoPlayer;
@@ -20,6 +20,8 @@ export * from './ContextMenu/types';
20
20
  export { default as CookiesConsent } from './CookiesConsent';
21
21
  export * from './CookiesConsent/types';
22
22
  export { default as Cover, type CoverProps } from './Cover';
23
+ export { default as Cropper } from './Cropper';
24
+ export * from './Cropper/types';
23
25
  export { default as Crumb } from './Crumb';
24
26
  export * from './Crumb/types';
25
27
  export { default as Drawer } from './Drawer';
@@ -20,6 +20,8 @@ export * from './ContextMenu/types';
20
20
  export { default as CookiesConsent } from './CookiesConsent';
21
21
  export * from './CookiesConsent/types';
22
22
  export { default as Cover } from './Cover';
23
+ export { default as Cropper } from './Cropper';
24
+ export * from './Cropper/types';
23
25
  export { default as Crumb } from './Crumb';
24
26
  export * from './Crumb/types';
25
27
  export { default as Drawer } from './Drawer';
@@ -1,17 +1,41 @@
1
+ export interface EventListener {
2
+ fun: (...args: any[]) => void;
3
+ context?: any;
4
+ id: symbol;
5
+ }
1
6
  export interface Event {
2
7
  event: String | Symbol;
3
- listeners: Array<{
4
- fun: (...args: any[]) => void;
5
- context?: any;
6
- }>;
8
+ listeners: Array<EventListener>;
7
9
  }
8
10
  declare class Events {
9
11
  _events: Event[];
10
12
  constructor();
11
- addEvent(event: String | Symbol, fun: (...args: any[]) => void, context?: any): number | undefined;
12
- removeEvent(event: String | Symbol, fun: (...args: any[]) => void): void;
13
- on(event: String | Symbol, fun: (...args: any[]) => void, context?: any): number | undefined;
13
+ /**
14
+ * Registers an event listener.
15
+ * @param event The name of the event.
16
+ * @param fun The callback function.
17
+ * @param context Optional context (this) for the callback.
18
+ * @returns A function to unsubscribe this specific listener.
19
+ */
20
+ on(event: String | Symbol, fun: (...args: any[]) => void, context?: any): () => void;
21
+ /**
22
+ * Removes event listeners matching a specific event and function.
23
+ * Note: This removes *all* listeners for the event that use the exact same function reference.
24
+ * It's often more reliable to use the unsubscribe function returned by 'on'.
25
+ * @param event The name of the event.
26
+ * @param fun The callback function to remove.
27
+ */
14
28
  off(event: String | Symbol, fun: (...args: any[]) => void): void;
29
+ /**
30
+ * Emits an event, calling all registered listeners.
31
+ * @param event The name of the event.
32
+ * @param args Arguments to pass to the listeners.
33
+ */
15
34
  emit(event: String | Symbol, ...args: any[]): void;
35
+ /**
36
+ * Removes all listeners for a specific event.
37
+ * @param event The name of the event.
38
+ */
39
+ removeAllListeners(event: String | Symbol): void;
16
40
  }
17
41
  export default Events;
@@ -3,42 +3,80 @@ class Events {
3
3
  constructor() {
4
4
  this._events = [];
5
5
  }
6
- addEvent(event, fun, context) {
7
- const evt = this._events.find(x => x.event == event);
8
- const listener = { fun: context ? fun.bind(context) : fun, context };
6
+ /**
7
+ * Registers an event listener.
8
+ * @param event The name of the event.
9
+ * @param fun The callback function.
10
+ * @param context Optional context (this) for the callback.
11
+ * @returns A function to unsubscribe this specific listener.
12
+ */
13
+ on(event, fun, context) {
14
+ const evt = this._events.find(x => x.event === event);
15
+ const id = Symbol('listener_id'); // Give each listener a unique ID
16
+ const listener = {
17
+ fun: fun, // Store original function
18
+ context: context,
19
+ id: id,
20
+ };
9
21
  if (!evt) {
10
- return this._events.push({ event: event, listeners: [listener] });
22
+ this._events.push({ event: event, listeners: [listener] });
11
23
  }
12
- if (!evt.listeners.find(x => x.fun == fun)) {
24
+ else {
13
25
  evt.listeners.push(listener);
14
26
  }
27
+ // Return an unsubscribe function
28
+ return () => {
29
+ const currentEvt = this._events.find(x => x.event === event);
30
+ if (currentEvt) {
31
+ currentEvt.listeners = currentEvt.listeners.filter(l => l.id !== id);
32
+ if (currentEvt.listeners.length === 0) {
33
+ this._events = this._events.filter(e => e.event !== event);
34
+ }
35
+ }
36
+ };
15
37
  }
16
- removeEvent(event, fun) {
17
- const evt = this._events.find(x => x.event == event);
38
+ /**
39
+ * Removes event listeners matching a specific event and function.
40
+ * Note: This removes *all* listeners for the event that use the exact same function reference.
41
+ * It's often more reliable to use the unsubscribe function returned by 'on'.
42
+ * @param event The name of the event.
43
+ * @param fun The callback function to remove.
44
+ */
45
+ off(event, fun) {
46
+ const evt = this._events.find(x => x.event === event);
18
47
  if (evt) {
19
- evt.listeners = evt.listeners.filter(x => x.fun != fun);
48
+ // Filter out listeners where the 'fun' property matches the provided function.
49
+ evt.listeners = evt.listeners.filter(listener => listener.fun !== fun);
50
+ // Optional: If no listeners remain for this event, remove the event entry.
51
+ if (evt.listeners.length === 0) {
52
+ this._events = this._events.filter(e => e.event !== event);
53
+ }
20
54
  }
21
55
  }
22
- on(event, fun, context) {
23
- return this.addEvent(event, fun, context);
24
- }
25
- off(event, fun) {
26
- this.removeEvent(event, fun);
27
- }
56
+ /**
57
+ * Emits an event, calling all registered listeners.
58
+ * @param event The name of the event.
59
+ * @param args Arguments to pass to the listeners.
60
+ */
28
61
  emit(event, ...args) {
29
- const evt = this._events.find(x => x.event == event);
62
+ const evt = this._events.find(x => x.event === event);
30
63
  if (evt) {
31
- // console.log(evt)
32
- evt.listeners.forEach(({ fun, context }) => {
64
+ [...evt.listeners].forEach(({ fun, context }) => {
33
65
  try {
34
- // f(args)
35
66
  fun.apply(context, args);
36
67
  }
37
68
  catch (e) {
38
- console.error(e);
69
+ console.error(`Error during event '${String(event)}' emission:`, e);
39
70
  }
40
71
  });
41
72
  }
42
73
  }
74
+ /**
75
+ * Removes all listeners for a specific event.
76
+ * @param event The name of the event.
77
+ */
78
+ removeAllListeners(event) {
79
+ this._events = this._events.filter(e => e.event !== event);
80
+ }
43
81
  }
44
82
  export default Events;
@@ -1,4 +1,3 @@
1
- import { AxiosProgressEvent } from "axios";
2
1
  import { ReactElement, ReactNode, Ref } from "react";
3
2
  import { KeyCode } from "../types/enums.js";
4
3
  import { dynamicObject, FormatNumberParams, sortOptions } from "../types/index.js";
@@ -49,8 +48,6 @@ export declare const cleanProps: <T extends dynamicObject>(props: T, withProps?:
49
48
  export declare const withZuz: (cx: string | string[]) => string;
50
49
  export declare const setDeep: (object: dynamicObject, path: string, value: any, seperator?: string) => dynamicObject;
51
50
  export declare const removeDuplicatesFromArray: <T>(array: T[]) => T[];
52
- export declare const withPost: <T>(uri: string, data: dynamicObject | FormData, timeout?: number, onProgress?: (ev: AxiosProgressEvent) => void) => Promise<T>;
53
- export declare const withGet: <T>(uri: string, timeout?: number, ignoreKind?: boolean) => Promise<T>;
54
51
  export declare const withTime: (fun: (...args: any[]) => any) => {
55
52
  result: any;
56
53
  executionTime: number;
@@ -75,3 +72,8 @@ export declare const clamp: (value: number, min: number, max: number) => number;
75
72
  export declare function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): Ref<T>;
76
73
  export declare const slugify: (text: string, separator?: string) => string;
77
74
  export declare const truncate: (selector: string, lines?: number) => void;
75
+ export declare const checkPasswordStrength: (password: string) => {
76
+ score: number;
77
+ result: string;
78
+ suggestion: string[];
79
+ };
@@ -1,6 +1,4 @@
1
- import axios from "axios";
2
1
  import Hashids from "hashids";
3
- import Cookies from "js-cookie";
4
2
  import md5 from "md5";
5
3
  import moment from "moment";
6
4
  import { nanoid } from "nanoid";
@@ -205,88 +203,6 @@ export const removeDuplicatesFromArray = (array) => {
205
203
  return accumulator;
206
204
  }, []);
207
205
  };
208
- export const withPost = async (uri, data, timeout = 60, onProgress) => {
209
- const _cookies = Cookies.get();
210
- if (data instanceof FormData) {
211
- for (const c in _cookies) {
212
- data.append(c, _cookies[c]);
213
- }
214
- return new Promise((resolve, reject) => {
215
- axios({
216
- method: 'post',
217
- url: uri,
218
- data: data,
219
- timeout: timeout * 1000,
220
- headers: {
221
- 'Content-Type': 'multipart/form-data',
222
- },
223
- onUploadProgress: ev => onProgress && onProgress(ev)
224
- })
225
- .then(resp => {
226
- if (resp.data && "kind" in resp.data) {
227
- resolve(resp.data);
228
- }
229
- else {
230
- reject(resp.data);
231
- }
232
- })
233
- .catch(err => reject(err));
234
- });
235
- }
236
- return new Promise((resolve, reject) => {
237
- axios.post(uri, {
238
- ...data,
239
- ..._cookies,
240
- __stmp: new Date().getTime() / 1000
241
- }, {
242
- timeout: 1000 * timeout,
243
- headers: {
244
- 'Content-Type': 'application/json',
245
- }
246
- })
247
- .then(resp => {
248
- if (resp.data && "kind" in resp.data) {
249
- resolve(resp.data);
250
- }
251
- else {
252
- reject(resp.data);
253
- }
254
- })
255
- .catch(err => {
256
- if (err?.response?.data)
257
- reject(err.response.data);
258
- else
259
- reject(err.code && err.code == `ERR_NETWORK` ? { error: err.code, message: navigator.onLine ? `Unable to connect to the server. It may be temporarily down.` : `Network error: Unable to connect. Please check your internet connection and try again.` } : err);
260
- });
261
- });
262
- };
263
- export const withGet = async (uri, timeout = 60, ignoreKind = false) => {
264
- return new Promise((resolve, reject) => {
265
- axios
266
- .get(uri, { timeout: timeout * 1000 })
267
- .then((resp) => {
268
- if (ignoreKind || (resp.data && "kind" in resp.data)) {
269
- resolve(resp.data);
270
- }
271
- else {
272
- reject(resp.data);
273
- }
274
- })
275
- .catch((err) => {
276
- if (err?.response?.data)
277
- reject(err.response.data);
278
- else
279
- reject(err.code === `ERR_NETWORK`
280
- ? {
281
- error: err.code,
282
- message: navigator.onLine
283
- ? `Unable to connect to the server. It may be temporarily down.`
284
- : `Network error: Unable to connect. Please check your internet connection and try again.`,
285
- }
286
- : err);
287
- });
288
- });
289
- };
290
206
  export const withTime = (fun) => {
291
207
  const start = new Date().getTime();
292
208
  const result = fun();
@@ -546,3 +462,42 @@ export const truncate = (selector, lines = 2) => {
546
462
  }
547
463
  });
548
464
  };
465
+ export const checkPasswordStrength = (password) => {
466
+ const suggestions = [];
467
+ let score = 0;
468
+ if (password.length >= 8) {
469
+ score++;
470
+ }
471
+ else {
472
+ suggestions.push("Use at least 8 characters");
473
+ }
474
+ if (/[a-z]/.test(password)) {
475
+ score++;
476
+ }
477
+ else {
478
+ suggestions.push("Add lowercase letters");
479
+ }
480
+ if (/[A-Z]/.test(password)) {
481
+ score++;
482
+ }
483
+ else {
484
+ suggestions.push("Add uppercase letters");
485
+ }
486
+ if (/\d/.test(password)) {
487
+ score++;
488
+ }
489
+ else {
490
+ suggestions.push("Include numbers");
491
+ }
492
+ if (/[^A-Za-z0-9]/.test(password)) {
493
+ score++;
494
+ }
495
+ else {
496
+ suggestions.push("Add special characters (e.g. !, @, #)");
497
+ }
498
+ return {
499
+ score,
500
+ result: score <= 2 ? "Weak" : score == 3 ? "Moderate" : score == 4 ? "Strong" : "Excellent",
501
+ suggestion: suggestions
502
+ };
503
+ };
@@ -16,7 +16,10 @@ export { default as useMergedRefs } from './useMergedRefs';
16
16
  export { default as useMutationObserver, type MutationCallback } from './useMutationObserver';
17
17
  export { default as useDrag, type DragOptions } from './useDrag';
18
18
  export { default as useFileManager } from './useFileManager';
19
+ export { default as useFacebookPixel } from './useFacebookPixel';
20
+ export { default as useGoogleTagManager } from './useGoogleTagManager';
19
21
  export { default as useImage } from './useImage';
22
+ export { default as useImageCropper } from './useImageCropper';
20
23
  export { default as useIntersectionObserver } from './useIntersectionObserver';
21
24
  export { default as useScrollbar } from './useScrollbar';
22
25
  export { default as useSheet } from './useSheet';
@@ -25,5 +28,6 @@ export { default as useNetworkStatus } from './useNetworkStatus';
25
28
  export { default as useResizeObserver } from './useResizeObserver';
26
29
  export { default as useSlider } from './useSlider';
27
30
  export { default as useTruncateText } from './useTruncateText';
31
+ export { default as useUploader } from './useUploader';
28
32
  export { default as useViewTransition } from './useViewTransition';
29
33
  export { default as useWebSocket, type WebSocketOptions } from './useWebSocket';
@@ -17,7 +17,10 @@ export { default as useMutationObserver } from './useMutationObserver';
17
17
  export { default as useDrag } from './useDrag';
18
18
  export { default as useFileManager } from './useFileManager';
19
19
  //useFilter
20
+ export { default as useFacebookPixel } from './useFacebookPixel';
21
+ export { default as useGoogleTagManager } from './useGoogleTagManager';
20
22
  export { default as useImage } from './useImage';
23
+ export { default as useImageCropper } from './useImageCropper';
21
24
  export { default as useIntersectionObserver } from './useIntersectionObserver';
22
25
  export { default as useScrollbar } from './useScrollbar';
23
26
  export { default as useSheet } from './useSheet';
@@ -26,5 +29,6 @@ export { default as useNetworkStatus } from './useNetworkStatus';
26
29
  export { default as useResizeObserver } from './useResizeObserver';
27
30
  export { default as useSlider } from './useSlider';
28
31
  export { default as useTruncateText } from './useTruncateText';
32
+ export { default as useUploader } from './useUploader';
29
33
  export { default as useViewTransition } from './useViewTransition';
30
34
  export { default as useWebSocket } from './useWebSocket';
@@ -17,10 +17,14 @@ export interface IDBSchema {
17
17
  unique?: boolean;
18
18
  }
19
19
  declare const useDB: (options: IDBOptions) => {
20
+ getAll: <T>(storeName: string) => Promise<T>;
20
21
  getByID: <T>(storeName: string, id: string | number) => Promise<T>;
21
22
  getStore: <T>(storeName: string, id: string | number) => Promise<T>;
22
23
  insert: <T>(storeName: string, value: T, key?: any) => Promise<number>;
23
- update: <T>(storeName: string, value: T, key: IDBValidKey) => Promise<void>;
24
+ update: <T>(storeName: string, values: {
25
+ [x: string | number | symbol]: T;
26
+ }) => Promise<void>;
27
+ update_one: <T extends Object>(storeName: string, value: Partial<T>, key: IDBValidKey) => Promise<void>;
24
28
  remove: (storeName: string, key: IDBValidKey) => Promise<void>;
25
29
  error: string | null;
26
30
  };
@@ -65,6 +65,25 @@ const useDB = (options) => {
65
65
  reject(err.message || 'Database either corrupted or not initialized');
66
66
  });
67
67
  });
68
+ const getAll = (storeName) => new Promise((resolve, reject) => {
69
+ connect().then((db) => {
70
+ const { store } = createTransaction(storeName, DBMode.readOnly);
71
+ const request = store.getAll();
72
+ request.onsuccess = (evt) => {
73
+ const result = evt.target.result;
74
+ if (undefined == result)
75
+ reject('Record not found');
76
+ resolve(evt.target.result);
77
+ };
78
+ request.onerror = (evt) => {
79
+ reject(`SELECT Failed. ${evt.target.result}`);
80
+ };
81
+ })
82
+ .catch(err => {
83
+ console.log(`[getAll]`, err);
84
+ reject('Database either corrupted or not initialized');
85
+ });
86
+ });
68
87
  const getByID = (storeName, id) => new Promise((resolve, reject) => {
69
88
  connect().then((db) => {
70
89
  const { store } = createTransaction(storeName, DBMode.readOnly);
@@ -80,7 +99,7 @@ const useDB = (options) => {
80
99
  };
81
100
  })
82
101
  .catch(err => {
83
- // console.log(`getByID`, err)
102
+ console.log(`[getByID]`, err);
84
103
  reject('Database either corrupted or not initialized');
85
104
  });
86
105
  });
@@ -99,16 +118,43 @@ const useDB = (options) => {
99
118
  reject(err.message || 'Database either corrupted or not initialized');
100
119
  });
101
120
  });
102
- const update = (storeName, value, key) => new Promise((resolve, reject) => {
121
+ const update_one = (storeName, value, key) => new Promise((resolve, reject) => {
103
122
  connect().then((db) => {
104
123
  const { store } = createTransaction(storeName, DBMode.readWrite);
105
- const request = store.put(value, key);
124
+ const getReq = store.get(key);
125
+ getReq.onsuccess = () => {
126
+ const existing = getReq.result;
127
+ if (!existing) {
128
+ reject(`Record with key ${key} not found.`);
129
+ return;
130
+ }
131
+ const updateReq = store.put({ ...existing, ...value });
132
+ updateReq.onsuccess = () => resolve();
133
+ updateReq.onerror = (evt) => reject(`Update failed. ${evt.target.error}`);
134
+ };
135
+ getReq.onerror = (evt) => {
136
+ reject(`Failed to get existing record. ${evt.target.error}`);
137
+ };
138
+ })
139
+ .catch(err => {
140
+ reject('Database either corrupted or not initialized');
141
+ });
142
+ });
143
+ const update = (storeName, values) => new Promise((resolve, reject) => {
144
+ connect().then((db) => {
145
+ const { store } = createTransaction(storeName, DBMode.readWrite);
146
+ let completed = 0;
147
+ const request = store.put(values);
106
148
  request.onsuccess = (evt) => {
107
149
  resolve();
108
150
  };
151
+ request.onerror = (evt) => {
152
+ reject(`UPDATE Failed. ${evt.target.result}`);
153
+ };
109
154
  })
110
155
  .catch(err => {
111
- reject('Database either corrupted or not initialized');
156
+ reject(`UPDATE Failed. ${err}`);
157
+ // reject('Database either corrupted or not initialized');
112
158
  });
113
159
  });
114
160
  const remove = (storeName, key) => new Promise((resolve, reject) => {
@@ -125,10 +171,12 @@ const useDB = (options) => {
125
171
  });
126
172
  });
127
173
  return {
174
+ getAll,
128
175
  getByID,
129
176
  getStore,
130
177
  insert,
131
178
  update,
179
+ update_one,
132
180
  remove,
133
181
  error
134
182
  };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Custom hook for Facebook Pixel tracking
3
+ * @param pixelId - Facebook Pixel ID (e.g., '123456789012345')
4
+ * @param debug - Optional debug mode (default: false)
5
+ */
6
+ declare const useFacebookPixel: (pixelId?: string, debug?: boolean) => {
7
+ trackPageView: () => void;
8
+ trackEvent: (eventName: string, params?: Record<string, any>) => void;
9
+ trackCustom: (eventName: string, params?: Record<string, any>) => void;
10
+ };
11
+ export default useFacebookPixel;
@@ -0,0 +1,64 @@
1
+ import { useEffect } from "react";
2
+ /**
3
+ * Custom hook for Facebook Pixel tracking
4
+ * @param pixelId - Facebook Pixel ID (e.g., '123456789012345')
5
+ * @param debug - Optional debug mode (default: false)
6
+ */
7
+ const useFacebookPixel = (pixelId, debug = false) => {
8
+ // Initialize Facebook Pixel
9
+ useEffect(() => {
10
+ if (!pixelId)
11
+ return;
12
+ // Load Facebook Pixel script if not already loaded
13
+ if (!window.fbq) {
14
+ const script = document.createElement('script');
15
+ script.async = true;
16
+ script.src = `https://connect.facebook.net/en_US/fbevents.js`;
17
+ document.head.appendChild(script);
18
+ window._fbq = window._fbq || [];
19
+ window.fbq = function () {
20
+ window._fbq.push(arguments);
21
+ };
22
+ window.fbq('init', pixelId);
23
+ if (debug) {
24
+ window.fbq('set', 'debug', true);
25
+ }
26
+ }
27
+ // Track initial page view
28
+ window.fbq('track', 'PageView');
29
+ }, [pixelId, debug]);
30
+ /**
31
+ * Track a page view
32
+ */
33
+ const trackPageView = () => {
34
+ if (!pixelId)
35
+ return;
36
+ window.fbq('track', 'PageView');
37
+ };
38
+ /**
39
+ * Track a custom event
40
+ * @param eventName - Standard or custom event name
41
+ * @param params - Optional event parameters
42
+ */
43
+ const trackEvent = (eventName, params) => {
44
+ if (!pixelId)
45
+ return;
46
+ window.fbq('track', eventName, params);
47
+ };
48
+ /**
49
+ * Track a custom conversion
50
+ * @param eventName - Conversion event name
51
+ * @param params - Optional conversion parameters
52
+ */
53
+ const trackCustom = (eventName, params) => {
54
+ if (!pixelId)
55
+ return;
56
+ window.fbq('trackCustom', eventName, params);
57
+ };
58
+ return {
59
+ trackPageView,
60
+ trackEvent,
61
+ trackCustom,
62
+ };
63
+ };
64
+ export default useFacebookPixel;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Custom hook for Google gtag (Global Site Tag) tracking
3
+ * @param id - Google Analytics tracking ID (e.g., 'G-XXXXXXXXXX')
4
+ */
5
+ declare const useGtag: (id?: string) => {
6
+ trackPageView: (path?: string) => void;
7
+ trackEvent: (eventName: string, params?: Record<string, any>) => void;
8
+ };
9
+ export default useGtag;