xxf_react 0.8.3 → 0.8.5

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.
Files changed (250) hide show
  1. package/package.json +1 -1
  2. package/dist/cache/CacheEntry.d.ts +0 -28
  3. package/dist/cache/CacheEntry.d.ts.map +0 -1
  4. package/dist/cache/CacheEntry.js +0 -1
  5. package/dist/cache/DiskCacheConfig.d.ts +0 -56
  6. package/dist/cache/DiskCacheConfig.d.ts.map +0 -1
  7. package/dist/cache/DiskCacheConfig.js +0 -4
  8. package/dist/cache/DiskLruCache.d.ts +0 -69
  9. package/dist/cache/DiskLruCache.d.ts.map +0 -1
  10. package/dist/cache/DiskLruCache.js +0 -305
  11. package/dist/cache/LruMetadata.d.ts +0 -28
  12. package/dist/cache/LruMetadata.d.ts.map +0 -1
  13. package/dist/cache/LruMetadata.js +0 -6
  14. package/dist/cache/index.d.ts +0 -5
  15. package/dist/cache/index.d.ts.map +0 -1
  16. package/dist/cache/index.js +0 -2
  17. package/dist/event-bus/EventBus.d.ts +0 -176
  18. package/dist/event-bus/EventBus.d.ts.map +0 -1
  19. package/dist/event-bus/EventBus.js +0 -278
  20. package/dist/event-bus/EventDemo.d.ts +0 -71
  21. package/dist/event-bus/EventDemo.d.ts.map +0 -1
  22. package/dist/event-bus/EventDemo.js +0 -76
  23. package/dist/event-bus/EventHooks.d.ts +0 -48
  24. package/dist/event-bus/EventHooks.d.ts.map +0 -1
  25. package/dist/event-bus/EventHooks.js +0 -73
  26. package/dist/event-bus/index.d.ts +0 -3
  27. package/dist/event-bus/index.d.ts.map +0 -1
  28. package/dist/event-bus/index.js +0 -2
  29. package/dist/fetch/Fetch.d.ts +0 -9
  30. package/dist/fetch/Fetch.d.ts.map +0 -1
  31. package/dist/fetch/Fetch.js +0 -54
  32. package/dist/fetch/TimeoutError.d.ts +0 -7
  33. package/dist/fetch/TimeoutError.d.ts.map +0 -1
  34. package/dist/fetch/TimeoutError.js +0 -23
  35. package/dist/fetch/index.d.ts +0 -3
  36. package/dist/fetch/index.d.ts.map +0 -1
  37. package/dist/fetch/index.js +0 -2
  38. package/dist/flow/PromiseExt.d.ts +0 -8
  39. package/dist/flow/PromiseExt.d.ts.map +0 -1
  40. package/dist/flow/PromiseExt.js +0 -50
  41. package/dist/flow/PromiseLifecycle.d.ts +0 -33
  42. package/dist/flow/PromiseLifecycle.d.ts.map +0 -1
  43. package/dist/flow/PromiseLifecycle.js +0 -37
  44. package/dist/flow/PromiseLoading.d.ts +0 -25
  45. package/dist/flow/PromiseLoading.d.ts.map +0 -1
  46. package/dist/flow/PromiseLoading.js +0 -30
  47. package/dist/flow/index.d.ts +0 -4
  48. package/dist/flow/index.d.ts.map +0 -1
  49. package/dist/flow/index.js +0 -3
  50. package/dist/foundation/Copy.d.ts +0 -8
  51. package/dist/foundation/Copy.d.ts.map +0 -1
  52. package/dist/foundation/Copy.js +0 -21
  53. package/dist/foundation/Debug.d.ts +0 -7
  54. package/dist/foundation/Debug.d.ts.map +0 -1
  55. package/dist/foundation/Debug.js +0 -12
  56. package/dist/foundation/LayoutSize.d.ts +0 -5
  57. package/dist/foundation/LayoutSize.d.ts.map +0 -1
  58. package/dist/foundation/LayoutSize.js +0 -1
  59. package/dist/foundation/PerformanceMonitor.d.ts +0 -13
  60. package/dist/foundation/PerformanceMonitor.d.ts.map +0 -1
  61. package/dist/foundation/PerformanceMonitor.js +0 -26
  62. package/dist/foundation/index.d.ts +0 -5
  63. package/dist/foundation/index.d.ts.map +0 -1
  64. package/dist/foundation/index.js +0 -4
  65. package/dist/http/api/ApiBuilder.d.ts +0 -251
  66. package/dist/http/api/ApiBuilder.d.ts.map +0 -1
  67. package/dist/http/api/ApiBuilder.js +0 -189
  68. package/dist/http/api/index.d.ts +0 -2
  69. package/dist/http/api/index.d.ts.map +0 -1
  70. package/dist/http/api/index.js +0 -1
  71. package/dist/http/cache/HttpCache.d.ts +0 -59
  72. package/dist/http/cache/HttpCache.d.ts.map +0 -1
  73. package/dist/http/cache/HttpCache.js +0 -215
  74. package/dist/http/cache/index.d.ts +0 -3
  75. package/dist/http/cache/index.d.ts.map +0 -1
  76. package/dist/http/cache/index.js +0 -2
  77. package/dist/http/client/ApiStream.d.ts +0 -80
  78. package/dist/http/client/ApiStream.d.ts.map +0 -1
  79. package/dist/http/client/ApiStream.js +0 -190
  80. package/dist/http/client/HttpClient.d.ts +0 -88
  81. package/dist/http/client/HttpClient.d.ts.map +0 -1
  82. package/dist/http/client/HttpClient.js +0 -381
  83. package/dist/http/client/index.d.ts +0 -3
  84. package/dist/http/client/index.d.ts.map +0 -1
  85. package/dist/http/client/index.js +0 -2
  86. package/dist/http/demo/api-builder.demo.d.ts +0 -102
  87. package/dist/http/demo/api-builder.demo.d.ts.map +0 -1
  88. package/dist/http/demo/api-builder.demo.js +0 -343
  89. package/dist/http/index.d.ts +0 -52
  90. package/dist/http/index.d.ts.map +0 -1
  91. package/dist/http/index.js +0 -61
  92. package/dist/http/interceptor/CacheInterceptor.d.ts +0 -112
  93. package/dist/http/interceptor/CacheInterceptor.d.ts.map +0 -1
  94. package/dist/http/interceptor/CacheInterceptor.js +0 -6
  95. package/dist/http/interceptor/DefaultCacheInterceptor.d.ts +0 -53
  96. package/dist/http/interceptor/DefaultCacheInterceptor.d.ts.map +0 -1
  97. package/dist/http/interceptor/DefaultCacheInterceptor.js +0 -106
  98. package/dist/http/interceptor/index.d.ts +0 -3
  99. package/dist/http/interceptor/index.d.ts.map +0 -1
  100. package/dist/http/interceptor/index.js +0 -2
  101. package/dist/http/models/ApiTypes.d.ts +0 -54
  102. package/dist/http/models/ApiTypes.d.ts.map +0 -1
  103. package/dist/http/models/ApiTypes.js +0 -4
  104. package/dist/http/models/CacheConfig.d.ts +0 -58
  105. package/dist/http/models/CacheConfig.d.ts.map +0 -1
  106. package/dist/http/models/CacheConfig.js +0 -4
  107. package/dist/http/models/CacheMode.d.ts +0 -45
  108. package/dist/http/models/CacheMode.d.ts.map +0 -1
  109. package/dist/http/models/CacheMode.js +0 -45
  110. package/dist/http/models/HttpClientConfig.d.ts +0 -90
  111. package/dist/http/models/HttpClientConfig.d.ts.map +0 -1
  112. package/dist/http/models/HttpClientConfig.js +0 -4
  113. package/dist/http/models/RequestConfig.d.ts +0 -67
  114. package/dist/http/models/RequestConfig.d.ts.map +0 -1
  115. package/dist/http/models/RequestConfig.js +0 -4
  116. package/dist/http/models/index.d.ts +0 -24
  117. package/dist/http/models/index.d.ts.map +0 -1
  118. package/dist/http/models/index.js +0 -16
  119. package/dist/http/types.d.ts +0 -13
  120. package/dist/http/types.d.ts.map +0 -1
  121. package/dist/http/types.js +0 -14
  122. package/dist/index.d.ts +0 -15
  123. package/dist/index.d.ts.map +0 -1
  124. package/dist/index.js +0 -20
  125. package/dist/layout/button/XButton.d.ts +0 -99
  126. package/dist/layout/button/XButton.d.ts.map +0 -1
  127. package/dist/layout/button/XButton.js +0 -131
  128. package/dist/layout/hover/XHover.d.ts +0 -147
  129. package/dist/layout/hover/XHover.d.ts.map +0 -1
  130. package/dist/layout/hover/XHover.js +0 -128
  131. package/dist/layout/image/XImage.d.ts +0 -35
  132. package/dist/layout/image/XImage.d.ts.map +0 -1
  133. package/dist/layout/image/XImage.effects.d.ts +0 -16
  134. package/dist/layout/image/XImage.effects.d.ts.map +0 -1
  135. package/dist/layout/image/XImage.effects.js +0 -77
  136. package/dist/layout/image/XImage.js +0 -261
  137. package/dist/layout/image/XImage.types.d.ts +0 -130
  138. package/dist/layout/image/XImage.types.d.ts.map +0 -1
  139. package/dist/layout/image/XImage.types.js +0 -2
  140. package/dist/layout/image/XImageGallery.d.ts +0 -76
  141. package/dist/layout/image/XImageGallery.d.ts.map +0 -1
  142. package/dist/layout/image/XImageGallery.js +0 -94
  143. package/dist/layout/image/index.d.ts +0 -12
  144. package/dist/layout/image/index.d.ts.map +0 -1
  145. package/dist/layout/image/index.js +0 -4
  146. package/dist/layout/index.d.ts +0 -12
  147. package/dist/layout/index.d.ts.map +0 -1
  148. package/dist/layout/index.js +0 -11
  149. package/dist/layout/resize/core/ResizeObserverHook.d.ts +0 -41
  150. package/dist/layout/resize/core/ResizeObserverHook.d.ts.map +0 -1
  151. package/dist/layout/resize/core/ResizeObserverHook.js +0 -57
  152. package/dist/layout/resize/core/SizedLayoutContext.d.ts +0 -23
  153. package/dist/layout/resize/core/SizedLayoutContext.d.ts.map +0 -1
  154. package/dist/layout/resize/core/SizedLayoutContext.js +0 -23
  155. package/dist/layout/resize/core/SizedLayoutProps.d.ts +0 -19
  156. package/dist/layout/resize/core/SizedLayoutProps.d.ts.map +0 -1
  157. package/dist/layout/resize/core/SizedLayoutProps.js +0 -1
  158. package/dist/layout/resize/impl/SizedContainer.d.ts +0 -45
  159. package/dist/layout/resize/impl/SizedContainer.d.ts.map +0 -1
  160. package/dist/layout/resize/impl/SizedContainer.js +0 -65
  161. package/dist/layout/resize/impl/SizedLayout.d.ts +0 -45
  162. package/dist/layout/resize/impl/SizedLayout.d.ts.map +0 -1
  163. package/dist/layout/resize/impl/SizedLayout.js +0 -65
  164. package/dist/layout/spinner/XSpinner.d.ts +0 -43
  165. package/dist/layout/spinner/XSpinner.d.ts.map +0 -1
  166. package/dist/layout/spinner/XSpinner.js +0 -47
  167. package/dist/layout/virtualized/VirtualizedConfig.d.ts +0 -16
  168. package/dist/layout/virtualized/VirtualizedConfig.d.ts.map +0 -1
  169. package/dist/layout/virtualized/VirtualizedConfig.js +0 -15
  170. package/dist/layout/visibility/ElementVisibilityHooks.d.ts +0 -13
  171. package/dist/layout/visibility/ElementVisibilityHooks.d.ts.map +0 -1
  172. package/dist/layout/visibility/ElementVisibilityHooks.js +0 -119
  173. package/dist/media/components/XVideo.d.ts +0 -205
  174. package/dist/media/components/XVideo.d.ts.map +0 -1
  175. package/dist/media/components/XVideo.js +0 -297
  176. package/dist/media/components/XVideoBufferingIndicator.d.ts +0 -13
  177. package/dist/media/components/XVideoBufferingIndicator.d.ts.map +0 -1
  178. package/dist/media/components/XVideoBufferingIndicator.js +0 -13
  179. package/dist/media/components/XVideoErrorIndicator.d.ts +0 -15
  180. package/dist/media/components/XVideoErrorIndicator.d.ts.map +0 -1
  181. package/dist/media/components/XVideoErrorIndicator.js +0 -19
  182. package/dist/media/index.d.ts +0 -7
  183. package/dist/media/index.d.ts.map +0 -1
  184. package/dist/media/index.js +0 -7
  185. package/dist/media/playback-queue-store.d.ts +0 -746
  186. package/dist/media/playback-queue-store.d.ts.map +0 -1
  187. package/dist/media/playback-queue-store.js +0 -670
  188. package/dist/media/video-play-safe.d.ts +0 -26
  189. package/dist/media/video-play-safe.d.ts.map +0 -1
  190. package/dist/media/video-play-safe.js +0 -56
  191. package/dist/media/video-state.d.ts +0 -38
  192. package/dist/media/video-state.d.ts.map +0 -1
  193. package/dist/media/video-state.js +0 -125
  194. package/dist/models/ApiPageDataFieldDTO.d.ts +0 -9
  195. package/dist/models/ApiPageDataFieldDTO.d.ts.map +0 -1
  196. package/dist/models/ApiPageDataFieldDTO.js +0 -1
  197. package/dist/models/ApiResponse.d.ts +0 -29
  198. package/dist/models/ApiResponse.d.ts.map +0 -1
  199. package/dist/models/ApiResponse.js +0 -32
  200. package/dist/models/PaginationDTO.d.ts +0 -8
  201. package/dist/models/PaginationDTO.d.ts.map +0 -1
  202. package/dist/models/PaginationDTO.js +0 -6
  203. package/dist/models/index.d.ts +0 -4
  204. package/dist/models/index.d.ts.map +0 -1
  205. package/dist/models/index.js +0 -3
  206. package/dist/refresh/LoadMoreAsync.d.ts +0 -36
  207. package/dist/refresh/LoadMoreAsync.d.ts.map +0 -1
  208. package/dist/refresh/LoadMoreAsync.js +0 -55
  209. package/dist/refresh/index.d.ts +0 -2
  210. package/dist/refresh/index.d.ts.map +0 -1
  211. package/dist/refresh/index.js +0 -2
  212. package/dist/responsive/BrowserAdapter.d.ts +0 -26
  213. package/dist/responsive/BrowserAdapter.d.ts.map +0 -1
  214. package/dist/responsive/BrowserAdapter.js +0 -79
  215. package/dist/responsive/ScreenAdapter.d.ts +0 -2
  216. package/dist/responsive/ScreenAdapter.d.ts.map +0 -1
  217. package/dist/responsive/ScreenAdapter.js +0 -5
  218. package/dist/responsive/index.d.ts +0 -3
  219. package/dist/responsive/index.d.ts.map +0 -1
  220. package/dist/responsive/index.js +0 -3
  221. package/dist/sse/SSEManager.d.ts +0 -21
  222. package/dist/sse/SSEManager.d.ts.map +0 -1
  223. package/dist/sse/SSEManager.js +0 -73
  224. package/dist/sse/SSERegistry.d.ts +0 -20
  225. package/dist/sse/SSERegistry.d.ts.map +0 -1
  226. package/dist/sse/SSERegistry.js +0 -36
  227. package/dist/sse/SSEStatus.d.ts +0 -7
  228. package/dist/sse/SSEStatus.d.ts.map +0 -1
  229. package/dist/sse/SSEStatus.js +0 -7
  230. package/dist/sse/UseSSE.d.ts +0 -13
  231. package/dist/sse/UseSSE.d.ts.map +0 -1
  232. package/dist/sse/UseSSE.js +0 -39
  233. package/dist/sse/index.d.ts +0 -5
  234. package/dist/sse/index.d.ts.map +0 -1
  235. package/dist/sse/index.js +0 -5
  236. package/dist/utils/MIME.d.ts +0 -137
  237. package/dist/utils/MIME.d.ts.map +0 -1
  238. package/dist/utils/MIME.js +0 -192
  239. package/dist/utils/Reload.d.ts +0 -62
  240. package/dist/utils/Reload.d.ts.map +0 -1
  241. package/dist/utils/Reload.js +0 -66
  242. package/dist/utils/ScrollToCenter.d.ts +0 -72
  243. package/dist/utils/ScrollToCenter.d.ts.map +0 -1
  244. package/dist/utils/ScrollToCenter.js +0 -145
  245. package/dist/utils/index.d.ts +0 -5
  246. package/dist/utils/index.d.ts.map +0 -1
  247. package/dist/utils/index.js +0 -5
  248. package/dist/utils/url-placholder.d.ts +0 -14
  249. package/dist/utils/url-placholder.d.ts.map +0 -1
  250. package/dist/utils/url-placholder.js +0 -17
