nfx-ui 0.16.2 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (935) hide show
  1. package/README.md +67 -271
  2. package/dist/animations.cjs +1 -2
  3. package/dist/animations.mjs +9 -9
  4. package/dist/apis.cjs +0 -1
  5. package/dist/apis.cjs.map +1 -1
  6. package/dist/apis.mjs +0 -1
  7. package/dist/apis.mjs.map +1 -1
  8. package/dist/chunk-LucideIcon-Chc7x8mN.mjs +15 -0
  9. package/dist/chunk-LucideIcon-Chc7x8mN.mjs.map +1 -0
  10. package/dist/chunk-LucideIcon-CuoAB_OX.cjs +3 -0
  11. package/dist/chunk-LucideIcon-CuoAB_OX.cjs.map +1 -0
  12. package/dist/chunk-ModalProvider-BgLSJXhS.cjs +3 -0
  13. package/dist/chunk-ModalProvider-BgLSJXhS.cjs.map +1 -0
  14. package/dist/chunk-ModalProvider-CpzFzfWG.mjs +220 -0
  15. package/dist/chunk-ModalProvider-CpzFzfWG.mjs.map +1 -0
  16. package/dist/chunk-PixelBlast-BbJ2VmCL.cjs +190 -0
  17. package/dist/chunk-PixelBlast-BbJ2VmCL.cjs.map +1 -0
  18. package/dist/chunk-PixelBlast-BiBrG_NH.mjs +504 -0
  19. package/dist/chunk-PixelBlast-BiBrG_NH.mjs.map +1 -0
  20. package/dist/chunk-ThemeProvider-C4kxX2D0.cjs +3 -0
  21. package/dist/chunk-ThemeProvider-C4kxX2D0.cjs.map +1 -0
  22. package/dist/chunk-ThemeProvider-D0U8V6ky.mjs +28 -0
  23. package/dist/chunk-ThemeProvider-D0U8V6ky.mjs.map +1 -0
  24. package/dist/chunk-animations-CkOpTtX1.cjs +11 -0
  25. package/dist/chunk-animations-CkOpTtX1.cjs.map +1 -0
  26. package/dist/chunk-animations-DKyNVF-O.mjs +973 -0
  27. package/dist/chunk-animations-DKyNVF-O.mjs.map +1 -0
  28. package/dist/chunk-dashboard-BsGK96hu.mjs +104 -0
  29. package/dist/chunk-dashboard-BsGK96hu.mjs.map +1 -0
  30. package/dist/chunk-dashboard-CFT0HjSM.cjs +3 -0
  31. package/dist/chunk-dashboard-CFT0HjSM.cjs.map +1 -0
  32. package/dist/chunk-hooks-Cy_8mdDG.mjs +90 -0
  33. package/dist/chunk-hooks-Cy_8mdDG.mjs.map +1 -0
  34. package/dist/chunk-hooks-yVn82nBZ.cjs +3 -0
  35. package/dist/chunk-hooks-yVn82nBZ.cjs.map +1 -0
  36. package/dist/chunk-i18n-B8pZ_hpC.mjs +435 -0
  37. package/dist/chunk-i18n-B8pZ_hpC.mjs.map +1 -0
  38. package/dist/chunk-i18n-C06d89Eq.cjs +3 -0
  39. package/dist/chunk-i18n-C06d89Eq.cjs.map +1 -0
  40. package/dist/chunk-layout-BDpxG0Ca.mjs +27 -0
  41. package/dist/chunk-layout-BDpxG0Ca.mjs.map +1 -0
  42. package/dist/chunk-layout-DKCQHheg.cjs +3 -0
  43. package/dist/chunk-layout-DKCQHheg.cjs.map +1 -0
  44. package/dist/chunk-lucide-CrMbx2vC.cjs +3 -0
  45. package/dist/chunk-lucide-CrMbx2vC.cjs.map +1 -0
  46. package/dist/chunk-lucide-yNs0iz1-.mjs +158 -0
  47. package/dist/chunk-lucide-yNs0iz1-.mjs.map +1 -0
  48. package/dist/chunk-modal-C3LgRLur.cjs +3 -0
  49. package/dist/chunk-modal-C3LgRLur.cjs.map +1 -0
  50. package/dist/chunk-modal-D9vk2ENf.mjs +92 -0
  51. package/dist/chunk-modal-D9vk2ENf.mjs.map +1 -0
  52. package/dist/chunk-preference-BP-GO9Uk.cjs +3 -0
  53. package/dist/chunk-preference-BP-GO9Uk.cjs.map +1 -0
  54. package/dist/chunk-preference-BXXryZLY.cjs +3 -0
  55. package/dist/chunk-preference-BXXryZLY.cjs.map +1 -0
  56. package/dist/chunk-preference-Y15HwKd0.mjs +42 -0
  57. package/dist/chunk-preference-Y15HwKd0.mjs.map +1 -0
  58. package/dist/chunk-preference-x4EdmqU6.mjs +295 -0
  59. package/dist/chunk-preference-x4EdmqU6.mjs.map +1 -0
  60. package/dist/chunk-rolldown-runtime-Bvb_CV3F.cjs +1 -0
  61. package/dist/chunk-useLanguageLabel-38sEu2rP.cjs +3 -0
  62. package/dist/chunk-useLanguageLabel-38sEu2rP.cjs.map +1 -0
  63. package/dist/chunk-useLanguageLabel-BLdxHuep.mjs +38 -0
  64. package/dist/chunk-useLanguageLabel-BLdxHuep.mjs.map +1 -0
  65. package/dist/chunk-useLayout-CbUZVWpS.cjs +3 -0
  66. package/dist/chunk-useLayout-CbUZVWpS.cjs.map +1 -0
  67. package/dist/chunk-useLayout-CjXHRPLD.mjs +302 -0
  68. package/dist/chunk-useLayout-CjXHRPLD.mjs.map +1 -0
  69. package/dist/chunk-useTheme-C2Ip6OAs.mjs +34 -0
  70. package/dist/chunk-useTheme-C2Ip6OAs.mjs.map +1 -0
  71. package/dist/chunk-useTheme-DSps5NbC.cjs +3 -0
  72. package/dist/chunk-useTheme-DSps5NbC.cjs.map +1 -0
  73. package/dist/components.cjs +3 -3
  74. package/dist/components.cjs.map +1 -1
  75. package/dist/components.mjs +1122 -1472
  76. package/dist/components.mjs.map +1 -1
  77. package/dist/constants.cjs +0 -1
  78. package/dist/constants.cjs.map +1 -1
  79. package/dist/constants.mjs +0 -1
  80. package/dist/constants.mjs.map +1 -1
  81. package/dist/enums.cjs +1 -0
  82. package/dist/enums.mjs +43 -0
  83. package/dist/events.cjs +0 -1
  84. package/dist/events.cjs.map +1 -1
  85. package/dist/events.mjs +0 -1
  86. package/dist/events.mjs.map +1 -1
  87. package/dist/hooks.cjs +1 -4
  88. package/dist/hooks.mjs +12 -104
  89. package/dist/icons.cjs +3 -2
  90. package/dist/icons.cjs.map +1 -0
  91. package/dist/icons.mjs +19350 -73
  92. package/dist/icons.mjs.map +1 -0
  93. package/dist/languages.cjs +1 -2
  94. package/dist/languages.cjs.map +1 -1
  95. package/dist/languages.mjs +63 -76
  96. package/dist/languages.mjs.map +1 -1
  97. package/dist/layouts.cjs +2 -2
  98. package/dist/layouts.cjs.map +1 -1
  99. package/dist/layouts.mjs +787 -395
  100. package/dist/layouts.mjs.map +1 -1
  101. package/dist/navigations.cjs +0 -1
  102. package/dist/navigations.cjs.map +1 -1
  103. package/dist/navigations.mjs +0 -1
  104. package/dist/navigations.mjs.map +1 -1
  105. package/dist/pixel-blast.cjs +1 -191
  106. package/dist/pixel-blast.mjs +2 -503
  107. package/dist/providers.cjs +4 -0
  108. package/dist/providers.cjs.map +1 -0
  109. package/dist/providers.mjs +37 -0
  110. package/dist/providers.mjs.map +1 -0
  111. package/dist/services.cjs +0 -1
  112. package/dist/services.cjs.map +1 -1
  113. package/dist/services.mjs +0 -1
  114. package/dist/services.mjs.map +1 -1
  115. package/dist/src/designs/animations/index.d.ts +1 -0
  116. package/dist/src/designs/animations/index.d.ts.map +1 -1
  117. package/dist/src/designs/components/CardHeader.d.ts +9 -0
  118. package/dist/src/designs/components/CardHeader.d.ts.map +1 -0
  119. package/dist/src/designs/components/EmptyState/index.d.ts +10 -0
  120. package/dist/src/designs/components/EmptyState/index.d.ts.map +1 -0
  121. package/dist/src/designs/components/LayoutSwitcher/index.d.ts +1 -1
  122. package/dist/src/designs/components/LayoutSwitcher/index.d.ts.map +1 -1
  123. package/dist/src/designs/components/Logo/index.d.ts +15 -0
  124. package/dist/src/designs/components/Logo/index.d.ts.map +1 -0
  125. package/dist/src/designs/components/LucideIcon.d.ts +11 -0
  126. package/dist/src/designs/components/LucideIcon.d.ts.map +1 -0
  127. package/dist/src/designs/components/PageHeader/index.d.ts +11 -0
  128. package/dist/src/designs/components/PageHeader/index.d.ts.map +1 -0
  129. package/dist/src/designs/components/PreferencesPopover/index.d.ts +6 -0
  130. package/dist/src/designs/components/PreferencesPopover/index.d.ts.map +1 -0
  131. package/dist/src/designs/components/Suspense/index.d.ts +6 -60
  132. package/dist/src/designs/components/Suspense/index.d.ts.map +1 -1
  133. package/dist/src/designs/components/ThemeSettings/index.d.ts +2 -0
  134. package/dist/src/designs/components/ThemeSettings/index.d.ts.map +1 -0
  135. package/dist/src/designs/components/ThemeSwitcher/index.d.ts +1 -3
  136. package/dist/src/designs/components/ThemeSwitcher/index.d.ts.map +1 -1
  137. package/dist/src/designs/components/VirtuosoList.d.ts +37 -0
  138. package/dist/src/designs/components/VirtuosoList.d.ts.map +1 -0
  139. package/dist/src/designs/components/index.d.ts +19 -25
  140. package/dist/src/designs/components/index.d.ts.map +1 -1
  141. package/dist/src/designs/layouts/components/Background/index.d.ts +1 -1
  142. package/dist/src/designs/layouts/components/Background/index.d.ts.map +1 -1
  143. package/dist/src/designs/layouts/components/Header/index.d.ts +31 -3
  144. package/dist/src/designs/layouts/components/Header/index.d.ts.map +1 -1
  145. package/dist/src/designs/layouts/components/LayoutFrame/index.d.ts +1 -1
  146. package/dist/src/designs/layouts/components/LayoutFrame/index.d.ts.map +1 -1
  147. package/dist/src/designs/layouts/components/Main/index.d.ts +8 -0
  148. package/dist/src/designs/layouts/components/Main/index.d.ts.map +1 -0
  149. package/dist/src/designs/layouts/components/MainWrapper/index.d.ts +1 -1
  150. package/dist/src/designs/layouts/components/MainWrapper/index.d.ts.map +1 -1
  151. package/dist/src/designs/layouts/components/PageFrame/index.d.ts +10 -0
  152. package/dist/src/designs/layouts/components/PageFrame/index.d.ts.map +1 -0
  153. package/dist/src/designs/layouts/components/SideHideLayout/index.d.ts +1 -1
  154. package/dist/src/designs/layouts/components/SideHideLayout/index.d.ts.map +1 -1
  155. package/dist/src/designs/layouts/components/SideShowLayout/index.d.ts +1 -1
  156. package/dist/src/designs/layouts/components/SideShowLayout/index.d.ts.map +1 -1
  157. package/dist/src/designs/layouts/components/Sidebar/index.d.ts +74 -2
  158. package/dist/src/designs/layouts/components/Sidebar/index.d.ts.map +1 -1
  159. package/dist/src/designs/layouts/components/Sidebar/menu.d.ts +9 -0
  160. package/dist/src/designs/layouts/components/Sidebar/menu.d.ts.map +1 -0
  161. package/dist/src/designs/layouts/components/UserTopBar/index.d.ts +18 -0
  162. package/dist/src/designs/layouts/components/UserTopBar/index.d.ts.map +1 -0
  163. package/dist/src/designs/layouts/components/index.d.ts +9 -1
  164. package/dist/src/designs/layouts/components/index.d.ts.map +1 -1
  165. package/dist/src/designs/layouts/index.d.ts +2 -0
  166. package/dist/src/designs/layouts/index.d.ts.map +1 -1
  167. package/dist/src/designs/providers/ModalProvider/components/Base.d.ts +6 -0
  168. package/dist/src/designs/providers/ModalProvider/components/Base.d.ts.map +1 -0
  169. package/dist/src/designs/providers/ModalProvider/components/Confirm.d.ts +6 -0
  170. package/dist/src/designs/providers/ModalProvider/components/Confirm.d.ts.map +1 -0
  171. package/dist/src/designs/providers/ModalProvider/components/Loading.d.ts +6 -0
  172. package/dist/src/designs/providers/ModalProvider/components/Loading.d.ts.map +1 -0
  173. package/dist/src/designs/providers/ModalProvider/index.d.ts +10 -0
  174. package/dist/src/designs/providers/ModalProvider/index.d.ts.map +1 -0
  175. package/dist/src/{preference/constants.d.ts → enums/dashboard.d.ts} +4 -8
  176. package/dist/src/enums/dashboard.d.ts.map +1 -0
  177. package/dist/src/enums/index.d.ts +4 -0
  178. package/dist/src/enums/index.d.ts.map +1 -0
  179. package/dist/src/enums/language.d.ts +13 -0
  180. package/dist/src/enums/language.d.ts.map +1 -0
  181. package/dist/src/enums/theme.d.ts +107 -0
  182. package/dist/src/enums/theme.d.ts.map +1 -0
  183. package/dist/src/hooks/index.d.ts +2 -4
  184. package/dist/src/hooks/index.d.ts.map +1 -1
  185. package/dist/src/hooks/preference.d.ts +21 -0
  186. package/dist/src/hooks/preference.d.ts.map +1 -0
  187. package/dist/src/icons/animated/accessibility-icon.d.ts +13 -0
  188. package/dist/src/icons/animated/accessibility-icon.d.ts.map +1 -0
  189. package/dist/src/icons/animated/airplane-icon.d.ts +9 -0
  190. package/dist/src/icons/animated/airplane-icon.d.ts.map +1 -0
  191. package/dist/src/icons/animated/alarm-clock-plus-icon.d.ts +11 -0
  192. package/dist/src/icons/animated/alarm-clock-plus-icon.d.ts.map +1 -0
  193. package/dist/src/icons/animated/align-center-icon.d.ts +4 -0
  194. package/dist/src/icons/animated/align-center-icon.d.ts.map +1 -0
  195. package/dist/src/icons/animated/align-vertical-space-around-icon.d.ts +4 -0
  196. package/dist/src/icons/animated/align-vertical-space-around-icon.d.ts.map +1 -0
  197. package/dist/src/icons/animated/ambulance-icon.d.ts +4 -0
  198. package/dist/src/icons/animated/ambulance-icon.d.ts.map +1 -0
  199. package/dist/src/icons/animated/ampersand-icon.d.ts +4 -0
  200. package/dist/src/icons/animated/ampersand-icon.d.ts.map +1 -0
  201. package/dist/src/icons/animated/angry-icon.d.ts +4 -0
  202. package/dist/src/icons/animated/angry-icon.d.ts.map +1 -0
  203. package/dist/src/icons/animated/annoyed-icon.d.ts +4 -0
  204. package/dist/src/icons/animated/annoyed-icon.d.ts.map +1 -0
  205. package/dist/src/icons/animated/apple-brand-logo.d.ts +4 -0
  206. package/dist/src/icons/animated/apple-brand-logo.d.ts.map +1 -0
  207. package/dist/src/icons/animated/arrow-back-icon.d.ts +4 -0
  208. package/dist/src/icons/animated/arrow-back-icon.d.ts.map +1 -0
  209. package/dist/src/icons/animated/arrow-back-up-icon.d.ts +4 -0
  210. package/dist/src/icons/animated/arrow-back-up-icon.d.ts.map +1 -0
  211. package/dist/src/icons/animated/arrow-big-down-dash-icon.d.ts +4 -0
  212. package/dist/src/icons/animated/arrow-big-down-dash-icon.d.ts.map +1 -0
  213. package/dist/src/icons/animated/arrow-big-down-icon.d.ts +4 -0
  214. package/dist/src/icons/animated/arrow-big-down-icon.d.ts.map +1 -0
  215. package/dist/src/icons/animated/arrow-big-left-dash-icon.d.ts +4 -0
  216. package/dist/src/icons/animated/arrow-big-left-dash-icon.d.ts.map +1 -0
  217. package/dist/src/icons/animated/arrow-big-left-icon.d.ts +4 -0
  218. package/dist/src/icons/animated/arrow-big-left-icon.d.ts.map +1 -0
  219. package/dist/src/icons/animated/arrow-big-right-dash-icon.d.ts +4 -0
  220. package/dist/src/icons/animated/arrow-big-right-dash-icon.d.ts.map +1 -0
  221. package/dist/src/icons/animated/arrow-big-right-icon.d.ts +4 -0
  222. package/dist/src/icons/animated/arrow-big-right-icon.d.ts.map +1 -0
  223. package/dist/src/icons/animated/arrow-big-up-dash-icon.d.ts +4 -0
  224. package/dist/src/icons/animated/arrow-big-up-dash-icon.d.ts.map +1 -0
  225. package/dist/src/icons/animated/arrow-big-up-icon.d.ts +4 -0
  226. package/dist/src/icons/animated/arrow-big-up-icon.d.ts.map +1 -0
  227. package/dist/src/icons/animated/arrow-down-0-1-icon.d.ts +4 -0
  228. package/dist/src/icons/animated/arrow-down-0-1-icon.d.ts.map +1 -0
  229. package/dist/src/icons/animated/arrow-down-1-0-icon.d.ts +4 -0
  230. package/dist/src/icons/animated/arrow-down-1-0-icon.d.ts.map +1 -0
  231. package/dist/src/icons/animated/arrow-down-a-z-icon.d.ts +4 -0
  232. package/dist/src/icons/animated/arrow-down-a-z-icon.d.ts.map +1 -0
  233. package/dist/src/icons/animated/arrow-narrow-down-dashed-icon.d.ts +4 -0
  234. package/dist/src/icons/animated/arrow-narrow-down-dashed-icon.d.ts.map +1 -0
  235. package/dist/src/icons/animated/arrow-narrow-down-icon.d.ts +4 -0
  236. package/dist/src/icons/animated/arrow-narrow-down-icon.d.ts.map +1 -0
  237. package/dist/src/icons/animated/arrow-narrow-left-dashed-icon.d.ts +4 -0
  238. package/dist/src/icons/animated/arrow-narrow-left-dashed-icon.d.ts.map +1 -0
  239. package/dist/src/icons/animated/arrow-narrow-left-icon.d.ts +4 -0
  240. package/dist/src/icons/animated/arrow-narrow-left-icon.d.ts.map +1 -0
  241. package/dist/src/icons/animated/arrow-narrow-right-dashed-icon.d.ts +4 -0
  242. package/dist/src/icons/animated/arrow-narrow-right-dashed-icon.d.ts.map +1 -0
  243. package/dist/src/icons/animated/arrow-narrow-right-icon.d.ts +4 -0
  244. package/dist/src/icons/animated/arrow-narrow-right-icon.d.ts.map +1 -0
  245. package/dist/src/icons/animated/arrow-narrow-up-dashed-icon.d.ts +4 -0
  246. package/dist/src/icons/animated/arrow-narrow-up-dashed-icon.d.ts.map +1 -0
  247. package/dist/src/icons/animated/arrow-narrow-up-icon.d.ts +4 -0
  248. package/dist/src/icons/animated/arrow-narrow-up-icon.d.ts.map +1 -0
  249. package/dist/src/icons/animated/at-sign-icon.d.ts +4 -0
  250. package/dist/src/icons/animated/at-sign-icon.d.ts.map +1 -0
  251. package/dist/src/icons/animated/banana-icon.d.ts +4 -0
  252. package/dist/src/icons/animated/banana-icon.d.ts.map +1 -0
  253. package/dist/src/icons/animated/battery-charging-icon.d.ts +4 -0
  254. package/dist/src/icons/animated/battery-charging-icon.d.ts.map +1 -0
  255. package/dist/src/icons/animated/battery-icon.d.ts +4 -0
  256. package/dist/src/icons/animated/battery-icon.d.ts.map +1 -0
  257. package/dist/src/icons/animated/battery-pause-icon.d.ts +4 -0
  258. package/dist/src/icons/animated/battery-pause-icon.d.ts.map +1 -0
  259. package/dist/src/icons/animated/bell-off-icon.d.ts +4 -0
  260. package/dist/src/icons/animated/bell-off-icon.d.ts.map +1 -0
  261. package/dist/src/icons/animated/bluetooth-connected-icon.d.ts +4 -0
  262. package/dist/src/icons/animated/bluetooth-connected-icon.d.ts.map +1 -0
  263. package/dist/src/icons/animated/book-icon.d.ts +4 -0
  264. package/dist/src/icons/animated/book-icon.d.ts.map +1 -0
  265. package/dist/src/icons/animated/bookmark-icon.d.ts +4 -0
  266. package/dist/src/icons/animated/bookmark-icon.d.ts.map +1 -0
  267. package/dist/src/icons/animated/brain-circuit-icon.d.ts +4 -0
  268. package/dist/src/icons/animated/brain-circuit-icon.d.ts.map +1 -0
  269. package/dist/src/icons/animated/brand-aistudio-icon.d.ts +4 -0
  270. package/dist/src/icons/animated/brand-aistudio-icon.d.ts.map +1 -0
  271. package/dist/src/icons/animated/brand-anthropic-icon.d.ts +4 -0
  272. package/dist/src/icons/animated/brand-anthropic-icon.d.ts.map +1 -0
  273. package/dist/src/icons/animated/brand-aws-icon.d.ts +4 -0
  274. package/dist/src/icons/animated/brand-aws-icon.d.ts.map +1 -0
  275. package/dist/src/icons/animated/brand-bags-fm-icon.d.ts +4 -0
  276. package/dist/src/icons/animated/brand-bags-fm-icon.d.ts.map +1 -0
  277. package/dist/src/icons/animated/brand-chrome-icon.d.ts +4 -0
  278. package/dist/src/icons/animated/brand-chrome-icon.d.ts.map +1 -0
  279. package/dist/src/icons/animated/brand-cursor-icon.d.ts +4 -0
  280. package/dist/src/icons/animated/brand-cursor-icon.d.ts.map +1 -0
  281. package/dist/src/icons/animated/brand-gemini-icon.d.ts +4 -0
  282. package/dist/src/icons/animated/brand-gemini-icon.d.ts.map +1 -0
  283. package/dist/src/icons/animated/brand-google-icon.d.ts +4 -0
  284. package/dist/src/icons/animated/brand-google-icon.d.ts.map +1 -0
  285. package/dist/src/icons/animated/brand-grok-icon.d.ts +4 -0
  286. package/dist/src/icons/animated/brand-grok-icon.d.ts.map +1 -0
  287. package/dist/src/icons/animated/brand-lmstudio-icon.d.ts +4 -0
  288. package/dist/src/icons/animated/brand-lmstudio-icon.d.ts.map +1 -0
  289. package/dist/src/icons/animated/brand-midjourney-icon.d.ts +4 -0
  290. package/dist/src/icons/animated/brand-midjourney-icon.d.ts.map +1 -0
  291. package/dist/src/icons/animated/brand-nextjs-icon.d.ts +4 -0
  292. package/dist/src/icons/animated/brand-nextjs-icon.d.ts.map +1 -0
  293. package/dist/src/icons/animated/brand-notion-icon.d.ts +4 -0
  294. package/dist/src/icons/animated/brand-notion-icon.d.ts.map +1 -0
  295. package/dist/src/icons/animated/brand-ollama-icon.d.ts +4 -0
  296. package/dist/src/icons/animated/brand-ollama-icon.d.ts.map +1 -0
  297. package/dist/src/icons/animated/brand-openai-icon.d.ts +4 -0
  298. package/dist/src/icons/animated/brand-openai-icon.d.ts.map +1 -0
  299. package/dist/src/icons/animated/brand-paypal-icon.d.ts +4 -0
  300. package/dist/src/icons/animated/brand-paypal-icon.d.ts.map +1 -0
  301. package/dist/src/icons/animated/brand-qwen-icon.d.ts +4 -0
  302. package/dist/src/icons/animated/brand-qwen-icon.d.ts.map +1 -0
  303. package/dist/src/icons/animated/brand-railway-icon.d.ts +4 -0
  304. package/dist/src/icons/animated/brand-railway-icon.d.ts.map +1 -0
  305. package/dist/src/icons/animated/brand-react-icon.d.ts +4 -0
  306. package/dist/src/icons/animated/brand-react-icon.d.ts.map +1 -0
  307. package/dist/src/icons/animated/brand-react-native-icon.d.ts +4 -0
  308. package/dist/src/icons/animated/brand-react-native-icon.d.ts.map +1 -0
  309. package/dist/src/icons/animated/brand-stripe-icon.d.ts +4 -0
  310. package/dist/src/icons/animated/brand-stripe-icon.d.ts.map +1 -0
  311. package/dist/src/icons/animated/brand-telegram-icon.d.ts +4 -0
  312. package/dist/src/icons/animated/brand-telegram-icon.d.ts.map +1 -0
  313. package/dist/src/icons/animated/brand-threads-icon.d.ts +4 -0
  314. package/dist/src/icons/animated/brand-threads-icon.d.ts.map +1 -0
  315. package/dist/src/icons/animated/brand-twitch-icon.d.ts +4 -0
  316. package/dist/src/icons/animated/brand-twitch-icon.d.ts.map +1 -0
  317. package/dist/src/icons/animated/brand-vercel-icon.d.ts +4 -0
  318. package/dist/src/icons/animated/brand-vercel-icon.d.ts.map +1 -0
  319. package/dist/src/icons/animated/brand-windows-icon.d.ts +4 -0
  320. package/dist/src/icons/animated/brand-windows-icon.d.ts.map +1 -0
  321. package/dist/src/icons/animated/brand-wordpress-icon.d.ts +4 -0
  322. package/dist/src/icons/animated/brand-wordpress-icon.d.ts.map +1 -0
  323. package/dist/src/icons/animated/brand-xai-icon.d.ts +4 -0
  324. package/dist/src/icons/animated/brand-xai-icon.d.ts.map +1 -0
  325. package/dist/src/icons/animated/brand-zoom-icon.d.ts +4 -0
  326. package/dist/src/icons/animated/brand-zoom-icon.d.ts.map +1 -0
  327. package/dist/src/icons/animated/brightness-down-icon.d.ts +4 -0
  328. package/dist/src/icons/animated/brightness-down-icon.d.ts.map +1 -0
  329. package/dist/src/icons/animated/bug-icon.d.ts +4 -0
  330. package/dist/src/icons/animated/bug-icon.d.ts.map +1 -0
  331. package/dist/src/icons/animated/bulb-svg.d.ts +4 -0
  332. package/dist/src/icons/animated/bulb-svg.d.ts.map +1 -0
  333. package/dist/src/icons/animated/camera-icon.d.ts +4 -0
  334. package/dist/src/icons/animated/camera-icon.d.ts.map +1 -0
  335. package/dist/src/icons/animated/camera-off-icon.d.ts +4 -0
  336. package/dist/src/icons/animated/camera-off-icon.d.ts.map +1 -0
  337. package/dist/src/icons/animated/candy-cane-icon.d.ts +4 -0
  338. package/dist/src/icons/animated/candy-cane-icon.d.ts.map +1 -0
  339. package/dist/src/icons/animated/cart-icon.d.ts +4 -0
  340. package/dist/src/icons/animated/cart-icon.d.ts.map +1 -0
  341. package/dist/src/icons/animated/chart-bar-icon.d.ts +4 -0
  342. package/dist/src/icons/animated/chart-bar-icon.d.ts.map +1 -0
  343. package/dist/src/icons/animated/chart-covariate-icon.d.ts +4 -0
  344. package/dist/src/icons/animated/chart-covariate-icon.d.ts.map +1 -0
  345. package/dist/src/icons/animated/chart-histogram-icon.d.ts +4 -0
  346. package/dist/src/icons/animated/chart-histogram-icon.d.ts.map +1 -0
  347. package/dist/src/icons/animated/chart-line-icon.d.ts +4 -0
  348. package/dist/src/icons/animated/chart-line-icon.d.ts.map +1 -0
  349. package/dist/src/icons/animated/chart-pie-icon.d.ts +4 -0
  350. package/dist/src/icons/animated/chart-pie-icon.d.ts.map +1 -0
  351. package/dist/src/icons/animated/checked-icon.d.ts +4 -0
  352. package/dist/src/icons/animated/checked-icon.d.ts.map +1 -0
  353. package/dist/src/icons/animated/clock-icon.d.ts +4 -0
  354. package/dist/src/icons/animated/clock-icon.d.ts.map +1 -0
  355. package/dist/src/icons/animated/cloud-1-icon.d.ts +4 -0
  356. package/dist/src/icons/animated/cloud-1-icon.d.ts.map +1 -0
  357. package/dist/src/icons/animated/cloud-2-icon.d.ts +4 -0
  358. package/dist/src/icons/animated/cloud-2-icon.d.ts.map +1 -0
  359. package/dist/src/icons/animated/cloud-3-icon.d.ts +4 -0
  360. package/dist/src/icons/animated/cloud-3-icon.d.ts.map +1 -0
  361. package/dist/src/icons/animated/code-icon.d.ts +4 -0
  362. package/dist/src/icons/animated/code-icon.d.ts.map +1 -0
  363. package/dist/src/icons/animated/code-xml-icon.d.ts +4 -0
  364. package/dist/src/icons/animated/code-xml-icon.d.ts.map +1 -0
  365. package/dist/src/icons/animated/coffee-icon.d.ts +4 -0
  366. package/dist/src/icons/animated/coffee-icon.d.ts.map +1 -0
  367. package/dist/src/icons/animated/coin-bitcoin-icon.d.ts +4 -0
  368. package/dist/src/icons/animated/coin-bitcoin-icon.d.ts.map +1 -0
  369. package/dist/src/icons/animated/copy-icon.d.ts +4 -0
  370. package/dist/src/icons/animated/copy-icon.d.ts.map +1 -0
  371. package/dist/src/icons/animated/copy-off-icon.d.ts +4 -0
  372. package/dist/src/icons/animated/copy-off-icon.d.ts.map +1 -0
  373. package/dist/src/icons/animated/copyright-icon.d.ts +4 -0
  374. package/dist/src/icons/animated/copyright-icon.d.ts.map +1 -0
  375. package/dist/src/icons/animated/cpu-icon.d.ts +4 -0
  376. package/dist/src/icons/animated/cpu-icon.d.ts.map +1 -0
  377. package/dist/src/icons/animated/credit-card.d.ts +4 -0
  378. package/dist/src/icons/animated/credit-card.d.ts.map +1 -0
  379. package/dist/src/icons/animated/currency-bitcoin-icon.d.ts +4 -0
  380. package/dist/src/icons/animated/currency-bitcoin-icon.d.ts.map +1 -0
  381. package/dist/src/icons/animated/currency-dollar-icon.d.ts +4 -0
  382. package/dist/src/icons/animated/currency-dollar-icon.d.ts.map +1 -0
  383. package/dist/src/icons/animated/currency-ethereum-icon.d.ts +4 -0
  384. package/dist/src/icons/animated/currency-ethereum-icon.d.ts.map +1 -0
  385. package/dist/src/icons/animated/currency-euro-icon.d.ts +4 -0
  386. package/dist/src/icons/animated/currency-euro-icon.d.ts.map +1 -0
  387. package/dist/src/icons/animated/currency-rupee-icon.d.ts +4 -0
  388. package/dist/src/icons/animated/currency-rupee-icon.d.ts.map +1 -0
  389. package/dist/src/icons/animated/device-airpods-icon.d.ts +4 -0
  390. package/dist/src/icons/animated/device-airpods-icon.d.ts.map +1 -0
  391. package/dist/src/icons/animated/dialpad-icon.d.ts +4 -0
  392. package/dist/src/icons/animated/dialpad-icon.d.ts.map +1 -0
  393. package/dist/src/icons/animated/dino-icon.d.ts +4 -0
  394. package/dist/src/icons/animated/dino-icon.d.ts.map +1 -0
  395. package/dist/src/icons/animated/discord-icon.d.ts +4 -0
  396. package/dist/src/icons/animated/discord-icon.d.ts.map +1 -0
  397. package/dist/src/icons/animated/docker-icon.d.ts +4 -0
  398. package/dist/src/icons/animated/docker-icon.d.ts.map +1 -0
  399. package/dist/src/icons/animated/dots-horizontal-icon.d.ts +4 -0
  400. package/dist/src/icons/animated/dots-horizontal-icon.d.ts.map +1 -0
  401. package/dist/src/icons/animated/dots-vertical-icon.d.ts +4 -0
  402. package/dist/src/icons/animated/dots-vertical-icon.d.ts.map +1 -0
  403. package/dist/src/icons/animated/double-check-icon.d.ts +4 -0
  404. package/dist/src/icons/animated/double-check-icon.d.ts.map +1 -0
  405. package/dist/src/icons/animated/down-chevron.d.ts +4 -0
  406. package/dist/src/icons/animated/down-chevron.d.ts.map +1 -0
  407. package/dist/src/icons/animated/download-icon.d.ts +4 -0
  408. package/dist/src/icons/animated/download-icon.d.ts.map +1 -0
  409. package/dist/src/icons/animated/drum-icon.d.ts +4 -0
  410. package/dist/src/icons/animated/drum-icon.d.ts.map +1 -0
  411. package/dist/src/icons/animated/expand-icon.d.ts +4 -0
  412. package/dist/src/icons/animated/expand-icon.d.ts.map +1 -0
  413. package/dist/src/icons/animated/external-link-icon.d.ts +4 -0
  414. package/dist/src/icons/animated/external-link-icon.d.ts.map +1 -0
  415. package/dist/src/icons/animated/eye-icon.d.ts +4 -0
  416. package/dist/src/icons/animated/eye-icon.d.ts.map +1 -0
  417. package/dist/src/icons/animated/eye-off-icon.d.ts +4 -0
  418. package/dist/src/icons/animated/eye-off-icon.d.ts.map +1 -0
  419. package/dist/src/icons/animated/facebook-icon.d.ts +4 -0
  420. package/dist/src/icons/animated/facebook-icon.d.ts.map +1 -0
  421. package/dist/src/icons/animated/figma-icon.d.ts +4 -0
  422. package/dist/src/icons/animated/figma-icon.d.ts.map +1 -0
  423. package/dist/src/icons/animated/file-description-icon.d.ts +4 -0
  424. package/dist/src/icons/animated/file-description-icon.d.ts.map +1 -0
  425. package/dist/src/icons/animated/filled-bell-icon.d.ts +4 -0
  426. package/dist/src/icons/animated/filled-bell-icon.d.ts.map +1 -0
  427. package/dist/src/icons/animated/filled-checked-icon.d.ts +4 -0
  428. package/dist/src/icons/animated/filled-checked-icon.d.ts.map +1 -0
  429. package/dist/src/icons/animated/filter-icon.d.ts +4 -0
  430. package/dist/src/icons/animated/filter-icon.d.ts.map +1 -0
  431. package/dist/src/icons/animated/flame-icon.d.ts +4 -0
  432. package/dist/src/icons/animated/flame-icon.d.ts.map +1 -0
  433. package/dist/src/icons/animated/focus-icon.d.ts +4 -0
  434. package/dist/src/icons/animated/focus-icon.d.ts.map +1 -0
  435. package/dist/src/icons/animated/gamepad-icon.d.ts +4 -0
  436. package/dist/src/icons/animated/gamepad-icon.d.ts.map +1 -0
  437. package/dist/src/icons/animated/gauge-icon.d.ts +4 -0
  438. package/dist/src/icons/animated/gauge-icon.d.ts.map +1 -0
  439. package/dist/src/icons/animated/gear-icon.d.ts +4 -0
  440. package/dist/src/icons/animated/gear-icon.d.ts.map +1 -0
  441. package/dist/src/icons/animated/ghost-icon.d.ts +4 -0
  442. package/dist/src/icons/animated/ghost-icon.d.ts.map +1 -0
  443. package/dist/src/icons/animated/github-copilot-icon.d.ts +4 -0
  444. package/dist/src/icons/animated/github-copilot-icon.d.ts.map +1 -0
  445. package/dist/src/icons/animated/github-icon.d.ts +4 -0
  446. package/dist/src/icons/animated/github-icon.d.ts.map +1 -0
  447. package/dist/src/icons/animated/gitlab-icon.d.ts +4 -0
  448. package/dist/src/icons/animated/gitlab-icon.d.ts.map +1 -0
  449. package/dist/src/icons/animated/globe-icon.d.ts +4 -0
  450. package/dist/src/icons/animated/globe-icon.d.ts.map +1 -0
  451. package/dist/src/icons/animated/gmail-icon.d.ts +4 -0
  452. package/dist/src/icons/animated/gmail-icon.d.ts.map +1 -0
  453. package/dist/src/icons/animated/golang-icon.d.ts +4 -0
  454. package/dist/src/icons/animated/golang-icon.d.ts.map +1 -0
  455. package/dist/src/icons/animated/hand-heart-icon.d.ts +4 -0
  456. package/dist/src/icons/animated/hand-heart-icon.d.ts.map +1 -0
  457. package/dist/src/icons/animated/hashtag-icon.d.ts +4 -0
  458. package/dist/src/icons/animated/hashtag-icon.d.ts.map +1 -0
  459. package/dist/src/icons/animated/heart-icon.d.ts +4 -0
  460. package/dist/src/icons/animated/heart-icon.d.ts.map +1 -0
  461. package/dist/src/icons/animated/history-circle-icon.d.ts +4 -0
  462. package/dist/src/icons/animated/history-circle-icon.d.ts.map +1 -0
  463. package/dist/src/icons/animated/home-icon.d.ts +4 -0
  464. package/dist/src/icons/animated/home-icon.d.ts.map +1 -0
  465. package/dist/src/icons/animated/hotel-icon.d.ts +4 -0
  466. package/dist/src/icons/animated/hotel-icon.d.ts.map +1 -0
  467. package/dist/src/icons/animated/index.d.ts +267 -0
  468. package/dist/src/icons/animated/index.d.ts.map +1 -0
  469. package/dist/src/icons/animated/info-circle-icon.d.ts +4 -0
  470. package/dist/src/icons/animated/info-circle-icon.d.ts.map +1 -0
  471. package/dist/src/icons/animated/instagram-icon.d.ts +4 -0
  472. package/dist/src/icons/animated/instagram-icon.d.ts.map +1 -0
  473. package/dist/src/icons/animated/javascript-icon.d.ts +4 -0
  474. package/dist/src/icons/animated/javascript-icon.d.ts.map +1 -0
  475. package/dist/src/icons/animated/keyframes-icon.d.ts +4 -0
  476. package/dist/src/icons/animated/keyframes-icon.d.ts.map +1 -0
  477. package/dist/src/icons/animated/layers-icon.d.ts +4 -0
  478. package/dist/src/icons/animated/layers-icon.d.ts.map +1 -0
  479. package/dist/src/icons/animated/layout-bottombar-collapse-icon.d.ts +4 -0
  480. package/dist/src/icons/animated/layout-bottombar-collapse-icon.d.ts.map +1 -0
  481. package/dist/src/icons/animated/layout-dashboard-icon.d.ts +4 -0
  482. package/dist/src/icons/animated/layout-dashboard-icon.d.ts.map +1 -0
  483. package/dist/src/icons/animated/layout-sidebar-right-collapse-icon.d.ts +4 -0
  484. package/dist/src/icons/animated/layout-sidebar-right-collapse-icon.d.ts.map +1 -0
  485. package/dist/src/icons/animated/layout-sidebar-right-icon.d.ts +4 -0
  486. package/dist/src/icons/animated/layout-sidebar-right-icon.d.ts.map +1 -0
  487. package/dist/src/icons/animated/letter-a-icon.d.ts +4 -0
  488. package/dist/src/icons/animated/letter-a-icon.d.ts.map +1 -0
  489. package/dist/src/icons/animated/letter-b-icon.d.ts +4 -0
  490. package/dist/src/icons/animated/letter-b-icon.d.ts.map +1 -0
  491. package/dist/src/icons/animated/letter-c-icon.d.ts +4 -0
  492. package/dist/src/icons/animated/letter-c-icon.d.ts.map +1 -0
  493. package/dist/src/icons/animated/letter-d-icon.d.ts +4 -0
  494. package/dist/src/icons/animated/letter-d-icon.d.ts.map +1 -0
  495. package/dist/src/icons/animated/letter-e-icon.d.ts +4 -0
  496. package/dist/src/icons/animated/letter-e-icon.d.ts.map +1 -0
  497. package/dist/src/icons/animated/letter-f-icon.d.ts +4 -0
  498. package/dist/src/icons/animated/letter-f-icon.d.ts.map +1 -0
  499. package/dist/src/icons/animated/letter-g-icon.d.ts +4 -0
  500. package/dist/src/icons/animated/letter-g-icon.d.ts.map +1 -0
  501. package/dist/src/icons/animated/letter-h-icon.d.ts +4 -0
  502. package/dist/src/icons/animated/letter-h-icon.d.ts.map +1 -0
  503. package/dist/src/icons/animated/letter-i-icon.d.ts +4 -0
  504. package/dist/src/icons/animated/letter-i-icon.d.ts.map +1 -0
  505. package/dist/src/icons/animated/letter-j-icon.d.ts +4 -0
  506. package/dist/src/icons/animated/letter-j-icon.d.ts.map +1 -0
  507. package/dist/src/icons/animated/letter-k-icon.d.ts +4 -0
  508. package/dist/src/icons/animated/letter-k-icon.d.ts.map +1 -0
  509. package/dist/src/icons/animated/letter-l-icon.d.ts +4 -0
  510. package/dist/src/icons/animated/letter-l-icon.d.ts.map +1 -0
  511. package/dist/src/icons/animated/letter-m-icon.d.ts +4 -0
  512. package/dist/src/icons/animated/letter-m-icon.d.ts.map +1 -0
  513. package/dist/src/icons/animated/letter-n-icon.d.ts +4 -0
  514. package/dist/src/icons/animated/letter-n-icon.d.ts.map +1 -0
  515. package/dist/src/icons/animated/letter-o-icon.d.ts +4 -0
  516. package/dist/src/icons/animated/letter-o-icon.d.ts.map +1 -0
  517. package/dist/src/icons/animated/letter-p-icon.d.ts +4 -0
  518. package/dist/src/icons/animated/letter-p-icon.d.ts.map +1 -0
  519. package/dist/src/icons/animated/letter-q-icon.d.ts +4 -0
  520. package/dist/src/icons/animated/letter-q-icon.d.ts.map +1 -0
  521. package/dist/src/icons/animated/letter-r-icon.d.ts +4 -0
  522. package/dist/src/icons/animated/letter-r-icon.d.ts.map +1 -0
  523. package/dist/src/icons/animated/letter-s-icon.d.ts +4 -0
  524. package/dist/src/icons/animated/letter-s-icon.d.ts.map +1 -0
  525. package/dist/src/icons/animated/letter-t-icon.d.ts +4 -0
  526. package/dist/src/icons/animated/letter-t-icon.d.ts.map +1 -0
  527. package/dist/src/icons/animated/letter-u-icon.d.ts +4 -0
  528. package/dist/src/icons/animated/letter-u-icon.d.ts.map +1 -0
  529. package/dist/src/icons/animated/letter-v-icon.d.ts +4 -0
  530. package/dist/src/icons/animated/letter-v-icon.d.ts.map +1 -0
  531. package/dist/src/icons/animated/letter-w-icon.d.ts +4 -0
  532. package/dist/src/icons/animated/letter-w-icon.d.ts.map +1 -0
  533. package/dist/src/icons/animated/letter-x-icon.d.ts +4 -0
  534. package/dist/src/icons/animated/letter-x-icon.d.ts.map +1 -0
  535. package/dist/src/icons/animated/letter-y-icon.d.ts +4 -0
  536. package/dist/src/icons/animated/letter-y-icon.d.ts.map +1 -0
  537. package/dist/src/icons/animated/letter-z-icon.d.ts +4 -0
  538. package/dist/src/icons/animated/letter-z-icon.d.ts.map +1 -0
  539. package/dist/src/icons/animated/library-icon.d.ts +4 -0
  540. package/dist/src/icons/animated/library-icon.d.ts.map +1 -0
  541. package/dist/src/icons/animated/like-icon.d.ts +4 -0
  542. package/dist/src/icons/animated/like-icon.d.ts.map +1 -0
  543. package/dist/src/icons/animated/link-icon.d.ts +4 -0
  544. package/dist/src/icons/animated/link-icon.d.ts.map +1 -0
  545. package/dist/src/icons/animated/linkedin-icon.d.ts +4 -0
  546. package/dist/src/icons/animated/linkedin-icon.d.ts.map +1 -0
  547. package/dist/src/icons/animated/locate-icon.d.ts +4 -0
  548. package/dist/src/icons/animated/locate-icon.d.ts.map +1 -0
  549. package/dist/src/icons/animated/lock-icon.d.ts +4 -0
  550. package/dist/src/icons/animated/lock-icon.d.ts.map +1 -0
  551. package/dist/src/icons/animated/logout-icon.d.ts +4 -0
  552. package/dist/src/icons/animated/logout-icon.d.ts.map +1 -0
  553. package/dist/src/icons/animated/magnifier-icon.d.ts +4 -0
  554. package/dist/src/icons/animated/magnifier-icon.d.ts.map +1 -0
  555. package/dist/src/icons/animated/mail-filled-icon.d.ts +4 -0
  556. package/dist/src/icons/animated/mail-filled-icon.d.ts.map +1 -0
  557. package/dist/src/icons/animated/map-pin-icon.d.ts +4 -0
  558. package/dist/src/icons/animated/map-pin-icon.d.ts.map +1 -0
  559. package/dist/src/icons/animated/meh-icon.d.ts +4 -0
  560. package/dist/src/icons/animated/meh-icon.d.ts.map +1 -0
  561. package/dist/src/icons/animated/message-circle-icon.d.ts +4 -0
  562. package/dist/src/icons/animated/message-circle-icon.d.ts.map +1 -0
  563. package/dist/src/icons/animated/moon-icon.d.ts +4 -0
  564. package/dist/src/icons/animated/moon-icon.d.ts.map +1 -0
  565. package/dist/src/icons/animated/mouse-pointer-2-icon.d.ts +4 -0
  566. package/dist/src/icons/animated/mouse-pointer-2-icon.d.ts.map +1 -0
  567. package/dist/src/icons/animated/mysql-icon.d.ts +4 -0
  568. package/dist/src/icons/animated/mysql-icon.d.ts.map +1 -0
  569. package/dist/src/icons/animated/nodejs-icon.d.ts +4 -0
  570. package/dist/src/icons/animated/nodejs-icon.d.ts.map +1 -0
  571. package/dist/src/icons/animated/paint-icon.d.ts +4 -0
  572. package/dist/src/icons/animated/paint-icon.d.ts.map +1 -0
  573. package/dist/src/icons/animated/party-popper-icon.d.ts +4 -0
  574. package/dist/src/icons/animated/party-popper-icon.d.ts.map +1 -0
  575. package/dist/src/icons/animated/passport-icon.d.ts +4 -0
  576. package/dist/src/icons/animated/passport-icon.d.ts.map +1 -0
  577. package/dist/src/icons/animated/paw-print-icon.d.ts +4 -0
  578. package/dist/src/icons/animated/paw-print-icon.d.ts.map +1 -0
  579. package/dist/src/icons/animated/pen-icon.d.ts +4 -0
  580. package/dist/src/icons/animated/pen-icon.d.ts.map +1 -0
  581. package/dist/src/icons/animated/phone-volume.d.ts +4 -0
  582. package/dist/src/icons/animated/phone-volume.d.ts.map +1 -0
  583. package/dist/src/icons/animated/pinterest-icon.d.ts +4 -0
  584. package/dist/src/icons/animated/pinterest-icon.d.ts.map +1 -0
  585. package/dist/src/icons/animated/player-icon.d.ts +4 -0
  586. package/dist/src/icons/animated/player-icon.d.ts.map +1 -0
  587. package/dist/src/icons/animated/plug-connected-icon.d.ts +4 -0
  588. package/dist/src/icons/animated/plug-connected-icon.d.ts.map +1 -0
  589. package/dist/src/icons/animated/plug-connected-x-icon.d.ts +4 -0
  590. package/dist/src/icons/animated/plug-connected-x-icon.d.ts.map +1 -0
  591. package/dist/src/icons/animated/python-icon.d.ts +4 -0
  592. package/dist/src/icons/animated/python-icon.d.ts.map +1 -0
  593. package/dist/src/icons/animated/qrcode-icon.d.ts +4 -0
  594. package/dist/src/icons/animated/qrcode-icon.d.ts.map +1 -0
  595. package/dist/src/icons/animated/question-mark.d.ts +4 -0
  596. package/dist/src/icons/animated/question-mark.d.ts.map +1 -0
  597. package/dist/src/icons/animated/radio-icon.d.ts +4 -0
  598. package/dist/src/icons/animated/radio-icon.d.ts.map +1 -0
  599. package/dist/src/icons/animated/rainbow-icon.d.ts +4 -0
  600. package/dist/src/icons/animated/rainbow-icon.d.ts.map +1 -0
  601. package/dist/src/icons/animated/refresh-icon.d.ts +4 -0
  602. package/dist/src/icons/animated/refresh-icon.d.ts.map +1 -0
  603. package/dist/src/icons/animated/right-chevron.d.ts +4 -0
  604. package/dist/src/icons/animated/right-chevron.d.ts.map +1 -0
  605. package/dist/src/icons/animated/rocket-icon.d.ts +4 -0
  606. package/dist/src/icons/animated/rocket-icon.d.ts.map +1 -0
  607. package/dist/src/icons/animated/rosette-discount-check-icon.d.ts +4 -0
  608. package/dist/src/icons/animated/rosette-discount-check-icon.d.ts.map +1 -0
  609. package/dist/src/icons/animated/rosette-discount-icon.d.ts +4 -0
  610. package/dist/src/icons/animated/rosette-discount-icon.d.ts.map +1 -0
  611. package/dist/src/icons/animated/router-icon.d.ts +4 -0
  612. package/dist/src/icons/animated/router-icon.d.ts.map +1 -0
  613. package/dist/src/icons/animated/satellite-dish-icon.d.ts +4 -0
  614. package/dist/src/icons/animated/satellite-dish-icon.d.ts.map +1 -0
  615. package/dist/src/icons/animated/save-icon.d.ts +4 -0
  616. package/dist/src/icons/animated/save-icon.d.ts.map +1 -0
  617. package/dist/src/icons/animated/scan-barcode-icon.d.ts +4 -0
  618. package/dist/src/icons/animated/scan-barcode-icon.d.ts.map +1 -0
  619. package/dist/src/icons/animated/scan-heart-icon.d.ts +4 -0
  620. package/dist/src/icons/animated/scan-heart-icon.d.ts.map +1 -0
  621. package/dist/src/icons/animated/send-horizontal-icon.d.ts +4 -0
  622. package/dist/src/icons/animated/send-horizontal-icon.d.ts.map +1 -0
  623. package/dist/src/icons/animated/send-icon.d.ts +4 -0
  624. package/dist/src/icons/animated/send-icon.d.ts.map +1 -0
  625. package/dist/src/icons/animated/shield-check.d.ts +4 -0
  626. package/dist/src/icons/animated/shield-check.d.ts.map +1 -0
  627. package/dist/src/icons/animated/shopping-cart-icon.d.ts +4 -0
  628. package/dist/src/icons/animated/shopping-cart-icon.d.ts.map +1 -0
  629. package/dist/src/icons/animated/simple-checked-icon.d.ts +4 -0
  630. package/dist/src/icons/animated/simple-checked-icon.d.ts.map +1 -0
  631. package/dist/src/icons/animated/skull-emoji.d.ts +4 -0
  632. package/dist/src/icons/animated/skull-emoji.d.ts.map +1 -0
  633. package/dist/src/icons/animated/slack-icon.d.ts +4 -0
  634. package/dist/src/icons/animated/slack-icon.d.ts.map +1 -0
  635. package/dist/src/icons/animated/sliders-horizontal-icon.d.ts +4 -0
  636. package/dist/src/icons/animated/sliders-horizontal-icon.d.ts.map +1 -0
  637. package/dist/src/icons/animated/snapchat-icon.d.ts +4 -0
  638. package/dist/src/icons/animated/snapchat-icon.d.ts.map +1 -0
  639. package/dist/src/icons/animated/soup-icon.d.ts +4 -0
  640. package/dist/src/icons/animated/soup-icon.d.ts.map +1 -0
  641. package/dist/src/icons/animated/sparkles-icon.d.ts +4 -0
  642. package/dist/src/icons/animated/sparkles-icon.d.ts.map +1 -0
  643. package/dist/src/icons/animated/spotify-icon.d.ts +4 -0
  644. package/dist/src/icons/animated/spotify-icon.d.ts.map +1 -0
  645. package/dist/src/icons/animated/stack-3-icon.d.ts +4 -0
  646. package/dist/src/icons/animated/stack-3-icon.d.ts.map +1 -0
  647. package/dist/src/icons/animated/stack-icon.d.ts +4 -0
  648. package/dist/src/icons/animated/stack-icon.d.ts.map +1 -0
  649. package/dist/src/icons/animated/star-icon.d.ts +4 -0
  650. package/dist/src/icons/animated/star-icon.d.ts.map +1 -0
  651. package/dist/src/icons/animated/subscript-icon.d.ts +4 -0
  652. package/dist/src/icons/animated/subscript-icon.d.ts.map +1 -0
  653. package/dist/src/icons/animated/target-icon.d.ts +4 -0
  654. package/dist/src/icons/animated/target-icon.d.ts.map +1 -0
  655. package/dist/src/icons/animated/telephone-icon.d.ts +4 -0
  656. package/dist/src/icons/animated/telephone-icon.d.ts.map +1 -0
  657. package/dist/src/icons/animated/terminal-icon.d.ts +4 -0
  658. package/dist/src/icons/animated/terminal-icon.d.ts.map +1 -0
  659. package/dist/src/icons/animated/toggle-icon.d.ts +4 -0
  660. package/dist/src/icons/animated/toggle-icon.d.ts.map +1 -0
  661. package/dist/src/icons/animated/trash-icon.d.ts +9 -0
  662. package/dist/src/icons/animated/trash-icon.d.ts.map +1 -0
  663. package/dist/src/icons/animated/travel-bag.d.ts +4 -0
  664. package/dist/src/icons/animated/travel-bag.d.ts.map +1 -0
  665. package/dist/src/icons/animated/triangle-alert-icon.d.ts +4 -0
  666. package/dist/src/icons/animated/triangle-alert-icon.d.ts.map +1 -0
  667. package/dist/src/icons/animated/trophy-icon.d.ts +4 -0
  668. package/dist/src/icons/animated/trophy-icon.d.ts.map +1 -0
  669. package/dist/src/icons/animated/truck-electric-icon.d.ts +4 -0
  670. package/dist/src/icons/animated/truck-electric-icon.d.ts.map +1 -0
  671. package/dist/src/icons/animated/twitter-icon.d.ts +4 -0
  672. package/dist/src/icons/animated/twitter-icon.d.ts.map +1 -0
  673. package/dist/src/icons/animated/twitter-x-icon.d.ts +4 -0
  674. package/dist/src/icons/animated/twitter-x-icon.d.ts.map +1 -0
  675. package/dist/src/icons/animated/types.d.ts +33 -0
  676. package/dist/src/icons/animated/types.d.ts.map +1 -0
  677. package/dist/src/icons/animated/typescript-icon.d.ts +4 -0
  678. package/dist/src/icons/animated/typescript-icon.d.ts.map +1 -0
  679. package/dist/src/icons/animated/unlink-icon.d.ts +4 -0
  680. package/dist/src/icons/animated/unlink-icon.d.ts.map +1 -0
  681. package/dist/src/icons/animated/unordered-list-icon.d.ts +4 -0
  682. package/dist/src/icons/animated/unordered-list-icon.d.ts.map +1 -0
  683. package/dist/src/icons/animated/upload-icon.d.ts +4 -0
  684. package/dist/src/icons/animated/upload-icon.d.ts.map +1 -0
  685. package/dist/src/icons/animated/useAnimatedIconTrigger.d.ts +8 -0
  686. package/dist/src/icons/animated/useAnimatedIconTrigger.d.ts.map +1 -0
  687. package/dist/src/icons/animated/user-check-icon.d.ts +4 -0
  688. package/dist/src/icons/animated/user-check-icon.d.ts.map +1 -0
  689. package/dist/src/icons/animated/user-icon.d.ts +4 -0
  690. package/dist/src/icons/animated/user-icon.d.ts.map +1 -0
  691. package/dist/src/icons/animated/user-plus-icon.d.ts +4 -0
  692. package/dist/src/icons/animated/user-plus-icon.d.ts.map +1 -0
  693. package/dist/src/icons/animated/users-group-icon.d.ts +4 -0
  694. package/dist/src/icons/animated/users-group-icon.d.ts.map +1 -0
  695. package/dist/src/icons/animated/users-icon.d.ts +4 -0
  696. package/dist/src/icons/animated/users-icon.d.ts.map +1 -0
  697. package/dist/src/icons/animated/vinyl-icon.d.ts +4 -0
  698. package/dist/src/icons/animated/vinyl-icon.d.ts.map +1 -0
  699. package/dist/src/icons/animated/volume-2-icon.d.ts +4 -0
  700. package/dist/src/icons/animated/volume-2-icon.d.ts.map +1 -0
  701. package/dist/src/icons/animated/volume-x-icon.d.ts +4 -0
  702. package/dist/src/icons/animated/volume-x-icon.d.ts.map +1 -0
  703. package/dist/src/icons/animated/wallet-icon.d.ts +4 -0
  704. package/dist/src/icons/animated/wallet-icon.d.ts.map +1 -0
  705. package/dist/src/icons/animated/washing-machine-icon.d.ts +4 -0
  706. package/dist/src/icons/animated/washing-machine-icon.d.ts.map +1 -0
  707. package/dist/src/icons/animated/whatsapp-icon.d.ts +4 -0
  708. package/dist/src/icons/animated/whatsapp-icon.d.ts.map +1 -0
  709. package/dist/src/icons/animated/wifi-icon.d.ts +4 -0
  710. package/dist/src/icons/animated/wifi-icon.d.ts.map +1 -0
  711. package/dist/src/icons/animated/wifi-off-icon.d.ts +4 -0
  712. package/dist/src/icons/animated/wifi-off-icon.d.ts.map +1 -0
  713. package/dist/src/icons/animated/world-icon.d.ts +4 -0
  714. package/dist/src/icons/animated/world-icon.d.ts.map +1 -0
  715. package/dist/src/icons/animated/x-icon.d.ts +4 -0
  716. package/dist/src/icons/animated/x-icon.d.ts.map +1 -0
  717. package/dist/src/icons/animated/youtube-icon.d.ts +4 -0
  718. package/dist/src/icons/animated/youtube-icon.d.ts.map +1 -0
  719. package/dist/src/icons/index.d.ts +1 -0
  720. package/dist/src/icons/index.d.ts.map +1 -1
  721. package/dist/src/icons/lucide.d.ts +1 -1
  722. package/dist/src/icons/lucide.d.ts.map +1 -1
  723. package/dist/src/languages/hooks/index.d.ts +1 -1
  724. package/dist/src/languages/hooks/index.d.ts.map +1 -1
  725. package/dist/src/languages/hooks/useLanguageLabel.d.ts +8 -7
  726. package/dist/src/languages/hooks/useLanguageLabel.d.ts.map +1 -1
  727. package/dist/src/languages/hooks/usePreferenceLabel.d.ts +1 -1
  728. package/dist/src/languages/hooks/usePreferenceLabel.d.ts.map +1 -1
  729. package/dist/src/languages/hooks/useThemeLabel.d.ts +4 -5
  730. package/dist/src/languages/hooks/useThemeLabel.d.ts.map +1 -1
  731. package/dist/src/languages/index.d.ts +0 -2
  732. package/dist/src/languages/index.d.ts.map +1 -1
  733. package/dist/src/languages/languages/i18n.d.ts +4 -7
  734. package/dist/src/languages/languages/i18n.d.ts.map +1 -1
  735. package/dist/src/languages/languages/i18nResources.d.ts +1 -1
  736. package/dist/src/languages/languages/i18nResources.d.ts.map +1 -1
  737. package/dist/src/languages/resources/index.d.ts +2 -2
  738. package/dist/src/languages/types/components.d.ts +1 -24
  739. package/dist/src/languages/types/components.d.ts.map +1 -1
  740. package/dist/src/languages/types/i18n.d.ts +1 -4
  741. package/dist/src/languages/types/i18n.d.ts.map +1 -1
  742. package/dist/src/languages/types/language.d.ts +2 -11
  743. package/dist/src/languages/types/language.d.ts.map +1 -1
  744. package/dist/src/languages/utils/getLocalLanguage.d.ts +1 -1
  745. package/dist/src/languages/utils/getLocalLanguage.d.ts.map +1 -1
  746. package/dist/src/languages/utils/languageStorage.d.ts +2 -3
  747. package/dist/src/languages/utils/languageStorage.d.ts.map +1 -1
  748. package/dist/src/providers/LanguageProvider/index.d.ts +19 -0
  749. package/dist/src/providers/LanguageProvider/index.d.ts.map +1 -0
  750. package/dist/src/providers/ThemeProvider/index.d.ts +17 -0
  751. package/dist/src/providers/ThemeProvider/index.d.ts.map +1 -0
  752. package/dist/src/providers/index.d.ts +7 -0
  753. package/dist/src/providers/index.d.ts.map +1 -0
  754. package/dist/src/stores/index.d.ts +4 -0
  755. package/dist/src/stores/index.d.ts.map +1 -1
  756. package/dist/src/stores/layout.d.ts +41 -0
  757. package/dist/src/stores/layout.d.ts.map +1 -0
  758. package/dist/src/stores/makeStore.d.ts +1 -1
  759. package/dist/src/stores/modal.d.ts +67 -0
  760. package/dist/src/stores/modal.d.ts.map +1 -0
  761. package/dist/src/stores/preference.d.ts +52 -0
  762. package/dist/src/stores/preference.d.ts.map +1 -0
  763. package/dist/src/themes/fonts.d.ts +21 -0
  764. package/dist/src/themes/fonts.d.ts.map +1 -0
  765. package/dist/src/themes/hooks/index.d.ts +1 -3
  766. package/dist/src/themes/hooks/index.d.ts.map +1 -1
  767. package/dist/src/themes/hooks/useTheme.d.ts +25 -9
  768. package/dist/src/themes/hooks/useTheme.d.ts.map +1 -1
  769. package/dist/src/themes/index.d.ts +3 -4
  770. package/dist/src/themes/index.d.ts.map +1 -1
  771. package/dist/src/themes/radix/index.d.ts +2 -0
  772. package/dist/src/themes/radix/index.d.ts.map +1 -0
  773. package/dist/src/themes/radix/mappings.d.ts +39 -0
  774. package/dist/src/themes/radix/mappings.d.ts.map +1 -0
  775. package/dist/src/themes/types/components.d.ts +1 -24
  776. package/dist/src/themes/types/components.d.ts.map +1 -1
  777. package/dist/src/themes/types/context.d.ts +6 -12
  778. package/dist/src/themes/types/context.d.ts.map +1 -1
  779. package/dist/src/themes/types/index.d.ts +1 -6
  780. package/dist/src/themes/types/index.d.ts.map +1 -1
  781. package/dist/src/themes/types/theme.d.ts +15 -26
  782. package/dist/src/themes/types/theme.d.ts.map +1 -1
  783. package/dist/src/utils/factory/hooks.d.ts +44 -0
  784. package/dist/src/utils/factory/hooks.d.ts.map +1 -0
  785. package/dist/src/utils/factory/index.d.ts +2 -0
  786. package/dist/src/utils/factory/index.d.ts.map +1 -0
  787. package/dist/src/utils/index.d.ts +1 -0
  788. package/dist/src/utils/index.d.ts.map +1 -1
  789. package/dist/src/utils/safe.d.ts +4 -0
  790. package/dist/src/utils/safe.d.ts.map +1 -1
  791. package/dist/stores.cjs +1 -4
  792. package/dist/stores.mjs +32 -164
  793. package/dist/themes.cjs +2 -4
  794. package/dist/themes.mjs +27 -1473
  795. package/dist/types.cjs +0 -1
  796. package/dist/types.mjs +0 -1
  797. package/dist/utils.cjs +1 -2
  798. package/dist/utils.cjs.map +1 -1
  799. package/dist/utils.mjs +163 -181
  800. package/dist/utils.mjs.map +1 -1
  801. package/package.json +101 -43
  802. package/dist/chunk-BounceLoading-C-gq-XVr.mjs +0 -241
  803. package/dist/chunk-BounceLoading-C-gq-XVr.mjs.map +0 -1
  804. package/dist/chunk-BounceLoading-CkxvzNz8.cjs +0 -11
  805. package/dist/chunk-BounceLoading-CkxvzNz8.cjs.map +0 -1
  806. package/dist/chunk-animations-CiJbVYGC.mjs +0 -741
  807. package/dist/chunk-animations-CiJbVYGC.mjs.map +0 -1
  808. package/dist/chunk-animations-i85rn79V.cjs +0 -3
  809. package/dist/chunk-animations-i85rn79V.cjs.map +0 -1
  810. package/dist/chunk-chunk-D-Fg7nx1.cjs +0 -1
  811. package/dist/chunk-i18n-2-xL4pEi.cjs +0 -3
  812. package/dist/chunk-i18n-2-xL4pEi.cjs.map +0 -1
  813. package/dist/chunk-i18n-DgaoEbGL.mjs +0 -214
  814. package/dist/chunk-i18n-DgaoEbGL.mjs.map +0 -1
  815. package/dist/chunk-language-2r4uKROB.cjs +0 -3
  816. package/dist/chunk-language-2r4uKROB.cjs.map +0 -1
  817. package/dist/chunk-language-JRs5UIa2.mjs +0 -11
  818. package/dist/chunk-language-JRs5UIa2.mjs.map +0 -1
  819. package/dist/chunk-layout-BEAgFhif.mjs +0 -11
  820. package/dist/chunk-layout-BEAgFhif.mjs.map +0 -1
  821. package/dist/chunk-layout-mMQXuBLE.cjs +0 -3
  822. package/dist/chunk-layout-mMQXuBLE.cjs.map +0 -1
  823. package/dist/chunk-lucide-B99NZWfa.mjs +0 -158
  824. package/dist/chunk-lucide-B99NZWfa.mjs.map +0 -1
  825. package/dist/chunk-lucide-XL6d5__j.cjs +0 -3
  826. package/dist/chunk-lucide-XL6d5__j.cjs.map +0 -1
  827. package/dist/chunk-preference-DMhhY1Pl.mjs +0 -60
  828. package/dist/chunk-preference-DMhhY1Pl.mjs.map +0 -1
  829. package/dist/chunk-preference-DbNgeGhx.cjs +0 -3
  830. package/dist/chunk-preference-DbNgeGhx.cjs.map +0 -1
  831. package/dist/chunk-theme-CINVDd47.mjs +0 -17
  832. package/dist/chunk-theme-CINVDd47.mjs.map +0 -1
  833. package/dist/chunk-theme-D49XQfXe.cjs +0 -3
  834. package/dist/chunk-theme-D49XQfXe.cjs.map +0 -1
  835. package/dist/chunk-useLayout-BAIFfydj.cjs +0 -3
  836. package/dist/chunk-useLayout-BAIFfydj.cjs.map +0 -1
  837. package/dist/chunk-useLayout-BXsJlpcb.mjs +0 -12
  838. package/dist/chunk-useLayout-BXsJlpcb.mjs.map +0 -1
  839. package/dist/chunk-useTheme-BY1_pW9y.mjs +0 -13
  840. package/dist/chunk-useTheme-BY1_pW9y.mjs.map +0 -1
  841. package/dist/chunk-useTheme-Tw_7_cQf.cjs +0 -3
  842. package/dist/chunk-useTheme-Tw_7_cQf.cjs.map +0 -1
  843. package/dist/hooks.cjs.map +0 -1
  844. package/dist/hooks.mjs.map +0 -1
  845. package/dist/pixel-blast.cjs.map +0 -1
  846. package/dist/pixel-blast.mjs.map +0 -1
  847. package/dist/preference.cjs +0 -2
  848. package/dist/preference.mjs +0 -10
  849. package/dist/src/designs/components/Button/index.d.ts +0 -32
  850. package/dist/src/designs/components/Button/index.d.ts.map +0 -1
  851. package/dist/src/designs/components/Dropdown/index.d.ts +0 -25
  852. package/dist/src/designs/components/Dropdown/index.d.ts.map +0 -1
  853. package/dist/src/designs/components/Input/index.d.ts +0 -35
  854. package/dist/src/designs/components/Input/index.d.ts.map +0 -1
  855. package/dist/src/designs/components/KeyValueEditor/index.d.ts +0 -44
  856. package/dist/src/designs/components/KeyValueEditor/index.d.ts.map +0 -1
  857. package/dist/src/designs/components/SearchInput/index.d.ts +0 -15
  858. package/dist/src/designs/components/SearchInput/index.d.ts.map +0 -1
  859. package/dist/src/designs/components/ShowFilter/index.d.ts +0 -40
  860. package/dist/src/designs/components/ShowFilter/index.d.ts.map +0 -1
  861. package/dist/src/designs/components/SlideDownSwitcher/index.d.ts +0 -17
  862. package/dist/src/designs/components/SlideDownSwitcher/index.d.ts.map +0 -1
  863. package/dist/src/designs/components/Slider/index.d.ts +0 -39
  864. package/dist/src/designs/components/Slider/index.d.ts.map +0 -1
  865. package/dist/src/designs/components/Textarea/index.d.ts +0 -33
  866. package/dist/src/designs/components/Textarea/index.d.ts.map +0 -1
  867. package/dist/src/hooks/makeCursorFetchFunction.d.ts +0 -85
  868. package/dist/src/hooks/makeCursorFetchFunction.d.ts.map +0 -1
  869. package/dist/src/hooks/makeUnifiedInfiniteQuery.d.ts +0 -125
  870. package/dist/src/hooks/makeUnifiedInfiniteQuery.d.ts.map +0 -1
  871. package/dist/src/hooks/makeUnifiedQuery.d.ts +0 -20
  872. package/dist/src/hooks/makeUnifiedQuery.d.ts.map +0 -1
  873. package/dist/src/hooks/type.d.ts +0 -41
  874. package/dist/src/hooks/type.d.ts.map +0 -1
  875. package/dist/src/languages/providers/index.d.ts +0 -8
  876. package/dist/src/languages/providers/index.d.ts.map +0 -1
  877. package/dist/src/preference/constants.d.ts.map +0 -1
  878. package/dist/src/preference/core.d.ts +0 -12
  879. package/dist/src/preference/core.d.ts.map +0 -1
  880. package/dist/src/preference/index.d.ts +0 -27
  881. package/dist/src/preference/index.d.ts.map +0 -1
  882. package/dist/src/preference/nfx_slice.d.ts +0 -24
  883. package/dist/src/preference/nfx_slice.d.ts.map +0 -1
  884. package/dist/src/preference/types.d.ts +0 -28
  885. package/dist/src/preference/types.d.ts.map +0 -1
  886. package/dist/src/themes/hooks/useBaseVariables.d.ts +0 -8
  887. package/dist/src/themes/hooks/useBaseVariables.d.ts.map +0 -1
  888. package/dist/src/themes/hooks/useThemeVariables.d.ts +0 -11
  889. package/dist/src/themes/hooks/useThemeVariables.d.ts.map +0 -1
  890. package/dist/src/themes/hooks/useVariables.d.ts +0 -8
  891. package/dist/src/themes/hooks/useVariables.d.ts.map +0 -1
  892. package/dist/src/themes/providers/index.d.ts +0 -8
  893. package/dist/src/themes/providers/index.d.ts.map +0 -1
  894. package/dist/src/themes/themes/bases/android.d.ts +0 -5
  895. package/dist/src/themes/themes/bases/android.d.ts.map +0 -1
  896. package/dist/src/themes/themes/bases/default.d.ts +0 -6
  897. package/dist/src/themes/themes/bases/default.d.ts.map +0 -1
  898. package/dist/src/themes/themes/bases/index.d.ts +0 -9
  899. package/dist/src/themes/themes/bases/index.d.ts.map +0 -1
  900. package/dist/src/themes/themes/bases/ios.d.ts +0 -5
  901. package/dist/src/themes/themes/bases/ios.d.ts.map +0 -1
  902. package/dist/src/themes/themes/bases/linux.d.ts +0 -5
  903. package/dist/src/themes/themes/bases/linux.d.ts.map +0 -1
  904. package/dist/src/themes/themes/bases/windows.d.ts +0 -5
  905. package/dist/src/themes/themes/bases/windows.d.ts.map +0 -1
  906. package/dist/src/themes/themes/colors/coffee.d.ts +0 -8
  907. package/dist/src/themes/themes/colors/coffee.d.ts.map +0 -1
  908. package/dist/src/themes/themes/colors/corporate.d.ts +0 -8
  909. package/dist/src/themes/themes/colors/corporate.d.ts.map +0 -1
  910. package/dist/src/themes/themes/colors/cosmic.d.ts +0 -8
  911. package/dist/src/themes/themes/colors/cosmic.d.ts.map +0 -1
  912. package/dist/src/themes/themes/colors/dark.d.ts +0 -8
  913. package/dist/src/themes/themes/colors/dark.d.ts.map +0 -1
  914. package/dist/src/themes/themes/colors/default.d.ts +0 -8
  915. package/dist/src/themes/themes/colors/default.d.ts.map +0 -1
  916. package/dist/src/themes/themes/colors/forest.d.ts +0 -8
  917. package/dist/src/themes/themes/colors/forest.d.ts.map +0 -1
  918. package/dist/src/themes/themes/colors/index.d.ts +0 -14
  919. package/dist/src/themes/themes/colors/index.d.ts.map +0 -1
  920. package/dist/src/themes/themes/colors/light.d.ts +0 -8
  921. package/dist/src/themes/themes/colors/light.d.ts.map +0 -1
  922. package/dist/src/themes/themes/colors/wheat.d.ts +0 -8
  923. package/dist/src/themes/themes/colors/wheat.d.ts.map +0 -1
  924. package/dist/src/themes/themes/colors/wine.d.ts +0 -8
  925. package/dist/src/themes/themes/colors/wine.d.ts.map +0 -1
  926. package/dist/src/themes/themes/index.d.ts +0 -3
  927. package/dist/src/themes/themes/index.d.ts.map +0 -1
  928. package/dist/src/themes/utils/index.d.ts +0 -5
  929. package/dist/src/themes/utils/index.d.ts.map +0 -1
  930. package/dist/src/themes/utils/themeStorage.d.ts +0 -12
  931. package/dist/src/themes/utils/themeStorage.d.ts.map +0 -1
  932. package/dist/stores.cjs.map +0 -1
  933. package/dist/stores.mjs.map +0 -1
  934. package/dist/themes.cjs.map +0 -1
  935. package/dist/themes.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs","names":["memo","memo","React"],"sources":["../src/designs/components/Button/styles.module.css","../src/designs/components/Button/index.tsx","../src/designs/components/Dropdown/Dropdown.module.css","../src/designs/components/Dropdown/index.tsx","../src/designs/components/Icon/index.tsx","../src/designs/components/Input/styles.module.css","../src/designs/components/Input/index.tsx","../src/designs/components/KeyValueEditor/styles.module.css","../src/designs/components/KeyValueEditor/index.tsx","../src/designs/components/SearchInput/styles.module.css","../src/designs/components/SearchInput/index.tsx","../src/designs/components/ShowFilter/styles.module.css","../src/designs/components/ShowFilter/index.tsx","../src/designs/components/SlideDownSwitcher/styles.module.css","../src/designs/components/SlideDownSwitcher/index.tsx","../src/designs/components/ThemeSwitcher/index.tsx","../src/designs/components/LayoutSwitcher/index.tsx","../src/designs/components/Slider/styles.module.css","../src/designs/components/Slider/index.tsx","../src/designs/components/Suspense/styles.module.css","../src/designs/components/Suspense/SuspenseErrorBoundary.ts","../src/designs/components/Suspense/index.tsx","../src/designs/components/Textarea/styles.module.css","../src/designs/components/Textarea/index.tsx","../node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../node_modules/@tanstack/virtual-core/dist/esm/utils.js","../node_modules/@tanstack/virtual-core/dist/esm/index.js","../node_modules/@tanstack/react-virtual/dist/esm/index.js","../src/designs/components/VirtualList/styles.module.css","../src/designs/components/VirtualList/index.tsx","../src/designs/components/VirtualWindowList/styles.module.css","../src/designs/components/VirtualWindowList/index.tsx"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n border: 1px solid transparent;\n border-radius: var(--radius-button);\n font-family: inherit;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n outline: none;\n position: relative;\n}\n\n.button:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Size variants */\n.button.small {\n padding: 0.5rem 1rem;\n font-size: 0.8125rem;\n min-height: 2rem;\n}\n\n.button.medium {\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n min-height: 2.5rem;\n}\n\n.button.large {\n padding: 1rem 2rem;\n font-size: 1rem;\n min-height: 3rem;\n}\n\n/* Variant styles */\n.button.primary {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-primary-fg);\n}\n\n.button.primary:hover:not(:disabled) {\n background: var(--color-primary-light);\n border-color: var(--color-primary-light);\n transform: translateY(-1px);\n}\n\n.button.primary:active:not(:disabled) {\n transform: translateY(0);\n}\n\n.button.secondary {\n background: var(--color-bg-2);\n border-color: var(--color-border-4);\n color: var(--color-fg-text);\n}\n\n.button.secondary:hover:not(:disabled) {\n background: var(--color-bg-3);\n border-color: var(--color-primary);\n}\n\n.button.outline {\n background: transparent;\n border-color: var(--color-border-4);\n color: var(--color-fg-text);\n}\n\n.button.outline:hover:not(:disabled) {\n background: var(--color-bg-2);\n border-color: var(--color-primary);\n}\n\n.button.ghost {\n background: transparent;\n border-color: transparent;\n color: var(--color-fg-text);\n}\n\n.button.ghost:hover:not(:disabled) {\n background: var(--color-bg-2);\n}\n\n.button.danger {\n background: var(--color-danger);\n border-color: var(--color-danger);\n /* 与 Modal 等危险操作区一致:用 danger 专用前景,勿用 primary-fg(主题下易为深色) */\n color: var(--color-danger-fg, #ffffff);\n}\n\n.button.danger:hover:not(:disabled) {\n background: var(--color-danger-light);\n border-color: var(--color-danger-light);\n color: var(--color-danger-fg, #ffffff);\n transform: translateY(-1px);\n}\n\n.button.danger:active:not(:disabled) {\n transform: translateY(0);\n}\n\n/* Full width */\n.button.fullWidth {\n width: 100%;\n}\n\n/* Loading state */\n.button.loading {\n pointer-events: none;\n}\n\n.spinner {\n width: 1rem;\n height: 1rem;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: 50%;\n animation: spin 0.6s linear infinite;\n flex-shrink: 0;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.button.small .spinner {\n width: 0.875rem;\n height: 0.875rem;\n border-width: 1.5px;\n}\n\n.button.large .spinner {\n width: 1.25rem;\n height: 1.25rem;\n border-width: 2.5px;\n}\n\n.content {\n display: flex;\n align-items: center;\n}\n\n.leftIcon,\n.rightIcon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.leftIcon {\n margin-right: -0.25rem;\n}\n\n.rightIcon {\n margin-left: -0.25rem;\n}\n\n/* Icon-only (square) */\n.button.iconOnly {\n aspect-ratio: 1;\n padding: 0;\n min-width: 2.5rem;\n min-height: 2.5rem;\n}\n\n.button.iconOnly.small {\n min-width: 2rem;\n min-height: 2rem;\n}\n\n.button.iconOnly.large {\n min-width: 3rem;\n min-height: 3rem;\n}\n\n.iconContainer {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n.layout {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n width: 100%;\n}\n\n.horizontal {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n width: 100%;\n}\n\n.topIcon,\n.bottomIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.iconOnly .iconContainer .leftIcon,\n.iconOnly .iconContainer .rightIcon {\n margin: 0;\n}\n","/**\n * 按钮组件:支持 variant、size、四向图标、iconOnly、loading、fullWidth。\n * Button with variant, size, top/right/bottom/left icon, iconOnly, loading, fullWidth.\n *\n * @example\n * ```tsx\n * <Button>保存</Button>\n * <Button leftIcon={<Save size={16} />} loading={isSubmitting}>提交</Button>\n * <Button leftIcon={<Trash2 size={16} />} iconOnly aria-label=\"删除\" />\n * ```\n */\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\n\nimport { cloneElement, forwardRef, isValidElement } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"size\"> {\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"danger\";\n size?: \"small\" | \"medium\" | \"large\";\n fullWidth?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n /** 上方图标。Top icon. */\n topIcon?: ReactNode;\n /** 下方图标。Bottom icon. */\n bottomIcon?: ReactNode;\n /** 仅图标无文案。Icon only, no text. */\n iconOnly?: boolean;\n /** 图标尺寸覆盖。Override icon size. */\n iconSize?: number;\n loading?: boolean;\n children?: ReactNode;\n}\n\nfunction renderIcon(icon: ReactNode, iconSize?: number): ReactNode {\n if (!icon) return null;\n if (iconSize && isValidElement(icon) && typeof icon.type !== \"string\") {\n const existingProps = icon.props && typeof icon.props === \"object\" ? icon.props : {};\n return cloneElement(icon as React.ReactElement<{ size?: number }>, { ...existingProps, size: iconSize });\n }\n return icon;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"primary\",\n size = \"medium\",\n fullWidth = false,\n leftIcon,\n rightIcon,\n topIcon,\n bottomIcon,\n iconOnly = false,\n iconSize,\n loading = false,\n disabled,\n children,\n className = \"\",\n ...props\n },\n ref,\n ) => {\n const hasIcons = leftIcon || rightIcon || topIcon || bottomIcon;\n const hasContent = !iconOnly && children;\n const useIconOnlyLayout = iconOnly && hasIcons && !hasContent;\n const useLayout = topIcon || bottomIcon || useIconOnlyLayout;\n\n const buttonClasses = [\n styles.button,\n styles[variant],\n styles[size],\n fullWidth && styles.fullWidth,\n loading && styles.loading,\n useIconOnlyLayout && styles.iconOnly,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (useIconOnlyLayout) {\n return (\n <button ref={ref} type=\"button\" className={buttonClasses} disabled={disabled || loading} {...props}>\n <span className={styles.iconContainer}>\n {topIcon && <span className={styles.topIcon}>{renderIcon(topIcon, iconSize)}</span>}\n {leftIcon && <span className={styles.leftIcon}>{renderIcon(leftIcon, iconSize)}</span>}\n {rightIcon && <span className={styles.rightIcon}>{renderIcon(rightIcon, iconSize)}</span>}\n {bottomIcon && <span className={styles.bottomIcon}>{renderIcon(bottomIcon, iconSize)}</span>}\n </span>\n </button>\n );\n }\n\n if (useLayout) {\n return (\n <button ref={ref} type=\"button\" className={buttonClasses} disabled={disabled || loading} {...props}>\n {loading && <span className={styles.spinner} />}\n {!loading && (\n <span className={styles.layout}>\n {topIcon && <span className={styles.topIcon}>{renderIcon(topIcon, iconSize)}</span>}\n <span className={styles.horizontal}>\n {leftIcon && <span className={styles.leftIcon}>{renderIcon(leftIcon, iconSize)}</span>}\n {hasContent && <span className={styles.content}>{children}</span>}\n {rightIcon && <span className={styles.rightIcon}>{renderIcon(rightIcon, iconSize)}</span>}\n </span>\n {bottomIcon && <span className={styles.bottomIcon}>{renderIcon(bottomIcon, iconSize)}</span>}\n </span>\n )}\n </button>\n );\n }\n\n return (\n <button ref={ref} type=\"button\" className={buttonClasses} disabled={disabled || loading} {...props}>\n {loading && <span className={styles.spinner} />}\n {leftIcon && !loading && <span className={styles.leftIcon}>{renderIcon(leftIcon, iconSize)}</span>}\n {children && <span className={styles.content}>{children}</span>}\n {rightIcon && !loading && <span className={styles.rightIcon}>{renderIcon(rightIcon, iconSize)}</span>}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n","/* ===== Dropdown 基础样式 ===== */\r\n.dropdown {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n}\r\n\r\n.dropdownButton {\r\n position: relative;\r\n width: 100%;\r\n padding: 0.75rem 1rem;\r\n padding-right: 2.5rem;\r\n border: 1px solid var(--color-separator);\r\n border-radius: var(--radius-card);\r\n cursor: pointer;\r\n outline: none;\r\n transition: all 0.2s ease-in-out;\r\n text-align: left;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n font-family: inherit;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n line-height: 1.5rem;\r\n background: var(--color-bg-2);\r\n color: var(--color-fg-text);\r\n}\r\n\r\n.dropdownButton:hover:not(:disabled) {\r\n border-color: var(--color-primary);\r\n background: var(--color-bg-1);\r\n}\r\n\r\n.dropdownButton:focus {\r\n border-color: var(--color-primary);\r\n background: var(--color-bg-1);\r\n box-shadow: 0 0 0 2px var(--color-primary-transparent);\r\n}\r\n\r\n.dropdownButton.disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n background: var(--color-bg-3);\r\n}\r\n\r\n.dropdownButton.error {\r\n border-color: var(--color-danger);\r\n}\r\n\r\n.buttonText {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.chevronIcon {\r\n position: absolute;\r\n right: 1rem;\r\n transition: transform 0.15s ease;\r\n flex-shrink: 0;\r\n color: var(--color-fg-highlight);\r\n}\r\n\r\n.chevronIcon.open {\r\n transform: rotate(180deg);\r\n}\r\n\r\n/* ===== 下拉菜单 ===== */\r\n.dropdownMenu {\r\n position: absolute;\r\n top: calc(100% + 0.5rem);\r\n left: 0;\r\n right: 0;\r\n min-width: 100%;\r\n background: var(--color-bg);\r\n border: 1px solid var(--color-border-4);\r\n border-radius: var(--radius-card);\r\n box-shadow: 0 0.5rem 1rem var(--color-shadow);\r\n z-index: 1000;\r\n overflow: hidden;\r\n animation: slideDown 0.15s ease-out;\r\n}\r\n\r\n@keyframes slideDown {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-0.5rem);\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.optionsList {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0.5rem 0;\r\n}\r\n\r\n.option {\r\n padding: 0.75rem 1rem;\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n display: flex;\r\n align-items: center;\r\n color: var(--color-fg-text);\r\n font-size: 0.875rem;\r\n}\r\n\r\n.option:hover {\r\n background-color: var(--color-bg-2);\r\n}\r\n\r\n.option.selected {\r\n background-color: var(--color-bg-3);\r\n color: var(--color-fg-highlight);\r\n font-weight: 600;\r\n}\r\n\r\n/* ===== 响应式 ===== */\r\n@media (max-width: 768px) {\r\n .dropdownButton {\r\n padding: 0.625rem 0.875rem;\r\n padding-right: 2.25rem;\r\n font-size: 0.875rem;\r\n }\r\n\r\n .chevronIcon {\r\n right: 0.875rem;\r\n }\r\n\r\n .option {\r\n padding: 0.625rem 0.875rem;\r\n font-size: 0.8125rem;\r\n }\r\n}","/**\n * 下拉选择:options 为 { value, label } 列表,受控 value/onChange。Dropdown select; options as { value, label }, controlled value/onChange.\n *\n * @example\n * ```tsx\n * * 受控选择\n * const [value, setValue] = useState(\"\");\n * <Dropdown\n * options={[{ value: \"a\", label: \"选项 A\" }, { value: \"b\", label: \"选项 B\" }]}\n * value={value}\n * onChange={setValue}\n * placeholder=\"请选择\"\n * />\n * ```\n */\nimport { memo, useEffect, useRef, useState } from \"react\";\n\nimport { ChevronDown } from \"@/icons/lucide\";\n\nimport styles from \"./Dropdown.module.css\";\n\nexport interface DropdownOption {\n /** 选项值。Option value. */\n value: string;\n /** 选项展示文案。Option label. */\n label: string;\n}\n\nexport interface DropdownProps {\n /** 选项列表。Options list. */\n options: DropdownOption[];\n /** 当前选中值。Current value. */\n value: string;\n /** 选中回调。Change callback. */\n onChange: (value: string) => void;\n /** 占位符。Placeholder. */\n placeholder?: string;\n /** 是否禁用。Disabled. */\n disabled?: boolean;\n /** 是否错误态。Error state. */\n error?: boolean;\n /** 容器 className。Container className. */\n className?: string;\n}\n\nconst Dropdown = memo<DropdownProps>(({ options, value, onChange, placeholder = \"Select an option\", disabled = false, error = false, className = \"\" }) => {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // 点击外部关闭下拉菜单\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const selectedOption = options.find((option) => option.value === value);\n const displayText = selectedOption ? selectedOption.label : placeholder;\n\n const handleOptionClick = (optionValue: string) => {\n onChange(optionValue);\n setIsOpen(false);\n };\n\n return (\n <div className={`${styles.dropdown} ${className}`} ref={dropdownRef}>\n <button\n type=\"button\"\n className={`${styles.dropdownButton} ${error ? styles.error : \"\"} ${disabled ? styles.disabled : \"\"}`}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <span className={styles.buttonText}>{displayText}</span>\n <ChevronDown size={16} className={`${styles.chevronIcon} ${isOpen ? styles.open : \"\"}`} />\n </button>\n\n {isOpen && !disabled && (\n <div className={styles.dropdownMenu}>\n <ul className={styles.optionsList} role=\"listbox\">\n {options.map((option) => (\n <li\n key={option.value}\n className={`${styles.option} ${option.value === value ? styles.selected : \"\"}`}\n onClick={() => handleOptionClick(option.value)}\n role=\"option\"\n aria-selected={option.value === value}\n >\n {option.label}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n});\n\nDropdown.displayName = \"Dropdown\";\n\nexport default Dropdown;\n","/**\n * 图标组件:基于 lucide-react,通过 name 渲染对应图标。Icon component; renders lucide icon by name.\n *\n * @example\n * ```tsx\n * * 使用已注册的图标名\n * <Icon name=\"ChevronDown\" size={20} />\n * * 带 className\n * <Icon name=\"Search\" className={styles.searchIcon} />\n * ```\n */\nimport type { LucideProps } from \"lucide-react\";\n\nimport { memo } from \"react\";\n\nimport * as LucideIcons from \"@/icons/lucide\";\n\nexport type IconName = keyof Omit<typeof LucideIcons, \"LucideIcon\">;\n\nexport interface IconProps extends LucideProps {\n /** 图标名(lucide 注册名)。Icon name (lucide registered name). */\n name: IconName;\n}\n\nconst Icon = memo(({ name, ...props }: IconProps) => {\n const LucideIcon = LucideIcons[name] as React.ComponentType<LucideProps> | undefined;\n\n if (!LucideIcon) {\n console.warn(`Icon \"${name}\" not found in lucide-react`);\n return null;\n }\n\n return <LucideIcon {...props} />;\n});\n\nIcon.displayName = \"Icon\";\n\nexport default Icon;\n",".wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.wrapper.fullWidth {\n width: 100%;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--color-fg-heading);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.required {\n color: var(--color-danger);\n}\n\n.inputContainer {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.input {\n width: 100%;\n border: 1px solid var(--color-border-4);\n border-radius: var(--radius-input);\n background: var(--color-bg);\n color: var(--color-fg-text);\n font-size: 0.875rem;\n font-family: inherit;\n transition: all 0.2s ease;\n outline: none;\n}\n\n/* 隐藏浏览器默认的密码可见性切换图标 */\n/* Chrome/Edge/Safari: 隐藏密码可见性切换按钮 */\n.input[type=\"password\"]::-webkit-credentials-auto-fill-button {\n display: none !important;\n visibility: hidden !important;\n opacity: 0 !important;\n pointer-events: none !important;\n -webkit-appearance: none !important;\n appearance: none !important;\n position: absolute !important;\n left: -9999px !important;\n}\n\n.input[type=\"password\"]::-webkit-strong-password-toggle-button {\n display: none !important;\n visibility: hidden !important;\n opacity: 0 !important;\n pointer-events: none !important;\n -webkit-appearance: none !important;\n appearance: none !important;\n margin: 0 !important;\n padding: 0 !important;\n width: 0 !important;\n height: 0 !important;\n position: absolute !important;\n left: -9999px !important;\n}\n\n/* Edge 浏览器额外处理 */\n.input[type=\"password\"]::-ms-reveal,\n.input[type=\"password\"]::-ms-clear {\n display: none !important;\n visibility: hidden !important;\n opacity: 0 !important;\n pointer-events: none !important;\n width: 0 !important;\n height: 0 !important;\n position: absolute !important;\n left: -9999px !important;\n}\n\n.input:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.1);\n}\n\n.input::placeholder {\n color: var(--color-fg-muted);\n opacity: 0.5;\n}\n\n/* Size variants */\n.input.small {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n}\n\n.input.medium {\n padding: 0.75rem;\n font-size: 0.875rem;\n}\n\n.input.large {\n padding: 1rem;\n font-size: 1rem;\n}\n\n/* Variant styles */\n.input.default {\n background: var(--color-bg);\n border-color: var(--color-border-4);\n}\n\n.input.filled {\n background: var(--color-bg-2);\n border-color: var(--color-border-3);\n}\n\n/* With icons - handled via className in component */\n.inputContainer.withLeftIcon .input {\n padding-left: 2.5rem;\n}\n\n.inputContainer.withRightIcon .input {\n padding-right: 2.5rem;\n}\n\n.inputContainer.withLeftIcon .input.small {\n padding-left: 2rem;\n}\n\n.inputContainer.withRightIcon .input.small {\n padding-right: 2rem;\n}\n\n.inputContainer.withLeftIcon .input.large {\n padding-left: 3rem;\n}\n\n.inputContainer.withRightIcon .input.large {\n padding-right: 3rem;\n}\n\n.leftIcon,\n.rightIcon {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-fg-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.leftIcon {\n left: 0.75rem;\n}\n\n.rightIcon {\n right: 0.75rem;\n}\n\n.rightIcon.rightIconInteractive {\n pointer-events: auto;\n}\n\n.inputContainer.containerSmall .leftIcon {\n left: 0.5rem;\n}\n\n.inputContainer.containerSmall .rightIcon {\n right: 0.5rem;\n}\n\n.inputContainer.containerLarge .leftIcon {\n left: 1rem;\n}\n\n.inputContainer.containerLarge .rightIcon {\n right: 1rem;\n}\n\n/* Error state */\n.input.error {\n border-color: var(--color-danger);\n}\n\n.input.error:focus {\n border-color: var(--color-danger);\n box-shadow: 0 0 0 3px rgba(var(--color-danger-rgb), 0.1);\n}\n\n/* Disabled state */\n.input.disabled {\n background: var(--color-bg-3);\n border-color: var(--color-border-5);\n color: var(--color-fg-muted);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.errorMessage {\n font-size: 0.75rem;\n color: var(--color-danger);\n margin: 0;\n}\n\n.helperText {\n font-size: 0.75rem;\n color: var(--color-fg-muted);\n margin: 0;\n}\n","/**\n * 输入框:支持 label、error、helperText、左右图标与 rightIconInteractive。Input with label, error, helperText, left/right icon.\n *\n * @example\n * ```tsx\n * * 带标签与错误态\n * <Input label=\"用户名\" error={errors.name} value={name} onChange={(e) => setName(e.target.value)} />\n * * 右侧可点击图标(如清除)\n * <Input rightIcon={<X size={16} />} rightIconInteractive onRightIconClick={clear} />\n * ```\n */\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\n\nimport { forwardRef } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n /** 标签文案。Label text. */\n label?: ReactNode;\n /** 错误信息。Error message. */\n error?: ReactNode;\n /** 辅助说明。Helper text. */\n helperText?: ReactNode;\n /** 左侧图标。Left icon. */\n leftIcon?: ReactNode;\n /** 右侧图标。Right icon. */\n rightIcon?: ReactNode;\n /** 为 true 时 rightIcon 可点击(如密码切换、清除按钮)。When true, right icon is clickable (e.g. password toggle, clear). */\n rightIconInteractive?: boolean;\n /** 尺寸。Size. */\n size?: \"small\" | \"medium\" | \"large\";\n /** 视觉变体。Variant. */\n variant?: \"default\" | \"filled\";\n /** 是否占满宽度。Full width. */\n fullWidth?: boolean;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n rightIconInteractive = false,\n size = \"medium\",\n variant = \"default\",\n fullWidth = false,\n className = \"\",\n disabled,\n ...props\n },\n ref,\n ) => {\n const inputClasses = [styles.input, styles[size], styles[variant], error && styles.error, disabled && styles.disabled, className].filter(Boolean).join(\" \");\n\n const wrapperClasses = [styles.wrapper, fullWidth && styles.fullWidth].filter(Boolean).join(\" \");\n\n const containerClasses = [\n styles.inputContainer,\n leftIcon && styles.withLeftIcon,\n rightIcon && styles.withRightIcon,\n size && styles[`container${size.charAt(0).toUpperCase() + size.slice(1)}`],\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperClasses}>\n {label && (\n <label className={styles.label}>\n {label}\n {props.required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={containerClasses}>\n {leftIcon && <div className={styles.leftIcon}>{leftIcon}</div>}\n <input ref={ref} className={inputClasses} disabled={disabled} {...props} />\n {rightIcon && <div className={`${styles.rightIcon} ${rightIconInteractive ? styles.rightIconInteractive : \"\"}`}>{rightIcon}</div>}\n </div>\n {error && <p className={styles.errorMessage}>{error}</p>}\n {helperText && !error && <p className={styles.helperText}>{helperText}</p>}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n\nexport default Input;\n",".container {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--color-fg-text);\n}\n\n.error {\n font-size: 0.875rem;\n color: var(--color-error);\n}\n\n.pairs {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.pair {\n display: grid;\n grid-template-columns: 1fr 2fr auto;\n gap: 0.75rem;\n align-items: start;\n}\n\n.keyInput,\n.valueInput {\n flex: 1;\n}\n\n.removeButton {\n padding: 0.5rem;\n min-width: auto;\n color: var(--color-error);\n}\n\n.removeButton:hover {\n background-color: var(--color-error);\n color: var(--color-primary-fg);\n}\n\n.addButton {\n align-self: flex-start;\n}\n\n@media (max-width: 768px) {\n .pair {\n grid-template-columns: 1fr;\n }\n\n .removeButton {\n align-self: flex-end;\n }\n}\n","/**\n * 键值对编辑器:动态增删 key-value 行,支持 string 或 array 值类型。Key-value pair editor; add/remove rows, valueType string or array.\n *\n * @example\n * ```tsx\n * * 字符串值\n * const [pairs, setPairs] = useState<KeyValuePair[]>([{ key: \"env\", value: \"prod\" }]);\n * <KeyValueEditor label=\"环境变量\" pairs={pairs} onChange={setPairs} />\n * * 数组值(逗号分隔)\n * <KeyValueEditor label=\"标签\" pairs={pairs} onChange={setPairs} valueType=\"array\" />\n * ```\n */\nimport type { ReactNode } from \"react\";\n\nimport { memo, useEffect, useState } from \"react\";\n\nimport Button from \"@/designs/components/Button\";\nimport Input from \"@/designs/components/Input\";\nimport { Plus, Trash2 } from \"@/icons/lucide\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface KeyValuePair {\n /** 键。Key. */\n key: string;\n /** 值(字符串或字符串数组)。Value (string or string[]). */\n value: string | string[];\n}\n\nexport interface KeyValueEditorProps {\n /** 表单项标签。Field label. */\n label: ReactNode;\n /** 键值对列表。Key-value pairs. */\n pairs: KeyValuePair[];\n /** 列表变化回调。Change callback. */\n onChange: (pairs: KeyValuePair[]) => void;\n /** 值类型:string 或 array。Value type: string or array. */\n valueType?: \"string\" | \"array\";\n /** 键占位符。Key placeholder. */\n keyPlaceholder?: string;\n /** 值占位符(string 模式)。Value placeholder (string mode). */\n valuePlaceholder?: string;\n /** 值占位符(array 模式)。Value placeholder (array mode). */\n valueArrayPlaceholder?: string;\n /** 删除按钮 aria-label。Remove button aria-label. */\n removeAriaLabel?: string;\n /** 新增按钮文案。Add button label. */\n addLabel?: ReactNode;\n /** 错误信息。Error message. */\n error?: ReactNode;\n}\n\nconst KeyValueEditor = memo(\n ({\n label,\n pairs,\n onChange,\n valueType = \"string\",\n keyPlaceholder = \"Key\",\n valuePlaceholder = \"Value\",\n valueArrayPlaceholder = \"Value (comma-separated)\",\n removeAriaLabel = \"Remove row\",\n addLabel = \"Add\",\n error,\n }: KeyValueEditorProps) => {\n const effectiveValuePlaceholder = valueType === \"array\" ? valueArrayPlaceholder : valuePlaceholder;\n const [localPairs, setLocalPairs] = useState<KeyValuePair[]>(pairs);\n\n // Sync with external pairs changes\n useEffect(() => {\n setLocalPairs(pairs);\n }, [pairs]);\n\n const handleAdd = () => {\n const newPairs = [...localPairs, { key: \"\", value: valueType === \"array\" ? [] : \"\" }];\n setLocalPairs(newPairs);\n onChange(newPairs);\n };\n\n const handleRemove = (index: number) => {\n const newPairs = localPairs.filter((_, i) => i !== index);\n setLocalPairs(newPairs);\n onChange(newPairs);\n };\n\n const handleKeyChange = (index: number, key: string) => {\n const newPairs = [...localPairs];\n newPairs[index] = { ...newPairs[index], key };\n setLocalPairs(newPairs);\n onChange(newPairs);\n };\n\n const handleValueChange = (index: number, value: string) => {\n const newPairs = [...localPairs];\n if (valueType === \"array\") {\n // Split by comma and trim\n const arrayValue = value\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n newPairs[index] = { ...newPairs[index], value: arrayValue };\n } else {\n newPairs[index] = { ...newPairs[index], value };\n }\n setLocalPairs(newPairs);\n onChange(newPairs);\n };\n\n const getDisplayValue = (value: string | string[]): string => {\n if (Array.isArray(value)) {\n return value.join(\", \");\n }\n return value;\n };\n\n return (\n <div className={styles.container}>\n <label className={styles.label}>{label}</label>\n {error && <div className={styles.error}>{error}</div>}\n <div className={styles.pairs}>\n {localPairs.map((pair, index) => (\n <div key={index} className={styles.pair}>\n <Input placeholder={keyPlaceholder} value={pair.key} onChange={(e) => handleKeyChange(index, e.target.value)} className={styles.keyInput} />\n <Input\n placeholder={effectiveValuePlaceholder}\n value={getDisplayValue(pair.value)}\n onChange={(e) => handleValueChange(index, e.target.value)}\n className={styles.valueInput}\n />\n <Button type=\"button\" variant=\"ghost\" onClick={() => handleRemove(index)} className={styles.removeButton} aria-label={removeAriaLabel}>\n <Trash2 size={16} />\n </Button>\n </div>\n ))}\n </div>\n <Button type=\"button\" variant=\"secondary\" onClick={handleAdd} className={styles.addButton}>\n <Plus size={16} />\n {addLabel}\n </Button>\n </div>\n );\n },\n);\n\nKeyValueEditor.displayName = \"KeyValueEditor\";\n\nexport default KeyValueEditor;\n",".searchContainer {\r\n position: relative;\r\n width: 100%;\r\n max-width: 400px;\r\n}\r\n\r\n/** 占满父级(如 dialog / modal 内容区),不受 400px 上限 */\r\n.searchContainerFull {\r\n max-width: none;\r\n}\r\n\r\n.searchIcon {\r\n position: absolute;\r\n left: 1rem;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--color-fg-muted);\r\n pointer-events: none;\r\n}\r\n\r\n.searchInput {\r\n width: 100%;\r\n padding: 0.75rem 3rem 0.75rem 3rem;\r\n border: 1px solid var(--color-border);\r\n border-radius: var(--radius-input);\r\n font-size: 1rem;\r\n color: var(--color-fg-text);\r\n background: var(--color-bg-2);\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.searchInput:focus {\r\n outline: none;\r\n border-color: var(--color-primary);\r\n box-shadow: 0 0 0 3px var(--color-primary-bg);\r\n}\r\n\r\n.searchInput::placeholder {\r\n color: var(--color-fg-muted);\r\n}\r\n\r\n.clearBtn {\r\n position: absolute;\r\n right: 0.75rem;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 1.5rem;\r\n height: 1.5rem;\r\n padding: 0;\r\n background: none;\r\n border: none;\r\n color: var(--color-fg-muted);\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.clearBtn:hover {\r\n color: var(--color-fg-text);\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .searchContainer {\r\n max-width: 100%;\r\n }\r\n}\r\n\r\n","/**\n * 搜索输入框:带搜索图标与清除按钮;文案由调用方传入。Search input with search icon and clear button; labels passed as props.\n *\n * @example\n * ```tsx\n * * 受控,文案由上层 i18n 传入\n * const { t } = useTranslation(\"components\");\n * <SearchInput value={keyword} onChange={setKeyword} placeholder={t(\"searchInput.placeholder\")} clearButtonAriaLabel={t(\"searchInput.clearSearch\")} />\n * ```\n */\nimport { memo } from \"react\";\n\nimport { Search, X } from \"@/icons/lucide\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface SearchInputProps {\n /** 当前输入值。Current value. */\n value: string;\n /** 值变化回调。Change callback. */\n onChange: (value: string) => void;\n /** 占位符,由调用方传入。Placeholder; pass from caller. */\n placeholder?: string;\n /** 清除按钮 aria-label;由调用方传入(可来自 i18n)。Clear button aria-label; pass from caller. */\n clearButtonAriaLabel?: string;\n /** 为 true 时占满父级宽度并去掉 400px 上限(如模态内);列表顶栏保持默认。 */\n fullWidth?: boolean;\n}\n\nconst SearchInput = memo(\n ({ value, onChange, placeholder, clearButtonAriaLabel = \"Clear search\", fullWidth = false }: SearchInputProps) => {\n const handleClear = () => onChange(\"\");\n\n return (\n <div className={`${styles.searchContainer} ${fullWidth ? styles.searchContainerFull : \"\"}`.trim()}>\n <Search size={18} className={styles.searchIcon} />\n <input type=\"text\" value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} className={styles.searchInput} />\n {value && (\n <button onClick={handleClear} className={styles.clearBtn} aria-label={clearButtonAriaLabel}>\n <X size={16} />\n </button>\n )}\n </div>\n );\n },\n);\n\nSearchInput.displayName = \"SearchInput\";\n\nexport default SearchInput;\n",".container {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.75rem;\r\n}\r\n\r\n.toggleContainer {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.toggleButton {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.5rem 1rem;\r\n border: 1px solid var(--color-border-4);\r\n border-radius: var(--radius-button);\r\n background: var(--color-bg);\r\n color: var(--color-fg-muted);\r\n font-size: 0.875rem;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.toggleButton:hover {\r\n background: var(--color-bg-2);\r\n border-color: var(--color-border-3);\r\n}\r\n\r\n.toggleButton.enabled {\r\n background: var(--color-primary);\r\n color: var(--color-primary-fg);\r\n border-color: var(--color-primary);\r\n}\r\n\r\n.toggleButton.enabled:hover {\r\n background: var(--color-primary-hover);\r\n border-color: var(--color-primary-hover);\r\n color: var(--color-primary-fg);\r\n}\r\n\r\n.optionsContainer {\r\n display: flex;\r\n gap: 0.5rem;\r\n padding: 0.5rem;\r\n background: var(--color-bg-2);\r\n border-radius: var(--radius-card);\r\n border: 1px solid var(--color-border-4);\r\n}\r\n\r\n.option {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.375rem;\r\n padding: 0.5rem 0.875rem;\r\n border: 1px solid var(--color-border-4);\r\n border-radius: var(--radius-button);\r\n background: var(--color-bg);\r\n color: var(--color-fg);\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n flex: 1;\r\n justify-content: center;\r\n}\r\n\r\n.option:hover {\r\n background: var(--color-bg-3);\r\n border-color: var(--color-border-3);\r\n}\r\n\r\n.option.active {\r\n background: var(--color-primary);\r\n color: var(--color-primary-fg);\r\n border-color: var(--color-primary);\r\n}\r\n\r\n.option.active:hover {\r\n background: var(--color-primary-hover);\r\n border-color: var(--color-primary-hover);\r\n color: var(--color-primary-fg);\r\n}\r\n\r\n","/**\n * 显示/隐藏筛选器:开关 + 全部/显示/隐藏选项;文案由调用方传入。Show/hide filter; labels passed as props.\n *\n * @example\n * ```tsx\n * * 受控,不传文案则用默认英文;可传 i18n\n * <ShowFilter value={filter} onChange={setFilter} />\n * <ShowFilter value={filter} onChange={setFilter} all={t(\"showFilter.all\")} show={t(\"showFilter.show\")} hide={t(\"showFilter.hide\")} />\n * ```\n */\nimport type { ReactNode } from \"react\";\n\nimport { memo } from \"react\";\n\nimport { Eye, EyeOff, Filter } from \"@/icons/lucide\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface ShowFilterValue {\n /** 筛选是否启用。Whether filter is enabled. */\n enabled: boolean;\n /** 显示/隐藏:null=全部,true=显示,false=隐藏。Show/hide: null=all, true=show, false=hide. */\n value: boolean | null;\n}\n\nexport interface ShowFilterProps {\n /** 当前值。Current value. */\n value: ShowFilterValue;\n /** 值变化回调。Change callback. */\n onChange: (value: ShowFilterValue) => void;\n /** 筛选开启时的按钮文案。Label when filter enabled. */\n filterEnabled?: ReactNode;\n /** 筛选关闭时的按钮文案。Label when filter disabled. */\n filterDisabled?: ReactNode;\n /** 开启筛选按钮的 aria-label。Aria-label for enable filter button. */\n enableFilterAriaLabel?: string;\n /** 关闭筛选按钮的 aria-label。Aria-label for disable filter button. */\n disableFilterAriaLabel?: string;\n /** 「全部」选项文案。Label for \"all\" option. */\n all?: ReactNode;\n /** 「显示」选项文案。Label for \"show\" option. */\n show?: ReactNode;\n /** 「隐藏」选项文案。Label for \"hide\" option. */\n hide?: ReactNode;\n}\n\nconst ShowFilter = memo(\n ({\n value,\n onChange,\n filterEnabled = \"Filter on\",\n filterDisabled = \"Filter\",\n enableFilterAriaLabel = \"Enable filter\",\n disableFilterAriaLabel = \"Disable filter\",\n all = \"All\",\n show = \"Show\",\n hide = \"Hide\",\n }: ShowFilterProps) => {\n const handleToggleEnabled = () => {\n onChange({ ...value, enabled: !value.enabled });\n };\n\n const handleSelectValue = (filterValue: boolean | null) => {\n onChange({ ...value, value: filterValue });\n };\n\n return (\n <div className={styles.container}>\n <div className={styles.toggleContainer}>\n <button\n type=\"button\"\n className={`${styles.toggleButton} ${value.enabled ? styles.enabled : \"\"}`}\n onClick={handleToggleEnabled}\n aria-label={value.enabled ? disableFilterAriaLabel : enableFilterAriaLabel}\n >\n <Filter size={16} />\n <span>{value.enabled ? filterEnabled : filterDisabled}</span>\n </button>\n </div>\n\n {value.enabled && (\n <div className={styles.optionsContainer}>\n <button type=\"button\" className={`${styles.option} ${value.value === null ? styles.active : \"\"}`} onClick={() => handleSelectValue(null)}>\n {all}\n </button>\n <button type=\"button\" className={`${styles.option} ${value.value === true ? styles.active : \"\"}`} onClick={() => handleSelectValue(true)}>\n <Eye size={16} />\n <span>{show}</span>\n </button>\n <button type=\"button\" className={`${styles.option} ${value.value === false ? styles.active : \"\"}`} onClick={() => handleSelectValue(false)}>\n <EyeOff size={16} />\n <span>{hide}</span>\n </button>\n </div>\n )}\n </div>\n );\n },\n);\n\nShowFilter.displayName = \"ShowFilter\";\n\nexport default ShowFilter;\n","/* ===== Nebular Select 样式模仿(下拉滑出) ===== */\n\n.nbSelect {\n display: inline-block;\n position: relative;\n font-family: inherit;\n font-size: 0.9375rem;\n line-height: 1.5rem;\n font-weight: 600;\n}\n\n.selectButton {\n position: relative;\n width: 100%;\n min-width: 8rem;\n padding: 0.4375rem 2.2rem 0.4375rem 1.125rem;\n border: 1px solid;\n border-radius: var(--radius-button);\n cursor: pointer;\n outline: none;\n transition: all 0.15s ease-in-out;\n text-align: left;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n.selectButton.primary {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-primary-fg);\n}\n\n.selectButton.primary:hover:not(:disabled) {\n background-color: var(--color-primary-light);\n border-color: var(--color-primary-light);\n}\n\n.selectButton.primary:focus,\n.selectButton.primary.open {\n background-color: var(--color-primary-light);\n border-color: var(--color-primary-light);\n box-shadow: 0 0 0 0.125rem rgba(var(--color-primary-rgb), 0.25);\n}\n\n.selectButton.default {\n background-color: var(--color-bg);\n border-color: var(--color-border-4);\n color: var(--color-fg-text);\n}\n\n.selectButton.default:hover:not(:disabled) {\n background-color: var(--color-bg-2);\n border-color: var(--color-primary);\n}\n\n.selectButton.default:focus,\n.selectButton.default.open {\n background-color: var(--color-bg-2);\n border-color: var(--color-primary);\n box-shadow: 0 0 0 0.125rem rgba(var(--color-primary-rgb), 0.25);\n}\n\n.selectButton:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.buttonText {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.chevronIcon {\n position: absolute;\n right: 0.41rem;\n width: 1.5rem;\n height: 1.5rem;\n transition: transform 0.15s ease;\n flex-shrink: 0;\n}\n\n.selectButton.primary .chevronIcon {\n color: var(--color-primary-fg);\n}\n\n.selectButton.default .chevronIcon {\n color: var(--color-fg);\n}\n\n.chevronIcon.open {\n transform: rotate(180deg);\n}\n\n.optionsPanel {\n position: absolute;\n top: calc(100% + 0.5rem);\n left: 0;\n right: 0;\n min-width: 100%;\n background-color: var(--color-bg);\n border: 1px solid var(--color-border-4);\n border-radius: var(--radius-button);\n box-shadow: 0 0.5rem 1rem var(--color-shadow);\n z-index: 1000;\n overflow: hidden;\n transform-origin: top;\n visibility: hidden;\n pointer-events: none;\n}\n\n.optionsPanel.open {\n visibility: visible;\n pointer-events: auto;\n animation: expandDown 0.25s ease-out;\n}\n\n.optionsPanel.closed {\n visibility: hidden;\n pointer-events: none;\n animation: collapseUp 0.25s ease-out;\n}\n\n@keyframes expandDown {\n from {\n opacity: 0;\n transform: scaleY(0);\n }\n to {\n opacity: 1;\n transform: scaleY(1);\n }\n}\n\n@keyframes collapseUp {\n from {\n opacity: 1;\n transform: scaleY(1);\n }\n to {\n opacity: 0;\n transform: scaleY(0);\n }\n}\n\n.optionsPanel.primary {\n border-color: var(--color-primary);\n}\n\n.optionsPanel.default {\n border-color: var(--color-border-4);\n}\n\n.optionsList {\n list-style: none;\n margin: 0;\n padding: 0.5rem 0;\n}\n\n.option {\n padding: 0.75rem 1.125rem;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--color-fg-text);\n}\n\n.option:hover {\n background-color: var(--color-bg-2);\n}\n\n.option.selected {\n background-color: var(--color-primary);\n color: var(--color-primary-fg);\n font-weight: 700;\n}\n\n@media (prefers-color-scheme: dark) {\n .optionsPanel {\n box-shadow: 0 0.5rem 1rem var(--color-shadow);\n }\n}\n","/**\n * 下滑切换器:选项列表下拉选择,支持泛型 T(如 enum)。Dropdown switcher with options; generic T (e.g. enum).\n *\n * @example\n * ```tsx\n * * 与 enum 配合\n * type Status = \"all\" | \"active\" | \"archived\";\n * <SlideDownSwitcher<Status>\n * value={filter}\n * options={[\"all\", \"active\", \"archived\"]}\n * getDisplayName={(v) => ({ all: \"全部\", active: \"启用\", archived: \"归档\" }[v])}\n * onChange={setFilter}\n * />\n * ```\n */\nimport { memo, useEffect, useRef, useState } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface SlideDownSwitcherProps<T extends string> {\n /** 当前选中的值(enum 或 string) */\n value: T;\n /** 可选项列表(如 Object.values(SomeEnum)) */\n options: readonly T[];\n /** 选项展示文案 */\n getDisplayName: (value: T) => string;\n /** 选中后回调 */\n onChange: (value: T) => void;\n status?: \"primary\" | \"default\";\n}\n\nconst SlideDownSwitcherInner = <T extends string>({ value, options, getDisplayName, onChange, status = \"primary\" }: SlideDownSwitcherProps<T>) => {\n const [isOpen, setIsOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleSelect = (option: T) => {\n onChange(option);\n setIsOpen(false);\n };\n\n return (\n <div className={styles.nbSelect} ref={wrapperRef}>\n <button\n type=\"button\"\n className={`${styles.selectButton} ${styles[status]}`}\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <span className={styles.buttonText}>{getDisplayName(value)}</span>\n <svg\n className={`${styles.chevronIcon} ${isOpen ? styles.open : \"\"}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"m6 9 6 6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n\n <div className={`${styles.optionsPanel} ${styles[status]} ${isOpen ? styles.open : styles.closed}`} role=\"listbox\">\n <ul className={styles.optionsList}>\n {options.map((option) => (\n <li\n key={option}\n className={`${styles.option} ${option === value ? styles.selected : \"\"}`}\n onClick={() => handleSelect(option)}\n role=\"option\"\n aria-selected={option === value}\n >\n <span>{getDisplayName(option)}</span>\n {option === value && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M20 6L9 17l-5-5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n};\n\nconst SlideDownSwitcher = memo(SlideDownSwitcherInner) as typeof SlideDownSwitcherInner & {\n displayName?: string;\n};\nSlideDownSwitcher.displayName = \"SlideDownSwitcher\";\n\nexport default SlideDownSwitcher;\n","import type { ThemeEnum, ThemeSwitcherProps } from \"@/themes/types\";\n\nimport { memo } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport SlideDownSwitcher from \"../SlideDownSwitcher\";\n\nconst ThemeSwitcher = memo(({ status = \"primary\", getThemeDisplayName, handleChangeTheme }: ThemeSwitcherProps) => {\n const { themeName, setTheme, availableThemes } = useTheme();\n\n const getDisplayName = getThemeDisplayName ?? ((theme: ThemeEnum) => theme);\n\n const handleChange = (theme: ThemeEnum) => {\n setTheme(theme);\n handleChangeTheme?.(theme);\n };\n\n return <SlideDownSwitcher value={themeName} options={availableThemes} getDisplayName={getDisplayName} onChange={handleChange} status={status} />;\n});\n\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n\nexport default ThemeSwitcher;\n","import type { LayoutSwitcherProps } from \"@/designs/layouts/types\";\n\nimport { memo } from \"react\";\n\nimport useLayout from \"@/designs/layouts/hooks/useLayout\";\nimport { LAYOUT_MODE_VALUES, LayoutModeEnum } from \"@/designs/layouts/types\";\n\nimport SlideDownSwitcher from \"../SlideDownSwitcher\";\n\nconst LayoutSwitcher = memo(({ status = \"primary\", getLayoutDisplayName, handleChangeLayoutMode }: LayoutSwitcherProps) => {\n const { layoutMode, setLayoutMode } = useLayout();\n\n const getDisplayName = getLayoutDisplayName ?? ((mode: LayoutModeEnum) => mode);\n\n const handleChange = (mode: LayoutModeEnum) => {\n setLayoutMode(mode);\n handleChangeLayoutMode?.(mode);\n };\n\n return <SlideDownSwitcher value={layoutMode} options={LAYOUT_MODE_VALUES} getDisplayName={getDisplayName} onChange={handleChange} status={status} />;\n});\n\nLayoutSwitcher.displayName = \"LayoutSwitcher\";\n\nexport default LayoutSwitcher;\n",".sliderContainer {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.sliderContainer.fullWidth {\n width: 100%;\n}\n\n.labelRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n min-height: 1.5rem;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--color-fg-text);\n}\n\n.required {\n color: var(--color-danger);\n margin-left: 0.25rem;\n}\n\n.sliderWrapper {\n display: flex;\n width: 100%;\n touch-action: none;\n user-select: none;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n}\n\n.sliderRoot {\n position: relative;\n display: flex;\n width: 100%;\n flex-grow: 1;\n cursor: grab;\n touch-action: none;\n user-select: none;\n align-items: center;\n padding: 0.75rem 0;\n}\n\n.sliderRoot:active {\n cursor: grabbing;\n}\n\n.sliderTrackWrapper {\n display: flex;\n flex-grow: 1;\n position: relative;\n}\n\n.sliderTrack {\n position: relative;\n height: 0.375rem;\n width: 100%;\n overflow: hidden;\n border-radius: var(--radius-badge);\n background-color: var(--color-bg-3);\n}\n\n.sliderRange {\n position: absolute;\n height: 100%;\n background-color: var(--color-primary);\n border-radius: var(--radius-badge);\n}\n\n.valueIndicator {\n color: var(--color-primary);\n font-size: 0.875rem;\n font-weight: 600;\n min-width: 2rem;\n text-align: center;\n flex-shrink: 0;\n line-height: 1;\n}\n\n.iconWrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon {\n width: 20px;\n height: 20px;\n color: var(--color-fg-muted);\n}\n\n.errorMessage {\n font-size: 0.75rem;\n color: var(--color-danger);\n margin: 0;\n}\n\n.helperText {\n font-size: 0.75rem;\n color: var(--color-fg-muted);\n margin: 0;\n}\n","/**\n * 滑块:受控 value/onChange,支持 min/max/step、label、error、overflow 动效。Slider; controlled value/onChange, min/max/step, label, error.\n *\n * @example\n * ```tsx\n * * 基础\n * <Slider value={volume} onChange={setVolume} min={0} max={100} />\n * * 带标签与辅助文案\n * <Slider label=\"音量\" value={volume} onChange={setVolume} showValue helperText=\"0-100\" />\n * ```\n */\nimport type { ReactNode } from \"react\";\n\nimport { forwardRef, memo, useEffect, useRef, useState } from \"react\";\nimport { animate, motion, useMotionValue, useMotionValueEvent, useTransform } from \"motion/react\";\n\nimport { ChevronLeft, ChevronRight } from \"@/icons/lucide\";\n\nimport styles from \"./styles.module.css\";\n\nconst MAX_OVERFLOW = 50;\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** 当前值。Current value. */\n value: number;\n /** 值变化回调。Change callback. */\n onChange: (value: number) => void;\n /** 最小值。Minimum. */\n min?: number;\n /** 最大值。Maximum. */\n max?: number;\n /** 步长。Step. */\n step?: number;\n /** 是否显示数值。Show value. */\n showValue?: boolean;\n /** 是否占满宽度。Full width. */\n fullWidth?: boolean;\n /** 标签文案。Label text. */\n label?: ReactNode;\n /** 错误信息。Error message. */\n error?: ReactNode;\n /** 辅助说明。Helper text. */\n helperText?: ReactNode;\n /** 是否必填。Required. */\n required?: boolean;\n}\n\nconst Slider = memo(\n forwardRef<HTMLDivElement, SliderProps>(\n (\n {\n value: controlledValue,\n onChange,\n min = 0,\n max = 10,\n step = 1,\n showValue = true,\n fullWidth = false,\n label,\n error,\n helperText,\n required = false,\n className = \"\",\n ...props\n },\n ref,\n ) => {\n const [value, setValue] = useState<number>(controlledValue);\n const sliderRef = useRef<HTMLDivElement>(null);\n const [region, setRegion] = useState<\"left\" | \"middle\" | \"right\">(\"middle\");\n const clientX = useMotionValue(0);\n const overflow = useMotionValue(0);\n\n useEffect(() => {\n setValue(controlledValue);\n }, [controlledValue]);\n\n useMotionValueEvent(clientX, \"change\", (latest: number) => {\n if (sliderRef.current) {\n const { left, right } = sliderRef.current.getBoundingClientRect();\n let newValue: number;\n if (latest < left) {\n setRegion(\"left\");\n newValue = left - latest;\n } else if (latest > right) {\n setRegion(\"right\");\n newValue = latest - right;\n } else {\n setRegion(\"middle\");\n newValue = 0;\n }\n overflow.jump(decay(newValue, MAX_OVERFLOW));\n }\n });\n\n const handlePointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.buttons > 0 && sliderRef.current) {\n const { left, width } = sliderRef.current.getBoundingClientRect();\n let newValue = min + ((e.clientX - left) / width) * (max - min);\n if (step > 0) {\n newValue = Math.round(newValue / step) * step;\n }\n newValue = Math.min(Math.max(newValue, min), max);\n setValue(newValue);\n onChange(newValue);\n clientX.jump(e.clientX);\n }\n };\n\n const handlePointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n handlePointerMove(e);\n e.currentTarget.setPointerCapture(e.pointerId);\n };\n\n const handlePointerUp = () => {\n animate(overflow, 0, { type: \"spring\", bounce: 0.5 });\n };\n\n const getRangePercentage = (): number => {\n const totalRange = max - min;\n if (totalRange === 0) return 0;\n return ((value - min) / totalRange) * 100;\n };\n\n const wrapperClasses = [styles.sliderContainer, fullWidth && styles.fullWidth, className].filter(Boolean).join(\" \");\n\n return (\n <div ref={ref} className={wrapperClasses} {...props}>\n {label && (\n <div className={styles.labelRow}>\n <label className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n </div>\n )}\n <motion.div className={styles.sliderWrapper}>\n <motion.div\n animate={{\n scale: region === \"left\" ? [1, 1.4, 1] : 1,\n transition: { duration: 0.25 },\n }}\n style={{\n x: useTransform(() => (region === \"left\" ? -overflow.get() : 0)),\n }}\n className={styles.iconWrapper}\n >\n <ChevronLeft size={20} className={styles.icon} />\n </motion.div>\n\n <div\n ref={sliderRef}\n className={styles.sliderRoot}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n >\n <motion.div\n style={{\n scaleX: useTransform(() => {\n if (sliderRef.current) {\n const { width } = sliderRef.current.getBoundingClientRect();\n return 1 + overflow.get() / width;\n }\n return 1;\n }),\n scaleY: useTransform(overflow, [0, MAX_OVERFLOW], [1, 0.8]),\n transformOrigin: useTransform(() => {\n if (sliderRef.current) {\n const { left, width } = sliderRef.current.getBoundingClientRect();\n return clientX.get() < left + width / 2 ? \"right\" : \"left\";\n }\n return \"center\";\n }),\n }}\n className={styles.sliderTrackWrapper}\n >\n <div className={styles.sliderTrack}>\n <motion.div\n className={styles.sliderRange}\n initial={false}\n animate={{ width: `${getRangePercentage()}%` }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n />\n </div>\n </motion.div>\n </div>\n\n <motion.div\n animate={{\n scale: region === \"right\" ? [1, 1.4, 1] : 1,\n transition: { duration: 0.25 },\n }}\n style={{\n x: useTransform(() => (region === \"right\" ? overflow.get() : 0)),\n }}\n className={styles.iconWrapper}\n >\n <ChevronRight size={20} className={styles.icon} />\n </motion.div>\n {showValue && !label && <span className={styles.valueIndicator}>{Math.round(value)}</span>}\n </motion.div>\n {error && <p className={styles.errorMessage}>{error}</p>}\n {helperText && !error && <p className={styles.helperText}>{helperText}</p>}\n </div>\n );\n },\n ),\n);\n\nfunction decay(value: number, max: number): number {\n if (max === 0) {\n return 0;\n }\n const entry = value / max;\n const sigmoid = 2 * (1 / (1 + Math.exp(-entry)) - 0.5);\n return sigmoid * max;\n}\n\nSlider.displayName = \"Slider\";\n\nexport default Slider;\n",".loadingContainer {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 60vh;\r\n gap: 1.5rem;\r\n}\r\n\r\n.loadingText {\r\n color: var(--color-fg-muted);\r\n font-size: 1rem;\r\n}\r\n\r\n.errorContainer {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 60vh;\r\n gap: 2rem;\r\n padding: 3rem 2rem;\r\n text-align: center;\r\n color: var(--color-fg-text);\r\n}\r\n\r\n.errorIconWrapper {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 120px;\r\n height: 120px;\r\n border-radius: 50%;\r\n background: linear-gradient(135deg, rgba(var(--color-error-rgb), 0.1), rgba(var(--color-error-rgb), 0.05));\r\n border: 2px solid rgba(var(--color-error-rgb), 0.2);\r\n animation: pulse 2s ease-in-out infinite;\r\n}\r\n\r\n@keyframes pulse {\r\n 0%, 100% {\r\n transform: scale(1);\r\n opacity: 1;\r\n }\r\n 50% {\r\n transform: scale(1.05);\r\n opacity: 0.9;\r\n }\r\n}\r\n\r\n.errorIcon {\r\n color: var(--color-error);\r\n stroke-width: 1.5;\r\n}\r\n\r\n.errorContent {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 1rem;\r\n max-width: 600px;\r\n width: 100%;\r\n}\r\n\r\n.errorTitle {\r\n margin: 0;\r\n font-size: 1.75rem;\r\n font-weight: 700;\r\n color: var(--color-fg-heading);\r\n letter-spacing: -0.02em;\r\n line-height: 1.2;\r\n}\r\n\r\n.errorDescription {\r\n margin: 0;\r\n color: var(--color-fg-muted);\r\n font-size: 1rem;\r\n line-height: 1.6;\r\n max-width: 480px;\r\n}\r\n\r\n.errorDetailsWrapper {\r\n width: 100%;\r\n max-width: 600px;\r\n margin-top: 0.5rem;\r\n}\r\n\r\n.errorDetailsContainer {\r\n width: 100%;\r\n text-align: left;\r\n border: 1px solid var(--color-border);\r\n border-radius: var(--radius-card);\r\n background: var(--color-bg-2);\r\n overflow: hidden;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.errorDetailsContainer:hover {\r\n border-color: var(--color-border-hover);\r\n background: var(--color-bg-3);\r\n}\r\n\r\n.errorDetailsSummary {\r\n padding: 0.875rem 1.25rem;\r\n cursor: pointer;\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: var(--color-fg-muted);\r\n user-select: none;\r\n list-style: none;\r\n transition: color 0.2s ease;\r\n}\r\n\r\n.errorDetailsSummary:hover {\r\n color: var(--color-fg-text);\r\n}\r\n\r\n.errorDetailsSummary::-webkit-details-marker {\r\n display: none;\r\n}\r\n\r\n.errorDetailsSummary::before {\r\n content: \"▶\";\r\n display: inline-block;\r\n margin-right: 0.5rem;\r\n font-size: 0.75rem;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.errorDetailsContainer[open] .errorDetailsSummary::before {\r\n transform: rotate(90deg);\r\n}\r\n\r\n.errorDetails {\r\n max-width: 100%;\r\n padding: 1rem 1.25rem;\r\n margin: 0;\r\n background: var(--color-bg-3);\r\n border-top: 1px solid var(--color-border);\r\n color: var(--color-fg-muted);\r\n font-size: 0.8125rem;\r\n font-family: \"Monaco\", \"Menlo\", \"Ubuntu Mono\", \"Consolas\", \"source-code-pro\", monospace;\r\n line-height: 1.6;\r\n overflow-x: auto;\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n.errorActions {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n margin-top: 1rem;\r\n}\r\n\r\n.retryButton {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 0.5rem;\r\n padding: 0.75rem 2rem;\r\n border-radius: var(--radius-button);\r\n background: var(--color-primary);\r\n color: var(--color-primary-fg);\r\n border: none;\r\n cursor: pointer;\r\n font-size: 0.9375rem;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n box-shadow: 0 2px 8px var(--color-shadow);\r\n}\r\n\r\n.retryButton:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 16px var(--color-shadow);\r\n background: var(--color-primary-light);\r\n color: var(--color-primary-fg);\r\n}\r\n\r\n.retryButton:active {\r\n transform: translateY(0);\r\n box-shadow: 0 2px 8px var(--color-shadow);\r\n}\r\n\r\n.retryButtonIcon {\r\n display: inline-block;\r\n font-size: 1.125rem;\r\n line-height: 1;\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n.retryButton:hover .retryButtonIcon {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.clearLocalDataButton {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0.75rem 1.5rem;\r\n border-radius: var(--radius-button);\r\n background: transparent;\r\n color: var(--color-fg-muted);\r\n border: 1px solid var(--color-border-4);\r\n cursor: pointer;\r\n font-size: 0.9375rem;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.clearLocalDataButton:hover {\r\n color: var(--color-fg-text);\r\n border-color: var(--color-border-3);\r\n background: var(--color-bg-secondary);\r\n}","import type { ReactNode } from \"react\";\n\nimport { Component } from \"react\";\n\ninterface SuspenseErrorBoundaryProps {\n children: ReactNode;\n fallbackRender: (args: { error: Error | null; retry: () => void }) => ReactNode;\n onReset?: () => void;\n}\n\ninterface SuspenseErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nclass SuspenseErrorBoundary extends Component<SuspenseErrorBoundaryProps, SuspenseErrorBoundaryState> {\n state: SuspenseErrorBoundaryState = {\n hasError: false,\n error: null,\n };\n\n static getDerivedStateFromError(error: Error): SuspenseErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error) {\n if (import.meta.env.DEV) {\n console.error(\"SuspenseErrorBoundary captured error:\", error);\n }\n }\n\n private handleReset = () => {\n this.setState({ hasError: false, error: null }, () => {\n this.props.onReset?.();\n });\n };\n\n render() {\n if (this.state.hasError) {\n return this.props.fallbackRender({ error: this.state.error, retry: this.handleReset });\n }\n\n return this.props.children;\n }\n}\n\nexport default SuspenseErrorBoundary;\n","/**\n * 统一 Suspense 包装:QueryErrorResetBoundary + 自定义 Loading/Error 样式,支持 loadingType、errorFallback。Suspense wrapper with QueryErrorResetBoundary, custom loading/error UI.\n *\n * @example\n * ```tsx\n * * 包裹懒加载内容\n * <Suspense fallback={null}>\n * <LazyPage />\n * </Suspense>\n * * 自定义 loading 类型\n * <Suspense loadingType=\"bounce\" loadingShape=\"circle\">...</Suspense>\n * ```\n */\nimport type { QueryErrorResetBoundaryProps } from \"@tanstack/react-query\";\nimport type { ReactNode, SuspenseProps as ReactSuspenseProps } from \"react\";\n\nimport { memo, Suspense as ReactSuspense } from \"react\";\nimport { QueryErrorResetBoundary } from \"@tanstack/react-query\";\n\nimport BounceLoading from \"@/designs/animations/BounceLoading\";\nimport ECGLoading from \"@/designs/animations/ECGLoading\";\nimport TruckLoading from \"@/designs/animations/TruckLoading\";\nimport { AlertCircle } from \"@/icons/lucide\";\n\nimport styles from \"./styles.module.css\";\nimport SuspenseErrorBoundary from \"./SuspenseErrorBoundary\";\n\ninterface LoadingFallbackProps {\n /** 自定义 fallback 节点。Custom fallback node. */\n fallback?: ReactNode;\n /** 加载动画类型。Loading animation type. */\n loadingType?: \"ecg\" | \"truck\" | \"bounce\";\n /** 加载图形形状。Loading shape. */\n loadingShape?: \"square\" | \"circle\";\n /** 加载中文案。Loading text. */\n loadingText?: ReactNode;\n /** 加载图尺寸。Loading size. */\n loadingSize?: \"small\" | \"medium\" | \"large\";\n /** 容器 className。Container className. */\n loadingContainerClassName?: string;\n /** 文案 className。Text className. */\n loadingTextClassName?: string;\n /** 加载图 className。Loading className. */\n loadingClassName?: string;\n}\n\ninterface ErrorFallbackProps {\n /** 错误对象。Error object. */\n error: Error | null;\n /** 重试函数。Retry function. */\n retry: () => void;\n /** 自定义错误 UI。Custom error UI. */\n errorFallback?: (args: { error: Error | null; retry: () => void }) => ReactNode;\n /** 错误标题。Error title. */\n errorTitle?: ReactNode;\n /** 错误描述。Error description. */\n errorDescription?: ReactNode;\n /** 重试按钮文案。Retry button text. */\n retryText?: ReactNode;\n /** 详情折叠文案。Error details summary text. */\n errorDetailsText?: ReactNode;\n /** 清除本地数据按钮文案。Clear local data button text. */\n clearLocalDataText?: ReactNode;\n /** 点击「清除本地数据」后执行(如跳转登录页),由调用方传入。Called after clear local data (e.g. navigate to login); pass from caller. */\n onClearLocalData?: () => void;\n /** 错误容器 className。Error container className. */\n errorContainerClassName?: string;\n /** 错误详情 className。Error details className. */\n errorDetailsClassName?: string;\n /** 是否展示错误详情。Show error details. */\n showErrorDetails?: boolean;\n}\n\nexport interface SuspenseProps extends Omit<ReactSuspenseProps, \"fallback\">, Omit<QueryErrorResetBoundaryProps, \"children\"> {\n /** 自定义 fallback。Custom fallback. */\n fallback?: ReactNode;\n /** 测试用:始终挂起。Test: always suspend. */\n test?: boolean;\n /** 加载动画类型。Loading type. */\n loadingType?: \"ecg\" | \"truck\" | \"bounce\";\n /** 加载图形形状。Loading shape. */\n loadingShape?: \"square\" | \"circle\";\n /** 加载中文案,由调用方传入。Loading text; pass from caller (e.g. i18n). */\n loadingText?: ReactNode;\n /** 加载图尺寸。Loading size. */\n loadingSize?: \"small\" | \"medium\" | \"large\";\n /** 加载容器 className。Loading container className. */\n loadingContainerClassName?: string;\n /** 加载文案 className。Loading text className. */\n loadingTextClassName?: string;\n /** 加载图 className。Loading className. */\n loadingClassName?: string;\n /** 自定义错误 UI。Custom error fallback. */\n errorFallback?: (args: { error: Error | null; retry: () => void }) => ReactNode;\n /** 错误标题,由调用方传入。Error title; pass from caller. */\n errorTitle?: ReactNode;\n /** 错误描述,由调用方传入。Error description; pass from caller. */\n errorDescription?: ReactNode;\n /** 重试按钮文案,由调用方传入。Retry text; pass from caller. */\n retryText?: ReactNode;\n /** 错误详情折叠文案。Error details text. */\n errorDetailsText?: ReactNode;\n /** 清除本地数据按钮文案。Clear local data text. */\n clearLocalDataText?: ReactNode;\n /** 点击「清除本地数据」后执行(如跳转登录页),由调用方传入。Called after clear local data (e.g. navigate to login); pass from caller. */\n onClearLocalData?: () => void;\n /** 错误容器 className。Error container className. */\n errorContainerClassName?: string;\n /** 错误详情 className。Error details className. */\n errorDetailsClassName?: string;\n /** 是否展示错误详情。Show error details. */\n showErrorDetails?: boolean;\n}\n\nconst LoadingFallback = memo(\n ({\n fallback,\n loadingType = \"ecg\",\n loadingShape = \"square\",\n loadingText = \"Loading...\",\n loadingSize = \"medium\",\n loadingContainerClassName,\n loadingTextClassName,\n loadingClassName,\n }: LoadingFallbackProps) => {\n if (fallback) {\n return <>{fallback}</>;\n }\n\n const renderLoading = () => {\n switch (loadingType) {\n case \"ecg\":\n return <ECGLoading size={loadingSize} className={loadingClassName} />;\n case \"truck\":\n return <TruckLoading size={loadingSize} className={loadingClassName} />;\n case \"bounce\":\n return <BounceLoading size={loadingSize} shape={loadingShape} className={loadingClassName} />;\n default:\n return <ECGLoading size={loadingSize} className={loadingClassName} />;\n }\n };\n\n return (\n <div className={`${styles.loadingContainer} ${loadingContainerClassName || \"\"}`}>\n {renderLoading()}\n <p className={`${styles.loadingText} ${loadingTextClassName || \"\"}`}>{loadingText}</p>\n </div>\n );\n },\n);\n\nLoadingFallback.displayName = \"LoadingFallback\";\n\nconst ErrorFallback = memo(\n ({\n error,\n retry,\n errorFallback,\n errorTitle = \"Error\",\n errorDescription = \"Something went wrong. Please try again.\",\n retryText = \"Retry\",\n errorDetailsText = \"Details\",\n clearLocalDataText = \"Clear local data\",\n onClearLocalData,\n errorContainerClassName,\n errorDetailsClassName,\n showErrorDetails = import.meta.env.DEV,\n }: ErrorFallbackProps) => {\n const handleClearLocalData = () => {\n try {\n sessionStorage.clear();\n } catch {\n // ignore\n } finally {\n onClearLocalData?.();\n }\n };\n\n if (errorFallback) {\n return <>{errorFallback({ error, retry })}</>;\n }\n\n return (\n <div className={`${styles.errorContainer} ${errorContainerClassName || \"\"}`}>\n <div className={styles.errorIconWrapper}>\n <AlertCircle className={styles.errorIcon} size={64} />\n </div>\n <div className={styles.errorContent}>\n <h3 className={styles.errorTitle}>{errorTitle}</h3>\n <p className={styles.errorDescription}>{errorDescription}</p>\n {showErrorDetails && error && (\n <div className={styles.errorDetailsWrapper}>\n <details className={styles.errorDetailsContainer}>\n <summary className={styles.errorDetailsSummary}>{errorDetailsText}</summary>\n <pre className={`${styles.errorDetails} ${errorDetailsClassName || \"\"}`}>{error.message}</pre>\n </details>\n </div>\n )}\n <div className={styles.errorActions}>\n <button type=\"button\" className={styles.retryButton} onClick={retry}>\n <span className={styles.retryButtonIcon}>↻</span>\n <span>{retryText}</span>\n </button>\n <button type=\"button\" className={styles.clearLocalDataButton} onClick={handleClearLocalData}>\n <span>{clearLocalDataText}</span>\n </button>\n </div>\n </div>\n </div>\n );\n },\n);\n\nErrorFallback.displayName = \"ErrorFallback\";\n\nconst Suspense = memo(\n ({\n fallback,\n test,\n loadingType = \"ecg\",\n loadingShape = \"square\",\n loadingClassName,\n loadingText,\n loadingSize = \"medium\",\n loadingContainerClassName,\n loadingTextClassName,\n children,\n errorFallback,\n errorTitle,\n errorDescription,\n retryText,\n errorDetailsText,\n clearLocalDataText,\n onClearLocalData,\n errorContainerClassName,\n errorDetailsClassName,\n showErrorDetails = import.meta.env.DEV,\n ...restProps\n }: SuspenseProps) => {\n return (\n <QueryErrorResetBoundary {...restProps}>\n {({ reset }) => (\n <SuspenseErrorBoundary\n onReset={reset}\n fallbackRender={({ error, retry }) => (\n <ErrorFallback\n error={error}\n retry={retry}\n errorFallback={errorFallback}\n errorTitle={errorTitle}\n errorDescription={errorDescription}\n retryText={retryText}\n errorDetailsText={errorDetailsText}\n clearLocalDataText={clearLocalDataText}\n onClearLocalData={onClearLocalData}\n errorContainerClassName={errorContainerClassName}\n errorDetailsClassName={errorDetailsClassName}\n showErrorDetails={showErrorDetails}\n />\n )}\n >\n <ReactSuspense\n fallback={\n <LoadingFallback\n fallback={fallback}\n loadingType={loadingType}\n loadingShape={loadingShape}\n loadingText={loadingText}\n loadingSize={loadingSize}\n loadingContainerClassName={loadingContainerClassName}\n loadingTextClassName={loadingTextClassName}\n loadingClassName={loadingClassName}\n />\n }\n {...restProps}\n >\n {test ? <AlwaysPending /> : children}\n </ReactSuspense>\n </SuspenseErrorBoundary>\n )}\n </QueryErrorResetBoundary>\n );\n },\n);\n\nSuspense.displayName = \"Suspense\";\nexport default Suspense;\n\nconst AlwaysPending = () => {\n throw new Promise(() => {}); // 永不 resolve 的 Promise\n};\n",".wrapper {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.wrapper.fullWidth {\n width: 100%;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--color-fg-heading);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.required {\n color: var(--color-danger);\n}\n\n.inputContainer {\n position: relative;\n display: flex;\n align-items: flex-start;\n width: 100%;\n}\n\n.textarea {\n width: 100%;\n border: 1px solid var(--color-border-4);\n border-radius: var(--radius-input);\n background: var(--color-bg);\n color: var(--color-fg-text);\n font-size: 0.875rem;\n font-family: inherit;\n transition: all 0.2s ease;\n outline: none;\n resize: vertical;\n min-height: 4rem;\n}\n\n.textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.1);\n}\n\n.textarea::placeholder {\n color: var(--color-fg-muted);\n opacity: 0.5;\n}\n\n/* Size variants */\n.textarea.small {\n padding: 0.5rem 0.75rem;\n font-size: 0.8125rem;\n min-height: 3rem;\n}\n\n.textarea.medium {\n padding: 0.75rem;\n font-size: 0.875rem;\n min-height: 4rem;\n}\n\n.textarea.large {\n padding: 1rem;\n font-size: 1rem;\n min-height: 5rem;\n}\n\n/* Variant styles */\n.textarea.default {\n background: var(--color-bg);\n border-color: var(--color-border-4);\n}\n\n.textarea.filled {\n background: var(--color-bg-2);\n border-color: var(--color-border-3);\n}\n\n/* With icons */\n.inputContainer .leftIcon {\n position: absolute;\n left: 0.75rem;\n top: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-fg-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.inputContainer .rightIcon {\n position: absolute;\n right: 0.75rem;\n top: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-fg-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.inputContainer .textarea.small + .leftIcon,\n.inputContainer .textarea.small + .rightIcon {\n top: 0.5rem;\n}\n\n.inputContainer .textarea.large + .leftIcon,\n.inputContainer .textarea.large + .rightIcon {\n top: 1rem;\n}\n\n/* Error state */\n.textarea.error {\n border-color: var(--color-danger);\n}\n\n.textarea.error:focus {\n border-color: var(--color-danger);\n box-shadow: 0 0 0 3px rgba(var(--color-danger-rgb), 0.1);\n}\n\n/* Disabled state */\n.textarea.disabled {\n background: var(--color-bg-3);\n border-color: var(--color-border-5);\n color: var(--color-fg-muted);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.errorText {\n font-size: 0.75rem;\n color: var(--color-danger);\n margin: 0;\n}\n\n.helperText {\n font-size: 0.75rem;\n color: var(--color-fg-muted);\n margin: 0;\n}\n","/**\n * 多行文本框:支持 label、error、helperText、左右图标与 size/variant。Textarea with label, error, helperText, left/right icon.\n *\n * @example\n * ```tsx\n * * 基础用法\n * <Textarea label=\"备注\" value={note} onChange={(e) => setNote(e.target.value)} rows={4} />\n * * 错误态\n * <Textarea error={errors.note} helperText=\"选填\" />\n * ```\n */\nimport type { ReactNode, TextareaHTMLAttributes } from \"react\";\n\nimport { forwardRef } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\"> {\n /** 标签文案。Label text. */\n label?: ReactNode;\n /** 错误信息。Error message. */\n error?: ReactNode;\n /** 辅助说明。Helper text. */\n helperText?: ReactNode;\n /** 左侧图标。Left icon. */\n leftIcon?: ReactNode;\n /** 右侧图标。Right icon. */\n rightIcon?: ReactNode;\n /** 尺寸。Size. */\n size?: \"small\" | \"medium\" | \"large\";\n /** 视觉变体。Variant. */\n variant?: \"default\" | \"filled\";\n /** 是否占满宽度。Full width. */\n fullWidth?: boolean;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, error, helperText, leftIcon, rightIcon, size = \"medium\", variant = \"default\", fullWidth = false, className = \"\", disabled, ...props }, ref) => {\n const textareaClasses = [styles.textarea, styles[size], styles[variant], error && styles.error, disabled && styles.disabled, className]\n .filter(Boolean)\n .join(\" \");\n\n const wrapperClasses = [styles.wrapper, fullWidth && styles.fullWidth].filter(Boolean).join(\" \");\n\n return (\n <div className={wrapperClasses}>\n {label && (\n <label className={styles.label}>\n {label}\n {props.required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={styles.inputContainer}>\n {leftIcon && <div className={styles.leftIcon}>{leftIcon}</div>}\n <textarea ref={ref} className={textareaClasses} disabled={disabled} {...props} />\n {rightIcon && <div className={styles.rightIcon}>{rightIcon}</div>}\n </div>\n {error && <span className={styles.errorText}>{error}</span>}\n {helperText && !error && <span className={styles.helperText}>{helperText}</span>}\n </div>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n","function createLazyMeasurementsView(count, flat, getItemKey) {\n const cache = new Array(count);\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (!v) {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: getItemKey(i),\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n };\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { createLazyMeasurementsView } from \"./lazy-measurements.js\";\nimport { memo, notUndefined, approxEqual, debounce } from \"./utils.js\";\nlet _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n};\nconst getRect = (element) => {\n const { offsetWidth, offsetHeight } = element;\n return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(offset, false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: offset + adjustments,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._flatMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this._iosDeferredAdjustment = 0;\n this._iosTouching = false;\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._intendedScrollOffset = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(\n index,\n this.options.measureElement(node, entry, this)\n );\n }\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a, _b;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;\n const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n followOnAppend = behavior;\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorResolved = false;\n let anchorDelta = 0;\n if (anchor && this.scrollOffset !== null) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = anchorItem.start + anchorOffset;\n if (newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n anchorResolved = true;\n }\n }\n }\n }\n if (anchorResolved || followOnAppend) {\n this.pendingScrollAnchor = [\n anchorResolved ? anchor[0] : null,\n anchorResolved ? anchor[1] : 0,\n followOnAppend,\n anchorDelta\n ];\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {\n offset = this._intendedScrollOffset;\n }\n this._intendedScrollOffset = null;\n this.scrollAdjustments = 0;\n this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this._flushIosDeferredIfReady();\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n const scrollEl = this.scrollElement;\n const onTouchStart = () => {\n this._iosTouching = true;\n this._iosJustTouchEnded = false;\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n };\n const onTouchEnd = () => {\n this._iosTouching = false;\n if (!isIOSWebKit() || this.targetWindow == null) {\n return;\n }\n this._iosJustTouchEnded = true;\n this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._flushIosDeferredIfReady();\n }, 150);\n };\n scrollEl.addEventListener(\n \"touchstart\",\n onTouchStart,\n addEventListenerOptions\n );\n scrollEl.addEventListener(\n \"touchend\",\n onTouchEnd,\n addEventListenerOptions\n );\n this.unsubs.push(() => {\n scrollEl.removeEventListener(\"touchstart\", onTouchStart);\n scrollEl.removeEventListener(\"touchend\", onTouchEnd);\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n });\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n const [key, _offset, followOnAppend, anchorDelta] = anchor;\n if (key !== null && !followOnAppend) {\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n if (anchorDelta !== 0) {\n this._iosDeferredAdjustment += anchorDelta;\n }\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n }\n if (followOnAppend) {\n this.scrollToEnd({ behavior: followOnAppend });\n }\n }\n };\n this._flushIosDeferredIfReady = () => {\n if (this._iosDeferredAdjustment === 0) return;\n if (this.isScrolling) return;\n if (this._iosTouching) return;\n if (this._iosJustTouchEnded) return;\n const cur = this.getScrollOffset();\n const max = this.getMaxScrollOffset();\n if (cur < 0 || cur > max) return;\n const delta = this._iosDeferredAdjustment;\n this._iosDeferredAdjustment = 0;\n this._scrollToOffset(cur, {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getFurthestMeasurement = (measurements, index) => {\n const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n const furthestMeasurements = /* @__PURE__ */ new Map();\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane\n );\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index;\n }\n return a.end - b.end;\n })[0] : void 0;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n };\n },\n {\n key: false\n }\n );\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode\n }, _itemSizeCacheVersion) => {\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const gap = this.options.gap;\n const need = count * 2;\n let flat = this._flatMeasurements;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n this._flatMeasurements = flat;\n }\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n const view = createLazyMeasurementsView(count, flat, getItemKey);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n laneLastIndex[item.lane] = m;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + this.options.gap : paddingStart + scrollMargin;\n } else {\n const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n if (this.options.lanes > 1 && shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n laneLastIndex[lane] = i;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n // Pass the typed array so binary search + forward-walk can\n // read start/end directly from Float64Array, skipping the\n // Proxy traps that materialize a full VirtualItem per probe.\n flat: lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null\n }) : null;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!this.scrollState || this.scrollState.behavior !== \"smooth\") {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b;\n if (index < 0 || index >= this.options.count) return;\n let cachedSize;\n let itemStart;\n let key;\n const flat = this._flatMeasurements;\n if (this.options.lanes === 1 && flat !== null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== \"smooth\" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;\n const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== \"smooth\" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : (\n // Default: adjust scrollTop only when the resize is an above-\n // viewport item AND we're not actively scrolling backward.\n // Adjusting during backward scroll fights the user's scroll\n // direction and produces the \"items jump while scrolling up\"\n // jank reported across many issues. Users who want the old\n // behavior can pass shouldAdjustScrollPositionOnItemSizeChange.\n itemStart < this.getScrollOffset() + this.scrollAdjustments && this.scrollDirection !== \"backward\"\n ));\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n if (wasAtEnd) {\n this.applyScrollAdjustment(this.getTotalSize() - prevTotalSize);\n } else if (shouldAdjustScroll) {\n this.applyScrollAdjustment(delta);\n }\n this.notify(false);\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = this._flatMeasurements;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this.getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0;\n if (\"scrollHeight\" in this.scrollElement) {\n return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n } else {\n const doc = this.scrollElement.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n }\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this.getTotalSize() - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.measurementsCache[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n const offset = this.getOffsetForAlignment(toOffset, align);\n const now = this.now();\n this.scrollState = {\n index: null,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) {\n return;\n }\n const [offset, align] = offsetInfo;\n const now = this.now();\n this.scrollState = {\n index,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getScrollOffset() + delta;\n const now = this.now();\n this.scrollState = {\n index: null,\n align: \"start\",\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this.scrollToIndex(this.options.count - 1, {\n align: \"end\",\n behavior\n });\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = this._flatMeasurements;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this._intendedScrollOffset = offset + (adjustments ?? 0);\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n this._iosDeferredAdjustment += delta;\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior\n });\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;\n const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;\n const STABLE_FRAMES = 1;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: \"auto\"\n });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = this.scrollState.behavior === \"smooth\" && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (!keepSmooth) {\n this.scrollState.behavior = \"auto\";\n }\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n flat\n}) {\n const lastIndex = measurements.length - 1;\n const getStart = flat ? (index) => flat[index * 2] : (index) => measurements[index].start;\n const getEnd = flat ? (index) => flat[index * 2] + flat[index * 2 + 1] : (index) => measurements[index].end;\n if (measurements.length <= lanes) {\n return {\n startIndex: 0,\n endIndex: lastIndex\n };\n }\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && getEnd(endIndex) < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase({\n useFlushSync = true,\n directDomUpdates = false,\n directDomUpdatesMode = \"transform\",\n ...options\n}) {\n const rerender = React.useReducer((x) => x + 1, 0)[1];\n const directRef = React.useRef({\n enabled: directDomUpdates,\n mode: directDomUpdatesMode,\n container: null,\n lastSize: null,\n // Keyed by the element itself so a remounted node (same key, new DOM\n // node — e.g. when `enabled` is toggled off then on) is treated as fresh\n // and gets its style written.\n lastPositions: /* @__PURE__ */ new WeakMap(),\n prevRange: null\n });\n directRef.current.enabled = directDomUpdates;\n directRef.current.mode = directDomUpdatesMode;\n const applyDirectStyles = (instance2) => {\n const state = directRef.current;\n if (!state.enabled) return;\n const totalSize = instance2.getTotalSize();\n if (state.container && totalSize !== state.lastSize) {\n state.lastSize = totalSize;\n const sizeAxis = instance2.options.horizontal ? \"width\" : \"height\";\n state.container.style[sizeAxis] = `${totalSize}px`;\n }\n const horizontal = !!instance2.options.horizontal;\n const useTransform = state.mode === \"transform\";\n const posAxis = horizontal ? \"left\" : \"top\";\n const scrollMargin = instance2.options.scrollMargin;\n const items = instance2.getVirtualItems();\n for (const item of items) {\n const next = item.start - scrollMargin;\n const el = instance2.elementsCache.get(item.key);\n if (!el) continue;\n if (state.lastPositions.get(el) === next) continue;\n state.lastPositions.set(el, next);\n if (useTransform) {\n el.style.transform = horizontal ? `translate3d(${next}px, 0, 0)` : `translate3d(0, ${next}px, 0)`;\n } else {\n el.style[posAxis] = `${next}px`;\n }\n }\n };\n const resolvedOptions = {\n ...options,\n onChange: (instance2, sync) => {\n var _a;\n const state = directRef.current;\n let shouldRerender = true;\n if (state.enabled) {\n applyDirectStyles(instance2);\n const range = instance2.range;\n const prev = state.prevRange;\n shouldRerender = !prev || prev.isScrolling !== instance2.isScrolling || prev.startIndex !== (range == null ? void 0 : range.startIndex) || prev.endIndex !== (range == null ? void 0 : range.endIndex);\n if (shouldRerender) {\n state.prevRange = range ? {\n startIndex: range.startIndex,\n endIndex: range.endIndex,\n isScrolling: instance2.isScrolling\n } : null;\n }\n }\n if (shouldRerender) {\n if (useFlushSync && sync) {\n flushSync(rerender);\n } else {\n rerender();\n }\n }\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n }\n };\n const [instance] = React.useState(() => {\n const v = new Virtualizer(resolvedOptions);\n return Object.assign(v, {\n containerRef: (node) => {\n const state = directRef.current;\n state.container = node;\n state.lastSize = null;\n if (node && state.enabled) {\n const total = v.getTotalSize();\n state.lastSize = total;\n const axis = v.options.horizontal ? \"width\" : \"height\";\n node.style[axis] = `${total}px`;\n }\n }\n });\n });\n instance.setOptions(resolvedOptions);\n useIsomorphicLayoutEffect(() => {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(() => {\n return instance._willUpdate();\n });\n useIsomorphicLayoutEffect(() => {\n applyDirectStyles(instance);\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase({\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase({\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n}\nexport {\n useVirtualizer,\n useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","/* Virtual List Container */\r\n.virtualList {\r\n position: relative;\r\n overflow: auto;\r\n contain: strict;\r\n width: 100%;\r\n padding-bottom: 300px;\r\n}\r\n\r\n/* Empty State Container */\r\n.emptyContainer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: var(--color-fg-muted);\r\n}\r\n\r\n/* Virtual List Inner Container */\r\n.virtualListInner {\r\n width: 100%;\r\n position: relative;\r\n}\r\n\r\n/* Virtual List Items Wrapper */\r\n.virtualListItems {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n}\r\n\r\n/* Loading More Indicator */\r\n.loadingMore {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n font-size: 0.875rem;\r\n}\r\n\r\n/* End of List Indicator */\r\n.endOfList {\r\n display: flex;\r\n justify-content: center;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n font-size: 0.875rem;\r\n border-top: 1px solid var(--color-border-3);\r\n margin-top: 1rem;\r\n}\r\n\r\n.endOfList span {\r\n padding: 0.5rem 1rem;\r\n background-color: var(--color-bg-2);\r\n border-radius: var(--radius-button);\r\n}","/**\n * 虚拟列表:基于 @tanstack/react-virtual,支持无限滚动 fetchNextPage。Virtual list; @tanstack/react-virtual, fetchNextPage.\n *\n * @example\n * ```tsx\n * * 与 useInfiniteQuery 配合,data 为 pages 拍平后的 items\n * <VirtualList data={items} getItemKey={(i) => i.id} renderItem={(i) => <Row item={i} />} hasNextPage fetchNextPage={fetchNextPage} />\n * ```\n */\nimport type { VirtualizerOptions } from \"@tanstack/react-virtual\";\nimport type { ReactNode } from \"react\";\n\nimport { memo, useCallback, useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface VirtualListProps<T> extends Partial<\n Omit<\n VirtualizerOptions<HTMLDivElement, Element>,\n \"count\" | \"getScrollElement\" | \"observeElementRect\" | \"observeElementOffset\" | \"scrollToFn\" | \"getItemKey\" | \"estimateSize\"\n >\n> {\n /** 数据列表。Data array. */\n data: T[];\n /** 是否有下一页。Has next page. */\n hasNextPage?: boolean;\n /** 是否正在拉取下一页。Is fetching next page. */\n isFetchingNextPage?: boolean;\n /** 拉取下一页。Fetch next page. */\n fetchNextPage?: () => void;\n /** 单项渲染。Render item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** 单项高度估计。Estimate item size. */\n estimateSize?: number | ((index: number) => number);\n /** 列表高度。List height. */\n height?: string | number;\n /** 单项 key。Get item key. */\n getItemKey: (item: T, index: number) => string | number;\n /** 空状态自定义节点。Empty state node. */\n emptyState?: ReactNode;\n /** 加载更多指示器。Loading indicator node. */\n loadingIndicator?: ReactNode;\n /** 列表底指示器。End of list indicator node. */\n endOfListIndicator?: ReactNode;\n /** 当未提供 emptyState 时使用的文案,由调用方传入。Text when no data; used when emptyState not provided. */\n emptyText?: ReactNode;\n /** 当未提供 loadingIndicator 时使用的文案。Text when loading more. */\n loadingMoreText?: ReactNode;\n /** 当未提供 endOfListIndicator 时使用的文案。Text at end of list. */\n endOfListText?: ReactNode;\n /** 列表项容器 className。Flex container class. */\n flexClass?: string;\n /** 外层容器 className。Outer class. */\n outerClass?: string;\n /** 内层容器 className。Inner class. */\n innerClass?: string;\n}\n\nfunction VirtualListComponent<T>({\n data,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n renderItem,\n estimateSize = 200,\n overscan = 5,\n height = \"600px\",\n getItemKey,\n emptyState,\n loadingIndicator,\n endOfListIndicator,\n emptyText = \"No data\",\n loadingMoreText = \"Loading more...\",\n endOfListText = \"No more items\",\n flexClass,\n outerClass,\n innerClass,\n ...virtualizerOptions\n}: VirtualListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null);\n\n // 防御性检查:确保 data 是数组\n const safeData = Array.isArray(data) ? data : [];\n const dataLength = safeData.length;\n\n // Setup virtualizer\n // eslint-disable-next-line react-hooks/incompatible-library\n const rowVirtualizer = useVirtualizer({\n count: hasNextPage ? dataLength + 1 : dataLength,\n getScrollElement: () => parentRef.current,\n estimateSize: typeof estimateSize === \"number\" ? () => estimateSize : estimateSize,\n overscan,\n ...virtualizerOptions,\n });\n\n const items = rowVirtualizer.getVirtualItems();\n\n // Auto-fetch when scrolling near bottom (following official pattern)\n useEffect(() => {\n const [lastItem] = [...items].reverse();\n\n if (!lastItem) {\n return;\n }\n\n if (lastItem.index >= dataLength - 1 && hasNextPage && !isFetchingNextPage && fetchNextPage) {\n fetchNextPage();\n }\n }, [hasNextPage, fetchNextPage, dataLength, isFetchingNextPage, items]);\n\n const renderEmptyState = useCallback(() => {\n return (\n <div\n className={styles.virtualList}\n style={{\n height: typeof height === \"number\" ? `${height}px` : height,\n }}\n >\n {emptyState ?? (\n <div className={styles.emptyContainer}>\n <span>{emptyText}</span>\n </div>\n )}\n </div>\n );\n }, [emptyState, height, emptyText]);\n\n const renderLoadingIndicator = useCallback(() => {\n if (loadingIndicator) return loadingIndicator;\n return (\n <div className={styles.loadingMore}>\n <span>{loadingMoreText}</span>\n </div>\n );\n }, [loadingIndicator, loadingMoreText]);\n\n const renderEndOfListIndicator = useCallback(() => {\n if (endOfListIndicator) return endOfListIndicator;\n return (\n <div className={styles.endOfList}>\n <span>{endOfListText}</span>\n </div>\n );\n }, [endOfListIndicator, endOfListText]);\n\n // Show empty state if no data\n if (dataLength === 0) return renderEmptyState();\n\n return (\n <div\n ref={parentRef}\n className={`${styles.virtualList} ${outerClass ?? \"\"}`}\n style={{\n height: typeof height === \"number\" ? `${height}px` : height,\n }}\n >\n <div\n className={`${styles.virtualListInner} ${innerClass ?? \"\"}`}\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n <div\n className={`${styles.virtualListItems} ${flexClass ?? \"\"}`}\n style={{\n transform: `translateY(${items[0]?.start ?? 0}px)`,\n paddingTop: `2px`,\n }}\n >\n {items.map((virtualRow) => {\n const isLoaderRow = virtualRow.index > dataLength - 1;\n const item = safeData[virtualRow.index];\n\n return (\n <div key={virtualRow.key} data-index={virtualRow.index} ref={rowVirtualizer.measureElement}>\n {isLoaderRow ? (\n hasNextPage ? (\n renderLoadingIndicator()\n ) : (\n renderEndOfListIndicator()\n )\n ) : (\n <div key={getItemKey(item, virtualRow.index)}>{renderItem(item, virtualRow.index)}</div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\n// Use memo with generic type\nconst VirtualList = memo(VirtualListComponent) as typeof VirtualListComponent;\nexport default VirtualList;\n","/* 外层容器 */\r\n.virtualList {\r\n width: 100%;\r\n position: relative;\r\n overflow: visible; /* ✅ window 滚动,不是列表滚动 */\r\n padding-bottom: 300px;\r\n }\r\n \r\n /* 内层:撑出总高度 */\r\n .virtualListInner {\r\n width: 100%;\r\n position: relative;\r\n }\r\n \r\n /* 基于 translateY 的内容容器 */\r\n .virtualListItems {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n }\r\n \r\n /* 行样式(你不一定用得上,但可选) */\r\n .virtualListRow {\r\n width: 100%;\r\n }\r\n \r\n /* 无数据 */\r\n .emptyContainer {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n }\r\n \r\n /* 加载中 */\r\n .loadingMore {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 1.5rem 0;\r\n color: var(--color-fg-muted);\r\n }\r\n \r\n /* 末尾提示 */\r\n .endOfList {\r\n display: flex;\r\n justify-content: center;\r\n padding: 1.5rem 0;\r\n color: var(--color-fg-muted);\r\n border-top: 1px solid var(--color-border-3);\r\n }\r\n ","/**\n * 窗口虚拟列表:基于 useWindowVirtualizer,相对视口滚动。Window virtual list; uses useWindowVirtualizer, scroll relative to viewport.\n *\n * @example\n * ```tsx\n * * 与无限列表数据配合\n * <VirtualWindowList\n * data={items}\n * getItemKey={(item) => item.id}\n * renderItem={(item) => <Row item={item} />}\n * hasNextPage={hasNextPage}\n * fetchNextPage={fetchNextPage}\n * />\n * ```\n */\nimport type { VirtualizerOptions } from \"@tanstack/react-virtual\";\nimport type { ReactNode } from \"react\";\n\nimport { memo, useCallback, useEffect } from \"react\";\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface VirtualWindowListProps<T> extends Partial<\n Omit<\n VirtualizerOptions<Window, Element>,\n \"count\" | \"getScrollElement\" | \"observeElementRect\" | \"observeElementOffset\" | \"scrollToFn\" | \"estimateSize\" | \"getItemKey\"\n >\n> {\n /** 数据列表。Data array. */\n data: T[];\n /** 是否有下一页。Has next page. */\n hasNextPage?: boolean;\n /** 是否正在拉取下一页。Is fetching next page. */\n isFetchingNextPage?: boolean;\n /** 拉取下一页。Fetch next page. */\n fetchNextPage?: () => void;\n /** 单项渲染。Render item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** 单项高度估计。Estimate item size. */\n estimateSize?: number | ((index: number) => number);\n /** 列表高度。List height. */\n height?: string | number;\n /** 单项 key。Get item key. */\n getItemKey: (item: T, index: number) => string | number;\n /** 空状态自定义节点。Empty state node. */\n emptyState?: ReactNode;\n /** 加载更多指示器。Loading indicator node. */\n loadingIndicator?: ReactNode;\n /** 列表底指示器。End of list indicator node. */\n endOfListIndicator?: ReactNode;\n /** 空状态文案(未提供 emptyState 时)。Empty text. */\n emptyText?: ReactNode;\n /** 加载更多文案。Loading more text. */\n loadingMoreText?: ReactNode;\n /** 列表底文案。End of list text. */\n endOfListText?: ReactNode;\n /** 列表项容器 className。Flex container class. */\n flexClass?: string;\n /** 外层容器 className。Outer class. */\n outerClass?: string;\n /** 内层容器 className。Inner class. */\n innerClass?: string;\n}\n\n/* -------------------------------------------\n ✅ MAIN COMPONENT\n-------------------------------------------- */\nfunction VirtualWindowListComponent<T>({\n data,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n renderItem,\n estimateSize = 200,\n overscan = 5,\n height,\n getItemKey,\n\n emptyState,\n loadingIndicator,\n endOfListIndicator,\n emptyText = \"No data\",\n loadingMoreText = \"Loading more...\",\n endOfListText = \"No more items\",\n flexClass,\n outerClass,\n innerClass,\n ...virtualizerOptions\n}: VirtualWindowListProps<T>) {\n /* ✅ 防御性检查:确保 data 是数组 */\n const safeData = Array.isArray(data) ? data : [];\n const dataLength = safeData.length;\n\n /* ✅ 真正的 window 虚拟滚动器 */\n const virtualizer = useWindowVirtualizer({\n count: hasNextPage ? dataLength + 1 : dataLength,\n estimateSize: typeof estimateSize === \"number\" ? () => estimateSize : estimateSize,\n overscan,\n ...virtualizerOptions,\n });\n\n const items = virtualizer.getVirtualItems();\n\n /* ✅ 自动加载更多 */\n useEffect(() => {\n const last = items[items.length - 1];\n if (!last) return;\n\n const isLoaderRow = last.index >= dataLength;\n\n if (isLoaderRow && hasNextPage && !isFetchingNextPage && fetchNextPage) {\n fetchNextPage();\n }\n }, [items, hasNextPage, isFetchingNextPage, fetchNextPage, dataLength]);\n\n const renderEmptyState = useCallback(() => {\n return (\n <div\n className={styles.virtualList}\n style={{\n height: typeof height === \"number\" ? `${height}px` : (height ?? \"auto\"),\n }}\n >\n {emptyState ?? (\n <div className={styles.emptyContainer}>\n <span>{emptyText}</span>\n </div>\n )}\n </div>\n );\n }, [emptyState, height, emptyText]);\n\n const renderLoadingIndicator = useCallback(() => {\n return (\n loadingIndicator ?? (\n <div className={styles.loadingMore}>\n <span>{loadingMoreText}</span>\n </div>\n )\n );\n }, [loadingIndicator, loadingMoreText]);\n\n const renderEndOfListIndicator = useCallback(() => {\n return (\n endOfListIndicator ?? (\n <div className={styles.endOfList}>\n <span>{endOfListText}</span>\n </div>\n )\n );\n }, [endOfListIndicator, endOfListText]);\n\n /* ✅ 无数据情况 */\n if (dataLength === 0) return renderEmptyState();\n\n /* ✅ 正常渲染 */\n return (\n <div className={`${styles.virtualList} ${outerClass ?? \"\"}`}>\n <div\n className={`${styles.virtualListInner} ${innerClass ?? \"\"}`}\n style={{\n height: virtualizer.getTotalSize(),\n }}\n >\n <div\n className={`${styles.virtualListItems} ${flexClass ?? \"\"}`}\n style={{\n transform: `translateY(${items[0]?.start ?? 0}px)`,\n }}\n >\n {items.map((row) => {\n const isLoaderRow = row.index >= dataLength;\n const item = safeData[row.index];\n\n return (\n <div key={row.key} data-index={row.index} ref={virtualizer.measureElement}>\n {isLoaderRow ? (\n hasNextPage ? (\n renderLoadingIndicator()\n ) : (\n renderEndOfListIndicator()\n )\n ) : item == null ? (\n <div key={`missing-${row.index}`} />\n ) : (\n <div key={getItemKey(item, row.index)}>{renderItem(item, row.index)}</div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nconst VirtualWindowList = memo(VirtualWindowListComponent) as typeof VirtualWindowListComponent;\n\nexport default VirtualWindowList;\n"],"x_google_ignoreList":[24,25,26,27],"mappings":"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"}
