@ug666/ui-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-MGXIF756.js +313 -0
- package/dist/chunk-MGXIF756.js.map +1 -0
- package/dist/hooks/index.cjs +351 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +232 -0
- package/dist/hooks/index.d.ts +232 -0
- package/dist/hooks/index.js +31 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +3799 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1363 -0
- package/dist/index.d.ts +1363 -0
- package/dist/index.js +3383 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens.css +9 -0
- package/package.json +53 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 防抖值,延迟 delay 毫秒后才更新
|
|
5
|
+
* @example
|
|
6
|
+
* const keyword = useDebounce(inputValue, 300)
|
|
7
|
+
*/
|
|
8
|
+
declare function useDebounce<T>(value: T, delay?: number): T;
|
|
9
|
+
|
|
10
|
+
type SetLocalStorageValue<T> = (value: T | ((prev: T) => T)) => void;
|
|
11
|
+
type UseLocalStorageReturn<T> = [T, SetLocalStorageValue<T>, () => void];
|
|
12
|
+
/**
|
|
13
|
+
* 自动读写 localStorage 的 useState
|
|
14
|
+
* @example
|
|
15
|
+
* const [token, setToken, removeToken] = useLocalStorage('token', '')
|
|
16
|
+
*/
|
|
17
|
+
declare function useLocalStorage<T>(key: string, initialValue: T): UseLocalStorageReturn<T>;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 监听 CSS media query 变化,返回当前是否匹配
|
|
21
|
+
* @example
|
|
22
|
+
* const isMobile = useMediaQuery('(max-width: 768px)')
|
|
23
|
+
* const prefersDark = useMediaQuery('(prefers-color-scheme: dark)')
|
|
24
|
+
*/
|
|
25
|
+
declare function useMediaQuery(query: string): boolean;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 点击 ref 元素外部时触发 handler
|
|
29
|
+
* @example
|
|
30
|
+
* const ref = useRef<HTMLDivElement>(null)
|
|
31
|
+
* useClickOutside(ref, () => setOpen(false))
|
|
32
|
+
*/
|
|
33
|
+
declare function useClickOutside<T extends HTMLElement>(ref: RefObject<T | null>, handler: () => void): void;
|
|
34
|
+
|
|
35
|
+
interface UseCopyToClipboardReturn {
|
|
36
|
+
copied: boolean;
|
|
37
|
+
copy: (text: string) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 复制文本到剪贴板,copied 状态 2 秒后自动重置
|
|
41
|
+
* @example
|
|
42
|
+
* const { copied, copy } = useCopyToClipboard()
|
|
43
|
+
* <button onClick={() => copy('hello')}>{copied ? '已复制' : '复制'}</button>
|
|
44
|
+
*/
|
|
45
|
+
declare function useCopyToClipboard(): UseCopyToClipboardReturn;
|
|
46
|
+
|
|
47
|
+
type UseToggleReturn = [boolean, () => void, (value: boolean) => void];
|
|
48
|
+
/**
|
|
49
|
+
* 简单的布尔值切换,返回 [value, toggle, setValue]
|
|
50
|
+
* @example
|
|
51
|
+
* const [isOpen, toggleOpen, setIsOpen] = useToggle(false)
|
|
52
|
+
* <button onClick={toggleOpen}>切换</button>
|
|
53
|
+
*/
|
|
54
|
+
declare function useToggle(initial?: boolean): UseToggleReturn;
|
|
55
|
+
|
|
56
|
+
interface UsePaginationOptions {
|
|
57
|
+
/** 数据总条数 */
|
|
58
|
+
total: number;
|
|
59
|
+
/** 每页条数,默认 10 */
|
|
60
|
+
pageSize?: number;
|
|
61
|
+
/** 初始页码,默认 1 */
|
|
62
|
+
initialPage?: number;
|
|
63
|
+
}
|
|
64
|
+
interface UsePaginationReturn {
|
|
65
|
+
/** 当前页码 (从 1 开始) */
|
|
66
|
+
page: number;
|
|
67
|
+
/** 总页数 */
|
|
68
|
+
totalPages: number;
|
|
69
|
+
/** 跳转到指定页 */
|
|
70
|
+
setPage: (p: number) => void;
|
|
71
|
+
/** 下一页 */
|
|
72
|
+
nextPage: () => void;
|
|
73
|
+
/** 上一页 */
|
|
74
|
+
prevPage: () => void;
|
|
75
|
+
/** 是否有下一页 */
|
|
76
|
+
hasNext: boolean;
|
|
77
|
+
/** 是否有上一页 */
|
|
78
|
+
hasPrev: boolean;
|
|
79
|
+
/** 当前页起始索引 (0-based,用于切片) */
|
|
80
|
+
startIndex: number;
|
|
81
|
+
/** 当前页结束索引 (exclusive,用于切片) */
|
|
82
|
+
endIndex: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 分页状态管理,提供页码、边界判断和数据切片索引
|
|
86
|
+
* @example
|
|
87
|
+
* const { page, totalPages, nextPage, prevPage, startIndex, endIndex } = usePagination({ total: 100, pageSize: 10 })
|
|
88
|
+
* const pageData = data.slice(startIndex, endIndex)
|
|
89
|
+
*/
|
|
90
|
+
declare function usePagination({ total, pageSize, initialPage, }: UsePaginationOptions): UsePaginationReturn;
|
|
91
|
+
|
|
92
|
+
type UseFormErrors<T extends Record<string, unknown>> = Partial<Record<keyof T, string>>;
|
|
93
|
+
interface UseFormReturn<T extends Record<string, unknown>> {
|
|
94
|
+
/** 当前表单值 */
|
|
95
|
+
values: T;
|
|
96
|
+
/** 字段错误信息 */
|
|
97
|
+
errors: UseFormErrors<T>;
|
|
98
|
+
/** 更新单个字段值 */
|
|
99
|
+
handleChange: <K extends keyof T>(name: K, value: T[K]) => void;
|
|
100
|
+
/** 设置字段错误 */
|
|
101
|
+
setError: (name: keyof T, message: string) => void;
|
|
102
|
+
/** 清除所有错误 */
|
|
103
|
+
clearErrors: () => void;
|
|
104
|
+
/** 重置表单到初始值 */
|
|
105
|
+
reset: () => void;
|
|
106
|
+
/** 表单是否被修改过 */
|
|
107
|
+
isDirty: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 极简表单状态管理,提供值管理、错误处理和脏状态检测
|
|
111
|
+
* @example
|
|
112
|
+
* const form = useForm({ username: '', password: '' })
|
|
113
|
+
* <input value={form.values.username} onChange={e => form.handleChange('username', e.target.value)} />
|
|
114
|
+
* {form.errors.username && <span>{form.errors.username}</span>}
|
|
115
|
+
*/
|
|
116
|
+
declare function useForm<T extends Record<string, unknown>>(initialValues: T): UseFormReturn<T>;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 返回组件是否已在客户端挂载完成。
|
|
120
|
+
*
|
|
121
|
+
* 在 SSR 场景中,服务端渲染时始终返回 false,
|
|
122
|
+
* 客户端 hydration 完成后变为 true,可用于条件渲染仅客户端内容。
|
|
123
|
+
*
|
|
124
|
+
* @returns 组件是否已挂载
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```tsx
|
|
128
|
+
* const isMounted = useMounted()
|
|
129
|
+
*
|
|
130
|
+
* if (!isMounted) return null // 服务端不渲染
|
|
131
|
+
* return <ClientOnlyComponent />
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
declare function useMounted(): boolean;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 以指定间隔重复调用回调函数。
|
|
138
|
+
*
|
|
139
|
+
* 当 delay 为 null 时定时器自动暂停,可动态修改 delay 或 callback。
|
|
140
|
+
* 参考 Dan Abramov 的 useInterval 实现,使用 ref 保持 callback 最新引用。
|
|
141
|
+
*
|
|
142
|
+
* @param callback 每次触发时调用的函数
|
|
143
|
+
* @param delay 间隔毫秒数;传入 null 则暂停定时器
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```tsx
|
|
147
|
+
* const [count, setCount] = useState(0)
|
|
148
|
+
* const [running, setRunning] = useState(true)
|
|
149
|
+
*
|
|
150
|
+
* useInterval(() => setCount(c => c + 1), running ? 1000 : null)
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
declare function useInterval(callback: () => void, delay: number | null): void;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 在指定延迟后执行一次回调函数。
|
|
157
|
+
*
|
|
158
|
+
* 当 delay 为 null 时定时器不启动(暂停模式)。
|
|
159
|
+
* 每次 delay 变化都会重置定时器;组件卸载时自动清理。
|
|
160
|
+
*
|
|
161
|
+
* @param callback 延迟结束后调用的函数
|
|
162
|
+
* @param delay 延迟毫秒数;传入 null 则不执行
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```tsx
|
|
166
|
+
* const [show, setShow] = useState(true)
|
|
167
|
+
*
|
|
168
|
+
* // 3 秒后自动隐藏提示
|
|
169
|
+
* useTimeout(() => setShow(false), show ? 3000 : null)
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
declare function useTimeout(callback: () => void, delay: number | null): void;
|
|
173
|
+
|
|
174
|
+
interface UseHotkeysOptions {
|
|
175
|
+
/** 是否阻止默认浏览器行为,默认 false */
|
|
176
|
+
preventDefault?: boolean;
|
|
177
|
+
/** 监听目标,默认 window */
|
|
178
|
+
target?: HTMLElement | null;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 将快捷键字符串绑定到回调函数。
|
|
182
|
+
*
|
|
183
|
+
* 支持修饰键组合:ctrl、cmd(Meta)、alt、shift,加主键(不区分大小写)。
|
|
184
|
+
* 组件卸载时自动解绑。
|
|
185
|
+
*
|
|
186
|
+
* @param keys 快捷键字符串,如 "ctrl+k"、"cmd+s"、"escape"
|
|
187
|
+
* @param callback 触发时调用的函数
|
|
188
|
+
* @param options 额外配置项
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```tsx
|
|
192
|
+
* // 全局搜索快捷键
|
|
193
|
+
* useHotkeys('ctrl+k', () => setSearchOpen(true), { preventDefault: true })
|
|
194
|
+
*
|
|
195
|
+
* // ESC 关闭弹窗
|
|
196
|
+
* useHotkeys('escape', () => setOpen(false))
|
|
197
|
+
*
|
|
198
|
+
* // 仅在特定元素内响应
|
|
199
|
+
* useHotkeys('ctrl+enter', handleSubmit, { target: formRef.current })
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
declare function useHotkeys(keys: string, callback: (event: KeyboardEvent) => void, options?: UseHotkeysOptions): void;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* 在指定目标上绑定事件监听器,组件卸载时自动清理。
|
|
206
|
+
*
|
|
207
|
+
* 支持三种目标类型:
|
|
208
|
+
* - 不传 target → 默认监听 window
|
|
209
|
+
* - 传入 HTMLElement → 监听该元素
|
|
210
|
+
* - 传入 null → 跳过绑定(适合 ref 未初始化的场景)
|
|
211
|
+
*
|
|
212
|
+
* @typeParam K WindowEventMap 中的事件名称
|
|
213
|
+
* @param event 事件名称,如 "scroll"、"resize"、"click"
|
|
214
|
+
* @param handler 事件处理函数
|
|
215
|
+
* @param target 监听目标;默认 window;传 null 跳过绑定
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```tsx
|
|
219
|
+
* // 监听全局滚动
|
|
220
|
+
* useEventListener('scroll', () => setScrollY(window.scrollY))
|
|
221
|
+
*
|
|
222
|
+
* // 监听特定元素的点击
|
|
223
|
+
* const divRef = useRef<HTMLDivElement>(null)
|
|
224
|
+
* useEventListener('click', handleClick, divRef.current)
|
|
225
|
+
*
|
|
226
|
+
* // 传入 null 跳过(ref 尚未挂载时)
|
|
227
|
+
* useEventListener('mouseenter', onEnter, ref.current)
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
declare function useEventListener<K extends keyof WindowEventMap>(event: K, handler: (event: WindowEventMap[K]) => void, target?: EventTarget | null): void;
|
|
231
|
+
|
|
232
|
+
export { type SetLocalStorageValue, type UseCopyToClipboardReturn, type UseFormErrors, type UseFormReturn, type UseHotkeysOptions, type UseLocalStorageReturn, type UsePaginationOptions, type UsePaginationReturn, type UseToggleReturn, useClickOutside, useCopyToClipboard, useDebounce, useEventListener, useForm, useHotkeys, useInterval, useLocalStorage, useMediaQuery, useMounted, usePagination, useTimeout, useToggle };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useClickOutside,
|
|
3
|
+
useCopyToClipboard,
|
|
4
|
+
useDebounce,
|
|
5
|
+
useEventListener,
|
|
6
|
+
useForm,
|
|
7
|
+
useHotkeys,
|
|
8
|
+
useInterval,
|
|
9
|
+
useLocalStorage,
|
|
10
|
+
useMediaQuery,
|
|
11
|
+
useMounted,
|
|
12
|
+
usePagination,
|
|
13
|
+
useTimeout,
|
|
14
|
+
useToggle
|
|
15
|
+
} from "../chunk-MGXIF756.js";
|
|
16
|
+
export {
|
|
17
|
+
useClickOutside,
|
|
18
|
+
useCopyToClipboard,
|
|
19
|
+
useDebounce,
|
|
20
|
+
useEventListener,
|
|
21
|
+
useForm,
|
|
22
|
+
useHotkeys,
|
|
23
|
+
useInterval,
|
|
24
|
+
useLocalStorage,
|
|
25
|
+
useMediaQuery,
|
|
26
|
+
useMounted,
|
|
27
|
+
usePagination,
|
|
28
|
+
useTimeout,
|
|
29
|
+
useToggle
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|