tr]:last:border-b-0",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
+ return (
+
+ )
+}
+
+function TableHead({ className, ...props }: React.ComponentProps<"th">) {
+ return (
+ [role=checkbox]]:translate-y-[2px]",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function TableCell({ className, ...props }: React.ComponentProps<"td">) {
+ return (
+ [role=checkbox]]:translate-y-[2px]",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function TableCaption({
+ className,
+ ...props
+}: React.ComponentProps<"caption">) {
+ return (
+
+ )
+}
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+}
diff --git a/packages/docs-v2/components/ui/tabs.tsx b/packages/docs-v2/components/ui/tabs.tsx
new file mode 100644
index 00000000..7f73dcda
--- /dev/null
+++ b/packages/docs-v2/components/ui/tabs.tsx
@@ -0,0 +1,91 @@
+"use client"
+
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Tabs as TabsPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function Tabs({
+ className,
+ orientation = "horizontal",
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+const tabsListVariants = cva(
+ "rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
+ {
+ variants: {
+ variant: {
+ default: "bg-muted",
+ line: "gap-1 bg-transparent",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+function TabsList({
+ className,
+ variant = "default",
+ ...props
+}: React.ComponentProps &
+ VariantProps) {
+ return (
+
+ )
+}
+
+function TabsTrigger({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function TabsContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
diff --git a/packages/docs-v2/components/ui/tooltip.tsx b/packages/docs-v2/components/ui/tooltip.tsx
new file mode 100644
index 00000000..d80a1446
--- /dev/null
+++ b/packages/docs-v2/components/ui/tooltip.tsx
@@ -0,0 +1,57 @@
+"use client"
+
+import * as React from "react"
+import { Tooltip as TooltipPrimitive } from "radix-ui"
+
+import { cn } from "@/lib/utils"
+
+function TooltipProvider({
+ delayDuration = 0,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function Tooltip({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function TooltipTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function TooltipContent({
+ className,
+ sideOffset = 0,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+ {children}
+
+
+
+ )
+}
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
diff --git a/packages/docs-v2/content/docs/(root)/cli.mdx b/packages/docs-v2/content/docs/(root)/cli.mdx
new file mode 100644
index 00000000..908df9be
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/cli.mdx
@@ -0,0 +1,57 @@
+---
+title: CLI
+description: Use the CLI to add hooks to your project with [useverse](https://www.npmjs.com/package/useverse).
+---
+
+## init
+
+Use the `init` command to initialize configuration and dependencies for a new project.
+
+The `init` command installs dependencies and creates a [`reactuse.json`](./reactuse-json.md) config file.
+
+```bash
+npx useverse@latest init
+```
+
+## add
+
+Use the `add` command to add hooks and dependencies to your project.
+
+```bash
+npx useverse@latest add [hook]
+```
+
+You will be presented with a list of hooks to choose from:
+
+```bash
+Which hooks would you like to add? › Space to select. A to toggle all.
+Enter to submit.
+
+◯ useActiveElement
+◯ useAsync
+◯ useBattery
+◯ useBluetooth
+◯ useBoolean
+◯ useBreakpoints
+◯ useBrowserLanguage
+◯ useClickOutside
+◯ useClipboard
+◯ useConst
+```
+
+### Options
+
+```bash
+Usage: useverse add [options] [hooks...]
+
+add a hook to your project
+
+Arguments:
+ components the components to add or a url to the component.
+
+Options:
+ -o, --overwrite overwrite existing files. (default: false)
+ -c, --cwd the working directory. defaults to the current directory.
+ -a, --all add all available hooks. (default: false)
+ -h, --help display help for command
+```
diff --git a/packages/docs-v2/content/docs/(root)/index.mdx b/packages/docs-v2/content/docs/(root)/index.mdx
new file mode 100644
index 00000000..edf77ab3
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/index.mdx
@@ -0,0 +1,58 @@
+---
+title: Introduction
+description: React Use delivers production-ready hooks that solve real-world problems. Built with TypeScript-first approach, SSR compatibility, and tree-shaking optimization - everything you need to build modern React applications. Improve your react applications with our library 📦 designed for comfort and speed.
+---
+
+## Getting Started
+
+```bash
+npm install @siberiacancode/reactuse
+```
+
+After installation, you can use any of our hooks in your components:
+
+```tsx
+import { useCounter } from "@siberiacancode/reactuse"
+
+const App = () => {
+ const counter = useCounter(0)
+
+ return (
+
+
Count: {counter.value}
+ counter.inc()}>+1
+ counter.dec()}>-1
+
+ )
+}
+```
+
+## CLI Installation
+
+Use the CLI to add hooks to your project with [useverse](https://www.npmjs.com/package/useverse).
+
+```bash
+npx useverse@latest init
+```
+
+```bash
+npx useverse@latest add [hook]
+```
+
+You will be presented with a list of hooks to choose from:
+
+```bash
+Which hooks would you like to add? › Space to select. A to toggle all.
+Enter to submit.
+
+◯ useActiveElement
+◯ useAsync
+◯ useBattery
+◯ useBluetooth
+◯ useBoolean
+◯ useBreakpoints
+◯ useBrowserLanguage
+◯ useClickOutside
+◯ useClipboard
+◯ useConst
+```
diff --git a/packages/docs-v2/content/docs/(root)/installation.mdx b/packages/docs-v2/content/docs/(root)/installation.mdx
new file mode 100644
index 00000000..18741d4e
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/installation.mdx
@@ -0,0 +1,113 @@
+---
+title: Installation
+description: How to install dependencies and structure your app.
+---
+
+### Install package
+
+```bash
+npm install @siberiacancode/reactuse
+```
+
+## Inject code to your framework
+
+How to install dependencies and structure your app with [cli](./cli.md) and [useverse](https://www.npmjs.com/package/useverse).
+
+
+
+
+
+ Vite
+
+
+ Vite
+
+
+
+
+ Next.js
+
+
+ Next.js
+
+
+
+
+ Astro
+
+
+ Astro
+
+
+
+
+
+
+ React Router
+
+
+
+
+
+
+ TanStack Router
+
+
+
+
+
+
+ TanStack Start
+
+
+
+
+ React
+
+
+ Manual
+
+
+
diff --git a/packages/docs-v2/content/docs/(root)/memoization.mdx b/packages/docs-v2/content/docs/(root)/memoization.mdx
new file mode 100644
index 00000000..2d443ab3
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/memoization.mdx
@@ -0,0 +1,51 @@
+---
+title: Memoization
+description: About memoization
+---
+
+## Library Philosophy
+
+ReactUse **deliberately avoids memoizing** hook methods by default. This decision is based on several important principles of React application development.
+
+## About optimization
+
+> "Premature optimization is the root of all evil" — Donald Knuth
+
+Memoization is an optimization technique, and like any optimization, it should be applied consciously when there's a real performance problem. Automatic memoization of all functions can:
+
+- **Hide real architectural problems** — instead of fixing the root cause of unnecessary re-renders, we mask the symptoms
+- **Create a false sense of security** — developers might think performance is already optimized
+- **Complicate debugging** — memoized functions don't behave as expected when dependencies change
+
+## Re-renders are normal
+
+React is designed so that component re-renders are a natural and efficient part of its operation. Modern browsers and React Fiber can handle a lot of re-renders without noticeable impact on performance.
+
+Memoization is a tool that should be in the hands of the application developer, not the library.
+
+```tsx
+import { useCallback, useMemo } from "react"
+import { useCounter } from "@siberiacancode/reactuse"
+
+export const Component = () => {
+ const counter = useCounter(0)
+
+ const expensiveValue = useMemo(
+ () => performHeavyCalculation(counter.value),
+ [counter.value]
+ )
+
+ const handleIncrement = useCallback(() => {
+ performHeavyOperation()
+ counter.inc()
+ }, [counter.inc])
+
+ // ...
+}
+```
+
+## React compiler
+
+The React team is working on **React Compiler** — a tool that will automatically optimize your code by adding memoization where it's truly needed.
+
+When React Compiler becomes stable, the question of manual memoization will become less relevant, but the principles of conscious optimization will remain important.
diff --git a/packages/docs-v2/content/docs/(root)/reactuse-json.mdx b/packages/docs-v2/content/docs/(root)/reactuse-json.mdx
new file mode 100644
index 00000000..9db7702a
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/reactuse-json.mdx
@@ -0,0 +1,82 @@
+---
+title: reactuse.json
+description: Configuration for your project.
+---
+
+The `reactuse.json` file holds configuration for your project.
+
+We use it to understand how your project is set up and how to generate hooks customized for your project.
+
+Note: The `reactuse.json` file is optional and **only required if you're
+using the CLI** to add hooks to your project. If you're using the copy
+and paste method, you don't need this file.
+
+You can create a `reactuse.json` file in your project by running the following command:
+
+```bash
+npx useverse@latest init
+```
+
+See the [CLI section](./cli.md) for more information.
+
+## ts
+
+Choose between TypeScript or JavaScript hooks.
+
+Setting this option to `false` allows hooks to be added as JavaScript with the `.jsx` file extension.
+
+```json title="reactuse.json"
+{
+ "ts": true | false
+}
+```
+
+## aliases
+
+The CLI uses these values and the `paths` config from your `tsconfig.json` or `jsconfig.json` file to place generated hooks in the correct location.
+
+Path aliases have to be set up in your `tsconfig.json` or `jsconfig.json` file.
+
+
+ **Important:** If you're using the src directory, make sure it is included under paths in your
+ tsconfig.json or jsconfig.json file.
+
+
+### aliases.utils
+
+Import alias for your utility functions.
+
+```json title="reactuse.json"
+{
+ "aliases": {
+ "utils": "@/utils/lib"
+ }
+}
+```
+
+### aliases.hooks
+
+Import alias for your hooks.
+
+```json title="reactuse.json"
+{
+ "aliases": {
+ "hooks": "@/shared/hooks"
+ }
+}
+```
+
+## case
+
+Controls the naming convention for generated files.
+
+There are two options:
+
+- `camel`: All files will be generated in `camelCase` (e.g., `useClickOutside.ts`).
+- `kebab`: All files will be generated in `kebab-case` (e.g., `use-click-outside.ts`).
+
+```json title="reactuse.json"
+{
+ "case": "camel" | "kebab"
+}
+```
diff --git a/packages/docs-v2/content/docs/(root)/target.mdx b/packages/docs-v2/content/docs/(root)/target.mdx
new file mode 100644
index 00000000..f3490552
--- /dev/null
+++ b/packages/docs-v2/content/docs/(root)/target.mdx
@@ -0,0 +1,73 @@
+---
+title: target
+description: Working with DOM elements.
+---
+
+## Common library limitations
+
+Many `React` libraries that work with DOM elements typically support only one way of providing target elements - usually through refs.
+
+```typescript twoslash
+import { useClickOutside } from '@siberiacancode/reactuse';
+import { useRef } from 'react';
+
+const ref = useRef(null);
+useClickOutside(ref, () => console.log('Clicked outside'));
+```
+
+This limitation forces developers to always create refs by themselves, even in cases where they might have not want to create additional refs or want to use different selection methods, like `querySelector`.
+
+## Flexible target handling with typescript overloads
+
+Our library implements a flexible approach using `typescript` function overloads that allows hooks to work with targets in two different ways:
+
+1. By passing an **existing** target _(ref, DOM element, function that returns a DOM element, or selector)_
+
+```typescript twoslash
+import { useClickOutside } from '@siberiacancode/reactuse';
+import { useRef } from 'react';
+
+const ref = useRef(null);
+useClickOutside(ref, () => console.log('Clicked outside'));
+```
+
+or you can use [target](#the-target-function) function
+
+```typescript twoslash
+import { target, useClickOutside } from '@siberiacancode/reactuse';
+
+useClickOutside(target('#container'), () => console.log('Clicked outside'));
+```
+
+2. By receiving a ref callback that can be attached to an element
+
+```typescript twoslash
+import { useClickOutside } from '@siberiacancode/reactuse';
+
+const ref = useClickOutside(() => console.log('Clicked outside'));
+```
+
+This dual approach provides better developer experience and more flexibility in different use cases.
+
+## The target function
+
+The `target` is a utility function that helps you work with DOM elements in a flexible way. It allows you to reference DOM elements using different approaches:
+
+- React refs _(RefObject)_
+- Direct DOM elements _(Element | Window | Document)_
+- Functions that return a DOM element _(() => Element | Window | Document)_
+- Query selectors _(string)_
+
+The flexibility of `target` means you can use our hooks like you want.
+
+```typescript twoslash
+import { target, useClickOutside } from '@siberiacancode/reactuse';
+
+useClickOutside(target('#container'), () => console.log('Clicked outside'));
+
+// or
+
+useClickOutside(target(document.getElementById('container')!), () =>
+ console.log('Clicked outside')
+);
+```
diff --git a/packages/docs-v2/content/docs/hooks/useactiveelement.mdx b/packages/docs-v2/content/docs/hooks/useactiveelement.mdx
new file mode 100644
index 00000000..56e68977
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useactiveelement.mdx
@@ -0,0 +1,47 @@
+---
+title: "useActiveElement"
+description: "Hook that returns the active element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useactiveelement.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useActiveElement
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useActiveElement/useActiveElement.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useActiveElement/useActiveElement.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useactiveelement.props.json b/packages/docs-v2/content/docs/hooks/useactiveelement.props.json
new file mode 100644
index 00000000..bb0d7c91
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useactiveelement.props.json
@@ -0,0 +1,154 @@
+{
+ "name": "useActiveElement",
+ "description": "Hook that returns the active element",
+ "examples": [
+ "const activeElement = useActiveElement(ref);",
+ "const { ref, value } = useActiveElement();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The target element to observe active element changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} [target=window] The target element to observe active element changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[target=window]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to observe active element changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "window"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "ActiveElement | null",
+ "optional": false,
+ "description": "active element",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {ActiveElement | null} The active element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{ActiveElement | null}",
+ "postType": " ",
+ "description": "active element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "{ ref: StateRef; activeElement: ActiveElement | null }",
+ "optional": false,
+ "description": "object containing the ref and active element",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @returns {{ ref: StateRef; activeElement: ActiveElement | null }} An object containing the ref and active element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{{ ref: StateRef; activeElement: ActiveElement | null }}",
+ "postType": " ",
+ "description": "object containing the ref and active element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 16,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useasync.mdx b/packages/docs-v2/content/docs/hooks/useasync.mdx
new file mode 100644
index 00000000..f4b593af
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useasync.mdx
@@ -0,0 +1,47 @@
+---
+title: "useAsync"
+description: "Hook that provides the state of an async callback"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useasync.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useAsync
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAsync/useAsync.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAsync/useAsync.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useasync.props.json b/packages/docs-v2/content/docs/hooks/useasync.props.json
new file mode 100644
index 00000000..64795120
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useasync.props.json
@@ -0,0 +1,131 @@
+{
+ "name": "useAsync",
+ "description": "Hook that provides the state of an async callback",
+ "examples": [
+ "const { data, isLoading, isError, error } = useAsync(() => fetch('url'), [deps]);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "() => Promise",
+ "optional": false,
+ "description": "The async callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {() => Promise} callback The async callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{() => Promise}",
+ "postType": " ",
+ "description": "The async callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "deps",
+ "type": "DependencyList",
+ "optional": true,
+ "description": "The dependencies of the callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {DependencyList} [deps=[]] The dependencies of the callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[deps=[]]",
+ "postName": " ",
+ "type": "{DependencyList}",
+ "postType": " ",
+ "description": "The dependencies of the callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "[]"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseAsyncReturn",
+ "optional": false,
+ "description": "state of the async callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseAsyncReturn} The state of the async callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseAsyncReturn}",
+ "postType": " ",
+ "description": "state of the async callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "async",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useasynceffect.mdx b/packages/docs-v2/content/docs/hooks/useasynceffect.mdx
new file mode 100644
index 00000000..0e80c929
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useasynceffect.mdx
@@ -0,0 +1,47 @@
+---
+title: "useAsyncEffect"
+description: "Hook that triggers the effect callback on updates"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useasynceffect.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useAsyncEffect
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAsyncEffect/useAsyncEffect.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAsyncEffect/useAsyncEffect.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useasynceffect.props.json b/packages/docs-v2/content/docs/hooks/useasynceffect.props.json
new file mode 100644
index 00000000..75ebf680
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useasynceffect.props.json
@@ -0,0 +1,99 @@
+{
+ "name": "useAsyncEffect",
+ "description": "Hook that triggers the effect callback on updates",
+ "examples": [
+ "useAsyncEffect(async () => console.log(\"effect runs on updates\"), deps);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "effect",
+ "type": "EffectCallback",
+ "optional": false,
+ "description": "The effect callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {EffectCallback} effect The effect callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "effect",
+ "postName": " ",
+ "type": "{EffectCallback}",
+ "postType": " ",
+ "description": "The effect callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "deps",
+ "type": "DependencyList",
+ "optional": true,
+ "description": "The dependencies list for the effect",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {DependencyList} [deps] The dependencies list for the effect",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[deps]",
+ "postName": " ",
+ "type": "{DependencyList}",
+ "postType": " ",
+ "description": "The dependencies list for the effect",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "lifecycle",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1758638440000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useaudio.mdx b/packages/docs-v2/content/docs/hooks/useaudio.mdx
new file mode 100644
index 00000000..020de343
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useaudio.mdx
@@ -0,0 +1,47 @@
+---
+title: "useAudio"
+description: "Hook that manages audio playback with sprite support"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useaudio.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useAudio
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAudio/useAudio.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAudio/useAudio.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useaudio.props.json b/packages/docs-v2/content/docs/hooks/useaudio.props.json
new file mode 100644
index 00000000..e43d63cb
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useaudio.props.json
@@ -0,0 +1,271 @@
+{
+ "name": "useAudio",
+ "description": "Hook that manages audio playback with sprite support",
+ "examples": [
+ "const audio = useAudio(\"/path/to/sound.mp3\");"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "url",
+ "type": "string",
+ "optional": false,
+ "description": "The URL of the audio file to play",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {string} url The URL of the audio file to play",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "url",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The URL of the audio file to play",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseAudioOptions",
+ "optional": true,
+ "description": "Audio configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {UseAudioOptions} [options] Audio configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseAudioOptions}",
+ "postType": " ",
+ "description": "Audio configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.volume",
+ "type": "number",
+ "optional": true,
+ "description": "Initial volume level (0 to 1)",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {number} [options.volume=1] Initial volume level (0 to 1)",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.volume=1]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Initial volume level (0 to 1)",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1"
+ },
+ {
+ "tag": "param",
+ "name": "options.playbackRate",
+ "type": "number",
+ "optional": true,
+ "description": "Initial playback speed (0.5 to 2)",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {number} [options.playbackRate=1] Initial playback speed (0.5 to 2)",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.playbackRate=1]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Initial playback speed (0.5 to 2)",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1"
+ },
+ {
+ "tag": "param",
+ "name": "options.interrupt",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether to stop current playback when starting a new one",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {boolean} [options.interrupt=false] Whether to stop current playback when starting a new one",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.interrupt=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether to stop current playback when starting a new one",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.soundEnabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether audio playback is initially enabled",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {boolean} [options.soundEnabled=true] Whether audio playback is initially enabled",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.soundEnabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether audio playback is initially enabled",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.sprite",
+ "type": "SpriteMap",
+ "optional": true,
+ "description": "Map of named audio segments for sprite-based playback",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {SpriteMap} [options.sprite] Map of named audio segments for sprite-based playback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.sprite]",
+ "postName": " ",
+ "type": "{SpriteMap}",
+ "postType": " ",
+ "description": "Map of named audio segments for sprite-based playback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseAudioReturn",
+ "optional": false,
+ "description": "object containing audio controls and state",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @returns {UseAudioReturn} An object containing audio controls and state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseAudioReturn}",
+ "postType": " ",
+ "description": "object containing audio controls and state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 17,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "Audio",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1762758339000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useautoscroll.mdx b/packages/docs-v2/content/docs/hooks/useautoscroll.mdx
new file mode 100644
index 00000000..94df0598
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useautoscroll.mdx
@@ -0,0 +1,47 @@
+---
+title: "useAutoScroll"
+description: "Hook that automatically scrolls a list element to the bottom"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useautoscroll.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useAutoScroll
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAutoScroll/useAutoScroll.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useAutoScroll/useAutoScroll.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useautoscroll.props.json b/packages/docs-v2/content/docs/hooks/useautoscroll.props.json
new file mode 100644
index 00000000..ddaa059b
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useautoscroll.props.json
@@ -0,0 +1,206 @@
+{
+ "name": "useAutoScroll",
+ "description": "Hook that automatically scrolls a list element to the bottom",
+ "examples": [
+ "useAutoScroll(ref);",
+ "const { ref } = useAutoScroll();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to auto-scroll",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element to auto-scroll",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to auto-scroll",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether auto-scrolling is enabled",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [options.enabled] Whether auto-scrolling is enabled",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether auto-scrolling is enabled",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether auto-scrolling is enabled",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {boolean} [options.enabled] Whether auto-scrolling is enabled",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether auto-scrolling is enabled",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "React ref to attach to the list element",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {{ ref: StateRef }} A React ref to attach to the list element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "React ref to attach to the list element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebatchedcallback.mdx b/packages/docs-v2/content/docs/hooks/usebatchedcallback.mdx
new file mode 100644
index 00000000..75bf414a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebatchedcallback.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBatchedCallback"
+description: "Hook that batches calls and forwards them to a callback"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebatchedcallback.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBatchedCallback
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBatchedCallback/useBatchedCallback.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBatchedCallback/useBatchedCallback.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebatchedcallback.props.json b/packages/docs-v2/content/docs/hooks/usebatchedcallback.props.json
new file mode 100644
index 00000000..d196486d
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebatchedcallback.props.json
@@ -0,0 +1,126 @@
+{
+ "name": "useBatchedCallback",
+ "description": "Hook that batches calls and forwards them to a callback",
+ "examples": [
+ "const batched = useBatchedCallback((batch) => console.log(batch), 5);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(batch: Params[]) => void",
+ "optional": false,
+ "description": "The callback that receives a batch of calls",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {(batch: Params[]) => void} callback The callback that receives a batch of calls",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(batch: Params[]) => void}",
+ "postType": " ",
+ "description": "The callback that receives a batch of calls",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "batchSize",
+ "type": "number",
+ "optional": false,
+ "description": "The maximum size of a batch before it is flushed",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} batchSize The maximum size of a batch before it is flushed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "batchSize",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The maximum size of a batch before it is flushed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "BatchedCallback",
+ "optional": false,
+ "description": "batched callback with flush and cancel helpers",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {BatchedCallback} The batched callback with flush and cancel helpers",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{BatchedCallback}",
+ "postType": " ",
+ "description": "batched callback with flush and cancel helpers",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1767877541000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebattery.mdx b/packages/docs-v2/content/docs/hooks/usebattery.mdx
new file mode 100644
index 00000000..7a5a326c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebattery.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBattery"
+description: "Hook for getting information about battery status"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebattery.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBattery
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBattery/useBattery.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBattery/useBattery.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebattery.props.json b/packages/docs-v2/content/docs/hooks/usebattery.props.json
new file mode 100644
index 00000000..178e1fec
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebattery.props.json
@@ -0,0 +1,86 @@
+{
+ "name": "useBattery",
+ "description": "Hook for getting information about battery status",
+ "examples": [
+ "const { supported, loading, charging, chargingTime, dischargingTime, level } = useBattery();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseBatteryStateReturn",
+ "optional": false,
+ "description": "containing battery information & Battery API support",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseBatteryStateReturn} Object containing battery information & Battery API support",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseBatteryStateReturn}",
+ "postType": " ",
+ "description": "containing battery information & Battery API support",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.getBattery",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "Nikita",
+ "avatar": "https://gravatar.com/avatar/cac51cebf1d47bc09276acf215a48514?d=retro"
+ },
+ {
+ "name": "Gorilla Dev",
+ "avatar": "https://gravatar.com/avatar/ca17ccb5824fdd8626a4ec87e904597b?d=retro"
+ }
+ ],
+ "lastModified": 1755779687000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebluetooth.mdx b/packages/docs-v2/content/docs/hooks/usebluetooth.mdx
new file mode 100644
index 00000000..a6ae6228
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebluetooth.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBluetooth"
+description: "Hook for getting information about bluetooth"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebluetooth.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBluetooth
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBluetooth/useBluetooth.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBluetooth/useBluetooth.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebluetooth.props.json b/packages/docs-v2/content/docs/hooks/usebluetooth.props.json
new file mode 100644
index 00000000..5d7f374a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebluetooth.props.json
@@ -0,0 +1,164 @@
+{
+ "name": "useBluetooth",
+ "description": "Hook for getting information about bluetooth",
+ "examples": [
+ "const { supported, connected, device, requestDevice, server } = useBluetooth(options);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.acceptAllDevices",
+ "type": "boolean",
+ "optional": true,
+ "description": "The options to request all Bluetooth devices",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [options.acceptAllDevices=false] The options to request all Bluetooth devices",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.acceptAllDevices=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The options to request all Bluetooth devices",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.filters",
+ "type": "Array",
+ "optional": true,
+ "description": "Array of filters to apply when scanning Bluetooth devices",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {Array} [options.filters] Array of filters to apply when scanning Bluetooth devices",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.filters]",
+ "postName": " ",
+ "type": "{Array}",
+ "postType": " ",
+ "description": "Array of filters to apply when scanning Bluetooth devices",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.optionalServices",
+ "type": "Array",
+ "optional": true,
+ "description": "Array of optional services that the application can use",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {Array} [options.optionalServices] Array of optional services that the application can use",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.optionalServices]",
+ "postName": " ",
+ "type": "{Array}",
+ "postType": " ",
+ "description": "Array of optional services that the application can use",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseBluetoothReturn",
+ "optional": false,
+ "description": "containing battery information & Battery API support",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseBluetoothReturn} Object containing battery information & Battery API support",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseBluetoothReturn}",
+ "postType": " ",
+ "description": "containing battery information & Battery API support",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.bluetooth",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ },
+ {
+ "name": "Gorilla Dev",
+ "avatar": "https://gravatar.com/avatar/ca17ccb5824fdd8626a4ec87e904597b?d=retro"
+ }
+ ],
+ "lastModified": 1756134040000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useboolean.mdx b/packages/docs-v2/content/docs/hooks/useboolean.mdx
new file mode 100644
index 00000000..81b628a1
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useboolean.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBoolean"
+description: "Hook provides opportunity to manage boolean state"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useboolean.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBoolean
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBoolean/useBoolean.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBoolean/useBoolean.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useboolean.props.json b/packages/docs-v2/content/docs/hooks/useboolean.props.json
new file mode 100644
index 00000000..ecbb8daa
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useboolean.props.json
@@ -0,0 +1,103 @@
+{
+ "name": "useBoolean",
+ "description": "Hook provides opportunity to manage boolean state",
+ "examples": [
+ "const [on, toggle] = useBoolean()"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "The initial boolean value",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {boolean} [initialValue=false] The initial boolean value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The initial boolean value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseBooleanReturn",
+ "optional": false,
+ "description": "object containing the boolean state value and utility functions to manipulate the state",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @returns {UseBooleanReturn} An object containing the boolean state value and utility functions to manipulate the state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseBooleanReturn}",
+ "postType": " ",
+ "description": "object containing the boolean state value and utility functions to manipulate the state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebreakpoints.mdx b/packages/docs-v2/content/docs/hooks/usebreakpoints.mdx
new file mode 100644
index 00000000..ed68b381
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebreakpoints.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBreakpoints"
+description: "Hook that manages breakpoints"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebreakpoints.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBreakpoints
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBreakpoints/useBreakpoints.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBreakpoints/useBreakpoints.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebreakpoints.props.json b/packages/docs-v2/content/docs/hooks/usebreakpoints.props.json
new file mode 100644
index 00000000..d20f68d3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebreakpoints.props.json
@@ -0,0 +1,131 @@
+{
+ "name": "useBreakpoints",
+ "description": "Hook that manages breakpoints",
+ "examples": [
+ "const { greater, smaller, between, current, active, ...breakpoints } = useBreakpoints({ mobile: 0, tablet: 640, laptop: 1024, desktop: 1280 });"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "breakpoints",
+ "type": "Breakpoints",
+ "optional": false,
+ "description": "The breakpoints to use",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Breakpoints} breakpoints The breakpoints to use",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "breakpoints",
+ "postName": " ",
+ "type": "{Breakpoints}",
+ "postType": " ",
+ "description": "The breakpoints to use",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "strategy",
+ "type": "UseBreakpointsStrategy",
+ "optional": true,
+ "description": "The strategy to use for matching",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {UseBreakpointsStrategy} [strategy=min-width] The strategy to use for matching",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[strategy=min-width]",
+ "postName": " ",
+ "type": "{UseBreakpointsStrategy}",
+ "postType": " ",
+ "description": "The strategy to use for matching",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "min-width"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseBreakpointsReturn",
+ "optional": false,
+ "description": "object containing the current breakpoint",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseBreakpointsReturn} An object containing the current breakpoint",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseBreakpointsReturn}",
+ "postType": " ",
+ "description": "object containing the current breakpoint",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1766052966000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebroadcastchannel.mdx b/packages/docs-v2/content/docs/hooks/usebroadcastchannel.mdx
new file mode 100644
index 00000000..cfec20b7
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebroadcastchannel.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBroadcastChannel"
+description: "that provides cross-tab/window communication"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebroadcastchannel.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBroadcastChannel
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBroadcastChannel/useBroadcastChannel.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBroadcastChannel/useBroadcastChannel.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebroadcastchannel.props.json b/packages/docs-v2/content/docs/hooks/usebroadcastchannel.props.json
new file mode 100644
index 00000000..1142647f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebroadcastchannel.props.json
@@ -0,0 +1,127 @@
+{
+ "name": "useBroadcastChannel",
+ "description": "that provides cross-tab/window communication",
+ "examples": [
+ "const { supported, data, post, error } = useBroadcastChannel('channel');"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "name",
+ "type": "string",
+ "optional": false,
+ "description": "The name of the channel",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} name The name of the channel",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "name",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The name of the channel",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "Function",
+ "optional": false,
+ "description": "A callback function that will be called when a message is received",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {Function} callback A callback function that will be called when a message is received",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{Function}",
+ "postType": " ",
+ "description": "A callback function that will be called when a message is received",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseBroadcastChannelReturn",
+ "optional": false,
+ "description": "object containing the channel state and controls",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseBroadcastChannelReturn} An object containing the channel state and controls",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseBroadcastChannelReturn}",
+ "postType": " ",
+ "description": "object containing the channel state and controls",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "BroadcastChannel",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usebrowserlanguage.mdx b/packages/docs-v2/content/docs/hooks/usebrowserlanguage.mdx
new file mode 100644
index 00000000..5e75fe2a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebrowserlanguage.mdx
@@ -0,0 +1,47 @@
+---
+title: "useBrowserLanguage"
+description: "Hook that returns the current browser language"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usebrowserlanguage.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useBrowserLanguage
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBrowserLanguage/useBrowserLanguage.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useBrowserLanguage/useBrowserLanguage.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usebrowserlanguage.props.json b/packages/docs-v2/content/docs/hooks/usebrowserlanguage.props.json
new file mode 100644
index 00000000..dd8b668f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usebrowserlanguage.props.json
@@ -0,0 +1,74 @@
+{
+ "name": "useBrowserLanguage",
+ "description": "Hook that returns the current browser language",
+ "examples": [
+ "const browserLanguage = useBrowserLanguage();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "string",
+ "optional": false,
+ "description": "current browser language",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {string} The current browser language",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "current browser language",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "user",
+ "browserapi": "navigator.language",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useclickoutside.mdx b/packages/docs-v2/content/docs/hooks/useclickoutside.mdx
new file mode 100644
index 00000000..55c0ec9e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useclickoutside.mdx
@@ -0,0 +1,47 @@
+---
+title: "useClickOutside"
+description: "Hook to handle click events outside the specified target element(s)"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useclickoutside.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useClickOutside
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useClickOutside/useClickOutside.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useClickOutside/useClickOutside.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useclickoutside.props.json b/packages/docs-v2/content/docs/hooks/useclickoutside.props.json
new file mode 100644
index 00000000..c7a2de1e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useclickoutside.props.json
@@ -0,0 +1,214 @@
+{
+ "name": "useClickOutside",
+ "description": "Hook to handle click events outside the specified target element(s)",
+ "examples": [
+ "useClickOutside(ref, () => console.log('click outside'));",
+ "const { ref } = useClickOutside(() => console.log('click outside'));"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element(s) to detect outside clicks for",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element(s) to detect outside clicks for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element(s) to detect outside clicks for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": false,
+ "description": "The callback to execute when a click outside the target is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback to execute when a click outside the target is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": false,
+ "description": "The callback to execute when a click outside the target is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback to execute when a click outside the target is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "ref to attach to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {{ ref: StateRef }} A ref to attach to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "ref to attach to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "yrsluv",
+ "avatar": "https://gravatar.com/avatar/48f994915a24fdc3e56810791e31598c?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useclipboard.mdx b/packages/docs-v2/content/docs/hooks/useclipboard.mdx
new file mode 100644
index 00000000..46f00725
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useclipboard.mdx
@@ -0,0 +1,47 @@
+---
+title: "useClipboard"
+description: "Hook that manages a copy to clipboard"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useclipboard.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useClipboard
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useClipboard/useClipboard.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useClipboard/useClipboard.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useclipboard.props.json b/packages/docs-v2/content/docs/hooks/useclipboard.props.json
new file mode 100644
index 00000000..fc9bb557
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useclipboard.props.json
@@ -0,0 +1,104 @@
+{
+ "name": "useClipboard",
+ "description": "Hook that manages a copy to clipboard",
+ "examples": [
+ "const { value, copy } = useClipboard();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "params.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether the copy to clipboard is enabled",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [params.enabled=false] Whether the copy to clipboard is enabled",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.enabled=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether the copy to clipboard is enabled",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseCopyToClipboardReturn",
+ "optional": false,
+ "description": "object containing the boolean state value and utility functions to manipulate the state",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseCopyToClipboardReturn} An object containing the boolean state value and utility functions to manipulate the state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseCopyToClipboardReturn}",
+ "postType": " ",
+ "description": "object containing the boolean state value and utility functions to manipulate the state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.clipboard",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "Nursultan Zianurov",
+ "avatar": "https://gravatar.com/avatar/af2b78fe5ca6acac294f81086f008afb?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useconst.mdx b/packages/docs-v2/content/docs/hooks/useconst.mdx
new file mode 100644
index 00000000..35c0c0f3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useconst.mdx
@@ -0,0 +1,47 @@
+---
+title: "useConst"
+description: "Hook that returns the constant value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useconst.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useConst
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useConst/useConst.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useConst/useConst.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useconst.props.json b/packages/docs-v2/content/docs/hooks/useconst.props.json
new file mode 100644
index 00000000..db7f9057
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useconst.props.json
@@ -0,0 +1,98 @@
+{
+ "name": "useConst",
+ "description": "Hook that returns the constant value",
+ "examples": [
+ "const value = useConst('value');"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "(() => Value) | Value",
+ "optional": false,
+ "description": "The initial value of the constant",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {(() => Value) | Value} initialValue The initial value of the constant",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialValue",
+ "postName": " ",
+ "type": "{(() => Value) | Value}",
+ "postType": " ",
+ "description": "The initial value of the constant",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "Value",
+ "optional": false,
+ "description": "constant value",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {Value} The constant value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "constant value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecontrollablestate.mdx b/packages/docs-v2/content/docs/hooks/usecontrollablestate.mdx
new file mode 100644
index 00000000..2d6bf90e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecontrollablestate.mdx
@@ -0,0 +1,47 @@
+---
+title: "useControllableState"
+description: "Hook that manages both controlled and uncontrolled state patterns"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecontrollablestate.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useControllableState
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useControllableState/useControllableState.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useControllableState/useControllableState.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecontrollablestate.props.json b/packages/docs-v2/content/docs/hooks/usecontrollablestate.props.json
new file mode 100644
index 00000000..e564073d
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecontrollablestate.props.json
@@ -0,0 +1,154 @@
+{
+ "name": "useControllableState",
+ "description": "Hook that manages both controlled and uncontrolled state patterns",
+ "examples": [
+ "const [value, setValue, isControlled] = useControllableState({ initialValue: 'initial' });"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.value",
+ "type": "Value",
+ "optional": true,
+ "description": "The controlled value. When provided, the component becomes controlled",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} [options.value] The controlled value. When provided, the component becomes controlled",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.value]",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The controlled value. When provided, the component becomes controlled",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "Value",
+ "optional": true,
+ "description": "The initial value for uncontrolled state",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Value} [options.initialValue] The initial value for uncontrolled state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue]",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The initial value for uncontrolled state",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "(value: Value) => void",
+ "optional": true,
+ "description": "The callback function called when the state changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {(value: Value) => void} [options.onChange] The callback function called when the state changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{(value: Value) => void}",
+ "postType": " ",
+ "description": "The callback function called when the state changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseControllableStateReturn",
+ "optional": false,
+ "description": "tuple containing the current value, setter function, and controlled flag",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseControllableStateReturn} A tuple containing the current value, setter function, and controlled flag",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseControllableStateReturn}",
+ "postType": " ",
+ "description": "tuple containing the current value, setter function, and controlled flag",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1757226836000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecookie.mdx b/packages/docs-v2/content/docs/hooks/usecookie.mdx
new file mode 100644
index 00000000..2e2b06c9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecookie.mdx
@@ -0,0 +1,47 @@
+---
+title: "useCookie"
+description: "Hook that manages cookie value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecookie.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useCookie
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCookie/useCookie.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCookie/useCookie.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecookie.props.json b/packages/docs-v2/content/docs/hooks/usecookie.props.json
new file mode 100644
index 00000000..e90e3f7b
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecookie.props.json
@@ -0,0 +1,321 @@
+{
+ "name": "useCookie",
+ "description": "Hook that manages cookie value",
+ "examples": [
+ "const { value, set, remove } = useCookie('key', 'value');"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "string",
+ "optional": false,
+ "description": "The key of the cookie",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} key The key of the cookie",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The key of the cookie",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "UseCookieInitialValue",
+ "optional": true,
+ "description": "The initial value of the cookie",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {UseCookieInitialValue} [initialValue] The initial value of the cookie",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue]",
+ "postName": " ",
+ "type": "{UseCookieInitialValue}",
+ "postType": " ",
+ "description": "The initial value of the cookie",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseCookieReturn",
+ "optional": false,
+ "description": "value and the set function",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseCookieReturn} The value and the set function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseCookieReturn}",
+ "postType": " ",
+ "description": "value and the set function",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "string",
+ "optional": false,
+ "description": "The key of the cookie",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {string} key The key of the cookie",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The key of the cookie",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseCookieOptions",
+ "optional": false,
+ "description": "The options object",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {UseCookieOptions} options The options object",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "options",
+ "postName": " ",
+ "type": "{UseCookieOptions}",
+ "postType": " ",
+ "description": "The options object",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "UseCookieInitialValue",
+ "optional": true,
+ "description": "The initial value of the cookie",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {UseCookieInitialValue} [options.initialValue] The initial value of the cookie",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue]",
+ "postName": " ",
+ "type": "{UseCookieInitialValue}",
+ "postType": " ",
+ "description": "The initial value of the cookie",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.deserializer",
+ "type": "(value: string) => Value",
+ "optional": true,
+ "description": "The deserializer function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {(value: string) => Value} [options.deserializer] The deserializer function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.deserializer]",
+ "postName": " ",
+ "type": "{(value: string) => Value}",
+ "postType": " ",
+ "description": "The deserializer function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.serializer",
+ "type": "(value: Value) => string",
+ "optional": true,
+ "description": "The serializer function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {(value: Value) => string} [options.serializer] The serializer function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.serializer]",
+ "postName": " ",
+ "type": "{(value: Value) => string}",
+ "postType": " ",
+ "description": "The serializer function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseCookieReturn",
+ "optional": false,
+ "description": "value and the set function",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @returns {UseCookieReturn} The value and the set function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseCookieReturn}",
+ "postType": " ",
+ "description": "value and the set function",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 20,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecookies.mdx b/packages/docs-v2/content/docs/hooks/usecookies.mdx
new file mode 100644
index 00000000..7d73a9de
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecookies.mdx
@@ -0,0 +1,47 @@
+---
+title: "useCookies"
+description: "Hook that manages cookie values"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecookies.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useCookies
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCookies/useCookies.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCookies/useCookies.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecookies.props.json b/packages/docs-v2/content/docs/hooks/usecookies.props.json
new file mode 100644
index 00000000..c054bcdf
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecookies.props.json
@@ -0,0 +1,73 @@
+{
+ "name": "useCookies",
+ "description": "Hook that manages cookie values",
+ "examples": [
+ "const { value, set, remove, getAll, clear } = useCookies();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseCookieReturn",
+ "optional": false,
+ "description": "value and the set function",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseCookieReturn} The value and the set function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseCookieReturn}",
+ "postType": " ",
+ "description": "value and the set function",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecopy.mdx b/packages/docs-v2/content/docs/hooks/usecopy.mdx
new file mode 100644
index 00000000..5ef5457c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecopy.mdx
@@ -0,0 +1,47 @@
+---
+title: "useCopy"
+description: "Hook that manages copying text with status reset"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecopy.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useCopy
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCopy/useCopy.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCopy/useCopy.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecopy.props.json b/packages/docs-v2/content/docs/hooks/usecopy.props.json
new file mode 100644
index 00000000..df167f2b
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecopy.props.json
@@ -0,0 +1,100 @@
+{
+ "name": "useCopy",
+ "description": "Hook that manages copying text with status reset",
+ "examples": [
+ "const { copied, value, copy } = useCopy();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": true,
+ "description": "Delay in ms before resetting copied status",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} [delay=1000] Delay in ms before resetting copied status",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[delay=1000]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Delay in ms before resetting copied status",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1000"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseCopyReturn",
+ "optional": false,
+ "description": "object containing the copied value, status and copy function",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseCopyReturn} An object containing the copied value, status and copy function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseCopyReturn}",
+ "postType": " ",
+ "description": "object containing the copied value, status and copy function",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.clipboard",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecounter.mdx b/packages/docs-v2/content/docs/hooks/usecounter.mdx
new file mode 100644
index 00000000..eca7375c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecounter.mdx
@@ -0,0 +1,47 @@
+---
+title: "useCounter"
+description: "Hook that manages a counter"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecounter.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useCounter
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCounter/useCounter.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCounter/useCounter.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecounter.props.json b/packages/docs-v2/content/docs/hooks/usecounter.props.json
new file mode 100644
index 00000000..2a4393a9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecounter.props.json
@@ -0,0 +1,296 @@
+{
+ "name": "useCounter",
+ "description": "Hook that manages a counter",
+ "examples": [
+ "const { count, dec, inc, reset, set } = useCounter(5);",
+ "const { count, dec, inc, reset, set } = useCounter({ initialValue: 5, min: 0, max: 10 });"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "number",
+ "optional": true,
+ "description": "The initial number value",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {number} [initialValue=0] The initial number value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue=0]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The initial number value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "0"
+ },
+ {
+ "tag": "param",
+ "name": "options.min",
+ "type": "number",
+ "optional": true,
+ "description": "The min of count value",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} [options.min=Number.NEGATIVE_INFINITY] The min of count value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.min=Number.NEGATIVE_INFINITY]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The min of count value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "Number.NEGATIVE_INFINITY"
+ },
+ {
+ "tag": "param",
+ "name": "options.max",
+ "type": "number",
+ "optional": true,
+ "description": "The max of count value",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {number} [options.max=Number.POSITIVE_INFINITY] The max of count value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.max=Number.POSITIVE_INFINITY]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The max of count value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "Number.POSITIVE_INFINITY"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseCounterReturn",
+ "optional": false,
+ "description": "object containing the current count and functions to interact with the counter",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseCounterReturn} An object containing the current count and functions to interact with the counter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseCounterReturn}",
+ "postType": " ",
+ "description": "object containing the current count and functions to interact with the counter",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": "",
+ "tokens": {
+ "start": "",
+ "delimiter": "",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "params.initialValue",
+ "type": "number",
+ "optional": true,
+ "description": "The initial number value",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {number} [params.initialValue=0] The initial number value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.initialValue=0]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The initial number value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "0"
+ },
+ {
+ "tag": "param",
+ "name": "params.min",
+ "type": "number",
+ "optional": true,
+ "description": "The min of count value",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {number} [params.min=Number.NEGATIVE_INFINITY] The min of count value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.min=Number.NEGATIVE_INFINITY]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The min of count value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "Number.NEGATIVE_INFINITY"
+ },
+ {
+ "tag": "param",
+ "name": "params.max",
+ "type": "number",
+ "optional": true,
+ "description": "The max of count value",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {number} [params.max=Number.POSITIVE_INFINITY] The max of count value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.max=Number.POSITIVE_INFINITY]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The max of count value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "Number.POSITIVE_INFINITY"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseCounterReturn",
+ "optional": false,
+ "description": "object containing the current count and functions to interact with the counter",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @returns {UseCounterReturn} An object containing the current count and functions to interact with the counter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseCounterReturn}",
+ "postType": " ",
+ "description": "object containing the current count and functions to interact with the counter",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 17,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usecssvar.mdx b/packages/docs-v2/content/docs/hooks/usecssvar.mdx
new file mode 100644
index 00000000..c8ddf9d3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecssvar.mdx
@@ -0,0 +1,47 @@
+---
+title: "useCssVar"
+description: "Hook that returns the value of a css variable"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usecssvar.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useCssVar
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCssVar/useCssVar.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useCssVar/useCssVar.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usecssvar.props.json b/packages/docs-v2/content/docs/hooks/usecssvar.props.json
new file mode 100644
index 00000000..3b33c3c0
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usecssvar.props.json
@@ -0,0 +1,262 @@
+{
+ "name": "useCssVar",
+ "description": "Hook that returns the value of a css variable",
+ "examples": [
+ "const { ref, value, set, remove } = useCssVar('--color', 'red');",
+ "const { value, set, remove } = useCssVar(ref, '--color', 'red');"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "string",
+ "optional": false,
+ "description": "The CSS variable key",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {string} key The CSS variable key",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The CSS variable key",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": false,
+ "description": "The initial value of the CSS variable",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} initialValue The initial value of the CSS variable",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialValue",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial value of the CSS variable",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseCssVarReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object containing the value of the CSS variable and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseCssVarReturn & { ref: StateRef }} The object containing the value of the CSS variable and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseCssVarReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the value of the CSS variable and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {HookTarget} target The target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "string",
+ "optional": false,
+ "description": "The CSS variable key",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {string} key The CSS variable key",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The CSS variable key",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": false,
+ "description": "The initial value of the CSS variable",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {string} initialValue The initial value of the CSS variable",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialValue",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial value of the CSS variable",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseCssVarReturn",
+ "optional": false,
+ "description": "object containing the value of the CSS variable",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @returns {UseCssVarReturn} The object containing the value of the CSS variable",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseCssVarReturn}",
+ "postType": " ",
+ "description": "object containing the value of the CSS variable",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 19,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncecallback.mdx b/packages/docs-v2/content/docs/hooks/usedebouncecallback.mdx
new file mode 100644
index 00000000..87a59a21
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncecallback.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDebounceCallback"
+description: "Hook that creates a debounced callback"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedebouncecallback.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDebounceCallback
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceCallback/useDebounceCallback.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceCallback/useDebounceCallback.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncecallback.props.json b/packages/docs-v2/content/docs/hooks/usedebouncecallback.props.json
new file mode 100644
index 00000000..7538a463
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncecallback.props.json
@@ -0,0 +1,130 @@
+{
+ "name": "useDebounceCallback",
+ "description": "Hook that creates a debounced callback",
+ "examples": [
+ "const debouncedCallback = useDebounceCallback(() => console.log('callback'), 500);"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(...args: Params) => Return",
+ "optional": false,
+ "description": "The callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(...args: Params) => Return} callback The callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(...args: Params) => Return}",
+ "postType": " ",
+ "description": "The callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": false,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {number} delay The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "delay",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "(...args: Params) => Return",
+ "optional": false,
+ "description": "callback with debounce",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {(...args: Params) => Return} The callback with debounce",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{(...args: Params) => Return}",
+ "postType": " ",
+ "description": "callback with debounce",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedebounceeffect.mdx b/packages/docs-v2/content/docs/hooks/usedebounceeffect.mdx
new file mode 100644
index 00000000..b90387e9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebounceeffect.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDebounceEffect"
+description: "Hook that runs an effect after a delay when dependencies change"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedebounceeffect.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDebounceEffect
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceEffect/useDebounceEffect.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceEffect/useDebounceEffect.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedebounceeffect.props.json b/packages/docs-v2/content/docs/hooks/usedebounceeffect.props.json
new file mode 100644
index 00000000..a3139487
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebounceeffect.props.json
@@ -0,0 +1,127 @@
+{
+ "name": "useDebounceEffect",
+ "description": "Hook that runs an effect after a delay when dependencies change",
+ "examples": [
+ "useDebounceEffect(() => console.log('effect'), 500, [value]);"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "effect",
+ "type": "EffectCallback",
+ "optional": false,
+ "description": "The effect callback to run",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {EffectCallback} effect The effect callback to run",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "effect",
+ "postName": " ",
+ "type": "{EffectCallback}",
+ "postType": " ",
+ "description": "The effect callback to run",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": false,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {number} delay The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "delay",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "deps",
+ "type": "DependencyList",
+ "optional": false,
+ "description": "The dependencies list for the effect",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {DependencyList} deps The dependencies list for the effect",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "deps",
+ "postName": " ",
+ "type": "{DependencyList}",
+ "postType": " ",
+ "description": "The dependencies list for the effect",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768590847000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncestate.mdx b/packages/docs-v2/content/docs/hooks/usedebouncestate.mdx
new file mode 100644
index 00000000..624261b3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncestate.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDebounceState"
+description: "Hook that creates a debounced state"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedebouncestate.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDebounceState
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceState/useDebounceState.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceState/useDebounceState.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncestate.props.json b/packages/docs-v2/content/docs/hooks/usedebouncestate.props.json
new file mode 100644
index 00000000..396d3954
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncestate.props.json
@@ -0,0 +1,126 @@
+{
+ "name": "useDebounceState",
+ "description": "Hook that creates a debounced state",
+ "examples": [
+ "const [debouncedValue, setDebouncedValue] = useDebounceState(value, 500);"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "value",
+ "type": "Value",
+ "optional": false,
+ "description": "The value to be debounced",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} value The value to be debounced",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "value",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The value to be debounced",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": false,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} delay The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "delay",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "[Value, (value: Value) => void]",
+ "optional": false,
+ "description": "debounced state",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {[Value, (value: Value) => void]} The debounced state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{[Value, (value: Value) => void]}",
+ "postType": " ",
+ "description": "debounced state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1756623419000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncevalue.mdx b/packages/docs-v2/content/docs/hooks/usedebouncevalue.mdx
new file mode 100644
index 00000000..660e9e4f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncevalue.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDebounceValue"
+description: "Hook that creates a debounced value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedebouncevalue.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDebounceValue
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceValue/useDebounceValue.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDebounceValue/useDebounceValue.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedebouncevalue.props.json b/packages/docs-v2/content/docs/hooks/usedebouncevalue.props.json
new file mode 100644
index 00000000..90cdc34f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedebouncevalue.props.json
@@ -0,0 +1,130 @@
+{
+ "name": "useDebounceValue",
+ "description": "Hook that creates a debounced value",
+ "examples": [
+ "const debouncedValue = useDebounceValue(value, 500);"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "value",
+ "type": "Value",
+ "optional": false,
+ "description": "The value to be debounced",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} value The value to be debounced",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "value",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The value to be debounced",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": false,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} delay The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "delay",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "Value",
+ "optional": false,
+ "description": "debounced value",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {Value} The debounced value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "debounced value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedefault.mdx b/packages/docs-v2/content/docs/hooks/usedefault.mdx
new file mode 100644
index 00000000..be876e63
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedefault.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDefault"
+description: "Hook that returns the default value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedefault.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDefault
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDefault/useDefault.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDefault/useDefault.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedefault.props.json b/packages/docs-v2/content/docs/hooks/usedefault.props.json
new file mode 100644
index 00000000..311bff62
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedefault.props.json
@@ -0,0 +1,130 @@
+{
+ "name": "useDefault",
+ "description": "Hook that returns the default value",
+ "examples": [
+ "const [value, setValue] = useDefault(initialValue, defaultValue);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "Value",
+ "optional": false,
+ "description": "The initial value",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} initialValue The initial value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialValue",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The initial value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "defaultValue",
+ "type": "Value",
+ "optional": false,
+ "description": "The default value",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Value} defaultValue The default value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "defaultValue",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The default value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "[Value, (value: Value) => void]",
+ "optional": false,
+ "description": "array containing the current value and a function to set the value",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {[Value, (value: Value) => void]} An array containing the current value and a function to set the value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{[Value, (value: Value) => void]}",
+ "postType": " ",
+ "description": "array containing the current value and a function to set the value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedevicemotion.mdx b/packages/docs-v2/content/docs/hooks/usedevicemotion.mdx
new file mode 100644
index 00000000..e92d1e0a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedevicemotion.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDeviceMotion"
+description: "Hook that work with device motion"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedevicemotion.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDeviceMotion
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDeviceMotion/useDeviceMotion.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDeviceMotion/useDeviceMotion.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedevicemotion.props.json b/packages/docs-v2/content/docs/hooks/usedevicemotion.props.json
new file mode 100644
index 00000000..03410e51
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedevicemotion.props.json
@@ -0,0 +1,376 @@
+{
+ "name": "useDeviceMotion",
+ "description": "Hook that work with device motion",
+ "examples": [
+ "const { interval, rotationRate, acceleration, accelerationIncludingGravity } = useDeviceMotion(500, (event) => console.log(event));",
+ "const { interval, rotationRate, acceleration, accelerationIncludingGravity } = useDeviceMotion((event) => console.log(event));",
+ "const { interval, rotationRate, acceleration, accelerationIncludingGravity } = useDeviceMotion();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "delay",
+ "type": "number",
+ "optional": true,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {number} [delay=1000] The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[delay=1000]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1000"
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: DeviceMotionEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {(event: DeviceMotionEvent) => void} [callback] The callback function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: DeviceMotionEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDeviceMotionReturn",
+ "optional": false,
+ "description": "device motion data and interval",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseDeviceMotionReturn} The device motion data and interval",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDeviceMotionReturn}",
+ "postType": " ",
+ "description": "device motion data and interval",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: DeviceMotionEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {(event: DeviceMotionEvent) => void} [callback] The callback function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: DeviceMotionEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDeviceMotionReturn",
+ "optional": false,
+ "description": "device motion data and interval",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @returns {UseDeviceMotionReturn} The device motion data and interval",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDeviceMotionReturn}",
+ "postType": " ",
+ "description": "device motion data and interval",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 19,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseDeviceMotionOptions",
+ "optional": true,
+ "description": "Configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 24,
+ "source": " * @param {UseDeviceMotionOptions} [options] Configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseDeviceMotionOptions}",
+ "postType": " ",
+ "description": "Configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.delay",
+ "type": "number",
+ "optional": true,
+ "description": "The delay in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @param {number} [options.delay] The delay in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.delay]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The delay in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether to enable the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 26,
+ "source": " * @param {boolean} [options.enabled] Whether to enable the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether to enable the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "(event: DeviceMotionEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 27,
+ "source": " * @param {(event: DeviceMotionEvent) => void} [options.onChange] The callback function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{(event: DeviceMotionEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDeviceMotionReturn",
+ "optional": false,
+ "description": "device motion data and interval",
+ "problems": [],
+ "source": [
+ {
+ "number": 28,
+ "source": " * @returns {UseDeviceMotionReturn} The device motion data and interval",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDeviceMotionReturn}",
+ "postType": " ",
+ "description": "device motion data and interval",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 29,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "browserapi": "DeviceMotionEvent",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "Michael Mironychev",
+ "avatar": "https://gravatar.com/avatar/2297f45bf2e5b21ece9e04b819a0c8ac?d=retro"
+ }
+ ],
+ "lastModified": 1759122403000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedeviceorientation.mdx b/packages/docs-v2/content/docs/hooks/usedeviceorientation.mdx
new file mode 100644
index 00000000..136267ec
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedeviceorientation.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDeviceOrientation"
+description: "Hook that provides the current device orientation"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedeviceorientation.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDeviceOrientation
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDeviceOrientation/useDeviceOrientation.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDeviceOrientation/useDeviceOrientation.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedeviceorientation.props.json b/packages/docs-v2/content/docs/hooks/usedeviceorientation.props.json
new file mode 100644
index 00000000..07d681c7
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedeviceorientation.props.json
@@ -0,0 +1,74 @@
+{
+ "name": "useDeviceOrientation",
+ "description": "Hook that provides the current device orientation",
+ "examples": [
+ "const { supported, value } = useDeviceOrientation();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDeviceOrientationReturn",
+ "optional": false,
+ "description": "current device orientation",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseDeviceOrientationReturn} The current device orientation",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDeviceOrientationReturn}",
+ "postType": " ",
+ "description": "current device orientation",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "browserapi": "DeviceOrientationEvent",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedevicepixelratio.mdx b/packages/docs-v2/content/docs/hooks/usedevicepixelratio.mdx
new file mode 100644
index 00000000..9348f1da
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedevicepixelratio.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDevicePixelRatio"
+description: "Hook that returns the device's pixel ratio"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedevicepixelratio.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDevicePixelRatio
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDevicePixelRatio/useDevicePixelRatio.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDevicePixelRatio/useDevicePixelRatio.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedevicepixelratio.props.json b/packages/docs-v2/content/docs/hooks/usedevicepixelratio.props.json
new file mode 100644
index 00000000..e3acca91
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedevicepixelratio.props.json
@@ -0,0 +1,74 @@
+{
+ "name": "useDevicePixelRatio",
+ "description": "Hook that returns the device's pixel ratio",
+ "examples": [
+ "const { supported, ratio } = useDevicePixelRatio();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDevicePixelRatioReturn",
+ "optional": false,
+ "description": "ratio and supported flag",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseDevicePixelRatioReturn} The ratio and supported flag",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDevicePixelRatioReturn}",
+ "postType": " ",
+ "description": "ratio and supported flag",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "browserapi": "window.devicePixelRatio",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "Artem Dereviago",
+ "avatar": "https://gravatar.com/avatar/8a325a7b2b80fc575dc5c92eb0301a13?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedidupdate.mdx b/packages/docs-v2/content/docs/hooks/usedidupdate.mdx
new file mode 100644
index 00000000..18fd7f5c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedidupdate.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDidUpdate"
+description: "Hook that triggers the effect callback on updates"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedidupdate.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDidUpdate
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDidUpdate/useDidUpdate.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDidUpdate/useDidUpdate.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedidupdate.props.json b/packages/docs-v2/content/docs/hooks/usedidupdate.props.json
new file mode 100644
index 00000000..b704838e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedidupdate.props.json
@@ -0,0 +1,111 @@
+{
+ "name": "useDidUpdate",
+ "description": "Hook that triggers the effect callback on updates",
+ "examples": [
+ "useDidUpdate(() => console.log(\"effect runs on updates\"), deps);"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "effect",
+ "type": "EffectCallback",
+ "optional": false,
+ "description": "The effect callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {EffectCallback} effect The effect callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "effect",
+ "postName": " ",
+ "type": "{EffectCallback}",
+ "postType": " ",
+ "description": "The effect callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "deps",
+ "type": "DependencyList",
+ "optional": true,
+ "description": "The dependencies list for the effect",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {DependencyList} [deps] The dependencies list for the effect",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[deps]",
+ "postName": " ",
+ "type": "{DependencyList}",
+ "postType": " ",
+ "description": "The dependencies list for the effect",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "lifecycle",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "Erik",
+ "avatar": "https://gravatar.com/avatar/2f983eb0842eb75e8d805628fbae1492?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "wmoooid",
+ "avatar": "https://gravatar.com/avatar/53a7c217f9692b54a7da63ae40f1743b?d=retro"
+ }
+ ],
+ "lastModified": 1768590847000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedisclosure.mdx b/packages/docs-v2/content/docs/hooks/usedisclosure.mdx
new file mode 100644
index 00000000..24ccbd2c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedisclosure.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDisclosure"
+description: "Hook that allows you to open and close a modal"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedisclosure.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDisclosure
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDisclosure/useDisclosure.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDisclosure/useDisclosure.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedisclosure.props.json b/packages/docs-v2/content/docs/hooks/usedisclosure.props.json
new file mode 100644
index 00000000..b8ba1ffa
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedisclosure.props.json
@@ -0,0 +1,159 @@
+{
+ "name": "useDisclosure",
+ "description": "Hook that allows you to open and close a modal",
+ "examples": [
+ "const { opened, open, close, toggle } = useDisclosure();"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "The initial value of the component",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {boolean} [initialValue=false] The initial value of the component",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The initial value of the component",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.onOpen",
+ "type": "() => void",
+ "optional": true,
+ "description": "The callback function to be invoked on open",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {() => void} [options.onOpen] The callback function to be invoked on open",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onOpen]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on open",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onClose",
+ "type": "() => void",
+ "optional": true,
+ "description": "The callback function to be invoked on close",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {() => void} [options.onClose] The callback function to be invoked on close",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onClose]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on close",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseDisclosureReturn",
+ "optional": false,
+ "description": "object with the opened, open, close, and toggle properties",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseDisclosureReturn} An object with the opened, open, close, and toggle properties",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseDisclosureReturn}",
+ "postType": " ",
+ "description": "object with the opened, open, close, and toggle properties",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1768411966000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedisplaymedia.mdx b/packages/docs-v2/content/docs/hooks/usedisplaymedia.mdx
new file mode 100644
index 00000000..fbb2d164
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedisplaymedia.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDisplayMedia"
+description: "Hook that provides screen sharing functionality"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedisplaymedia.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDisplayMedia
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDisplayMedia/useDisplayMedia.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDisplayMedia/useDisplayMedia.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedisplaymedia.props.json b/packages/docs-v2/content/docs/hooks/usedisplaymedia.props.json
new file mode 100644
index 00000000..8a5ba78e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedisplaymedia.props.json
@@ -0,0 +1,321 @@
+{
+ "name": "useDisplayMedia",
+ "description": "Hook that provides screen sharing functionality",
+ "examples": [
+ "const { stream, sharing, start, stop } = useDisplayMedia(ref);",
+ "const { ref, stream, sharing, start, stop } = useDisplayMedia();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target video element to display the media stream",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {HookTarget} target The target video element to display the media stream",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target video element to display the media stream",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.audio",
+ "type": "boolean | MediaTrackConstraints",
+ "optional": true,
+ "description": "Whether to enable audio sharing",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean | MediaTrackConstraints} [options.audio] Whether to enable audio sharing",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.audio]",
+ "postName": " ",
+ "type": "{boolean | MediaTrackConstraints}",
+ "postType": " ",
+ "description": "Whether to enable audio sharing",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.immediately",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether to start immediately",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {boolean} [options.immediately=false] Whether to start immediately",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.immediately=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether to start immediately",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.video",
+ "type": "boolean | MediaTrackConstraints",
+ "optional": true,
+ "description": "Whether to enable video sharing",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {boolean | MediaTrackConstraints} [options.video] Whether to enable video sharing",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.video]",
+ "postName": " ",
+ "type": "{boolean | MediaTrackConstraints}",
+ "postType": " ",
+ "description": "Whether to enable video sharing",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseDisplayMediaReturn",
+ "optional": false,
+ "description": "containing stream, sharing status and control methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @returns {UseDisplayMediaReturn} Object containing stream, sharing status and control methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseDisplayMediaReturn}",
+ "postType": " ",
+ "description": "containing stream, sharing status and control methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 14,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.audio",
+ "type": "boolean | MediaTrackConstraints",
+ "optional": true,
+ "description": "Whether to enable audio sharing",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {boolean | MediaTrackConstraints} [options.audio] Whether to enable audio sharing",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.audio]",
+ "postName": " ",
+ "type": "{boolean | MediaTrackConstraints}",
+ "postType": " ",
+ "description": "Whether to enable audio sharing",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.immediately",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether to start immediately",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {boolean} [options.immediately=false] Whether to start immediately",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.immediately=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether to start immediately",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.video",
+ "type": "boolean | MediaTrackConstraints",
+ "optional": true,
+ "description": "Whether to enable video sharing",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @param {boolean | MediaTrackConstraints} [options.video] Whether to enable video sharing",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.video]",
+ "postName": " ",
+ "type": "{boolean | MediaTrackConstraints}",
+ "postType": " ",
+ "description": "Whether to enable video sharing",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseDisplayMediaReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "containing stream, sharing status, control methods and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @returns {UseDisplayMediaReturn & { ref: StateRef }} Object containing stream, sharing status, control methods and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseDisplayMediaReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "containing stream, sharing status, control methods and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 24,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "mediaDevices.getDisplayMedia",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedocumentevent.mdx b/packages/docs-v2/content/docs/hooks/usedocumentevent.mdx
new file mode 100644
index 00000000..25d70246
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumentevent.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDocumentEvent"
+description: "Hook attaches an event listener to the document object for the specified event"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedocumentevent.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDocumentEvent
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentEvent/useDocumentEvent.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentEvent/useDocumentEvent.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedocumentevent.props.json b/packages/docs-v2/content/docs/hooks/usedocumentevent.props.json
new file mode 100644
index 00000000..4abd8318
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumentevent.props.json
@@ -0,0 +1,158 @@
+{
+ "name": "useDocumentEvent",
+ "description": "Hook attaches an event listener to the document object for the specified event",
+ "examples": [
+ "useDocumentEvent('click', () => console.log('clicked'));"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "event",
+ "type": "Event",
+ "optional": false,
+ "description": "The event to listen for.",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Event} event The event to listen for.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "event",
+ "postName": " ",
+ "type": "{Event}",
+ "postType": " ",
+ "description": "The event to listen for.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "listener",
+ "type": "(event: DocumentEventMap[Event]) => void",
+ "optional": false,
+ "description": "The callback function to be executed when the event is triggered",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: DocumentEventMap[Event]) => void} listener The callback function to be executed when the event is triggered",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "listener",
+ "postName": " ",
+ "type": "{(event: DocumentEventMap[Event]) => void}",
+ "postType": " ",
+ "description": "The callback function to be executed when the event is triggered",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventListenerOptions",
+ "optional": true,
+ "description": "The options for the event listener",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {UseEventListenerOptions} [options] The options for the event listener",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseEventListenerOptions}",
+ "postType": " ",
+ "description": "The options for the event listener",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1760199218000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedocumenttitle.mdx b/packages/docs-v2/content/docs/hooks/usedocumenttitle.mdx
new file mode 100644
index 00000000..ed06027b
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumenttitle.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDocumentTitle"
+description: "Hook that manages the document title and allows updating it"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedocumenttitle.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDocumentTitle
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentTitle/useDocumentTitle.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentTitle/useDocumentTitle.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedocumenttitle.props.json b/packages/docs-v2/content/docs/hooks/usedocumenttitle.props.json
new file mode 100644
index 00000000..b8583ca9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumenttitle.props.json
@@ -0,0 +1,135 @@
+{
+ "name": "useDocumentTitle",
+ "description": "Hook that manages the document title and allows updating it",
+ "examples": [
+ "const { value, set } = useDocumentTitle();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": true,
+ "description": "The initial title. If not provided, the current document title will be used",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} [initialValue] The initial title. If not provided, the current document title will be used",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial title. If not provided, the current document title will be used",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.restoreOnUnmount",
+ "type": "boolean",
+ "optional": true,
+ "description": "Restore the previous title on unmount",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {boolean} [options.restoreOnUnmount] Restore the previous title on unmount",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.restoreOnUnmount]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Restore the previous title on unmount",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseDocumentTitleReturn",
+ "optional": false,
+ "description": "array containing the current title and a function to update the title",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseDocumentTitleReturn} An array containing the current title and a function to update the title",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseDocumentTitleReturn}",
+ "postType": " ",
+ "description": "array containing the current title and a function to update the title",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "document.title",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "Vitalij Ryndin",
+ "avatar": "https://gravatar.com/avatar/718a009ae847dbd10c543a540fa84eee?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedocumentvisibility.mdx b/packages/docs-v2/content/docs/hooks/usedocumentvisibility.mdx
new file mode 100644
index 00000000..554e6b73
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumentvisibility.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDocumentVisibility"
+description: "Hook that provides the current visibility state of the document"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedocumentvisibility.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDocumentVisibility
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentVisibility/useDocumentVisibility.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDocumentVisibility/useDocumentVisibility.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedocumentvisibility.props.json b/packages/docs-v2/content/docs/hooks/usedocumentvisibility.props.json
new file mode 100644
index 00000000..04a1bd53
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedocumentvisibility.props.json
@@ -0,0 +1,77 @@
+{
+ "name": "useDocumentVisibility",
+ "description": "Hook that provides the current visibility state of the document",
+ "examples": [
+ "const visibilityState = useDocumentVisibility();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "DocumentVisibilityState",
+ "optional": false,
+ "description": "current visibility state of the document, which can be 'visible' or 'hidden'",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @returns {DocumentVisibilityState} The current visibility state of the document, which can be 'visible' or 'hidden'",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{DocumentVisibilityState}",
+ "postType": " ",
+ "description": "current visibility state of the document, which can be 'visible' or 'hidden'",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 7,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "wmoooid",
+ "avatar": "https://gravatar.com/avatar/53a7c217f9692b54a7da63ae40f1743b?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedoubleclick.mdx b/packages/docs-v2/content/docs/hooks/usedoubleclick.mdx
new file mode 100644
index 00000000..74606bcc
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedoubleclick.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDoubleClick"
+description: "Hook that defines the logic when double clicking an element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedoubleclick.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDoubleClick
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDoubleClick/useDoubleClick.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDoubleClick/useDoubleClick.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedoubleclick.props.json b/packages/docs-v2/content/docs/hooks/usedoubleclick.props.json
new file mode 100644
index 00000000..76dfb935
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedoubleclick.props.json
@@ -0,0 +1,262 @@
+{
+ "name": "useDoubleClick",
+ "description": "Hook that defines the logic when double clicking an element",
+ "examples": [
+ "useDoubleClick(ref, () => console.log('double clicked'));",
+ "const { ref } = useDoubleClick(() => console.log('double clicked'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to be double clicked",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element to be double clicked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to be double clicked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: DoubleClickEvents) => void",
+ "optional": false,
+ "description": "The callback function to be invoked on double click",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: DoubleClickEvents) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on double click",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseDoubleClickOptions",
+ "optional": true,
+ "description": "The options for the double click",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {UseDoubleClickOptions} [options] The options for the double click",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseDoubleClickOptions}",
+ "postType": " ",
+ "description": "The options for the double click",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "void",
+ "optional": false,
+ "description": "double clicking state",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {void} The double clicking state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{void}",
+ "postType": " ",
+ "description": "double clicking state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: DoubleClickEvents) => void",
+ "optional": false,
+ "description": "The callback function to be invoked on double click",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: DoubleClickEvents) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on double click",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseDoubleClickOptions",
+ "optional": true,
+ "description": "The options for the double click",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {UseDoubleClickOptions} [options] The options for the double click",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseDoubleClickOptions}",
+ "postType": " ",
+ "description": "The options for the double click",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "double clicking state",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @returns {{ ref: StateRef }} The double clicking state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "double clicking state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 20,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usedropzone.mdx b/packages/docs-v2/content/docs/hooks/usedropzone.mdx
new file mode 100644
index 00000000..77a9c5f9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedropzone.mdx
@@ -0,0 +1,47 @@
+---
+title: "useDropZone"
+description: "Hook that provides drop zone functionality"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usedropzone.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useDropZone
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDropZone/useDropZone.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useDropZone/useDropZone.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usedropzone.props.json b/packages/docs-v2/content/docs/hooks/usedropzone.props.json
new file mode 100644
index 00000000..1a8ac909
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usedropzone.props.json
@@ -0,0 +1,682 @@
+{
+ "name": "useDropZone",
+ "description": "Hook that provides drop zone functionality",
+ "examples": [
+ "const { overed, files } = useDropZone(ref, options);",
+ "const { overed, files } = useDropZone(ref, () => console.log('callback'));",
+ "const { ref, overed, files } = useDropZone(options);",
+ "const { ref, overed, files } = useDropZone(() => console.log('callback'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "Target",
+ "optional": false,
+ "description": "The target element drop zone's",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Target} target The target element drop zone's",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{Target}",
+ "postType": " ",
+ "description": "The target element drop zone's",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.dataTypes",
+ "type": "DataTypes",
+ "optional": true,
+ "description": "The data types",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {DataTypes} [options.dataTypes] The data types",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.dataTypes]",
+ "postName": " ",
+ "type": "{DataTypes}",
+ "postType": " ",
+ "description": "The data types",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.multiple",
+ "type": "boolean",
+ "optional": true,
+ "description": "The multiple mode",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean} [options.multiple] The multiple mode",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.multiple]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The multiple mode",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onDrop",
+ "type": "(files: File[] | null, event: DragEvent) => void",
+ "optional": true,
+ "description": "The on drop callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {(files: File[] | null, event: DragEvent) => void} [options.onDrop] The on drop callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onDrop]",
+ "postName": " ",
+ "type": "{(files: File[] | null, event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on drop callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onEnter",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on enter callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {(event: DragEvent) => void} [options.onEnter] The on enter callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEnter]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on enter callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onLeave",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on leave callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {(event: DragEvent) => void} [options.onLeave] The on leave callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onLeave]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on leave callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onOver",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on over callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {(event: DragEvent) => void} [options.onOver] The on over callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onOver]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on over callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDropZoneReturn",
+ "optional": false,
+ "description": "object with drop zone states",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @returns {UseDropZoneReturn} The object with drop zone states",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDropZoneReturn}",
+ "postType": " ",
+ "description": "object with drop zone states",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 16,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "Target",
+ "optional": false,
+ "description": "The target element drop zone's",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {Target} target The target element drop zone's",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{Target}",
+ "postType": " ",
+ "description": "The target element drop zone's",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(files: File[] | null, event: DragEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on drop",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @param {(files: File[] | null, event: DragEvent) => void} [callback] The callback function to be invoked on drop",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(files: File[] | null, event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on drop",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDropZoneReturn",
+ "optional": false,
+ "description": "object with drop zone states",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @returns {UseDropZoneReturn} The object with drop zone states",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDropZoneReturn}",
+ "postType": " ",
+ "description": "object with drop zone states",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 24,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.dataTypes",
+ "type": "DataTypes",
+ "optional": true,
+ "description": "The data types",
+ "problems": [],
+ "source": [
+ {
+ "number": 29,
+ "source": " * @param {DataTypes} [options.dataTypes] The data types",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.dataTypes]",
+ "postName": " ",
+ "type": "{DataTypes}",
+ "postType": " ",
+ "description": "The data types",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.multiple",
+ "type": "boolean",
+ "optional": true,
+ "description": "The multiple mode",
+ "problems": [],
+ "source": [
+ {
+ "number": 30,
+ "source": " * @param {boolean} [options.multiple] The multiple mode",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.multiple]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The multiple mode",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onDrop",
+ "type": "(files: File[] | null, event: DragEvent) => void",
+ "optional": true,
+ "description": "The on drop callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 31,
+ "source": " * @param {(files: File[] | null, event: DragEvent) => void} [options.onDrop] The on drop callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onDrop]",
+ "postName": " ",
+ "type": "{(files: File[] | null, event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on drop callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onEnter",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on enter callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 32,
+ "source": " * @param {(event: DragEvent) => void} [options.onEnter] The on enter callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEnter]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on enter callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onLeave",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on leave callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 33,
+ "source": " * @param {(event: DragEvent) => void} [options.onLeave] The on leave callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onLeave]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on leave callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onOver",
+ "type": "(event: DragEvent) => void",
+ "optional": true,
+ "description": "The on over callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 34,
+ "source": " * @param {(event: DragEvent) => void} [options.onOver] The on over callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onOver]",
+ "postName": " ",
+ "type": "{(event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The on over callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDropZoneReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object with drop zone states and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 35,
+ "source": " * @returns {UseDropZoneReturn & { ref: StateRef }} The object with drop zone states and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDropZoneReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object with drop zone states and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 36,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(files: File[] | null, event: DragEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on drop",
+ "problems": [],
+ "source": [
+ {
+ "number": 41,
+ "source": " * @param {(files: File[] | null, event: DragEvent) => void} [callback] The callback function to be invoked on drop",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(files: File[] | null, event: DragEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on drop",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseDropZoneReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object with drop zone states and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 42,
+ "source": " * @returns {UseDropZoneReturn & { ref: StateRef }} The object with drop zone states and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseDropZoneReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object with drop zone states and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 43,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ },
+ {
+ "name": "VLADISLAW9",
+ "avatar": "https://gravatar.com/avatar/cf96a05801360c131eb784ebbe781f99?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useevent.mdx b/packages/docs-v2/content/docs/hooks/useevent.mdx
new file mode 100644
index 00000000..c16a472d
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useevent.mdx
@@ -0,0 +1,47 @@
+---
+title: "useEvent"
+description: "Hook that creates an event and returns a stable reference of it"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useevent.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useEvent
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEvent/useEvent.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEvent/useEvent.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useevent.props.json b/packages/docs-v2/content/docs/hooks/useevent.props.json
new file mode 100644
index 00000000..3f6d32f3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useevent.props.json
@@ -0,0 +1,102 @@
+{
+ "name": "useEvent",
+ "description": "Hook that creates an event and returns a stable reference of it",
+ "examples": [
+ "const onClick = useEvent(() => console.log('clicked'));"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(...args: Params) => Return",
+ "optional": false,
+ "description": "The callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(...args: Params) => Return} callback The callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(...args: Params) => Return}",
+ "postType": " ",
+ "description": "The callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "(...args: Params) => Return",
+ "optional": false,
+ "description": "callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {(...args: Params) => Return} The callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{(...args: Params) => Return}",
+ "postType": " ",
+ "description": "callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useeventlistener.mdx b/packages/docs-v2/content/docs/hooks/useeventlistener.mdx
new file mode 100644
index 00000000..377e3bb9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeventlistener.mdx
@@ -0,0 +1,47 @@
+---
+title: "useEventListener"
+description: "Hook that attaches an event listener to the specified target"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useeventlistener.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useEventListener
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEventListener/useEventListener.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEventListener/useEventListener.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useeventlistener.props.json b/packages/docs-v2/content/docs/hooks/useeventlistener.props.json
new file mode 100644
index 00000000..73b510e1
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeventlistener.props.json
@@ -0,0 +1,646 @@
+{
+ "name": "useEventListener",
+ "description": "Hook that attaches an event listener to the specified target",
+ "examples": [
+ "useEventListener(window, 'click', () => console.log('click'));",
+ "useEventListener(document, 'click', () => console.log('click'));",
+ "useEventListener(ref, 'click', () => console.log('click'));",
+ "const ref = useEventListener('click', () => console.log('click'));"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "Window",
+ "optional": false,
+ "description": "The window object to attach the event listener to",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Window} target The window object to attach the event listener to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{Window}",
+ "postType": " ",
+ "description": "The window object to attach the event listener to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "event",
+ "type": "Event | Event[]",
+ "optional": false,
+ "description": "An array of event types to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {Event | Event[]} event An array of event types to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "event",
+ "postName": " ",
+ "type": "{Event | Event[]}",
+ "postType": " ",
+ "description": "An array of event types to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "handler",
+ "type": "(this: Window, event: WindowEventMap[Event]) => void",
+ "optional": false,
+ "description": "The event handler function",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {(this: Window, event: WindowEventMap[Event]) => void} handler The event handler function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "handler",
+ "postName": " ",
+ "type": "{(this: Window, event: WindowEventMap[Event]) => void}",
+ "postType": " ",
+ "description": "The event handler function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventListenerOptions",
+ "optional": true,
+ "description": "Options for the event listener",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {UseEventListenerOptions} [options] Options for the event listener",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseEventListenerOptions}",
+ "postType": " ",
+ "description": "Options for the event listener",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 13,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "Document",
+ "optional": false,
+ "description": "The window object to attach the event listener to",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {Document} target The window object to attach the event listener to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{Document}",
+ "postType": " ",
+ "description": "The window object to attach the event listener to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "event",
+ "type": "Event | Event[]",
+ "optional": false,
+ "description": "An array of event types to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {Event | Event[]} event An array of event types to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "event",
+ "postName": " ",
+ "type": "{Event | Event[]}",
+ "postType": " ",
+ "description": "An array of event types to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "handler",
+ "type": "(this: Document, event: DocumentEventMap[Event]) => void",
+ "optional": false,
+ "description": "The event handler function",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {(this: Document, event: DocumentEventMap[Event]) => void} handler The event handler function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "handler",
+ "postName": " ",
+ "type": "{(this: Document, event: DocumentEventMap[Event]) => void}",
+ "postType": " ",
+ "description": "The event handler function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventListenerOptions",
+ "optional": true,
+ "description": "Options for the event listener",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @param {UseEventListenerOptions} [options] Options for the event listener",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseEventListenerOptions}",
+ "postType": " ",
+ "description": "Options for the event listener",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 24,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to attach the event listener to",
+ "problems": [],
+ "source": [
+ {
+ "number": 31,
+ "source": " * @param {HookTarget} target The target element to attach the event listener to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to attach the event listener to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "event",
+ "type": "Event | Event[]",
+ "optional": false,
+ "description": "An array of event types to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 32,
+ "source": " * @param {Event | Event[]} event An array of event types to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "event",
+ "postName": " ",
+ "type": "{Event | Event[]}",
+ "postType": " ",
+ "description": "An array of event types to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "handler",
+ "type": "(this: Target, event: HTMLElementEventMap[Event]) => void",
+ "optional": false,
+ "description": "The event handler function",
+ "problems": [],
+ "source": [
+ {
+ "number": 33,
+ "source": " * @param {(this: Target, event: HTMLElementEventMap[Event]) => void} handler The event handler function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "handler",
+ "postName": " ",
+ "type": "{(this: Target, event: HTMLElementEventMap[Event]) => void}",
+ "postType": " ",
+ "description": "The event handler function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventListenerOptions",
+ "optional": true,
+ "description": "Options for the event listener",
+ "problems": [],
+ "source": [
+ {
+ "number": 34,
+ "source": " * @param {UseEventListenerOptions} [options] Options for the event listener",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseEventListenerOptions}",
+ "postType": " ",
+ "description": "Options for the event listener",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 35,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 36,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "event",
+ "type": "Event | Event[]",
+ "optional": false,
+ "description": "An array of event types to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 43,
+ "source": " * @param {Event | Event[]} event An array of event types to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "event",
+ "postName": " ",
+ "type": "{Event | Event[]}",
+ "postType": " ",
+ "description": "An array of event types to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "handler",
+ "type": "(this: Target, event: HTMLElementEventMap[Event] | MediaQueryListEventMap[Event]) => void",
+ "optional": false,
+ "description": "The event handler function",
+ "problems": [],
+ "source": [
+ {
+ "number": 44,
+ "source": " * @param {(this: Target, event: HTMLElementEventMap[Event] | MediaQueryListEventMap[Event]) => void} handler The event handler function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "handler",
+ "postName": " ",
+ "type": "{(this: Target, event: HTMLElementEventMap[Event] | MediaQueryListEventMap[Event]) => void}",
+ "postType": " ",
+ "description": "The event handler function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventListenerOptions",
+ "optional": true,
+ "description": "Options for the event listener",
+ "problems": [],
+ "source": [
+ {
+ "number": 45,
+ "source": " * @param {UseEventListenerOptions} [options] Options for the event listener",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseEventListenerOptions}",
+ "postType": " ",
+ "description": "Options for the event listener",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseEventListenerReturn",
+ "optional": false,
+ "description": "reference to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 46,
+ "source": " * @returns {UseEventListenerReturn} A reference to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseEventListenerReturn}",
+ "postType": " ",
+ "description": "reference to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 47,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useeventsource.mdx b/packages/docs-v2/content/docs/hooks/useeventsource.mdx
new file mode 100644
index 00000000..45edd474
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeventsource.mdx
@@ -0,0 +1,47 @@
+---
+title: "useEventSource"
+description: "Hook that provides a reactive wrapper for event source"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useeventsource.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useEventSource
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEventSource/useEventSource.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEventSource/useEventSource.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useeventsource.props.json b/packages/docs-v2/content/docs/hooks/useeventsource.props.json
new file mode 100644
index 00000000..4ed3e908
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeventsource.props.json
@@ -0,0 +1,161 @@
+{
+ "name": "useEventSource",
+ "description": "Hook that provides a reactive wrapper for event source",
+ "examples": [
+ "const { instance, data, connecting, opened, isError, close, open } = useEventSource('url', ['message']);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "url",
+ "type": "string | URL",
+ "optional": false,
+ "description": "The URL of the EventSource",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string | URL} url The URL of the EventSource",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "url",
+ "postName": " ",
+ "type": "{string | URL}",
+ "postType": " ",
+ "description": "The URL of the EventSource",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "events",
+ "type": "string[]",
+ "optional": true,
+ "description": "List of events to listen to",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {string[]} [events=[]] List of events to listen to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[events=[]]",
+ "postName": " ",
+ "type": "{string[]}",
+ "postType": " ",
+ "description": "List of events to listen to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "[]"
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseEventSourceOptions",
+ "optional": true,
+ "description": "Configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {UseEventSourceOptions} [options={}] Configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options={}]",
+ "postName": " ",
+ "type": "{UseEventSourceOptions}",
+ "postType": " ",
+ "description": "Configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "{}"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseEventSourceReturn",
+ "optional": false,
+ "description": "EventSource state and controls",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseEventSourceReturn} The EventSource state and controls",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseEventSourceReturn}",
+ "postType": " ",
+ "description": "EventSource state and controls",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "EventSource",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "nailgilmanov",
+ "avatar": "https://gravatar.com/avatar/61c96a040bb7c821d1fb35138254ed4b?d=retro"
+ }
+ ],
+ "lastModified": 1767095034000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useeyedropper.mdx b/packages/docs-v2/content/docs/hooks/useeyedropper.mdx
new file mode 100644
index 00000000..ffe0a092
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeyedropper.mdx
@@ -0,0 +1,47 @@
+---
+title: "useEyeDropper"
+description: "Hook that gives you access to the eye dropper"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useeyedropper.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useEyeDropper
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEyeDropper/useEyeDropper.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useEyeDropper/useEyeDropper.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useeyedropper.props.json b/packages/docs-v2/content/docs/hooks/useeyedropper.props.json
new file mode 100644
index 00000000..a92acdea
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useeyedropper.props.json
@@ -0,0 +1,100 @@
+{
+ "name": "useEyeDropper",
+ "description": "Hook that gives you access to the eye dropper",
+ "examples": [
+ "const { supported, value, open } = useEyeDropper();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": true,
+ "description": "The initial value for the eye dropper",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} [initialValue=undefined] The initial value for the eye dropper",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue=undefined]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial value for the eye dropper",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "undefined"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseEyeDropperReturn",
+ "optional": false,
+ "description": "object containing the supported status, the value and the open method",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseEyeDropperReturn} An object containing the supported status, the value and the open method",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseEyeDropperReturn}",
+ "postType": " ",
+ "description": "object containing the supported status, the value and the open method",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "EyeDropper",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefavicon.mdx b/packages/docs-v2/content/docs/hooks/usefavicon.mdx
new file mode 100644
index 00000000..cfd03a17
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefavicon.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFavicon"
+description: "Hook that manages the favicon"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefavicon.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFavicon
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFavicon/useFavicon.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFavicon/useFavicon.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefavicon.props.json b/packages/docs-v2/content/docs/hooks/usefavicon.props.json
new file mode 100644
index 00000000..660e957e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefavicon.props.json
@@ -0,0 +1,102 @@
+{
+ "name": "useFavicon",
+ "description": "Hook that manages the favicon",
+ "examples": [
+ "const { href, set } = useFavicon('https://siberiacancode.github.io/reactuse/favicon.ico');"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialFavicon",
+ "type": "string",
+ "optional": true,
+ "description": "The initial favicon. If not provided, the current favicon will be used",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {string} [initialFavicon] The initial favicon. If not provided, the current favicon will be used",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialFavicon]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial favicon. If not provided, the current favicon will be used",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFaviconReturn",
+ "optional": false,
+ "description": "array containing the current favicon and a function to update the favicon",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @returns {UseFaviconReturn} An array containing the current favicon and a function to update the favicon",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFaviconReturn}",
+ "postType": " ",
+ "description": "array containing the current favicon and a function to update the favicon",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1755364807000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefield.mdx b/packages/docs-v2/content/docs/hooks/usefield.mdx
new file mode 100644
index 00000000..2b060207
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefield.mdx
@@ -0,0 +1,47 @@
+---
+title: "useField"
+description: "Hook to manage a form field"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefield.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useField
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useField/useField.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useField/useField.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefield.props.json b/packages/docs-v2/content/docs/hooks/usefield.props.json
new file mode 100644
index 00000000..11598ee4
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefield.props.json
@@ -0,0 +1,247 @@
+{
+ "name": "useField",
+ "description": "Hook to manage a form field",
+ "examples": [
+ "const { register, getValue, setValue, reset, dirty, error, setError, clearError, touched, focus, watch } = useField();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "params.initialValue",
+ "type": "Value",
+ "optional": true,
+ "description": "Initial value",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Value} [params.initialValue] Initial value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.initialValue]",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "Initial value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "params.initialTouched",
+ "type": "boolean",
+ "optional": true,
+ "description": "Initial touched state",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {boolean} [params.initialTouched=false] Initial touched state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.initialTouched=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Initial touched state",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "params.autoFocus",
+ "type": "boolean",
+ "optional": true,
+ "description": "Auto focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean} [params.autoFocus=false] Auto focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.autoFocus=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Auto focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "params.validateOnChange",
+ "type": "boolean",
+ "optional": true,
+ "description": "Validate on change",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {boolean} [params.validateOnChange=false] Validate on change",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.validateOnChange=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Validate on change",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "params.validateOnBlur",
+ "type": "boolean",
+ "optional": true,
+ "description": "Validate on blur",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {boolean} [params.validateOnBlur=false] Validate on blur",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.validateOnBlur=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Validate on blur",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "params.validateOnMount",
+ "type": "boolean",
+ "optional": true,
+ "description": "Validate on mount",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {boolean} [params.validateOnMount=false] Validate on mount",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.validateOnMount=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Validate on mount",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFieldReturn",
+ "optional": false,
+ "description": "object containing input information",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @returns {UseFieldReturn} An object containing input information",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFieldReturn}",
+ "postType": " ",
+ "description": "object containing input information",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 15,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1767095034000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefiledialog.mdx b/packages/docs-v2/content/docs/hooks/usefiledialog.mdx
new file mode 100644
index 00000000..97b3197a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefiledialog.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFileDialog"
+description: "Hook to handle file input"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefiledialog.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFileDialog
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFileDialog/useFileDialog.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFileDialog/useFileDialog.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefiledialog.props.json b/packages/docs-v2/content/docs/hooks/usefiledialog.props.json
new file mode 100644
index 00000000..90f24063
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefiledialog.props.json
@@ -0,0 +1,380 @@
+{
+ "name": "useFileDialog",
+ "description": "Hook to handle file input",
+ "examples": [
+ "const { values, open, reset } = useFileDialog((value) => console.log(value));",
+ "const { values, open, reset } = useFileDialog({ accept: 'image/*' });"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(value: FileList | null) => void",
+ "optional": false,
+ "description": "The callback to execute when a file is selected",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {(value: FileList | null) => void} callback The callback to execute when a file is selected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(value: FileList | null) => void}",
+ "postType": " ",
+ "description": "The callback to execute when a file is selected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.multiple",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether multiple files can be selected",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [options.multiple=true] Whether multiple files can be selected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.multiple=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether multiple files can be selected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.accept",
+ "type": "string",
+ "optional": true,
+ "description": "The accepted file types",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {string} [options.accept='*'] The accepted file types",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.accept='*']",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The accepted file types",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "'*'"
+ },
+ {
+ "tag": "param",
+ "name": "options.reset",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether the input should be reset when the callback is called",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean} [options.reset=false] Whether the input should be reset when the callback is called",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.reset=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether the input should be reset when the callback is called",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.capture",
+ "type": "string",
+ "optional": true,
+ "description": "The capture value",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {string} [options.capture] The capture value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.capture]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The capture value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFileDialogReturn",
+ "optional": false,
+ "description": "object containing the selected files",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @returns {UseFileDialogReturn} An object containing the selected files",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFileDialogReturn}",
+ "postType": " ",
+ "description": "object containing the selected files",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 13,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.multiple",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether multiple files can be selected",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {boolean} [options.multiple=true] Whether multiple files can be selected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.multiple=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether multiple files can be selected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.accept",
+ "type": "string",
+ "optional": true,
+ "description": "The accepted file types",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {string} [options.accept='*'] The accepted file types",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.accept='*']",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The accepted file types",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "'*'"
+ },
+ {
+ "tag": "param",
+ "name": "options.reset",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether the input should be reset when the callback is called",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {boolean} [options.reset=false] Whether the input should be reset when the callback is called",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.reset=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether the input should be reset when the callback is called",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.capture",
+ "type": "string",
+ "optional": true,
+ "description": "The capture value",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {string} [options.capture] The capture value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.capture]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The capture value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFileDialogReturn",
+ "optional": false,
+ "description": "object containing the selected files",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @returns {UseFileDialogReturn} An object containing the selected files",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFileDialogReturn}",
+ "postType": " ",
+ "description": "object containing the selected files",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 23,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1757059687000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefocus.mdx b/packages/docs-v2/content/docs/hooks/usefocus.mdx
new file mode 100644
index 00000000..e0d5c608
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefocus.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFocus"
+description: "Hook that allows you to focus on a specific element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefocus.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFocus
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFocus/useFocus.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFocus/useFocus.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefocus.props.json b/packages/docs-v2/content/docs/hooks/usefocus.props.json
new file mode 100644
index 00000000..51703267
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefocus.props.json
@@ -0,0 +1,566 @@
+{
+ "name": "useFocus",
+ "description": "Hook that allows you to focus on a specific element",
+ "examples": [
+ "const { focus, blur, focused } = useFocus(ref, () => console.log('focused'));",
+ "const { focus, blur, focused } = useFocus(ref);",
+ "const { ref, focus, blur, focused } = useFocus(() => console.log('focused'));",
+ "const { ref, focus, blur, focused } = useFocus();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element to focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: FocusEvent) => void} [callback] The callback function to be invoked on focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFocusReturn",
+ "optional": false,
+ "description": "object with focus state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseFocusReturn} An object with focus state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFocusReturn}",
+ "postType": " ",
+ "description": "object with focus state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {HookTarget} target The target element to focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the focus hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {boolean} [options.enabled=true] The enabled state of the focus hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the focus hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "The initial focus state of the target",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {boolean} [options.initialValue=false] The initial focus state of the target",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The initial focus state of the target",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.onFocus",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {(event: FocusEvent) => void} [options.onFocus] The callback function to be invoked on focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onFocus]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onBlur",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on blur",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {(event: FocusEvent) => void} [options.onBlur] The callback function to be invoked on blur",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onBlur]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on blur",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFocusReturn",
+ "optional": false,
+ "description": "object with focus state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @returns {UseFocusReturn} An object with focus state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFocusReturn}",
+ "postType": " ",
+ "description": "object with focus state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 21,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 27,
+ "source": " * @param {(event: FocusEvent) => void} [callback] The callback function to be invoked on focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFocusReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object with focus state, methods and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 28,
+ "source": " * @returns {UseFocusReturn & { ref: StateRef }} An object with focus state, methods and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFocusReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object with focus state, methods and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 29,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the focus hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 35,
+ "source": " * @param {boolean} [options.enabled=true] The enabled state of the focus hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the focus hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "The initial focus state of the target",
+ "problems": [],
+ "source": [
+ {
+ "number": 36,
+ "source": " * @param {boolean} [options.initialValue=false] The initial focus state of the target",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The initial focus state of the target",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.onFocus",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on focus",
+ "problems": [],
+ "source": [
+ {
+ "number": 37,
+ "source": " * @param {(event: FocusEvent) => void} [options.onFocus] The callback function to be invoked on focus",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onFocus]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on focus",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onBlur",
+ "type": "(event: FocusEvent) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on blur",
+ "problems": [],
+ "source": [
+ {
+ "number": 38,
+ "source": " * @param {(event: FocusEvent) => void} [options.onBlur] The callback function to be invoked on blur",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onBlur]",
+ "postName": " ",
+ "type": "{(event: FocusEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on blur",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFocusReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object with focus state, methods and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 39,
+ "source": " * @returns {UseFocusReturn & { ref: StateRef }} An object with focus state, methods and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFocusReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object with focus state, methods and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 40,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefocustrap.mdx b/packages/docs-v2/content/docs/hooks/usefocustrap.mdx
new file mode 100644
index 00000000..d6783fb6
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefocustrap.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFocusTrap"
+description: "Hook that traps focus within a given element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefocustrap.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFocusTrap
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFocusTrap/useFocusTrap.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFocusTrap/useFocusTrap.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefocustrap.props.json b/packages/docs-v2/content/docs/hooks/usefocustrap.props.json
new file mode 100644
index 00000000..9d489449
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefocustrap.props.json
@@ -0,0 +1,208 @@
+{
+ "name": "useFocusTrap",
+ "description": "Hook that traps focus within a given element",
+ "examples": [
+ "const { active, disable, toggle, enable } = useFocusTrap(ref, true);",
+ "const { ref, active, disable, toggle, enable } = useFocusTrap(true);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element for focus trap",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element for focus trap",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element for focus trap",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "active",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether focus trap is active",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [active=true] Whether focus trap is active",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[active=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether focus trap is active",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseFocusTrapReturn",
+ "optional": false,
+ "description": "with the focus trap state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseFocusTrapReturn} Object with the focus trap state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseFocusTrapReturn}",
+ "postType": " ",
+ "description": "with the focus trap state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "active",
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether focus trap is active",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {boolean} [active=true] Whether focus trap is active",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[active=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Whether focus trap is active",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseFocusTrapReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "with the focus trap state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {UseFocusTrapReturn & { ref: StateRef }} Object with the focus trap state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseFocusTrapReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "with the focus trap state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefps.mdx b/packages/docs-v2/content/docs/hooks/usefps.mdx
new file mode 100644
index 00000000..a4ba3d1a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefps.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFps"
+description: "Hook that measures frames per second"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefps.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFps
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFps/useFps.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFps/useFps.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefps.props.json b/packages/docs-v2/content/docs/hooks/usefps.props.json
new file mode 100644
index 00000000..36599ead
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefps.props.json
@@ -0,0 +1,78 @@
+{
+ "name": "useFps",
+ "description": "Hook that measures frames per second",
+ "examples": [
+ "const fps = useFps();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "number",
+ "optional": false,
+ "description": "number which determines frames per second",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {number} A number which determines frames per second",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "number which determines frames per second",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "requestAnimationFrame",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "Dmytro",
+ "avatar": "https://gravatar.com/avatar/e30c2abedbceb2d4179e29273ef50eb3?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useful.mdx b/packages/docs-v2/content/docs/hooks/useful.mdx
new file mode 100644
index 00000000..64013627
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useful.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFul"
+description: "Hook that can be so useful"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useful.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFul
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFul/useFul.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFul/useFul.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useful.props.json b/packages/docs-v2/content/docs/hooks/useful.props.json
new file mode 100644
index 00000000..7363994a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useful.props.json
@@ -0,0 +1,99 @@
+{
+ "name": "useFul",
+ "description": "Hook that can be so useful",
+ "examples": [
+ "const value = useFul(state);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "value",
+ "type": "Value",
+ "optional": true,
+ "description": "The value to be returned",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {Value} [value] The value to be returned",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[value]",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The value to be returned",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "Value",
+ "optional": false,
+ "description": "value passed to the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {Value} The value passed to the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "value passed to the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "humor",
+ "warning": "This hook is a joke. Please do not use it in production code!",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usefullscreen.mdx b/packages/docs-v2/content/docs/hooks/usefullscreen.mdx
new file mode 100644
index 00000000..386ef477
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefullscreen.mdx
@@ -0,0 +1,47 @@
+---
+title: "useFullscreen"
+description: "Hook to handle fullscreen events"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usefullscreen.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useFullscreen
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFullscreen/useFullscreen.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useFullscreen/useFullscreen.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usefullscreen.props.json b/packages/docs-v2/content/docs/hooks/usefullscreen.props.json
new file mode 100644
index 00000000..9bf7daf8
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usefullscreen.props.json
@@ -0,0 +1,324 @@
+{
+ "name": "useFullscreen",
+ "description": "Hook to handle fullscreen events",
+ "examples": [
+ "const { enter, exit, toggle, value } = useFullscreen(ref);",
+ "const { ref, enter, exit, toggle, value } = useFullscreen();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element for fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element for fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element for fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "initial value of fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [options.initialValue=false] initial value of fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "initial value of fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.onEnter",
+ "type": "() => void",
+ "optional": true,
+ "description": "on enter fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {() => void} [options.onEnter] on enter fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEnter]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "on enter fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onExit",
+ "type": "() => void",
+ "optional": true,
+ "description": "on exit fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {() => void} [options.onExit] on exit fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onExit]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "on exit fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFullScreenReturn",
+ "optional": false,
+ "description": "object with the fullscreen state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseFullScreenReturn} An object with the fullscreen state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFullScreenReturn}",
+ "postType": " ",
+ "description": "object with the fullscreen state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "boolean",
+ "optional": true,
+ "description": "initial value of fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {boolean} [options.initialValue=false] initial value of fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "initial value of fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.onEnter",
+ "type": "() => void",
+ "optional": true,
+ "description": "on enter fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {() => void} [options.onEnter] on enter fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEnter]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "on enter fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onExit",
+ "type": "() => void",
+ "optional": true,
+ "description": "on exit fullscreen",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {() => void} [options.onExit] on exit fullscreen",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onExit]",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "on exit fullscreen",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseFullScreenReturn & { ref: RefObject }",
+ "optional": false,
+ "description": "object with the fullscreen state and methods",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @returns {UseFullScreenReturn & { ref: RefObject }} An object with the fullscreen state and methods",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseFullScreenReturn & { ref: RefObject }}",
+ "postType": " ",
+ "description": "object with the fullscreen state and methods",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 22,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1760199703000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usegamepad.mdx b/packages/docs-v2/content/docs/hooks/usegamepad.mdx
new file mode 100644
index 00000000..b23b7225
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usegamepad.mdx
@@ -0,0 +1,47 @@
+---
+title: "useGamepad"
+description: "Hook for getting information about gamepad"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usegamepad.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useGamepad
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useGamepad/useGamepad.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useGamepad/useGamepad.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usegamepad.props.json b/packages/docs-v2/content/docs/hooks/usegamepad.props.json
new file mode 100644
index 00000000..b4b23893
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usegamepad.props.json
@@ -0,0 +1,70 @@
+{
+ "name": "useGamepad",
+ "description": "Hook for getting information about gamepad",
+ "examples": [
+ "const { supported, gamepads, active } = useGamepad();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseGamepadStateReturn",
+ "optional": false,
+ "description": "object containing the gamepad information",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseGamepadStateReturn} An object containing the gamepad information",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseGamepadStateReturn}",
+ "postType": " ",
+ "description": "object containing the gamepad information",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.getGamepads",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usegeolocation.mdx b/packages/docs-v2/content/docs/hooks/usegeolocation.mdx
new file mode 100644
index 00000000..21d21a5e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usegeolocation.mdx
@@ -0,0 +1,47 @@
+---
+title: "useGeolocation"
+description: "Hook that returns the current geolocation"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usegeolocation.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useGeolocation
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useGeolocation/useGeolocation.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useGeolocation/useGeolocation.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usegeolocation.props.json b/packages/docs-v2/content/docs/hooks/usegeolocation.props.json
new file mode 100644
index 00000000..4b54f60c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usegeolocation.props.json
@@ -0,0 +1,159 @@
+{
+ "name": "useGeolocation",
+ "description": "Hook that returns the current geolocation",
+ "examples": [
+ "const { loading, error, timestamp, accuracy, latitude, longitude, altitude, altitudeAccuracy, heading, speed } = useGeolocation();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "params.enableHighAccuracy",
+ "type": "boolean",
+ "optional": true,
+ "description": "Enable high accuracy",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {boolean} [params.enableHighAccuracy] Enable high accuracy",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.enableHighAccuracy]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Enable high accuracy",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "params.maximumAge",
+ "type": "number",
+ "optional": true,
+ "description": "Maximum age",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {number} [params.maximumAge] Maximum age",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.maximumAge]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Maximum age",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "params.timeout",
+ "type": "number",
+ "optional": true,
+ "description": "Timeout",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {number} [params.timeout] Timeout",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[params.timeout]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Timeout",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "UseGeolocationReturn",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseGeolocationReturn}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{UseGeolocationReturn}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.geolocation",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "zeroqs",
+ "avatar": "https://gravatar.com/avatar/cff6d9667d5e9008cbc07435b078d19e?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usehash.mdx b/packages/docs-v2/content/docs/hooks/usehash.mdx
new file mode 100644
index 00000000..f0939978
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehash.mdx
@@ -0,0 +1,47 @@
+---
+title: "useHash"
+description: "Hook that manages the hash value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usehash.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useHash
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHash/useHash.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHash/useHash.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usehash.props.json b/packages/docs-v2/content/docs/hooks/usehash.props.json
new file mode 100644
index 00000000..6581d032
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehash.props.json
@@ -0,0 +1,566 @@
+{
+ "name": "useHash",
+ "description": "Hook that manages the hash value",
+ "examples": [
+ "const { value, set } = useHash(\"initial\");",
+ "const { value, set } = useHash(\"initial\", (newHash) => console.log('callback'));",
+ "const { value, set } = useHash();",
+ "const { value, set } = useHash((newHash) => console.log('callback'));"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": true,
+ "description": "The initial hash value if no hash exists",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {string} [initialValue] The initial hash value if no hash exists",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial hash value if no hash exists",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseHashOptions",
+ "optional": true,
+ "description": "Configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {UseHashOptions} [options] Configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseHashOptions}",
+ "postType": " ",
+ "description": "Configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {boolean} [options.enabled] The enabled state of the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.mode",
+ "type": "'initial' | 'replace'",
+ "optional": true,
+ "description": "The mode of hash setting",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {'initial' | 'replace'} [options.mode] The mode of hash setting",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.mode]",
+ "postName": " ",
+ "type": "{'initial' | 'replace'}",
+ "postType": " ",
+ "description": "The mode of hash setting",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "(hash: string) => void",
+ "optional": true,
+ "description": "Callback function called when hash changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {(hash: string) => void} [options.onChange] Callback function called when hash changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{(hash: string) => void}",
+ "postType": " ",
+ "description": "Callback function called when hash changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseHashReturn",
+ "optional": false,
+ "description": "array containing the hash value and a function to set the hash value",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseHashReturn}",
+ "postType": " ",
+ "description": "array containing the hash value and a function to set the hash value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 13,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "string",
+ "optional": true,
+ "description": "The initial hash value if no hash exists",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {string} [initialValue] The initial hash value if no hash exists",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The initial hash value if no hash exists",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(hash: string) => void",
+ "optional": true,
+ "description": "Callback function called when hash changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {(hash: string) => void} [callback] Callback function called when hash changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(hash: string) => void}",
+ "postType": " ",
+ "description": "Callback function called when hash changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseHashReturn",
+ "optional": false,
+ "description": "array containing the hash value and a function to set the hash value",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseHashReturn}",
+ "postType": " ",
+ "description": "array containing the hash value and a function to set the hash value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 21,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseHashOptions",
+ "optional": true,
+ "description": "Configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 26,
+ "source": " * @param {UseHashOptions} [options] Configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseHashOptions}",
+ "postType": " ",
+ "description": "Configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 27,
+ "source": " * @param {boolean} [options.enabled] The enabled state of the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.mode",
+ "type": "'initial' | 'replace'",
+ "optional": true,
+ "description": "The mode of hash setting",
+ "problems": [],
+ "source": [
+ {
+ "number": 28,
+ "source": " * @param {'initial' | 'replace'} [options.mode] The mode of hash setting",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.mode]",
+ "postName": " ",
+ "type": "{'initial' | 'replace'}",
+ "postType": " ",
+ "description": "The mode of hash setting",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "(hash: string) => void",
+ "optional": true,
+ "description": "Callback function called when hash changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 29,
+ "source": " * @param {(hash: string) => void} [options.onChange] Callback function called when hash changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{(hash: string) => void}",
+ "postType": " ",
+ "description": "Callback function called when hash changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseHashReturn",
+ "optional": false,
+ "description": "array containing the hash value and a function to set the hash value",
+ "problems": [],
+ "source": [
+ {
+ "number": 30,
+ "source": " * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseHashReturn}",
+ "postType": " ",
+ "description": "array containing the hash value and a function to set the hash value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 31,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(hash: string) => void",
+ "optional": true,
+ "description": "Callback function called when hash changes",
+ "problems": [],
+ "source": [
+ {
+ "number": 36,
+ "source": " * @param {(hash: string) => void} [callback] Callback function called when hash changes",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(hash: string) => void}",
+ "postType": " ",
+ "description": "Callback function called when hash changes",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseHashReturn",
+ "optional": false,
+ "description": "array containing the hash value and a function to set the hash value",
+ "problems": [],
+ "source": [
+ {
+ "number": 37,
+ "source": " * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseHashReturn}",
+ "postType": " ",
+ "description": "array containing the hash value and a function to set the hash value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 38,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usehotkeys.mdx b/packages/docs-v2/content/docs/hooks/usehotkeys.mdx
new file mode 100644
index 00000000..609ae74c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehotkeys.mdx
@@ -0,0 +1,47 @@
+---
+title: "useHotkeys"
+description: "Hook that listens for hotkeys"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usehotkeys.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useHotkeys
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHotkeys/useHotkeys.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHotkeys/useHotkeys.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usehotkeys.props.json b/packages/docs-v2/content/docs/hooks/usehotkeys.props.json
new file mode 100644
index 00000000..93fa6692
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehotkeys.props.json
@@ -0,0 +1,383 @@
+{
+ "name": "useHotkeys",
+ "description": "Hook that listens for hotkeys",
+ "examples": [
+ "useHotkeys(ref, 'ctrl+a', () => console.log('hotkey pressed'));",
+ "useHotkeys(ref, 'ctrl+a, ctrl+b', () => console.log('hotkey pressed'));",
+ "const ref = useHotkeys('ctrl+a', () => console.log('hotkey pressed'));",
+ "const ref = useHotkeys('ctrl+a, ctrl+b', () => console.log('hotkey pressed'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The target element to attach the event listener to",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} [target=window] The target element to attach the event listener to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[target=window]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to attach the event listener to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "window"
+ },
+ {
+ "tag": "param",
+ "name": "hotkeys",
+ "type": "string",
+ "optional": false,
+ "description": "The hotkey to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} hotkeys The hotkey to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "hotkeys",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The hotkey to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: KeyboardEvent) => void",
+ "optional": false,
+ "description": "The callback function to execute when hotkey is pressed",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {(event: KeyboardEvent) => void} callback The callback function to execute when hotkey is pressed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to execute when hotkey is pressed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.alias",
+ "type": "Record",
+ "optional": true,
+ "description": "Alias map for hotkeys",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {Record} [options.alias] Alias map for hotkeys",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.alias]",
+ "postName": " ",
+ "type": "{Record}",
+ "postType": " ",
+ "description": "Alias map for hotkeys",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Enable or disable the event listeners",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {boolean} [options.enabled=true] Enable or disable the event listeners",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Enable or disable the event listeners",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 13,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "hotkeys",
+ "type": "string",
+ "optional": false,
+ "description": "The hotkey to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {string} hotkeys The hotkey to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "hotkeys",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The hotkey to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: KeyboardEvent) => void",
+ "optional": false,
+ "description": "The callback function to execute when hotkey is pressed",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @param {(event: KeyboardEvent) => void} callback The callback function to execute when hotkey is pressed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to execute when hotkey is pressed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.alias",
+ "type": "Record",
+ "optional": true,
+ "description": "Alias map for hotkeys",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @param {Record} [options.alias] Alias map for hotkeys",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.alias]",
+ "postName": " ",
+ "type": "{Record}",
+ "postType": " ",
+ "description": "Alias map for hotkeys",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "Enable or disable the event listeners",
+ "problems": [],
+ "source": [
+ {
+ "number": 24,
+ "source": " * @param {boolean} [options.enabled=true] Enable or disable the event listeners",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Enable or disable the event listeners",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "StateRef",
+ "optional": false,
+ "description": "reference to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @returns {StateRef} A reference to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{StateRef}",
+ "postType": " ",
+ "description": "reference to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 26,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usehover.mdx b/packages/docs-v2/content/docs/hooks/usehover.mdx
new file mode 100644
index 00000000..900b3061
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehover.mdx
@@ -0,0 +1,47 @@
+---
+title: "useHover"
+description: "Hook that defines the logic when hovering an element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usehover.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useHover
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHover/useHover.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useHover/useHover.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usehover.props.json b/packages/docs-v2/content/docs/hooks/usehover.props.json
new file mode 100644
index 00000000..4ec1a43c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usehover.props.json
@@ -0,0 +1,458 @@
+{
+ "name": "useHover",
+ "description": "Hook that defines the logic when hovering an element",
+ "examples": [
+ "const hovering = useHover(ref, () => console.log('callback'));",
+ "const hovering = useHover(ref, options);",
+ "const { ref, value } = useHover(() => console.log('callback'));",
+ "const { ref, value } = useHover(options);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to be hovered",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element to be hovered",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to be hovered",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse enter",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: Event) => void} [callback] The callback function to be invoked on mouse enter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse enter",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "boolean",
+ "optional": false,
+ "description": "value of the hover",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {boolean} The value of the hover",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "value of the hover",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to be hovered",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {HookTarget} target The target element to be hovered",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to be hovered",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onEntry",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse enter",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {(event: Event) => void} [options.onEntry] The callback function to be invoked on mouse enter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEntry]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse enter",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onLeave",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse leave",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {(event: Event) => void} [options.onLeave] The callback function to be invoked on mouse leave",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onLeave]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse leave",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "boolean",
+ "optional": false,
+ "description": "value of the hover",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @returns {boolean} The value of the hover",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "value of the hover",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 19,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse enter",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @param {(event: Event) => void} [callback] The callback function to be invoked on mouse enter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse enter",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "{ ref: StateRef } & UseHoverReturn",
+ "optional": false,
+ "description": "object with the ref and the value of the hover",
+ "problems": [],
+ "source": [
+ {
+ "number": 26,
+ "source": " * @returns {{ ref: StateRef } & UseHoverReturn} The object with the ref and the value of the hover",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{{ ref: StateRef } & UseHoverReturn}",
+ "postType": " ",
+ "description": "object with the ref and the value of the hover",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 27,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.onEntry",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse enter",
+ "problems": [],
+ "source": [
+ {
+ "number": 33,
+ "source": " * @param {(event: Event) => void} [options.onEntry] The callback function to be invoked on mouse enter",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onEntry]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse enter",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onLeave",
+ "type": "(event: Event) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on mouse leave",
+ "problems": [],
+ "source": [
+ {
+ "number": 34,
+ "source": " * @param {(event: Event) => void} [options.onLeave] The callback function to be invoked on mouse leave",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onLeave]",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on mouse leave",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "{ ref: StateRef } & UseHoverReturn",
+ "optional": false,
+ "description": "object with the ref and the value of the hover",
+ "problems": [],
+ "source": [
+ {
+ "number": 35,
+ "source": " * @returns {{ ref: StateRef } & UseHoverReturn} The object with the ref and the value of the hover",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{{ ref: StateRef } & UseHoverReturn}",
+ "postType": " ",
+ "description": "object with the ref and the value of the hover",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 36,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "str0yka",
+ "avatar": "https://gravatar.com/avatar/cac51cebf1d47bc09276acf215a48514?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useidle.mdx b/packages/docs-v2/content/docs/hooks/useidle.mdx
new file mode 100644
index 00000000..38adabe7
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useidle.mdx
@@ -0,0 +1,47 @@
+---
+title: "useIdle"
+description: "Hook that defines the logic when the user is idle"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useidle.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useIdle
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIdle/useIdle.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIdle/useIdle.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useidle.props.json b/packages/docs-v2/content/docs/hooks/useidle.props.json
new file mode 100644
index 00000000..b2ad7311
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useidle.props.json
@@ -0,0 +1,161 @@
+{
+ "name": "useIdle",
+ "description": "Hook that defines the logic when the user is idle",
+ "examples": [
+ "const { idle, lastActive } = useIdle();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "milliseconds",
+ "type": "number",
+ "optional": true,
+ "description": "The idle time in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {number} [milliseconds=ONE_MINUTE] The idle time in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[milliseconds=ONE_MINUTE]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The idle time in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "ONE_MINUTE"
+ },
+ {
+ "tag": "param",
+ "name": "options.initialState",
+ "type": "boolean",
+ "optional": true,
+ "description": "The options for the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {boolean} [options.initialState=false] The options for the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialState=false]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The options for the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "false"
+ },
+ {
+ "tag": "param",
+ "name": "options.events",
+ "type": "Array",
+ "optional": true,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {Array} [options.events=IDLE_EVENTS]",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.events=IDLE_EVENTS]",
+ "postName": "",
+ "type": "{Array}",
+ "postType": " ",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "IDLE_EVENTS"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseIdleReturn",
+ "optional": false,
+ "description": "object containing the idle state and the last active time",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseIdleReturn} An object containing the idle state and the last active time",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseIdleReturn}",
+ "postType": " ",
+ "description": "object containing the idle state and the last active time",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useimage.mdx b/packages/docs-v2/content/docs/hooks/useimage.mdx
new file mode 100644
index 00000000..15d55868
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useimage.mdx
@@ -0,0 +1,47 @@
+---
+title: "useImage"
+description: "Hook that load an image in the browser"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useimage.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useImage
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useImage/useImage.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useImage/useImage.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useimage.props.json b/packages/docs-v2/content/docs/hooks/useimage.props.json
new file mode 100644
index 00000000..19f051cf
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useimage.props.json
@@ -0,0 +1,434 @@
+{
+ "name": "useImage",
+ "description": "Hook that load an image in the browser",
+ "examples": [
+ "const { data, isLoading, isError, isSuccess, error, refetch, isRefetching } = useImage('https://example.com/image.png');"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "src",
+ "type": "string",
+ "optional": false,
+ "description": "The source of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {string} src The source of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "src",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The source of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.srcset",
+ "type": "string",
+ "optional": true,
+ "description": "The srcset of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {string} [options.srcset] The srcset of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.srcset]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The srcset of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.sizes",
+ "type": "string",
+ "optional": true,
+ "description": "The sizes of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} [options.sizes] The sizes of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.sizes]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The sizes of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.alt",
+ "type": "string",
+ "optional": true,
+ "description": "The alt of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {string} [options.alt] The alt of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.alt]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The alt of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.class",
+ "type": "string",
+ "optional": true,
+ "description": "The class of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {string} [options.class] The class of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.class]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The class of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.loading",
+ "type": "HTMLImageElement['loading']",
+ "optional": true,
+ "description": "The loading of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {HTMLImageElement['loading']} [options.loading] The loading of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.loading]",
+ "postName": " ",
+ "type": "{HTMLImageElement['loading']}",
+ "postType": " ",
+ "description": "The loading of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.crossorigin",
+ "type": "string",
+ "optional": true,
+ "description": "The crossorigin of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {string} [options.crossorigin] The crossorigin of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.crossorigin]",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The crossorigin of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.referrerPolicy",
+ "type": "HTMLImageElement['referrerPolicy']",
+ "optional": true,
+ "description": "The referrerPolicy of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {HTMLImageElement['referrerPolicy']} [options.referrerPolicy] The referrerPolicy of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.referrerPolicy]",
+ "postName": " ",
+ "type": "{HTMLImageElement['referrerPolicy']}",
+ "postType": " ",
+ "description": "The referrerPolicy of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.keys",
+ "type": "DependencyList",
+ "optional": true,
+ "description": "The dependencies for the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {DependencyList} [options.keys] The dependencies for the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.keys]",
+ "postName": " ",
+ "type": "{DependencyList}",
+ "postType": " ",
+ "description": "The dependencies for the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onSuccess",
+ "type": "(data: Data) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on success",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {(data: Data) => void} [options.onSuccess] The callback function to be invoked on success",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onSuccess]",
+ "postName": " ",
+ "type": "{(data: Data) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on success",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onError",
+ "type": "(error: Error) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on error",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {(error: Error) => void} [options.onError] The callback function to be invoked on error",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onError]",
+ "postName": " ",
+ "type": "{(error: Error) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on error",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.refetchInterval",
+ "type": "number",
+ "optional": true,
+ "description": "The refetch interval",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {number} [options.refetchInterval] The refetch interval",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.refetchInterval]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The refetch interval",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.retry",
+ "type": "boolean | number",
+ "optional": true,
+ "description": "The retry count of requests",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {boolean | number} [options.retry] The retry count of requests",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.retry]",
+ "postName": " ",
+ "type": "{boolean | number}",
+ "postType": " ",
+ "description": "The retry count of requests",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseImageReturn",
+ "optional": false,
+ "description": "object with the state of the image",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @returns {UseImageReturn} An object with the state of the image",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseImageReturn}",
+ "postType": " ",
+ "description": "object with the state of the image",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 20,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useinfinitescroll.mdx b/packages/docs-v2/content/docs/hooks/useinfinitescroll.mdx
new file mode 100644
index 00000000..5d92b82f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useinfinitescroll.mdx
@@ -0,0 +1,47 @@
+---
+title: "useInfiniteScroll"
+description: "Hook that defines the logic for infinite scroll"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useinfinitescroll.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useInfiniteScroll
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useInfiniteScroll/useInfiniteScroll.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useInfiniteScroll/useInfiniteScroll.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useinfinitescroll.props.json b/packages/docs-v2/content/docs/hooks/useinfinitescroll.props.json
new file mode 100644
index 00000000..ddb3d9f9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useinfinitescroll.props.json
@@ -0,0 +1,330 @@
+{
+ "name": "useInfiniteScroll",
+ "description": "Hook that defines the logic for infinite scroll",
+ "examples": [
+ "const { ref, loading } = useInfiniteScroll(() => console.log('infinite scroll'));",
+ "const { loading } = useInfiniteScroll(ref, () => console.log('infinite scroll'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": false,
+ "description": "The callback to execute when a click outside the target is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback to execute when a click outside the target is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.distance",
+ "type": "number",
+ "optional": true,
+ "description": "The distance in pixels to trigger the callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {number} [options.distance=10] The distance in pixels to trigger the callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.distance=10]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The distance in pixels to trigger the callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "10"
+ },
+ {
+ "tag": "param",
+ "name": "options.direction",
+ "type": "string",
+ "optional": true,
+ "description": "The direction to trigger the callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {string} [options.direction='bottom'] The direction to trigger the callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.direction='bottom']",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The direction to trigger the callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "'bottom'"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseInfiniteScrollReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object containing the ref and loading",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {UseInfiniteScrollReturn & { ref: StateRef }} An object containing the ref and loading",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseInfiniteScrollReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the ref and loading",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to detect infinite scroll for",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {HookTarget} target The target element to detect infinite scroll for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to detect infinite scroll for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: Event) => void",
+ "optional": false,
+ "description": "The callback to execute when a click outside the target is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: Event) => void}",
+ "postType": " ",
+ "description": "The callback to execute when a click outside the target is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.distance",
+ "type": "number",
+ "optional": true,
+ "description": "The distance in pixels to trigger the callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {number} [options.distance=10] The distance in pixels to trigger the callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.distance=10]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "The distance in pixels to trigger the callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "10"
+ },
+ {
+ "tag": "param",
+ "name": "options.direction",
+ "type": "string",
+ "optional": true,
+ "description": "The direction to trigger the callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {string} [options.direction='bottom'] The direction to trigger the callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.direction='bottom']",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The direction to trigger the callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "'bottom'"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseInfiniteScrollReturn",
+ "optional": false,
+ "description": "object containing the ref and loading",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @returns {UseInfiniteScrollReturn} An object containing the ref and loading",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseInfiniteScrollReturn}",
+ "postType": " ",
+ "description": "object containing the ref and loading",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 22,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "“Ediand11”",
+ "avatar": "https://gravatar.com/avatar/cf7a63d641cd20d003e73563c8fa0e14?d=retro"
+ },
+ {
+ "name": "Nikita",
+ "avatar": "https://gravatar.com/avatar/cac51cebf1d47bc09276acf215a48514?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useintersectionobserver.mdx b/packages/docs-v2/content/docs/hooks/useintersectionobserver.mdx
new file mode 100644
index 00000000..6cf007ee
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useintersectionobserver.mdx
@@ -0,0 +1,47 @@
+---
+title: "useIntersectionObserver"
+description: "Hook that gives you intersection observer state"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useintersectionobserver.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useIntersectionObserver
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIntersectionObserver/useIntersectionObserver.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIntersectionObserver/useIntersectionObserver.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useintersectionobserver.props.json b/packages/docs-v2/content/docs/hooks/useintersectionobserver.props.json
new file mode 100644
index 00000000..6e451cf8
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useintersectionobserver.props.json
@@ -0,0 +1,511 @@
+{
+ "name": "useIntersectionObserver",
+ "description": "Hook that gives you intersection observer state",
+ "examples": [
+ "const { ref, entries, observer } = useIntersectionObserver();",
+ "const { entries, observer } = useIntersectionObserver(ref);",
+ "const { ref, entries, observer } = useIntersectionObserver(() => console.log('callback'));",
+ "const { entries, observer } = useIntersectionObserver(ref, () => console.log('callback'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to detect intersection",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {HookTarget} target The target element to detect intersection",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to detect intersection",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The IntersectionObserver options",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean} [options.enabled=true] The IntersectionObserver options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The IntersectionObserver options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined",
+ "optional": true,
+ "description": "The callback to execute when intersection is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined} [options.onChange] The callback to execute when intersection is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined}",
+ "postType": " ",
+ "description": "The callback to execute when intersection is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.root",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The root element to observe",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {HookTarget} [options.root=document] The root element to observe",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.root=document]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The root element to observe",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "document"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseIntersectionObserverReturn",
+ "optional": false,
+ "description": "object containing the state",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @returns {UseIntersectionObserverReturn} An object containing the state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseIntersectionObserverReturn}",
+ "postType": " ",
+ "description": "object containing the state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 14,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The IntersectionObserver options",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {boolean} [options.enabled=true] The IntersectionObserver options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The IntersectionObserver options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined",
+ "optional": true,
+ "description": "The callback to execute when intersection is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @param {((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined} [options.onChange] The callback to execute when intersection is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{((entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void) | undefined}",
+ "postType": " ",
+ "description": "The callback to execute when intersection is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.root",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The root element to observe",
+ "problems": [],
+ "source": [
+ {
+ "number": 22,
+ "source": " * @param {HookTarget} [options.root=document] The root element to observe",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.root=document]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The root element to observe",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "document"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseIntersectionObserverReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "React ref to attach to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @returns {UseIntersectionObserverReturn & { ref: StateRef }} A React ref to attach to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseIntersectionObserverReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "React ref to attach to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 24,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "UseIntersectionObserverCallback",
+ "optional": false,
+ "description": "The callback to execute when intersection is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 30,
+ "source": " * @param {UseIntersectionObserverCallback} callback The callback to execute when intersection is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{UseIntersectionObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when intersection is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseIntersectionObserverReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "React ref to attach to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 31,
+ "source": " * @returns {UseIntersectionObserverReturn & { ref: StateRef }} A React ref to attach to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseIntersectionObserverReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "React ref to attach to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 32,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "UseIntersectionObserverCallback",
+ "optional": false,
+ "description": "The callback to execute when intersection is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 37,
+ "source": " * @param {UseIntersectionObserverCallback} callback The callback to execute when intersection is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{UseIntersectionObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when intersection is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to detect intersection",
+ "problems": [],
+ "source": [
+ {
+ "number": 38,
+ "source": " * @param {HookTarget} target The target element to detect intersection",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to detect intersection",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseIntersectionObserverReturn",
+ "optional": false,
+ "description": "object containing the state",
+ "problems": [],
+ "source": [
+ {
+ "number": 39,
+ "source": " * @returns {UseIntersectionObserverReturn} An object containing the state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseIntersectionObserverReturn}",
+ "postType": " ",
+ "description": "object containing the state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 40,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "browserapi": "IntersectionObserver",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useinterval.mdx b/packages/docs-v2/content/docs/hooks/useinterval.mdx
new file mode 100644
index 00000000..867dc9a3
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useinterval.mdx
@@ -0,0 +1,47 @@
+---
+title: "useInterval"
+description: "Hook that makes and interval and returns controlling functions"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useinterval.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useInterval
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useInterval/useInterval.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useInterval/useInterval.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useinterval.props.json b/packages/docs-v2/content/docs/hooks/useinterval.props.json
new file mode 100644
index 00000000..5a498cca
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useinterval.props.json
@@ -0,0 +1,271 @@
+{
+ "name": "useInterval",
+ "description": "Hook that makes and interval and returns controlling functions",
+ "examples": [
+ "const { active, pause, resume, toggle } = useInterval(() => console.log('inside interval'), 2500);",
+ "const { active, pause, resume, toggle } = useInterval(() => console.log('inside interval'), { interval: 2500 });"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "() => void",
+ "optional": false,
+ "description": "Any callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {() => void} callback Any callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "Any callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "interval",
+ "type": "number",
+ "optional": true,
+ "description": "Time in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {number} [interval=1000] Time in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[interval=1000]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Time in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1000"
+ },
+ {
+ "tag": "param",
+ "name": "options.immediately",
+ "type": "boolean",
+ "optional": true,
+ "description": "Start the interval immediately",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {boolean} [options.immediately=true] Start the interval immediately",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.immediately=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Start the interval immediately",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "UseIntervalReturn",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseIntervalReturn}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{UseIntervalReturn}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "() => void",
+ "optional": false,
+ "description": "Any callback function",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {() => void} callback Any callback function",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{() => void}",
+ "postType": " ",
+ "description": "Any callback function",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.interval",
+ "type": "number",
+ "optional": true,
+ "description": "Time in milliseconds",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {number} [options.interval=1000] Time in milliseconds",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.interval=1000]",
+ "postName": " ",
+ "type": "{number}",
+ "postType": " ",
+ "description": "Time in milliseconds",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "1000"
+ },
+ {
+ "tag": "param",
+ "name": "options.immediately",
+ "type": "boolean",
+ "optional": true,
+ "description": "Start the interval immediately",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {boolean} [options.immediately=true] Start the interval immediately",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.immediately=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Start the interval immediately",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 19,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "time",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "khmilevoi",
+ "avatar": "https://gravatar.com/avatar/8d31b6f823890f13dd2dd1637df5e379?d=retro"
+ }
+ ],
+ "lastModified": 1768411966000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useisfirstrender.mdx b/packages/docs-v2/content/docs/hooks/useisfirstrender.mdx
new file mode 100644
index 00000000..4eb72544
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useisfirstrender.mdx
@@ -0,0 +1,47 @@
+---
+title: "useIsFirstRender"
+description: "Hook that returns true if the component is first render"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useisfirstrender.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useIsFirstRender
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIsFirstRender/useIsFirstRender.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIsFirstRender/useIsFirstRender.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useisfirstrender.props.json b/packages/docs-v2/content/docs/hooks/useisfirstrender.props.json
new file mode 100644
index 00000000..bf2fd6e1
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useisfirstrender.props.json
@@ -0,0 +1,73 @@
+{
+ "name": "useIsFirstRender",
+ "description": "Hook that returns true if the component is first render",
+ "examples": [
+ "const isFirstRender = useIsFirstRender();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "True",
+ "type": "boolean",
+ "optional": false,
+ "description": "if the component is first render",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @returns {boolean} True if the component is first render",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "True",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "if the component is first render",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 7,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "lifecycle",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.mdx b/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.mdx
new file mode 100644
index 00000000..82ae1a8a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.mdx
@@ -0,0 +1,47 @@
+---
+title: "useIsomorphicLayoutEffect"
+description: "Hook conditionally selects either `useLayoutEffect` or `useEffect` based on the environment"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useisomorphiclayouteffect.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useIsomorphicLayoutEffect
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.props.json b/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.props.json
new file mode 100644
index 00000000..6563b7c0
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useisomorphiclayouteffect.props.json
@@ -0,0 +1,22 @@
+{
+ "name": "useIsomorphicLayoutEffect",
+ "description": "Hook conditionally selects either `useLayoutEffect` or `useEffect` based on the environment",
+ "examples": [
+ "useIsomorphicLayoutEffect(() => console.log('effect'), [])"
+ ],
+ "usage": "high",
+ "apiParameters": [],
+ "category": "lifecycle",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usekeyboard.mdx b/packages/docs-v2/content/docs/hooks/usekeyboard.mdx
new file mode 100644
index 00000000..cbf535f8
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeyboard.mdx
@@ -0,0 +1,47 @@
+---
+title: "useKeyboard"
+description: "Hook that helps to listen for keyboard events"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usekeyboard.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useKeyboard
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyboard/useKeyboard.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyboard/useKeyboard.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usekeyboard.props.json b/packages/docs-v2/content/docs/hooks/usekeyboard.props.json
new file mode 100644
index 00000000..b07abd75
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeyboard.props.json
@@ -0,0 +1,394 @@
+{
+ "name": "useKeyboard",
+ "description": "Hook that helps to listen for keyboard events",
+ "examples": [
+ "useKeyboard(ref, (event) => console.log('key down'));",
+ "useKeyboard(ref, { onKeyDown: (event) => console.log('key down'), onKeyUp: (event) => console.log('key up') });",
+ "const ref = useKeyboard((event) => console.log('key down'));",
+ "const ref = useKeyboard({ onKeyDown: (event) => console.log('key down'), onKeyUp: (event) => console.log('key up') });"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target to attach the event listeners to",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target to attach the event listeners to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target to attach the event listeners to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "KeyboardEventHandler",
+ "optional": false,
+ "description": "The callback function to be invoked on key down",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {KeyboardEventHandler} callback The callback function to be invoked on key down",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{KeyboardEventHandler}",
+ "postType": " ",
+ "description": "The callback function to be invoked on key down",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target to attach the event listeners to",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {HookTarget} target The target to attach the event listeners to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target to attach the event listeners to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseKeyboardEventOptions",
+ "optional": true,
+ "description": "The keyboard event options",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {UseKeyboardEventOptions} [options] The keyboard event options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseKeyboardEventOptions}",
+ "postType": " ",
+ "description": "The keyboard event options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "KeyboardEventHandler",
+ "optional": false,
+ "description": "The callback function to be invoked on key down",
+ "problems": [],
+ "source": [
+ {
+ "number": 24,
+ "source": " * @param {KeyboardEventHandler} callback The callback function to be invoked on key down",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{KeyboardEventHandler}",
+ "postType": " ",
+ "description": "The callback function to be invoked on key down",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "object containing the ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @returns {{ ref: StateRef }} An object containing the ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 26,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseKeyboardEventOptions",
+ "optional": true,
+ "description": "The keyboard event options",
+ "problems": [],
+ "source": [
+ {
+ "number": 32,
+ "source": " * @param {UseKeyboardEventOptions} [options] The keyboard event options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseKeyboardEventOptions}",
+ "postType": " ",
+ "description": "The keyboard event options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "object containing the ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 33,
+ "source": " * @returns {{ ref: StateRef }} An object containing the ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 34,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usekeypress.mdx b/packages/docs-v2/content/docs/hooks/usekeypress.mdx
new file mode 100644
index 00000000..11afb248
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeypress.mdx
@@ -0,0 +1,47 @@
+---
+title: "useKeyPress"
+description: "Hook that listens for key press events"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usekeypress.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useKeyPress
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyPress/useKeyPress.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyPress/useKeyPress.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usekeypress.props.json b/packages/docs-v2/content/docs/hooks/usekeypress.props.json
new file mode 100644
index 00000000..cfe9ccad
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeypress.props.json
@@ -0,0 +1,271 @@
+{
+ "name": "useKeyPress",
+ "description": "Hook that listens for key press events",
+ "examples": [
+ "const isKeyPressed = useKeyPress(ref, 'a');",
+ "const { pressed, ref } = useKeyPress('a');"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The target to attach the event listeners to",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} [target=window] The target to attach the event listeners to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[target=window]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target to attach the event listeners to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "window"
+ },
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "UseKeyPressKey",
+ "optional": false,
+ "description": "The key or keys to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {UseKeyPressKey} key The key or keys to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{UseKeyPressKey}",
+ "postType": " ",
+ "description": "The key or keys to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(pressed: boolean, event: KeyboardEvent) => void",
+ "optional": true,
+ "description": "Callback function invoked when key is pressed",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {(pressed: boolean, event: KeyboardEvent) => void} [callback] Callback function invoked when key is pressed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(pressed: boolean, event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "Callback function invoked when key is pressed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseKeyPressReturn",
+ "optional": false,
+ "description": "object containing the pressed state and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {UseKeyPressReturn} An object containing the pressed state and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseKeyPressReturn}",
+ "postType": " ",
+ "description": "object containing the pressed state and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "UseKeyPressKey",
+ "optional": false,
+ "description": "The key or keys to listen for",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {UseKeyPressKey} key The key or keys to listen for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{UseKeyPressKey}",
+ "postType": " ",
+ "description": "The key or keys to listen for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(pressed: boolean, event: KeyboardEvent) => void",
+ "optional": true,
+ "description": "Callback function invoked when key is pressed",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {(pressed: boolean, event: KeyboardEvent) => void} [callback] Callback function invoked when key is pressed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[callback]",
+ "postName": " ",
+ "type": "{(pressed: boolean, event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "Callback function invoked when key is pressed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "{ pressed: boolean; ref: StateRef }",
+ "optional": false,
+ "description": "object containing the pressed state and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @returns {{ pressed: boolean; ref: StateRef }} An object containing the pressed state and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{{ pressed: boolean; ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the pressed state and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 20,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "Gorilla Dev",
+ "avatar": "https://gravatar.com/avatar/ca17ccb5824fdd8626a4ec87e904597b?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usekeypressevent.mdx b/packages/docs-v2/content/docs/hooks/usekeypressevent.mdx
new file mode 100644
index 00000000..592a9a2e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeypressevent.mdx
@@ -0,0 +1,47 @@
+---
+title: "useKeyPressEvent"
+description: "Hook that listens for key press events on specified targets"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usekeypressevent.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useKeyPressEvent
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyPressEvent/useKeyPressEvent.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeyPressEvent/useKeyPressEvent.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usekeypressevent.props.json b/packages/docs-v2/content/docs/hooks/usekeypressevent.props.json
new file mode 100644
index 00000000..42591731
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeypressevent.props.json
@@ -0,0 +1,326 @@
+{
+ "name": "useKeyPressEvent",
+ "description": "Hook that listens for key press events on specified targets",
+ "examples": [
+ "useKeyPressEvent(ref, 'Enter', () => console.log('pressed'));",
+ "const ref = useKeyPressEvent('Enter', (event) => console.log('pressed'));"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "UseKeyPressEventKey",
+ "optional": false,
+ "description": "The key or array of keys to listen for.",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {UseKeyPressEventKey} key The key or array of keys to listen for.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{UseKeyPressEventKey}",
+ "postType": " ",
+ "description": "The key or array of keys to listen for.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget | Window",
+ "optional": false,
+ "description": "The target to attach the event listener to.",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {HookTarget | Window} target The target to attach the event listener to.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget | Window}",
+ "postType": " ",
+ "description": "The target to attach the event listener to.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "listener",
+ "type": "(event: KeyboardEvent) => void",
+ "optional": false,
+ "description": "The callback function to be executed when the specified key or keys are pressed.",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {(event: KeyboardEvent) => void} listener The callback function to be executed when the specified key or keys are pressed.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "listener",
+ "postName": " ",
+ "type": "{(event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be executed when the specified key or keys are pressed.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseKeyPressEventOptions",
+ "optional": true,
+ "description": "The options for the event listener.",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {UseKeyPressEventOptions} [options] The options for the event listener.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseKeyPressEventOptions}",
+ "postType": " ",
+ "description": "The options for the event listener.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "UseKeyPressEventKey",
+ "optional": false,
+ "description": "The key or array of keys to listen for.",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {UseKeyPressEventKey} key The key or array of keys to listen for.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{UseKeyPressEventKey}",
+ "postType": " ",
+ "description": "The key or array of keys to listen for.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "listener",
+ "type": "(event: KeyboardEvent) => void",
+ "optional": false,
+ "description": "The callback function to be executed when the specified key or keys are pressed.",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @param {(event: KeyboardEvent) => void} listener The callback function to be executed when the specified key or keys are pressed.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "listener",
+ "postName": " ",
+ "type": "{(event: KeyboardEvent) => void}",
+ "postType": " ",
+ "description": "The callback function to be executed when the specified key or keys are pressed.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseKeyPressEventOptions",
+ "optional": true,
+ "description": "The options for the event listener.",
+ "problems": [],
+ "source": [
+ {
+ "number": 20,
+ "source": " * @param {UseKeyPressEventOptions} [options] The options for the event listener.",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseKeyPressEventOptions}",
+ "postType": " ",
+ "description": "The options for the event listener.",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "{ ref: StateRef }",
+ "optional": false,
+ "description": "object containing the ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 21,
+ "source": " * @returns {{ ref: StateRef }} An object containing the ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{{ ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing the ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 22,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "babin",
+ "avatar": "https://gravatar.com/avatar/64ca64f64a770dd46a20bcec70312f7e?d=retro"
+ },
+ {
+ "name": "Winter010",
+ "avatar": "https://gravatar.com/avatar/94c936f8fd796d1557ba60bd2e41d03f?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usekeyspressed.mdx b/packages/docs-v2/content/docs/hooks/usekeyspressed.mdx
new file mode 100644
index 00000000..5b79e05a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeyspressed.mdx
@@ -0,0 +1,47 @@
+---
+title: "useKeysPressed"
+description: "all currently pressed keyboard keys and their codes"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usekeyspressed.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useKeysPressed
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeysPressed/useKeysPressed.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useKeysPressed/useKeysPressed.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usekeyspressed.props.json b/packages/docs-v2/content/docs/hooks/usekeyspressed.props.json
new file mode 100644
index 00000000..18f565bf
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usekeyspressed.props.json
@@ -0,0 +1,215 @@
+{
+ "name": "useKeysPressed",
+ "description": "all currently pressed keyboard keys and their codes",
+ "examples": [
+ "const { value } = useKeysPressed(ref);",
+ "const { value, ref } = useKeysPressed();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget | Window",
+ "optional": false,
+ "description": "DOM element or ref to attach keyboard listeners to",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget | Window} target DOM element or ref to attach keyboard listeners to",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget | Window}",
+ "postType": " ",
+ "description": "DOM element or ref to attach keyboard listeners to",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "UseKeysPressedOptions",
+ "optional": true,
+ "description": "Enable or disable the event listeners",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {UseKeysPressedOptions} [options.enabled=true] Enable or disable the event listeners",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{UseKeysPressedOptions}",
+ "postType": " ",
+ "description": "Enable or disable the event listeners",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseKeysPressedReturn",
+ "optional": false,
+ "description": "containing the array of currently pressed keys",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseKeysPressedReturn} Object containing the array of currently pressed keys",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseKeysPressedReturn}",
+ "postType": " ",
+ "description": "containing the array of currently pressed keys",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseKeysPressedOptions",
+ "optional": true,
+ "description": "- Optional configuration options",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {UseKeysPressedOptions} [options] - Optional configuration options",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseKeysPressedOptions}",
+ "postType": " ",
+ "description": "- Optional configuration options",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Object",
+ "type": "UseKeysPressedReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "containing the array of currently pressed keys and ref to attach to the element",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {UseKeysPressedReturn & { ref: StateRef }} Object containing the array of currently pressed keys and ref to attach to the element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Object",
+ "postName": " ",
+ "type": "{UseKeysPressedReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "containing the array of currently pressed keys and ref to attach to the element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "Gorilla Dev",
+ "avatar": "https://gravatar.com/avatar/ca17ccb5824fdd8626a4ec87e904597b?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselastchanged.mdx b/packages/docs-v2/content/docs/hooks/uselastchanged.mdx
new file mode 100644
index 00000000..0612cc44
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselastchanged.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLastChanged"
+description: "Hook for records the timestamp of the last change"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselastchanged.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLastChanged
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLastChanged/useLastChanged.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLastChanged/useLastChanged.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselastchanged.props.json b/packages/docs-v2/content/docs/hooks/uselastchanged.props.json
new file mode 100644
index 00000000..0051d6cd
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselastchanged.props.json
@@ -0,0 +1,131 @@
+{
+ "name": "useLastChanged",
+ "description": "Hook for records the timestamp of the last change",
+ "examples": [
+ "const lastChanged = useLastChanged(source);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "source",
+ "type": "any",
+ "optional": false,
+ "description": "The source of the last change",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {any} source The source of the last change",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "source",
+ "postName": " ",
+ "type": "{any}",
+ "postType": " ",
+ "description": "The source of the last change",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.initialValue",
+ "type": "number | null",
+ "optional": true,
+ "description": "The initial value",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {number | null} [options.initialValue=null] The initial value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.initialValue=null]",
+ "postName": " ",
+ "type": "{number | null}",
+ "postType": " ",
+ "description": "The initial value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "null"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Return",
+ "type": "number | null",
+ "optional": false,
+ "description": "timestamp of the last change",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {number | null} Return timestamp of the last change",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Return",
+ "postName": " ",
+ "type": "{number | null}",
+ "postType": " ",
+ "description": "timestamp of the last change",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "VLADISLAW9",
+ "avatar": "https://gravatar.com/avatar/cf96a05801360c131eb784ebbe781f99?d=retro"
+ }
+ ],
+ "lastModified": 1755150117000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselatest.mdx b/packages/docs-v2/content/docs/hooks/uselatest.mdx
new file mode 100644
index 00000000..32d4e409
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselatest.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLatest"
+description: "Hook that returns the stable reference of the value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselatest.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLatest
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLatest/useLatest.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLatest/useLatest.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselatest.props.json b/packages/docs-v2/content/docs/hooks/uselatest.props.json
new file mode 100644
index 00000000..34090e0c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselatest.props.json
@@ -0,0 +1,98 @@
+{
+ "name": "useLatest",
+ "description": "Hook that returns the stable reference of the value",
+ "examples": [
+ "const { value, ref } = useLatest(value);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "value",
+ "type": "Value",
+ "optional": false,
+ "description": "The value to get the previous value",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} value The value to get the previous value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "value",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The value to get the previous value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseLatestReturn",
+ "optional": false,
+ "description": "previous value",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseLatestReturn} The previous value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseLatestReturn}",
+ "postType": " ",
+ "description": "previous value",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "utilities",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useless.mdx b/packages/docs-v2/content/docs/hooks/useless.mdx
new file mode 100644
index 00000000..1b03dbcc
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useless.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLess"
+description: "Hook that can be so useless"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useless.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLess
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLess/useLess.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLess/useLess.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useless.props.json b/packages/docs-v2/content/docs/hooks/useless.props.json
new file mode 100644
index 00000000..e2e39751
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useless.props.json
@@ -0,0 +1,99 @@
+{
+ "name": "useLess",
+ "description": "Hook that can be so useless",
+ "examples": [
+ "const value = useLess(state);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "value",
+ "type": "Value",
+ "optional": true,
+ "description": "The value to be returned",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {Value} [value] The value to be returned",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[value]",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The value to be returned",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "Value",
+ "optional": false,
+ "description": "value passed to the hook",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {Value} The value passed to the hook",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "value passed to the hook",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "humor",
+ "warning": "This hook is a joke. Please do not use it in production code!",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselist.mdx b/packages/docs-v2/content/docs/hooks/uselist.mdx
new file mode 100644
index 00000000..0ab31509
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselist.mdx
@@ -0,0 +1,47 @@
+---
+title: "useList"
+description: "Hook that provides state and helper methods to manage a list of items"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselist.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useList
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useList/useList.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useList/useList.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselist.props.json b/packages/docs-v2/content/docs/hooks/uselist.props.json
new file mode 100644
index 00000000..83d5685c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselist.props.json
@@ -0,0 +1,106 @@
+{
+ "name": "useList",
+ "description": "Hook that provides state and helper methods to manage a list of items",
+ "examples": [
+ "const { value, set, push, removeAt, insertAt, updateAt, clear } = useList();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialList",
+ "type": "Item[] | (() => Item[])",
+ "optional": false,
+ "description": "The initial list of items",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Item[] | (() => Item[])} initialList The initial list of items",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialList",
+ "postName": " ",
+ "type": "{Item[] | (() => Item[])}",
+ "postType": " ",
+ "description": "The initial list of items",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseListReturn",
+ "optional": false,
+ "description": "object containing the current list and functions to interact with the list",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseListReturn} An object containing the current list and functions to interact with the list",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseListReturn}",
+ "postType": " ",
+ "description": "object containing the current list and functions to interact with the list",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "Artem Dereviago",
+ "avatar": "https://gravatar.com/avatar/e6da87aa67d2489c7a93e19319264f16?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselocalstorage.mdx b/packages/docs-v2/content/docs/hooks/uselocalstorage.mdx
new file mode 100644
index 00000000..3f4bcc0c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselocalstorage.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLocalStorage"
+description: "Hook that manages local storage value"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselocalstorage.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLocalStorage
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLocalStorage/useLocalStorage.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLocalStorage/useLocalStorage.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselocalstorage.props.json b/packages/docs-v2/content/docs/hooks/uselocalstorage.props.json
new file mode 100644
index 00000000..6fdd941c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselocalstorage.props.json
@@ -0,0 +1,132 @@
+{
+ "name": "useLocalStorage",
+ "description": "Hook that manages local storage value",
+ "examples": [
+ "const { value, set, remove } = useLocalStorage('key', 'value');"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "key",
+ "type": "string",
+ "optional": false,
+ "description": "The key of the storage",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {string} key The key of the storage",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "key",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The key of the storage",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "UseStorageInitialValue",
+ "optional": true,
+ "description": "The initial value of the storage",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {UseStorageInitialValue} [initialValue] The initial value of the storage",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[initialValue]",
+ "postName": " ",
+ "type": "{UseStorageInitialValue}",
+ "postType": " ",
+ "description": "The initial value of the storage",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseStorageOptions",
+ "optional": true,
+ "description": "The options of the storage",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {UseStorageOptions} [options] The options of the storage",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseStorageOptions}",
+ "postType": " ",
+ "description": "The options of the storage",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 12,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "state",
+ "browserapi": "localStorage",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselockcallback.mdx b/packages/docs-v2/content/docs/hooks/uselockcallback.mdx
new file mode 100644
index 00000000..58a34339
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselockcallback.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLockCallback"
+description: "Hook that prevents a callback from being executed multiple times simultaneously"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselockcallback.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLockCallback
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLockCallback/useLockCallback.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLockCallback/useLockCallback.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselockcallback.props.json b/packages/docs-v2/content/docs/hooks/uselockcallback.props.json
new file mode 100644
index 00000000..5e0558b0
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselockcallback.props.json
@@ -0,0 +1,98 @@
+{
+ "name": "useLockCallback",
+ "description": "Hook that prevents a callback from being executed multiple times simultaneously",
+ "examples": [
+ "const lockedCallback = useLockCallback(() => promise());"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "Function",
+ "optional": false,
+ "description": "The callback to be locked",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {Function} callback The callback to be locked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{Function}",
+ "postType": " ",
+ "description": "The callback to be locked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "Function",
+ "optional": false,
+ "description": "locked callback",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @returns {Function} The locked callback",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{Function}",
+ "postType": " ",
+ "description": "locked callback",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "async",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselockscroll.mdx b/packages/docs-v2/content/docs/hooks/uselockscroll.mdx
new file mode 100644
index 00000000..05231211
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselockscroll.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLockScroll"
+description: "Hook that locks scroll on an element or document body"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselockscroll.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLockScroll
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLockScroll/useLockScroll.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLockScroll/useLockScroll.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselockscroll.props.json b/packages/docs-v2/content/docs/hooks/uselockscroll.props.json
new file mode 100644
index 00000000..74bb4034
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselockscroll.props.json
@@ -0,0 +1,207 @@
+{
+ "name": "useLockScroll",
+ "description": "Hook that locks scroll on an element or document body",
+ "examples": [
+ "const { lock, unlock, value, toggle } = useLockScroll(ref);",
+ "const { ref, lock, unlock, value, toggle } = useLockScroll();"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The target element to lock scroll on",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} [target=document.body] The target element to lock scroll on",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[target=document.body]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to lock scroll on",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "document.body"
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseLockScrollOptions",
+ "optional": true,
+ "description": "The options for scroll locking",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {UseLockScrollOptions} [options] The options for scroll locking",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseLockScrollOptions}",
+ "postType": " ",
+ "description": "The options for scroll locking",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "",
+ "type": "void",
+ "optional": false,
+ "description": "",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {void}",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "",
+ "postName": "",
+ "type": "{void}",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseLockScrollOptions",
+ "optional": true,
+ "description": "The options for scroll locking",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {UseLockScrollOptions} [options] The options for scroll locking",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseLockScrollOptions}",
+ "postType": " ",
+ "description": "The options for scroll locking",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "Ref",
+ "type": "StateRef",
+ "optional": false,
+ "description": "to attach to element, or locks body scroll by default",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {StateRef} Ref to attach to element, or locks body scroll by default",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "Ref",
+ "postName": " ",
+ "type": "{StateRef}",
+ "postType": " ",
+ "description": "to attach to element, or locks body scroll by default",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselogger.mdx b/packages/docs-v2/content/docs/hooks/uselogger.mdx
new file mode 100644
index 00000000..7d93e171
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselogger.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLogger"
+description: "Hook for debugging lifecycle"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselogger.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLogger
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLogger/useLogger.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLogger/useLogger.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselogger.props.json b/packages/docs-v2/content/docs/hooks/uselogger.props.json
new file mode 100644
index 00000000..680a8b95
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselogger.props.json
@@ -0,0 +1,103 @@
+{
+ "name": "useLogger",
+ "description": "Hook for debugging lifecycle",
+ "examples": [
+ "useLogger('Component', [1, 2, 3]);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "name",
+ "type": "string",
+ "optional": false,
+ "description": "The name or identifier for the logger",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {string} name The name or identifier for the logger",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "name",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The name or identifier for the logger",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "params",
+ "type": "unknown[]",
+ "optional": false,
+ "description": "Additional arguments to be logged",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {unknown[]} params Additional arguments to be logged",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "params",
+ "postName": " ",
+ "type": "{unknown[]}",
+ "postType": " ",
+ "description": "Additional arguments to be logged",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 8,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "debug",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/uselongpress.mdx b/packages/docs-v2/content/docs/hooks/uselongpress.mdx
new file mode 100644
index 00000000..6825aeb7
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselongpress.mdx
@@ -0,0 +1,47 @@
+---
+title: "useLongPress"
+description: "Hook that defines the logic when long pressing an element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './uselongpress.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useLongPress
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLongPress/useLongPress.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useLongPress/useLongPress.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/uselongpress.props.json b/packages/docs-v2/content/docs/hooks/uselongpress.props.json
new file mode 100644
index 00000000..fec9650a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/uselongpress.props.json
@@ -0,0 +1,266 @@
+{
+ "name": "useLongPress",
+ "description": "Hook that defines the logic when long pressing an element",
+ "examples": [
+ "const pressed = useLongPress(ref, () => console.log('callback'));",
+ "const { ref, pressed } = useLongPress(() => console.log('callback'));"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to be long pressed",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target element to be long pressed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to be long pressed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: LongPressEvents) => void",
+ "optional": false,
+ "description": "The callback function to be invoked on long press",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(event: LongPressEvents) => void} callback The callback function to be invoked on long press",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: LongPressEvents) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on long press",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseLongPressOptions",
+ "optional": true,
+ "description": "The options for the long press",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {UseLongPressOptions} [options] The options for the long press",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseLongPressOptions}",
+ "postType": " ",
+ "description": "The options for the long press",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "boolean",
+ "optional": false,
+ "description": "long pressing state",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @returns {boolean} The long pressing state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "long pressing state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 11,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(event: LongPressEvents) => void",
+ "optional": false,
+ "description": "The callback function to be invoked on long press",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @param {(event: LongPressEvents) => void} callback The callback function to be invoked on long press",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(event: LongPressEvents) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on long press",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseLongPressOptions",
+ "optional": true,
+ "description": "The options for the long press",
+ "problems": [],
+ "source": [
+ {
+ "number": 18,
+ "source": " * @param {UseLongPressOptions} [options] The options for the long press",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options]",
+ "postName": " ",
+ "type": "{UseLongPressOptions}",
+ "postType": " ",
+ "description": "The options for the long press",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "boolean",
+ "optional": false,
+ "description": "long pressing state",
+ "problems": [],
+ "source": [
+ {
+ "number": 19,
+ "source": " * @returns {boolean} The long pressing state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "long pressing state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 20,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "elements",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemap.mdx b/packages/docs-v2/content/docs/hooks/usemap.mdx
new file mode 100644
index 00000000..0b60ce32
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemap.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMap"
+description: "Hook that manages a map structure"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemap.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMap
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMap/useMap.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMap/useMap.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemap.props.json b/packages/docs-v2/content/docs/hooks/usemap.props.json
new file mode 100644
index 00000000..10d0b097
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemap.props.json
@@ -0,0 +1,102 @@
+{
+ "name": "useMap",
+ "description": "Hook that manages a map structure",
+ "examples": [
+ "const { value, set, remove, clear, reset, size, has } = useMap([1, 'one'], [2, 'two']);"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "values",
+ "type": "Value[]",
+ "optional": true,
+ "description": "The initial array of the map",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value[]} [values] The initial array of the map",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[values]",
+ "postName": " ",
+ "type": "{Value[]}",
+ "postType": " ",
+ "description": "The initial array of the map",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMapReturn",
+ "optional": false,
+ "description": "object containing the current map and functions to interact with the map",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseMapReturn} An object containing the current map and functions to interact with the map",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMapReturn}",
+ "postType": " ",
+ "description": "object containing the current map and functions to interact with the map",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemeasure.mdx b/packages/docs-v2/content/docs/hooks/usemeasure.mdx
new file mode 100644
index 00000000..addaeda1
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemeasure.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMeasure"
+description: "Hook to measure the size and position of an element"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemeasure.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMeasure
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMeasure/useMeasure.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMeasure/useMeasure.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemeasure.props.json b/packages/docs-v2/content/docs/hooks/usemeasure.props.json
new file mode 100644
index 00000000..90a10dbe
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemeasure.props.json
@@ -0,0 +1,149 @@
+{
+ "name": "useMeasure",
+ "description": "Hook to measure the size and position of an element",
+ "examples": [
+ "const { x, y, width, height, top, left, bottom, right } = useMeasure(ref);",
+ "const { ref, x, y, width, height, top, left, bottom, right } = useMeasure();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The element to measure",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The element to measure",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The element to measure",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseMeasureReturn",
+ "optional": false,
+ "description": "element's size and position",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseMeasureReturn} The element's size and position",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseMeasureReturn}",
+ "postType": " ",
+ "description": "element's size and position",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "The",
+ "type": "UseMeasureReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "element's size and position",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @returns {UseMeasureReturn & { ref: StateRef }} The element's size and position",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "The",
+ "postName": " ",
+ "type": "{UseMeasureReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "element's size and position",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 16,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemediacontrols.mdx b/packages/docs-v2/content/docs/hooks/usemediacontrols.mdx
new file mode 100644
index 00000000..b9e36000
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemediacontrols.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMediaControls"
+description: "that provides controls for HTML media elements (audio/video)"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemediacontrols.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMediaControls
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMediaControls/useMediaControls.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMediaControls/useMediaControls.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemediacontrols.props.json b/packages/docs-v2/content/docs/hooks/usemediacontrols.props.json
new file mode 100644
index 00000000..8a96130c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemediacontrols.props.json
@@ -0,0 +1,394 @@
+{
+ "name": "useMediaControls",
+ "description": "that provides controls for HTML media elements (audio/video)",
+ "examples": [
+ "const { playing, play, pause } = useMediaControls(videoRef, 'video.mp4');",
+ "const { playing, play, pause } = useMediaControls(audioRef, { src: 'audio.mp3', type: 'audio/mp3' });",
+ "const { ref, playing, play, pause } = useMediaControls('video.mp4');",
+ "const { ref, playing, play, pause } = useMediaControls({ src: 'video.mp4', type: 'video/mp4' });"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target media element",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} target The target media element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target media element",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "src",
+ "type": "string",
+ "optional": false,
+ "description": "The source URL of the media",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} src The source URL of the media",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "src",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The source URL of the media",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMediaControlsReturn",
+ "optional": false,
+ "description": "object containing media controls and state",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {UseMediaControlsReturn} An object containing media controls and state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMediaControlsReturn}",
+ "postType": " ",
+ "description": "object containing media controls and state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target media element",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {HookTarget} target The target media element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target media element",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseMediaSource",
+ "optional": false,
+ "description": "The media source configuration",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @param {UseMediaSource} options The media source configuration",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "options",
+ "postName": " ",
+ "type": "{UseMediaSource}",
+ "postType": " ",
+ "description": "The media source configuration",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMediaControlsReturn",
+ "optional": false,
+ "description": "object containing media controls and state",
+ "problems": [],
+ "source": [
+ {
+ "number": 17,
+ "source": " * @returns {UseMediaControlsReturn} An object containing media controls and state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMediaControlsReturn}",
+ "postType": " ",
+ "description": "object containing media controls and state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 18,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "src",
+ "type": "string",
+ "optional": false,
+ "description": "The source URL of the media",
+ "problems": [],
+ "source": [
+ {
+ "number": 24,
+ "source": " * @param {string} src The source URL of the media",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "src",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The source URL of the media",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMediaControlsReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object containing media controls, state and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @returns {UseMediaControlsReturn & { ref: StateRef }} An object containing media controls, state and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMediaControlsReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing media controls, state and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 26,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options",
+ "type": "UseMediaSource",
+ "optional": false,
+ "description": "The media source configuration",
+ "problems": [],
+ "source": [
+ {
+ "number": 32,
+ "source": " * @param {UseMediaSource} options The media source configuration",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "options",
+ "postName": " ",
+ "type": "{UseMediaSource}",
+ "postType": " ",
+ "description": "The media source configuration",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMediaControlsReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object containing media controls, state and ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 33,
+ "source": " * @returns {UseMediaControlsReturn & { ref: StateRef }} An object containing media controls, state and ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMediaControlsReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object containing media controls, state and ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 34,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1770651919000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemediaquery.mdx b/packages/docs-v2/content/docs/hooks/usemediaquery.mdx
new file mode 100644
index 00000000..c5a795d7
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemediaquery.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMediaQuery"
+description: "Hook that manages a media query"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemediaquery.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMediaQuery
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMediaQuery/useMediaQuery.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMediaQuery/useMediaQuery.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemediaquery.props.json b/packages/docs-v2/content/docs/hooks/usemediaquery.props.json
new file mode 100644
index 00000000..c1e4df6c
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemediaquery.props.json
@@ -0,0 +1,103 @@
+{
+ "name": "useMediaQuery",
+ "description": "Hook that manages a media query",
+ "examples": [
+ "const matches = useMediaQuery('(max-width: 768px)');"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "query",
+ "type": "string",
+ "optional": false,
+ "description": "The media query string",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {string} query The media query string",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "query",
+ "postName": " ",
+ "type": "{string}",
+ "postType": " ",
+ "description": "The media query string",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "boolean",
+ "optional": false,
+ "description": "boolean indicating if the media query matches",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @returns {boolean} A boolean indicating if the media query matches",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "boolean indicating if the media query matches",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 10,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "window.matchMedia",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1755150117000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usememory.mdx b/packages/docs-v2/content/docs/hooks/usememory.mdx
new file mode 100644
index 00000000..9fb15bc9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usememory.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMemory"
+description: "Hook that gives you current memory usage"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usememory.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMemory
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMemory/useMemory.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMemory/useMemory.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usememory.props.json b/packages/docs-v2/content/docs/hooks/usememory.props.json
new file mode 100644
index 00000000..10bc766f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usememory.props.json
@@ -0,0 +1,74 @@
+{
+ "name": "useMemory",
+ "description": "Hook that gives you current memory usage",
+ "examples": [
+ "const { supported, value } = useMemory();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMemoryReturn",
+ "optional": false,
+ "description": "object containing the current memory usage",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseMemoryReturn} An object containing the current memory usage",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMemoryReturn}",
+ "postType": " ",
+ "description": "object containing the current memory usage",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "performance.memory",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1755262808000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemergedref.mdx b/packages/docs-v2/content/docs/hooks/usemergedref.mdx
new file mode 100644
index 00000000..81068bc9
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemergedref.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMergedRef"
+description: "Hook that merges multiple refs into a single ref"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemergedref.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMergedRef
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMergedRef/useMergedRef.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMergedRef/useMergedRef.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemergedref.props.json b/packages/docs-v2/content/docs/hooks/usemergedref.props.json
new file mode 100644
index 00000000..0590c69f
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemergedref.props.json
@@ -0,0 +1,98 @@
+{
+ "name": "useMergedRef",
+ "description": "Hook that merges multiple refs into a single ref",
+ "examples": [
+ "const mergedRef = useMergedRef(firstRef, secondRef);"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "refs",
+ "type": "...Ref[]",
+ "optional": false,
+ "description": "The refs to merge",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {...Ref[]} refs The refs to merge",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "refs",
+ "postName": " ",
+ "type": "{...Ref[]}",
+ "postType": " ",
+ "description": "The refs to merge",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "RefCallback",
+ "optional": false,
+ "description": "memoized ref callback that assigns to all provided refs",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {RefCallback} A memoized ref callback that assigns to all provided refs",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{RefCallback}",
+ "postType": " ",
+ "description": "memoized ref callback that assigns to all provided refs",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "state",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1756623419000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemount.mdx b/packages/docs-v2/content/docs/hooks/usemount.mdx
new file mode 100644
index 00000000..a35e0045
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemount.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMount"
+description: "Hook that executes a callback when the component mounts"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemount.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMount
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMount/useMount.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMount/useMount.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemount.props.json b/packages/docs-v2/content/docs/hooks/usemount.props.json
new file mode 100644
index 00000000..5398a6ae
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemount.props.json
@@ -0,0 +1,75 @@
+{
+ "name": "useMount",
+ "description": "Hook that executes a callback when the component mounts",
+ "examples": [
+ "useMount(() => console.log('This effect runs on the initial render'));"
+ ],
+ "usage": "necessary",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "effect",
+ "type": "EffectCallback",
+ "optional": false,
+ "description": "The callback to execute",
+ "problems": [],
+ "source": [
+ {
+ "number": 6,
+ "source": " * @param {EffectCallback} effect The callback to execute",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "effect",
+ "postName": " ",
+ "type": "{EffectCallback}",
+ "postType": " ",
+ "description": "The callback to execute",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 7,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": null
+ }
+ ],
+ "category": "lifecycle",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemouse.mdx b/packages/docs-v2/content/docs/hooks/usemouse.mdx
new file mode 100644
index 00000000..38c6dbf6
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemouse.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMouse"
+description: "Hook that manages a mouse position"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemouse.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMouse
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMouse/useMouse.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMouse/useMouse.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemouse.props.json b/packages/docs-v2/content/docs/hooks/usemouse.props.json
new file mode 100644
index 00000000..7ea00ebb
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemouse.props.json
@@ -0,0 +1,154 @@
+{
+ "name": "useMouse",
+ "description": "Hook that manages a mouse position",
+ "examples": [
+ "const { x, y, clientX, clientY, elementX, elementY, elementPositionX, elementPositionY } = useMouse(ref);",
+ "const { ref, x, y, clientX, clientY, elementX, elementY, elementPositionX, elementPositionY } = useMouse();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": true,
+ "description": "The target element to manage the mouse position for",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {HookTarget} [target=window] The target element to manage the mouse position for",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[target=window]",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to manage the mouse position for",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "window"
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMouseReturn",
+ "optional": false,
+ "description": "object with the current mouse position",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseMouseReturn} An object with the current mouse position",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMouseReturn}",
+ "postType": " ",
+ "description": "object with the current mouse position",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMouseReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "object with the current mouse position and a ref",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @returns {UseMouseReturn & { ref: StateRef }} An object with the current mouse position and a ref",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMouseReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "object with the current mouse position and a ref",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 16,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "hasTests": false,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemutation.mdx b/packages/docs-v2/content/docs/hooks/usemutation.mdx
new file mode 100644
index 00000000..06c3160a
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemutation.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMutation"
+description: "Hook that defines the logic when mutate data"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemutation.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMutation
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMutation/useMutation.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMutation/useMutation.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemutation.props.json b/packages/docs-v2/content/docs/hooks/usemutation.props.json
new file mode 100644
index 00000000..fa8cd6c5
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemutation.props.json
@@ -0,0 +1,186 @@
+{
+ "name": "useMutation",
+ "description": "Hook that defines the logic when mutate data",
+ "examples": [
+ "const { mutate, mutateAsync, isLoading, isError, isSuccess, error, data } = useMutation((name) => Promise.resolve(name));"
+ ],
+ "usage": "high",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "(body: Body) => Promise",
+ "optional": false,
+ "description": "The callback function to be invoked",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @param {(body: Body) => Promise} callback The callback function to be invoked",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{(body: Body) => Promise}",
+ "postType": " ",
+ "description": "The callback function to be invoked",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.retry",
+ "type": "boolean | number",
+ "optional": true,
+ "description": "The retry count of requests",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {boolean | number} [options.retry] The retry count of requests",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.retry]",
+ "postName": " ",
+ "type": "{boolean | number}",
+ "postType": " ",
+ "description": "The retry count of requests",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onSuccess",
+ "type": "(data: Data) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on success",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {(data: Data) => void} [options.onSuccess] The callback function to be invoked on success",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onSuccess]",
+ "postName": " ",
+ "type": "{(data: Data) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on success",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.onError",
+ "type": "(error: Error) => void",
+ "optional": true,
+ "description": "The callback function to be invoked on error",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {(error: Error) => void} [options.onError] The callback function to be invoked on error",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onError]",
+ "postName": " ",
+ "type": "{(error: Error) => void}",
+ "postType": " ",
+ "description": "The callback function to be invoked on error",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMutationReturn",
+ "optional": false,
+ "description": "object with the state of the mutation",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @returns {UseMutationReturn} An object with the state of the mutation",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMutationReturn}",
+ "postType": " ",
+ "description": "object with the state of the mutation",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 13,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "async",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ }
+ ],
+ "lastModified": 1771583395000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usemutationobserver.mdx b/packages/docs-v2/content/docs/hooks/usemutationobserver.mdx
new file mode 100644
index 00000000..1b56a5ef
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemutationobserver.mdx
@@ -0,0 +1,47 @@
+---
+title: "useMutationObserver"
+description: "Hook that gives you mutation observer state"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usemutationobserver.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useMutationObserver
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMutationObserver/useMutationObserver.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useMutationObserver/useMutationObserver.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usemutationobserver.props.json b/packages/docs-v2/content/docs/hooks/usemutationobserver.props.json
new file mode 100644
index 00000000..c15efc62
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usemutationobserver.props.json
@@ -0,0 +1,677 @@
+{
+ "name": "useMutationObserver",
+ "description": "Hook that gives you mutation observer state",
+ "examples": [
+ "const { observer, stop } = useMutationObserver(ref, { childList: true });",
+ "const { ref, observer, stop } = useMutationObserver({ childList: true });",
+ "const { ref, observer, stop } = useMutationObserver((mutations) => console.log(mutations));",
+ "const { observer, stop } = useMutationObserver((mutations) => console.log(mutations), ref);"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to observe",
+ "problems": [],
+ "source": [
+ {
+ "number": 9,
+ "source": " * @param {HookTarget} target The target element to observe",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to observe",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the mutation observer",
+ "problems": [],
+ "source": [
+ {
+ "number": 10,
+ "source": " * @param {boolean} [options.enabled=true] The enabled state of the mutation observer",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the mutation observer",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "UseMutationObserverCallback",
+ "optional": true,
+ "description": "The callback to execute when mutation is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 11,
+ "source": " * @param {UseMutationObserverCallback} [options.onChange] The callback to execute when mutation is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{UseMutationObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when mutation is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.attributes",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's attributes are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 12,
+ "source": " * @param {boolean} [options.attributes] Set to true if mutations to target's attributes are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.attributes]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's attributes are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.characterData",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's data are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 13,
+ "source": " * @param {boolean} [options.characterData] Set to true if mutations to target's data are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.characterData]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's data are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.childList",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's children are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 14,
+ "source": " * @param {boolean} [options.childList] Set to true if mutations to target's children are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.childList]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's children are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.subtree",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 15,
+ "source": " * @param {boolean} [options.subtree] Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.subtree]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMutationObserverReturn",
+ "optional": false,
+ "description": "object containing the mutation observer state",
+ "problems": [],
+ "source": [
+ {
+ "number": 16,
+ "source": " * @returns {UseMutationObserverReturn} An object containing the mutation observer state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMutationObserverReturn}",
+ "postType": " ",
+ "description": "object containing the mutation observer state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 17,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 1,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "options.enabled",
+ "type": "boolean",
+ "optional": true,
+ "description": "The enabled state of the mutation observer",
+ "problems": [],
+ "source": [
+ {
+ "number": 23,
+ "source": " * @param {boolean} [options.enabled=true] The enabled state of the mutation observer",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.enabled=true]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "The enabled state of the mutation observer",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ],
+ "default": "true"
+ },
+ {
+ "tag": "param",
+ "name": "options.onChange",
+ "type": "UseMutationObserverCallback",
+ "optional": true,
+ "description": "The callback to execute when mutation is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 24,
+ "source": " * @param {UseMutationObserverCallback} [options.onChange] The callback to execute when mutation is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.onChange]",
+ "postName": " ",
+ "type": "{UseMutationObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when mutation is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.attributes",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's attributes are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 25,
+ "source": " * @param {boolean} [options.attributes] Set to true if mutations to target's attributes are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.attributes]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's attributes are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.characterData",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's data are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 26,
+ "source": " * @param {boolean} [options.characterData] Set to true if mutations to target's data are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.characterData]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's data are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.childList",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to target's children are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 27,
+ "source": " * @param {boolean} [options.childList] Set to true if mutations to target's children are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.childList]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to target's children are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "options.subtree",
+ "type": "boolean",
+ "optional": true,
+ "description": "Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "problems": [],
+ "source": [
+ {
+ "number": 28,
+ "source": " * @param {boolean} [options.subtree] Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "[options.subtree]",
+ "postName": " ",
+ "type": "{boolean}",
+ "postType": " ",
+ "description": "Set to true if mutations to not just target, but also target's descendants are to be observed",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseMutationObserverReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "React ref to attach to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 29,
+ "source": " * @returns {UseMutationObserverReturn & { ref: StateRef }} A React ref to attach to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseMutationObserverReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "React ref to attach to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 30,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 2,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "UseMutationObserverCallback",
+ "optional": false,
+ "description": "The callback to execute when mutation is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 36,
+ "source": " * @param {UseMutationObserverCallback} callback The callback to execute when mutation is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{UseMutationObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when mutation is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "A",
+ "type": "UseMutationObserverReturn & { ref: StateRef }",
+ "optional": false,
+ "description": "React ref to attach to the target element",
+ "problems": [],
+ "source": [
+ {
+ "number": 37,
+ "source": " * @returns {UseMutationObserverReturn & { ref: StateRef }} A React ref to attach to the target element",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "A",
+ "postName": " ",
+ "type": "{UseMutationObserverReturn & { ref: StateRef }}",
+ "postType": " ",
+ "description": "React ref to attach to the target element",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 38,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": 3,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "callback",
+ "type": "UseMutationObserverCallback",
+ "optional": false,
+ "description": "The callback to execute when mutation is detected",
+ "problems": [],
+ "source": [
+ {
+ "number": 43,
+ "source": " * @param {UseMutationObserverCallback} callback The callback to execute when mutation is detected",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "callback",
+ "postName": " ",
+ "type": "{UseMutationObserverCallback}",
+ "postType": " ",
+ "description": "The callback to execute when mutation is detected",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ },
+ {
+ "tag": "param",
+ "name": "target",
+ "type": "HookTarget",
+ "optional": false,
+ "description": "The target element to observe",
+ "problems": [],
+ "source": [
+ {
+ "number": 44,
+ "source": " * @param {HookTarget} target The target element to observe",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "target",
+ "postName": " ",
+ "type": "{HookTarget}",
+ "postType": " ",
+ "description": "The target element to observe",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseMutationObserverReturn",
+ "optional": false,
+ "description": "object containing the mutation observer state",
+ "problems": [],
+ "source": [
+ {
+ "number": 45,
+ "source": " * @returns {UseMutationObserverReturn} An object containing the mutation observer state",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseMutationObserverReturn}",
+ "postType": " ",
+ "description": "object containing the mutation observer state",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 46,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "sensors",
+ "browserapi": "MutationObserver",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ }
+ ],
+ "lastModified": 1768553242000
+}
diff --git a/packages/docs-v2/content/docs/hooks/usenetwork.mdx b/packages/docs-v2/content/docs/hooks/usenetwork.mdx
new file mode 100644
index 00000000..3336b382
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usenetwork.mdx
@@ -0,0 +1,47 @@
+---
+title: "useNetwork"
+description: "Hook to track network status"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './usenetwork.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useNetwork
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useNetwork/useNetwork.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useNetwork/useNetwork.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/usenetwork.props.json b/packages/docs-v2/content/docs/hooks/usenetwork.props.json
new file mode 100644
index 00000000..d0941689
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/usenetwork.props.json
@@ -0,0 +1,78 @@
+{
+ "name": "useNetwork",
+ "description": "Hook to track network status",
+ "examples": [
+ "const { online, downlink, downlinkMax, effectiveType, rtt, saveData, type } = useNetwork();"
+ ],
+ "usage": "low",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseNetworkReturn",
+ "optional": false,
+ "description": "object containing the network status",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseNetworkReturn} An object containing the network status",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseNetworkReturn}",
+ "postType": " ",
+ "description": "object containing the network status",
+ "end": "",
+ "lineEnd": ""
+ }
+ },
+ {
+ "number": 9,
+ "source": " *",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": "",
+ "tag": "",
+ "postTag": "",
+ "name": "",
+ "postName": "",
+ "type": "",
+ "postType": "",
+ "description": "",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "category": "browser",
+ "browserapi": "navigator.connection",
+ "hasTests": true,
+ "contributors": [
+ {
+ "name": "debabin",
+ "avatar": "https://gravatar.com/avatar/0d80b3fd9c97adcdd11b8c18ecef1054?d=retro"
+ },
+ {
+ "name": "hywax",
+ "avatar": "https://gravatar.com/avatar/ab8b137d9abca284149f9e016d760700?d=retro"
+ },
+ {
+ "name": "waldymarxthf",
+ "avatar": "https://gravatar.com/avatar/762486d1c53f0bc2344106dcad837e1c?d=retro"
+ }
+ ],
+ "lastModified": 1754977987000
+}
diff --git a/packages/docs-v2/content/docs/hooks/useobject.mdx b/packages/docs-v2/content/docs/hooks/useobject.mdx
new file mode 100644
index 00000000..0f56e598
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useobject.mdx
@@ -0,0 +1,47 @@
+---
+title: "useObject"
+description: "Hook that provides state and helper methods to manage an object"
+---
+import { DocHeader, DocContributors, DocTableApi, DocUsageExamples } from '@/components/hook-doc-page';
+import { DocDemo } from '@/components/demo';
+import hookDoc from './useobject.props.json';
+
+
+
+
+
+## Installation
+
+```bash
+npx useverse@latest add useObject
+```
+
+
+
+## Usage
+
+
+
+
+
+## Usage
+
+
+
+
+
+## Api
+
+
+
+
+
+## Source
+
+[Source](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useObject/useObject.ts)
+[Demo](https://github.com/siberiacancode/reactuse/blob/main/packages/core/src/hooks/useObject/useObject.demo.tsx)
+
+
+
+## Contributors
+
diff --git a/packages/docs-v2/content/docs/hooks/useobject.props.json b/packages/docs-v2/content/docs/hooks/useobject.props.json
new file mode 100644
index 00000000..5265278e
--- /dev/null
+++ b/packages/docs-v2/content/docs/hooks/useobject.props.json
@@ -0,0 +1,102 @@
+{
+ "name": "useObject",
+ "description": "Hook that provides state and helper methods to manage an object",
+ "examples": [
+ "const { value, set, reset, remove, update, merge, clear, toggle, has, keys, isEmpty, size } = useObject({ name: 'John', age: 30, isActive: true });"
+ ],
+ "usage": "medium",
+ "apiParameters": [
+ {
+ "id": 0,
+ "parameters": [
+ {
+ "tag": "param",
+ "name": "initialValue",
+ "type": "Value",
+ "optional": false,
+ "description": "The initial object value",
+ "problems": [],
+ "source": [
+ {
+ "number": 7,
+ "source": " * @param {Value} initialValue The initial object value",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@param",
+ "postTag": " ",
+ "name": "initialValue",
+ "postName": " ",
+ "type": "{Value}",
+ "postType": " ",
+ "description": "The initial object value",
+ "end": "",
+ "lineEnd": ""
+ }
+ }
+ ]
+ }
+ ],
+ "returns": {
+ "tag": "returns",
+ "name": "An",
+ "type": "UseObjectReturn",
+ "optional": false,
+ "description": "object containing the current state and functions to interact with the object",
+ "problems": [],
+ "source": [
+ {
+ "number": 8,
+ "source": " * @returns {UseObjectReturn} An object containing the current state and functions to interact with the object",
+ "tokens": {
+ "start": " ",
+ "delimiter": "*",
+ "postDelimiter": " ",
+ "tag": "@returns",
+ "postTag": " ",
+ "name": "An",
+ "postName": " ",
+ "type": "{UseObjectReturn