@zentauri-ui/zentauri-components 1.1.1 → 1.2.0

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 (274) hide show
  1. package/README.md +62 -21
  2. package/dist/chunk-2VQJ6OIL.js +31 -0
  3. package/dist/chunk-2VQJ6OIL.js.map +1 -0
  4. package/dist/chunk-73VCO5TE.mjs +29 -0
  5. package/dist/chunk-73VCO5TE.mjs.map +1 -0
  6. package/dist/chunk-BSWYZTYK.js +31 -0
  7. package/dist/chunk-BSWYZTYK.js.map +1 -0
  8. package/dist/chunk-CY5BQKRZ.mjs +29 -0
  9. package/dist/chunk-CY5BQKRZ.mjs.map +1 -0
  10. package/dist/chunk-DFEZH7TC.mjs +27 -0
  11. package/dist/chunk-DFEZH7TC.mjs.map +1 -0
  12. package/dist/chunk-FT2LMA66.mjs +25 -0
  13. package/dist/chunk-FT2LMA66.mjs.map +1 -0
  14. package/dist/chunk-JE3PD5ZA.js +107 -0
  15. package/dist/chunk-JE3PD5ZA.js.map +1 -0
  16. package/dist/chunk-JXCTEAXD.js +38 -0
  17. package/dist/chunk-JXCTEAXD.js.map +1 -0
  18. package/dist/chunk-LIJ6BDGP.mjs +36 -0
  19. package/dist/chunk-LIJ6BDGP.mjs.map +1 -0
  20. package/dist/chunk-PMAF6FBF.mjs +37 -0
  21. package/dist/chunk-PMAF6FBF.mjs.map +1 -0
  22. package/dist/chunk-TZ2JVWTZ.mjs +104 -0
  23. package/dist/chunk-TZ2JVWTZ.mjs.map +1 -0
  24. package/dist/chunk-UIYFEP3I.js +39 -0
  25. package/dist/chunk-UIYFEP3I.js.map +1 -0
  26. package/dist/chunk-UOZYPWDZ.js +32 -0
  27. package/dist/chunk-UOZYPWDZ.js.map +1 -0
  28. package/dist/chunk-WL5I7RVS.mjs +54 -0
  29. package/dist/chunk-WL5I7RVS.mjs.map +1 -0
  30. package/dist/chunk-WP7GYBRI.js +27 -0
  31. package/dist/chunk-WP7GYBRI.js.map +1 -0
  32. package/dist/chunk-YPLVTUYL.js +56 -0
  33. package/dist/chunk-YPLVTUYL.js.map +1 -0
  34. package/dist/hooks/useBodyScrollLock.d.mts +14 -0
  35. package/dist/hooks/useBodyScrollLock.d.ts +14 -0
  36. package/dist/hooks/useBodyScrollLock.js +13 -0
  37. package/dist/hooks/useBodyScrollLock.js.map +1 -0
  38. package/dist/hooks/useBodyScrollLock.mjs +4 -0
  39. package/dist/hooks/useBodyScrollLock.mjs.map +1 -0
  40. package/dist/hooks/useClickOutside.d.mts +23 -0
  41. package/dist/hooks/useClickOutside.d.ts +23 -0
  42. package/dist/hooks/useClickOutside.js +13 -0
  43. package/dist/hooks/useClickOutside.js.map +1 -0
  44. package/dist/hooks/useClickOutside.mjs +4 -0
  45. package/dist/hooks/useClickOutside.mjs.map +1 -0
  46. package/dist/hooks/useClipboard.d.mts +22 -0
  47. package/dist/hooks/useClipboard.d.ts +22 -0
  48. package/dist/hooks/useClipboard.js +51 -0
  49. package/dist/hooks/useClipboard.js.map +1 -0
  50. package/dist/hooks/useClipboard.mjs +49 -0
  51. package/dist/hooks/useClipboard.mjs.map +1 -0
  52. package/dist/hooks/useControllableState.d.mts +22 -0
  53. package/dist/hooks/useControllableState.d.ts +22 -0
  54. package/dist/hooks/useControllableState.js +13 -0
  55. package/dist/hooks/useControllableState.js.map +1 -0
  56. package/dist/hooks/useControllableState.mjs +4 -0
  57. package/dist/hooks/useControllableState.mjs.map +1 -0
  58. package/dist/hooks/useDebouncedValue.d.mts +14 -0
  59. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  60. package/dist/hooks/useDebouncedValue.js +22 -0
  61. package/dist/hooks/useDebouncedValue.js.map +1 -0
  62. package/dist/hooks/useDebouncedValue.mjs +20 -0
  63. package/dist/hooks/useDebouncedValue.mjs.map +1 -0
  64. package/dist/hooks/useDisclosure.d.mts +25 -0
  65. package/dist/hooks/useDisclosure.d.ts +25 -0
  66. package/dist/hooks/useDisclosure.js +37 -0
  67. package/dist/hooks/useDisclosure.js.map +1 -0
  68. package/dist/hooks/useDisclosure.mjs +35 -0
  69. package/dist/hooks/useDisclosure.mjs.map +1 -0
  70. package/dist/hooks/useDocumentTitle.d.mts +19 -0
  71. package/dist/hooks/useDocumentTitle.d.ts +19 -0
  72. package/dist/hooks/useDocumentTitle.js +40 -0
  73. package/dist/hooks/useDocumentTitle.js.map +1 -0
  74. package/dist/hooks/useDocumentTitle.mjs +38 -0
  75. package/dist/hooks/useDocumentTitle.mjs.map +1 -0
  76. package/dist/hooks/useFocusManagement.d.mts +24 -0
  77. package/dist/hooks/useFocusManagement.d.ts +24 -0
  78. package/dist/hooks/useFocusManagement.js +14 -0
  79. package/dist/hooks/useFocusManagement.js.map +1 -0
  80. package/dist/hooks/useFocusManagement.mjs +5 -0
  81. package/dist/hooks/useFocusManagement.mjs.map +1 -0
  82. package/dist/hooks/useHover.d.mts +15 -0
  83. package/dist/hooks/useHover.d.ts +15 -0
  84. package/dist/hooks/useHover.js +37 -0
  85. package/dist/hooks/useHover.js.map +1 -0
  86. package/dist/hooks/useHover.mjs +35 -0
  87. package/dist/hooks/useHover.mjs.map +1 -0
  88. package/dist/hooks/useInView.d.mts +19 -0
  89. package/dist/hooks/useInView.d.ts +19 -0
  90. package/dist/hooks/useInView.js +15 -0
  91. package/dist/hooks/useInView.js.map +1 -0
  92. package/dist/hooks/useInView.mjs +13 -0
  93. package/dist/hooks/useInView.mjs.map +1 -0
  94. package/dist/hooks/useIntersectionObserver.d.mts +19 -0
  95. package/dist/hooks/useIntersectionObserver.d.ts +19 -0
  96. package/dist/hooks/useIntersectionObserver.js +13 -0
  97. package/dist/hooks/useIntersectionObserver.js.map +1 -0
  98. package/dist/hooks/useIntersectionObserver.mjs +4 -0
  99. package/dist/hooks/useIntersectionObserver.mjs.map +1 -0
  100. package/dist/hooks/useIsMounted.d.mts +11 -0
  101. package/dist/hooks/useIsMounted.d.ts +11 -0
  102. package/dist/hooks/useIsMounted.js +20 -0
  103. package/dist/hooks/useIsMounted.js.map +1 -0
  104. package/dist/hooks/useIsMounted.mjs +18 -0
  105. package/dist/hooks/useIsMounted.mjs.map +1 -0
  106. package/dist/hooks/useIsomorphicLayoutEffect.d.mts +11 -0
  107. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +11 -0
  108. package/dist/hooks/useIsomorphicLayoutEffect.js +11 -0
  109. package/dist/hooks/useIsomorphicLayoutEffect.js.map +1 -0
  110. package/dist/hooks/useIsomorphicLayoutEffect.mjs +9 -0
  111. package/dist/hooks/useIsomorphicLayoutEffect.mjs.map +1 -0
  112. package/dist/hooks/useLocalStorage.d.mts +22 -0
  113. package/dist/hooks/useLocalStorage.d.ts +22 -0
  114. package/dist/hooks/useLocalStorage.js +84 -0
  115. package/dist/hooks/useLocalStorage.js.map +1 -0
  116. package/dist/hooks/useLocalStorage.mjs +82 -0
  117. package/dist/hooks/useLocalStorage.mjs.map +1 -0
  118. package/dist/hooks/useMediaQuery.d.mts +13 -0
  119. package/dist/hooks/useMediaQuery.d.ts +13 -0
  120. package/dist/hooks/useMediaQuery.js +13 -0
  121. package/dist/hooks/useMediaQuery.js.map +1 -0
  122. package/dist/hooks/useMediaQuery.mjs +4 -0
  123. package/dist/hooks/useMediaQuery.mjs.map +1 -0
  124. package/dist/hooks/useNetworkStatus.d.mts +10 -0
  125. package/dist/hooks/useNetworkStatus.d.ts +10 -0
  126. package/dist/hooks/useNetworkStatus.js +30 -0
  127. package/dist/hooks/useNetworkStatus.js.map +1 -0
  128. package/dist/hooks/useNetworkStatus.mjs +28 -0
  129. package/dist/hooks/useNetworkStatus.mjs.map +1 -0
  130. package/dist/hooks/usePageVisibility.d.mts +10 -0
  131. package/dist/hooks/usePageVisibility.d.ts +10 -0
  132. package/dist/hooks/usePageVisibility.js +28 -0
  133. package/dist/hooks/usePageVisibility.js.map +1 -0
  134. package/dist/hooks/usePageVisibility.mjs +26 -0
  135. package/dist/hooks/usePageVisibility.mjs.map +1 -0
  136. package/dist/hooks/usePagination.d.mts +5 -0
  137. package/dist/hooks/usePagination.d.ts +5 -0
  138. package/dist/hooks/usePagination.js +18 -0
  139. package/dist/hooks/usePagination.js.map +1 -0
  140. package/dist/hooks/usePagination.mjs +5 -0
  141. package/dist/hooks/usePagination.mjs.map +1 -0
  142. package/dist/hooks/usePrefersColorScheme.d.mts +10 -0
  143. package/dist/hooks/usePrefersColorScheme.d.ts +10 -0
  144. package/dist/hooks/usePrefersColorScheme.js +17 -0
  145. package/dist/hooks/usePrefersColorScheme.js.map +1 -0
  146. package/dist/hooks/usePrefersColorScheme.mjs +15 -0
  147. package/dist/hooks/usePrefersColorScheme.mjs.map +1 -0
  148. package/dist/hooks/usePrefersReducedMotion.d.mts +10 -0
  149. package/dist/hooks/usePrefersReducedMotion.d.ts +10 -0
  150. package/dist/hooks/usePrefersReducedMotion.js +13 -0
  151. package/dist/hooks/usePrefersReducedMotion.js.map +1 -0
  152. package/dist/hooks/usePrefersReducedMotion.mjs +11 -0
  153. package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -0
  154. package/dist/hooks/useResizeObserver.d.mts +23 -0
  155. package/dist/hooks/useResizeObserver.d.ts +23 -0
  156. package/dist/hooks/useResizeObserver.js +38 -0
  157. package/dist/hooks/useResizeObserver.js.map +1 -0
  158. package/dist/hooks/useResizeObserver.mjs +36 -0
  159. package/dist/hooks/useResizeObserver.mjs.map +1 -0
  160. package/dist/hooks/useSessionStorage.d.mts +22 -0
  161. package/dist/hooks/useSessionStorage.d.ts +22 -0
  162. package/dist/hooks/useSessionStorage.js +58 -0
  163. package/dist/hooks/useSessionStorage.js.map +1 -0
  164. package/dist/hooks/useSessionStorage.mjs +56 -0
  165. package/dist/hooks/useSessionStorage.mjs.map +1 -0
  166. package/dist/hooks/useThrottledCallback.d.mts +14 -0
  167. package/dist/hooks/useThrottledCallback.d.ts +14 -0
  168. package/dist/hooks/useThrottledCallback.js +27 -0
  169. package/dist/hooks/useThrottledCallback.js.map +1 -0
  170. package/dist/hooks/useThrottledCallback.mjs +25 -0
  171. package/dist/hooks/useThrottledCallback.mjs.map +1 -0
  172. package/dist/hooks/useToggle.d.mts +9 -0
  173. package/dist/hooks/useToggle.d.ts +9 -0
  174. package/dist/hooks/useToggle.js +20 -0
  175. package/dist/hooks/useToggle.js.map +1 -0
  176. package/dist/hooks/useToggle.mjs +18 -0
  177. package/dist/hooks/useToggle.mjs.map +1 -0
  178. package/dist/hooks/useWindowSize.d.mts +14 -0
  179. package/dist/hooks/useWindowSize.d.ts +14 -0
  180. package/dist/hooks/useWindowSize.js +30 -0
  181. package/dist/hooks/useWindowSize.js.map +1 -0
  182. package/dist/hooks/useWindowSize.mjs +28 -0
  183. package/dist/hooks/useWindowSize.mjs.map +1 -0
  184. package/dist/hooks/utils.d.mts +8 -0
  185. package/dist/hooks/utils.d.ts +8 -0
  186. package/dist/hooks/utils.js +24 -0
  187. package/dist/hooks/utils.js.map +1 -0
  188. package/dist/hooks/utils.mjs +3 -0
  189. package/dist/hooks/utils.mjs.map +1 -0
  190. package/dist/index-ClPu5gDp.d.ts +86 -0
  191. package/dist/index-D4p9fn1o.d.mts +86 -0
  192. package/dist/ui/accordion.js +5 -5
  193. package/dist/ui/accordion.mjs +1 -1
  194. package/dist/ui/alert.js +7 -7
  195. package/dist/ui/alert.mjs +1 -1
  196. package/dist/ui/avatar.js +6 -6
  197. package/dist/ui/avatar.js.map +1 -1
  198. package/dist/ui/avatar.mjs +1 -1
  199. package/dist/ui/avatar.mjs.map +1 -1
  200. package/dist/ui/badge.js +2 -2
  201. package/dist/ui/badge.mjs +1 -1
  202. package/dist/ui/breadcrumb.js +7 -7
  203. package/dist/ui/breadcrumb.mjs +1 -1
  204. package/dist/ui/buttons.js +3 -3
  205. package/dist/ui/buttons.mjs +1 -1
  206. package/dist/ui/card.js +7 -7
  207. package/dist/ui/card.js.map +1 -1
  208. package/dist/ui/card.mjs +1 -1
  209. package/dist/ui/card.mjs.map +1 -1
  210. package/dist/ui/divider.js +6 -6
  211. package/dist/ui/divider.mjs +1 -1
  212. package/dist/ui/drawer.js +15 -60
  213. package/dist/ui/drawer.js.map +1 -1
  214. package/dist/ui/drawer.mjs +9 -54
  215. package/dist/ui/drawer.mjs.map +1 -1
  216. package/dist/ui/dropdown.js +6 -13
  217. package/dist/ui/dropdown.js.map +1 -1
  218. package/dist/ui/dropdown.mjs +4 -11
  219. package/dist/ui/dropdown.mjs.map +1 -1
  220. package/dist/ui/empty-state.js +6 -6
  221. package/dist/ui/empty-state.js.map +1 -1
  222. package/dist/ui/empty-state.mjs +1 -1
  223. package/dist/ui/empty-state.mjs.map +1 -1
  224. package/dist/ui/file-upload.js +3 -3
  225. package/dist/ui/file-upload.mjs +1 -1
  226. package/dist/ui/inputs.js +3 -3
  227. package/dist/ui/inputs.mjs +1 -1
  228. package/dist/ui/modal.js +16 -61
  229. package/dist/ui/modal.js.map +1 -1
  230. package/dist/ui/modal.mjs +9 -54
  231. package/dist/ui/modal.mjs.map +1 -1
  232. package/dist/ui/pagination.d.mts +3 -81
  233. package/dist/ui/pagination.d.ts +3 -81
  234. package/dist/ui/pagination.js +13 -122
  235. package/dist/ui/pagination.js.map +1 -1
  236. package/dist/ui/pagination.mjs +5 -114
  237. package/dist/ui/pagination.mjs.map +1 -1
  238. package/dist/ui/progress.js +7 -10
  239. package/dist/ui/progress.js.map +1 -1
  240. package/dist/ui/progress.mjs +1 -4
  241. package/dist/ui/progress.mjs.map +1 -1
  242. package/dist/ui/select.js +6 -6
  243. package/dist/ui/select.mjs +1 -1
  244. package/dist/ui/skeleton.js +7 -7
  245. package/dist/ui/skeleton.mjs +1 -1
  246. package/dist/ui/slider.js +9 -9
  247. package/dist/ui/slider.js.map +1 -1
  248. package/dist/ui/slider.mjs +1 -1
  249. package/dist/ui/slider.mjs.map +1 -1
  250. package/dist/ui/spinner.js +24 -10
  251. package/dist/ui/spinner.js.map +1 -1
  252. package/dist/ui/spinner.mjs +17 -3
  253. package/dist/ui/spinner.mjs.map +1 -1
  254. package/dist/ui/stepper.js +6 -6
  255. package/dist/ui/stepper.mjs +1 -1
  256. package/dist/ui/table.js +9 -9
  257. package/dist/ui/table.js.map +1 -1
  258. package/dist/ui/table.mjs +1 -1
  259. package/dist/ui/table.mjs.map +1 -1
  260. package/dist/ui/tabs.js +5 -5
  261. package/dist/ui/tabs.mjs +1 -1
  262. package/dist/ui/toast.js +7 -7
  263. package/dist/ui/toast.js.map +1 -1
  264. package/dist/ui/toast.mjs +1 -1
  265. package/dist/ui/toast.mjs.map +1 -1
  266. package/dist/ui/toggle.js +3 -3
  267. package/dist/ui/toggle.mjs +1 -1
  268. package/dist/ui/tooltip.js +2 -2
  269. package/dist/ui/tooltip.mjs +1 -1
  270. package/package.json +7 -2
  271. package/dist/chunk-B23TPTVG.mjs +0 -11
  272. package/dist/chunk-B23TPTVG.mjs.map +0 -1
  273. package/dist/chunk-WZ2GOU2J.js +0 -13
  274. package/dist/chunk-WZ2GOU2J.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { useState, useRef, useCallback } from 'react';
