From 124f69aa9699fd9db1978daca9a4aa7a4b565f1a Mon Sep 17 00:00:00 2001 From: Riri Date: Tue, 2 Apr 2024 14:07:28 +0800 Subject: [PATCH] docs: init --- docs/components/BasicUseTransition/index.tsx | 27 ++++++ docs/components/Button.tsx | 4 + docs/pages/docs/index.mdx | 55 +++++++++++ docs/pages/docs/useTransition.mdx | 94 +++++++++++++++++++ docs/pages/index.mdx | 19 ++++ docs/public/status.png | Bin 0 -> 34100 bytes eslint.config.js | 8 +- package.json | 3 +- pnpm-lock.yaml | 3 + src/hooks/useTransition.ts | 3 +- src/types.ts | 16 +++- vocs.config.ts | 29 +++++- 12 files changed, 248 insertions(+), 13 deletions(-) create mode 100644 docs/components/BasicUseTransition/index.tsx create mode 100644 docs/components/Button.tsx create mode 100644 docs/pages/docs/index.mdx create mode 100644 docs/pages/docs/useTransition.mdx create mode 100644 docs/pages/index.mdx create mode 100644 docs/public/status.png diff --git a/docs/components/BasicUseTransition/index.tsx b/docs/components/BasicUseTransition/index.tsx new file mode 100644 index 0000000..301b0f1 --- /dev/null +++ b/docs/components/BasicUseTransition/index.tsx @@ -0,0 +1,27 @@ +import { useState } from 'react' +import { useTransition } from 'transition-hooks' +import { Button } from '../Button' + +export function BasicUseTransition() { + const [show, setShow] = useState(false) + const { status, shouldMount } = useTransition(show) + + return ( +
+ {shouldMount + ? ( +
+ Hello Word +
+ ) + : null} + +

status: { status }

+
+ ) +} diff --git a/docs/components/Button.tsx b/docs/components/Button.tsx new file mode 100644 index 0000000..b9f818b --- /dev/null +++ b/docs/components/Button.tsx @@ -0,0 +1,4 @@ +export function Button(props: React.HTMLProps) { + const { type: _, ...rest } = props + return +

{ status }

+ + ) +} +``` + +::: + diff --git a/docs/pages/docs/useTransition.mdx b/docs/pages/docs/useTransition.mdx new file mode 100644 index 0000000..1332a6e --- /dev/null +++ b/docs/pages/docs/useTransition.mdx @@ -0,0 +1,94 @@ +# useTransition + +This hook transforms a boolean state into transition status, and unmount the component after timeout. + +import { BasicUseTransition } from "../../components/BasicUseTransition" + +:::code-group + +
+ +
+ +```tsx [Code] +import { useState } from 'react' +import { useTransition } from 'transition-hooks' + +export function BasicUseTransition() { + const [show, setShow] = useState(false) // [!code focus] + const { status, shouldMount } = useTransition(show) // [!code focus] + + return ( +
+ {shouldMount // [!code focus] + ? ( +
+ Hello Word +
+ ) + : null} + +

{ status }