@@ -1,56 +0,0 @@
1
- /**
2
- * Video 安全播放扩展
3
- * 处理移动端自动播放限制,自动降级为静音播放
4
- */
5
- /**
6
- * 安全播放视频
7
- * 1. 按当前 video.muted 状态尝试播放
8
- * 2. 如果非静音播放失败,降级为静音再试
9
- */
10
- export async function playSafe(video, options = {}) {
11
- const { mutedRetry = true, onMutedChange } = options;
12
- if (!video || !video.parentElement || !document.contains(video)) {
13
- return;
14
- }
15
- const wasMuted = video.muted;
16
- try {
17
- await video.play();
18
- }
19
- catch (error) {
20
- // 处理自动播放被阻止的错误
21
- // - NotAllowedError: Chrome/Firefox 自动播放策略阻止
22
- // - AbortError: Safari/iOS 自动播放策略阻止(包括低电量模式)
23
- const isAutoplayBlocked = error instanceof Error &&
24
- (error.name === 'NotAllowedError' || error.name === 'AbortError');
25
- if (!isAutoplayBlocked) {
26
- throw error;
27
- }
28
- // 不启用静音重试,直接抛出
29
- if (!mutedRetry)
30
- throw error;
31
- // 已经是静音还失败,直接抛出
32
- if (wasMuted)
33
- throw error;
34
- // 降级为静音播放
35
- video.muted = true;
36
- onMutedChange === null || onMutedChange === void 0 ? void 0 : onMutedChange();
37
- await video.play();
38
- }
39
- }
40
- /**
41
- * 扩展 HTMLVideoElement 原型
42
- */
43
- export function extendVideoElement() {
44
- if (typeof HTMLVideoElement === 'undefined')
45
- return;
46
- if ('playSafe' in HTMLVideoElement.prototype)
47
- return;
48
- Object.defineProperty(HTMLVideoElement.prototype, 'playSafe', {
49
- value: function (options = {}) {
50
- return playSafe(this, options);
51
- },
52
- writable: true,
53
- configurable: true,
54
- enumerable: false,
55
- });
56
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * VideoState - 视频播放状态接口
3
- * 用于描述 HTML5 video 元素的完整播放状态
4
- */
5
- export interface VideoState {
6
- /** 是否正在播放(非暂停且未结束) */
7
- playing: boolean;
8
- /** 是否正在缓冲(播放中因数据不足暂停) */
9
- buffering: boolean;
10
- /** 是否可以播放(已加载足够数据) */
11
- canPlay: boolean;
12
- /** 当前播放时间(秒) */
13
- currentTime: number;
14
- /** 视频总时长(秒) */
15
- duration: number;
16
- /** 已缓冲的时间点(秒) */
17
- buffered: number;
18
- /** 视频原始宽度(像素) */
19
- videoWidth: number;
20
- /** 视频原始高度(像素) */
21
- videoHeight: number;
22
- /** 是否已播放结束 */
23
- ended: boolean;
24
- /** 播放错误信息(无错误时为 null) */
25
- error: MediaError | null;
26
- }
27
- /**
28
- * useVideoState - 视频状态管理 Hook
29
- * @param videoRef - 外部传入的 videoRef,可跨层级(允许 null)
30
- * @param autoPlay - 是否在 canPlay 后自动播放
31
- */
32
- export declare function useVideoState(videoRef: React.RefObject<HTMLVideoElement | null>, autoPlay?: boolean): {
33
- playState: VideoState;
34
- play: () => Promise<void> | undefined;
35
- pause: () => void | undefined;
36
- seek: (time: number) => void;
37
- };
38
- //# sourceMappingURL=video-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"video-state.d.ts","sourceRoot":"","sources":["../../src/media/video-state.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,KAAK,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,QAAQ,UAAQ;;;;iBAyH9D,MAAM;EAGzC"}
@@ -1,125 +0,0 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
- /**
3
- * useVideoState - 视频状态管理 Hook
4
- * @param videoRef - 外部传入的 videoRef,可跨层级(允许 null)
5
- * @param autoPlay - 是否在 canPlay 后自动播放
6
- */
7
- export function useVideoState(videoRef, autoPlay = false) {
8
- const [state, setState] = useState({
9
- playing: false,
10
- buffering: false,
11
- canPlay: false,
12
- currentTime: 0,
13
- duration: 0,
14
- buffered: 0,
15
- videoWidth: 0,
16
- videoHeight: 0,
17
- ended: false,
18
- error: null,
19
- });
20
- // 核心事件回调
21
- const updatePlaying = useCallback(() => {
22
- const v = videoRef.current;
23
- if (!v)
24
- return;
25
- setState(s => ({ ...s, playing: !v.paused && !v.ended }));
26
- }, [videoRef]);
27
- // 缓冲状态:waiting 时为 true,playing 时为 false
28
- const setBufferingTrue = useCallback(() => {
29
- setState(s => ({ ...s, buffering: true }));
30
- }, []);
31
- const setBufferingFalse = useCallback(() => {
32
- setState(s => ({ ...s, buffering: false }));
33
- }, []);
34
- const updateCanPlay = useCallback(() => {
35
- setState(s => ({ ...s, canPlay: true }));
36
- if (autoPlay) {
37
- const v = videoRef.current;
38
- v === null || v === void 0 ? void 0 : v.play().catch(() => { });
39
- }
40
- }, [videoRef, autoPlay]);
41
- const updateTime = useCallback(() => {
42
- const v = videoRef.current;
43
- if (!v)
44
- return;
45
- setState(s => ({ ...s, currentTime: v.currentTime }));
46
- }, [videoRef]);
47
- const updateDuration = useCallback(() => {
48
- const v = videoRef.current;
49
- if (!v)
50
- return;
51
- setState(s => ({ ...s, duration: v.duration }));
52
- }, [videoRef]);
53
- const updateBuffered = useCallback(() => {
54
- const v = videoRef.current;
55
- if (!v)
56
- return;
57
- setState(s => ({
58
- ...s,
59
- buffered: v.buffered.length ? v.buffered.end(v.buffered.length - 1) : 0
60
- }));
61
- }, [videoRef]);
62
- const updateSize = useCallback(() => {
63
- const v = videoRef.current;
64
- if (!v)
65
- return;
66
- setState(s => ({
67
- ...s,
68
- videoWidth: v.videoWidth,
69
- videoHeight: v.videoHeight
70
- }));
71
- }, [videoRef]);
72
- const updateEnded = useCallback(() => {
73
- const v = videoRef.current;
74
- if (!v)
75
- return;
76
- setState(s => ({ ...s, ended: v.ended }));
77
- }, [videoRef]);
78
- const updateError = useCallback(() => {
79
- const v = videoRef.current;
80
- if (!v)
81
- return;
82
- setState(s => ({ ...s, error: v.error }));
83
- }, [videoRef]);
84
- useEffect(() => {
85
- const video = videoRef.current;
86
- if (!video)
87
- return;
88
- // 注册事件
89
- video.addEventListener('play', updatePlaying); // 播放请求被接受
90
- video.addEventListener('playing', updatePlaying); // 真正开始播放(有画面)
91
- video.addEventListener('playing', setBufferingFalse); // 播放时结束缓冲
92
- video.addEventListener('pause', updatePlaying); // 暂停
93
- video.addEventListener('waiting', updatePlaying); // 缓冲中(暂时无法播放)
94
- video.addEventListener('waiting', setBufferingTrue); // 开始缓冲
95
- video.addEventListener('canplay', updateCanPlay);
96
- video.addEventListener('timeupdate', updateTime);
97
- video.addEventListener('durationchange', updateDuration);
98
- video.addEventListener('progress', updateBuffered);
99
- video.addEventListener('loadedmetadata', updateSize);
100
- video.addEventListener('ended', updateEnded);
101
- video.addEventListener('error', updateError);
102
- // cleanup
103
- return () => {
104
- video.removeEventListener('play', updatePlaying);
105
- video.removeEventListener('playing', updatePlaying);
106
- video.removeEventListener('playing', setBufferingFalse);
107
- video.removeEventListener('pause', updatePlaying);
108
- video.removeEventListener('waiting', updatePlaying);
109
- video.removeEventListener('waiting', setBufferingTrue);
110
- video.removeEventListener('canplay', updateCanPlay);
111
- video.removeEventListener('timeupdate', updateTime);
112
- video.removeEventListener('durationchange', updateDuration);
113
- video.removeEventListener('progress', updateBuffered);
114
- video.removeEventListener('loadedmetadata', updateSize);
115
- video.removeEventListener('ended', updateEnded);
116
- video.removeEventListener('error', updateError);
117
- };
118
- }, [videoRef, updatePlaying, setBufferingTrue, setBufferingFalse, updateCanPlay, updateTime, updateDuration, updateBuffered, updateSize, updateEnded, updateError]);
119
- // 控制方法
120
- const play = useCallback(() => { var _a; return (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.play().catch(() => { }); }, [videoRef]);
121
- const pause = useCallback(() => { var _a; return (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.pause(); }, [videoRef]);
122
- const seek = useCallback((time) => { if (videoRef.current)
123
- videoRef.current.currentTime = time; }, [videoRef]);
124
- return { playState: state, play, pause, seek };
125
- }
@@ -1,9 +0,0 @@
1
- import { PaginationDTO } from "./PaginationDTO";
2
- /**
3
- * 分页数据字段接口
4
- */
5
- export interface ApiPageDataFieldDTO<T> {
6
- list: T[];
7
- pagination: PaginationDTO;
8
- }
9
- //# sourceMappingURL=ApiPageDataFieldDTO.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApiPageDataFieldDTO.d.ts","sourceRoot":"","sources":["../../src/models/ApiPageDataFieldDTO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,UAAU,EAAE,aAAa,CAAA;CAC5B"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,29 +0,0 @@
1
- /**
2
- * 统一 API 响应格式
3
- */
4
- export interface ApiResponse<T> {
5
- code: number;
6
- message: string;
7
- data: T;
8
- }
9
- /**
10
- * 检查 API 响应是否成功
11
- */
12
- export declare function isApiSuccess(code: number): boolean;
13
- /**
14
- * API 错误类
15
- */
16
- export declare class ApiError extends Error {
17
- code: number;
18
- constructor(code: number, message: string);
19
- }
20
- /**
21
- * 从 API 响应中json提取data字段数据,失败时抛出错误
22
- * @deprecated 请使用 {@link getDataFieldOrThrow} 代替
23
- */
24
- export declare function getDataOrThrow<T>(response: ApiResponse<T>): T;
25
- /**
26
- * 从 API 响应中json提取data字段数据,失败时抛出错误
27
- */
28
- export declare function getDataFieldOrThrow<T>(response: ApiResponse<T>): T;
29
- //# sourceMappingURL=ApiResponse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApiResponse.d.ts","sourceRoot":"","sources":["../../src/models/ApiResponse.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,CAAA;CACV;AAGD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAC/B,IAAI,EAAE,MAAM,CAAA;gBAEA,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAE7D;AAGD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAKlE"}
@@ -1,32 +0,0 @@
1
- /**
2
- * 检查 API 响应是否成功
3
- */
4
- export function isApiSuccess(code) {
5
- return code === 0 || code === 200;
6
- }
7
- /**
8
- * API 错误类
9
- */
10
- export class ApiError extends Error {
11
- constructor(code, message) {
12
- super(`API Error: (${code}) ${message}`);
13
- this.name = 'ApiError';
14
- this.code = code;
15
- }
16
- }
17
- /**
18
- * 从 API 响应中json提取data字段数据,失败时抛出错误
19
- * @deprecated 请使用 {@link getDataFieldOrThrow} 代替
20
- */
21
- export function getDataOrThrow(response) {
22
- return getDataFieldOrThrow(response);
23
- }
24
- /**
25
- * 从 API 响应中json提取data字段数据,失败时抛出错误
26
- */
27
- export function getDataFieldOrThrow(response) {
28
- if (!isApiSuccess(response.code)) {
29
- throw new ApiError(response.code, response.message);
30
- }
31
- return response.data;
32
- }
@@ -1,8 +0,0 @@
1
- export interface PaginationDTO {
2
- limit: number;
3
- page: number;
4
- total: number;
5
- total_pages: number;
6
- }
7
- export declare const hasNextPage: (pagination?: PaginationDTO) => boolean;
8
- //# sourceMappingURL=PaginationDTO.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PaginationDTO.d.ts","sourceRoot":"","sources":["../../src/models/PaginationDTO.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAQ,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,WAAW,GAAI,aAAa,aAAa,KAAG,OAGxD,CAAC"}
@@ -1,6 +0,0 @@
1
- // 判断是否有下一页的方法
2
- export const hasNextPage = (pagination) => {
3
- if (!pagination)
4
- return false;
5
- return pagination.page < pagination.total_pages;
6
- };
@@ -1,4 +0,0 @@
1
- export * from './ApiPageDataFieldDTO';
2
- export * from './PaginationDTO';
3
- export * from './ApiResponse';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from './ApiPageDataFieldDTO';
2
- export * from './PaginationDTO';
3
- export * from './ApiResponse';
@@ -1,36 +0,0 @@
1
- import { ApiPageDataFieldDTO } from "../models/ApiPageDataFieldDTO";
2
- /**
3
- * 返回一个稳定的回调(empty deps)。
4
- * 适合不想因 asyncResult 变化频繁重建回调的场景。
5
- *
6
- * 用法:
7
- * const handleLoadMore = useStableHandleLoadMore(asyncResult, setPageNum);
8
- * // 自定义是否有下一页的判定逻辑
9
- * // const handleLoadMore = useHandleLoadMoreCustom<TemplatePaginationResponse, UseAsyncReturn<TemplatePaginationResponse>>(asyncResult, setPageNum, (data) => hasNextPage(data?.pagination))
10
- *
11
- * 在对应的组件上使用
12
- * endReached={handleLoadMore}
13
- * atBottomStateChange={(atBottom) => {
14
- * if (atBottom) {
15
- * handleLoadMore()
16
- * }
17
- * }}
18
- */
19
- export declare function useHandleLoadMore<TData extends ApiPageDataFieldDTO<any>, TAsyncResult extends {
20
- loading: boolean;
21
- error: unknown;
22
- execute: () => Promise<TData>;
23
- result?: TData;
24
- }>(asyncResult: TAsyncResult, setPageNum: (updater: (p: number) => number) => void): () => void;
25
- /**
26
- * 可自定义 hasNextPage 判定的版本(名称:useHandleLoadMoreCustom)
27
- * - hasNextPageFn 接受完整的 TData(可能为 undefined),返回 boolean
28
- * - 返回稳定回调,内部通过 ref 读取最新 asyncResult 与 hasNextPageFn
29
- */
30
- export declare function useHandleLoadMoreCustom<TData, TAsyncResult extends {
31
- loading: boolean;
32
- error: unknown;
33
- execute?: () => Promise<TData>;
34
- result?: TData;
35
- }>(asyncResult: TAsyncResult, setPageNum: (updater: (p: number) => number) => void, hasNextPage: (data: TData | undefined) => boolean): () => void;
36
- //# sourceMappingURL=LoadMoreAsync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoadMoreAsync.d.ts","sourceRoot":"","sources":["../../src/refresh/LoadMoreAsync.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAC;AAElE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,SAAS;IAC3F,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,KAAK,CAAA;CACjB,EACG,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI,SAwB/C,IAAI,CAjBZ;AAGD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,SAAS;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB,EACG,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI,EACpD,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,KAAK,OAAO,GAClD,MAAM,IAAI,CA+BZ"}
@@ -1,55 +0,0 @@
1
- import { useCallback, useEffect, useRef } from "react";
2
- import { hasNextPage } from "../models/PaginationDTO";
3
- /**
4
- * 返回一个稳定的回调(empty deps)。
5
- * 适合不想因 asyncResult 变化频繁重建回调的场景。
6
- *
7
- * 用法:
8
- * const handleLoadMore = useStableHandleLoadMore(asyncResult, setPageNum);
9
- * // 自定义是否有下一页的判定逻辑
10
- * // const handleLoadMore = useHandleLoadMoreCustom<TemplatePaginationResponse, UseAsyncReturn<TemplatePaginationResponse>>(asyncResult, setPageNum, (data) => hasNextPage(data?.pagination))
11
- *
12
- * 在对应的组件上使用
13
- * endReached={handleLoadMore}
14
- * atBottomStateChange={(atBottom) => {
15
- * if (atBottom) {
16
- * handleLoadMore()
17
- * }
18
- * }}
19
- */
20
- export function useHandleLoadMore(asyncResult, setPageNum) {
21
- return useHandleLoadMoreCustom(asyncResult, setPageNum, (data) => hasNextPage(data === null || data === void 0 ? void 0 : data.pagination));
22
- }
23
- /**
24
- * 可自定义 hasNextPage 判定的版本(名称:useHandleLoadMoreCustom)
25
- * - hasNextPageFn 接受完整的 TData(可能为 undefined),返回 boolean
26
- * - 返回稳定回调,内部通过 ref 读取最新 asyncResult 与 hasNextPageFn
27
- */
28
- export function useHandleLoadMoreCustom(asyncResult, setPageNum, hasNextPage) {
29
- const ref = useRef(asyncResult);
30
- useEffect(() => {
31
- ref.current = asyncResult;
32
- }, [asyncResult]);
33
- // 保证读取到最新的判断函数,同时回调保持稳定(不随函数重建)
34
- const hasNextRef = useRef((d) => hasNextPage(d === null || d === void 0 ? void 0 : d.pagination));
35
- useEffect(() => {
36
- hasNextRef.current = hasNextPage;
37
- }, [hasNextPage]);
38
- return useCallback(() => {
39
- var _a;
40
- const cur = ref.current;
41
- if (!cur)
42
- return;
43
- if (cur.loading)
44
- return;
45
- if (cur.error) {
46
- (_a = cur.execute) === null || _a === void 0 ? void 0 : _a.call(cur);
47
- return;
48
- }
49
- // 使用最新的 hasNext 判定
50
- if (!hasNextRef.current(cur.result))
51
- return;
52
- ///进行下一页
53
- setPageNum(p => p + 1);
54
- }, [setPageNum]);
55
- }
@@ -1,2 +0,0 @@
1
- export * from './LoadMoreAsync';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/refresh/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC"}
@@ -1,2 +0,0 @@
1
- 'use client';
2
- export * from './LoadMoreAsync';
@@ -1,26 +0,0 @@
1
- export type BrowserPlatform = 'mobile' | 'tablet' | 'desktop';
2
- export type BrowserName = 'Chrome' | 'Safari' | 'Firefox' | 'Edge' | 'IE' | 'Opera' | 'Samsung Internet' | 'Unknown';
3
- export type BrowserInfo = {
4
- /** 浏览器名称(标准化) */
5
- name: BrowserName;
6
- /** 操作系统 */
7
- os: string;
8
- /** 平台类型 */
9
- platform: BrowserPlatform;
10
- };
11
- export declare const parseBrowser: (ua: string) => BrowserInfo;
12
- export declare const useBrowser: () => BrowserInfo;
13
- export declare const useBrowserType: () => {
14
- readonly isMobile: boolean;
15
- readonly isTablet: boolean;
16
- readonly isDesktop: boolean;
17
- readonly isChrome: boolean;
18
- readonly isSafari: boolean;
19
- readonly isFirefox: boolean;
20
- readonly isEdge: boolean;
21
- readonly isIE: boolean;
22
- readonly name: BrowserName;
23
- readonly os: string;
24
- readonly platform: BrowserPlatform;
25
- };
26
- //# sourceMappingURL=BrowserAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserAdapter.d.ts","sourceRoot":"","sources":["../../src/responsive/BrowserAdapter.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7D,MAAM,MAAM,WAAW,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,IAAI,GACJ,OAAO,GACP,kBAAkB,GAClB,SAAS,CAAA;AAEf,MAAM,MAAM,WAAW,GAAG;IACtB,iBAAiB;IACjB,IAAI,EAAE,WAAW,CAAA;IACjB,WAAW;IACX,EAAE,EAAE,MAAM,CAAA;IACV,WAAW;IACX,QAAQ,EAAE,eAAe,CAAA;CAC5B,CAAA;AAgDD,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,KAAG,WAczC,CAAA;AAGD,eAAO,MAAM,UAAU,mBAEtB,CAAA;AAGD,eAAO,MAAM,cAAc;;;;;;;;;mBA3EjB,WAAW;iBAEb,MAAM;uBAEA,eAAe;CAmG5B,CAAA"}
@@ -1,79 +0,0 @@
1
- import Bowser from 'bowser';
2
- /**
3
- * UA -> BrowserInfo 缓存
4
- * module scope,天然单例
5
- */
6
- const browserCache = new Map();
7
- /* ===================== 新增 1:BrowserName 规范化 ===================== */
8
- const normalizeBrowserName = (name) => {
9
- switch (name) {
10
- case 'Chrome':
11
- case 'Chromium':
12
- return 'Chrome';
13
- case 'Safari':
14
- case 'Mobile Safari':
15
- return 'Safari';
16
- case 'Firefox':
17
- return 'Firefox';
18
- case 'Microsoft Edge':
19
- case 'Edge':
20
- return 'Edge';
21
- case 'Internet Explorer':
22
- return 'IE';
23
- case 'Samsung Internet':
24
- return 'Samsung Internet';
25
- case 'Opera':
26
- return 'Opera';
27
- default:
28
- return 'Unknown';
29
- }
30
- };
31
- /* ===================== 新增 2:platform 兜底 ===================== */
32
- const normalizePlatform = (platform) => {
33
- if (platform === 'mobile' || platform === 'tablet') {
34
- return platform;
35
- }
36
- return 'desktop';
37
- };
38
- export const parseBrowser = (ua) => {
39
- const cached = browserCache.get(ua);
40
- if (cached)
41
- return cached;
42
- const parser = Bowser.getParser(ua);
43
- const info = {
44
- name: normalizeBrowserName(parser.getBrowserName()),
45
- os: parser.getOSName() || 'Unknown',
46
- platform: normalizePlatform(parser.getPlatformType(true)),
47
- };
48
- browserCache.set(ua, info);
49
- return info;
50
- };
51
- /// 判断浏览器信息
52
- export const useBrowser = () => {
53
- return parseBrowser(navigator.userAgent);
54
- };
55
- /// 判断浏览器类型(语义层)
56
- export const useBrowserType = () => {
57
- const browser = useBrowser();
58
- const isMobile = browser.platform === 'mobile';
59
- const isTablet = browser.platform === 'tablet';
60
- const isDesktop = browser.platform === 'desktop';
61
- const isChrome = browser.name === 'Chrome';
62
- const isSafari = browser.name === 'Safari';
63
- const isFirefox = browser.name === 'Firefox';
64
- const isEdge = browser.name === 'Edge';
65
- const isIE = browser.name === 'IE';
66
- return {
67
- ...browser,
68
- // platform
69
- isMobile,
70
- isTablet,
71
- isDesktop,
72
- // browser
73
- isChrome,
74
- isSafari,
75
- isFirefox,
76
- isEdge,
77
- isIE,
78
- };
79
- };
@@ -1,2 +0,0 @@
1
- export declare const useIsBelowMd: () => boolean;
2
- //# sourceMappingURL=ScreenAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScreenAdapter.d.ts","sourceRoot":"","sources":["../../src/responsive/ScreenAdapter.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,eAExB,CAAA"}
@@ -1,5 +0,0 @@
1
- import { useMediaQuery } from 'react-responsive';
2
- ///可用于判断手机端和电脑端的分界线
3
- export const useIsBelowMd = () => {
4
- return useMediaQuery({ maxWidth: 767 });
5
- };
@@ -1,3 +0,0 @@
1
- export * from './ScreenAdapter';
2
- export * from './BrowserAdapter';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/responsive/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -1,3 +0,0 @@
1
- 'use client';
2
- export * from './ScreenAdapter';
3
- export * from './BrowserAdapter';
@@ -1,21 +0,0 @@
1
- import { EventSourceMessage } from '@microsoft/fetch-event-source';
2
- import { SSEStatus } from "./SSEStatus";
3
- type Listener = (event: EventSourceMessage) => void;
4
- type StatusListener = (status: SSEStatus) => void;
5
- export declare class SSEManager {
6
- private url;
7
- private headers;
8
- private controller;
9
- private listeners;
10
- private statusListeners;
11
- private connecting;
12
- private status;
13
- constructor(url: string, headers?: Record<string, string>);
14
- private setStatus;
15
- connect(): void;
16
- disconnect(): void;
17
- subscribe(listener: Listener): () => boolean;
18
- subscribeStatus(listener: StatusListener): () => boolean;
19
- }
20
- export {};
21
- //# sourceMappingURL=SSEManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SSEManager.d.ts","sourceRoot":"","sources":["../../src/sse/SSEManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAmB,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AACpD,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAElD,qBAAa,UAAU;IAQf,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IARnB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAA6B;gBAG/B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;IAIhD,OAAO,CAAC,SAAS;IAYjB,OAAO;IAsCP,UAAU;IAMV,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAO5B,eAAe,CAAC,QAAQ,EAAE,cAAc;CAK3C"}