3
+
4
+ // src/hooks/useClipboard/useClipboard.ts
5
+ function useClipboard(resetDelay = 2e3) {
6
+ const [copied, setCopied] = useState(false);
7
+ const [error, setError] = useState(void 0);
8
+ const timeoutRef = useRef(
9
+ void 0
10
+ );
11
+ const reset = useCallback(() => {
12
+ if (timeoutRef.current) {
13
+ clearTimeout(timeoutRef.current);
14
+ timeoutRef.current = void 0;
15
+ }
16
+ setCopied(false);
17
+ setError(void 0);
18
+ }, []);
19
+ const copy = useCallback(
20
+ async (text) => {
21
+ reset();
22
+ if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) {
23
+ const err = new Error("Clipboard API is not available");
24
+ setError(err);
25
+ return false;
26
+ }
27
+ try {
28
+ await navigator.clipboard.writeText(text);
29
+ setCopied(true);
30
+ if (resetDelay > 0) {
31
+ timeoutRef.current = setTimeout(() => {
32
+ setCopied(false);
33
+ }, resetDelay);
34
+ }
35
+ return true;
36
+ } catch (cause) {
37
+ const err = cause instanceof Error ? cause : new Error(String(cause));
38
+ setError(err);
39
+ return false;
40
+ }
41
+ },
42
+ [reset, resetDelay]
43
+ );
44
+ return { copied, error, copy, reset };
45
+ }
46
+
47
+ export { useClipboard };
48
+ //# sourceMappingURL=useClipboard.mjs.map
49
+ //# sourceMappingURL=useClipboard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useClipboard/useClipboard.ts"],"names":[],"mappings":";;;AAwBO,SAAS,YAAA,CAAa,aAAa,GAAA,EAA0B;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAA4B,MAAS,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,MAAA;AAAA,IACjB;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAA,GAAU,MAAA;AAAA,IACvB;AACA,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,QAAA,CAAS,MAAS,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,OAAO,IAAA,KAAiB;AACtB,MAAA,KAAA,EAAM;AACN,MAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,SAAA,CAAU,WAAW,SAAA,EAAW;AACvE,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,gCAAgC,CAAA;AACtD,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AACpC,YAAA,SAAA,CAAU,KAAK,CAAA;AAAA,UACjB,GAAG,UAAU,CAAA;AAAA,QACf;AACA,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GACJ,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC1D,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO,UAAU;AAAA,GACpB;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AACtC","file":"useClipboard.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type UseClipboardResult = {\n /** `true` after a successful `copy` until the reset delay elapses or `reset` is called. */\n copied: boolean;\n /** Set when the Clipboard API is missing or `writeText` rejects (e.g. permission denied). */\n error: Error | undefined;\n /** Writes `text` via `navigator.clipboard.writeText`; returns whether the write succeeded. */\n copy: (text: string) => Promise<boolean>;\n /** Clears `copied`/`error` and cancels any pending auto-reset timeout. */\n reset: () => void;\n};\n\n/**\n * Wraps the async Clipboard API with React state for UX feedback (“Copied!”) and error surfacing.\n *\n * After a successful copy, `copied` flips to `true` for `resetDelay` ms (or stays true if `resetDelay` is 0).\n * SSR-safe: `copy` resolves `false` with an error when `navigator.clipboard` is unavailable.\n *\n * @param resetDelay - Milliseconds before `copied` auto-clears after success; `0` disables auto-clear.\n * @returns `{ copied, error, copy, reset }` for rendering and handlers.\n */\nexport function useClipboard(resetDelay = 2000): UseClipboardResult {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n\n const reset = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n setCopied(false);\n setError(undefined);\n }, []);\n\n const copy = useCallback(\n async (text: string) => {\n reset();\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n const err = new Error(\"Clipboard API is not available\");\n setError(err);\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n if (resetDelay > 0) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, resetDelay);\n }\n return true;\n } catch (cause) {\n const err =\n cause instanceof Error ? cause : new Error(String(cause));\n setError(err);\n return false;\n }\n },\n [reset, resetDelay],\n );\n\n return { copied, error, copy, reset };\n}\n"]}
@@ -0,0 +1,22 @@
1
+ type UseControllableStateParams<T> = {
2
+ /** When defined, the hook is controlled and this value is returned as state. */
3
+ value?: T;
4
+ /** Initial / fallback value when uncontrolled (`value` is `undefined`). */
5
+ defaultValue: T;
6
+ /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */
7
+ onChange?: (next: T) => void;
8
+ };
9
+ /**
10
+ * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.
11
+ *
12
+ * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.
13
+ * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.
14
+ * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).
15
+ *
16
+ * @typeParam T - State value type.
17
+ * @param params - `value`, `defaultValue`, and optional `onChange`.
18
+ * @returns `[value, setValue]` compatible with `useState`-style usage.
19
+ */
20
+ declare function useControllableState<T>({ value: valueProp, defaultValue, onChange, }: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void];
21
+
22
+ export { type UseControllableStateParams, useControllableState };
@@ -0,0 +1,22 @@
1
+ type UseControllableStateParams<T> = {
2
+ /** When defined, the hook is controlled and this value is returned as state. */
3
+ value?: T;
4
+ /** Initial / fallback value when uncontrolled (`value` is `undefined`). */
5
+ defaultValue: T;
6
+ /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */
7
+ onChange?: (next: T) => void;
8
+ };
9
+ /**
10
+ * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.
11
+ *
12
+ * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.
13
+ * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.
14
+ * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).
15
+ *
16
+ * @typeParam T - State value type.
17
+ * @param params - `value`, `defaultValue`, and optional `onChange`.
18
+ * @returns `[value, setValue]` compatible with `useState`-style usage.
19
+ */
20
+ declare function useControllableState<T>({ value: valueProp, defaultValue, onChange, }: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void];
21
+
22
+ export { type UseControllableStateParams, useControllableState };
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk2VQJ6OIL_js = require('../chunk-2VQJ6OIL.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "useControllableState", {
9
+ enumerable: true,
10
+ get: function () { return chunk2VQJ6OIL_js.useControllableState; }
11
+ });
12
+ //# sourceMappingURL=useControllableState.js.map
13
+ //# sourceMappingURL=useControllableState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"useControllableState.js"}
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ export { useControllableState } from '../chunk-73VCO5TE.mjs';
3
+ //# sourceMappingURL=useControllableState.mjs.map
4
+ //# sourceMappingURL=useControllableState.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"useControllableState.mjs"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Returns a lagged copy of `value` that only updates after `value` has been stable for `delayMs`.
3
+ * Each change to `value` or `delayMs` resets the timer; rapid updates collapse into one committed update.
4
+ *
5
+ * Common uses: search inputs, resize-driven layout, or any expensive work that should not run on every keystroke.
6
+ *
7
+ * @typeParam T - Value type (any JSON-serializable or referential type).
8
+ * @param value - Live value from props or state.
9
+ * @param delayMs - Debounce interval in milliseconds.
10
+ * @returns The last value that survived the full delay without a newer `value` arriving.
11
+ */
12
+ declare function useDebouncedValue<T>(value: T, delayMs: number): T;
13
+
14
+ export { useDebouncedValue };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Returns a lagged copy of `value` that only updates after `value` has been stable for `delayMs`.
3
+ * Each change to `value` or `delayMs` resets the timer; rapid updates collapse into one committed update.
4
+ *
5
+ * Common uses: search inputs, resize-driven layout, or any expensive work that should not run on every keystroke.
6
+ *
7
+ * @typeParam T - Value type (any JSON-serializable or referential type).
8
+ * @param value - Live value from props or state.
9
+ * @param delayMs - Debounce interval in milliseconds.
10
+ * @returns The last value that survived the full delay without a newer `value` arriving.
11
+ */
12
+ declare function useDebouncedValue<T>(value: T, delayMs: number): T;
13
+
14
+ export { useDebouncedValue };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+
6
+ // src/hooks/useDebouncedValue/useDebouncedValue.ts
7
+ function useDebouncedValue(value, delayMs) {
8
+ const [debounced, setDebounced] = react.useState(value);
9
+ react.useEffect(() => {
10
+ const id = setTimeout(() => {
11
+ setDebounced(value);
12
+ }, delayMs);
13
+ return () => {
14
+ clearTimeout(id);
15
+ };
16
+ }, [delayMs, value]);
17
+ return debounced;
18
+ }
19
+
20
+ exports.useDebouncedValue = useDebouncedValue;
21
+ //# sourceMappingURL=useDebouncedValue.js.map
22
+ //# sourceMappingURL=useDebouncedValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDebouncedValue/useDebouncedValue.ts"],"names":["useState","useEffect"],"mappings":";;;;;AAeO,SAAS,iBAAA,CAAqB,OAAU,OAAA,EAAoB;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,WAAW,MAAM;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,GAAG,OAAO,CAAA;AACV,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO,SAAA;AACT","file":"useDebouncedValue.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * Returns a lagged copy of `value` that only updates after `value` has been stable for `delayMs`.\n * Each change to `value` or `delayMs` resets the timer; rapid updates collapse into one committed update.\n *\n * Common uses: search inputs, resize-driven layout, or any expensive work that should not run on every keystroke.\n *\n * @typeParam T - Value type (any JSON-serializable or referential type).\n * @param value - Live value from props or state.\n * @param delayMs - Debounce interval in milliseconds.\n * @returns The last value that survived the full delay without a newer `value` arriving.\n */\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setDebounced(value);\n }, delayMs);\n return () => {\n clearTimeout(id);\n };\n }, [delayMs, value]);\n\n return debounced;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useState, useEffect } from 'react';
3
+
4
+ // src/hooks/useDebouncedValue/useDebouncedValue.ts
5
+ function useDebouncedValue(value, delayMs) {
6
+ const [debounced, setDebounced] = useState(value);
7
+ useEffect(() => {
8
+ const id = setTimeout(() => {
9
+ setDebounced(value);
10
+ }, delayMs);
11
+ return () => {
12
+ clearTimeout(id);
13
+ };
14
+ }, [delayMs, value]);
15
+ return debounced;
16
+ }
17
+
18
+ export { useDebouncedValue };
19
+ //# sourceMappingURL=useDebouncedValue.mjs.map
20
+ //# sourceMappingURL=useDebouncedValue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDebouncedValue/useDebouncedValue.ts"],"names":[],"mappings":";;;AAeO,SAAS,iBAAA,CAAqB,OAAU,OAAA,EAAoB;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,WAAW,MAAM;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,GAAG,OAAO,CAAA;AACV,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO,SAAA;AACT","file":"useDebouncedValue.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * Returns a lagged copy of `value` that only updates after `value` has been stable for `delayMs`.\n * Each change to `value` or `delayMs` resets the timer; rapid updates collapse into one committed update.\n *\n * Common uses: search inputs, resize-driven layout, or any expensive work that should not run on every keystroke.\n *\n * @typeParam T - Value type (any JSON-serializable or referential type).\n * @param value - Live value from props or state.\n * @param delayMs - Debounce interval in milliseconds.\n * @returns The last value that survived the full delay without a newer `value` arriving.\n */\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setDebounced(value);\n }, delayMs);\n return () => {\n clearTimeout(id);\n };\n }, [delayMs, value]);\n\n return debounced;\n}\n"]}
@@ -0,0 +1,25 @@
1
+ type UseDisclosureParams = {
2
+ /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */
3
+ open?: boolean;
4
+ /** Initial open state when uncontrolled. */
5
+ defaultOpen?: boolean;
6
+ /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */
7
+ onOpenChange?: (open: boolean) => void;
8
+ };
9
+ type UseDisclosureResult = {
10
+ isOpen: boolean;
11
+ open: () => void;
12
+ close: () => void;
13
+ toggle: () => void;
14
+ setOpen: (open: boolean) => void;
15
+ };
16
+ /**
17
+ * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.
18
+ * Built on {@link useControllableState}; semantics match common headless UI libraries.
19
+ *
20
+ * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.
21
+ * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.
22
+ */
23
+ declare function useDisclosure({ open: openProp, defaultOpen, onOpenChange, }?: UseDisclosureParams): UseDisclosureResult;
24
+
25
+ export { type UseDisclosureParams, type UseDisclosureResult, useDisclosure };
@@ -0,0 +1,25 @@
1
+ type UseDisclosureParams = {
2
+ /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */
3
+ open?: boolean;
4
+ /** Initial open state when uncontrolled. */
5
+ defaultOpen?: boolean;
6
+ /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */
7
+ onOpenChange?: (open: boolean) => void;
8
+ };
9
+ type UseDisclosureResult = {
10
+ isOpen: boolean;
11
+ open: () => void;
12
+ close: () => void;
13
+ toggle: () => void;
14
+ setOpen: (open: boolean) => void;
15
+ };
16
+ /**
17
+ * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.
18
+ * Built on {@link useControllableState}; semantics match common headless UI libraries.
19
+ *
20
+ * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.
21
+ * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.
22
+ */
23
+ declare function useDisclosure({ open: openProp, defaultOpen, onOpenChange, }?: UseDisclosureParams): UseDisclosureResult;
24
+
25
+ export { type UseDisclosureParams, type UseDisclosureResult, useDisclosure };
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk2VQJ6OIL_js = require('../chunk-2VQJ6OIL.js');
5
+ var react = require('react');
6
+
7
+ function useDisclosure({
8
+ open: openProp,
9
+ defaultOpen = false,
10
+ onOpenChange
11
+ } = {}) {
12
+ const [isOpen, setOpenState] = chunk2VQJ6OIL_js.useControllableState({
13
+ value: openProp,
14
+ defaultValue: defaultOpen,
15
+ onChange: onOpenChange
16
+ });
17
+ const setOpen = react.useCallback(
18
+ (open2) => {
19
+ setOpenState(open2);
20
+ },
21
+ [setOpenState]
22
+ );
23
+ const open = react.useCallback(() => {
24
+ setOpenState(true);
25
+ }, [setOpenState]);
26
+ const close = react.useCallback(() => {
27
+ setOpenState(false);
28
+ }, [setOpenState]);
29
+ const toggle = react.useCallback(() => {
30
+ setOpenState(!isOpen);
31
+ }, [isOpen, setOpenState]);
32
+ return { isOpen, open, close, toggle, setOpen };
33
+ }
34
+
35
+ exports.useDisclosure = useDisclosure;
36
+ //# sourceMappingURL=useDisclosure.js.map
37
+ //# sourceMappingURL=useDisclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["useControllableState","useCallback","open"],"mappings":";;;;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAIA,qCAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAUC,iBAAA;AAAA,IACd,CAACC,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAOD,kBAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.js","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { useControllableState } from '../chunk-73VCO5TE.mjs';
3
+ import { useCallback } from 'react';
4
+
5
+ function useDisclosure({
6
+ open: openProp,
7
+ defaultOpen = false,
8
+ onOpenChange
9
+ } = {}) {
10
+ const [isOpen, setOpenState] = useControllableState({
11
+ value: openProp,
12
+ defaultValue: defaultOpen,
13
+ onChange: onOpenChange
14
+ });
15
+ const setOpen = useCallback(
16
+ (open2) => {
17
+ setOpenState(open2);
18
+ },
19
+ [setOpenState]
20
+ );
21
+ const open = useCallback(() => {
22
+ setOpenState(true);
23
+ }, [setOpenState]);
24
+ const close = useCallback(() => {
25
+ setOpenState(false);
26
+ }, [setOpenState]);
27
+ const toggle = useCallback(() => {
28
+ setOpenState(!isOpen);
29
+ }, [isOpen, setOpenState]);
30
+ return { isOpen, open, close, toggle, setOpen };
31
+ }
32
+
33
+ export { useDisclosure };
34
+ //# sourceMappingURL=useDisclosure.mjs.map
35
+ //# sourceMappingURL=useDisclosure.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["open"],"mappings":";;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAACA,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
@@ -0,0 +1,19 @@
1
+ type UseDocumentTitleParams = {
2
+ title: string;
3
+ /** When true (default), restores the document title from before this hook mounted when the component unmounts */
4
+ restoreOnUnmount?: boolean;
5
+ };
6
+ /**
7
+ * Keeps `document.title` in sync with `title` for the lifetime of the component.
8
+ *
9
+ * On first mount in the browser, the current title is captured. When `title` changes, the document title updates.
10
+ * If `restoreOnUnmount` is true when the component unmounts, the captured title is restored so nested routes or
11
+ * modals do not leak titles. Changing `restoreOnUnmount` while mounted does not run restore; only unmount does.
12
+ *
13
+ * @param params.title - Desired `document.title` string.
14
+ * @param params.restoreOnUnmount - Whether to restore the pre-mount title on unmount (default `true`). The value
15
+ * read at unmount time determines behavior, not mid-mount prop changes.
16
+ */
17
+ declare function useDocumentTitle({ title, restoreOnUnmount, }: UseDocumentTitleParams): void;
18
+
19
+ export { type UseDocumentTitleParams, useDocumentTitle };
@@ -0,0 +1,19 @@
1
+ type UseDocumentTitleParams = {
2
+ title: string;
3
+ /** When true (default), restores the document title from before this hook mounted when the component unmounts */
4
+ restoreOnUnmount?: boolean;
5
+ };
6
+ /**
7
+ * Keeps `document.title` in sync with `title` for the lifetime of the component.
8
+ *
9
+ * On first mount in the browser, the current title is captured. When `title` changes, the document title updates.
10
+ * If `restoreOnUnmount` is true when the component unmounts, the captured title is restored so nested routes or
11
+ * modals do not leak titles. Changing `restoreOnUnmount` while mounted does not run restore; only unmount does.
12
+ *
13
+ * @param params.title - Desired `document.title` string.
14
+ * @param params.restoreOnUnmount - Whether to restore the pre-mount title on unmount (default `true`). The value
15
+ * read at unmount time determines behavior, not mid-mount prop changes.
16
+ */
17
+ declare function useDocumentTitle({ title, restoreOnUnmount, }: UseDocumentTitleParams): void;
18
+
19
+ export { type UseDocumentTitleParams, useDocumentTitle };
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+
6
+ // src/hooks/useDocumentTitle/useDocumentTitle.ts
7
+ function useDocumentTitle({
8
+ title,
9
+ restoreOnUnmount = true
10
+ }) {
11
+ const originalTitle = react.useRef(void 0);
12
+ const restoreOnUnmountRef = react.useRef(restoreOnUnmount);
13
+ restoreOnUnmountRef.current = restoreOnUnmount;
14
+ react.useEffect(() => {
15
+ if (typeof document === "undefined") {
16
+ return;
17
+ }
18
+ if (originalTitle.current === void 0) {
19
+ originalTitle.current = document.title;
20
+ }
21
+ }, []);
22
+ react.useEffect(() => {
23
+ if (typeof document === "undefined") {
24
+ return;
25
+ }
26
+ document.title = title;
27
+ }, [title]);
28
+ react.useEffect(() => {
29
+ return () => {
30
+ if (!restoreOnUnmountRef.current || typeof document === "undefined" || originalTitle.current === void 0) {
31
+ return;
32
+ }
33
+ document.title = originalTitle.current;
34
+ };
35
+ }, []);
36
+ }
37
+
38
+ exports.useDocumentTitle = useDocumentTitle;
39
+ //# sourceMappingURL=useDocumentTitle.js.map
40
+ //# sourceMappingURL=useDocumentTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDocumentTitle/useDocumentTitle.ts"],"names":["useRef","useEffect"],"mappings":";;;;;AAqBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAAiC;AAC/B,EAAA,MAAM,aAAA,GAAgBA,aAA2B,MAAS,CAAA;AAC1D,EAAA,MAAM,mBAAA,GAAsBA,aAAO,gBAAgB,CAAA;AACnD,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAA,CAAc,YAAY,MAAA,EAAW;AACvC,MAAA,aAAA,CAAc,UAAU,QAAA,CAAS,KAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IACE,CAAC,oBAAoB,OAAA,IACrB,OAAO,aAAa,WAAA,IACpB,aAAA,CAAc,YAAY,MAAA,EAC1B;AACA,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,QAAQ,aAAA,CAAc,OAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACP","file":"useDocumentTitle.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport type UseDocumentTitleParams = {\n title: string;\n /** When true (default), restores the document title from before this hook mounted when the component unmounts */\n restoreOnUnmount?: boolean;\n};\n\n/**\n * Keeps `document.title` in sync with `title` for the lifetime of the component.\n *\n * On first mount in the browser, the current title is captured. When `title` changes, the document title updates.\n * If `restoreOnUnmount` is true when the component unmounts, the captured title is restored so nested routes or\n * modals do not leak titles. Changing `restoreOnUnmount` while mounted does not run restore; only unmount does.\n *\n * @param params.title - Desired `document.title` string.\n * @param params.restoreOnUnmount - Whether to restore the pre-mount title on unmount (default `true`). The value\n * read at unmount time determines behavior, not mid-mount prop changes.\n */\nexport function useDocumentTitle({\n title,\n restoreOnUnmount = true,\n}: UseDocumentTitleParams): void {\n const originalTitle = useRef<string | undefined>(undefined);\n const restoreOnUnmountRef = useRef(restoreOnUnmount);\n restoreOnUnmountRef.current = restoreOnUnmount;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n if (originalTitle.current === undefined) {\n originalTitle.current = document.title;\n }\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n document.title = title;\n }, [title]);\n\n useEffect(() => {\n return () => {\n if (\n !restoreOnUnmountRef.current ||\n typeof document === \"undefined\" ||\n originalTitle.current === undefined\n ) {\n return;\n }\n document.title = originalTitle.current;\n };\n }, []);\n}\n"]}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { useRef, useEffect } from 'react';
3
+
4
+ // src/hooks/useDocumentTitle/useDocumentTitle.ts
5
+ function useDocumentTitle({
6
+ title,
7
+ restoreOnUnmount = true
8
+ }) {
9
+ const originalTitle = useRef(void 0);
10
+ const restoreOnUnmountRef = useRef(restoreOnUnmount);
11
+ restoreOnUnmountRef.current = restoreOnUnmount;
12
+ useEffect(() => {
13
+ if (typeof document === "undefined") {
14
+ return;
15
+ }
16
+ if (originalTitle.current === void 0) {
17
+ originalTitle.current = document.title;
18
+ }
19
+ }, []);
20
+ useEffect(() => {
21
+ if (typeof document === "undefined") {
22
+ return;
23
+ }
24
+ document.title = title;
25
+ }, [title]);
26
+ useEffect(() => {
27
+ return () => {
28
+ if (!restoreOnUnmountRef.current || typeof document === "undefined" || originalTitle.current === void 0) {
29
+ return;
30
+ }
31
+ document.title = originalTitle.current;
32
+ };
33
+ }, []);
34
+ }
35
+
36
+ export { useDocumentTitle };
37
+ //# sourceMappingURL=useDocumentTitle.mjs.map
38
+ //# sourceMappingURL=useDocumentTitle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDocumentTitle/useDocumentTitle.ts"],"names":[],"mappings":";;;AAqBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAAiC;AAC/B,EAAA,MAAM,aAAA,GAAgB,OAA2B,MAAS,CAAA;AAC1D,EAAA,MAAM,mBAAA,GAAsB,OAAO,gBAAgB,CAAA;AACnD,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAA,CAAc,YAAY,MAAA,EAAW;AACvC,MAAA,aAAA,CAAc,UAAU,QAAA,CAAS,KAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IACE,CAAC,oBAAoB,OAAA,IACrB,OAAO,aAAa,WAAA,IACpB,aAAA,CAAc,YAAY,MAAA,EAC1B;AACA,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,QAAQ,aAAA,CAAc,OAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACP","file":"useDocumentTitle.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport type UseDocumentTitleParams = {\n title: string;\n /** When true (default), restores the document title from before this hook mounted when the component unmounts */\n restoreOnUnmount?: boolean;\n};\n\n/**\n * Keeps `document.title` in sync with `title` for the lifetime of the component.\n *\n * On first mount in the browser, the current title is captured. When `title` changes, the document title updates.\n * If `restoreOnUnmount` is true when the component unmounts, the captured title is restored so nested routes or\n * modals do not leak titles. Changing `restoreOnUnmount` while mounted does not run restore; only unmount does.\n *\n * @param params.title - Desired `document.title` string.\n * @param params.restoreOnUnmount - Whether to restore the pre-mount title on unmount (default `true`). The value\n * read at unmount time determines behavior, not mid-mount prop changes.\n */\nexport function useDocumentTitle({\n title,\n restoreOnUnmount = true,\n}: UseDocumentTitleParams): void {\n const originalTitle = useRef<string | undefined>(undefined);\n const restoreOnUnmountRef = useRef(restoreOnUnmount);\n restoreOnUnmountRef.current = restoreOnUnmount;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n if (originalTitle.current === undefined) {\n originalTitle.current = document.title;\n }\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n document.title = title;\n }, [title]);\n\n useEffect(() => {\n return () => {\n if (\n !restoreOnUnmountRef.current ||\n typeof document === \"undefined\" ||\n originalTitle.current === undefined\n ) {\n return;\n }\n document.title = originalTitle.current;\n };\n }, []);\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { RefObject } from 'react';
2
+
3
+ /**
4
+ * Composes modal-like behavior for an open overlay: body scroll lock, Escape to close, and focus trapping.
5
+ *
6
+ * - Delegates scroll locking to {@link useBodyScrollLock} while `open` is true.
7
+ * - Listens for `Escape` on `window` and calls `setOpen(false)`.
8
+ * - When `open` becomes true, focuses the first visible focusable inside `contentRef`, or the container itself.
9
+ * - Traps focus within `contentRef` via a capturing `focusin` listener on `document` that redirects focus back inside.
10
+ * - On close/unmount of the open effect, restores focus to the element that was focused before the trap ran.
11
+ *
12
+ * @param params.open - Whether the overlay is visible.
13
+ * @param params.setOpen - Setter used for Escape and cleanup paths.
14
+ * @param params.contentRef - Root of the dialog/drawer content (must point at a focusable container or include focusables).
15
+ * @param params.focusableSelector - Query selector for tabbable elements; defaults to a common interactive set.
16
+ */
17
+ declare const useFocusManagement: ({ open, setOpen, contentRef, focusableSelector, }: {
18
+ open: boolean;
19
+ setOpen: (open: boolean) => void;
20
+ contentRef: RefObject<HTMLDivElement | null>;
21
+ focusableSelector?: string;
22
+ }) => void;
23
+
24
+ export { useFocusManagement };
@@ -0,0 +1,24 @@
1
+ import { RefObject } from 'react';
2
+
3
+ /**
4
+ * Composes modal-like behavior for an open overlay: body scroll lock, Escape to close, and focus trapping.
5
+ *
6
+ * - Delegates scroll locking to {@link useBodyScrollLock} while `open` is true.
7
+ * - Listens for `Escape` on `window` and calls `setOpen(false)`.
8
+ * - When `open` becomes true, focuses the first visible focusable inside `contentRef`, or the container itself.
9
+ * - Traps focus within `contentRef` via a capturing `focusin` listener on `document` that redirects focus back inside.
10
+ * - On close/unmount of the open effect, restores focus to the element that was focused before the trap ran.
11
+ *
12
+ * @param params.open - Whether the overlay is visible.
13
+ * @param params.setOpen - Setter used for Escape and cleanup paths.
14
+ * @param params.contentRef - Root of the dialog/drawer content (must point at a focusable container or include focusables).
15
+ * @param params.focusableSelector - Query selector for tabbable elements; defaults to a common interactive set.
16
+ */
17
+ declare const useFocusManagement: ({ open, setOpen, contentRef, focusableSelector, }: {
18
+ open: boolean;
19
+ setOpen: (open: boolean) => void;
20
+ contentRef: RefObject<HTMLDivElement | null>;
21
+ focusableSelector?: string;
22
+ }) => void;
23
+
24
+ export { useFocusManagement };
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkYPLVTUYL_js = require('../chunk-YPLVTUYL.js');
5
+ require('../chunk-UIYFEP3I.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "useFocusManagement", {
10
+ enumerable: true,
11
+ get: function () { return chunkYPLVTUYL_js.useFocusManagement; }
12
+ });
13
+ //# sourceMappingURL=useFocusManagement.js.map
14
+ //# sourceMappingURL=useFocusManagement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"useFocusManagement.js"}
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ export { useFocusManagement } from '../chunk-WL5I7RVS.mjs';
3
+ import '../chunk-PMAF6FBF.mjs';
4
+ //# sourceMappingURL=useFocusManagement.mjs.map
5
+ //# sourceMappingURL=useFocusManagement.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"useFocusManagement.mjs"}
@@ -0,0 +1,15 @@
1
+ import { RefCallback } from 'react';
2
+
3
+ /**
4
+ * Tracks pointer hover state for a single DOM node using `pointerenter` / `pointerleave`.
5
+ *
6
+ * When the ref target changes (or unmounts), hover is cleared so state does not stay `true` after
7
+ * retargeting without a `pointerleave` on the previous node.
8
+ *
9
+ * @typeParam T - HTMLElement subtype for the ref callback (e.g. `HTMLDivElement`).
10
+ * @returns A tuple `[setRef, hovered]` where `setRef` is a callback ref to attach to the target element
11
+ * and `hovered` is `true` while the pointer is over that element (primary button agnostic).
12
+ */
13
+ declare function useHover<T extends HTMLElement>(): [RefCallback<T>, boolean];
14
+
15
+ export { useHover };
@@ -0,0 +1,15 @@
1
+ import { RefCallback } from 'react';
2
+
3
+ /**
4
+ * Tracks pointer hover state for a single DOM node using `pointerenter` / `pointerleave`.
5
+ *
6
+ * When the ref target changes (or unmounts), hover is cleared so state does not stay `true` after
7
+ * retargeting without a `pointerleave` on the previous node.
8
+ *
9
+ * @typeParam T - HTMLElement subtype for the ref callback (e.g. `HTMLDivElement`).
10
+ * @returns A tuple `[setRef, hovered]` where `setRef` is a callback ref to attach to the target element
11
+ * and `hovered` is `true` while the pointer is over that element (primary button agnostic).
12
+ */
13
+ declare function useHover<T extends HTMLElement>(): [RefCallback<T>, boolean];
14
+
15
+ export { useHover };