diff --git a/apps/www/content/docs/hooks/use-toggle.mdx b/apps/www/content/docs/hooks/use-toggle.mdx
new file mode 100644
index 00000000..450ad6bf
--- /dev/null
+++ b/apps/www/content/docs/hooks/use-toggle.mdx
@@ -0,0 +1,70 @@
+---
+title: useToggle
+description: Manage a boolean toggle state
+---
+
+
+```json doc-gen:file
+{
+ "file": "./src/components/demos/UseToggle/UseToggle.tsx",
+ "codeblock": true
+}
+```
+
+
+## Installation
+
+
+
+
+ ### Copy-paste the hook
+
+ Copy and paste the hook code in a `.ts` file.
+
+ ```json doc-gen:file
+ {
+ "file": "./src/hooks/use-toggle.ts",
+ "codeblock": true
+ }
+ ```
+
+
+
+
+
+### Usage
+
+```ts
+import { useToggle } from '~/hooks/use-toggle';
+```
+
+```tsx
+const { on, toggle, setToggle } = useToggle();
+
+on ? On : Off;
+toggle();
+setToggle(true);
+```
+
+## Details
+
+### Toggle Functionality
+
+- The hook provides a simple and efficient way to manage a boolean toggle state, allowing you to easily switch between two states (on/off).
+- It initializes the toggle state based on an optional `defaultValue`, which defaults to `false` if not provided.
+
+### State Management
+
+- **`on`**: A boolean state that indicates the current status of the toggle. It is `true` when the toggle is in the "on" position and `false` when it is "off".
+- **`setToggle`**: A function that allows you to directly set the toggle state to a specific boolean value, providing flexibility in managing the toggle state programmatically.
+
+### Toggle Action
+
+- **`toggle`**: A function that toggles the state of `on` between `true` and `false`. This function can be called in response to user actions (e.g., button clicks) to change the toggle state seamlessly.
+
+### Return Value
+
+- The hook returns an object containing:
+- **`on`**: A boolean indicating the current state of the toggle (`true` for "on", `false` for "off").
+- **`toggle`**: A function to toggle the state between "on" and "off".
+- **`setToggle`**: A function to directly set the toggle state to a specific boolean value.
diff --git a/apps/www/src/components/ComponentPreview/Components.tsx b/apps/www/src/components/ComponentPreview/Components.tsx
index 7e22ea85..c2d0e21e 100644
--- a/apps/www/src/components/ComponentPreview/Components.tsx
+++ b/apps/www/src/components/ComponentPreview/Components.tsx
@@ -1213,4 +1213,13 @@ export const Components: Record = {
})),
),
},
+ 'use-toggle': {
+ name: 'use-toggle',
+ type: 'hook:example',
+ component: lazy(() =>
+ import('../demos/UseToggle').then((module) => ({
+ default: module.UseToggleDemo,
+ })),
+ ),
+ },
};
diff --git a/apps/www/src/components/demos/UseToggle/UseToggle.tsx b/apps/www/src/components/demos/UseToggle/UseToggle.tsx
new file mode 100644
index 00000000..e563ef32
--- /dev/null
+++ b/apps/www/src/components/demos/UseToggle/UseToggle.tsx
@@ -0,0 +1,33 @@
+'use client';
+
+import { Button } from '@kosori/ui/button';
+import { Switch } from '@kosori/ui/switch';
+
+import { useToggle } from '~/hooks/use-toggle';
+
+export const UseToggleDemo = () => {
+ const { on, toggle, setToggle } = useToggle();
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/apps/www/src/components/demos/UseToggle/index.ts b/apps/www/src/components/demos/UseToggle/index.ts
new file mode 100644
index 00000000..4f00ac81
--- /dev/null
+++ b/apps/www/src/components/demos/UseToggle/index.ts
@@ -0,0 +1 @@
+export * from './UseToggle';
diff --git a/apps/www/src/hooks/use-toggle.ts b/apps/www/src/hooks/use-toggle.ts
new file mode 100644
index 00000000..d2ff2b5a
--- /dev/null
+++ b/apps/www/src/hooks/use-toggle.ts
@@ -0,0 +1,27 @@
+import { useCallback, useState } from 'react';
+
+/**
+ * A custom hook that manages a boolean toggle state.
+ *
+ * @param {boolean} [defaultValue=false] - Initial value for the toggle state. Defaults to `false` if not provided.
+ *
+ * @returns An object containing:
+ * - `on`: A boolean indicating the current state of the toggle (`true` for `on`, `false` for `off`).
+ * - `toggle`: A function to toggle the state between `on` and `off`.
+ * - `setToggle`: A function to directly set the toggle state to a specific boolean value.
+ *
+ * @example
+ * const { on, toggle, setToggle } = useToggle();
+ * on ? 'On' : 'Off';
+ * toggle();
+ * setToggle(true);
+ */
+export const useToggle = (defaultValue = false) => {
+ const [on, setToggle] = useState(!!defaultValue);
+
+ const toggle = useCallback(() => {
+ setToggle((x) => !x);
+ }, []);
+
+ return { on, toggle, setToggle };
+};