@lytjs/web 6.4.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.
@@ -0,0 +1,435 @@
1
+ /**
2
+ * @lytjs/web - CSS 变量支持模块
3
+ *
4
+ * 提供增强的 CSS 自定义属性(CSS Variables)支持,
5
+ * 包括设置、获取、监听 CSS 变量变化等功能
6
+ *
7
+ * @module @lytjs/web/css-vars
8
+ * @version 6.0.0
9
+ */
10
+ /**
11
+ * CSS 变量值类型
12
+ */
13
+ type CSSVarValue = string | number | null | undefined;
14
+ /**
15
+ * CSS 变量变更回调
16
+ */
17
+ type CSSVarChangeCallback = (newValue: string | null, oldValue: string | null, variable: string) => void;
18
+ /**
19
+ * CSS 变量配置选项
20
+ */
21
+ interface CSSVarOptions {
22
+ /** 是否继承父元素的值 */
23
+ inherit?: boolean;
24
+ /** 单位(用于数值类型) */
25
+ unit?: string;
26
+ }
27
+ /**
28
+ * 规范化 CSS 变量名
29
+ * 确保变量名以 -- 开头
30
+ *
31
+ * @param name - 变量名(可带或不带 -- 前缀)
32
+ * @returns 规范化后的变量名
33
+ * @example
34
+ * ```ts
35
+ * normalizeVarName('primary-color') // '--primary-color'
36
+ * normalizeVarName('--primary-color') // '--primary-color'
37
+ * ```
38
+ */
39
+ declare function normalizeVarName(name: string): string;
40
+ /**
41
+ * 移除 CSS 变量名的 -- 前缀
42
+ *
43
+ * @param name - 变量名
44
+ * @returns 无前缀的变量名
45
+ * @example
46
+ * ```ts
47
+ * stripVarPrefix('--primary-color') // 'primary-color'
48
+ * stripVarPrefix('primary-color') // 'primary-color'
49
+ * ```
50
+ */
51
+ declare function stripVarPrefix(name: string): string;
52
+ /**
53
+ * setCSSVar 参数对象 - 指定元素上的 CSS 变量
54
+ */
55
+ interface SetCSSVarWithElementOptions {
56
+ /** 目标元素 */
57
+ element: HTMLElement;
58
+ /** 变量名 */
59
+ name: string;
60
+ /** 变量值(null/undefined 表示移除) */
61
+ value?: CSSVarValue;
62
+ /** 配置选项 */
63
+ options?: CSSVarOptions;
64
+ }
65
+ /**
66
+ * setCSSVar 参数对象 - 全局 CSS 变量
67
+ */
68
+ interface SetCSSVarGlobalOptions {
69
+ /** 变量名 */
70
+ name: string;
71
+ /** 变量值(null/undefined 表示移除) */
72
+ value?: CSSVarValue;
73
+ /** 配置选项 */
74
+ options?: CSSVarOptions;
75
+ }
76
+ /**
77
+ * 设置 CSS 变量
78
+ *
79
+ * @param params - 参数对象
80
+ * @example
81
+ * ```ts
82
+ * // 设置全局变量
83
+ * setCSSVar({ name: '--primary-color', value: '#007bff' })
84
+ *
85
+ * // 设置元素变量
86
+ * setCSSVar({ element: myElement, name: 'font-size', value: 16, options: { unit: 'px' } })
87
+ *
88
+ * // 移除变量
89
+ * setCSSVar({ element: myElement, name: '--old-var', value: null })
90
+ * ```
91
+ */
92
+ declare function setCSSVar(params: SetCSSVarWithElementOptions): void;
93
+ declare function setCSSVar(params: SetCSSVarGlobalOptions): void;
94
+ /** @deprecated 使用对象参数形式 setCSSVar({ element, name, value }) 替代 */
95
+ declare function setCSSVar(element: HTMLElement, name: string, value?: CSSVarValue, options?: CSSVarOptions): void;
96
+ /**
97
+ * 获取 CSS 变量值
98
+ *
99
+ * @param element - 目标元素(默认为 document.documentElement)
100
+ * @param name - 变量名
101
+ * @param fallback - 默认值(变量不存在时返回)
102
+ * @returns 变量值或默认值
103
+ * @example
104
+ * ```ts
105
+ * // 获取全局变量
106
+ * const color = getCSSVar('--primary-color')
107
+ *
108
+ * // 获取元素变量
109
+ * const size = getCSSVar(myElement, 'font-size', '16px')
110
+ * ```
111
+ */
112
+ declare function getCSSVar(name: string, fallback?: string): string | null;
113
+ declare function getCSSVar(element: HTMLElement, name: string, fallback?: string): string | null;
114
+ /**
115
+ * 批量设置 CSS 变量
116
+ *
117
+ * @param element - 目标元素(默认为 document.documentElement)
118
+ * @param vars - 变量键值对对象
119
+ * @example
120
+ * ```ts
121
+ * setCSSVars({
122
+ * '--primary-color': '#007bff',
123
+ * '--font-size': '16px',
124
+ * '--spacing': 8,
125
+ * })
126
+ * ```
127
+ */
128
+ declare function setCSSVars(vars: Record<string, CSSVarValue>): void;
129
+ declare function setCSSVars(element: HTMLElement, vars: Record<string, CSSVarValue>): void;
130
+ /**
131
+ * 批量获取 CSS 变量
132
+ *
133
+ * @param names - 变量名数组
134
+ * @returns 变量值对象
135
+ * @example
136
+ * ```ts
137
+ * const values = getCSSVars(['--primary-color', '--font-size'])
138
+ * // { '--primary-color': '#007bff', '--font-size': '16px' }
139
+ * ```
140
+ */
141
+ declare function getCSSVars(names: string[]): Record<string, string | null>;
142
+ declare function getCSSVars(element: HTMLElement, names: string[]): Record<string, string | null>;
143
+ /**
144
+ * 移除 CSS 变量
145
+ *
146
+ * @param element - 目标元素(默认为 document.documentElement)
147
+ * @param name - 变量名
148
+ * @example
149
+ * ```ts
150
+ * removeCSSVar('--old-variable')
151
+ * removeCSSVar(myElement, '--old-variable')
152
+ * ```
153
+ */
154
+ declare function removeCSSVar(name: string): void;
155
+ declare function removeCSSVar(element: HTMLElement, name: string): void;
156
+ /**
157
+ * 批量移除 CSS 变量
158
+ *
159
+ * @param names - 变量名数组
160
+ * @example
161
+ * ```ts
162
+ * removeCSSVars(['--var1', '--var2'])
163
+ * ```
164
+ */
165
+ declare function removeCSSVars(names: string[]): void;
166
+ declare function removeCSSVars(element: HTMLElement, names: string[]): void;
167
+ /**
168
+ * 检查元素是否有指定的 CSS 变量
169
+ *
170
+ * @param element - 目标元素(默认为 document.documentElement)
171
+ * @param name - 变量名
172
+ * @returns 如果变量存在则返回 true
173
+ * @example
174
+ * ```ts
175
+ * if (hasCSSVar('--primary-color')) {
176
+ * // 变量存在
177
+ * }
178
+ * ```
179
+ */
180
+ declare function hasCSSVar(name: string): boolean;
181
+ declare function hasCSSVar(element: HTMLElement, name: string): boolean;
182
+ /**
183
+ * 获取元素上定义的所有 CSS 变量
184
+ *
185
+ * 注意:此方法通过遍历 computedStyle 的所有属性来查找 CSS 变量,
186
+ * 在属性数量较多的元素上可能存在性能开销。
187
+ * computedStyle.length 通常在数百到数千之间,遍历是 O(n) 操作。
188
+ * 建议仅在调试或初始化时调用,避免在热路径中频繁使用。
189
+ *
190
+ * @param element - 目标元素(默认为 document.documentElement)
191
+ * @returns CSS 变量键值对
192
+ * @example
193
+ * ```ts
194
+ * const vars = getAllCSSVars()
195
+ * // { '--primary-color': '#007bff', '--font-size': '16px', ... }
196
+ * ```
197
+ */
198
+ declare function getAllCSSVars(element?: HTMLElement): Record<string, string>;
199
+ /**
200
+ * 切换 CSS 变量的值(在两个值之间切换)
201
+ *
202
+ * @param element - 目标元素(默认为 document.documentElement)
203
+ * @param name - 变量名
204
+ * @param value1 - 第一个值
205
+ * @param value2 - 第二个值
206
+ * @returns 切换后的值
207
+ * @example
208
+ * ```ts
209
+ * // 在 'dark' 和 'light' 之间切换主题
210
+ * toggleCSSVar('--theme', 'dark', 'light')
211
+ * ```
212
+ */
213
+ declare function toggleCSSVar(name: string, value1: string, value2: string): string;
214
+ declare function toggleCSSVar(element: HTMLElement, name: string, value1: string, value2: string): string;
215
+ /**
216
+ * CSS 变量观察器
217
+ * 用于监听 CSS 变量的变化
218
+ */
219
+ declare class CSSVarObserver {
220
+ private observer;
221
+ private callbacks;
222
+ private element;
223
+ constructor(element?: HTMLElement);
224
+ /**
225
+ * 开始观察 CSS 变量变化
226
+ *
227
+ * @param names - 要观察的变量名数组(可选,不指定则观察所有)
228
+ */
229
+ observe(names?: string[]): void;
230
+ /**
231
+ * 停止观察
232
+ */
233
+ disconnect(): void;
234
+ /**
235
+ * 订阅变量变化
236
+ *
237
+ * @param name - 变量名
238
+ * @param callback - 变化回调
239
+ * @returns 取消订阅函数
240
+ */
241
+ subscribe(name: string, callback: CSSVarChangeCallback): () => void;
242
+ /**
243
+ * 检查变量变化
244
+ * FIX: P2-v11-37 添加最大条目限制,防止 lastValues Map 无限增长
245
+ */
246
+ private lastValues;
247
+ /** lastValues 最大条目数 */
248
+ private static readonly MAX_LAST_VALUES_SIZE;
249
+ private checkChanges;
250
+ }
251
+ /**
252
+ * 主题配置
253
+ */
254
+ interface ThemeConfig {
255
+ [key: string]: CSSVarValue;
256
+ }
257
+ /**
258
+ * 主题管理器
259
+ * 用于管理多主题切换
260
+ */
261
+ declare class ThemeManager {
262
+ private themes;
263
+ private currentTheme;
264
+ private element;
265
+ constructor(element?: HTMLElement);
266
+ /**
267
+ * 注册主题
268
+ *
269
+ * @param name - 主题名称
270
+ * @param config - 主题配置(CSS 变量键值对)
271
+ */
272
+ register(name: string, config: ThemeConfig): void;
273
+ /**
274
+ * 应用主题
275
+ *
276
+ * @param name - 主题名称
277
+ */
278
+ apply(name: string): boolean;
279
+ /**
280
+ * 获取当前主题名称
281
+ */
282
+ getCurrentTheme(): string | null;
283
+ /**
284
+ * 获取已注册的主题列表
285
+ */
286
+ getRegisteredThemes(): string[];
287
+ /**
288
+ * 检查主题是否存在
289
+ */
290
+ hasTheme(name: string): boolean;
291
+ /**
292
+ * 获取主题配置
293
+ */
294
+ getThemeConfig(name: string): ThemeConfig | undefined;
295
+ }
296
+
297
+ /**
298
+ * @lytjs/web - ResizeObserver 管理模块
299
+ *
300
+ * 提供 ResizeObserver 的安全封装,确保在组件卸载时自动清理观察者,
301
+ * 防止内存泄漏。
302
+ * FIX: P2-5 ResizeObserver 未清理问题
303
+ *
304
+ * @module @lytjs/web/resize-observer
305
+ * @version 6.0.0
306
+ */
307
+ /**
308
+ * ResizeObserver 回调函数类型
309
+ */
310
+ type ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;
311
+ /**
312
+ * ResizeObserver 观察选项
313
+ */
314
+ interface ResizeObserverOptions {
315
+ /** 指定要观察的盒模型 */
316
+ box?: 'content-box' | 'border-box' | 'device-pixel-content-box';
317
+ }
318
+ /**
319
+ * 受管理的 ResizeObserver 包装类
320
+ *
321
+ * 自动处理 ResizeObserver 的创建、观察和清理,
322
+ * 确保在组件卸载时不会泄漏观察者。
323
+ *
324
+ * FIX: P2-5 ResizeObserver 未清理问题
325
+ *
326
+ * @example
327
+ * ```ts
328
+ * // 创建管理器
329
+ * const manager = new ResizeObserverManager((entries) => {
330
+ * for (const entry of entries) {
331
+ * console.log('Element resized:', entry.target);
332
+ * }
333
+ * });
334
+ *
335
+ * // 观察元素
336
+ * manager.observe(myElement);
337
+ *
338
+ * // 组件卸载时清理
339
+ * onUnmounted(() => {
340
+ * manager.disconnect();
341
+ * });
342
+ * ```
343
+ */
344
+ declare class ResizeObserverManager {
345
+ private observer;
346
+ private callback;
347
+ private observedElements;
348
+ private isConnected;
349
+ constructor(callback: ResizeObserverCallback);
350
+ /**
351
+ * 开始观察元素
352
+ *
353
+ * @param target - 要观察的目标元素
354
+ * @param options - 观察选项
355
+ * @returns 是否成功开始观察
356
+ */
357
+ observe(target: Element, options?: ResizeObserverOptions): boolean;
358
+ /**
359
+ * 停止观察指定元素
360
+ *
361
+ * @param target - 要停止观察的目标元素
362
+ * @returns 是否成功停止观察
363
+ */
364
+ unobserve(target: Element): boolean;
365
+ /**
366
+ * 停止观察所有元素并断开连接
367
+ *
368
+ * FIX: P2-5 这是关键方法,确保在组件卸载时调用此方法
369
+ */
370
+ disconnect(): void;
371
+ /**
372
+ * 检查是否正在观察指定元素
373
+ *
374
+ * @param target - 要检查的目标元素
375
+ * @returns 是否正在观察
376
+ */
377
+ isObserving(target: Element): boolean;
378
+ /**
379
+ * 获取当前观察的元素数量
380
+ */
381
+ get observedCount(): number;
382
+ /**
383
+ * 检查观察者是否已连接(正在观察至少一个元素)
384
+ */
385
+ get connected(): boolean;
386
+ /**
387
+ * 检查 ResizeObserver 是否可用
388
+ */
389
+ get isAvailable(): boolean;
390
+ }
391
+ /**
392
+ * 创建并使用 ResizeObserver,返回清理函数
393
+ *
394
+ * 这是使用 ResizeObserver 的推荐方式,确保在组件卸载时调用返回的清理函数。
395
+ *
396
+ * FIX: P2-5 ResizeObserver 未清理问题
397
+ *
398
+ * @example
399
+ * ```ts
400
+ * // 在组件中使用
401
+ * const cleanup = useResizeObserver(myElement, (entries) => {
402
+ * for (const entry of entries) {
403
+ * console.log('Resized:', entry.contentRect);
404
+ * }
405
+ * });
406
+ *
407
+ * // 组件卸载时清理
408
+ * onUnmounted(() => {
409
+ * cleanup();
410
+ * });
411
+ * ```
412
+ *
413
+ * @param target - 要观察的目标元素
414
+ * @param callback - 尺寸变化回调
415
+ * @param options - 观察选项
416
+ * @returns 清理函数,调用后停止观察并释放资源
417
+ */
418
+ declare function useResizeObserver(target: Element, callback: ResizeObserverCallback, options?: ResizeObserverOptions): () => void;
419
+ /**
420
+ * 检查浏览器是否支持 ResizeObserver
421
+ *
422
+ * @returns 如果支持则返回 true
423
+ */
424
+ declare function supportsResizeObserver(): boolean;
425
+ /**
426
+ * ResizeObserver 统计信息
427
+ */
428
+ interface ResizeObserverStats {
429
+ /** 活跃的管理器数量 */
430
+ activeManagers: number;
431
+ /** 总共观察的元素数量 */
432
+ totalObservedElements: number;
433
+ }
434
+
435
+ export { type CSSVarChangeCallback, CSSVarObserver, type CSSVarOptions, type CSSVarValue, type ResizeObserverCallback, ResizeObserverManager, type ResizeObserverOptions, type ResizeObserverStats, type ThemeConfig, ThemeManager, getAllCSSVars, getCSSVar, getCSSVars, hasCSSVar, normalizeVarName, removeCSSVar, removeCSSVars, setCSSVar, setCSSVars, stripVarPrefix, supportsResizeObserver, toggleCSSVar, useResizeObserver };