1
+ {"version":3,"file":"components.cjs","names":["memo","memo","React"],"sources":["../src/designs/components/EmptyState/index.tsx","../src/designs/components/PageHeader/s.module.css","../src/designs/components/PageHeader/index.tsx","../src/designs/components/CardHeader.tsx","../src/designs/components/ThemeSettings/s.module.css","../src/designs/components/ThemeSettings/index.tsx","../src/designs/components/Suspense/index.tsx","../src/designs/components/Icon/index.tsx","../node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../node_modules/@tanstack/virtual-core/dist/esm/utils.js","../node_modules/@tanstack/virtual-core/dist/esm/index.js","../node_modules/@tanstack/react-virtual/dist/esm/index.js","../src/designs/components/VirtualList/styles.module.css","../src/designs/components/VirtualList/index.tsx","../src/designs/components/VirtualWindowList/styles.module.css","../src/designs/components/VirtualWindowList/index.tsx","../src/designs/components/LayoutSwitcher/index.tsx"],"sourcesContent":["import type { LucideIcon as LucideIconType } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { Flex, Heading, Text } from \"@radix-ui/themes\";\n\nimport LucideIcon from \"../LucideIcon\";\n\nexport type EmptyStateProps = {\n icon: LucideIconType;\n title: string;\n description?: string;\n action?: ReactNode;\n};\n\nexport default function EmptyState({ icon, title, description, action }: EmptyStateProps) {\n return (\n <Flex direction=\"column\" align=\"center\" justify=\"center\" gap=\"3\" py=\"9\" px=\"4\">\n <Flex\n align=\"center\"\n justify=\"center\"\n width=\"56px\"\n height=\"56px\"\n style={{\n borderRadius: \"var(--radius-5)\",\n background: \"color-mix(in oklab, var(--gray-11) 8%, transparent)\",\n color: \"var(--gray-10)\",\n }}\n >\n <LucideIcon icon={icon} size={24} />\n </Flex>\n <Heading as=\"h3\" size=\"4\" align=\"center\">\n {title}\n </Heading>\n {description ? (\n <Text as=\"p\" size=\"2\" color=\"gray\" align=\"center\" style={{ maxWidth: \"36ch\" }}>\n {description}\n </Text>\n ) : null}\n {action}\n </Flex>\n );\n}\n",".pageIcon {\n border-radius: var(--radius-3);\n background: color-mix(in oklab, var(--accent-9) 12%, transparent);\n color: var(--accent-9);\n}\n\n.panelIcon {\n border-radius: var(--radius-2);\n}\n","import type { LucideIcon as LucideIconType } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { Box, Flex, Heading, Text } from \"@radix-ui/themes\";\n\nimport LucideIcon from \"../LucideIcon\";\n\nimport styles from \"./s.module.css\";\n\nexport type PageHeaderProps = {\n icon: LucideIconType;\n title: string;\n description?: string;\n actions?: ReactNode;\n density?: \"default\" | \"panel\";\n};\n\nexport default function PageHeader({ icon, title, description, actions, density = \"panel\" }: PageHeaderProps) {\n const isPanel = density === \"panel\";\n return (\n <Flex asChild align=\"start\" justify=\"between\" gap=\"3\" wrap=\"wrap\" mb={isPanel ? \"3\" : \"5\"}>\n <header>\n <Flex align=\"center\" gap={isPanel ? \"3\" : \"4\"} minWidth=\"0\">\n <Flex\n align=\"center\"\n justify=\"center\"\n flexShrink=\"0\"\n width={isPanel ? \"28px\" : \"48px\"}\n height={isPanel ? \"28px\" : \"48px\"}\n className={`${styles.pageIcon} ${isPanel ? styles.panelIcon : \"\"}`}\n >\n <LucideIcon icon={icon} size={isPanel ? 15 : 22} />\n </Flex>\n <Box minWidth=\"0\">\n <Heading as=\"h1\" size={isPanel ? \"4\" : \"6\"} mb={description ? \"1\" : \"0\"}>\n {title}\n </Heading>\n {description ? (\n <Text as=\"p\" size=\"1\" color=\"gray\">\n {description}\n </Text>\n ) : null}\n </Box>\n </Flex>\n {actions ? (\n <Flex gap=\"2\" wrap=\"wrap\" align=\"center\">\n {actions}\n </Flex>\n ) : null}\n </header>\n </Flex>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Flex, Heading, Text } from \"@radix-ui/themes\";\n\nexport interface CardHeaderProps {\n icon: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n}\n\nfunction CardHeader({ icon, title, description }: CardHeaderProps) {\n return (\n <Flex gap=\"3\" align=\"start\" mb=\"4\">\n <Flex\n align=\"center\"\n justify=\"center\"\n flexShrink=\"0\"\n width=\"40px\"\n height=\"40px\"\n style={{\n borderRadius: \"var(--radius-icon)\",\n background: \"color-mix(in oklab, var(--accent-9) 12%, transparent)\",\n color: \"var(--accent-9)\",\n }}\n >\n {icon}\n </Flex>\n <Flex direction=\"column\" gap=\"1\" flexGrow=\"1\" minWidth=\"0\">\n <Heading as=\"h3\" size=\"4\">\n {title}\n </Heading>\n {description ? (\n <Text as=\"p\" size=\"2\" color=\"gray\">\n {description}\n </Text>\n ) : null}\n </Flex>\n </Flex>\n );\n}\n\nexport default CardHeader;\n",".controlFit {\n width: max-content;\n max-width: 100%;\n}\n\n.controlFit :global(.rt-SegmentedControlRoot) {\n width: max-content;\n max-width: 100%;\n}\n\n.swatch {\n width: 22px;\n height: 22px;\n border-radius: var(--radius-chip);\n border: 1px solid var(--gray-a6);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.swatchActive {\n outline: 2px solid var(--gray-12);\n outline-offset: 2px;\n}\n\n.previewTheme {\n width: 100%;\n}\n\n.positionPreview {\n position: relative;\n width: 56px;\n height: 40px;\n border-radius: var(--radius-chip);\n border: 1px solid var(--gray-a5);\n background: var(--gray-3);\n}\n\n.positionDot {\n position: absolute;\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: var(--accent-9);\n}\n\n.preview_bottom_right .positionDot {\n right: 6px;\n bottom: 6px;\n}\n.preview_bottom_left .positionDot {\n left: 6px;\n bottom: 6px;\n}\n.preview_top_right .positionDot {\n right: 6px;\n top: 6px;\n}\n.preview_top_left .positionDot {\n left: 6px;\n top: 6px;\n}\n\n.colorRow {\n border-bottom: 1px solid var(--gray-a3);\n width: 100%;\n}\n\n.colorRow:last-child {\n border-bottom: none;\n}\n\n.colorInput {\n width: 36px;\n height: 28px;\n padding: 0;\n border: 1px solid var(--gray-a5);\n border-radius: var(--radius-chip);\n background: transparent;\n cursor: pointer;\n}\n","import type { ReactNode } from \"react\";\n\nimport { useEffect, useState } from \"react\";\nimport { Badge, Box, Button, Card, Flex, Grid, Heading, RadioCards, SegmentedControl, Switch, Text, TextField, Theme } from \"@radix-ui/themes\";\nimport { Check, RotateCcw, Save } from \"lucide-react\";\nimport {\n AccentColorEnum,\n AppearanceEnum,\n GrayColorEnum,\n PanelBackgroundEnum,\n RadiusEnum,\n ScalingEnum,\n ThemeFontFamilyEnum,\n} from \"@/enums/theme\";\nimport { LanguageEnum } from \"@/languages/types\";\nimport { useBaseLabel } from \"@/languages/hooks\";\nimport { useSyncPreference } from \"@/hooks/preference\";\nimport { usePreferenceStore } from \"@/stores/preference\";\nimport {\n RADIX_ACCENT_VALUES,\n RADIX_GRAY_VALUES,\n RADIX_PANEL_BACKGROUND_VALUES,\n RADIX_RADIUS_TO_BASE,\n RADIX_RADIUS_VALUES,\n RADIX_SCALING_VALUES,\n type ResolvedThemePreference,\n resolveRadixAppearance,\n THEME_APPEARANCE_VALUES,\n THEME_FONT_FAMILY_VALUES,\n} from \"@/themes/radix\";\nimport { useTranslation } from \"react-i18next\";\n\nimport LucideIcon from \"../LucideIcon\";\n\nimport styles from \"./s.module.css\";\n\nconst FONT_LABEL_KEY: Record<ThemeFontFamilyEnum, string> = {\n [ThemeFontFamilyEnum.SYSTEM]: \"labels.fontSystem\",\n [ThemeFontFamilyEnum.IBM_PLEX]: \"labels.fontIbmPlex\",\n [ThemeFontFamilyEnum.NOTO]: \"labels.fontNoto\",\n [ThemeFontFamilyEnum.SOURCE_SANS]: \"labels.fontSourceSans\",\n};\n\nconst LANG_CODE: Record<LanguageEnum, string> = {\n [LanguageEnum.EN]: \"EN\",\n [LanguageEnum.ZH]: \"ZH\",\n [LanguageEnum.FR]: \"FR\",\n};\n\nconst LANG_NAME_KEY: Record<LanguageEnum, string> = {\n [LanguageEnum.EN]: \"labels.langEn\",\n [LanguageEnum.ZH]: \"labels.langZh\",\n [LanguageEnum.FR]: \"labels.langFr\",\n};\n\nfunction swatchVar(color: AccentColorEnum | GrayColorEnum): string {\n return color === \"auto\" ? \"var(--gray-9)\" : `var(--${color}-9)`;\n}\n\nfunction toDraft(pref: ResolvedThemePreference): ResolvedThemePreference {\n return { ...pref };\n}\n\nfunction Tile({ title, children }: { title: string; children: ReactNode }) {\n return (\n <Card size=\"2\">\n <Flex direction=\"column\" gap=\"4\" height=\"100%\">\n <Box>\n <Text size=\"2\" weight=\"bold\">\n {title}\n </Text>\n </Box>\n <Flex direction=\"column\" gap=\"4\" flexGrow=\"1\" align=\"start\">\n {children}\n </Flex>\n </Flex>\n </Card>\n );\n}\n\nexport default function ThemeSettings() {\n const { t } = useTranslation(\"preference\");\n const themePreference = usePreferenceStore((s) => s.theme);\n const currentLanguage = usePreferenceStore((s) => s.language);\n const { syncPreference } = useSyncPreference();\n const { getBaseDisplayName } = useBaseLabel();\n const [draft, setDraft] = useState(() => toDraft(themePreference));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n setDraft(toDraft(themePreference));\n }, [themePreference]);\n\n const dirty =\n draft.accent !== themePreference.accent ||\n draft.gray !== themePreference.gray ||\n draft.appearance !== themePreference.appearance ||\n draft.radius !== themePreference.radius ||\n draft.scaling !== themePreference.scaling ||\n draft.panelBackground !== themePreference.panelBackground ||\n draft.fontFamily !== themePreference.fontFamily;\n\n const setField = (patch: Partial<ResolvedThemePreference>) => setDraft((prev) => ({ ...prev, ...patch }));\n const previewAppearance = resolveRadixAppearance(draft.appearance);\n\n return (\n <Flex direction=\"column\" gap=\"3\">\n <Grid columns={{ initial: \"1\", sm: \"2\", md: \"3\" }} gap=\"3\" width=\"100%\">\n <Tile title={t(\"labels.colorAndAppearance\")}>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.appearance\")}\n </Text>\n <Box className={styles.controlFit}>\n <SegmentedControl.Root size=\"2\" value={draft.appearance} onValueChange={(v) => setField({ appearance: v as AppearanceEnum })}>\n {THEME_APPEARANCE_VALUES.map((v) => (\n <SegmentedControl.Item key={v} value={v}>\n {v}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n </Box>\n </Flex>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.accent\")}\n </Text>\n <Flex wrap=\"wrap\" gap=\"2\" width=\"max-content\" maxWidth=\"100%\">\n {RADIX_ACCENT_VALUES.map((c) => {\n const active = draft.accent === c;\n return (\n <button\n key={c}\n type=\"button\"\n aria-label={c}\n aria-pressed={active}\n onClick={() => setField({ accent: c })}\n className={`${styles.swatch} ${active ? styles.swatchActive : \"\"}`}\n style={{ background: swatchVar(c) }}\n >\n {active ? <LucideIcon icon={Check} size={12} color=\"white\" /> : null}\n </button>\n );\n })}\n </Flex>\n </Flex>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.gray\")}\n </Text>\n <Flex wrap=\"wrap\" gap=\"2\" width=\"max-content\" maxWidth=\"100%\">\n {RADIX_GRAY_VALUES.map((c) => {\n const active = draft.gray === c;\n return (\n <button\n key={c}\n type=\"button\"\n aria-label={c}\n aria-pressed={active}\n onClick={() => setField({ gray: c })}\n className={`${styles.swatch} ${active ? styles.swatchActive : \"\"}`}\n style={{ background: swatchVar(c) }}\n >\n {active ? <LucideIcon icon={Check} size={12} color=\"white\" /> : null}\n </button>\n );\n })}\n </Flex>\n </Flex>\n </Tile>\n\n <Tile title={t(\"labels.layoutAndType\")}>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.radius\")}\n </Text>\n <Box className={styles.controlFit}>\n <SegmentedControl.Root size=\"2\" value={draft.radius} onValueChange={(v) => setField({ radius: v as RadiusEnum })}>\n {RADIX_RADIUS_VALUES.map((v) => (\n <SegmentedControl.Item key={v} value={v}>\n {getBaseDisplayName(RADIX_RADIUS_TO_BASE[v])}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n </Box>\n </Flex>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.scaling\")}\n </Text>\n <Box className={styles.controlFit}>\n <SegmentedControl.Root size=\"2\" value={draft.scaling} onValueChange={(v) => setField({ scaling: v as ScalingEnum })}>\n {RADIX_SCALING_VALUES.map((v) => (\n <SegmentedControl.Item key={v} value={v}>\n {v}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n </Box>\n </Flex>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.panelBackground\")}\n </Text>\n <Box className={styles.controlFit}>\n <SegmentedControl.Root size=\"2\" value={draft.panelBackground} onValueChange={(v) => setField({ panelBackground: v as PanelBackgroundEnum })}>\n {RADIX_PANEL_BACKGROUND_VALUES.map((v) => (\n <SegmentedControl.Item key={v} value={v}>\n {v}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n </Box>\n </Flex>\n <Flex direction=\"column\" gap=\"2\" width=\"100%\" align=\"start\">\n <Text size=\"1\" weight=\"medium\" color=\"gray\">\n {t(\"labels.font\")}\n </Text>\n <Box className={styles.controlFit}>\n <SegmentedControl.Root size=\"2\" value={draft.fontFamily} onValueChange={(v) => setField({ fontFamily: v as ThemeFontFamilyEnum })}>\n {THEME_FONT_FAMILY_VALUES.map((v) => (\n <SegmentedControl.Item key={v} value={v}>\n {t(FONT_LABEL_KEY[v])}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n </Box>\n </Flex>\n </Tile>\n\n <Tile title={t(\"labels.livePreview\")}>\n <Theme\n appearance={previewAppearance}\n accentColor={draft.accent}\n grayColor={draft.gray}\n radius={draft.radius}\n scaling={draft.scaling}\n panelBackground={draft.panelBackground}\n hasBackground\n className={styles.previewTheme}\n >\n <Card size=\"2\">\n <Flex direction=\"column\" gap=\"3\">\n <Flex align=\"center\" justify=\"between\">\n <Heading size=\"4\">NFX</Heading>\n <Badge size=\"1\">{t(\"labels.previewBadge\")}</Badge>\n </Flex>\n <Flex gap=\"2\" wrap=\"wrap\">\n <Button size=\"2\">{t(\"labels.previewSolid\")}</Button>\n <Button size=\"2\" variant=\"soft\">\n {t(\"labels.previewSoft\")}\n </Button>\n </Flex>\n <TextField.Root size=\"2\" placeholder={t(\"labels.sampleInput\")} />\n <Flex align=\"center\" gap=\"2\">\n <Switch size=\"2\" defaultChecked />\n <Text size=\"2\">{t(\"labels.notifications\")}</Text>\n </Flex>\n </Flex>\n </Card>\n </Theme>\n </Tile>\n\n <Tile title={t(\"sections.language.title\")}>\n <RadioCards.Root size=\"1\" columns=\"3\" gap=\"2\" value={currentLanguage} onValueChange={(v) => syncPreference({ language: v as LanguageEnum })}>\n {(Object.values(LanguageEnum) as LanguageEnum[]).map((lang) => (\n <RadioCards.Item key={lang} value={lang}>\n <Flex direction=\"column\" align=\"center\" gap=\"1\" width=\"100%\">\n <Text size=\"3\" weight=\"bold\">\n {LANG_CODE[lang]}\n </Text>\n <Text size=\"1\" color=\"gray\">\n {t(LANG_NAME_KEY[lang])}\n </Text>\n </Flex>\n </RadioCards.Item>\n ))}\n </RadioCards.Root>\n </Tile>\n </Grid>\n\n <Card size=\"2\">\n <Flex align=\"center\" justify=\"end\" gap=\"2\" wrap=\"wrap\">\n {dirty ? (\n <Text size=\"1\" color=\"gray\" mr=\"auto\">\n {t(\"labels.unsavedChanges\")}\n </Text>\n ) : null}\n <Button type=\"button\" variant=\"soft\" color=\"gray\" size=\"2\" onClick={() => setDraft(toDraft(themePreference))} disabled={!dirty || saving}>\n <LucideIcon icon={RotateCcw} size={14} />\n {t(\"actions.reset\")}\n </Button>\n <Button\n type=\"button\"\n size=\"2\"\n disabled={!dirty || saving}\n onClick={() => {\n setSaving(true);\n try {\n syncPreference({ theme: { ...draft } });\n } finally {\n setSaving(false);\n }\n }}\n >\n <LucideIcon icon={Save} size={14} />\n {t(\"actions.saveTheme\")}\n </Button>\n </Flex>\n </Card>\n </Flex>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Suspense as ReactSuspense } from \"react\";\nimport { Flex, Spinner, Text } from \"@radix-ui/themes\";\n\nexport type SuspenseProps = {\n children: ReactNode;\n loadingText?: string;\n};\n\nexport default function Suspense({ children, loadingText = \"Loading\" }: SuspenseProps) {\n return (\n <ReactSuspense\n fallback={\n <Flex align=\"center\" justify=\"center\" gap=\"3\" p=\"6\" minHeight=\"200px\">\n <Spinner />\n <Text size=\"2\" color=\"gray\">\n {loadingText}\n </Text>\n </Flex>\n }\n >\n {children}\n </ReactSuspense>\n );\n}\n","/**\n * 图标组件:基于 lucide-react,通过 name 渲染对应图标。Icon component; renders lucide icon by name.\n *\n * @example\n * ```tsx\n * * 使用已注册的图标名\n * <Icon name=\"ChevronDown\" size={20} />\n * * 带 className\n * <Icon name=\"Search\" className={styles.searchIcon} />\n * ```\n */\nimport type { LucideProps } from \"lucide-react\";\n\nimport { memo } from \"react\";\n\nimport * as LucideIcons from \"@/icons/lucide\";\n\nexport type IconName = keyof Omit<typeof LucideIcons, \"LucideIcon\">;\n\nexport interface IconProps extends LucideProps {\n /** 图标名(lucide 注册名)。Icon name (lucide registered name). */\n name: IconName;\n}\n\nconst Icon = memo(({ name, ...props }: IconProps) => {\n const LucideIcon = LucideIcons[name] as React.ComponentType<LucideProps> | undefined;\n\n if (!LucideIcon) {\n console.warn(`Icon \"${name}\" not found in lucide-react`);\n return null;\n }\n\n return <LucideIcon {...props} />;\n});\n\nIcon.displayName = \"Icon\";\n\nexport default Icon;\n","function createLazyMeasurementsView(count, flat, getItemKey) {\n const cache = new Array(count);\n return new Proxy(cache, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\") {\n const c = prop.charCodeAt(0);\n if (c >= 48 && c <= 57) {\n const i = +prop;\n if (Number.isInteger(i) && i >= 0 && i < count) {\n let v = target[i];\n if (!v) {\n const s = flat[i * 2];\n v = target[i] = {\n index: i,\n key: getItemKey(i),\n start: s,\n size: flat[i * 2 + 1],\n end: s + flat[i * 2 + 1],\n lane: 0\n };\n }\n return v;\n }\n }\n if (prop === \"length\") return count;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nexport {\n createLazyMeasurementsView\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","function memo(getDeps, fn, opts) {\n let deps = opts.initialDeps ?? [];\n let result;\n let isInitial = true;\n function memoizedFunction() {\n var _a;\n const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n let depTime = 0;\n if (debugEnabled) depTime = Date.now();\n const newDeps = getDeps();\n const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n let resultTime = 0;\n if (debugEnabled) resultTime = Date.now();\n result = fn(...newDeps);\n if (debugEnabled) {\n const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n const resultFpsPercentage = resultEndTime / 16;\n const pad = (str, num) => {\n str = String(str);\n while (str.length < num) {\n str = \" \" + str;\n }\n return str;\n };\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts == null ? void 0 : opts.key\n );\n }\n if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result);\n }\n isInitial = false;\n return result;\n }\n memoizedFunction.updateDeps = (newDeps) => {\n deps = newDeps;\n };\n return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n if (value === void 0) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n } else {\n return value;\n }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n let timeoutId;\n return Object.assign(\n function(...args) {\n targetWindow.clearTimeout(timeoutId);\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n },\n {\n // The handle is closure-local, so a caller that has already\n // unsubscribed has no way to stop a queued call. Teardown paths use\n // this to drop the pending invocation instead of letting it land.\n cancel: () => {\n targetWindow.clearTimeout(timeoutId);\n }\n }\n );\n};\nexport {\n approxEqual,\n debounce,\n memo,\n notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { createLazyMeasurementsView } from \"./lazy-measurements.js\";\nimport { memo, notUndefined, approxEqual, debounce } from \"./utils.js\";\nlet _isIOSResult;\nconst isIOSWebKit = () => {\n if (_isIOSResult !== void 0) return _isIOSResult;\n if (typeof navigator === \"undefined\") return _isIOSResult = false;\n if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n const mtp = navigator.maxTouchPoints;\n return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nconst _resetIOSDetectionForTests = () => {\n _isIOSResult = void 0;\n};\nconst getRect = (element) => {\n const { offsetWidth, offsetHeight } = element;\n return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n const start = Math.max(range.startIndex - range.overscan, 0);\n const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n const len = end - start + 1;\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = start + i;\n }\n return arr;\n};\nconst observeElementRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const handler = (rect) => {\n const { width, height } = rect;\n cb({ width: Math.round(width), height: Math.round(height) });\n };\n handler(getRect(element));\n if (!targetWindow.ResizeObserver) {\n return () => {\n };\n }\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0];\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize });\n return;\n }\n }\n handler(getRect(element));\n };\n instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n observer.observe(element, { box: \"border-box\" });\n return () => {\n observer.unobserve(element);\n };\n};\nconst addEventListenerOptions = {\n passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight });\n };\n handler();\n element.addEventListener(\"resize\", handler, addEventListenerOptions);\n return () => {\n element.removeEventListener(\"resize\", handler);\n };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n const element = instance.scrollElement;\n if (!element) {\n return;\n }\n const targetWindow = instance.targetWindow;\n if (!targetWindow) {\n return;\n }\n const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n let offset = 0;\n const fallback = registerScrollendEvent ? null : debounce(\n targetWindow,\n () => cb(offset, false),\n instance.options.isScrollingResetDelay\n );\n const createHandler = (isScrolling) => () => {\n offset = readOffset(element);\n fallback == null ? void 0 : fallback();\n cb(offset, isScrolling);\n };\n const handler = createHandler(true);\n const endHandler = createHandler(false);\n element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n if (registerScrollendEvent) {\n element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n }\n return () => {\n element.removeEventListener(\"scroll\", handler);\n if (registerScrollendEvent) {\n element.removeEventListener(\"scrollend\", endHandler);\n }\n fallback == null ? void 0 : fallback.cancel();\n };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n const { horizontal, isRtl } = instance.options;\n return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n instance,\n cb,\n (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n if (instance.options.useCachedMeasurements) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n }\n if (entry == null ? void 0 : entry.borderBoxSize) {\n const box = entry.borderBoxSize[0];\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n );\n return size;\n }\n }\n if (!entry) {\n const index = instance.indexFromElement(element);\n const key = instance.options.getItemKey(index);\n const cachedSize = instance.itemSizeCache.get(key);\n if (cachedSize !== void 0) {\n return cachedSize;\n }\n }\n return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n adjustments = 0,\n behavior\n}, instance) => {\n var _a, _b;\n (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n [instance.options.horizontal ? \"left\" : \"top\"]: offset + adjustments,\n behavior\n });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nclass Virtualizer {\n constructor(opts) {\n this.unsubs = [];\n this.scrollElement = null;\n this.targetWindow = null;\n this.isScrolling = false;\n this.scrollState = null;\n this.measurementsCache = [];\n this._flatMeasurements = null;\n this.itemSizeCache = /* @__PURE__ */ new Map();\n this.itemSizeCacheVersion = 0;\n this.laneAssignments = /* @__PURE__ */ new Map();\n this.pendingMin = null;\n this.prevLanes = void 0;\n this.lanesChangedFlag = false;\n this.lanesSettling = false;\n this.pendingScrollAnchor = null;\n this.scrollRect = null;\n this.scrollOffset = null;\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this._iosDeferredAdjustment = 0;\n this._iosTouching = false;\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._intendedScrollOffset = null;\n this._clampedAdjustment = null;\n this.elementsCache = /* @__PURE__ */ new Map();\n this.now = () => {\n var _a, _b, _c;\n return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n };\n this.observer = /* @__PURE__ */ (() => {\n let _ro = null;\n const get = () => {\n if (_ro) {\n return _ro;\n }\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null;\n }\n return _ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n const node = entry.target;\n const index = this.indexFromElement(node);\n if (!node.isConnected) {\n this.observer.unobserve(node);\n for (const [cacheKey, cachedNode] of this.elementsCache) {\n if (cachedNode === node) {\n this.elementsCache.delete(cacheKey);\n break;\n }\n }\n return;\n }\n if (!this.isIndexInRange(index)) return;\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(\n index,\n this.options.measureElement(node, entry, this)\n );\n }\n };\n this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n });\n });\n };\n return {\n disconnect: () => {\n var _a;\n (_a = get()) == null ? void 0 : _a.disconnect();\n _ro = null;\n },\n observe: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n },\n unobserve: (target) => {\n var _a;\n return (_a = get()) == null ? void 0 : _a.unobserve(target);\n }\n };\n })();\n this.range = null;\n this.setOptions = (opts2) => {\n var _a, _b;\n const merged = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {\n },\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: \"data-index\",\n initialMeasurementsCache: [],\n lanes: 1,\n anchorTo: \"start\",\n followOnAppend: false,\n scrollEndThreshold: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n laneAssignmentMode: \"estimate\",\n useCachedMeasurements: false\n };\n for (const key in opts2) {\n const v = opts2[key];\n if (v !== void 0) merged[key] = v;\n }\n const prevOptions = this.options;\n let anchor = null;\n let followOnAppend = null;\n let edgeKeysChanged = false;\n if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n const prevCount = prevOptions.count;\n const nextCount = merged.count;\n const measurements = this.getMeasurements();\n const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;\n const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;\n const didCountChange = nextCount !== prevCount;\n const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n if (didEdgeKeysChange) {\n edgeKeysChanged = true;\n const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n if (item) {\n anchor = [item.key, this.getScrollOffset() - item.start];\n }\n const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n followOnAppend = behavior;\n }\n }\n }\n this.options = merged;\n if (edgeKeysChanged) {\n this.pendingMin = 0;\n this.itemSizeCacheVersion++;\n }\n let anchorResolved = false;\n let anchorDelta = 0;\n if (anchor && this.scrollOffset !== null) {\n const [anchorKey, anchorOffset] = anchor;\n const newMeasurements = this.getMeasurements();\n const { count, getItemKey } = this.options;\n let idx = 0;\n while (idx < count && getItemKey(idx) !== anchorKey) {\n idx++;\n }\n if (idx < count) {\n const anchorItem = newMeasurements[idx];\n if (anchorItem) {\n const newOffset = Math.max(0, anchorItem.start + anchorOffset);\n if (newOffset !== this.scrollOffset) {\n anchorDelta = newOffset - this.scrollOffset;\n this.scrollOffset = newOffset;\n anchorResolved = true;\n }\n }\n }\n }\n if (anchorResolved || followOnAppend) {\n this.pendingScrollAnchor = [\n anchorResolved ? anchor[0] : null,\n anchorResolved ? anchor[1] : 0,\n followOnAppend,\n anchorDelta\n ];\n }\n };\n this.notify = (sync) => {\n var _a, _b;\n (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n };\n this.maybeNotify = memo(\n () => {\n this.calculateRange();\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ];\n },\n (isScrolling) => {\n this.notify(isScrolling);\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null\n ]\n }\n );\n this.cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d());\n this.unsubs = [];\n this.observer.disconnect();\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.scrollState = null;\n this.isScrolling = false;\n this.scrollDirection = null;\n this._iosDeferredAdjustment = 0;\n this._iosTouching = false;\n this._iosJustTouchEnded = false;\n this._clampedAdjustment = null;\n this.scrollElement = null;\n this.targetWindow = null;\n };\n this._didMount = () => {\n return () => {\n this.cleanup();\n };\n };\n this._willUpdate = () => {\n var _a;\n const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n if (this.scrollElement !== scrollElement) {\n this.cleanup();\n if (!scrollElement) {\n this.maybeNotify();\n return;\n }\n this.scrollElement = scrollElement;\n if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n } else {\n this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n }\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached);\n });\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect;\n this.maybeNotify();\n })\n );\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n if (isScrolling && this._intendedScrollOffset === null && offset === this.scrollOffset) {\n return;\n }\n if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {\n offset = this._intendedScrollOffset;\n }\n this._intendedScrollOffset = null;\n if (this._clampedAdjustment !== null && Math.abs(offset - this._clampedAdjustment.maxAtWrite) >= 1.5) {\n this._clampedAdjustment = null;\n }\n this.scrollAdjustments = 0;\n const prevOffset = this.getScrollOffset();\n this.scrollDirection = isScrolling ? prevOffset === offset ? this.scrollDirection : prevOffset < offset ? \"forward\" : \"backward\" : null;\n this.scrollOffset = offset;\n this.isScrolling = isScrolling;\n this._flushIosDeferredIfReady();\n if (this.scrollState) {\n this.scheduleScrollReconcile();\n }\n this.maybeNotify();\n })\n );\n if (\"addEventListener\" in this.scrollElement) {\n const scrollEl = this.scrollElement;\n const onTouchStart = () => {\n this._iosTouching = true;\n this._iosJustTouchEnded = false;\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n };\n const onTouchEnd = () => {\n this._iosTouching = false;\n if (!isIOSWebKit() || this.targetWindow == null) {\n return;\n }\n this._iosJustTouchEnded = true;\n this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {\n this._iosJustTouchEnded = false;\n this._iosTouchEndTimerId = null;\n this._flushIosDeferredIfReady();\n }, 150);\n };\n scrollEl.addEventListener(\n \"touchstart\",\n onTouchStart,\n addEventListenerOptions\n );\n scrollEl.addEventListener(\n \"touchend\",\n onTouchEnd,\n addEventListenerOptions\n );\n this.unsubs.push(() => {\n scrollEl.removeEventListener(\"touchstart\", onTouchStart);\n scrollEl.removeEventListener(\"touchend\", onTouchEnd);\n if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n this._iosTouchEndTimerId = null;\n }\n });\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n const anchor = this.pendingScrollAnchor;\n this.pendingScrollAnchor = null;\n if (anchor && this.scrollElement && this.options.enabled) {\n const [key, _offset, followOnAppend, anchorDelta] = anchor;\n if (key !== null && !followOnAppend) {\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n if (anchorDelta !== 0) {\n this._iosDeferredAdjustment += anchorDelta;\n }\n } else {\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: void 0,\n behavior: void 0\n });\n }\n }\n if (followOnAppend) {\n this.scrollToEnd({ behavior: followOnAppend });\n }\n }\n this._retryClampedAdjustment();\n };\n this._retryClampedAdjustment = () => {\n if (this._clampedAdjustment === null || !this.scrollElement || !this.options.enabled) {\n return;\n }\n const { target, maxAtWrite } = this._clampedAdjustment;\n const max = this.getMaxScrollOffset();\n if (max > maxAtWrite + 0.5) {\n this._clampedAdjustment = target > max + 0.5 ? { target, maxAtWrite: max } : null;\n this._scrollToOffset(target, {\n adjustments: void 0,\n behavior: void 0\n });\n }\n };\n this._flushIosDeferredIfReady = () => {\n if (this._iosDeferredAdjustment === 0) return;\n if (this.isScrolling) return;\n if (this._iosTouching) return;\n if (this._iosJustTouchEnded) return;\n const cur = this.getScrollOffset();\n const max = this.getMaxScrollOffset();\n if (cur < 0 || cur > max) return;\n if (this._iosDeferredAdjustment < 0 && cur >= max - 1) {\n this._iosDeferredAdjustment = 0;\n return;\n }\n const delta = this._iosDeferredAdjustment;\n this._iosDeferredAdjustment = 0;\n this._scrollToOffset(cur, {\n adjustments: this.scrollAdjustments += delta,\n behavior: void 0\n });\n };\n this.rafId = null;\n this.getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null;\n return 0;\n }\n this.scrollRect = this.scrollRect ?? this.options.initialRect;\n return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n };\n this.getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null;\n return 0;\n }\n this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n return this.scrollOffset;\n };\n this.getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n this.options.laneAssignmentMode,\n this.options.gap\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode, gap) => {\n const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n if (lanesChanged) {\n this.lanesChangedFlag = true;\n }\n this.prevLanes = lanes;\n this.pendingMin = null;\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n };\n },\n {\n key: false\n }\n );\n this.isIndexInRange = (index) => index >= 0 && index < this.options.count;\n this.getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n ({\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n laneAssignmentMode,\n gap\n }, _itemSizeCacheVersion) => {\n const itemSizeCache = this.itemSizeCache;\n if (!enabled) {\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n return [];\n }\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index);\n }\n }\n }\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false;\n this.lanesSettling = true;\n this.measurementsCache = [];\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.pendingMin = null;\n }\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size);\n });\n }\n const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n this.pendingMin = null;\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false;\n }\n if (lanes === 1) {\n const need = count * 2;\n let flat = this._flatMeasurements;\n if (!flat || flat.length < need) {\n const next = new Float64Array(need);\n if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n flat = next;\n this._flatMeasurements = flat;\n }\n let runningStart;\n if (min === 0) {\n runningStart = paddingStart + scrollMargin;\n } else {\n const prevIdx = min - 1;\n runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n flat[i * 2] = runningStart;\n flat[i * 2 + 1] = size;\n runningStart += size + gap;\n }\n const view = createLazyMeasurementsView(count, flat, getItemKey);\n this.measurementsCache = view;\n return view;\n }\n const measurements = this.measurementsCache.slice(0, min);\n const laneLastIndex = new Array(lanes).fill(\n void 0\n );\n const laneEnds = new Float64Array(lanes);\n let filledLanes = 0;\n for (let m = 0; m < min; m++) {\n const item = measurements[m];\n if (item) {\n if (laneLastIndex[item.lane] === void 0) filledLanes++;\n laneLastIndex[item.lane] = m;\n laneEnds[item.lane] = item.end;\n }\n }\n for (let i = min; i < count; i++) {\n const key = getItemKey(i);\n const cachedLane = this.laneAssignments.get(i);\n let lane;\n let start;\n const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n if (cachedLane !== void 0 && this.options.lanes > 1) {\n lane = cachedLane;\n const prevIndex = laneLastIndex[lane];\n const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n start = prevInLane ? prevInLane.end + gap : paddingStart + scrollMargin;\n } else if (filledLanes === lanes) {\n let bestLane = 0;\n let bestEnd = laneEnds[0];\n let bestIdx = laneLastIndex[0];\n for (let l = 1; l < lanes; l++) {\n const e = laneEnds[l];\n if (e < bestEnd || e === bestEnd && laneLastIndex[l] < bestIdx) {\n bestLane = l;\n bestEnd = e;\n bestIdx = laneLastIndex[l];\n }\n }\n lane = bestLane;\n start = bestEnd + gap;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n } else {\n lane = i % this.options.lanes;\n start = paddingStart + scrollMargin;\n if (shouldCacheLane) {\n this.laneAssignments.set(i, lane);\n }\n }\n const measuredSize = itemSizeCache.get(key);\n const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n const end = start + size;\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane\n };\n if (laneLastIndex[lane] === void 0) filledLanes++;\n laneLastIndex[lane] = i;\n laneEnds[lane] = end;\n }\n this.measurementsCache = measurements;\n return measurements;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n debug: () => this.options.debug\n }\n );\n this.calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n if (measurements.length === 0 || outerSize === 0) {\n this.range = null;\n return null;\n }\n this.range = calculateRangeImpl(\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n // Pass the typed array so binary search + forward-walk can read\n // start/end directly from Float64Array, skipping the Proxy traps.\n lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null\n );\n return this.range;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualIndexes = memo(\n () => {\n let startIndex = null;\n let endIndex = null;\n const range = this.calculateRange();\n if (range) {\n startIndex = range.startIndex;\n endIndex = range.endIndex;\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex\n ];\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null ? [] : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count\n });\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n debug: () => this.options.debug\n }\n );\n this.indexFromElement = (node) => {\n const attributeName = this.options.indexAttribute;\n const indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`\n );\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this.shouldMeasureDuringScroll = (index) => {\n var _a;\n if (!this.scrollState || this.scrollState.behavior !== \"smooth\") {\n return true;\n }\n const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n if (scrollIndex !== void 0 && this.range) {\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n );\n const minIndex = Math.max(0, scrollIndex - bufferSize);\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize\n );\n return index >= minIndex && index <= maxIndex;\n }\n return true;\n };\n this.measureElement = (node) => {\n if (!node) {\n this.elementsCache.forEach((cached, key2) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached);\n this.elementsCache.delete(key2);\n }\n });\n return;\n }\n const index = this.indexFromElement(node);\n if (!this.isIndexInRange(index)) return;\n const key = this.options.getItemKey(index);\n const prevNode = this.elementsCache.get(key);\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode);\n }\n this.observer.observe(node);\n this.elementsCache.set(key, node);\n }\n if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(index, this.options.measureElement(node, void 0, this));\n }\n };\n this.resizeItem = (index, size) => {\n var _a, _b;\n if (!this.isIndexInRange(index)) return;\n let cachedSize;\n let itemStart;\n let key;\n const flat = this._flatMeasurements;\n if (this.options.lanes === 1 && flat !== null) {\n key = this.options.getItemKey(index);\n itemStart = flat[index * 2];\n cachedSize = flat[index * 2 + 1];\n } else {\n const item = this.measurementsCache[index];\n if (!item) return;\n key = item.key;\n itemStart = item.start;\n cachedSize = item.size;\n }\n const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n const delta = size - itemSize;\n if (delta !== 0) {\n const wasAtEnd = this.options.anchorTo === \"end\" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== \"smooth\" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;\n const scrollOffsetWithAdj = this.getScrollOffset() + this.scrollAdjustments;\n const isFirstMeasure = !this.itemSizeCache.has(key);\n const defaultShouldAdjust = isFirstMeasure ? (\n // First measurement: compensate any item whose top sits above the\n // fold — the estimate→actual delta must be corrected regardless of\n // scroll direction, since the whole estimated block was above it.\n itemStart < scrollOffsetWithAdj\n ) : (\n // Re-measurement: only compensate an item that is ENTIRELY above the\n // fold. An item that merely *spans* the fold (top above, bottom\n // below — e.g. a streaming chat message growing at its bottom)\n // changes size *below* the anchor point, so shifting scrollTop by the\n // delta would drag the viewport downward on every growth (#1218).\n // Also skip during backward scroll to avoid the \"items jump while\n // scrolling up\" cascade.\n itemStart + itemSize <= scrollOffsetWithAdj && this.scrollDirection !== \"backward\"\n );\n const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== \"smooth\" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n // The callback expects a VirtualItem; build one lazily only\n // when the consumer actually supplied a custom predicate.\n this.measurementsCache[index] ?? {\n index,\n key,\n start: itemStart,\n size: cachedSize,\n end: itemStart + cachedSize,\n lane: 0\n },\n delta,\n this\n ) : defaultShouldAdjust);\n if (this.pendingMin === null || index < this.pendingMin) {\n this.pendingMin = index;\n }\n this.itemSizeCache.set(key, size);\n this.itemSizeCacheVersion++;\n let adjustedSync = false;\n if (wasAtEnd) {\n adjustedSync = this.applyScrollAdjustment(\n this.getTotalSize() - prevTotalSize\n );\n } else if (shouldAdjustScroll) {\n adjustedSync = this.applyScrollAdjustment(delta);\n }\n this.notify(adjustedSync);\n this._retryClampedAdjustment();\n }\n };\n this.getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems = [];\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k];\n const measurement = measurements[i];\n virtualItems.push(measurement);\n }\n return virtualItems;\n },\n {\n key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n debug: () => this.options.debug\n }\n );\n this.getVirtualItemForOffset = (offset) => {\n const measurements = this.getMeasurements();\n if (measurements.length === 0) {\n return void 0;\n }\n const flat = this._flatMeasurements;\n const useFlat = this.options.lanes === 1 && flat != null;\n const idx = findNearestBinarySearch(\n 0,\n measurements.length - 1,\n useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n offset\n );\n return notUndefined(measurements[idx]);\n };\n this.getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0;\n if (\"scrollHeight\" in this.scrollElement) {\n return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n } else {\n const doc = this.scrollElement.document.documentElement;\n return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n }\n };\n this.getVirtualDistanceFromEnd = () => {\n return Math.max(\n this.getTotalSize() - this.getSize() - this.getScrollOffset(),\n 0\n );\n };\n this.getDistanceFromEnd = () => {\n return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n };\n this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n return this.getDistanceFromEnd() <= threshold;\n };\n this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n if (!this.scrollElement) return 0;\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n if (align === \"auto\") {\n align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n }\n if (align === \"center\") {\n toOffset += (itemSize - size) / 2;\n } else if (align === \"end\") {\n toOffset -= size;\n }\n const maxOffset = this.getMaxScrollOffset();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = (index, align = \"auto\") => {\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const size = this.getSize();\n const scrollOffset = this.getScrollOffset();\n const item = this.measurementsCache[index];\n if (!item) return;\n if (align === \"auto\") {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = \"end\";\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = \"start\";\n } else {\n return [scrollOffset, align];\n }\n }\n if (align === \"end\" && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align];\n }\n const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align\n ];\n };\n this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n this._iosDeferredAdjustment = 0;\n const offset = this.getOffsetForAlignment(toOffset, align);\n const now = this.now();\n this.scrollState = {\n index: null,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToIndex = (index, {\n align: initialAlign = \"auto\",\n behavior = \"auto\"\n } = {}) => {\n this._iosDeferredAdjustment = 0;\n index = Math.max(0, Math.min(index, this.options.count - 1));\n const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n if (!offsetInfo) {\n return;\n }\n const [offset, align] = offsetInfo;\n const now = this.now();\n this.scrollState = {\n index,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n const offset = this.getScrollOffset() + delta;\n const now = this.now();\n this.scrollState = {\n index: null,\n align: \"start\",\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0\n };\n this._scrollToOffset(offset, { adjustments: void 0, behavior });\n this.scheduleScrollReconcile();\n };\n this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n if (this.options.count > 0) {\n this.scrollToIndex(this.options.count - 1, {\n align: \"end\",\n behavior\n });\n return;\n }\n this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n behavior\n });\n };\n this.getTotalSize = () => {\n var _a;\n const measurements = this.getMeasurements();\n let end;\n if (measurements.length === 0) {\n end = this.options.paddingStart;\n } else if (this.options.lanes === 1) {\n const lastIdx = measurements.length - 1;\n const flat = this._flatMeasurements;\n if (flat != null) {\n end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n } else {\n end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;\n }\n } else {\n const endByLane = Array(this.options.lanes).fill(null);\n let endIndex = measurements.length - 1;\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex];\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end;\n }\n endIndex--;\n }\n end = Math.max(...endByLane.filter((val) => val !== null));\n }\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0\n );\n };\n this.takeSnapshot = () => {\n const snapshot = [];\n if (this.itemSizeCache.size === 0) return snapshot;\n const m = this.getMeasurements();\n for (const item of m) {\n if (item && this.itemSizeCache.has(item.key)) {\n snapshot.push({\n index: item.index,\n key: item.key,\n start: item.start,\n size: item.size,\n end: item.end,\n lane: item.lane\n });\n }\n }\n return snapshot;\n };\n this._scrollToOffset = (offset, {\n adjustments,\n behavior\n }) => {\n this._intendedScrollOffset = offset + (adjustments ?? 0);\n this.options.scrollToFn(offset, { behavior, adjustments }, this);\n };\n this.measure = () => {\n this.pendingMin = null;\n this.itemSizeCache.clear();\n this.laneAssignments.clear();\n this.itemSizeCacheVersion++;\n this.notify(false);\n };\n this.setOptions(opts);\n }\n // Returns `true` when it performed a synchronous `scrollTop` write this\n // tick, `false` when the delta was zero or the write was deferred (iOS).\n // `resizeItem` uses that to decide whether the follow-up `notify` must be\n // synchronous so the grown transforms commit in the same paint (#1227).\n applyScrollAdjustment(delta, behavior) {\n if (delta === 0) return false;\n if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n console.info(\"correction\", delta);\n }\n if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n this._iosDeferredAdjustment += delta;\n return false;\n } else {\n const target = this.getScrollOffset() + this.scrollAdjustments + delta;\n const el = this.scrollElement;\n const maxAtWrite = el !== null && (\"scrollHeight\" in el || \"document\" in el) ? this.getMaxScrollOffset() : null;\n this._clampedAdjustment = maxAtWrite !== null && target > maxAtWrite + 0.5 ? { target, maxAtWrite } : null;\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: this.scrollAdjustments += delta,\n behavior\n });\n if (this.scrollOffset !== null) {\n this.scrollOffset += this.scrollAdjustments;\n if (this.scrollOffset < 0) this.scrollOffset = 0;\n this.scrollAdjustments = 0;\n }\n return true;\n }\n }\n scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null;\n return;\n }\n if (this.rafId != null) return;\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null;\n this.reconcileScroll();\n });\n }\n reconcileScroll() {\n if (!this.scrollState) return;\n const el = this.scrollElement;\n if (!el) return;\n const MAX_RECONCILE_MS = 5e3;\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null;\n return;\n }\n const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;\n const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;\n const STABLE_FRAMES = 1;\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n this.scrollState.stableFrames++;\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n if (this.getScrollOffset() !== targetOffset) {\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: \"auto\"\n });\n }\n this.scrollState = null;\n return;\n }\n } else {\n this.scrollState.stableFrames = 0;\n if (targetChanged) {\n const viewport = this.getSize() || 600;\n const distance = Math.abs(targetOffset - this.getScrollOffset());\n const keepSmooth = this.scrollState.behavior === \"smooth\" && distance > viewport;\n this.scrollState.lastTargetOffset = targetOffset;\n if (!keepSmooth) {\n this.scrollState.behavior = \"auto\";\n }\n this._scrollToOffset(targetOffset, {\n adjustments: void 0,\n behavior: keepSmooth ? \"smooth\" : \"auto\"\n });\n }\n }\n this.scheduleScrollReconcile();\n }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction findNearestBinarySearchFlat(flat, high, value) {\n let low = 0;\n while (low <= high) {\n const middle = (low + high) / 2 | 0;\n const currentValue = flat[middle * 2];\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n return low > 0 ? low - 1 : 0;\n}\nfunction calculateRangeImpl(measurements, outerSize, scrollOffset, lanes, flat) {\n const lastIndex = measurements.length - 1;\n if (measurements.length <= lanes) {\n return { startIndex: 0, endIndex: lastIndex };\n }\n if (lanes === 1 && flat !== null) {\n const startIndex2 = findNearestBinarySearchFlat(\n flat,\n lastIndex,\n scrollOffset\n );\n let endIndex2 = startIndex2;\n const limit = scrollOffset + outerSize;\n while (endIndex2 < lastIndex && flat[endIndex2 * 2] + flat[endIndex2 * 2 + 1] < limit) {\n endIndex2++;\n }\n return { startIndex: startIndex2, endIndex: endIndex2 };\n }\n const getStart = (index) => measurements[index].start;\n let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n let endIndex = startIndex;\n if (lanes === 1) {\n while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n } else if (lanes > 1) {\n const endPerLane = Array(lanes).fill(0);\n while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n const item = measurements[endIndex];\n endPerLane[item.lane] = item.end;\n endIndex++;\n }\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex];\n startPerLane[item.lane] = item.start;\n startIndex--;\n }\n startIndex = Math.max(0, startIndex - startIndex % lanes);\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n }\n return { startIndex, endIndex };\n}\nexport {\n Virtualizer,\n _resetIOSDetectionForTests,\n approxEqual,\n debounce,\n defaultKeyExtractor,\n defaultRangeExtractor,\n elementScroll,\n measureElement,\n memo,\n notUndefined,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase({\n useFlushSync = true,\n directDomUpdates = false,\n directDomUpdatesMode = \"transform\",\n ...options\n}) {\n const rerender = React.useReducer((x) => x + 1, 0)[1];\n const directRef = React.useRef({\n enabled: directDomUpdates,\n mode: directDomUpdatesMode,\n container: null,\n lastSize: null,\n // Keyed by the element itself so a remounted node (same key, new DOM\n // node — e.g. when `enabled` is toggled off then on) is treated as fresh\n // and gets its style written.\n lastPositions: /* @__PURE__ */ new WeakMap(),\n prevRange: null\n });\n directRef.current.enabled = directDomUpdates;\n directRef.current.mode = directDomUpdatesMode;\n const applyContainerSize = (instance2) => {\n const state = directRef.current;\n if (!state.enabled || !state.container) return;\n const totalSize = instance2.getTotalSize();\n if (totalSize !== state.lastSize) {\n state.lastSize = totalSize;\n const sizeAxis = instance2.options.horizontal ? \"width\" : \"height\";\n state.container.style[sizeAxis] = `${totalSize}px`;\n }\n };\n const applyDirectStyles = (instance2) => {\n const state = directRef.current;\n if (!state.enabled || !state.container) return;\n applyContainerSize(instance2);\n const horizontal = !!instance2.options.horizontal;\n const useTransform = state.mode === \"transform\";\n const posAxis = horizontal ? \"left\" : \"top\";\n const scrollMargin = instance2.options.scrollMargin;\n const items = instance2.getVirtualItems();\n for (const item of items) {\n const next = item.start - scrollMargin;\n const el = instance2.elementsCache.get(item.key);\n if (!el) continue;\n if (state.lastPositions.get(el) === next) continue;\n state.lastPositions.set(el, next);\n if (useTransform) {\n el.style.transform = horizontal ? `translate3d(${next}px, 0, 0)` : `translate3d(0, ${next}px, 0)`;\n } else {\n el.style[posAxis] = `${next}px`;\n }\n }\n };\n const resolvedOptions = {\n ...options,\n onChange: (instance2, sync) => {\n var _a;\n const state = directRef.current;\n let shouldRerender = true;\n if (state.enabled) {\n applyDirectStyles(instance2);\n const range = instance2.range;\n const prev = state.prevRange;\n shouldRerender = !prev || prev.isScrolling !== instance2.isScrolling || prev.startIndex !== (range == null ? void 0 : range.startIndex) || prev.endIndex !== (range == null ? void 0 : range.endIndex);\n if (shouldRerender) {\n state.prevRange = range ? {\n startIndex: range.startIndex,\n endIndex: range.endIndex,\n isScrolling: instance2.isScrolling\n } : null;\n }\n }\n if (shouldRerender) {\n if (useFlushSync && sync) {\n flushSync(rerender);\n } else {\n rerender();\n }\n }\n (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n }\n };\n const [instance] = React.useState(() => {\n const v = new Virtualizer(resolvedOptions);\n return Object.assign(v, {\n containerRef: (node) => {\n const state = directRef.current;\n state.container = node;\n state.lastSize = null;\n if (node && state.enabled) {\n const total = v.getTotalSize();\n state.lastSize = total;\n const axis = v.options.horizontal ? \"width\" : \"height\";\n node.style[axis] = `${total}px`;\n }\n }\n });\n });\n instance.setOptions(resolvedOptions);\n useIsomorphicLayoutEffect(() => {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(() => {\n applyContainerSize(instance);\n return instance._willUpdate();\n });\n useIsomorphicLayoutEffect(() => {\n applyDirectStyles(instance);\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase({\n observeElementRect,\n observeElementOffset,\n scrollToFn: elementScroll,\n ...options\n });\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase({\n getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n ...options\n });\n}\nexport {\n useVirtualizer,\n useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","/* Virtual List Container */\r\n.virtualList {\r\n position: relative;\r\n overflow: auto;\r\n contain: strict;\r\n width: 100%;\r\n padding-bottom: 300px;\r\n}\r\n\r\n/* Empty State Container */\r\n.emptyContainer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: var(--color-fg-muted);\r\n}\r\n\r\n/* Virtual List Inner Container */\r\n.virtualListInner {\r\n width: 100%;\r\n position: relative;\r\n}\r\n\r\n/* Virtual List Items Wrapper */\r\n.virtualListItems {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n}\r\n\r\n/* Loading More Indicator */\r\n.loadingMore {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n font-size: 0.875rem;\r\n}\r\n\r\n/* End of List Indicator */\r\n.endOfList {\r\n display: flex;\r\n justify-content: center;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n font-size: 0.875rem;\r\n border-top: 1px solid var(--color-border-3);\r\n margin-top: 1rem;\r\n}\r\n\r\n.endOfList span {\r\n padding: 0.5rem 1rem;\r\n background-color: var(--color-bg-2);\r\n border-radius: var(--radius-button);\r\n}","/**\n * 虚拟列表:基于 @tanstack/react-virtual,支持无限滚动 fetchNextPage。Virtual list; @tanstack/react-virtual, fetchNextPage.\n *\n * @example\n * ```tsx\n * * 与 useInfiniteQuery 配合,data 为 pages 拍平后的 items\n * <VirtualList data={items} getItemKey={(i) => i.id} renderItem={(i) => <Row item={i} />} hasNextPage fetchNextPage={fetchNextPage} />\n * ```\n */\nimport type { VirtualizerOptions } from \"@tanstack/react-virtual\";\nimport type { ReactNode } from \"react\";\n\nimport { memo, useCallback, useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface VirtualListProps<T> extends Partial<\n Omit<\n VirtualizerOptions<HTMLDivElement, Element>,\n \"count\" | \"getScrollElement\" | \"observeElementRect\" | \"observeElementOffset\" | \"scrollToFn\" | \"getItemKey\" | \"estimateSize\"\n >\n> {\n /** 数据列表。Data array. */\n data: T[];\n /** 是否有下一页。Has next page. */\n hasNextPage?: boolean;\n /** 是否正在拉取下一页。Is fetching next page. */\n isFetchingNextPage?: boolean;\n /** 拉取下一页。Fetch next page. */\n fetchNextPage?: () => void;\n /** 单项渲染。Render item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** 单项高度估计。Estimate item size. */\n estimateSize?: number | ((index: number) => number);\n /** 列表高度。List height. */\n height?: string | number;\n /** 单项 key。Get item key. */\n getItemKey: (item: T, index: number) => string | number;\n /** 空状态自定义节点。Empty state node. */\n emptyState?: ReactNode;\n /** 加载更多指示器。Loading indicator node. */\n loadingIndicator?: ReactNode;\n /** 列表底指示器。End of list indicator node. */\n endOfListIndicator?: ReactNode;\n /** 当未提供 emptyState 时使用的文案,由调用方传入。Text when no data; used when emptyState not provided. */\n emptyText?: ReactNode;\n /** 当未提供 loadingIndicator 时使用的文案。Text when loading more. */\n loadingMoreText?: ReactNode;\n /** 当未提供 endOfListIndicator 时使用的文案。Text at end of list. */\n endOfListText?: ReactNode;\n /** 列表项容器 className。Flex container class. */\n flexClass?: string;\n /** 外层容器 className。Outer class. */\n outerClass?: string;\n /** 内层容器 className。Inner class. */\n innerClass?: string;\n}\n\nfunction VirtualListComponent<T>({\n data,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n renderItem,\n estimateSize = 200,\n overscan = 5,\n height = \"600px\",\n getItemKey,\n emptyState,\n loadingIndicator,\n endOfListIndicator,\n emptyText = \"No data\",\n loadingMoreText = \"Loading more...\",\n endOfListText = \"No more items\",\n flexClass,\n outerClass,\n innerClass,\n ...virtualizerOptions\n}: VirtualListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null);\n\n // 防御性检查:确保 data 是数组\n const safeData = Array.isArray(data) ? data : [];\n const dataLength = safeData.length;\n\n // Setup virtualizer\n // eslint-disable-next-line react-hooks/incompatible-library\n const rowVirtualizer = useVirtualizer({\n count: hasNextPage ? dataLength + 1 : dataLength,\n getScrollElement: () => parentRef.current,\n estimateSize: typeof estimateSize === \"number\" ? () => estimateSize : estimateSize,\n overscan,\n ...virtualizerOptions,\n });\n\n const items = rowVirtualizer.getVirtualItems();\n\n // Auto-fetch when scrolling near bottom (following official pattern)\n useEffect(() => {\n const [lastItem] = [...items].reverse();\n\n if (!lastItem) {\n return;\n }\n\n if (lastItem.index >= dataLength - 1 && hasNextPage && !isFetchingNextPage && fetchNextPage) {\n fetchNextPage();\n }\n }, [hasNextPage, fetchNextPage, dataLength, isFetchingNextPage, items]);\n\n const renderEmptyState = useCallback(() => {\n return (\n <div\n className={styles.virtualList}\n style={{\n height: typeof height === \"number\" ? `${height}px` : height,\n }}\n >\n {emptyState ?? (\n <div className={styles.emptyContainer}>\n <span>{emptyText}</span>\n </div>\n )}\n </div>\n );\n }, [emptyState, height, emptyText]);\n\n const renderLoadingIndicator = useCallback(() => {\n if (loadingIndicator) return loadingIndicator;\n return (\n <div className={styles.loadingMore}>\n <span>{loadingMoreText}</span>\n </div>\n );\n }, [loadingIndicator, loadingMoreText]);\n\n const renderEndOfListIndicator = useCallback(() => {\n if (endOfListIndicator) return endOfListIndicator;\n return (\n <div className={styles.endOfList}>\n <span>{endOfListText}</span>\n </div>\n );\n }, [endOfListIndicator, endOfListText]);\n\n // Show empty state if no data\n if (dataLength === 0) return renderEmptyState();\n\n return (\n <div\n ref={parentRef}\n className={`${styles.virtualList} ${outerClass ?? \"\"}`}\n style={{\n height: typeof height === \"number\" ? `${height}px` : height,\n }}\n >\n <div\n className={`${styles.virtualListInner} ${innerClass ?? \"\"}`}\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n <div\n className={`${styles.virtualListItems} ${flexClass ?? \"\"}`}\n style={{\n transform: `translateY(${items[0]?.start ?? 0}px)`,\n paddingTop: `2px`,\n }}\n >\n {items.map((virtualRow) => {\n const isLoaderRow = virtualRow.index > dataLength - 1;\n const item = safeData[virtualRow.index];\n\n return (\n <div key={virtualRow.key} data-index={virtualRow.index} ref={rowVirtualizer.measureElement}>\n {isLoaderRow ? (\n hasNextPage ? (\n renderLoadingIndicator()\n ) : (\n renderEndOfListIndicator()\n )\n ) : (\n <div key={getItemKey(item, virtualRow.index)}>{renderItem(item, virtualRow.index)}</div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\n// Use memo with generic type\nconst VirtualList = memo(VirtualListComponent) as typeof VirtualListComponent;\nexport default VirtualList;\n","/* 外层容器 */\r\n.virtualList {\r\n width: 100%;\r\n position: relative;\r\n overflow: visible; /* ✅ window 滚动,不是列表滚动 */\r\n padding-bottom: 300px;\r\n }\r\n \r\n /* 内层:撑出总高度 */\r\n .virtualListInner {\r\n width: 100%;\r\n position: relative;\r\n }\r\n \r\n /* 基于 translateY 的内容容器 */\r\n .virtualListItems {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n }\r\n \r\n /* 行样式(你不一定用得上,但可选) */\r\n .virtualListRow {\r\n width: 100%;\r\n }\r\n \r\n /* 无数据 */\r\n .emptyContainer {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 2rem 0;\r\n color: var(--color-fg-muted);\r\n }\r\n \r\n /* 加载中 */\r\n .loadingMore {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 1.5rem 0;\r\n color: var(--color-fg-muted);\r\n }\r\n \r\n /* 末尾提示 */\r\n .endOfList {\r\n display: flex;\r\n justify-content: center;\r\n padding: 1.5rem 0;\r\n color: var(--color-fg-muted);\r\n border-top: 1px solid var(--color-border-3);\r\n }\r\n ","/**\n * 窗口虚拟列表:基于 useWindowVirtualizer,相对视口滚动。Window virtual list; uses useWindowVirtualizer, scroll relative to viewport.\n *\n * @example\n * ```tsx\n * * 与无限列表数据配合\n * <VirtualWindowList\n * data={items}\n * getItemKey={(item) => item.id}\n * renderItem={(item) => <Row item={item} />}\n * hasNextPage={hasNextPage}\n * fetchNextPage={fetchNextPage}\n * />\n * ```\n */\nimport type { VirtualizerOptions } from \"@tanstack/react-virtual\";\nimport type { ReactNode } from \"react\";\n\nimport { memo, useCallback, useEffect } from \"react\";\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\";\n\nimport styles from \"./styles.module.css\";\n\nexport interface VirtualWindowListProps<T> extends Partial<\n Omit<\n VirtualizerOptions<Window, Element>,\n \"count\" | \"getScrollElement\" | \"observeElementRect\" | \"observeElementOffset\" | \"scrollToFn\" | \"estimateSize\" | \"getItemKey\"\n >\n> {\n /** 数据列表。Data array. */\n data: T[];\n /** 是否有下一页。Has next page. */\n hasNextPage?: boolean;\n /** 是否正在拉取下一页。Is fetching next page. */\n isFetchingNextPage?: boolean;\n /** 拉取下一页。Fetch next page. */\n fetchNextPage?: () => void;\n /** 单项渲染。Render item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** 单项高度估计。Estimate item size. */\n estimateSize?: number | ((index: number) => number);\n /** 列表高度。List height. */\n height?: string | number;\n /** 单项 key。Get item key. */\n getItemKey: (item: T, index: number) => string | number;\n /** 空状态自定义节点。Empty state node. */\n emptyState?: ReactNode;\n /** 加载更多指示器。Loading indicator node. */\n loadingIndicator?: ReactNode;\n /** 列表底指示器。End of list indicator node. */\n endOfListIndicator?: ReactNode;\n /** 空状态文案(未提供 emptyState 时)。Empty text. */\n emptyText?: ReactNode;\n /** 加载更多文案。Loading more text. */\n loadingMoreText?: ReactNode;\n /** 列表底文案。End of list text. */\n endOfListText?: ReactNode;\n /** 列表项容器 className。Flex container class. */\n flexClass?: string;\n /** 外层容器 className。Outer class. */\n outerClass?: string;\n /** 内层容器 className。Inner class. */\n innerClass?: string;\n}\n\n/* -------------------------------------------\n ✅ MAIN COMPONENT\n-------------------------------------------- */\nfunction VirtualWindowListComponent<T>({\n data,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n renderItem,\n estimateSize = 200,\n overscan = 5,\n height,\n getItemKey,\n\n emptyState,\n loadingIndicator,\n endOfListIndicator,\n emptyText = \"No data\",\n loadingMoreText = \"Loading more...\",\n endOfListText = \"No more items\",\n flexClass,\n outerClass,\n innerClass,\n ...virtualizerOptions\n}: VirtualWindowListProps<T>) {\n /* ✅ 防御性检查:确保 data 是数组 */\n const safeData = Array.isArray(data) ? data : [];\n const dataLength = safeData.length;\n\n /* ✅ 真正的 window 虚拟滚动器 */\n const virtualizer = useWindowVirtualizer({\n count: hasNextPage ? dataLength + 1 : dataLength,\n estimateSize: typeof estimateSize === \"number\" ? () => estimateSize : estimateSize,\n overscan,\n ...virtualizerOptions,\n });\n\n const items = virtualizer.getVirtualItems();\n\n /* ✅ 自动加载更多 */\n useEffect(() => {\n const last = items[items.length - 1];\n if (!last) return;\n\n const isLoaderRow = last.index >= dataLength;\n\n if (isLoaderRow && hasNextPage && !isFetchingNextPage && fetchNextPage) {\n fetchNextPage();\n }\n }, [items, hasNextPage, isFetchingNextPage, fetchNextPage, dataLength]);\n\n const renderEmptyState = useCallback(() => {\n return (\n <div\n className={styles.virtualList}\n style={{\n height: typeof height === \"number\" ? `${height}px` : (height ?? \"auto\"),\n }}\n >\n {emptyState ?? (\n <div className={styles.emptyContainer}>\n <span>{emptyText}</span>\n </div>\n )}\n </div>\n );\n }, [emptyState, height, emptyText]);\n\n const renderLoadingIndicator = useCallback(() => {\n return (\n loadingIndicator ?? (\n <div className={styles.loadingMore}>\n <span>{loadingMoreText}</span>\n </div>\n )\n );\n }, [loadingIndicator, loadingMoreText]);\n\n const renderEndOfListIndicator = useCallback(() => {\n return (\n endOfListIndicator ?? (\n <div className={styles.endOfList}>\n <span>{endOfListText}</span>\n </div>\n )\n );\n }, [endOfListIndicator, endOfListText]);\n\n /* ✅ 无数据情况 */\n if (dataLength === 0) return renderEmptyState();\n\n /* ✅ 正常渲染 */\n return (\n <div className={`${styles.virtualList} ${outerClass ?? \"\"}`}>\n <div\n className={`${styles.virtualListInner} ${innerClass ?? \"\"}`}\n style={{\n height: virtualizer.getTotalSize(),\n }}\n >\n <div\n className={`${styles.virtualListItems} ${flexClass ?? \"\"}`}\n style={{\n transform: `translateY(${items[0]?.start ?? 0}px)`,\n }}\n >\n {items.map((row) => {\n const isLoaderRow = row.index >= dataLength;\n const item = safeData[row.index];\n\n return (\n <div key={row.key} data-index={row.index} ref={virtualizer.measureElement}>\n {isLoaderRow ? (\n hasNextPage ? (\n renderLoadingIndicator()\n ) : (\n renderEndOfListIndicator()\n )\n ) : item == null ? (\n <div key={`missing-${row.index}`} />\n ) : (\n <div key={getItemKey(item, row.index)}>{renderItem(item, row.index)}</div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nconst VirtualWindowList = memo(VirtualWindowListComponent) as typeof VirtualWindowListComponent;\n\nexport default VirtualWindowList;\n","import type { LayoutSwitcherProps } from \"@/designs/layouts/types\";\n\nimport { memo } from \"react\";\nimport { SegmentedControl } from \"@radix-ui/themes\";\n\nimport useLayout from \"@/designs/layouts/hooks/useLayout\";\nimport { LAYOUT_MODE_VALUES, LayoutModeEnum } from \"@/designs/layouts/types\";\n\nconst LayoutSwitcher = memo(({ getLayoutDisplayName, handleChangeLayoutMode }: LayoutSwitcherProps) => {\n const { layoutMode, setLayoutMode } = useLayout();\n const getDisplayName = getLayoutDisplayName ?? ((mode: LayoutModeEnum) => mode);\n\n return (\n <SegmentedControl.Root\n size=\"1\"\n value={layoutMode}\n onValueChange={(next) => {\n const mode = next as LayoutModeEnum;\n setLayoutMode(mode);\n handleChangeLayoutMode?.(mode);\n }}\n >\n {LAYOUT_MODE_VALUES.map((mode) => (\n <SegmentedControl.Item key={mode} value={mode}>\n {getDisplayName(mode)}\n </SegmentedControl.Item>\n ))}\n </SegmentedControl.Root>\n );\n});\n\nLayoutSwitcher.displayName = \"LayoutSwitcher\";\nexport default LayoutSwitcher;\n"],"x_google_ignoreList":[8,9,10,11],"mappings":"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"}