@stacksjs/composables 0.70.88 → 0.70.91

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 (333) hide show
  1. package/dist/_shared.d.ts +49 -0
  2. package/dist/_shared.js +23 -0
  3. package/dist/cloneFnJSON.d.ts +5 -0
  4. package/dist/cloneFnJSON.js +3 -0
  5. package/dist/computedAsync.d.ts +28 -0
  6. package/dist/computedAsync.js +20 -0
  7. package/dist/computedEager.d.ts +27 -0
  8. package/dist/computedEager.js +10 -0
  9. package/dist/createEventHook.d.ts +16 -0
  10. package/dist/createEventHook.js +15 -0
  11. package/dist/createFetch.d.ts +14 -0
  12. package/dist/createFetch.js +8 -0
  13. package/dist/createGlobalState.d.ts +17 -0
  14. package/dist/createGlobalState.js +10 -0
  15. package/dist/createSharedComposable.d.ts +8 -0
  16. package/dist/createSharedComposable.js +9 -0
  17. package/dist/extendRef.d.ts +9 -0
  18. package/dist/extendRef.js +6 -0
  19. package/dist/formatTimeAgo.d.ts +23 -0
  20. package/dist/formatTimeAgo.js +33 -0
  21. package/dist/index.d.ts +271 -0
  22. package/dist/index.js +210 -0
  23. package/dist/isDefined.d.ts +5 -0
  24. package/dist/isDefined.js +3 -0
  25. package/dist/makeDestructurable.d.ts +18 -0
  26. package/dist/makeDestructurable.js +16 -0
  27. package/dist/onClickOutside.d.ts +14 -0
  28. package/dist/onClickOutside.js +25 -0
  29. package/dist/onKeyStroke.d.ts +26 -0
  30. package/dist/onKeyStroke.js +31 -0
  31. package/dist/onLongPress.d.ts +14 -0
  32. package/dist/onLongPress.js +43 -0
  33. package/dist/onStartTyping.d.ts +8 -0
  34. package/dist/onStartTyping.js +23 -0
  35. package/dist/refAutoReset.d.ts +11 -0
  36. package/dist/refAutoReset.js +15 -0
  37. package/dist/refDefault.d.ts +9 -0
  38. package/dist/refDefault.js +8 -0
  39. package/dist/resolveRef.d.ts +7 -0
  40. package/dist/resolveRef.js +7 -0
  41. package/dist/ssrHandlers.d.ts +13 -0
  42. package/dist/ssrHandlers.js +8 -0
  43. package/dist/syncRef.d.ts +21 -0
  44. package/dist/syncRef.js +35 -0
  45. package/dist/tryOnMounted.d.ts +22 -0
  46. package/dist/tryOnMounted.js +22 -0
  47. package/dist/unrefElement.d.ts +6 -0
  48. package/dist/unrefElement.js +9 -0
  49. package/dist/until.d.ts +34 -0
  50. package/dist/until.js +62 -0
  51. package/dist/useActiveElement.d.ts +6 -0
  52. package/dist/useActiveElement.js +19 -0
  53. package/dist/useAnimate.d.ts +18 -0
  54. package/dist/useAnimate.js +48 -0
  55. package/dist/useArrayUtils.d.ts +42 -0
  56. package/dist/useArrayUtils.js +114 -0
  57. package/dist/useAsyncQueue.d.ts +18 -0
  58. package/dist/useAsyncQueue.js +22 -0
  59. package/dist/useAsyncState.d.ts +23 -0
  60. package/dist/useAsyncState.js +35 -0
  61. package/dist/useBase64.d.ts +12 -0
  62. package/dist/useBase64.js +45 -0
  63. package/dist/useBattery.d.ts +15 -0
  64. package/dist/useBattery.js +38 -0
  65. package/dist/useBreakpoints.d.ts +96 -0
  66. package/dist/useBreakpoints.js +97 -0
  67. package/dist/useBroadcastChannel.d.ts +14 -0
  68. package/dist/useBroadcastChannel.js +31 -0
  69. package/dist/useBrowserLocation.d.ts +18 -0
  70. package/dist/useBrowserLocation.js +64 -0
  71. package/dist/useClipboard.d.ts +17 -0
  72. package/dist/useClipboard.js +32 -0
  73. package/dist/useClipboardItems.d.ts +11 -0
  74. package/dist/useClipboardItems.js +15 -0
  75. package/dist/useCloned.d.ts +15 -0
  76. package/dist/useCloned.js +16 -0
  77. package/dist/useColorMode.d.ts +18 -0
  78. package/dist/useColorMode.js +60 -0
  79. package/dist/useConfirmDialog.d.ts +14 -0
  80. package/dist/useConfirmDialog.js +34 -0
  81. package/dist/useCounter.d.ts +20 -0
  82. package/dist/useCounter.js +28 -0
  83. package/dist/useCssVar.d.ts +10 -0
  84. package/dist/useCssVar.js +23 -0
  85. package/dist/useCycleList.d.ts +18 -0
  86. package/dist/useCycleList.js +27 -0
  87. package/dist/useDark.d.ts +11 -0
  88. package/dist/useDark.js +38 -0
  89. package/dist/useDateFormat.d.ts +10 -0
  90. package/dist/useDateFormat.js +11 -0
  91. package/dist/useDebounce.d.ts +10 -0
  92. package/dist/useDebounce.js +16 -0
  93. package/dist/useDebounceFn.d.ts +10 -0
  94. package/dist/useDebounceFn.js +18 -0
  95. package/dist/useDebouncedRef.d.ts +11 -0
  96. package/dist/useDebouncedRef.js +22 -0
  97. package/dist/useDebouncedRefHistory.d.ts +5 -0
  98. package/dist/useDebouncedRefHistory.js +36 -0
  99. package/dist/useDeviceMotion.d.ts +27 -0
  100. package/dist/useDeviceMotion.js +53 -0
  101. package/dist/useDeviceOrientation.d.ts +15 -0
  102. package/dist/useDeviceOrientation.js +23 -0
  103. package/dist/useDevicePixelRatio.d.ts +5 -0
  104. package/dist/useDevicePixelRatio.js +24 -0
  105. package/dist/useDocumentVisibility.d.ts +5 -0
  106. package/dist/useDocumentVisibility.js +16 -0
  107. package/dist/useDraggable.d.ts +23 -0
  108. package/dist/useDraggable.js +58 -0
  109. package/dist/useDropZone.d.ts +15 -0
  110. package/dist/useDropZone.js +52 -0
  111. package/dist/useElementBounding.d.ts +21 -0
  112. package/dist/useElementBounding.js +59 -0
  113. package/dist/useElementByPoint.d.ts +10 -0
  114. package/dist/useElementByPoint.js +18 -0
  115. package/dist/useElementHover.d.ts +9 -0
  116. package/dist/useElementHover.js +28 -0
  117. package/dist/useElementSize.d.ts +19 -0
  118. package/dist/useElementSize.js +34 -0
  119. package/dist/useElementVisibility.d.ts +10 -0
  120. package/dist/useElementVisibility.js +10 -0
  121. package/dist/useEventBus.d.ts +14 -0
  122. package/dist/useEventBus.js +41 -0
  123. package/dist/useEventListener.d.ts +14 -0
  124. package/dist/useEventListener.js +29 -0
  125. package/dist/useEventSource.d.ts +32 -0
  126. package/dist/useEventSource.js +72 -0
  127. package/dist/useEyeDropper.d.ts +10 -0
  128. package/dist/useEyeDropper.js +17 -0
  129. package/dist/useFavicon.d.ts +8 -0
  130. package/dist/useFavicon.js +22 -0
  131. package/dist/useFetch.d.ts +35 -0
  132. package/dist/useFetch.js +61 -0
  133. package/dist/useFileDialog.d.ts +15 -0
  134. package/dist/useFileDialog.js +24 -0
  135. package/dist/useFocus.d.ts +13 -0
  136. package/dist/useFocus.js +42 -0
  137. package/dist/useFocusWithin.d.ts +9 -0
  138. package/dist/useFocusWithin.js +29 -0
  139. package/dist/useForm.d.ts +97 -0
  140. package/dist/useForm.js +182 -0
  141. package/dist/useFps.d.ts +7 -0
  142. package/dist/useFps.js +22 -0
  143. package/dist/useFullscreen.d.ts +16 -0
  144. package/dist/useFullscreen.js +67 -0
  145. package/dist/useGeolocation.d.ts +26 -0
  146. package/dist/useGeolocation.js +55 -0
  147. package/dist/useIdle.d.ts +18 -0
  148. package/dist/useIdle.js +46 -0
  149. package/dist/useImage.d.ts +18 -0
  150. package/dist/useImage.js +32 -0
  151. package/dist/useInfiniteScroll.d.ts +11 -0
  152. package/dist/useInfiniteScroll.js +50 -0
  153. package/dist/useIntersectionObserver.d.ts +16 -0
  154. package/dist/useIntersectionObserver.js +27 -0
  155. package/dist/useInterval.d.ts +13 -0
  156. package/dist/useInterval.js +32 -0
  157. package/dist/useIntervalFn.d.ts +16 -0
  158. package/dist/useIntervalFn.js +24 -0
  159. package/dist/useKeyModifier.d.ts +6 -0
  160. package/dist/useKeyModifier.js +22 -0
  161. package/dist/useLastChanged.d.ts +11 -0
  162. package/dist/useLastChanged.js +8 -0
  163. package/dist/useLocalStorage.d.ts +17 -0
  164. package/dist/useLocalStorage.js +4 -0
  165. package/dist/useMagicKeys.d.ts +16 -0
  166. package/dist/useMagicKeys.js +81 -0
  167. package/dist/useManualRefHistory.d.ts +27 -0
  168. package/dist/useManualRefHistory.js +64 -0
  169. package/dist/useMath.d.ts +17 -0
  170. package/dist/useMath.js +52 -0
  171. package/dist/useMediaQuery.d.ts +9 -0
  172. package/dist/useMediaQuery.js +19 -0
  173. package/dist/useMemoize.d.ts +13 -0
  174. package/dist/useMemoize.js +24 -0
  175. package/dist/useMounted.d.ts +6 -0
  176. package/dist/useMounted.js +8 -0
  177. package/dist/useMouse.d.ts +19 -0
  178. package/dist/useMouse.js +67 -0
  179. package/dist/useMouseInElement.d.ts +17 -0
  180. package/dist/useMouseInElement.js +31 -0
  181. package/dist/useMousePressed.d.ts +10 -0
  182. package/dist/useMousePressed.js +31 -0
  183. package/dist/useMutationObserver.d.ts +16 -0
  184. package/dist/useMutationObserver.js +27 -0
  185. package/dist/useNavigatorLanguage.d.ts +5 -0
  186. package/dist/useNavigatorLanguage.js +17 -0
  187. package/dist/useNetwork.d.ts +18 -0
  188. package/dist/useNetwork.js +58 -0
  189. package/dist/useNow.d.ts +8 -0
  190. package/dist/useNow.js +10 -0
  191. package/dist/useObjectUrl.d.ts +8 -0
  192. package/dist/useObjectUrl.js +23 -0
  193. package/dist/useOffsetPagination.d.ts +21 -0
  194. package/dist/useOffsetPagination.js +45 -0
  195. package/dist/useOnline.d.ts +7 -0
  196. package/dist/useOnline.js +20 -0
  197. package/dist/usePageLeave.d.ts +9 -0
  198. package/dist/usePageLeave.js +27 -0
  199. package/dist/useParallax.d.ts +15 -0
  200. package/dist/useParallax.js +33 -0
  201. package/dist/useParentElement.d.ts +6 -0
  202. package/dist/useParentElement.js +8 -0
  203. package/dist/usePermission.d.ts +7 -0
  204. package/dist/usePermission.js +21 -0
  205. package/dist/usePointer.d.ts +15 -0
  206. package/dist/usePointer.js +32 -0
  207. package/dist/usePointerLock.d.ts +13 -0
  208. package/dist/usePointerLock.js +33 -0
  209. package/dist/usePointerSwipe.d.ts +20 -0
  210. package/dist/usePointerSwipe.js +52 -0
  211. package/dist/usePreferredColorScheme.d.ts +6 -0
  212. package/dist/usePreferredColorScheme.js +25 -0
  213. package/dist/usePreferredContrast.d.ts +6 -0
  214. package/dist/usePreferredContrast.js +29 -0
  215. package/dist/usePreferredLanguages.d.ts +5 -0
  216. package/dist/usePreferredLanguages.js +16 -0
  217. package/dist/usePreferredReducedMotion.d.ts +6 -0
  218. package/dist/usePreferredReducedMotion.js +18 -0
  219. package/dist/usePrevious.d.ts +9 -0
  220. package/dist/usePrevious.js +8 -0
  221. package/dist/useQuery.d.ts +106 -0
  222. package/dist/useQuery.js +265 -0
  223. package/dist/useRafFn.d.ts +19 -0
  224. package/dist/useRafFn.js +37 -0
  225. package/dist/useRefHistory.d.ts +28 -0
  226. package/dist/useRefHistory.js +72 -0
  227. package/dist/useResizeObserver.d.ts +16 -0
  228. package/dist/useResizeObserver.js +27 -0
  229. package/dist/useScreenOrientation.d.ts +13 -0
  230. package/dist/useScreenOrientation.js +27 -0
  231. package/dist/useScreenSafeArea.d.ts +12 -0
  232. package/dist/useScreenSafeArea.js +25 -0
  233. package/dist/useScriptTag.d.ts +20 -0
  234. package/dist/useScriptTag.js +52 -0
  235. package/dist/useScroll.d.ts +36 -0
  236. package/dist/useScroll.js +116 -0
  237. package/dist/useScrollLock.d.ts +10 -0
  238. package/dist/useScrollLock.js +39 -0
  239. package/dist/useSessionStorage.d.ts +17 -0
  240. package/dist/useSessionStorage.js +4 -0
  241. package/dist/useShare.d.ts +15 -0
  242. package/dist/useShare.js +11 -0
  243. package/dist/useSorted.d.ts +10 -0
  244. package/dist/useSorted.js +10 -0
  245. package/dist/useStepper.d.ts +23 -0
  246. package/dist/useStepper.js +46 -0
  247. package/dist/useStorage.d.ts +18 -0
  248. package/dist/useStorage.js +54 -0
  249. package/dist/useStyleTag.d.ts +17 -0
  250. package/dist/useStyleTag.js +39 -0
  251. package/dist/useSupported.d.ts +8 -0
  252. package/dist/useSupported.js +10 -0
  253. package/dist/useSwipe.d.ts +20 -0
  254. package/dist/useSwipe.js +58 -0
  255. package/dist/useTextDirection.d.ts +9 -0
  256. package/dist/useTextDirection.js +16 -0
  257. package/dist/useTextSelection.d.ts +10 -0
  258. package/dist/useTextSelection.js +27 -0
  259. package/dist/useTextareaAutosize.d.ts +10 -0
  260. package/dist/useTextareaAutosize.js +20 -0
  261. package/dist/useThrottle.d.ts +9 -0
  262. package/dist/useThrottle.js +23 -0
  263. package/dist/useThrottleFn.d.ts +11 -0
  264. package/dist/useThrottleFn.js +36 -0
  265. package/dist/useThrottledRef.d.ts +11 -0
  266. package/dist/useThrottledRef.js +30 -0
  267. package/dist/useThrottledRefHistory.d.ts +5 -0
  268. package/dist/useThrottledRefHistory.js +43 -0
  269. package/dist/useTimeAgo.d.ts +16 -0
  270. package/dist/useTimeAgo.js +58 -0
  271. package/dist/useTimeout.d.ts +12 -0
  272. package/dist/useTimeout.js +32 -0
  273. package/dist/useTimeoutFn.d.ts +16 -0
  274. package/dist/useTimeoutFn.js +27 -0
  275. package/dist/useTimeoutPoll.d.ts +10 -0
  276. package/dist/useTimeoutPoll.js +33 -0
  277. package/dist/useTimestamp.d.ts +15 -0
  278. package/dist/useTimestamp.js +43 -0
  279. package/dist/useTitle.d.ts +10 -0
  280. package/dist/useTitle.js +12 -0
  281. package/dist/useToNumber.d.ts +11 -0
  282. package/dist/useToNumber.js +25 -0
  283. package/dist/useToString.d.ts +6 -0
  284. package/dist/useToString.js +10 -0
  285. package/dist/useToggle.d.ts +6 -0
  286. package/dist/useToggle.js +12 -0
  287. package/dist/useTransition.d.ts +28 -0
  288. package/dist/useTransition.js +89 -0
  289. package/dist/useUrlSearchParams.d.ts +18 -0
  290. package/dist/useUrlSearchParams.js +72 -0
  291. package/dist/useVibrate.d.ts +13 -0
  292. package/dist/useVibrate.js +14 -0
  293. package/dist/useVirtualList.d.ts +23 -0
  294. package/dist/useVirtualList.js +49 -0
  295. package/dist/useWakeLock.d.ts +12 -0
  296. package/dist/useWakeLock.js +32 -0
  297. package/dist/useWebNotification.d.ts +25 -0
  298. package/dist/useWebNotification.js +39 -0
  299. package/dist/useWebSocket.d.ts +38 -0
  300. package/dist/useWebSocket.js +103 -0
  301. package/dist/useWebWorker.d.ts +18 -0
  302. package/dist/useWebWorker.js +56 -0
  303. package/dist/useWindowFocus.d.ts +5 -0
  304. package/dist/useWindowFocus.js +20 -0
  305. package/dist/useWindowScroll.d.ts +9 -0
  306. package/dist/useWindowScroll.js +17 -0
  307. package/dist/useWindowSize.d.ts +15 -0
  308. package/dist/useWindowSize.js +28 -0
  309. package/dist/watchArray.d.ts +5 -0
  310. package/dist/watchArray.js +9 -0
  311. package/dist/watchAtMost.d.ts +5 -0
  312. package/dist/watchAtMost.js +12 -0
  313. package/dist/watchDebounced.d.ts +23 -0
  314. package/dist/watchDebounced.js +20 -0
  315. package/dist/watchDeep.d.ts +7 -0
  316. package/dist/watchDeep.js +13 -0
  317. package/dist/watchIgnorable.d.ts +12 -0
  318. package/dist/watchIgnorable.js +19 -0
  319. package/dist/watchImmediate.d.ts +5 -0
  320. package/dist/watchImmediate.js +7 -0
  321. package/dist/watchOnce.d.ts +19 -0
  322. package/dist/watchOnce.js +17 -0
  323. package/dist/watchPausable.d.ts +13 -0
  324. package/dist/watchPausable.js +23 -0
  325. package/dist/watchThrottled.d.ts +23 -0
  326. package/dist/watchThrottled.js +37 -0
  327. package/dist/watchTriggerable.d.ts +5 -0
  328. package/dist/watchTriggerable.js +10 -0
  329. package/dist/watchWithFilter.d.ts +7 -0
  330. package/dist/watchWithFilter.js +6 -0
  331. package/dist/whenever.d.ts +18 -0
  332. package/dist/whenever.js +7 -0
  333. package/package.json +2 -2
