sa2kit 1.6.43 → 1.6.45

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 (273) hide show
  1. package/dist/AliyunOSSProvider-2FARPAQD.js +15 -0
  2. package/dist/{AliyunOSSProvider-HCNGDJL7.js.map → AliyunOSSProvider-2FARPAQD.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +9 -0
  4. package/dist/{AliyunOSSProvider-4W47OFEK.mjs.map → AliyunOSSProvider-UMVGVBDJ.mjs.map} +1 -1
  5. package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
  6. package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
  7. package/dist/ConfigService-QR67WYNK.mjs +4 -0
  8. package/dist/{ConfigService-V6ZK273Z.mjs.map → ConfigService-QR67WYNK.mjs.map} +1 -1
  9. package/dist/{ConfigService-3DIC6C3Q.js → ConfigService-UYC6ZTCM.js} +3 -3
  10. package/dist/{ConfigService-3DIC6C3Q.js.map → ConfigService-UYC6ZTCM.js.map} +1 -1
  11. package/dist/GenericOrderManager-e4WizpNf.d.mts +28 -0
  12. package/dist/GenericOrderManager-e4WizpNf.d.ts +28 -0
  13. package/dist/LocalStorageProvider-JQF5WK5H.js +15 -0
  14. package/dist/{LocalStorageProvider-PP7MA5OT.js.map → LocalStorageProvider-JQF5WK5H.js.map} +1 -1
  15. package/dist/LocalStorageProvider-PYOHETJV.mjs +9 -0
  16. package/dist/{LocalStorageProvider-3RVPCQB3.mjs.map → LocalStorageProvider-PYOHETJV.mjs.map} +1 -1
  17. package/dist/PMXParser-RLBDO7YK.mjs +4 -0
  18. package/dist/{PMXParser-RNVQL76A.mjs.map → PMXParser-RLBDO7YK.mjs.map} +1 -1
  19. package/dist/{PMXParser-2VTA737I.js → PMXParser-XHNO2KNI.js} +3 -3
  20. package/dist/{PMXParser-2VTA737I.js.map → PMXParser-XHNO2KNI.js.map} +1 -1
  21. package/dist/UniversalFileService-RBV6EN5J.js +15 -0
  22. package/dist/UniversalFileService-RBV6EN5J.js.map +1 -0
  23. package/dist/UniversalFileService-TNYKO6JN.mjs +9 -0
  24. package/dist/UniversalFileService-TNYKO6JN.mjs.map +1 -0
  25. package/dist/analytics/index.js +1 -1
  26. package/dist/analytics/index.mjs +1 -1
  27. package/dist/analytics/server/index.js +1 -1
  28. package/dist/analytics/server/index.mjs +1 -1
  29. package/dist/api/index.js +1 -1
  30. package/dist/api/index.mjs +1 -1
  31. package/dist/audioDetection/index.js +1 -1
  32. package/dist/audioDetection/index.mjs +1 -1
  33. package/dist/auth/client/index.js +1 -1
  34. package/dist/auth/client/index.mjs +1 -1
  35. package/dist/auth/components/index.js +1 -1
  36. package/dist/auth/components/index.mjs +1 -1
  37. package/dist/auth/hooks/index.js +1 -1
  38. package/dist/auth/hooks/index.mjs +1 -1
  39. package/dist/auth/index.js +1 -1
  40. package/dist/auth/index.mjs +1 -1
  41. package/dist/auth/middleware/index.js +1 -1
  42. package/dist/auth/middleware/index.mjs +1 -1
  43. package/dist/auth/routes/index.js +1 -1
  44. package/dist/auth/routes/index.mjs +1 -1
  45. package/dist/auth/schema/index.js +1 -1
  46. package/dist/auth/schema/index.mjs +1 -1
  47. package/dist/auth/services/index.js +1 -1
  48. package/dist/auth/services/index.mjs +1 -1
  49. package/dist/calendar/index.js +12 -12
  50. package/dist/calendar/index.mjs +5 -5
  51. package/dist/calendar/routes/index.js +1 -1
  52. package/dist/calendar/routes/index.mjs +1 -1
  53. package/dist/calendar/server.js +1 -1
  54. package/dist/calendar/server.mjs +1 -1
  55. package/dist/chunk-2PS5PIXV.mjs +443 -0
  56. package/dist/chunk-2PS5PIXV.mjs.map +1 -0
  57. package/dist/chunk-35CXIK5Y.js +277 -0
  58. package/dist/chunk-35CXIK5Y.js.map +1 -0
  59. package/dist/{chunk-GMIUSZXC.mjs → chunk-3JW4X3AC.mjs} +3 -3
  60. package/dist/{chunk-GMIUSZXC.mjs.map → chunk-3JW4X3AC.mjs.map} +1 -1
  61. package/dist/chunk-3M6T5KVD.js +453 -0
  62. package/dist/chunk-3M6T5KVD.js.map +1 -0
  63. package/dist/chunk-3TNR6IMC.js +168 -0
  64. package/dist/chunk-3TNR6IMC.js.map +1 -0
  65. package/dist/chunk-4NFOSCM6.js +34 -0
  66. package/dist/chunk-4NFOSCM6.js.map +1 -0
  67. package/dist/{chunk-3NHAT7D4.mjs → chunk-4VJQZSPU.mjs} +4 -3
  68. package/dist/chunk-4VJQZSPU.mjs.map +1 -0
  69. package/dist/{chunk-SCDDMIF6.js → chunk-4XXIBWCO.js} +66 -66
  70. package/dist/{chunk-SCDDMIF6.js.map → chunk-4XXIBWCO.js.map} +1 -1
  71. package/dist/chunk-6AHYPPUP.js +344 -0
  72. package/dist/chunk-6AHYPPUP.js.map +1 -0
  73. package/dist/{chunk-EGJPS7OL.mjs → chunk-6BJ76BYC.mjs} +3 -3
  74. package/dist/{chunk-EGJPS7OL.mjs.map → chunk-6BJ76BYC.mjs.map} +1 -1
  75. package/dist/chunk-76V7EKBX.mjs +796 -0
  76. package/dist/chunk-76V7EKBX.mjs.map +1 -0
  77. package/dist/chunk-ACLOJXXE.js +195 -0
  78. package/dist/chunk-ACLOJXXE.js.map +1 -0
  79. package/dist/chunk-AEXPAH7Z.mjs +32 -0
  80. package/dist/chunk-AEXPAH7Z.mjs.map +1 -0
  81. package/dist/chunk-CFGX3EKK.js +560 -0
  82. package/dist/chunk-CFGX3EKK.js.map +1 -0
  83. package/dist/{chunk-435LATLS.mjs → chunk-CX5GPCCO.mjs} +3 -4
  84. package/dist/chunk-CX5GPCCO.mjs.map +1 -0
  85. package/dist/chunk-D2HXMGXS.js +46 -0
  86. package/dist/chunk-D2HXMGXS.js.map +1 -0
  87. package/dist/chunk-DM2GUVUH.js +1201 -0
  88. package/dist/chunk-DM2GUVUH.js.map +1 -0
  89. package/dist/{chunk-ZWQJSZEY.js → chunk-DVENFCQY.js} +5 -4
  90. package/dist/chunk-DVENFCQY.js.map +1 -0
  91. package/dist/chunk-EONPKLEJ.mjs +163 -0
  92. package/dist/chunk-EONPKLEJ.mjs.map +1 -0
  93. package/dist/{chunk-L47ZOYHL.js → chunk-EUIXQPPU.js} +4 -4
  94. package/dist/{chunk-L47ZOYHL.js.map → chunk-EUIXQPPU.js.map} +1 -1
  95. package/dist/{chunk-33YOJBQB.js → chunk-JOSNXSA6.js} +3 -4
  96. package/dist/chunk-JOSNXSA6.js.map +1 -0
  97. package/dist/chunk-K7WNCB4V.mjs +554 -0
  98. package/dist/chunk-K7WNCB4V.mjs.map +1 -0
  99. package/dist/chunk-L4ZYBFB2.mjs +44 -0
  100. package/dist/chunk-L4ZYBFB2.mjs.map +1 -0
  101. package/dist/chunk-M4HGHTIC.js +820 -0
  102. package/dist/chunk-M4HGHTIC.js.map +1 -0
  103. package/dist/{chunk-HHVDOIPV.js → chunk-MZKATHB7.js} +4 -4
  104. package/dist/{chunk-HHVDOIPV.js.map → chunk-MZKATHB7.js.map} +1 -1
  105. package/dist/{chunk-UKT3PLON.mjs → chunk-NXQVTAOP.mjs} +3 -3
  106. package/dist/{chunk-UKT3PLON.mjs.map → chunk-NXQVTAOP.mjs.map} +1 -1
  107. package/dist/chunk-OBIPI4GU.mjs +266 -0
  108. package/dist/chunk-OBIPI4GU.mjs.map +1 -0
  109. package/dist/chunk-PAX4S7QM.mjs +94 -0
  110. package/dist/chunk-PAX4S7QM.mjs.map +1 -0
  111. package/dist/chunk-PXWDQFWV.mjs +192 -0
  112. package/dist/chunk-PXWDQFWV.mjs.map +1 -0
  113. package/dist/chunk-QROLPPXP.mjs +5797 -0
  114. package/dist/chunk-QROLPPXP.mjs.map +1 -0
  115. package/dist/chunk-TGNUEULF.mjs +1158 -0
  116. package/dist/chunk-TGNUEULF.mjs.map +1 -0
  117. package/dist/chunk-VBQFVXOW.mjs +2772 -0
  118. package/dist/chunk-VBQFVXOW.mjs.map +1 -0
  119. package/dist/chunk-VLZ5N6XZ.js +5888 -0
  120. package/dist/chunk-VLZ5N6XZ.js.map +1 -0
  121. package/dist/chunk-VTGPHE4Z.mjs +322 -0
  122. package/dist/chunk-VTGPHE4Z.mjs.map +1 -0
  123. package/dist/chunk-WMJKH4XE.mjs +30 -0
  124. package/dist/{chunk-BJTO5JO5.mjs.map → chunk-WMJKH4XE.mjs.map} +1 -1
  125. package/dist/chunk-XYQMAF7H.js +96 -0
  126. package/dist/chunk-XYQMAF7H.js.map +1 -0
  127. package/dist/chunk-Z3G3IXEF.js +2814 -0
  128. package/dist/chunk-Z3G3IXEF.js.map +1 -0
  129. package/dist/chunk-Z6ZWNWWR.js +35 -0
  130. package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
  131. package/dist/components/index.d.mts +378 -0
  132. package/dist/components/index.d.ts +378 -0
  133. package/dist/components/index.js +414 -0
  134. package/dist/components/index.js.map +1 -0
  135. package/dist/components/index.mjs +9 -0
  136. package/dist/components/index.mjs.map +1 -0
  137. package/dist/config/index.js +1 -1
  138. package/dist/config/index.mjs +1 -1
  139. package/dist/config/server/index.js +1 -1
  140. package/dist/config/server/index.mjs +1 -1
  141. package/dist/fileService-O3W6YXCI.mjs +4 -0
  142. package/dist/fileService-O3W6YXCI.mjs.map +1 -0
  143. package/dist/fileService-YUDIYOAS.js +13 -0
  144. package/dist/fileService-YUDIYOAS.js.map +1 -0
  145. package/dist/i18n/index.js +7 -7
  146. package/dist/i18n/index.mjs +1 -1
  147. package/dist/imageCrop/index.js +1 -1
  148. package/dist/imageCrop/index.mjs +1 -1
  149. package/dist/index.d.mts +9 -580
  150. package/dist/index.d.ts +9 -580
  151. package/dist/index.js +313 -972
  152. package/dist/index.js.map +1 -1
  153. package/dist/index.mjs +104 -790
  154. package/dist/index.mjs.map +1 -1
  155. package/dist/logger/index.js +8 -8
  156. package/dist/logger/index.mjs +5 -2
  157. package/dist/mikuFireworks3D/index.js +17 -17
  158. package/dist/mikuFireworks3D/index.mjs +2 -2
  159. package/dist/mikuFireworks3D/server/index.js +1 -1
  160. package/dist/mikuFireworks3D/server/index.mjs +1 -1
  161. package/dist/mikuFusionGame/index.js +5 -5
  162. package/dist/mikuFusionGame/index.mjs +4 -4
  163. package/dist/mmd/admin/index.js +1 -1
  164. package/dist/mmd/admin/index.mjs +1 -1
  165. package/dist/mmd/index.js +2 -2
  166. package/dist/mmd/index.mjs +2 -2
  167. package/dist/mmd/server/index.js +1 -1
  168. package/dist/mmd/server/index.mjs +1 -1
  169. package/dist/music/index.js +1 -1
  170. package/dist/music/index.mjs +1 -1
  171. package/dist/music/server/index.js +1 -1
  172. package/dist/music/server/index.mjs +1 -1
  173. package/dist/navigation/index.d.mts +93 -0
  174. package/dist/navigation/index.d.ts +93 -0
  175. package/dist/navigation/index.js +29 -0
  176. package/dist/navigation/index.js.map +1 -0
  177. package/dist/navigation/index.mjs +4 -0
  178. package/dist/navigation/index.mjs.map +1 -0
  179. package/dist/popupConfig-BznThU1O.d.mts +330 -0
  180. package/dist/popupConfig-BznThU1O.d.ts +330 -0
  181. package/dist/portfolio/index.d.mts +57 -0
  182. package/dist/portfolio/index.d.ts +57 -0
  183. package/dist/portfolio/index.js +35 -0
  184. package/dist/portfolio/index.js.map +1 -0
  185. package/dist/portfolio/index.mjs +10 -0
  186. package/dist/portfolio/index.mjs.map +1 -0
  187. package/dist/request/index.js +1 -1
  188. package/dist/request/index.mjs +1 -1
  189. package/dist/showmasterpiece/index.d.mts +2524 -0
  190. package/dist/showmasterpiece/index.d.ts +2524 -0
  191. package/dist/showmasterpiece/index.js +9681 -0
  192. package/dist/showmasterpiece/index.js.map +1 -0
  193. package/dist/showmasterpiece/index.mjs +9631 -0
  194. package/dist/showmasterpiece/index.mjs.map +1 -0
  195. package/dist/showmasterpiece/migration/index.d.mts +120 -0
  196. package/dist/showmasterpiece/migration/index.d.ts +120 -0
  197. package/dist/showmasterpiece/migration/index.js +595 -0
  198. package/dist/showmasterpiece/migration/index.js.map +1 -0
  199. package/dist/showmasterpiece/migration/index.mjs +589 -0
  200. package/dist/showmasterpiece/migration/index.mjs.map +1 -0
  201. package/dist/showmasterpiece/scripts/index.d.mts +28 -0
  202. package/dist/showmasterpiece/scripts/index.d.ts +28 -0
  203. package/dist/showmasterpiece/scripts/index.js +327 -0
  204. package/dist/showmasterpiece/scripts/index.js.map +1 -0
  205. package/dist/showmasterpiece/scripts/index.mjs +325 -0
  206. package/dist/showmasterpiece/scripts/index.mjs.map +1 -0
  207. package/dist/showmasterpiece/server/index.d.mts +2698 -0
  208. package/dist/showmasterpiece/server/index.d.ts +2698 -0
  209. package/dist/showmasterpiece/server/index.js +179 -0
  210. package/dist/showmasterpiece/server/index.js.map +1 -0
  211. package/dist/showmasterpiece/server/index.mjs +6 -0
  212. package/dist/showmasterpiece/server/index.mjs.map +1 -0
  213. package/dist/storage/index.js +8 -8
  214. package/dist/storage/index.mjs +2 -2
  215. package/dist/testYourself/admin/index.js +1 -1
  216. package/dist/testYourself/admin/index.mjs +1 -1
  217. package/dist/testYourself/index.js +2 -2
  218. package/dist/testYourself/index.mjs +2 -2
  219. package/dist/testYourself/server/index.js +1 -1
  220. package/dist/testYourself/server/index.mjs +1 -1
  221. package/dist/universalExport/index.js +154 -1195
  222. package/dist/universalExport/index.js.map +1 -1
  223. package/dist/universalExport/index.mjs +2 -1157
  224. package/dist/universalExport/index.mjs.map +1 -1
  225. package/dist/universalExport/server/index.js +5 -3
  226. package/dist/universalExport/server/index.js.map +1 -1
  227. package/dist/universalExport/server/index.mjs +4 -2
  228. package/dist/universalExport/server/index.mjs.map +1 -1
  229. package/dist/universalFile/index.js +10 -7
  230. package/dist/universalFile/index.js.map +1 -1
  231. package/dist/universalFile/index.mjs +6 -2
  232. package/dist/universalFile/index.mjs.map +1 -1
  233. package/dist/universalFile/server/index.d.mts +592 -265
  234. package/dist/universalFile/server/index.d.ts +592 -265
  235. package/dist/universalFile/server/index.js +298 -5637
  236. package/dist/universalFile/server/index.js.map +1 -1
  237. package/dist/universalFile/server/index.mjs +8 -5559
  238. package/dist/universalFile/server/index.mjs.map +1 -1
  239. package/dist/utils/index.js +12 -12
  240. package/dist/utils/index.mjs +3 -3
  241. package/package.json +36 -1
  242. package/dist/AliyunOSSProvider-4W47OFEK.mjs +0 -6
  243. package/dist/AliyunOSSProvider-HCNGDJL7.js +0 -15
  244. package/dist/ConfigService-V6ZK273Z.mjs +0 -4
  245. package/dist/LocalStorageProvider-3RVPCQB3.mjs +0 -6
  246. package/dist/LocalStorageProvider-PP7MA5OT.js +0 -15
  247. package/dist/PMXParser-RNVQL76A.mjs +0 -4
  248. package/dist/chunk-25OFOKNF.js +0 -171
  249. package/dist/chunk-25OFOKNF.js.map +0 -1
  250. package/dist/chunk-33YOJBQB.js.map +0 -1
  251. package/dist/chunk-3DXPQ4YV.mjs +0 -165
  252. package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
  253. package/dist/chunk-3NHAT7D4.mjs.map +0 -1
  254. package/dist/chunk-435LATLS.mjs.map +0 -1
  255. package/dist/chunk-BJTO5JO5.mjs +0 -10
  256. package/dist/chunk-CIVO4R6N.mjs +0 -37
  257. package/dist/chunk-CIVO4R6N.mjs.map +0 -1
  258. package/dist/chunk-DGUM43GV.js +0 -12
  259. package/dist/chunk-HDMIOOZY.mjs +0 -546
  260. package/dist/chunk-HDMIOOZY.mjs.map +0 -1
  261. package/dist/chunk-HJ6MH7J7.js +0 -552
  262. package/dist/chunk-HJ6MH7J7.js.map +0 -1
  263. package/dist/chunk-KH6RQ4J5.js +0 -28
  264. package/dist/chunk-KH6RQ4J5.js.map +0 -1
  265. package/dist/chunk-Q5EDCKQA.js +0 -336
  266. package/dist/chunk-Q5EDCKQA.js.map +0 -1
  267. package/dist/chunk-YOTQG4NP.mjs +0 -314
  268. package/dist/chunk-YOTQG4NP.mjs.map +0 -1
  269. package/dist/chunk-ZGVB35L2.mjs +0 -25
  270. package/dist/chunk-ZGVB35L2.mjs.map +0 -1
  271. package/dist/chunk-ZRAW3HXA.js +0 -43
  272. package/dist/chunk-ZRAW3HXA.js.map +0 -1
  273. package/dist/chunk-ZWQJSZEY.js.map +0 -1
@@ -1,10 +1,10 @@
1
- import { SearchBox, ConfirmModal, Modal } from '../chunk-GMIUSZXC.mjs';
2
- import '../chunk-EGJPS7OL.mjs';
3
- import '../chunk-3NHAT7D4.mjs';
1
+ import { SearchBox, ConfirmModal, Modal } from '../chunk-3JW4X3AC.mjs';
2
+ import '../chunk-6BJ76BYC.mjs';
3
+ import '../chunk-4VJQZSPU.mjs';
4
4
  import '../chunk-VVWQTO4Y.mjs';
5
5
  import '../chunk-WEEXCPSE.mjs';
6
- import '../chunk-3DXPQ4YV.mjs';
7
- import '../chunk-BJTO5JO5.mjs';
6
+ import '../chunk-PXWDQFWV.mjs';
7
+ import '../chunk-WMJKH4XE.mjs';
8
8
  import React2, { useState, useMemo, useCallback, useEffect } from 'react';
9
9
  import { clsx } from 'clsx';
10
10
  import { useDraggable, useDroppable, DndContext, DragOverlay } from '@dnd-kit/core';
@@ -2,7 +2,7 @@
2
2
 
3
3
  var chunkWC5QFO3T_js = require('../../chunk-WC5QFO3T.js');
4
4
  require('../../chunk-SVWQN2LR.js');
5
- require('../../chunk-DGUM43GV.js');
5
+ require('../../chunk-Z6ZWNWWR.js');
6
6
  var server = require('next/server');
7
7
 
8
8
  function initDbService(db) {
@@ -1,6 +1,6 @@
1
1
  import { calendarDbService } from '../../chunk-GVVS4IMM.mjs';
2
2
  import '../../chunk-AIKEVVDR.mjs';
3
- import '../../chunk-BJTO5JO5.mjs';
3
+ import '../../chunk-WMJKH4XE.mjs';
4
4
  import { NextResponse } from 'next/server';
5
5
 
6
6
  function initDbService(db) {
@@ -2,7 +2,7 @@
2
2
 
3
3
  var chunkWC5QFO3T_js = require('../chunk-WC5QFO3T.js');
4
4
  require('../chunk-SVWQN2LR.js');
5
- require('../chunk-DGUM43GV.js');
5
+ require('../chunk-Z6ZWNWWR.js');
6
6
 
7
7
  // src/calendar/server.ts
8
8
  var DEFAULT_CALENDAR_CONFIG = {
@@ -1,7 +1,7 @@
1
1
  import { calendarDbService } from '../chunk-GVVS4IMM.mjs';
2
2
  export { calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, eventShares, eventSharesRelations, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations } from '../chunk-GVVS4IMM.mjs';
3
3
  import '../chunk-AIKEVVDR.mjs';
4
- import '../chunk-BJTO5JO5.mjs';
4
+ import '../chunk-WMJKH4XE.mjs';
5
5
 
6
6
  // src/calendar/server.ts
7
7
  var DEFAULT_CALENDAR_CONFIG = {
@@ -0,0 +1,443 @@
1
+ import React5, { useState, useRef, useEffect } from 'react';
2
+ import { clsx } from 'clsx';
3
+ import { createPortal } from 'react-dom';
4
+
5
+ // src/navigation/Navigation.tsx
6
+ var NavigationItemComponent = ({
7
+ item,
8
+ direction,
9
+ isActive,
10
+ onClick
11
+ }) => {
12
+ const handleClick = (e) => {
13
+ e.preventDefault();
14
+ onClick(item);
15
+ };
16
+ const getItemClasses = () => {
17
+ const baseClasses = `
18
+ group relative flex items-center gap-3
19
+ transition-all duration-300 ease-in-out
20
+ focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50
21
+ rounded-lg
22
+ `;
23
+ const directionClasses = direction === "vertical" ? "px-4 py-3 w-full justify-start" : "px-3 py-2 justify-center";
24
+ const stateClasses = isActive ? "bg-blue-500 text-white shadow-lg" : item.isExternal ? "text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200" : "text-gray-700 hover:bg-blue-50 hover:text-blue-600";
25
+ return baseClasses + " " + directionClasses + " " + stateClasses;
26
+ };
27
+ return /* @__PURE__ */ React5.createElement(
28
+ "a",
29
+ {
30
+ href: item.href,
31
+ onClick: handleClick,
32
+ target: item.target,
33
+ rel: item.isExternal ? "noopener noreferrer" : void 0,
34
+ className: getItemClasses()
35
+ },
36
+ item.icon && /* @__PURE__ */ React5.createElement("span", { className: "flex-shrink-0" }, item.icon),
37
+ /* @__PURE__ */ React5.createElement("span", { className: clsx("font-medium", direction === "vertical" ? "text-sm" : "text-xs") }, item.label),
38
+ item.isExternal && /* @__PURE__ */ React5.createElement(
39
+ "svg",
40
+ {
41
+ className: "w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity",
42
+ fill: "none",
43
+ stroke: "currentColor",
44
+ viewBox: "0 0 24 24"
45
+ },
46
+ /* @__PURE__ */ React5.createElement(
47
+ "path",
48
+ {
49
+ strokeLinecap: "round",
50
+ strokeLinejoin: "round",
51
+ strokeWidth: 2,
52
+ d: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
53
+ }
54
+ )
55
+ ),
56
+ direction === "vertical" && isActive && /* @__PURE__ */ React5.createElement("div", { className: "absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full" })
57
+ );
58
+ };
59
+ var NavigationItem_default = NavigationItemComponent;
60
+ var Navigation = ({
61
+ config,
62
+ isOpen,
63
+ activeItemId,
64
+ onItemClick,
65
+ className = ""
66
+ }) => {
67
+ const { direction, position, items, avatar, logo } = config;
68
+ const getContainerClasses = () => {
69
+ const baseClasses = `
70
+ fixed z-[90]
71
+ bg-white/95 backdrop-blur-lg
72
+ border border-gray-200/50
73
+ shadow-2xl
74
+ transition-all duration-500 ease-in-out
75
+ `;
76
+ if (direction === "vertical") {
77
+ const verticalClasses = "h-screen w-64 flex flex-col";
78
+ const positionClasses = position === "left" ? "left-0 top-0 " + (isOpen ? "translate-x-0" : "-translate-x-full") : "right-0 top-0 " + (isOpen ? "translate-x-0" : "translate-x-full");
79
+ return baseClasses + " " + verticalClasses + " " + positionClasses;
80
+ } else {
81
+ const horizontalClasses = "w-full h-16 flex items-center";
82
+ const positionClasses = position === "top" ? "top-0 left-0 right-0 " + (isOpen ? "translate-y-0" : "-translate-y-full") : "bottom-0 left-0 right-0 " + (isOpen ? "translate-y-0" : "translate-y-full");
83
+ return baseClasses + " " + horizontalClasses + " " + positionClasses;
84
+ }
85
+ };
86
+ const getContentClasses = () => {
87
+ if (direction === "vertical") {
88
+ return "flex flex-col h-full p-4";
89
+ } else {
90
+ return "flex items-center justify-between w-full px-6";
91
+ }
92
+ };
93
+ const getItemsListClasses = () => {
94
+ if (direction === "vertical") {
95
+ return "flex flex-col gap-2 flex-1 overflow-y-auto mt-4";
96
+ } else {
97
+ return "flex items-center gap-4";
98
+ }
99
+ };
100
+ const handleItemClick = (item) => {
101
+ if (item.isExternal) {
102
+ window.open(item.href, item.target || "_blank");
103
+ } else if (item.href.startsWith("#")) {
104
+ const element = document.getElementById(item.id);
105
+ if (element) {
106
+ element.scrollIntoView({ behavior: "smooth" });
107
+ }
108
+ } else {
109
+ window.location.href = item.href;
110
+ }
111
+ onItemClick?.(item);
112
+ };
113
+ if (!isOpen) return null;
114
+ return /* @__PURE__ */ React5.createElement("nav", { className: clsx(getContainerClasses(), className) }, /* @__PURE__ */ React5.createElement("div", { className: getContentClasses() }, logo && /* @__PURE__ */ React5.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React5.createElement(
115
+ "img",
116
+ {
117
+ src: logo.src,
118
+ alt: logo.alt || "Logo",
119
+ className: "h-8 w-auto"
120
+ }
121
+ )), direction === "vertical" && /* @__PURE__ */ React5.createElement("div", { className: "h-12 flex-shrink-0" }), /* @__PURE__ */ React5.createElement("div", { className: getItemsListClasses() }, items.map((item) => /* @__PURE__ */ React5.createElement(
122
+ NavigationItem_default,
123
+ {
124
+ key: item.id,
125
+ item,
126
+ direction,
127
+ isActive: activeItemId === item.id,
128
+ onClick: handleItemClick
129
+ }
130
+ ))), avatar && direction === "vertical" && /* @__PURE__ */ React5.createElement("div", { className: "flex items-center justify-center mt-auto pt-4" }, /* @__PURE__ */ React5.createElement(
131
+ "img",
132
+ {
133
+ src: avatar.src,
134
+ alt: avatar.alt || "Avatar",
135
+ className: "w-10 h-10 rounded-full border-2 border-gray-200"
136
+ }
137
+ )), avatar && direction === "horizontal" && /* @__PURE__ */ React5.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React5.createElement(
138
+ "img",
139
+ {
140
+ src: avatar.src,
141
+ alt: avatar.alt || "Avatar",
142
+ className: "w-8 h-8 rounded-full border-2 border-gray-200"
143
+ }
144
+ ))));
145
+ };
146
+ var Navigation_default = Navigation;
147
+ var NavigationToggle = ({
148
+ isOpen,
149
+ onClick,
150
+ position
151
+ }) => {
152
+ const getPositionClasses = () => {
153
+ switch (position) {
154
+ case "top":
155
+ return "top-4 left-4";
156
+ case "bottom":
157
+ return "bottom-4 left-4";
158
+ case "left":
159
+ return "top-4 left-4";
160
+ case "right":
161
+ return "top-4 right-4";
162
+ default:
163
+ return "top-4 left-4";
164
+ }
165
+ };
166
+ return /* @__PURE__ */ React5.createElement(
167
+ "button",
168
+ {
169
+ onClick,
170
+ className: clsx(
171
+ "fixed",
172
+ getPositionClasses(),
173
+ "z-[100] p-3 rounded-xl bg-white/90 backdrop-blur-md shadow-lg hover:shadow-xl border border-gray-200/50 transition-all duration-300 ease-in-out hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50"
174
+ ),
175
+ "aria-label": isOpen ? "\u5173\u95ED\u5BFC\u822A\u680F" : "\u6253\u5F00\u5BFC\u822A\u680F"
176
+ },
177
+ /* @__PURE__ */ React5.createElement("div", { className: "w-5 h-5 flex flex-col justify-center items-center" }, /* @__PURE__ */ React5.createElement(
178
+ "span",
179
+ {
180
+ className: clsx(
181
+ "block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out",
182
+ isOpen ? "rotate-45 translate-y-0.5" : ""
183
+ )
184
+ }
185
+ ), /* @__PURE__ */ React5.createElement(
186
+ "span",
187
+ {
188
+ className: clsx(
189
+ "block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1",
190
+ isOpen ? "opacity-0 scale-0" : "opacity-100 scale-100"
191
+ )
192
+ }
193
+ ), /* @__PURE__ */ React5.createElement(
194
+ "span",
195
+ {
196
+ className: clsx(
197
+ "block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1",
198
+ isOpen ? "-rotate-45 -translate-y-2.5" : ""
199
+ )
200
+ }
201
+ ))
202
+ );
203
+ };
204
+ var NavigationToggle_default = NavigationToggle;
205
+ var FloatingMenu = ({
206
+ trigger,
207
+ menu,
208
+ initialPosition = { x: 20, y: 20 },
209
+ defaultOpen = false,
210
+ className = "",
211
+ menuClassName = "",
212
+ triggerClassName = "",
213
+ zIndex = 1e3
214
+ }) => {
215
+ const [position, setPosition] = useState(initialPosition);
216
+ const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);
217
+ const [menuDirection, setMenuDirection] = useState("right");
218
+ const [isDragging, setIsDragging] = useState(false);
219
+ const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });
220
+ const containerRef = useRef(null);
221
+ const [mounted, setMounted] = useState(false);
222
+ const [hasDragged, setHasDragged] = useState(false);
223
+ const dragTimerRef = useRef(null);
224
+ const mouseDownPosRef = useRef(null);
225
+ useEffect(() => {
226
+ setMounted(true);
227
+ return () => setMounted(false);
228
+ }, []);
229
+ useEffect(() => {
230
+ if (!mounted || !containerRef.current) return;
231
+ const updateMenuDirection = () => {
232
+ const rect = containerRef.current?.getBoundingClientRect();
233
+ if (!rect) return;
234
+ const windowWidth = window.innerWidth;
235
+ const middlePoint = windowWidth / 2;
236
+ setMenuDirection(rect.left < middlePoint ? "right" : "left");
237
+ };
238
+ updateMenuDirection();
239
+ window.addEventListener("resize", updateMenuDirection);
240
+ window.addEventListener("scroll", updateMenuDirection);
241
+ return () => {
242
+ window.removeEventListener("resize", updateMenuDirection);
243
+ window.removeEventListener("scroll", updateMenuDirection);
244
+ };
245
+ }, [mounted]);
246
+ const handleMouseDown = (e) => {
247
+ if (!containerRef.current) return;
248
+ e.stopPropagation();
249
+ mouseDownPosRef.current = { x: e.clientX, y: e.clientY };
250
+ const rect = containerRef.current.getBoundingClientRect();
251
+ setDragOffset({
252
+ x: e.clientX - rect.left,
253
+ y: e.clientY - rect.top
254
+ });
255
+ setHasDragged(false);
256
+ setIsDragging(true);
257
+ };
258
+ useEffect(() => {
259
+ if (!isDragging) return;
260
+ const handleMouseMove = (e) => {
261
+ if (mouseDownPosRef.current) {
262
+ const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);
263
+ const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);
264
+ if (dx > 3 || dy > 3) {
265
+ setHasDragged(true);
266
+ }
267
+ }
268
+ const newX = e.clientX - dragOffset.x;
269
+ const newY = e.clientY - dragOffset.y;
270
+ const windowWidth = window.innerWidth;
271
+ const windowHeight = window.innerHeight;
272
+ setPosition({
273
+ x: Math.min(Math.max(newX, 0), windowWidth - 50),
274
+ y: Math.min(Math.max(newY, 0), windowHeight - 50)
275
+ });
276
+ };
277
+ const handleMouseUp = () => {
278
+ setIsDragging(false);
279
+ mouseDownPosRef.current = null;
280
+ if (dragTimerRef.current) {
281
+ window.clearTimeout(dragTimerRef.current);
282
+ }
283
+ dragTimerRef.current = window.setTimeout(() => {
284
+ setHasDragged(false);
285
+ }, 300);
286
+ };
287
+ document.addEventListener("mousemove", handleMouseMove);
288
+ document.addEventListener("mouseup", handleMouseUp);
289
+ return () => {
290
+ document.removeEventListener("mousemove", handleMouseMove);
291
+ document.removeEventListener("mouseup", handleMouseUp);
292
+ };
293
+ }, [isDragging, dragOffset]);
294
+ useEffect(() => {
295
+ return () => {
296
+ if (dragTimerRef.current) {
297
+ window.clearTimeout(dragTimerRef.current);
298
+ }
299
+ };
300
+ }, []);
301
+ const toggleMenu = (e) => {
302
+ e.stopPropagation();
303
+ if (hasDragged) {
304
+ return;
305
+ }
306
+ setIsMenuOpen(!isMenuOpen);
307
+ };
308
+ useEffect(() => {
309
+ if (!isMenuOpen) return;
310
+ const handleClickOutside = (e) => {
311
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
312
+ setIsMenuOpen(false);
313
+ }
314
+ };
315
+ document.addEventListener("mousedown", handleClickOutside);
316
+ return () => {
317
+ document.removeEventListener("mousedown", handleClickOutside);
318
+ };
319
+ }, [isMenuOpen]);
320
+ useEffect(() => {
321
+ if (!mounted) return;
322
+ const checkBoundaries = () => {
323
+ const windowWidth = window.innerWidth;
324
+ const windowHeight = window.innerHeight;
325
+ setPosition((prev) => {
326
+ const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);
327
+ const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);
328
+ if (newX !== prev.x || newY !== prev.y) {
329
+ return { x: newX, y: newY };
330
+ }
331
+ return prev;
332
+ });
333
+ };
334
+ window.addEventListener("resize", checkBoundaries);
335
+ return () => {
336
+ window.removeEventListener("resize", checkBoundaries);
337
+ };
338
+ }, [mounted]);
339
+ if (!mounted) return null;
340
+ return createPortal(
341
+ /* @__PURE__ */ React5.createElement(
342
+ "div",
343
+ {
344
+ ref: containerRef,
345
+ className: clsx("fixed select-none box-border", className),
346
+ style: {
347
+ left: position.x + "px",
348
+ top: position.y + "px",
349
+ zIndex
350
+ }
351
+ },
352
+ /* @__PURE__ */ React5.createElement(
353
+ "div",
354
+ {
355
+ className: clsx(
356
+ "flex items-center justify-center w-12 h-12 md:w-12 md:h-12 bg-white rounded-full shadow-md hover:shadow-lg cursor-grab active:cursor-grabbing transition-all duration-200 hover:scale-105 active:scale-95",
357
+ triggerClassName
358
+ ),
359
+ onMouseDown: handleMouseDown,
360
+ onClick: toggleMenu
361
+ },
362
+ trigger
363
+ ),
364
+ isMenuOpen && /* @__PURE__ */ React5.createElement(
365
+ "div",
366
+ {
367
+ className: clsx(
368
+ "absolute top-0 bg-white rounded-lg shadow-xl p-3 min-w-[200px] md:min-w-[200px] max-w-[300px] z-[1000] transition-all duration-200",
369
+ isMenuOpen ? "opacity-100 scale-100" : "opacity-0 scale-95",
370
+ menuDirection === "left" ? "right-[calc(100%+10px)]" : "left-[calc(100%+10px)]",
371
+ menuClassName
372
+ ),
373
+ onClick: (e) => e.stopPropagation(),
374
+ onMouseDown: (e) => e.stopPropagation(),
375
+ onMouseUp: (e) => e.stopPropagation(),
376
+ onTouchStart: (e) => e.stopPropagation(),
377
+ onTouchMove: (e) => e.stopPropagation(),
378
+ onTouchEnd: (e) => e.stopPropagation(),
379
+ onPointerDown: (e) => e.stopPropagation(),
380
+ onPointerUp: (e) => e.stopPropagation()
381
+ },
382
+ menu
383
+ )
384
+ ),
385
+ document.body
386
+ );
387
+ };
388
+ var FloatingMenu_default = FloatingMenu;
389
+ var FloatingMenuExample = () => {
390
+ const [windowWidth, setWindowWidth] = useState(0);
391
+ useEffect(() => {
392
+ setWindowWidth(window.innerWidth);
393
+ const handleResize = () => setWindowWidth(window.innerWidth);
394
+ window.addEventListener("resize", handleResize);
395
+ return () => window.removeEventListener("resize", handleResize);
396
+ }, []);
397
+ const menuItems = [
398
+ { id: 1, label: "\u9996\u9875", icon: "\u{1F3E0}" },
399
+ { id: 2, label: "\u8BBE\u7F6E", icon: "\u2699\uFE0F" },
400
+ { id: 3, label: "\u6D88\u606F", icon: "\u{1F4E9}" },
401
+ { id: 4, label: "\u5E2E\u52A9", icon: "\u2753" },
402
+ { id: 5, label: "\u9000\u51FA", icon: "\u{1F6AA}" }
403
+ ];
404
+ const handleMenuItemClick = (id) => {
405
+ console.log("\u70B9\u51FB\u4E86\u83DC\u5355\u9879: " + id);
406
+ };
407
+ return /* @__PURE__ */ React5.createElement("div", { className: "w-full h-screen bg-gray-100 relative p-8" }, /* @__PURE__ */ React5.createElement("div", { className: "max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12" }, /* @__PURE__ */ React5.createElement("h1", { className: "text-3xl font-bold mb-4 text-gray-900" }, "\u60AC\u6D6E\u83DC\u5355\u793A\u4F8B"), /* @__PURE__ */ React5.createElement("p", { className: "text-gray-600 leading-relaxed mb-6" }, "\u8FD9\u662F\u4E00\u4E2A\u53EF\u62D6\u62FD\u7684\u60AC\u6D6E\u83DC\u5355\u7EC4\u4EF6\u793A\u4F8B\u3002\u4F60\u53EF\u4EE5\u5C1D\u8BD5\u62D6\u52A8\u4E0B\u65B9\u7684 ", /* @__PURE__ */ React5.createElement("span", { className: "font-bold text-blue-600" }, "\u84DD\u8272\u6309\u94AE"), " \u5230\u5904\u79FB\u52A8\u3002"), /* @__PURE__ */ React5.createElement("div", { className: "bg-blue-50 border-l-4 border-blue-500 p-4 mb-6" }, /* @__PURE__ */ React5.createElement("p", { className: "text-sm text-blue-700" }, /* @__PURE__ */ React5.createElement("strong", null, "\u667A\u80FD\u5B9A\u4F4D\uFF1A"), " \u83DC\u5355\u4F1A\u6839\u636E\u6309\u94AE\u5728\u5C4F\u5E55\u4E0A\u7684\u4F4D\u7F6E\u81EA\u52A8\u8C03\u6574\u5F39\u51FA\u65B9\u5411\uFF08\u5411\u5DE6\u6216\u5411\u53F3\uFF09\u3002"))), /* @__PURE__ */ React5.createElement(
408
+ FloatingMenu_default,
409
+ {
410
+ trigger: /* @__PURE__ */ React5.createElement("div", { className: "w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React5.createElement("span", { className: "text-xl" }, "\u2795")),
411
+ menu: /* @__PURE__ */ React5.createElement("div", { className: "w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden" }, /* @__PURE__ */ React5.createElement("div", { className: "px-4 py-3 border-b border-gray-100" }, /* @__PURE__ */ React5.createElement("h3", { className: "text-sm font-bold text-gray-900" }, "\u5FEB\u6377\u83DC\u5355")), /* @__PURE__ */ React5.createElement("ul", { className: "py-1" }, menuItems.map((item) => /* @__PURE__ */ React5.createElement(
412
+ "li",
413
+ {
414
+ key: item.id,
415
+ className: "flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm",
416
+ onClick: () => handleMenuItemClick(item.id)
417
+ },
418
+ /* @__PURE__ */ React5.createElement("span", { className: "text-lg" }, item.icon),
419
+ /* @__PURE__ */ React5.createElement("span", { className: "font-medium" }, item.label)
420
+ )))),
421
+ initialPosition: { x: 100, y: 100 }
422
+ }
423
+ ), windowWidth > 0 && /* @__PURE__ */ React5.createElement(
424
+ FloatingMenu_default,
425
+ {
426
+ trigger: /* @__PURE__ */ React5.createElement("div", { className: "w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React5.createElement("span", { className: "text-xl" }, "\u{1F50D}")),
427
+ menu: /* @__PURE__ */ React5.createElement("div", { className: "w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4" }, /* @__PURE__ */ React5.createElement("h3", { className: "text-sm font-bold text-gray-900 mb-3" }, "\u5FEB\u901F\u641C\u7D22"), /* @__PURE__ */ React5.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React5.createElement(
428
+ "input",
429
+ {
430
+ type: "text",
431
+ placeholder: "\u8F93\u5165\u5173\u952E\u5B57...",
432
+ className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none"
433
+ }
434
+ ), /* @__PURE__ */ React5.createElement("button", { className: "w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors" }, "\u641C\u7D22"))),
435
+ initialPosition: { x: windowWidth - 100, y: 100 }
436
+ }
437
+ ));
438
+ };
439
+ var FloatingMenuExample_default = FloatingMenuExample;
440
+
441
+ export { FloatingMenuExample_default, FloatingMenu_default, NavigationItem_default, NavigationToggle_default, Navigation_default };
442
+ //# sourceMappingURL=chunk-2PS5PIXV.mjs.map
443
+ //# sourceMappingURL=chunk-2PS5PIXV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/navigation/NavigationItem.tsx","../src/navigation/Navigation.tsx","../src/navigation/NavigationToggle.tsx","../src/navigation/FloatingMenu.tsx","../src/navigation/FloatingMenuExample.tsx"],"names":["React","clsx","useState","useEffect"],"mappings":";;;;;AAaA,IAAM,0BAAyD,CAAC;AAAA,EAC9D,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOpB,IAAA,MAAM,gBAAA,GAAmB,SAAA,KAAc,UAAA,GACnC,gCAAA,GACA,0BAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,QAAA,GACjB,kCAAA,GACA,IAAA,CAAK,aACH,iFAAA,GACA,oDAAA;AAEN,IAAA,OAAQ,WAAA,GAAe,GAAA,GAAO,gBAAA,GAAoB,GAAA,GAAO,YAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,uBACEA,MAAA,CAAA,aAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAA,EAAK,IAAA,CAAK,UAAA,GAAa,qBAAA,GAAwB,MAAA;AAAA,MAC/C,WAAW,cAAA;AAAe,KAAA;AAAA,IAGzB,KAAK,IAAA,oBACJA,MAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAA,EACb,KAAK,IACR,CAAA;AAAA,oBAIFA,MAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,SAAA,KAAc,UAAA,GAAa,SAAA,GAAY,SAAS,CAAA,EAAA,EAClF,IAAA,CAAK,KACR,CAAA;AAAA,IAGC,KAAK,UAAA,oBACJA,MAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,+DAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAQ;AAAA,OAAA;AAAA,sBAERA,MAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,CAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ,KACF;AAAA,IAID,cAAc,UAAA,IAAc,QAAA,oBAC3BA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kFAAA,EAAmF;AAAA,GAEtG;AAEJ,CAAA;AAEA,IAAO,sBAAA,GAAQ;ACnFf,IAAM,aAAwC,CAAC;AAAA,EAC7C,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,MAAK,GAAI,MAAA;AAGrD,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AASpB,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,MAAM,eAAA,GAAkB,6BAAA;AACxB,MAAA,MAAM,eAAA,GAAkB,aAAa,MAAA,GACjC,eAAA,IAAmB,SAAS,eAAA,GAAkB,mBAAA,CAAA,GAC9C,gBAAA,IAAoB,MAAA,GAAS,eAAA,GAAkB,kBAAA,CAAA;AAEnD,MAAA,OAAQ,WAAA,GAAe,GAAA,GAAO,eAAA,GAAmB,GAAA,GAAO,eAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,iBAAA,GAAoB,+BAAA;AAC1B,MAAA,MAAM,eAAA,GAAkB,aAAa,KAAA,GACjC,uBAAA,IAA2B,SAAS,eAAA,GAAkB,mBAAA,CAAA,GACtD,0BAAA,IAA8B,MAAA,GAAS,eAAA,GAAkB,kBAAA,CAAA;AAE7D,MAAA,OAAQ,WAAA,GAAe,GAAA,GAAO,iBAAA,GAAqB,GAAA,GAAO,eAAA;AAAA,IAC5D;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,OAAO,0BAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,+CAAA;AAAA,IACT;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,OAAO,iDAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,yBAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAc;AAErC,IAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEpC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA;AAC/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,cAAA,CAAe,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,QAAA,CAAS,OAAO,IAAA,CAAK,IAAA;AAAA,IAC9B;AAGA,IAAA,WAAA,GAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,KAAK,mBAAA,EAAoB,EAAG,SAAS,CAAA,EAAA,kBACnDD,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAW,iBAAA,EAAkB,EAAA,EAE/B,IAAA,oBACCA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,MACjB,SAAA,EAAU;AAAA;AAAA,GAEd,GAID,SAAA,KAAc,UAAA,oBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,CAAA,kBAItCA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAA,EAAoB,EAAA,EACjC,MAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,MAAAA,CAAA,aAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,KAAK,IAAA,CAAK,EAAA;AAAA,MACV,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,iBAAiB,IAAA,CAAK,EAAA;AAAA,MAChC,OAAA,EAAS;AAAA;AAAA,GAEZ,CACH,CAAA,EAGC,MAAA,IAAU,SAAA,KAAc,UAAA,oBACvBA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,GAAA,EAAK,OAAO,GAAA,IAAO,QAAA;AAAA,MACnB,SAAA,EAAU;AAAA;AAAA,GAEd,CAAA,EAID,MAAA,IAAU,SAAA,KAAc,YAAA,oBACvBA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,GAAA,EAAK,OAAO,GAAA,IAAO,QAAA;AAAA,MACnB,SAAA,EAAU;AAAA;AAAA,GAEd,CAEJ,CACF,CAAA;AAEJ,CAAA;AAEA,IAAO,kBAAA,GAAQ;AClIf,IAAM,mBAAoD,CAAC;AAAA,EACzD,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,KAAA;AACH,QAAA,OAAO,cAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,iBAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,cAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT;AACE,QAAA,OAAO,cAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA;AAAA,QACT,OAAA;AAAA,QACA,kBAAA,EAAmB;AAAA,QACnB;AAAA,OACF;AAAA,MACA,YAAA,EAAY,SAAS,gCAAA,GAAU;AAAA,KAAA;AAAA,oBAE/BD,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,IAAAA;AAAA,UACT,4FAAA;AAAA,UACA,SAAS,2BAAA,GAA8B;AAAA;AACzC;AAAA,KACF,kBACAD,MAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,IAAAA;AAAA,UACT,iGAAA;AAAA,UACA,SAAS,mBAAA,GAAsB;AAAA;AACjC;AAAA,KACF,kBACAD,MAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,IAAAA;AAAA,UACT,iGAAA;AAAA,UACA,SAAS,6BAAA,GAAgC;AAAA;AAC3C;AAAA,KAEJ;AAAA,GACF;AAEJ,CAAA;AAEA,IAAO,wBAAA,GAAQ;AClBf,IAAM,eAA4C,CAAC;AAAA,EACjD,OAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA,GAAkB,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,EACjC,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA,GAAgB,EAAA;AAAA,EAChB,gBAAA,GAAmB,EAAA;AAAA,EACnB,MAAA,GAAS;AACX,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,eAAe,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,WAAW,CAAA;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAA2B,OAAO,CAAA;AAC5E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,OAAsB,IAAI,CAAA;AAE/C,EAAA,MAAM,eAAA,GAAkB,OAAwC,IAAI,CAAA;AAGpE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,OAAO,MAAM,WAAW,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,CAAa,OAAA,EAAS;AAEvC,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,qBAAA,EAAsB;AACzD,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,cAAc,MAAA,CAAO,UAAA;AAC3B,MAAA,MAAM,cAAc,WAAA,GAAc,CAAA;AAGlC,MAAA,gBAAA,CAAiB,IAAA,CAAK,IAAA,GAAO,WAAA,GAAc,OAAA,GAAU,MAAM,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,mBAAA,EAAoB;AAGpB,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,mBAAmB,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,mBAAmB,CAAA;AAErD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,mBAAmB,CAAA;AACxD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,mBAAmB,CAAA;AAAA,IAC1D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAwB;AAC/C,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAG3B,IAAA,CAAA,CAAE,eAAA,EAAgB;AAGlB,IAAA,eAAA,CAAgB,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAEvD,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,qBAAA,EAAsB;AACxD,IAAA,aAAA,CAAc;AAAA,MACZ,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,MACpB,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK;AAAA,KACrB,CAAA;AAGD,IAAA,aAAA,CAAc,KAAK,CAAA;AAGnB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AAEzC,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,OAAA,GAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzD,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,OAAA,GAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAGzD,QAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG;AACpB,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QACpB;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,CAAA;AAEpC,MAAA,MAAM,cAAc,MAAA,CAAO,UAAA;AAC3B,MAAA,MAAM,eAAe,MAAA,CAAO,WAAA;AAE5B,MAAA,WAAA,CAAY;AAAA,QACV,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,EAAM,CAAC,CAAA,EAAG,WAAA,GAAc,EAAE,CAAA;AAAA,QAC/C,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,EAAM,CAAC,CAAA,EAAG,YAAA,GAAe,EAAE;AAAA,OACjD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,aAAA,CAAc,KAAK,CAAA;AAGnB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAG1B,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAA,CAAO,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,MAC1C;AAEA,MAAA,YAAA,CAAa,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AAC7C,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA,MACrB,GAAG,GAAG,CAAA;AAAA,IACR,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAElD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAG3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAA,CAAO,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,CAAA,CAAE,eAAA,EAAgB;AAGlB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,EAC3B,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAC5E,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAEzD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,MAAM,cAAc,MAAA,CAAO,UAAA;AAC3B,MAAA,MAAM,eAAe,MAAA,CAAO,WAAA;AAG5B,MAAA,WAAA,CAAY,CAAA,IAAA,KAAQ;AAClB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,CAAC,CAAA,EAAG,WAAA,GAAc,EAAE,CAAA;AAC3D,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,CAAC,CAAA,EAAG,YAAA,GAAe,EAAE,CAAA;AAG5D,QAAA,IAAI,IAAA,KAAS,IAAA,CAAK,CAAA,IAAK,IAAA,KAAS,KAAK,CAAA,EAAG;AACtC,UAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,QAC5B;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,eAAe,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,eAAe,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,OAAO,YAAA;AAAA,oBACLD,MAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAWC,IAAAA,CAAK,8BAAA,EAAgC,SAAS,CAAA;AAAA,QACzD,KAAA,EAAO;AAAA,UACL,IAAA,EAAO,SAAS,CAAA,GAAK,IAAA;AAAA,UACrB,GAAA,EAAM,SAAS,CAAA,GAAK,IAAA;AAAA,UACpB;AAAA;AACF,OAAA;AAAA,sBAGAD,MAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWC,IAAAA;AAAA,YACT,2MAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,WAAA,EAAa,eAAA;AAAA,UACb,OAAA,EAAS;AAAA,SAAA;AAAA,QAER;AAAA,OACH;AAAA,MAGC,UAAA,oBACCD,MAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWC,IAAAA;AAAA,YACT,oIAAA;AAAA,YACA,aAAa,uBAAA,GAA0B,oBAAA;AAAA,YACvC,aAAA,KAAkB,SAAS,yBAAA,GAA4B,wBAAA;AAAA,YACvD;AAAA,WACF;AAAA,UACA,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAClC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACtC,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACpC,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACvC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACtC,UAAA,EAAY,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACrC,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UACxC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA;AAAgB,SAAA;AAAA,QAErC;AAAA;AACH,KAEJ;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF,CAAA;AAEA,IAAO,oBAAA,GAAQ;ACtSR,IAAM,sBAAgC,MAAM;AACjD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAAS,CAAC,CAAA;AAEhD,EAAAC,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAO,UAAU,CAAA;AAChC,IAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAC3D,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAA,EAAM,MAAM,WAAA,EAAK;AAAA,IACjC,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAA,EAAM,MAAM,cAAA,EAAK;AAAA,IACjC,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAA,EAAM,MAAM,WAAA,EAAK;AAAA,IACjC,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAA,EAAM,MAAM,QAAA,EAAI;AAAA,IAChC,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,cAAA,EAAM,MAAM,WAAA;AAAK,GACnC;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,EAAA,KAAe;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAc,EAAG,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACEH,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAA,EAAwC,sCAAM,CAAA,kBAC5DA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAA,EAAqC,qKAAA,kBACpBA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAAA,EAA0B,0BAAI,CAAA,EAAO,iCACnF,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAA,kBACXA,MAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,IAAA,EAAO,gCAAK,CAAA,EAAS,uLACxB,CACF,CACF,CAAA,kBAEAA,MAAAA,CAAA,aAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,OAAA,kBACEA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yGAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAA,EAAU,QAAC,CAC7B,CAAA;AAAA,MAEF,IAAA,kBACEA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2EAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iCAAA,EAAA,EAAkC,0BAAI,CACtD,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,MAAA,EAAA,EACX,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,qBACbA,MAAAA,CAAA,aAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,KAAK,IAAA,CAAK,EAAA;AAAA,UACV,SAAA,EAAU,iIAAA;AAAA,UACV,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAA,CAAK,EAAE;AAAA,SAAA;AAAA,wBAE1CA,MAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAA,EAAW,KAAK,IAAK,CAAA;AAAA,wBACrCA,MAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAA,EAAe,KAAK,KAAM;AAAA,OAE7C,CACH,CACF,CAAA;AAAA,MAEF,eAAA,EAAiB,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA;AAAI;AAAA,GACpC,EAEC,WAAA,GAAc,CAAA,oBACbA,MAAAA,CAAA,aAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,OAAA,kBACEA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2GAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAA,EAAU,WAAE,CAC9B,CAAA;AAAA,MAEF,IAAA,kBACEA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+DAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,sCAAA,EAAA,EAAuC,0BAAI,mBACzDA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,mCAAA;AAAA,UACZ,SAAA,EAAU;AAAA;AAAA,OACZ,kBACAA,MAAAA,CAAA,aAAA,CAAC,YAAO,SAAA,EAAU,2GAAA,EAAA,EAA4G,cAE9H,CACF,CACF,CAAA;AAAA,MAEF,iBAAiB,EAAE,CAAA,EAAG,WAAA,GAAc,GAAA,EAAK,GAAG,GAAA;AAAI;AAAA,GAGtD,CAAA;AAEJ,CAAA;AAEA,IAAO,2BAAA,GAAQ","file":"chunk-2PS5PIXV.mjs","sourcesContent":[" 'use client';\n\nimport React from 'react';\nimport { NavigationItem, NavigationDirection } from './types';\nimport { clsx } from 'clsx';\n\ninterface NavigationItemProps {\n item: NavigationItem;\n direction: NavigationDirection;\n isActive?: boolean;\n onClick: (item: NavigationItem) => void;\n}\n\nconst NavigationItemComponent: React.FC<NavigationItemProps> = ({\n item,\n direction,\n isActive,\n onClick\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick(item);\n };\n\n const getItemClasses = () => {\n const baseClasses = `\n group relative flex items-center gap-3\n transition-all duration-300 ease-in-out\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n rounded-lg\n `;\n\n const directionClasses = direction === 'vertical'\n ? 'px-4 py-3 w-full justify-start'\n : 'px-3 py-2 justify-center';\n\n const stateClasses = isActive\n ? 'bg-blue-500 text-white shadow-lg'\n : item.isExternal\n ? 'text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200'\n : 'text-gray-700 hover:bg-blue-50 hover:text-blue-600';\n\n return (baseClasses) + ' ' + (directionClasses) + ' ' + (stateClasses);\n };\n\n return (\n <a\n href={item.href}\n onClick={handleClick}\n target={item.target}\n rel={item.isExternal ? 'noopener noreferrer' : undefined}\n className={getItemClasses()}\n >\n {/* 图标 */}\n {item.icon && (\n <span className=\"flex-shrink-0\">\n {item.icon}\n </span>\n )}\n\n {/* 标签 */}\n <span className={clsx('font-medium', direction === 'vertical' ? 'text-sm' : 'text-xs')}>\n {item.label}\n </span>\n\n {/* 外链图标 */}\n {item.isExternal && (\n <svg\n className=\"w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n\n {/* 活动状态指示器 */}\n {direction === 'vertical' && isActive && (\n <div className=\"absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full\" />\n )}\n </a>\n );\n};\n\nexport default NavigationItemComponent;"," 'use client';\n\nimport React from 'react';\nimport NavigationItem from './NavigationItem';\nimport { NavigationProps } from './types';\nimport { clsx } from 'clsx';\n\nconst Navigation: React.FC<NavigationProps> = ({\n config,\n isOpen,\n activeItemId,\n onItemClick,\n className = ''\n}) => {\n const { direction, position, items, avatar, logo } = config;\n\n // 获取导航栏位置和尺寸样式\n const getContainerClasses = () => {\n const baseClasses = `\n fixed z-[90]\n bg-white/95 backdrop-blur-lg\n border border-gray-200/50\n shadow-2xl\n transition-all duration-500 ease-in-out\n `;\n\n // 根据方向和位置确定样式\n if (direction === 'vertical') {\n const verticalClasses = 'h-screen w-64 flex flex-col';\n const positionClasses = position === 'left' \n ? 'left-0 top-0 ' + (isOpen ? 'translate-x-0' : '-translate-x-full')\n : 'right-0 top-0 ' + (isOpen ? 'translate-x-0' : 'translate-x-full');\n \n return (baseClasses) + ' ' + (verticalClasses) + ' ' + (positionClasses);\n } else {\n const horizontalClasses = 'w-full h-16 flex items-center';\n const positionClasses = position === 'top'\n ? 'top-0 left-0 right-0 ' + (isOpen ? 'translate-y-0' : '-translate-y-full')\n : 'bottom-0 left-0 right-0 ' + (isOpen ? 'translate-y-0' : 'translate-y-full');\n \n return (baseClasses) + ' ' + (horizontalClasses) + ' ' + (positionClasses);\n }\n };\n\n // 获取内容布局样式\n const getContentClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col h-full p-4';\n } else {\n return 'flex items-center justify-between w-full px-6';\n }\n };\n\n // 获取导航项列表样式\n const getItemsListClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col gap-2 flex-1 overflow-y-auto mt-4';\n } else {\n return 'flex items-center gap-4';\n }\n };\n\n const handleItemClick = (item: any) => {\n // 处理页面跳转\n if (item.isExternal) {\n // 外链跳转\n window.open(item.href, item.target || '_blank');\n } else if (item.href.startsWith('#')) {\n // 锚点跳转\n const element = document.getElementById(item.id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n } else {\n // 内部页面跳转\n window.location.href = item.href;\n }\n\n // 触发回调\n onItemClick?.(item);\n };\n\n if (!isOpen) return null;\n\n return (\n <nav className={clsx(getContainerClasses(), className)}>\n <div className={getContentClasses()}>\n {/* Logo 区域 */}\n {logo && (\n <div className=\"flex items-center justify-center mb-4\">\n <img\n src={logo.src}\n alt={logo.alt || 'Logo'}\n className=\"h-8 w-auto\"\n />\n </div>\n )}\n\n {/* 顶部空间占位(为切换按钮预留) */}\n {direction === 'vertical' && (\n <div className=\"h-12 flex-shrink-0\" />\n )}\n\n {/* 导航项列表 */}\n <div className={getItemsListClasses()}>\n {items.map((item) => (\n <NavigationItem\n key={item.id}\n item={item}\n direction={direction}\n isActive={activeItemId === item.id}\n onClick={handleItemClick}\n />\n ))}\n </div>\n\n {/* 头像区域 */}\n {avatar && direction === 'vertical' && (\n <div className=\"flex items-center justify-center mt-auto pt-4\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-10 h-10 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n\n {/* 水平布局的头像 */}\n {avatar && direction === 'horizontal' && (\n <div className=\"flex items-center\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-8 h-8 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n </div>\n </nav>\n );\n};\n\nexport default Navigation;"," 'use client';\n\nimport React from 'react';\nimport { NavigationPosition } from './types';\nimport { clsx } from 'clsx';\n\ninterface NavigationToggleProps {\n isOpen: boolean;\n onClick: () => void;\n position: NavigationPosition;\n}\n\nconst NavigationToggle: React.FC<NavigationToggleProps> = ({\n isOpen,\n onClick,\n position\n}) => {\n const getPositionClasses = () => {\n switch (position) {\n case 'top':\n return 'top-4 left-4';\n case 'bottom':\n return 'bottom-4 left-4';\n case 'left':\n return 'top-4 left-4';\n case 'right':\n return 'top-4 right-4';\n default:\n return 'top-4 left-4';\n }\n };\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'fixed',\n getPositionClasses(),\n 'z-[100] p-3 rounded-xl bg-white/90 backdrop-blur-md shadow-lg hover:shadow-xl border border-gray-200/50 transition-all duration-300 ease-in-out hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50'\n )}\n aria-label={isOpen ? '关闭导航栏' : '打开导航栏'}\n >\n <div className=\"w-5 h-5 flex flex-col justify-center items-center\">\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out',\n isOpen ? 'rotate-45 translate-y-0.5' : ''\n )}\n />\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1',\n isOpen ? 'opacity-0 scale-0' : 'opacity-100 scale-100'\n )}\n />\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1',\n isOpen ? '-rotate-45 -translate-y-2.5' : ''\n )}\n />\n </div>\n </button>\n );\n};\n\nexport default NavigationToggle;","'use client';\n\nimport React, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clsx } from 'clsx';\n\nexport interface FloatingMenuProps {\n /**\n * 触发按钮的内容\n */\n trigger: ReactNode;\n \n /**\n * 菜单内容\n */\n menu: ReactNode;\n \n /**\n * 初始位置\n */\n initialPosition?: { x: number; y: number };\n \n /**\n * 是否默认打开菜单\n */\n defaultOpen?: boolean;\n \n /**\n * 自定义类名\n */\n className?: string;\n \n /**\n * 菜单类名\n */\n menuClassName?: string;\n \n /**\n * 触发器类名\n */\n triggerClassName?: string;\n \n /**\n * z-index\n */\n zIndex?: number;\n}\n\nconst FloatingMenu: React.FC<FloatingMenuProps> = ({\n trigger,\n menu,\n initialPosition = { x: 20, y: 20 },\n defaultOpen = false,\n className = '',\n menuClassName = '',\n triggerClassName = '',\n zIndex = 1000,\n}) => {\n const [position, setPosition] = useState(initialPosition);\n const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);\n const [menuDirection, setMenuDirection] = useState<'left' | 'right'>('right');\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const [mounted, setMounted] = useState(false);\n // 添加一个标志,用于跟踪是否发生了拖动\n const [hasDragged, setHasDragged] = useState(false);\n // 添加一个计时器引用,用于区分点击和拖动\n const dragTimerRef = useRef<number | null>(null);\n // 添加一个引用,记录鼠标按下的初始位置\n const mouseDownPosRef = useRef<{ x: number, y: number } | null>(null);\n\n // 客户端挂载检查\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // 计算菜单方向\n useEffect(() => {\n if (!mounted || !containerRef.current) return;\n \n const updateMenuDirection = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n \n const windowWidth = window.innerWidth;\n const middlePoint = windowWidth / 2;\n \n // 如果悬浮窗在屏幕左半部分,菜单向右展开;否则向左展开\n setMenuDirection(rect.left < middlePoint ? 'right' : 'left');\n };\n \n updateMenuDirection();\n \n // 监听窗口大小变化和滚动事件\n window.addEventListener('resize', updateMenuDirection);\n window.addEventListener('scroll', updateMenuDirection);\n \n return () => {\n window.removeEventListener('resize', updateMenuDirection);\n window.removeEventListener('scroll', updateMenuDirection);\n };\n }, [mounted]);\n\n // 处理拖动开始\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n \n // 防止触发菜单点击\n e.stopPropagation();\n \n // 记录鼠标按下的初始位置\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n \n const rect = containerRef.current.getBoundingClientRect();\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n });\n \n // 重置拖动标志\n setHasDragged(false);\n \n // 设置拖动状态\n setIsDragging(true);\n };\n\n // 处理拖动过程\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 检查是否移动了足够的距离来认为是拖动\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过阈值,标记为拖动\n if (dx > 3 || dy > 3) {\n setHasDragged(true);\n }\n }\n \n // 计算新位置并应用边界检查\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n \n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n setPosition({\n x: Math.min(Math.max(newX, 0), windowWidth - 50),\n y: Math.min(Math.max(newY, 0), windowHeight - 50)\n });\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n \n // 重置鼠标按下位置\n mouseDownPosRef.current = null;\n \n // 设置一个短暂的延时,防止拖动后立即触发点击\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n \n dragTimerRef.current = window.setTimeout(() => {\n setHasDragged(false);\n }, 300); // 300ms 后重置拖动状态\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, dragOffset]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n };\n }, []);\n\n // 切换菜单开关\n const toggleMenu = (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // 如果刚刚拖动过,不触发菜单切换\n if (hasDragged) {\n return;\n }\n \n setIsMenuOpen(!isMenuOpen);\n };\n\n // 关闭菜单的点击外部处理\n useEffect(() => {\n if (!isMenuOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isMenuOpen]);\n\n // 窗口大小变化时的边界检查\n useEffect(() => {\n if (!mounted) return;\n \n const checkBoundaries = () => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n // 确保悬浮窗不会被拖出屏幕\n setPosition(prev => {\n const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);\n const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);\n \n // 只有在实际需要调整时才更新位置\n if (newX !== prev.x || newY !== prev.y) {\n return { x: newX, y: newY };\n }\n return prev;\n });\n };\n \n // 只在窗口大小变化时检查边界\n window.addEventListener('resize', checkBoundaries);\n \n return () => {\n window.removeEventListener('resize', checkBoundaries);\n };\n }, [mounted]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n ref={containerRef}\n className={clsx('fixed select-none box-border', className)}\n style={{\n left: (position.x) + 'px',\n top: (position.y) + 'px',\n zIndex,\n }}\n >\n {/* 触发器按钮 */}\n <div \n className={clsx(\n 'flex items-center justify-center w-12 h-12 md:w-12 md:h-12 bg-white rounded-full shadow-md hover:shadow-lg cursor-grab active:cursor-grabbing transition-all duration-200 hover:scale-105 active:scale-95',\n triggerClassName\n )}\n onMouseDown={handleMouseDown}\n onClick={toggleMenu}\n >\n {trigger}\n </div>\n \n {/* 菜单内容 */}\n {isMenuOpen && (\n <div \n className={clsx(\n 'absolute top-0 bg-white rounded-lg shadow-xl p-3 min-w-[200px] md:min-w-[200px] max-w-[300px] z-[1000] transition-all duration-200',\n isMenuOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-95',\n menuDirection === 'left' ? 'right-[calc(100%+10px)]' : 'left-[calc(100%+10px)]',\n menuClassName\n )}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchMove={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n >\n {menu}\n </div>\n )}\n </div>,\n document.body\n );\n};\n\nexport default FloatingMenu;","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport FloatingMenu from './FloatingMenu';\n\nexport const FloatingMenuExample: React.FC = () => {\n const [windowWidth, setWindowWidth] = useState(0);\n \n useEffect(() => {\n setWindowWidth(window.innerWidth);\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const menuItems = [\n { id: 1, label: '首页', icon: '🏠' },\n { id: 2, label: '设置', icon: '⚙️' },\n { id: 3, label: '消息', icon: '📩' },\n { id: 4, label: '帮助', icon: '❓' },\n { id: 5, label: '退出', icon: '🚪' },\n ];\n \n const handleMenuItemClick = (id: number) => {\n console.log('点击了菜单项: ' + (id));\n };\n \n return (\n <div className=\"w-full h-screen bg-gray-100 relative p-8\">\n <div className=\"max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12\">\n <h1 className=\"text-3xl font-bold mb-4 text-gray-900\">悬浮菜单示例</h1>\n <p className=\"text-gray-600 leading-relaxed mb-6\">\n 这是一个可拖拽的悬浮菜单组件示例。你可以尝试拖动下方的 <span className=\"font-bold text-blue-600\">蓝色按钮</span> 到处移动。\n </p>\n <div className=\"bg-blue-50 border-l-4 border-blue-500 p-4 mb-6\">\n <p className=\"text-sm text-blue-700\">\n <strong>智能定位:</strong> 菜单会根据按钮在屏幕上的位置自动调整弹出方向(向左或向右)。\n </p>\n </div>\n </div>\n \n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">➕</span>\n </div>\n }\n menu={\n <div className=\"w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden\">\n <div className=\"px-4 py-3 border-b border-gray-100\">\n <h3 className=\"text-sm font-bold text-gray-900\">快捷菜单</h3>\n </div>\n <ul className=\"py-1\">\n {menuItems.map(item => (\n <li \n key={item.id} \n className=\"flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm\"\n onClick={() => handleMenuItemClick(item.id)}\n >\n <span className=\"text-lg\">{item.icon}</span>\n <span className=\"font-medium\">{item.label}</span>\n </li>\n ))}\n </ul>\n </div>\n }\n initialPosition={{ x: 100, y: 100 }}\n />\n \n {windowWidth > 0 && (\n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">🔍</span>\n </div>\n }\n menu={\n <div className=\"w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4\">\n <h3 className=\"text-sm font-bold text-gray-900 mb-3\">快速搜索</h3>\n <div className=\"space-y-3\">\n <input \n type=\"text\" \n placeholder=\"输入关键字...\" \n className=\"w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none\"\n />\n <button className=\"w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors\">\n 搜索\n </button>\n </div>\n </div>\n }\n initialPosition={{ x: windowWidth - 100, y: 100 }}\n />\n )}\n </div>\n );\n};\n\nexport default FloatingMenuExample;\n\n"]}