+
+ ) +} +``` +::: + +## API + +### `useTransition` +```ts +function useTransition( + state: boolean, + transitionOptions?: TransitionOptions +): StatusState + +``` + +### `StatusState` + +```ts +type StatusState = { + status: "preEnter" | "entering" | "entered" | "preExit" | "exiting" | "exited" | "unmounted"; + shouldMount: boolean; + isEnter: boolean; + isResolved: boolean; +} +``` + +### `TransitionOptions` + +```ts +export interface TransitionOptions { + /** + * Add a 'preEnter' state immediately before 'entering', + * which is necessary to change DOM elements from unmounted + * or display: none with CSS transition (not necessary for CSS animation). + * @default true + */ + preEnter?: boolean + /** + * Add a 'preExit' state immediately before 'exiting' + * @default false + */ + preExit?: boolean + /** + * Set timeout in ms for transitions; + * you can set a single value or different values for enter and exit transitions. + * @default 300 + */ + timeout?: number | { enter: number, exit: number } + onStatusChange?: (status: Stage) => void + enter?: boolean + exit?: boolean +} +``` +import { useTransition } from "react" diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx new file mode 100644 index 0000000..7f02480 --- /dev/null +++ b/docs/pages/index.mdx @@ -0,0 +1,19 @@ +--- +title: Transition Hooks +showLogo: false +layout: landing +--- + +import { HomePage } from 'vocs/components' + + + + ☄️ An extremely light-weight react transition hook which is simpler and easier to use than react-transition-group + + {/* Vocs is a minimal static documentation generator designed to supercharge your documentation workflow, built with modern web technologies. */} + + Get started + GitHub + + + diff --git a/docs/public/status.png b/docs/public/status.png new file mode 100644 index 0000000000000000000000000000000000000000..a9daeb2e8996898e9b90167a1307144b333d0ae9 GIT binary patch literal 34100 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 literal 0 HcmV?d00001 diff --git a/eslint.config.js b/eslint.config.js index 13d8226..175ad35 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,8 +1,4 @@ +// @ts-check import ririd from '@ririd/eslint-config' -export default ririd( - { - ignores: [ - ], - }, -) +export default ririd() diff --git a/package.json b/package.json index f1daa0d..425054e 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "0.0.1", "packageManager": "pnpm@8.15.5", - "description": "☄️ An extremely light-weight react transition animation hook which is simpler and easier to use than react-transition-group", + "description": "☄️ An extremely light-weight react transition hook which is simpler and easier to use than react-transition-group", "author": "Riri ", "license": "MIT", "homepage": "https://github.com/Daydreamer-riri/transition-hooks#readme", @@ -69,6 +69,7 @@ "react": "^18.2.0", "rimraf": "5.0.5", "simple-git-hooks": "^2.11.1", + "transition-hooks": "workspace:*", "typescript": "^5.4.3", "unbuild": "^2.0.0", "vite": "^5.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eeb1068..f00ab91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ importers: simple-git-hooks: specifier: ^2.11.1 version: 2.11.1 + transition-hooks: + specifier: workspace:* + version: 'link:' typescript: specifier: ^5.4.3 version: 5.4.3 diff --git a/src/hooks/useTransition.ts b/src/hooks/useTransition.ts index 20e15c0..38bfae4 100644 --- a/src/hooks/useTransition.ts +++ b/src/hooks/useTransition.ts @@ -7,6 +7,7 @@ import { setAnimationFrameTimeout, } from '../helpers/setAnimationFrameTimeout' import { getTimeout } from '../helpers/getTimeout' +import type { StatusState } from '../status' import { STATUS, getEndStatus, getState } from '../status' import type { Stage, TransitionOptions } from '../types' import useMemoizedFn from '../helpers/useMemorizeFn' @@ -79,5 +80,5 @@ export function useTransition(state: boolean, transitionOptions?: TransitionOpti useEffect(() => () => clearAnimationFrameTimeout(timer.current), []) - return statusState + return statusState as StatusState } diff --git a/src/types.ts b/src/types.ts index 87b95bc..bdc7f2d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,10 +3,22 @@ import type { STATUS } from './status' export type Stage = keyof typeof STATUS export interface TransitionOptions { + /** + * Add a 'preEnter' state immediately before 'entering', which is necessary to change DOM elements from unmounted or display: none with CSS transition (not necessary for CSS animation). + * @default true + */ preEnter?: boolean + /** + * Add a 'preExit' state immediately before 'exiting' + * @default false + */ preExit?: boolean - enter?: boolean - exit?: boolean + /** + * Set timeout in ms for transitions; you can set a single value or different values for enter and exit transitions. + * @default 300 + */ timeout?: number | { enter: number, exit: number } onStatusChange?: (status: Stage) => void + enter?: boolean + exit?: boolean } diff --git a/vocs.config.ts b/vocs.config.ts index 35e8107..670cb7c 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -1,7 +1,30 @@ import { defineConfig } from 'vocs' export default defineConfig({ - description: `Build reliable apps & libraries with lightweight, - composable, and type-safe modules that interface with Ethereum.`, - title: 'Viem', + description: `☄️ An extremely light-weight react transition hook which is simpler and easier to use than react-transition-group.`, + title: 'Transition-hooks', + editLink: { + pattern: 'https://github.com/Daydreamer-riri/transition-hooks/edit/main/docs/pages/:path', + text: 'Suggest changes to this page', + }, + sidebar: [ + { + text: 'Getting Started', + items: [ + { + text: 'Introduction', + link: '/docs', + }, + ], + }, + { + text: 'Hooks', + items: [ + { + text: 'useTransition', + link: '/docs/useTransition', + }, + ], + }, + ], })