taro-uno-ui 0.9.0-beta

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 (397) hide show
  1. package/LICENSE +100 -0
  2. package/README.md +273 -0
  3. package/dist/js/index-6NJ3A1Dn.js +26535 -0
  4. package/dist/js/index-6NJ3A1Dn.js.map +1 -0
  5. package/dist/js/index-DFdcksbe.js +1165 -0
  6. package/dist/js/index-DFdcksbe.js.map +1 -0
  7. package/dist/js/index-DXRIkWX1.js +1148 -0
  8. package/dist/js/index-DXRIkWX1.js.map +1 -0
  9. package/dist/js/index-DffLRSro.js +26519 -0
  10. package/dist/js/index-DffLRSro.js.map +1 -0
  11. package/package.json +119 -0
  12. package/src/app.config.ts +55 -0
  13. package/src/app.scss +508 -0
  14. package/src/app.tsx +44 -0
  15. package/src/components/basic/Button/Button.styles.ts +130 -0
  16. package/src/components/basic/Button/Button.test.tsx +154 -0
  17. package/src/components/basic/Button/Button.tsx +93 -0
  18. package/src/components/basic/Button/Button.types.ts +45 -0
  19. package/src/components/basic/Button/index.tsx +6 -0
  20. package/src/components/basic/Divider/Divider.styles.ts +488 -0
  21. package/src/components/basic/Divider/Divider.test.tsx +551 -0
  22. package/src/components/basic/Divider/Divider.tsx +361 -0
  23. package/src/components/basic/Divider/Divider.types.ts +261 -0
  24. package/src/components/basic/Divider/index.tsx +25 -0
  25. package/src/components/basic/Icon/Icon.styles.ts +359 -0
  26. package/src/components/basic/Icon/Icon.test.tsx +357 -0
  27. package/src/components/basic/Icon/Icon.tsx +154 -0
  28. package/src/components/basic/Icon/Icon.types.ts +210 -0
  29. package/src/components/basic/Icon/index.tsx +22 -0
  30. package/src/components/basic/Text/Text.styles.ts +500 -0
  31. package/src/components/basic/Text/Text.test.tsx +299 -0
  32. package/src/components/basic/Text/Text.tsx +340 -0
  33. package/src/components/basic/Text/Text.types.ts +319 -0
  34. package/src/components/basic/Text/index.tsx +27 -0
  35. package/src/components/basic/Typography/Typography.styles.ts +346 -0
  36. package/src/components/basic/Typography/Typography.tsx +205 -0
  37. package/src/components/basic/Typography/Typography.types.ts +296 -0
  38. package/src/components/basic/Typography/index.tsx +14 -0
  39. package/src/components/basic/index.tsx +302 -0
  40. package/src/components/common/ErrorBoundary.tsx +87 -0
  41. package/src/components/common/LazyComponent.tsx +246 -0
  42. package/src/components/common/ResponsiveContainer.tsx +93 -0
  43. package/src/components/common/ResponsiveGrid.tsx +183 -0
  44. package/src/components/common/SecurityProvider.tsx +110 -0
  45. package/src/components/common/ThemeProvider.tsx +128 -0
  46. package/src/components/common/VirtualList.tsx +368 -0
  47. package/src/components/common/__tests__/ErrorBoundary.test.tsx +249 -0
  48. package/src/components/common/index.tsx +7 -0
  49. package/src/components/display/Avatar/Avatar.styles.ts +62 -0
  50. package/src/components/display/Avatar/Avatar.test.tsx +390 -0
  51. package/src/components/display/Avatar/Avatar.tsx +79 -0
  52. package/src/components/display/Avatar/Avatar.types.ts +40 -0
  53. package/src/components/display/Avatar/index.ts +3 -0
  54. package/src/components/display/Badge/Badge.tsx +42 -0
  55. package/src/components/display/Badge/Badge.types.ts +29 -0
  56. package/src/components/display/Badge/index.ts +2 -0
  57. package/src/components/display/Calendar/Calendar.styles.ts +255 -0
  58. package/src/components/display/Calendar/Calendar.test.tsx +30 -0
  59. package/src/components/display/Calendar/Calendar.tsx +337 -0
  60. package/src/components/display/Calendar/Calendar.types.ts +91 -0
  61. package/src/components/display/Calendar/index.ts +3 -0
  62. package/src/components/display/Card/Card.styles.ts +89 -0
  63. package/src/components/display/Card/Card.test.tsx +180 -0
  64. package/src/components/display/Card/Card.tsx +135 -0
  65. package/src/components/display/Card/Card.types.ts +55 -0
  66. package/src/components/display/Card/index.ts +3 -0
  67. package/src/components/display/Carousel/Carousel.styles.ts +206 -0
  68. package/src/components/display/Carousel/Carousel.tsx +295 -0
  69. package/src/components/display/Carousel/Carousel.types.ts +57 -0
  70. package/src/components/display/Carousel/index.ts +3 -0
  71. package/src/components/display/List/List.styles.ts +79 -0
  72. package/src/components/display/List/List.tsx +115 -0
  73. package/src/components/display/List/List.types.ts +68 -0
  74. package/src/components/display/List/index.ts +3 -0
  75. package/src/components/display/Rate/Rate.styles.ts +266 -0
  76. package/src/components/display/Rate/Rate.tsx +332 -0
  77. package/src/components/display/Rate/Rate.types.ts +111 -0
  78. package/src/components/display/Rate/index.ts +28 -0
  79. package/src/components/display/Table/Table.styles.ts +269 -0
  80. package/src/components/display/Table/Table.test.tsx +343 -0
  81. package/src/components/display/Table/Table.tsx +430 -0
  82. package/src/components/display/Table/Table.types.ts +255 -0
  83. package/src/components/display/Table/index.tsx +16 -0
  84. package/src/components/display/Tag/Tag.styles.ts +197 -0
  85. package/src/components/display/Tag/Tag.test.tsx +541 -0
  86. package/src/components/display/Tag/Tag.tsx +156 -0
  87. package/src/components/display/Tag/Tag.types.ts +49 -0
  88. package/src/components/display/Tag/index.ts +3 -0
  89. package/src/components/display/Timeline/Timeline.styles.ts +211 -0
  90. package/src/components/display/Timeline/Timeline.tsx +239 -0
  91. package/src/components/display/Timeline/Timeline.types.ts +56 -0
  92. package/src/components/display/Timeline/index.ts +3 -0
  93. package/src/components/display/index.tsx +143 -0
  94. package/src/components/feedback/Loading/Loading.styles.ts +117 -0
  95. package/src/components/feedback/Loading/Loading.test.tsx +534 -0
  96. package/src/components/feedback/Loading/Loading.tsx +127 -0
  97. package/src/components/feedback/Loading/Loading.types.ts +33 -0
  98. package/src/components/feedback/Loading/index.ts +9 -0
  99. package/src/components/feedback/Message/Message.styles.ts +41 -0
  100. package/src/components/feedback/Message/Message.test.tsx +234 -0
  101. package/src/components/feedback/Message/Message.tsx +96 -0
  102. package/src/components/feedback/Message/Message.types.ts +37 -0
  103. package/src/components/feedback/Message/index.ts +9 -0
  104. package/src/components/feedback/Modal/Modal.styles.ts +21 -0
  105. package/src/components/feedback/Modal/Modal.test.tsx +11 -0
  106. package/src/components/feedback/Modal/Modal.tsx +291 -0
  107. package/src/components/feedback/Modal/Modal.types.ts +141 -0
  108. package/src/components/feedback/Modal/index.tsx +11 -0
  109. package/src/components/feedback/Notification/Notification.styles.ts +443 -0
  110. package/src/components/feedback/Notification/Notification.test.tsx +401 -0
  111. package/src/components/feedback/Notification/Notification.tsx +370 -0
  112. package/src/components/feedback/Notification/Notification.types.ts +336 -0
  113. package/src/components/feedback/Notification/NotificationManager.tsx +376 -0
  114. package/src/components/feedback/Notification/index.ts +33 -0
  115. package/src/components/feedback/Notification/index.tsx +164 -0
  116. package/src/components/feedback/Progress/Progress.styles.ts +460 -0
  117. package/src/components/feedback/Progress/Progress.test.simple.tsx +14 -0
  118. package/src/components/feedback/Progress/Progress.test.tsx +312 -0
  119. package/src/components/feedback/Progress/Progress.tsx +508 -0
  120. package/src/components/feedback/Progress/Progress.types.ts +163 -0
  121. package/src/components/feedback/Progress/index.ts +3 -0
  122. package/src/components/feedback/Progress/index.tsx +38 -0
  123. package/src/components/feedback/Progress/utils/animation.ts +204 -0
  124. package/src/components/feedback/Progress/utils/index.ts +26 -0
  125. package/src/components/feedback/Progress/utils/progress-calculator.ts +217 -0
  126. package/src/components/feedback/Result/Result.styles.ts +139 -0
  127. package/src/components/feedback/Result/Result.tsx +233 -0
  128. package/src/components/feedback/Result/Result.types.ts +128 -0
  129. package/src/components/feedback/Result/index.tsx +3 -0
  130. package/src/components/feedback/Toast/Toast.styles.ts +17 -0
  131. package/src/components/feedback/Toast/Toast.test.tsx +10 -0
  132. package/src/components/feedback/Toast/Toast.tsx +372 -0
  133. package/src/components/feedback/Toast/Toast.types.ts +86 -0
  134. package/src/components/feedback/Toast/index.tsx +3 -0
  135. package/src/components/feedback/Tooltip/Tooltip.examples.tsx +458 -0
  136. package/src/components/feedback/Tooltip/Tooltip.styles.ts +346 -0
  137. package/src/components/feedback/Tooltip/Tooltip.test.tsx +446 -0
  138. package/src/components/feedback/Tooltip/Tooltip.tsx +283 -0
  139. package/src/components/feedback/Tooltip/Tooltip.types.ts +172 -0
  140. package/src/components/feedback/Tooltip/index.ts +3 -0
  141. package/src/components/feedback/Tooltip/index.tsx +258 -0
  142. package/src/components/feedback/index.tsx +164 -0
  143. package/src/components/form/Cascader/Cascader.styles.ts +526 -0
  144. package/src/components/form/Cascader/Cascader.test.tsx +77 -0
  145. package/src/components/form/Cascader/Cascader.tsx +585 -0
  146. package/src/components/form/Cascader/Cascader.types.ts +582 -0
  147. package/src/components/form/Cascader/hooks/index.ts +3 -0
  148. package/src/components/form/Cascader/hooks/useCascaderFieldNames.ts +16 -0
  149. package/src/components/form/Cascader/hooks/useCascaderOptions.ts +109 -0
  150. package/src/components/form/Cascader/hooks/useCascaderState.ts +133 -0
  151. package/src/components/form/Cascader/index.ts +25 -0
  152. package/src/components/form/Cascader/utils/formatDisplayValue.ts +19 -0
  153. package/src/components/form/Cascader/utils/index.ts +1 -0
  154. package/src/components/form/Checkbox/Checkbox.styles.ts +608 -0
  155. package/src/components/form/Checkbox/Checkbox.test.tsx +1140 -0
  156. package/src/components/form/Checkbox/Checkbox.tsx +496 -0
  157. package/src/components/form/Checkbox/Checkbox.types.ts +472 -0
  158. package/src/components/form/Checkbox/CheckboxGroup.tsx +444 -0
  159. package/src/components/form/Checkbox/index.tsx +27 -0
  160. package/src/components/form/DatePicker/DatePicker.styles.ts +393 -0
  161. package/src/components/form/DatePicker/DatePicker.test.tsx +407 -0
  162. package/src/components/form/DatePicker/DatePicker.tsx +360 -0
  163. package/src/components/form/DatePicker/DatePicker.types.ts +247 -0
  164. package/src/components/form/DatePicker/index.tsx +15 -0
  165. package/src/components/form/Form/Form.styles.ts +357 -0
  166. package/src/components/form/Form/Form.test.tsx +122 -0
  167. package/src/components/form/Form/Form.tsx +695 -0
  168. package/src/components/form/Form/Form.types.ts +407 -0
  169. package/src/components/form/Form/index.tsx +31 -0
  170. package/src/components/form/Input/Input.enhanced.tsx +732 -0
  171. package/src/components/form/Input/Input.styles.ts +438 -0
  172. package/src/components/form/Input/Input.test.tsx +494 -0
  173. package/src/components/form/Input/Input.tsx +541 -0
  174. package/src/components/form/Input/Input.types.ts +285 -0
  175. package/src/components/form/Input/index.tsx +26 -0
  176. package/src/components/form/InputNumber/InputNumber.styles.ts +665 -0
  177. package/src/components/form/InputNumber/InputNumber.tsx +370 -0
  178. package/src/components/form/InputNumber/InputNumber.types.ts +318 -0
  179. package/src/components/form/InputNumber/components/InputNumberClearButton.tsx +32 -0
  180. package/src/components/form/InputNumber/components/InputNumberControls.tsx +42 -0
  181. package/src/components/form/InputNumber/components/index.ts +2 -0
  182. package/src/components/form/InputNumber/hooks/index.ts +4 -0
  183. package/src/components/form/InputNumber/hooks/useInputNumberState.ts +315 -0
  184. package/src/components/form/InputNumber/hooks/useInputNumberValidation.ts +147 -0
  185. package/src/components/form/InputNumber/index.ts +25 -0
  186. package/src/components/form/Radio/Radio.styles.ts +458 -0
  187. package/src/components/form/Radio/Radio.test.tsx +547 -0
  188. package/src/components/form/Radio/Radio.tsx +283 -0
  189. package/src/components/form/Radio/Radio.types.ts +410 -0
  190. package/src/components/form/Radio/index.tsx +21 -0
  191. package/src/components/form/Select/Select.styles.ts +514 -0
  192. package/src/components/form/Select/Select.test.tsx +648 -0
  193. package/src/components/form/Select/Select.tsx +474 -0
  194. package/src/components/form/Select/Select.types.ts +428 -0
  195. package/src/components/form/Select/index.tsx +30 -0
  196. package/src/components/form/Slider/Slider.styles.ts +139 -0
  197. package/src/components/form/Slider/Slider.test.tsx +553 -0
  198. package/src/components/form/Slider/Slider.tsx +326 -0
  199. package/src/components/form/Slider/Slider.types.ts +108 -0
  200. package/src/components/form/Slider/index.tsx +10 -0
  201. package/src/components/form/Switch/Switch.styles.ts +540 -0
  202. package/src/components/form/Switch/Switch.test.tsx +345 -0
  203. package/src/components/form/Switch/Switch.tsx +464 -0
  204. package/src/components/form/Switch/Switch.types.ts +386 -0
  205. package/src/components/form/Switch/index.tsx +26 -0
  206. package/src/components/form/Textarea/Textarea.styles.ts +592 -0
  207. package/src/components/form/Textarea/Textarea.test.tsx +1075 -0
  208. package/src/components/form/Textarea/Textarea.tsx +602 -0
  209. package/src/components/form/Textarea/Textarea.types.ts +371 -0
  210. package/src/components/form/Textarea/index.tsx +26 -0
  211. package/src/components/form/TimePicker/TimePicker.styles.ts +438 -0
  212. package/src/components/form/TimePicker/TimePicker.test.tsx +306 -0
  213. package/src/components/form/TimePicker/TimePicker.tsx +228 -0
  214. package/src/components/form/TimePicker/TimePicker.types.ts +385 -0
  215. package/src/components/form/TimePicker/index.ts +21 -0
  216. package/src/components/form/Transfer/Transfer.styles.ts +502 -0
  217. package/src/components/form/Transfer/Transfer.test.tsx +316 -0
  218. package/src/components/form/Transfer/Transfer.tsx +402 -0
  219. package/src/components/form/Transfer/Transfer.types.ts +557 -0
  220. package/src/components/form/Transfer/components/TransferItem.tsx +101 -0
  221. package/src/components/form/Transfer/components/TransferList.tsx +285 -0
  222. package/src/components/form/Transfer/components/TransferOperations.tsx +84 -0
  223. package/src/components/form/Transfer/components/TransferPagination.tsx +135 -0
  224. package/src/components/form/Transfer/components/TransferSearch.tsx +88 -0
  225. package/src/components/form/Transfer/components/index.ts +6 -0
  226. package/src/components/form/Transfer/hooks/index.ts +3 -0
  227. package/src/components/form/Transfer/hooks/useTransferData.ts +192 -0
  228. package/src/components/form/Transfer/hooks/useTransferState.ts +114 -0
  229. package/src/components/form/Transfer/index.ts +33 -0
  230. package/src/components/form/Upload/Upload.styles.ts +145 -0
  231. package/src/components/form/Upload/Upload.test.tsx +10 -0
  232. package/src/components/form/Upload/Upload.tsx +451 -0
  233. package/src/components/form/Upload/Upload.types.ts +200 -0
  234. package/src/components/form/Upload/index.tsx +12 -0
  235. package/src/components/form/index.tsx +121 -0
  236. package/src/components/index.tsx +146 -0
  237. package/src/components/layout/Affix/Affix.styles.ts +37 -0
  238. package/src/components/layout/Affix/Affix.test.tsx +10 -0
  239. package/src/components/layout/Affix/Affix.tsx +91 -0
  240. package/src/components/layout/Affix/Affix.types.ts +29 -0
  241. package/src/components/layout/Affix/index.tsx +3 -0
  242. package/src/components/layout/Col/Col.styles.ts +185 -0
  243. package/src/components/layout/Col/Col.test.tsx +535 -0
  244. package/src/components/layout/Col/Col.tsx +115 -0
  245. package/src/components/layout/Col/Col.types.ts +59 -0
  246. package/src/components/layout/Col/index.tsx +3 -0
  247. package/src/components/layout/Container/Container.styles.ts +161 -0
  248. package/src/components/layout/Container/Container.test.tsx +380 -0
  249. package/src/components/layout/Container/Container.tsx +132 -0
  250. package/src/components/layout/Container/Container.types.ts +63 -0
  251. package/src/components/layout/Container/index.tsx +3 -0
  252. package/src/components/layout/Grid/Grid.styles.ts +183 -0
  253. package/src/components/layout/Grid/Grid.test.tsx +637 -0
  254. package/src/components/layout/Grid/Grid.tsx +173 -0
  255. package/src/components/layout/Grid/Grid.types.ts +78 -0
  256. package/src/components/layout/Grid/index.tsx +3 -0
  257. package/src/components/layout/Layout/Content.tsx +38 -0
  258. package/src/components/layout/Layout/Footer.tsx +38 -0
  259. package/src/components/layout/Layout/Header.tsx +38 -0
  260. package/src/components/layout/Layout/Layout.styles.ts +84 -0
  261. package/src/components/layout/Layout/Layout.test.tsx +10 -0
  262. package/src/components/layout/Layout/Layout.tsx +39 -0
  263. package/src/components/layout/Layout/Layout.types.ts +58 -0
  264. package/src/components/layout/Layout/Sider.tsx +56 -0
  265. package/src/components/layout/Layout/index.tsx +8 -0
  266. package/src/components/layout/Row/Row.styles.ts +159 -0
  267. package/src/components/layout/Row/Row.test.tsx +467 -0
  268. package/src/components/layout/Row/Row.tsx +139 -0
  269. package/src/components/layout/Row/Row.types.ts +60 -0
  270. package/src/components/layout/Row/index.tsx +3 -0
  271. package/src/components/layout/Space/Space.styles.ts +255 -0
  272. package/src/components/layout/Space/Space.test.tsx +682 -0
  273. package/src/components/layout/Space/Space.tsx +211 -0
  274. package/src/components/layout/Space/Space.types.ts +92 -0
  275. package/src/components/layout/Space/index.tsx +12 -0
  276. package/src/components/layout/index.tsx +68 -0
  277. package/src/components/navigation/Menu/Menu.styles.ts +779 -0
  278. package/src/components/navigation/Menu/Menu.tsx +355 -0
  279. package/src/components/navigation/Menu/Menu.types.ts +231 -0
  280. package/src/components/navigation/Menu/Menu.utils.ts +187 -0
  281. package/src/components/navigation/Menu/MenuItem.tsx +126 -0
  282. package/src/components/navigation/Menu/SubMenu.tsx +148 -0
  283. package/src/components/navigation/Menu/__tests__/Menu.test.tsx +687 -0
  284. package/src/components/navigation/Menu/index.tsx +124 -0
  285. package/src/components/navigation/NavBar/NavBar.styles.ts +129 -0
  286. package/src/components/navigation/NavBar/NavBar.test.tsx +287 -0
  287. package/src/components/navigation/NavBar/NavBar.tsx +231 -0
  288. package/src/components/navigation/NavBar/NavBar.types.ts +54 -0
  289. package/src/components/navigation/NavBar/index.tsx +3 -0
  290. package/src/components/navigation/Pagination/Pagination.styles.ts +187 -0
  291. package/src/components/navigation/Pagination/Pagination.test.tsx +673 -0
  292. package/src/components/navigation/Pagination/Pagination.tsx +395 -0
  293. package/src/components/navigation/Pagination/Pagination.types.ts +86 -0
  294. package/src/components/navigation/Pagination/index.ts +18 -0
  295. package/src/components/navigation/Pagination/index.tsx +9 -0
  296. package/src/components/navigation/Steps/Step.tsx +56 -0
  297. package/src/components/navigation/Steps/Steps.styles.ts +154 -0
  298. package/src/components/navigation/Steps/Steps.test.tsx +12 -0
  299. package/src/components/navigation/Steps/Steps.tsx +113 -0
  300. package/src/components/navigation/Steps/Steps.types.ts +47 -0
  301. package/src/components/navigation/Steps/index.tsx +3 -0
  302. package/src/components/navigation/Tabs/Tabs.styles.ts +199 -0
  303. package/src/components/navigation/Tabs/Tabs.test.tsx +661 -0
  304. package/src/components/navigation/Tabs/Tabs.tsx +253 -0
  305. package/src/components/navigation/Tabs/Tabs.types.ts +114 -0
  306. package/src/components/navigation/Tabs/index.tsx +3 -0
  307. package/src/components/navigation/Tree/Tree.styles.ts +553 -0
  308. package/src/components/navigation/Tree/Tree.test.basic.tsx +7 -0
  309. package/src/components/navigation/Tree/Tree.test.functional.tsx +496 -0
  310. package/src/components/navigation/Tree/Tree.test.import.check.tsx +6 -0
  311. package/src/components/navigation/Tree/Tree.test.import.tsx +6 -0
  312. package/src/components/navigation/Tree/Tree.test.minimal.tsx +5 -0
  313. package/src/components/navigation/Tree/Tree.test.simple.tsx +30 -0
  314. package/src/components/navigation/Tree/Tree.test.tsx +908 -0
  315. package/src/components/navigation/Tree/Tree.test.working.tsx +673 -0
  316. package/src/components/navigation/Tree/Tree.tsx +600 -0
  317. package/src/components/navigation/Tree/Tree.types.ts +909 -0
  318. package/src/components/navigation/Tree/Tree.utils.ts +452 -0
  319. package/src/components/navigation/Tree/index.ts +33 -0
  320. package/src/components/navigation/Tree/index.tsx +23 -0
  321. package/src/components/navigation/index.tsx +83 -0
  322. package/src/constants/index.ts +785 -0
  323. package/src/hooks/index.ts +110 -0
  324. package/src/hooks/types.ts +10 -0
  325. package/src/hooks/useAsync.ts +65 -0
  326. package/src/hooks/useEventHandling.ts +444 -0
  327. package/src/hooks/useLifecycle.ts +399 -0
  328. package/src/hooks/usePerformance.ts +441 -0
  329. package/src/hooks/usePerformanceMonitor.ts +348 -0
  330. package/src/hooks/usePlatform.ts +62 -0
  331. package/src/hooks/useRequest.test.ts +11 -0
  332. package/src/hooks/useRequest.ts +135 -0
  333. package/src/hooks/useStateManagement.ts +300 -0
  334. package/src/hooks/useStyle.ts +537 -0
  335. package/src/hooks/useTheme.ts +347 -0
  336. package/src/hooks/useVirtualScroll.ts +331 -0
  337. package/src/index.ts +298 -0
  338. package/src/platform/index.ts +1188 -0
  339. package/src/providers/AppProvider.test.tsx +63 -0
  340. package/src/providers/AppProvider.tsx +155 -0
  341. package/src/providers/index.ts +1 -0
  342. package/src/theme/ThemeProvider.tsx +283 -0
  343. package/src/theme/ThemeProvider.types.ts +26 -0
  344. package/src/theme/animations.tsx +660 -0
  345. package/src/theme/defaults.ts +188 -0
  346. package/src/theme/design-system.ts +562 -0
  347. package/src/theme/design-tokens.ts +1136 -0
  348. package/src/theme/generated/dark-theme.scss +120 -0
  349. package/src/theme/generated/tokens.css +441 -0
  350. package/src/theme/generated/tokens.scss +320 -0
  351. package/src/theme/index.ts +120 -0
  352. package/src/theme/responsive.tsx +193 -0
  353. package/src/theme/styles/mixins.scss +612 -0
  354. package/src/theme/styles/variables.scss +295 -0
  355. package/src/theme/styles.ts +403 -0
  356. package/src/theme/tokens/colors.ts +256 -0
  357. package/src/theme/tokens/effects.ts +260 -0
  358. package/src/theme/tokens/index.ts +217 -0
  359. package/src/theme/tokens/spacing.ts +137 -0
  360. package/src/theme/tokens/typography.ts +186 -0
  361. package/src/theme/types.ts +188 -0
  362. package/src/theme/useThemeUtils.ts +313 -0
  363. package/src/theme/utils.ts +501 -0
  364. package/src/theme/variables.ts +583 -0
  365. package/src/types/accessibility.ts +51 -0
  366. package/src/types/button.ts +562 -0
  367. package/src/types/component-props.ts +317 -0
  368. package/src/types/env.d.ts +20 -0
  369. package/src/types/index.ts +427 -0
  370. package/src/types/modules.d.ts +40 -0
  371. package/src/types/standardized-components.ts +544 -0
  372. package/src/types/taro-adapter.d.ts +174 -0
  373. package/src/types/taro-components.d.ts +73 -0
  374. package/src/types/utils.ts +410 -0
  375. package/src/utils/__tests__/inputValidator.test.ts +338 -0
  376. package/src/utils/__tests__/responsiveUtils.test.ts +310 -0
  377. package/src/utils/__tests__/xssProtection.test.ts +268 -0
  378. package/src/utils/cache.ts +83 -0
  379. package/src/utils/createNamespace.ts +24 -0
  380. package/src/utils/environment.ts +95 -0
  381. package/src/utils/error-handler.ts +88 -0
  382. package/src/utils/errorLogger.ts +197 -0
  383. package/src/utils/formatUtils.ts +444 -0
  384. package/src/utils/index.ts +115 -0
  385. package/src/utils/inputValidator.ts +261 -0
  386. package/src/utils/network/http-client.test.ts +18 -0
  387. package/src/utils/network/http-client.ts +151 -0
  388. package/src/utils/performance/performance.ts +850 -0
  389. package/src/utils/responsiveUtils.ts +357 -0
  390. package/src/utils/rtl-support.ts +344 -0
  391. package/src/utils/security/api-security.ts +386 -0
  392. package/src/utils/security/xss-protection.ts +69 -0
  393. package/src/utils/securityHeaders.ts +314 -0
  394. package/src/utils/typeHelpers.ts +16 -0
  395. package/src/utils/types/dataProcessing.ts +543 -0
  396. package/src/utils/types/typeHelpers.ts +187 -0
  397. package/src/utils/xssProtection.ts +420 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DFdcksbe.js","sources":["../../src/constants/index.ts","../../src/platform/index.ts"],"sourcesContent":["/**\n * Taro-Uno UI 组件库常量定义\n * 包含组件、主题、平台、错误码等常量\n */\n\nimport type { Platform, Size, Variant, Status, ThemeMode, AnimationType, AnimationDirection } from '../types';\n\n// ==================== 组件常量 ====================\n\n/** 组件尺寸常量 */\nexport const COMPONENT_SIZES: Record<Size, string> = {\n small: 'small',\n medium: 'medium',\n large: 'large',\n default: 'default',\n};\n\n/** 组件变体常量 */\nexport const COMPONENT_VARIANTS: Record<Variant, string> = {\n default: 'default',\n primary: 'primary',\n secondary: 'secondary',\n success: 'success',\n warning: 'warning',\n danger: 'danger',\n info: 'info',\n};\n\n/** 组件状态常量 */\nexport const COMPONENT_STATUSES: Record<Status, string> = {\n default: 'default',\n loading: 'loading',\n disabled: 'disabled',\n error: 'error',\n success: 'success',\n};\n\n/** 组件前缀常量 */\nexport const COMPONENT_PREFIX = 'taro-uno';\n\n/** 组件类名前缀 */\nexport const CLASS_PREFIX = 'tu';\n\n/** 数据属性前缀 */\nexport const DATA_PREFIX = 'data-tu';\n\n/** 测试ID前缀 */\nexport const TEST_ID_PREFIX = 'tu-';\n\n// ==================== 主题常量 ====================\n\n/** 主题模式常量 */\nexport const THEME_MODES: Record<ThemeMode, string> = {\n light: 'light',\n dark: 'dark',\n auto: 'auto',\n};\n\n/** 默认主题颜色 */\nexport const DEFAULT_THEME_COLORS = {\n primary: '#1890ff',\n secondary: '#52c41a',\n success: '#52c41a',\n warning: '#faad14',\n error: '#f5222d',\n info: '#1890ff',\n background: '#ffffff',\n surface: '#fafafa',\n text: '#000000',\n textSecondary: '#666666',\n border: '#d9d9d9',\n divider: '#f0f0f0',\n};\n\n/** 深色主题颜色 */\nexport const DARK_THEME_COLORS = {\n primary: '#177ddc',\n secondary: '#49aa19',\n success: '#49aa19',\n warning: '#d48806',\n error: '#a61d24',\n info: '#177ddc',\n background: '#141414',\n surface: '#1f1f1f',\n text: '#ffffff',\n textSecondary: '#bfbfbf',\n border: '#434343',\n divider: '#303030',\n};\n\n/** 默认间距配置 */\nexport const DEFAULT_SPACING = {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n xxl: 48,\n};\n\n/** 默认字体配置 */\nexport const DEFAULT_TYPOGRAPHY = {\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontSize: {\n xs: 12,\n sm: 14,\n base: 16,\n lg: 18,\n xl: 20,\n '2xl': 24,\n '3xl': 30,\n '4xl': 36,\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n },\n};\n\n/** 默认圆角配置 */\nexport const DEFAULT_RADIUS = {\n none: 0,\n sm: 4,\n md: 8,\n lg: 16,\n full: 9999,\n};\n\n/** 断点配置 */\nexport const BREAKPOINTS = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600,\n};\n\n// ==================== 平台常量 ====================\n\n/** 平台名称映射 */\nexport const PLATFORM_NAMES: Record<Platform, string> = {\n weapp: '微信小程序',\n alipay: '支付宝小程序',\n swan: '百度小程序',\n tt: '字节跳动小程序',\n qq: 'QQ小程序',\n h5: 'H5',\n rn: 'React Native',\n jd: '京东小程序',\n};\n\n/** 平台特性支持 */\nexport const PLATFORM_FEATURES: Record<\n Platform,\n {\n supportsStorage: boolean;\n supportsNetwork: boolean;\n supportsLocation: boolean;\n supportsCamera: boolean;\n supportsPayment: boolean;\n supportsShare: boolean;\n supportsBiometrics: boolean;\n }\n> = {\n weapp: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: true,\n },\n alipay: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: true,\n },\n swan: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: false,\n },\n tt: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: false,\n },\n qq: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: false,\n },\n h5: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: false,\n },\n rn: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: true,\n },\n jd: {\n supportsStorage: true,\n supportsNetwork: true,\n supportsLocation: true,\n supportsCamera: true,\n supportsPayment: true,\n supportsShare: true,\n supportsBiometrics: false,\n },\n};\n\n/** 平台API映射 */\nexport const PLATFORM_APIS: Record<\n Platform,\n {\n request: string;\n storage: {\n set: string;\n get: string;\n remove: string;\n clear: string;\n };\n location: {\n get: string;\n open: string;\n };\n camera: {\n take: string;\n choose: string;\n };\n }\n> = {\n weapp: {\n request: 'wx.request',\n storage: {\n set: 'wx.setStorage',\n get: 'wx.getStorage',\n remove: 'wx.removeStorage',\n clear: 'wx.clearStorage',\n },\n location: {\n get: 'wx.getLocation',\n open: 'wx.openLocation',\n },\n camera: {\n take: 'wx.cameraTake',\n choose: 'wx.chooseImage',\n },\n },\n alipay: {\n request: 'my.request',\n storage: {\n set: 'my.setStorage',\n get: 'my.getStorage',\n remove: 'my.removeStorage',\n clear: 'my.clearStorage',\n },\n location: {\n get: 'my.getLocation',\n open: 'my.openLocation',\n },\n camera: {\n take: 'my.cameraTake',\n choose: 'my.chooseImage',\n },\n },\n swan: {\n request: 'swan.request',\n storage: {\n set: 'swan.setStorage',\n get: 'swan.getStorage',\n remove: 'swan.removeStorage',\n clear: 'swan.clearStorage',\n },\n location: {\n get: 'swan.getLocation',\n open: 'swan.openLocation',\n },\n camera: {\n take: 'swan.cameraTake',\n choose: 'swan.chooseImage',\n },\n },\n tt: {\n request: 'tt.request',\n storage: {\n set: 'tt.setStorage',\n get: 'tt.getStorage',\n remove: 'tt.removeStorage',\n clear: 'tt.clearStorage',\n },\n location: {\n get: 'tt.getLocation',\n open: 'tt.openLocation',\n },\n camera: {\n take: 'tt.cameraTake',\n choose: 'tt.chooseImage',\n },\n },\n qq: {\n request: 'qq.request',\n storage: {\n set: 'qq.setStorage',\n get: 'qq.getStorage',\n remove: 'qq.removeStorage',\n clear: 'qq.clearStorage',\n },\n location: {\n get: 'qq.getLocation',\n open: 'qq.openLocation',\n },\n camera: {\n take: 'qq.cameraTake',\n choose: 'qq.chooseImage',\n },\n },\n h5: {\n request: 'fetch',\n storage: {\n set: 'localStorage.setItem',\n get: 'localStorage.getItem',\n remove: 'localStorage.removeItem',\n clear: 'localStorage.clear',\n },\n location: {\n get: 'navigator.geolocation.getCurrentPosition',\n open: 'window.open',\n },\n camera: {\n take: 'navigator.mediaDevices.getUserMedia',\n choose: 'input[type=file].click()',\n },\n },\n rn: {\n request: 'fetch',\n storage: {\n set: 'AsyncStorage.setItem',\n get: 'AsyncStorage.getItem',\n remove: 'AsyncStorage.removeItem',\n clear: 'AsyncStorage.clear',\n },\n location: {\n get: 'Geolocation.getCurrentPosition',\n open: 'Linking.openURL',\n },\n camera: {\n take: 'Camera.takePictureAsync',\n choose: 'ImagePicker.launchImageLibrary',\n },\n },\n jd: {\n request: 'jd.request',\n storage: {\n set: 'jd.setStorage',\n get: 'jd.getStorage',\n remove: 'jd.removeStorage',\n clear: 'jd.clearStorage',\n },\n location: {\n get: 'jd.getLocation',\n open: 'jd.openLocation',\n },\n camera: {\n take: 'jd.cameraTake',\n choose: 'jd.chooseImage',\n },\n },\n};\n\n// ==================== 动画常量 ====================\n\n/** 动画类型常量 */\nexport const ANIMATION_TYPES: Record<AnimationType, string> = {\n fade: 'fade',\n slide: 'slide',\n scale: 'scale',\n rotate: 'rotate',\n bounce: 'bounce',\n};\n\n/** 动画方向常量 */\nexport const ANIMATION_DIRECTIONS: Record<AnimationDirection, string> = {\n up: 'up',\n down: 'down',\n left: 'left',\n right: 'right',\n in: 'in',\n out: 'out',\n};\n\n/** 动画时长配置 */\nexport const ANIMATION_DURATIONS = {\n fast: 150,\n normal: 300,\n slow: 500,\n slower: 800,\n};\n\n/** 动画缓动函数 */\nexport const ANIMATION_EASING = {\n linear: 'linear',\n ease: 'ease',\n easeIn: 'ease-in',\n easeOut: 'ease-out',\n easeInOut: 'ease-in-out',\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n};\n\n// ==================== 事件常量 ====================\n\n/** 事件名称常量 */\nexport const EVENT_NAMES = {\n click: 'click',\n tap: 'tap',\n touchStart: 'touchstart',\n touchMove: 'touchmove',\n touchEnd: 'touchend',\n touchCancel: 'touchcancel',\n input: 'input',\n change: 'change',\n focus: 'focus',\n blur: 'blur',\n submit: 'submit',\n reset: 'reset',\n scroll: 'scroll',\n resize: 'resize',\n load: 'load',\n error: 'error',\n};\n\n/** 键盘按键常量 */\nexport const KEY_CODES = {\n enter: 13,\n escape: 27,\n space: 32,\n arrowUp: 38,\n arrowDown: 40,\n arrowLeft: 37,\n arrowRight: 39,\n tab: 9,\n backspace: 8,\n delete: 46,\n home: 36,\n end: 35,\n pageUp: 33,\n pageDown: 34,\n};\n\n// ==================== 网络请求常量 ====================\n\n/** 请求方法常量 */\nexport const REQUEST_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'] as const;\n\n/** HTTP状态码常量 */\nexport const HTTP_STATUS_CODES = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n CONFLICT: 409,\n UNPROCESSABLE_ENTITY: 422,\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n};\n\n/** 请求超时时间 */\nexport const REQUEST_TIMEOUTS = {\n short: 5000,\n normal: 10000,\n long: 30000,\n veryLong: 60000,\n};\n\n/** 内容类型常量 */\nexport const CONTENT_TYPES = {\n json: 'application/json',\n form: 'application/x-www-form-urlencoded',\n multipart: 'multipart/form-data',\n text: 'text/plain',\n html: 'text/html',\n xml: 'application/xml',\n};\n\n// ==================== 错误码常量 ====================\n\n/** 错误码常量 */\nexport const ERROR_CODES = {\n // 通用错误码 (1000-1999)\n UNKNOWN_ERROR: 1000,\n INVALID_PARAMS: 1001,\n NETWORK_ERROR: 1002,\n TIMEOUT_ERROR: 1003,\n PERMISSION_DENIED: 1004,\n NOT_FOUND: 1005,\n INTERNAL_ERROR: 1006,\n\n // 平台相关错误码 (2000-2999)\n PLATFORM_NOT_SUPPORTED: 2000,\n API_NOT_AVAILABLE: 2001,\n VERSION_TOO_LOW: 2002,\n\n // 组件相关错误码 (3000-3999)\n COMPONENT_NOT_FOUND: 3000,\n INVALID_COMPONENT_CONFIG: 3001,\n COMPONENT_RENDER_ERROR: 3002,\n\n // 主题相关错误码 (4000-4999)\n THEME_NOT_FOUND: 4000,\n INVALID_THEME_CONFIG: 4001,\n COLOR_FORMAT_ERROR: 4002,\n\n // 表单相关错误码 (5000-5999)\n FORM_VALIDATION_ERROR: 5000,\n FIELD_REQUIRED: 5001,\n INVALID_FORMAT: 5002,\n VALUE_OUT_OF_RANGE: 5003,\n\n // 存储相关错误码 (6000-6999)\n STORAGE_QUOTA_EXCEEDED: 6000,\n STORAGE_NOT_AVAILABLE: 6001,\n STORAGE_KEY_NOT_FOUND: 6002,\n\n // 网络相关错误码 (7000-7999)\n REQUEST_FAILED: 7000,\n RESPONSE_PARSE_ERROR: 7001,\n UPLOAD_FAILED: 7002,\n DOWNLOAD_FAILED: 7003,\n\n // 权限相关错误码 (8000-8999)\n LOCATION_PERMISSION_DENIED: 8000,\n CAMERA_PERMISSION_DENIED: 8001,\n STORAGE_PERMISSION_DENIED: 8002,\n MICROPHONE_PERMISSION_DENIED: 8003,\n\n // 业务相关错误码 (9000-9999)\n USER_NOT_FOUND: 9000,\n USER_ALREADY_EXISTS: 9001,\n INVALID_CREDENTIALS: 9002,\n ACCOUNT_LOCKED: 9003,\n INSUFFICIENT_BALANCE: 9004,\n};\n\n/** 错误消息映射 */\nexport const ERROR_MESSAGES: Record<number, string> = {\n [ERROR_CODES.UNKNOWN_ERROR]: '未知错误',\n [ERROR_CODES.INVALID_PARAMS]: '参数错误',\n [ERROR_CODES.NETWORK_ERROR]: '网络错误',\n [ERROR_CODES.TIMEOUT_ERROR]: '请求超时',\n [ERROR_CODES.PERMISSION_DENIED]: '权限不足',\n [ERROR_CODES.NOT_FOUND]: '资源不存在',\n [ERROR_CODES.INTERNAL_ERROR]: '内部错误',\n [ERROR_CODES.PLATFORM_NOT_SUPPORTED]: '平台不支持',\n [ERROR_CODES.API_NOT_AVAILABLE]: 'API不可用',\n [ERROR_CODES.VERSION_TOO_LOW]: '版本过低',\n [ERROR_CODES.COMPONENT_NOT_FOUND]: '组件不存在',\n [ERROR_CODES.INVALID_COMPONENT_CONFIG]: '组件配置错误',\n [ERROR_CODES.COMPONENT_RENDER_ERROR]: '组件渲染错误',\n [ERROR_CODES.THEME_NOT_FOUND]: '主题不存在',\n [ERROR_CODES.INVALID_THEME_CONFIG]: '主题配置错误',\n [ERROR_CODES.COLOR_FORMAT_ERROR]: '颜色格式错误',\n [ERROR_CODES.FORM_VALIDATION_ERROR]: '表单验证错误',\n [ERROR_CODES.FIELD_REQUIRED]: '字段必填',\n [ERROR_CODES.INVALID_FORMAT]: '格式错误',\n [ERROR_CODES.VALUE_OUT_OF_RANGE]: '值超出范围',\n [ERROR_CODES.STORAGE_QUOTA_EXCEEDED]: '存储空间不足',\n [ERROR_CODES.STORAGE_NOT_AVAILABLE]: '存储不可用',\n [ERROR_CODES.STORAGE_KEY_NOT_FOUND]: '存储键不存在',\n [ERROR_CODES.REQUEST_FAILED]: '请求失败',\n [ERROR_CODES.RESPONSE_PARSE_ERROR]: '响应解析错误',\n [ERROR_CODES.UPLOAD_FAILED]: '上传失败',\n [ERROR_CODES.DOWNLOAD_FAILED]: '下载失败',\n [ERROR_CODES.LOCATION_PERMISSION_DENIED]: '位置权限被拒绝',\n [ERROR_CODES.CAMERA_PERMISSION_DENIED]: '相机权限被拒绝',\n [ERROR_CODES.STORAGE_PERMISSION_DENIED]: '存储权限被拒绝',\n [ERROR_CODES.MICROPHONE_PERMISSION_DENIED]: '麦克风权限被拒绝',\n [ERROR_CODES.USER_NOT_FOUND]: '用户不存在',\n [ERROR_CODES.USER_ALREADY_EXISTS]: '用户已存在',\n [ERROR_CODES.INVALID_CREDENTIALS]: '凭证无效',\n [ERROR_CODES.ACCOUNT_LOCKED]: '账户已锁定',\n [ERROR_CODES.INSUFFICIENT_BALANCE]: '余额不足',\n};\n\n// ==================== 正则表达式常量 ====================\n\n/** 常用正则表达式 */\nexport const REGEX_PATTERNS = {\n // 邮箱\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n\n // 手机号\n phone: /^1[3-9]\\d{9}$/,\n\n // 身份证号\n idCard: /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/,\n\n // URL\n url: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n\n // IP地址\n ipAddress: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n\n // 端口号\n port: /^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/,\n\n // 中文\n chinese: /^[\\u4e00-\\u9fa5]+$/,\n\n // 英文\n english: /^[a-zA-Z]+$/,\n\n // 字母数字\n alphanumeric: /^[a-zA-Z0-9]+$/,\n\n // 数字\n number: /^[0-9]+$/,\n\n // 整数\n integer: /^-?[0-9]+$/,\n\n // 浮点数\n float: /^-?[0-9]+(\\.[0-9]+)?$/,\n\n // 密码强度\n strongPassword: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$/,\n\n // 日期格式 YYYY-MM-DD\n date: /^\\d{4}-\\d{2}-\\d{2}$/,\n\n // 时间格式 HH:mm:ss\n time: /^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,\n\n // 颜色值\n color: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,\n\n // 邮政编码\n zipCode: /^[1-9]\\d{5}$/,\n\n // 车牌号\n licensePlate:\n /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,\n};\n\n// ==================== 缓存键常量 ====================\n\n/** 缓存键常量 */\nexport const CACHE_KEYS = {\n // 用户相关\n userInfo: 'user_info',\n userToken: 'user_token',\n userSettings: 'user_settings',\n\n // 主题相关\n themeMode: 'theme_mode',\n themeConfig: 'theme_config',\n\n // 应用相关\n appConfig: 'app_config',\n appSettings: 'app_settings',\n lastUpdateTime: 'last_update_time',\n\n // 缓存相关\n cacheVersion: 'cache_version',\n cacheTimestamp: 'cache_timestamp',\n};\n\n// ==================== Z-Index 层级常量 ====================\n\n/** Z-Index 层级配置 */\nexport const Z_INDEX = {\n modal: 1000,\n dropdown: 900,\n tooltip: 800,\n notification: 700,\n header: 600,\n sidebar: 500,\n content: 400,\n footer: 300,\n background: 200,\n hidden: -1,\n};\n\n// ==================== 响应式断点常量 ====================\n\n/** 响应式断点配置 */\nexport const RESPONSIVE_BREAKPOINTS = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400,\n};\n\n/** 响应式类名前缀 */\nexport const RESPONSIVE_PREFIXES = {\n xs: 'xs',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n xxl: 'xxl',\n};\n\n// ==================== 导出所有常量 ====================\n\n/** 导出所有常量组 */\nexport const CONSTANTS = {\n COMPONENT_SIZES,\n COMPONENT_VARIANTS,\n COMPONENT_STATUSES,\n COMPONENT_PREFIX,\n CLASS_PREFIX,\n DATA_PREFIX,\n TEST_ID_PREFIX,\n THEME_MODES,\n DEFAULT_THEME_COLORS,\n DARK_THEME_COLORS,\n DEFAULT_SPACING,\n DEFAULT_TYPOGRAPHY,\n DEFAULT_RADIUS,\n BREAKPOINTS,\n PLATFORM_NAMES,\n PLATFORM_FEATURES,\n PLATFORM_APIS,\n ANIMATION_TYPES,\n ANIMATION_DIRECTIONS,\n ANIMATION_DURATIONS,\n ANIMATION_EASING,\n EVENT_NAMES,\n KEY_CODES,\n REQUEST_METHODS,\n HTTP_STATUS_CODES,\n REQUEST_TIMEOUTS,\n CONTENT_TYPES,\n ERROR_CODES,\n ERROR_MESSAGES,\n REGEX_PATTERNS,\n CACHE_KEYS,\n Z_INDEX,\n RESPONSIVE_BREAKPOINTS,\n RESPONSIVE_PREFIXES,\n};\n","/**\n * Taro-Uno UI 组件库平台适配工具\n * 提供跨平台开发的统一接口和适配器\n */\n\nimport * as Taro from '@tarojs/taro';\nimport type { Platform, PlatformInfo, RequestConfig, RequestResponse, RequestError } from '../types';\nimport { PLATFORM_APIS, PLATFORM_FEATURES, PLATFORM_NAMES } from '../constants';\n\n// 全局类型声明\ndeclare global {\n interface Window {\n wx?: any;\n my?: any;\n swan?: any;\n tt?: any;\n qq?: any;\n jd?: any;\n }\n}\n\n// ==================== 平台适配器接口 ====================\n\n/** 平台适配器接口 */\nexport interface PlatformAdapter {\n /** 获取平台信息 */\n getPlatformInfo(): PlatformInfo;\n\n /** 网络请求 */\n request<T = any>(config: RequestConfig): Promise<RequestResponse<T>>;\n\n /** 存储操作 */\n storage: {\n set(key: string, value: any): Promise<void>;\n get(key: string): Promise<any>;\n remove(key: string): Promise<void>;\n clear(): Promise<void>;\n getInfo(): Promise<{ currentSize: number; limitSize: number }>;\n };\n\n /** 位置服务 */\n location: {\n getCurrentPosition(): Promise<Taro.getLocation.SuccessCallbackResult>;\n openLocation(options: Taro.openLocation.Option): Promise<void>;\n chooseLocation(): Promise<Taro.chooseLocation.SuccessCallbackResult>;\n };\n\n /** 相机服务 */\n camera: {\n takePhoto(options?: any): Promise<any>;\n chooseImage(options?: Taro.chooseImage.Option): Promise<Taro.chooseImage.SuccessCallbackResult>;\n chooseVideo(options?: Taro.chooseVideo.Option): Promise<Taro.chooseVideo.SuccessCallbackResult>;\n };\n\n /** 支付服务 */\n payment: {\n requestPayment(options: Taro.requestPayment.Option): Promise<void>;\n };\n\n /** 分享服务 */\n share: {\n shareAppMessage(options?: any): Promise<void>;\n shareToTimeline(options?: any): Promise<void>;\n };\n\n /** 生物识别 */\n biometrics: {\n checkIsAvailable(): Promise<boolean>;\n startVerify(\n options: Taro.startSoterAuthentication.Option,\n ): Promise<Taro.startSoterAuthentication.SuccessCallbackResult>;\n };\n\n /** 系统信息 */\n system: {\n getSystemInfo(): Promise<Taro.getSystemInfoSync.Result>;\n getNetworkType(): Promise<Taro.getNetworkType.SuccessCallbackResult>;\n getBatteryInfo(): Promise<Taro.getBatteryInfo.SuccessCallbackResult>;\n getScreenBrightness(): Promise<number>;\n setScreenBrightness(value: number): Promise<void>;\n keepScreenOn(keepScreenOn: boolean): Promise<void>;\n vibrate(): Promise<void>;\n };\n\n /** 剪贴板 */\n clipboard: {\n set(text: string): Promise<void>;\n get(): Promise<string>;\n };\n\n /** 扫码 */\n scan: {\n scanCode(options?: Taro.scanCode.Option): Promise<Taro.scanCode.SuccessCallbackResult>;\n };\n\n /** 文件操作 */\n file: {\n saveFile(options: Taro.saveFile.Option): Promise<Taro.saveFile.SuccessCallbackResult>;\n getFileInfo(options: Taro.getFileInfo.Option): Promise<Taro.getFileInfo.SuccessCallbackResult>;\n getSavedFileList(): Promise<Taro.getSavedFileList.SuccessCallbackResult>;\n removeSavedFile(options: Taro.removeSavedFile.Option): Promise<void>;\n };\n}\n\n// ==================== 微信小程序适配器 ====================\n\nclass WeappAdapter implements PlatformAdapter {\n getPlatformInfo(): PlatformInfo {\n const system = Taro.getSystemInfoSync();\n const accountInfo = Taro.getAccountInfoSync();\n\n return {\n platform: 'weapp',\n isMiniProgram: true,\n isH5: false,\n isRN: false,\n system,\n SDKVersion: (accountInfo.miniProgram as any).sdkVersion || accountInfo.miniProgram.version,\n version: accountInfo.miniProgram.version,\n };\n }\n\n async request<T = any>(config: RequestConfig): Promise<RequestResponse<T>> {\n return new Promise((resolve, reject) => {\n Taro.request({\n url: config.url,\n method: (config.method as any) || 'GET',\n header: config.header,\n data: config.data,\n timeout: config.timeout,\n success: (res) => {\n resolve({\n data: res.data as T,\n statusCode: res.statusCode,\n statusMessage: res.errMsg,\n header: res.header,\n });\n },\n fail: (err) => {\n const error: RequestError = {\n message: err.errMsg || 'Request failed',\n code: (err as any).errCode,\n detail: err,\n };\n reject(error);\n },\n });\n });\n }\n\n storage = {\n async set(key: string, value: any): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.setStorage({\n key,\n data: value,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async get(key: string): Promise<any> {\n return new Promise((resolve, reject) => {\n Taro.getStorage({\n key,\n success: (res) => resolve(res.data),\n fail: reject,\n });\n });\n },\n\n async remove(key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.removeStorage({\n key,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async clear(): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.clearStorage({\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async getInfo(): Promise<{ currentSize: number; limitSize: number }> {\n return new Promise((resolve, reject) => {\n Taro.getStorageInfo({\n success: (res) =>\n resolve({\n currentSize: res.currentSize,\n limitSize: res.limitSize,\n }),\n fail: reject,\n });\n });\n },\n };\n\n location = {\n async getCurrentPosition(): Promise<Taro.getLocation.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.getLocation({\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async openLocation(options: Taro.openLocation.Option): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.openLocation({\n ...options,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async chooseLocation(): Promise<Taro.chooseLocation.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.chooseLocation({\n success: resolve,\n fail: reject,\n });\n });\n },\n };\n\n camera = {\n async takePhoto(options?: any): Promise<any> {\n return new Promise((resolve, reject) => {\n (Taro as any).cameraTakePhoto({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async chooseImage(options?: Taro.chooseImage.Option): Promise<Taro.chooseImage.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.chooseImage({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async chooseVideo(options?: Taro.chooseVideo.Option): Promise<Taro.chooseVideo.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.chooseVideo({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n };\n\n payment = {\n async requestPayment(options: Taro.requestPayment.Option): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.requestPayment({\n ...options,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n };\n\n share = {\n async shareAppMessage(options?: any): Promise<void> {\n return new Promise((resolve, reject) => {\n (Taro as any).shareAppMessage({\n ...options,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async shareToTimeline(options?: any): Promise<void> {\n return new Promise((resolve, reject) => {\n (Taro as any).shareToTimeline({\n ...options,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n };\n\n biometrics = {\n async checkIsAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n Taro.checkIsSoterEnrolledInDevice({\n checkAuthMode: 'fingerPrint',\n success: (res) => resolve(res.isEnrolled),\n fail: () => resolve(false),\n });\n });\n },\n\n async startVerify(\n options: Taro.startSoterAuthentication.Option,\n ): Promise<Taro.startSoterAuthentication.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.startSoterAuthentication({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n };\n\n system = {\n async getSystemInfo(): Promise<Taro.getSystemInfoSync.Result> {\n return Promise.resolve(Taro.getSystemInfoSync());\n },\n\n async getNetworkType(): Promise<Taro.getNetworkType.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.getNetworkType({\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async getBatteryInfo(): Promise<Taro.getBatteryInfo.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.getBatteryInfo({\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async getScreenBrightness(): Promise<number> {\n return new Promise((resolve, reject) => {\n Taro.getScreenBrightness({\n success: (res) => resolve(res.value),\n fail: reject,\n });\n });\n },\n\n async setScreenBrightness(value: number): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.setScreenBrightness({\n value,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async keepScreenOn(keepScreenOn: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.setKeepScreenOn({\n keepScreenOn,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async vibrate(): Promise<void> {\n return new Promise((resolve, reject) => {\n (Taro as any).vibrate({\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n };\n\n clipboard = {\n async set(text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.setClipboardData({\n data: text,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n\n async get(): Promise<string> {\n return new Promise((resolve, reject) => {\n Taro.getClipboardData({\n success: (res) => resolve(res.data),\n fail: reject,\n });\n });\n },\n };\n\n scan = {\n async scanCode(options?: Taro.scanCode.Option): Promise<Taro.scanCode.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.scanCode({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n };\n\n file = {\n async saveFile(options: Taro.saveFile.Option): Promise<Taro.saveFile.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.saveFile({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async getFileInfo(options: Taro.getFileInfo.Option): Promise<Taro.getFileInfo.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.getFileInfo({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async getSavedFileList(): Promise<Taro.getSavedFileList.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n Taro.getSavedFileList({\n success: resolve,\n fail: reject,\n });\n });\n },\n\n async removeSavedFile(options: Taro.removeSavedFile.Option): Promise<void> {\n return new Promise((resolve, reject) => {\n Taro.removeSavedFile({\n ...options,\n success: () => resolve(),\n fail: reject,\n });\n });\n },\n };\n}\n\n// ==================== H5适配器 ====================\n\nclass H5Adapter implements PlatformAdapter {\n getPlatformInfo(): PlatformInfo {\n const system = Taro.getSystemInfoSync();\n\n return {\n platform: 'h5',\n isMiniProgram: false,\n isH5: true,\n isRN: false,\n system,\n };\n }\n\n /** Headers对象转普通对象 */\n private headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n async request<T = any>(config: RequestConfig): Promise<RequestResponse<T>> {\n const url = new URL(config.url, window.location.origin);\n\n // 添加查询参数\n if (config.params) {\n Object.entries(config.params).forEach(([key, value]) => {\n url.searchParams.append(key, String(value));\n });\n }\n\n const options: RequestInit = {\n method: config.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.header,\n },\n };\n\n if (config.data && ['POST', 'PUT', 'PATCH'].includes(config.method || 'GET')) {\n options.body = JSON.stringify(config.data);\n }\n\n try {\n const response = await fetch(url.toString(), options);\n const data = await response.json();\n\n return {\n data,\n statusCode: response.status,\n statusMessage: response.statusText,\n header: this.headersToObject(response.headers),\n };\n } catch (error) {\n const requestError: RequestError = {\n message: error instanceof Error ? error.message : 'Network error',\n detail: error,\n };\n throw requestError;\n }\n }\n\n storage = {\n async set(key: string, value: any): Promise<void> {\n localStorage.setItem(key, JSON.stringify(value));\n },\n\n async get(key: string): Promise<any> {\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n },\n\n async remove(key: string): Promise<void> {\n localStorage.removeItem(key);\n },\n\n async clear(): Promise<void> {\n localStorage.clear();\n },\n\n async getInfo(): Promise<{ currentSize: number; limitSize: number }> {\n // 估算localStorage使用空间\n let size = 0;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key) {\n size += (key + localStorage.getItem(key)).length;\n }\n }\n\n return {\n currentSize: size,\n limitSize: 5 * 1024 * 1024, // 5MB 估算\n };\n },\n };\n\n location = {\n async getCurrentPosition(): Promise<Taro.getLocation.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('Geolocation is not supported'));\n return;\n }\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve({\n latitude: position.coords.latitude || 0,\n longitude: position.coords.longitude || 0,\n accuracy: position.coords.accuracy || 0,\n altitude: position.coords.altitude || 0,\n verticalAccuracy: position.coords.altitudeAccuracy || 0,\n horizontalAccuracy: position.coords.accuracy || 0,\n speed: position.coords.speed || 0,\n errMsg: 'getLocation:ok',\n });\n },\n (error) => {\n reject(error);\n },\n );\n });\n },\n\n async openLocation(options: Taro.openLocation.Option): Promise<void> {\n const url = `https://maps.google.com/maps?q=${options.latitude},${options.longitude}`;\n window.open(url, '_blank');\n },\n\n async chooseLocation(): Promise<Taro.chooseLocation.SuccessCallbackResult> {\n // H5环境下需要用户手动输入或使用地图选择\n throw new Error('chooseLocation is not supported in H5 environment');\n },\n };\n\n camera = {\n async takePhoto(): Promise<any> {\n throw new Error('takePhoto is not supported in H5 environment');\n },\n\n async chooseImage(options?: Taro.chooseImage.Option): Promise<Taro.chooseImage.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'image/*';\n\n if (options?.count && options.count > 1) {\n input.multiple = true;\n }\n\n input.onchange = (event) => {\n const files = Array.from((event.target as HTMLInputElement).files || []);\n const tempFilePaths = files.map((file) => URL.createObjectURL(file));\n\n resolve({\n tempFilePaths,\n tempFiles: files.map((file) => ({\n path: URL.createObjectURL(file),\n size: file.size,\n type: file.type,\n originalFileObj: file,\n })),\n errMsg: 'chooseImage:ok',\n });\n };\n\n input.onerror = () => {\n reject(new Error('Failed to choose image'));\n };\n\n input.click();\n });\n },\n\n async chooseVideo(): Promise<Taro.chooseVideo.SuccessCallbackResult> {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'video/*';\n\n input.onchange = (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (!file) {\n reject(new Error('No file selected'));\n return;\n }\n\n resolve({\n tempFilePath: URL.createObjectURL(file),\n duration: 0, // 需要额外的逻辑获取视频时长\n size: file.size,\n height: 0, // 需要额外的逻辑获取视频尺寸\n width: 0,\n errMsg: 'chooseVideo:ok',\n });\n };\n\n input.onerror = () => {\n reject(new Error('Failed to choose video'));\n };\n\n input.click();\n });\n },\n };\n\n payment = {\n async requestPayment(): Promise<void> {\n throw new Error('Payment is not supported in H5 environment');\n },\n };\n\n share = {\n async shareAppMessage(): Promise<void> {\n // 使用Web Share API如果可用\n if (navigator.share) {\n await navigator.share({\n title: document.title,\n url: window.location.href,\n });\n } else {\n throw new Error('Web Share API is not supported');\n }\n },\n\n async shareToTimeline(): Promise<void> {\n throw new Error('shareToTimeline is not supported in H5 environment');\n },\n };\n\n biometrics = {\n async checkIsAvailable(): Promise<boolean> {\n return false;\n },\n\n async startVerify(): Promise<Taro.startSoterAuthentication.SuccessCallbackResult> {\n throw new Error('Biometric authentication is not supported in H5 environment');\n },\n };\n\n system = {\n async getSystemInfo(): Promise<Taro.getSystemInfoSync.Result> {\n return Promise.resolve(Taro.getSystemInfoSync());\n },\n\n async getNetworkType(): Promise<Taro.getNetworkType.SuccessCallbackResult> {\n // 估算网络类型\n const connection = (navigator as any).connection;\n let networkType = 'unknown';\n\n if (connection) {\n if (connection.effectiveType) {\n networkType = connection.effectiveType;\n }\n }\n\n return {\n networkType: networkType as any,\n errMsg: 'getNetworkType:ok',\n };\n },\n\n async getBatteryInfo(): Promise<Taro.getBatteryInfo.SuccessCallbackResult> {\n // 需要Battery API支持\n throw new Error('Battery API is not supported');\n },\n\n async getScreenBrightness(): Promise<number> {\n // H5环境下无法获取屏幕亮度\n return 1;\n },\n\n async setScreenBrightness(): Promise<void> {\n // H5环境下无法设置屏幕亮度\n },\n\n async keepScreenOn(): Promise<void> {\n // H5环境下无法保持屏幕常亮\n },\n\n async vibrate(): Promise<void> {\n if (navigator.vibrate) {\n navigator.vibrate(200);\n }\n },\n };\n\n clipboard = {\n async set(text: string): Promise<void> {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text);\n } else {\n // 降级方案\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n },\n\n async get(): Promise<string> {\n if (navigator.clipboard) {\n return await navigator.clipboard.readText();\n } else {\n // 降级方案\n return '';\n }\n },\n };\n\n scan = {\n async scanCode(): Promise<Taro.scanCode.SuccessCallbackResult> {\n throw new Error('scanCode is not supported in H5 environment');\n },\n };\n\n file = {\n async saveFile(): Promise<Taro.saveFile.SuccessCallbackResult> {\n throw new Error('saveFile is not supported in H5 environment');\n },\n\n async getFileInfo(): Promise<Taro.getFileInfo.SuccessCallbackResult> {\n throw new Error('getFileInfo is not supported in H5 environment');\n },\n\n async getSavedFileList(): Promise<Taro.getSavedFileList.SuccessCallbackResult> {\n throw new Error('getSavedFileList is not supported in H5 environment');\n },\n\n async removeSavedFile(): Promise<void> {\n throw new Error('removeSavedFile is not supported in H5 environment');\n },\n };\n}\n\n// ==================== React Native适配器 ====================\n\nclass RNAdapter implements PlatformAdapter {\n getPlatformInfo(): PlatformInfo {\n const system = Taro.getSystemInfoSync();\n\n return {\n platform: 'rn',\n isMiniProgram: false,\n isH5: false,\n isRN: true,\n system,\n };\n }\n\n /** Headers对象转普通对象 */\n private headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n async request<T = any>(config: RequestConfig): Promise<RequestResponse<T>> {\n // 使用React Native的fetch实现\n const url = new URL(config.url);\n\n if (config.params) {\n Object.entries(config.params).forEach(([key, value]) => {\n url.searchParams.append(key, String(value));\n });\n }\n\n const options: RequestInit = {\n method: config.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.header,\n },\n };\n\n if (config.data && ['POST', 'PUT', 'PATCH'].includes(config.method || 'GET')) {\n options.body = JSON.stringify(config.data);\n }\n\n try {\n const response = await fetch(url.toString(), options);\n const data = await response.json();\n\n return {\n data,\n statusCode: response.status,\n statusMessage: response.statusText,\n header: this.headersToObject(response.headers),\n };\n } catch (error) {\n const requestError: RequestError = {\n message: error instanceof Error ? error.message : 'Network error',\n detail: error,\n };\n throw requestError;\n }\n }\n\n // React Native的存储实现需要使用AsyncStorage\n storage = {\n async set(_key: string, _value: any): Promise<void> {\n // 这里需要导入AsyncStorage\n // const { AsyncStorage } = require('react-native')\n // await AsyncStorage.setItem(key, JSON.stringify(value))\n throw new Error('AsyncStorage not implemented');\n },\n\n async get(_key: string): Promise<any> {\n // const { AsyncStorage } = require('react-native')\n // const value = await AsyncStorage.getItem(key)\n // return value ? JSON.parse(value) : null\n throw new Error('AsyncStorage not implemented');\n },\n\n async remove(_key: string): Promise<void> {\n // const { AsyncStorage } = require('react-native')\n // await AsyncStorage.removeItem(key)\n throw new Error('AsyncStorage not implemented');\n },\n\n async clear(): Promise<void> {\n // const { AsyncStorage } = require('react-native')\n // await AsyncStorage.clear()\n throw new Error('AsyncStorage not implemented');\n },\n\n async getInfo(): Promise<{ currentSize: number; limitSize: number }> {\n throw new Error('Storage info not available in React Native');\n },\n };\n\n // 其他React Native平台的实现...\n // 由于React Native的API实现较为复杂,这里只提供基础框架\n location = {\n async getCurrentPosition(): Promise<Taro.getLocation.SuccessCallbackResult> {\n throw new Error('Location service not implemented');\n },\n\n async openLocation(): Promise<void> {\n throw new Error('openLocation not implemented');\n },\n\n async chooseLocation(): Promise<Taro.chooseLocation.SuccessCallbackResult> {\n throw new Error('chooseLocation not implemented');\n },\n };\n\n camera = {\n async takePhoto(): Promise<any> {\n throw new Error('Camera service not implemented');\n },\n\n async chooseImage(): Promise<Taro.chooseImage.SuccessCallbackResult> {\n throw new Error('chooseImage not implemented');\n },\n\n async chooseVideo(): Promise<Taro.chooseVideo.SuccessCallbackResult> {\n throw new Error('chooseVideo not implemented');\n },\n };\n\n payment = {\n async requestPayment(): Promise<void> {\n throw new Error('Payment service not implemented');\n },\n };\n\n share = {\n async shareAppMessage(): Promise<void> {\n throw new Error('Share service not implemented');\n },\n\n async shareToTimeline(): Promise<void> {\n throw new Error('Share service not implemented');\n },\n };\n\n biometrics = {\n async checkIsAvailable(): Promise<boolean> {\n throw new Error('Biometric service not implemented');\n },\n\n async startVerify(): Promise<Taro.startSoterAuthentication.SuccessCallbackResult> {\n throw new Error('Biometric service not implemented');\n },\n };\n\n system = {\n async getSystemInfo(): Promise<Taro.getSystemInfoSync.Result> {\n return Promise.resolve(Taro.getSystemInfoSync());\n },\n\n async getNetworkType(): Promise<Taro.getNetworkType.SuccessCallbackResult> {\n throw new Error('Network type service not implemented');\n },\n\n async getBatteryInfo(): Promise<Taro.getBatteryInfo.SuccessCallbackResult> {\n throw new Error('Battery service not implemented');\n },\n\n async getScreenBrightness(): Promise<number> {\n throw new Error('Screen brightness service not implemented');\n },\n\n async setScreenBrightness(): Promise<void> {\n throw new Error('Screen brightness service not implemented');\n },\n\n async keepScreenOn(): Promise<void> {\n throw new Error('Keep screen on service not implemented');\n },\n\n async vibrate(): Promise<void> {\n throw new Error('Vibrate service not implemented');\n },\n };\n\n clipboard = {\n async set(_text: string): Promise<void> {\n throw new Error('Clipboard service not implemented');\n },\n\n async get(): Promise<string> {\n throw new Error('Clipboard service not implemented');\n },\n };\n\n scan = {\n async scanCode(): Promise<Taro.scanCode.SuccessCallbackResult> {\n throw new Error('Scan service not implemented');\n },\n };\n\n file = {\n async saveFile(): Promise<Taro.saveFile.SuccessCallbackResult> {\n throw new Error('File service not implemented');\n },\n\n async getFileInfo(): Promise<Taro.getFileInfo.SuccessCallbackResult> {\n throw new Error('File service not implemented');\n },\n\n async getSavedFileList(): Promise<Taro.getSavedFileList.SuccessCallbackResult> {\n throw new Error('File service not implemented');\n },\n\n async removeSavedFile(): Promise<void> {\n throw new Error('File service not implemented');\n },\n };\n}\n\n// ==================== 平台管理器 ====================\n\n/** 平台管理器 */\nexport class PlatformManager {\n private static instance: PlatformManager;\n private adapter: PlatformAdapter;\n private platformInfo: PlatformInfo;\n\n private constructor() {\n const platform = this.detectPlatform();\n this.adapter = this.createAdapter(platform);\n this.platformInfo = this.adapter.getPlatformInfo();\n }\n\n /** 获取单例实例 */\n static getInstance(): PlatformManager {\n if (!PlatformManager.instance) {\n PlatformManager.instance = new PlatformManager();\n }\n return PlatformManager.instance;\n }\n\n /** 检测当前平台 */\n private detectPlatform(): Platform {\n if (typeof window !== 'undefined' && window.wx && (window.wx as any).getSystemInfo) {\n return 'weapp';\n } else if (typeof window !== 'undefined' && window.my && (window.my as any).getSystemInfo) {\n return 'alipay';\n } else if (typeof window !== 'undefined' && window.swan && (window.swan as any).getSystemInfo) {\n return 'swan';\n } else if (typeof window !== 'undefined' && window.tt && (window.tt as any).getSystemInfo) {\n return 'tt';\n } else if (typeof window !== 'undefined' && window.qq && (window.qq as any).getSystemInfo) {\n return 'qq';\n } else if (typeof window !== 'undefined' && window.jd && (window.jd as any).getSystemInfo) {\n return 'jd';\n } else if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return 'rn';\n } else {\n return 'h5';\n }\n }\n\n /** 创建平台适配器 */\n private createAdapter(platform: Platform): PlatformAdapter {\n switch (platform) {\n case 'weapp':\n return new WeappAdapter();\n case 'alipay':\n // 支付宝小程序适配器与微信类似,这里使用相同的实现\n return new WeappAdapter();\n case 'swan':\n // 百度小程序适配器与微信类似,这里使用相同的实现\n return new WeappAdapter();\n case 'tt':\n // 字节跳动小程序适配器与微信类似,这里使用相同的实现\n return new WeappAdapter();\n case 'qq':\n // QQ小程序适配器与微信类似,这里使用相同的实现\n return new WeappAdapter();\n case 'jd':\n // 京东小程序适配器与微信类似,这里使用相同的实现\n return new WeappAdapter();\n case 'h5':\n return new H5Adapter();\n case 'rn':\n return new RNAdapter();\n default:\n return new H5Adapter(); // 默认使用H5适配器\n }\n }\n\n /** 获取平台适配器 */\n getAdapter(): PlatformAdapter {\n return this.adapter;\n }\n\n /** 获取平台信息 */\n getPlatformInfo(): PlatformInfo {\n return this.platformInfo;\n }\n\n /** 获取当前平台 */\n getPlatform(): Platform {\n return this.platformInfo.platform;\n }\n\n /** 判断是否为指定平台 */\n isPlatform(targetPlatform: Platform): boolean {\n return this.platformInfo.platform === targetPlatform;\n }\n\n /** 判断是否为小程序环境 */\n isMiniProgram(): boolean {\n return this.platformInfo.isMiniProgram;\n }\n\n /** 判断是否为H5环境 */\n isH5(): boolean {\n return this.platformInfo.isH5;\n }\n\n /** 判断是否为React Native环境 */\n isRN(): boolean {\n return this.platformInfo.isRN;\n }\n\n /** 检查功能支持 */\n isFeatureSupported(feature: keyof typeof PLATFORM_FEATURES.weapp): boolean {\n const platform = this.platformInfo.platform;\n return PLATFORM_FEATURES[platform]?.[feature] || false;\n }\n\n /** 获取平台API映射 */\n getPlatformAPIs(): typeof PLATFORM_APIS.weapp {\n const platform = this.platformInfo.platform;\n return PLATFORM_APIS[platform] || PLATFORM_APIS.h5;\n }\n\n /** 获取平台名称 */\n getPlatformName(): string {\n const platform = this.platformInfo.platform;\n return PLATFORM_NAMES[platform] || 'Unknown';\n }\n\n /** 重置平台管理器(主要用于测试) */\n reset(): void {\n PlatformManager.instance = new PlatformManager();\n }\n}\n\n// ==================== 导出平台工具 ====================\n\n/** 创建平台管理器实例 */\nexport const platformManager = PlatformManager.getInstance();\n\n/** 导出平台适配器 */\nexport const platformAdapter = platformManager.getAdapter();\n\n/** 导出平台检测工具 */\nexport const platformUtils = {\n getPlatform: () => platformManager.getPlatform(),\n getPlatformInfo: () => platformManager.getPlatformInfo(),\n isPlatform: (platform: Platform) => platformManager.isPlatform(platform),\n isMiniProgram: () => platformManager.isMiniProgram(),\n isH5: () => platformManager.isH5(),\n isRN: () => platformManager.isRN(),\n isFeatureSupported: (feature: keyof typeof PLATFORM_FEATURES.weapp) => platformManager.isFeatureSupported(feature),\n getPlatformAPIs: () => platformManager.getPlatformAPIs(),\n getPlatformName: () => platformManager.getPlatformName(),\n};\n\n/** 导出快捷方法 */\nexport const {\n getPlatform,\n getPlatformInfo,\n isPlatform,\n isMiniProgram,\n isH5,\n isRN,\n isFeatureSupported,\n getPlatformAPIs,\n getPlatformName,\n} = platformUtils;\n\n// 类型已经在前面导出,这里不需要重复导出\n"],"names":["Taro"],"mappings":"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"}