@@ -0,0 +1,11 @@
1
+ import { computed, ref } from "@stacksjs/stx";
2
+ import { format } from "@stacksjs/datetime";
3
+ export function useDateFormat(date, formatStr) {
4
+ if (typeof date === "object" && date !== null && "value" in date && "subscribe" in date)
5
+ return computed(() => {
6
+ const d = date.value;
7
+ return format(d instanceof Date ? d : new Date(d), formatStr);
8
+ });
9
+ const d = date instanceof Date ? date : new Date(date);
10
+ return ref(format(d, formatStr));
11
+ }
@@ -0,0 +1,10 @@
1
+ import type { MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Debounce a value. Returns a ref that only updates after the source
5
+ * has stopped changing for the given delay.
6
+ *
7
+ * @param value - The source value or ref
8
+ * @param ms - Debounce delay in milliseconds. Default: 200
9
+ */
10
+ export declare function useDebounce<T>(value: MaybeRef<T>, ms?: number): Ref<T>;
@@ -0,0 +1,16 @@
1
+ import { ref, watch } from "@stacksjs/stx";
2
+ import { isRef, unref } from "./_shared";
3
+ export function useDebounce(value, ms = 200) {
4
+ const debounced = ref(unref(value));
5
+ let timer = null;
6
+ if (isRef(value))
7
+ watch(value, (newVal) => {
8
+ if (timer !== null)
9
+ clearTimeout(timer);
10
+ timer = setTimeout(() => {
11
+ debounced.value = newVal;
12
+ timer = null;
13
+ }, ms);
14
+ });
15
+ return debounced;
16
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Debounce a function.
3
+ * Delays invoking the function until after `ms` milliseconds have elapsed
4
+ * since the last time the debounced function was invoked.
5
+ *
6
+ * @param fn - The function to debounce
7
+ * @param ms - Delay in milliseconds (default 200)
8
+ * @returns The debounced function with a `cancel` method
9
+ */
10
+ export declare function useDebounceFn<T extends (...args: any[]) => any>(fn: T, ms?: number): T & { cancel: () => void };
@@ -0,0 +1,18 @@
1
+ export function useDebounceFn(fn, ms = 200) {
2
+ let timeoutId = null;
3
+ const debounced = function(...args) {
4
+ if (timeoutId !== null)
5
+ clearTimeout(timeoutId);
6
+ timeoutId = setTimeout(() => {
7
+ timeoutId = null;
8
+ fn.apply(this, args);
9
+ }, ms);
10
+ };
11
+ debounced.cancel = () => {
12
+ if (timeoutId !== null) {
13
+ clearTimeout(timeoutId);
14
+ timeoutId = null;
15
+ }
16
+ };
17
+ return debounced;
18
+ }
@@ -0,0 +1,11 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * A ref with debounced updates.
4
+ * Changes to the returned ref's value are propagated after a delay.
5
+ * Rapidly setting the value resets the delay timer.
6
+ *
7
+ * @param value - The initial value
8
+ * @param delay - Debounce delay in milliseconds (default 200)
9
+ * @returns A Ref whose internal value updates are debounced
10
+ */
11
+ export declare function useDebouncedRef<T>(value: T, delay?: number): Ref<T>;
@@ -0,0 +1,22 @@
1
+ import { ref, watch } from "@stacksjs/stx";
2
+ export function useDebouncedRef(value, delay = 200) {
3
+ const source = ref(value), debounced = ref(value);
4
+ let timeoutId = null;
5
+ watch(source, (newVal) => {
6
+ if (timeoutId !== null)
7
+ clearTimeout(timeoutId);
8
+ timeoutId = setTimeout(() => {
9
+ debounced.value = newVal;
10
+ timeoutId = null;
11
+ }, delay);
12
+ });
13
+ return {
14
+ get value() {
15
+ return debounced.value;
16
+ },
17
+ set value(newVal) {
18
+ source.value = newVal;
19
+ },
20
+ subscribe: debounced.subscribe
21
+ };
22
+ }
@@ -0,0 +1,5 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Like useRefHistory but debounces automatic commits.
4
+ */
5
+ export declare function useDebouncedRefHistory<T>(source: Ref<T>, options?: { capacity?: number, clone?: boolean, debounce?: number }): void;
@@ -0,0 +1,36 @@
1
+ import { useManualRefHistory } from "./useManualRefHistory";
2
+ import { watch } from "@stacksjs/stx";
3
+ export function useDebouncedRefHistory(source, options) {
4
+ const delay = options?.debounce ?? 200, { history, commit, undo, redo, canUndo, canRedo, clear, last } = useManualRefHistory(source, options);
5
+ let timer = null, ignoreNext = !1;
6
+ watch(source, () => {
7
+ if (ignoreNext) {
8
+ ignoreNext = !1;
9
+ return;
10
+ }
11
+ if (timer !== null)
12
+ clearTimeout(timer);
13
+ timer = setTimeout(() => {
14
+ timer = null;
15
+ commit();
16
+ }, delay);
17
+ });
18
+ const origUndo = undo, origRedo = redo;
19
+ function debouncedUndo() {
20
+ if (timer !== null) {
21
+ clearTimeout(timer);
22
+ timer = null;
23
+ }
24
+ ignoreNext = !0;
25
+ origUndo();
26
+ }
27
+ function debouncedRedo() {
28
+ if (timer !== null) {
29
+ clearTimeout(timer);
30
+ timer = null;
31
+ }
32
+ ignoreNext = !0;
33
+ origRedo();
34
+ }
35
+ return { history, commit, undo: debouncedUndo, redo: debouncedRedo, canUndo, canRedo, clear, last };
36
+ }
@@ -0,0 +1,27 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Reactive device motion.
4
+ * Tracks device acceleration and rotation using the DeviceMotionEvent API.
5
+ *
6
+ * @returns Reactive acceleration, accelerationIncludingGravity, rotationRate, and interval
7
+ */
8
+ export declare function useDeviceMotion(): UseDeviceMotionReturn;
9
+ export declare interface UseDeviceMotionReturn {
10
+ acceleration: {
11
+ x: Ref<number | null>
12
+ y: Ref<number | null>
13
+ z: Ref<number | null>
14
+ }
15
+ accelerationIncludingGravity: {
16
+ x: Ref<number | null>
17
+ y: Ref<number | null>
18
+ z: Ref<number | null>
19
+ }
20
+ rotationRate: {
21
+ alpha: Ref<number | null>
22
+ beta: Ref<number | null>
23
+ gamma: Ref<number | null>
24
+ }
25
+ interval: Ref<number>
26
+ isSupported: Ref<boolean>
27
+ }
@@ -0,0 +1,53 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { noop } from "./_shared";
3
+ export function useDeviceMotion() {
4
+ const isSupported = ref(typeof window < "u" && "DeviceMotionEvent" in window), acceleration = {
5
+ x: ref(null),
6
+ y: ref(null),
7
+ z: ref(null)
8
+ }, accelerationIncludingGravity = {
9
+ x: ref(null),
10
+ y: ref(null),
11
+ z: ref(null)
12
+ }, rotationRate = {
13
+ alpha: ref(null),
14
+ beta: ref(null),
15
+ gamma: ref(null)
16
+ }, interval = ref(0);
17
+ let cleanup = noop;
18
+ if (typeof window < "u" && isSupported.value) {
19
+ const handler = (event) => {
20
+ if (event.acceleration) {
21
+ acceleration.x.value = event.acceleration.x;
22
+ acceleration.y.value = event.acceleration.y;
23
+ acceleration.z.value = event.acceleration.z;
24
+ }
25
+ if (event.accelerationIncludingGravity) {
26
+ accelerationIncludingGravity.x.value = event.accelerationIncludingGravity.x;
27
+ accelerationIncludingGravity.y.value = event.accelerationIncludingGravity.y;
28
+ accelerationIncludingGravity.z.value = event.accelerationIncludingGravity.z;
29
+ }
30
+ if (event.rotationRate) {
31
+ rotationRate.alpha.value = event.rotationRate.alpha;
32
+ rotationRate.beta.value = event.rotationRate.beta;
33
+ rotationRate.gamma.value = event.rotationRate.gamma;
34
+ }
35
+ interval.value = event.interval;
36
+ };
37
+ window.addEventListener("devicemotion", handler, { passive: !0 });
38
+ cleanup = () => {
39
+ window.removeEventListener("devicemotion", handler);
40
+ cleanup = noop;
41
+ };
42
+ }
43
+ try {
44
+ onUnmounted(() => cleanup());
45
+ } catch {}
46
+ return {
47
+ acceleration,
48
+ accelerationIncludingGravity,
49
+ rotationRate,
50
+ interval,
51
+ isSupported
52
+ };
53
+ }
@@ -0,0 +1,15 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Reactive device orientation.
4
+ * Tracks device orientation using the DeviceOrientationEvent API.
5
+ *
6
+ * @returns Reactive alpha, beta, gamma angles, absolute flag, and support status
7
+ */
8
+ export declare function useDeviceOrientation(): UseDeviceOrientationReturn;
9
+ export declare interface UseDeviceOrientationReturn {
10
+ alpha: Ref<number | null>
11
+ beta: Ref<number | null>
12
+ gamma: Ref<number | null>
13
+ absolute: Ref<boolean>
14
+ isSupported: Ref<boolean>
15
+ }
@@ -0,0 +1,23 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { noop } from "./_shared";
3
+ export function useDeviceOrientation() {
4
+ const isSupported = ref(typeof window < "u" && "DeviceOrientationEvent" in window), alpha = ref(null), beta = ref(null), gamma = ref(null), absolute = ref(!1);
5
+ let cleanup = noop;
6
+ if (typeof window < "u" && isSupported.value) {
7
+ const handler = (event) => {
8
+ alpha.value = event.alpha;
9
+ beta.value = event.beta;
10
+ gamma.value = event.gamma;
11
+ absolute.value = event.absolute;
12
+ };
13
+ window.addEventListener("deviceorientation", handler, { passive: !0 });
14
+ cleanup = () => {
15
+ window.removeEventListener("deviceorientation", handler);
16
+ cleanup = noop;
17
+ };
18
+ }
19
+ try {
20
+ onUnmounted(() => cleanup());
21
+ } catch {}
22
+ return { alpha, beta, gamma, absolute, isSupported };
23
+ }
@@ -0,0 +1,5 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Reactively track the device pixel ratio.
4
+ */
5
+ export declare function useDevicePixelRatio(): { pixelRatio: Ref<number> };
@@ -0,0 +1,24 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ export function useDevicePixelRatio() {
3
+ const pixelRatio = ref(typeof window < "u" ? window.devicePixelRatio : 1);
4
+ if (typeof window > "u")
5
+ return { pixelRatio };
6
+ let mq = null, cleanup = () => {};
7
+ function observe() {
8
+ cleanup();
9
+ mq = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);
10
+ const handler = () => {
11
+ pixelRatio.value = window.devicePixelRatio;
12
+ observe();
13
+ };
14
+ mq.addEventListener("change", handler, { once: !0 });
15
+ cleanup = () => {
16
+ mq?.removeEventListener("change", handler);
17
+ };
18
+ }
19
+ observe();
20
+ try {
21
+ onUnmounted(() => cleanup());
22
+ } catch {}
23
+ return { pixelRatio };
24
+ }
@@ -0,0 +1,5 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Reactively track `document.visibilityState`.
4
+ */
5
+ export declare function useDocumentVisibility(): Ref<DocumentVisibilityState>;
@@ -0,0 +1,16 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ export function useDocumentVisibility() {
3
+ const visibility = ref(typeof document < "u" ? document.visibilityState : "visible");
4
+ if (typeof document > "u")
5
+ return visibility;
6
+ const handler = () => {
7
+ visibility.value = document.visibilityState;
8
+ };
9
+ document.addEventListener("visibilitychange", handler, { passive: !0 });
10
+ try {
11
+ onUnmounted(() => {
12
+ document.removeEventListener("visibilitychange", handler);
13
+ });
14
+ } catch {}
15
+ return visibility;
16
+ }
@@ -0,0 +1,23 @@
1
+ import { type MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Make an element draggable.
5
+ * Handles pointer events to enable drag-and-drop positioning.
6
+ *
7
+ * @param target - The element to make draggable (or a Ref to one)
8
+ * @param options - Configuration for initial position and drag callbacks
9
+ * @returns Reactive x, y position, dragging state, and computed style string
10
+ */
11
+ export declare function useDraggable(target: MaybeRef<HTMLElement | null>, options?: UseDraggableOptions): UseDraggableReturn;
12
+ export declare interface UseDraggableOptions {
13
+ initialValue?: { x: number, y: number }
14
+ onStart?: (position: { x: number, y: number }, event: PointerEvent) => void | false
15
+ onMove?: (position: { x: number, y: number }, event: PointerEvent) => void
16
+ onEnd?: (position: { x: number, y: number }, event: PointerEvent) => void
17
+ }
18
+ export declare interface UseDraggableReturn {
19
+ x: Ref<number>
20
+ y: Ref<number>
21
+ isDragging: Ref<boolean>
22
+ style: Ref<string>
23
+ }
@@ -0,0 +1,58 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { unref, noop } from "./_shared";
3
+ export function useDraggable(target, options) {
4
+ const initialX = options?.initialValue?.x ?? 0, initialY = options?.initialValue?.y ?? 0, x = ref(initialX), y = ref(initialY), isDragging = ref(!1), style = ref(`left: ${initialX}px; top: ${initialY}px;`);
5
+ let cleanup = noop;
6
+ if (typeof window < "u") {
7
+ const cleanups = [];
8
+ let startX = 0, startY = 0, offsetX = 0, offsetY = 0;
9
+ const updateStyle = () => {
10
+ style.value = `left: ${x.value}px; top: ${y.value}px;`;
11
+ }, onPointerMove = (event) => {
12
+ if (!isDragging.value)
13
+ return;
14
+ x.value = event.clientX - offsetX;
15
+ y.value = event.clientY - offsetY;
16
+ updateStyle();
17
+ if (options?.onMove)
18
+ options.onMove({ x: x.value, y: y.value }, event);
19
+ }, onPointerUp = (event) => {
20
+ if (!isDragging.value)
21
+ return;
22
+ isDragging.value = !1;
23
+ if (options?.onEnd)
24
+ options.onEnd({ x: x.value, y: y.value }, event);
25
+ window.removeEventListener("pointermove", onPointerMove);
26
+ window.removeEventListener("pointerup", onPointerUp);
27
+ }, onPointerDown = (event) => {
28
+ const pos = { x: x.value, y: y.value };
29
+ if (options?.onStart) {
30
+ if (options.onStart(pos, event) === !1)
31
+ return;
32
+ }
33
+ startX = event.clientX;
34
+ startY = event.clientY;
35
+ offsetX = startX - x.value;
36
+ offsetY = startY - y.value;
37
+ isDragging.value = !0;
38
+ window.addEventListener("pointermove", onPointerMove);
39
+ window.addEventListener("pointerup", onPointerUp);
40
+ }, el = unref(target);
41
+ if (el) {
42
+ el.addEventListener("pointerdown", onPointerDown);
43
+ cleanups.push(() => el.removeEventListener("pointerdown", onPointerDown));
44
+ }
45
+ cleanup = () => {
46
+ for (const fn of cleanups)
47
+ fn();
48
+ cleanups.length = 0;
49
+ window.removeEventListener("pointermove", onPointerMove);
50
+ window.removeEventListener("pointerup", onPointerUp);
51
+ cleanup = noop;
52
+ };
53
+ }
54
+ try {
55
+ onUnmounted(() => cleanup());
56
+ } catch {}
57
+ return { x, y, isDragging, style };
58
+ }
@@ -0,0 +1,15 @@
1
+ import { type MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Drop zone for drag and drop files.
5
+ * Tracks when files are dragged over the target element and captures dropped files.
6
+ *
7
+ * @param target - The drop zone element (or a Ref to one)
8
+ * @param onDrop - Optional callback called when files are dropped
9
+ * @returns Reactive isOverDropZone state and dropped files
10
+ */
11
+ export declare function useDropZone(target: MaybeRef<HTMLElement | null>, onDrop?: (files: File[] | null) => void): UseDropZoneReturn;
12
+ export declare interface UseDropZoneReturn {
13
+ isOverDropZone: Ref<boolean>
14
+ files: Ref<File[] | null>
15
+ }
@@ -0,0 +1,52 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { unref, noop } from "./_shared";
3
+ export function useDropZone(target, onDrop) {
4
+ const isOverDropZone = ref(!1), files = ref(null);
5
+ let cleanup = noop, dragCounter = 0;
6
+ if (typeof window < "u") {
7
+ const el = unref(target);
8
+ if (el) {
9
+ const cleanups = [], onDragEnter = (event) => {
10
+ event.preventDefault();
11
+ dragCounter++;
12
+ isOverDropZone.value = !0;
13
+ }, onDragOver = (event) => {
14
+ event.preventDefault();
15
+ isOverDropZone.value = !0;
16
+ }, onDragLeave = (event) => {
17
+ event.preventDefault();
18
+ dragCounter--;
19
+ if (dragCounter <= 0) {
20
+ dragCounter = 0;
21
+ isOverDropZone.value = !1;
22
+ }
23
+ }, onDropHandler = (event) => {
24
+ event.preventDefault();
25
+ dragCounter = 0;
26
+ isOverDropZone.value = !1;
27
+ const droppedFiles = event.dataTransfer?.files;
28
+ if (droppedFiles && droppedFiles.length > 0)
29
+ files.value = Array.from(droppedFiles);
30
+ else
31
+ files.value = null;
32
+ if (onDrop)
33
+ onDrop(files.value);
34
+ };
35
+ el.addEventListener("dragenter", onDragEnter);
36
+ el.addEventListener("dragover", onDragOver);
37
+ el.addEventListener("dragleave", onDragLeave);
38
+ el.addEventListener("drop", onDropHandler);
39
+ cleanups.push(() => el.removeEventListener("dragenter", onDragEnter), () => el.removeEventListener("dragover", onDragOver), () => el.removeEventListener("dragleave", onDragLeave), () => el.removeEventListener("drop", onDropHandler));
40
+ cleanup = () => {
41
+ for (const fn of cleanups)
42
+ fn();
43
+ cleanups.length = 0;
44
+ cleanup = noop;
45
+ };
46
+ }
47
+ }
48
+ try {
49
+ onUnmounted(() => cleanup());
50
+ } catch {}
51
+ return { isOverDropZone, files };
52
+ }
@@ -0,0 +1,21 @@
1
+ import { type MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Reactive element bounding rect.
5
+ * Tracks the element's position and size, updating on resize, scroll, and mutations.
6
+ *
7
+ * @param target - The element to observe (or a Ref to one)
8
+ * @returns Reactive bounding rect properties and update function
9
+ */
10
+ export declare function useElementBounding(target: MaybeRef<HTMLElement | null>): UseElementBoundingReturn;
11
+ export declare interface UseElementBoundingReturn {
12
+ x: Ref<number>
13
+ y: Ref<number>
14
+ top: Ref<number>
15
+ right: Ref<number>
16
+ bottom: Ref<number>
17
+ left: Ref<number>
18
+ width: Ref<number>
19
+ height: Ref<number>
20
+ update: () => void
21
+ }
@@ -0,0 +1,59 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { unref, noop } from "./_shared";
3
+ export function useElementBounding(target) {
4
+ const x = ref(0), y = ref(0), top = ref(0), right = ref(0), bottom = ref(0), left = ref(0), width = ref(0), height = ref(0), cleanups = [];
5
+ let cleanup = noop;
6
+ const update = () => {
7
+ const el = unref(target);
8
+ if (!el)
9
+ return;
10
+ const rect = el.getBoundingClientRect();
11
+ x.value = rect.x;
12
+ y.value = rect.y;
13
+ top.value = rect.top;
14
+ right.value = rect.right;
15
+ bottom.value = rect.bottom;
16
+ left.value = rect.left;
17
+ width.value = rect.width;
18
+ height.value = rect.height;
19
+ };
20
+ if (typeof window < "u") {
21
+ update();
22
+ const onResize = () => update();
23
+ window.addEventListener("resize", onResize, { passive: !0 });
24
+ cleanups.push(() => window.removeEventListener("resize", onResize));
25
+ const onScroll = () => update();
26
+ window.addEventListener("scroll", onScroll, { passive: !0 });
27
+ cleanups.push(() => window.removeEventListener("scroll", onScroll));
28
+ if ("ResizeObserver" in window) {
29
+ const el = unref(target);
30
+ if (el) {
31
+ const resizeObserver = new ResizeObserver(update);
32
+ resizeObserver.observe(el);
33
+ cleanups.push(() => resizeObserver.disconnect());
34
+ }
35
+ }
36
+ if ("MutationObserver" in window) {
37
+ const el = unref(target);
38
+ if (el) {
39
+ const mutationObserver = new MutationObserver(update);
40
+ mutationObserver.observe(el, {
41
+ childList: !0,
42
+ subtree: !0,
43
+ attributes: !0
44
+ });
45
+ cleanups.push(() => mutationObserver.disconnect());
46
+ }
47
+ }
48
+ cleanup = () => {
49
+ for (const fn of cleanups)
50
+ fn();
51
+ cleanups.length = 0;
52
+ cleanup = noop;
53
+ };
54
+ }
55
+ try {
56
+ onUnmounted(() => cleanup());
57
+ } catch {}
58
+ return { x, y, top, right, bottom, left, width, height, update };
59
+ }
@@ -0,0 +1,10 @@
1
+ import type { Ref } from '@stacksjs/stx';
2
+ /**
3
+ * Reactive element at a given point. Tracks the element under the mouse cursor.
4
+ */
5
+ export declare function useElementByPoint(options?: { x?: Ref<number>, y?: Ref<number> }): UseElementByPointReturn;
6
+ export declare interface UseElementByPointReturn {
7
+ element: Ref<Element | null>
8
+ x: Ref<number>
9
+ y: Ref<number>
10
+ }
@@ -0,0 +1,18 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ export function useElementByPoint(options) {
3
+ const x = options?.x ?? ref(0), y = options?.y ?? ref(0), element = ref(null);
4
+ if (typeof document > "u")
5
+ return { element, x, y };
6
+ const handler = (e) => {
7
+ x.value = e.clientX;
8
+ y.value = e.clientY;
9
+ element.value = document.elementFromPoint(e.clientX, e.clientY);
10
+ };
11
+ document.addEventListener("mousemove", handler, { passive: !0 });
12
+ try {
13
+ onUnmounted(() => {
14
+ document.removeEventListener("mousemove", handler);
15
+ });
16
+ } catch {}
17
+ return { element, x, y };
18
+ }
@@ -0,0 +1,9 @@
1
+ import type { MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Reactive element hover state.
5
+ *
6
+ * @param target - The target element or a ref to one
7
+ * @returns A ref that is true when the element is being hovered
8
+ */
9
+ export declare function useElementHover(target: MaybeRef<HTMLElement | null | undefined>): Ref<boolean>;
@@ -0,0 +1,28 @@
1
+ import { onUnmounted, ref } from "@stacksjs/stx";
2
+ import { unref } from "./_shared";
3
+ export function useElementHover(target) {
4
+ const isHovered = ref(!1);
5
+ let cleanup = () => {};
6
+ function setup(el) {
7
+ cleanup();
8
+ if (!el)
9
+ return;
10
+ const onEnter = () => {
11
+ isHovered.value = !0;
12
+ }, onLeave = () => {
13
+ isHovered.value = !1;
14
+ };
15
+ el.addEventListener("mouseenter", onEnter, { passive: !0 });
16
+ el.addEventListener("mouseleave", onLeave, { passive: !0 });
17
+ cleanup = () => {
18
+ el.removeEventListener("mouseenter", onEnter);
19
+ el.removeEventListener("mouseleave", onLeave);
20
+ cleanup = () => {};
21
+ };
22
+ }
23
+ setup(unref(target));
24
+ try {
25
+ onUnmounted(() => cleanup());
26
+ } catch {}
27
+ return isHovered;
28
+ }
@@ -0,0 +1,19 @@
1
+ import { type MaybeRef } from './_shared';
2
+ import type { Ref } from '@stacksjs/stx';
3
+ /**
4
+ * Reactive element dimensions.
5
+ * Uses ResizeObserver to track the width and height of an element.
6
+ *
7
+ * @param target - The element to observe (or a Ref to one)
8
+ * @param options - Configuration with optional initial size
9
+ * @returns Reactive width, height, and a stop function
10
+ */
11
+ export declare function useElementSize(target: MaybeRef<HTMLElement | null>, options?: UseElementSizeOptions): UseElementSizeReturn;
12
+ export declare interface UseElementSizeOptions {
13
+ initialSize?: { width: number, height: number }
14
+ }
15
+ export declare interface UseElementSizeReturn {
16
+ width: Ref<number>
17
+ height: Ref<number>
18
+ stop: () => void
19
+ }