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,494 @@
1
+ import React from 'react'
2
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
3
+ import { vi } from 'vitest'
4
+ import { Input } from './Input'
5
+ import type { InputProps, InputRef } from './Input.types'
6
+
7
+ describe('Input Component', () => {
8
+ const defaultProps: InputProps = {
9
+ placeholder: '请输入内容',
10
+ onChange: vi.fn()
11
+ }
12
+
13
+ beforeEach(() => {
14
+ vi.clearAllMocks()
15
+ })
16
+
17
+ describe('Rendering', () => {
18
+ it('renders input with default props', () => {
19
+ render(<Input {...defaultProps} />)
20
+
21
+ const input = screen.getByPlaceholderText('请输入内容')
22
+ expect(input).toBeInTheDocument()
23
+ expect(input).toHaveAttribute('placeholder', '请输入内容')
24
+ })
25
+
26
+ it('renders input with different sizes', () => {
27
+ const sizes: Array<InputProps['size']> = ['xs', 'sm', 'md', 'lg', 'xl']
28
+
29
+ sizes.forEach(size => {
30
+ const { container } = render(<Input {...defaultProps} size={size} />)
31
+ const input = container.querySelector('input')
32
+ expect(input).toBeInTheDocument()
33
+ // Size affects styling, not CSS classes in this implementation
34
+ })
35
+ })
36
+
37
+ it('renders input with different variants', () => {
38
+ const variants: Array<InputProps['variant']> = ['outlined', 'filled', 'underlined']
39
+
40
+ variants.forEach(variant => {
41
+ const { container } = render(<Input {...defaultProps} variant={variant} />)
42
+ const input = container.querySelector('input')
43
+ expect(input).toBeInTheDocument()
44
+ // Variant affects styling, not CSS classes in this implementation
45
+ })
46
+ })
47
+
48
+ it('renders input with different types', () => {
49
+ const types: Array<InputProps['type']> = ['text', 'password', 'number', 'email', 'tel', 'idcard', 'digit']
50
+
51
+ types.forEach(type => {
52
+ const { container } = render(<Input {...defaultProps} type={type} />)
53
+ const input = container.querySelector('input')
54
+ expect(input).toHaveAttribute('type', type)
55
+ })
56
+ })
57
+
58
+ it('renders input with different statuses', () => {
59
+ const statuses: Array<InputProps['status']> = ['normal', 'error', 'warning', 'success']
60
+
61
+ statuses.forEach(status => {
62
+ const { container } = render(<Input {...defaultProps} status={status} />)
63
+ const input = container.querySelector('input')
64
+ expect(input).toBeInTheDocument()
65
+ // Status affects styling, not CSS classes in this implementation
66
+ })
67
+ })
68
+
69
+ it('renders input with label', () => {
70
+ render(<Input {...defaultProps} label="用户名" />)
71
+
72
+ expect(screen.getByText('用户名')).toBeInTheDocument()
73
+ })
74
+
75
+ it('renders input with helper text', () => {
76
+ render(<Input {...defaultProps} helperText="请输入您的用户名" />)
77
+
78
+ expect(screen.getByText('请输入您的用户名')).toBeInTheDocument()
79
+ })
80
+
81
+ it('renders input with error text', () => {
82
+ render(<Input {...defaultProps} errorText="用户名不能为空" />)
83
+
84
+ expect(screen.getByText('用户名不能为空')).toBeInTheDocument()
85
+ })
86
+
87
+ it('renders input with prefix', () => {
88
+ const prefix = <span data-testid="prefix">👤</span>
89
+ render(<Input {...defaultProps} prefix={prefix} />)
90
+
91
+ expect(screen.getByTestId('prefix')).toBeInTheDocument()
92
+ })
93
+
94
+ it('renders input with suffix', () => {
95
+ const suffix = <span data-testid="suffix">@example.com</span>
96
+ render(<Input {...defaultProps} suffix={suffix} />)
97
+
98
+ expect(screen.getByTestId('suffix')).toBeInTheDocument()
99
+ })
100
+
101
+ it('renders disabled input', () => {
102
+ render(<Input {...defaultProps} disabled />)
103
+
104
+ const input = screen.getByPlaceholderText('请输入内容')
105
+ expect(input).toBeDisabled()
106
+ expect(input).toHaveClass('taro-uno-input--disabled')
107
+ })
108
+
109
+ it('renders readonly input', () => {
110
+ render(<Input {...defaultProps} readonly />)
111
+
112
+ const input = screen.getByPlaceholderText('请输入内容')
113
+ expect(input).toHaveAttribute('readonly')
114
+ expect(input).toHaveClass('taro-uno-input--readonly')
115
+ })
116
+
117
+ it('renders input with clear button', () => {
118
+ render(<Input {...defaultProps} clearable value="test" clearTrigger="always" />)
119
+
120
+ const clearButton = screen.getByText('×')
121
+ expect(clearButton).toBeInTheDocument()
122
+ })
123
+
124
+ it('renders input with password toggle', () => {
125
+ render(<Input {...defaultProps} type="password" showPasswordToggle />)
126
+
127
+ const toggleButton = screen.getByText('👁️‍🗨️')
128
+ expect(toggleButton).toBeInTheDocument()
129
+ })
130
+
131
+ it('renders input with character count', () => {
132
+ render(<Input {...defaultProps} showCount maxLength={10} value="test" />)
133
+
134
+ expect(screen.getByText('4/10')).toBeInTheDocument()
135
+ })
136
+
137
+ it('renders multiline input', () => {
138
+ render(<Input {...defaultProps} multiline rows={3} />)
139
+
140
+ const input = screen.getByPlaceholderText('请输入内容')
141
+ expect(input).toHaveClass('taro-uno-input--multiline')
142
+ })
143
+ })
144
+
145
+ describe('Event Handling', () => {
146
+ it('handles value change', () => {
147
+ const onChange = vi.fn()
148
+ render(<Input placeholder="请输入内容" value="" onChange={onChange} />)
149
+
150
+ const input = screen.getByPlaceholderText('请输入内容')
151
+ // TaroInput uses onInput event with detail.value structure
152
+ fireEvent.input(input, { target: { value: 'test' } })
153
+
154
+ expect(onChange).toHaveBeenCalledWith('test', expect.any(Object))
155
+ })
156
+
157
+ it('handles focus event', () => {
158
+ const onFocus = vi.fn()
159
+ render(<Input {...defaultProps} onFocus={onFocus} />)
160
+
161
+ const input = screen.getByPlaceholderText('请输入内容')
162
+ fireEvent.focus(input)
163
+
164
+ expect(onFocus).toHaveBeenCalledWith(expect.any(Object))
165
+ })
166
+
167
+ it('handles blur event', () => {
168
+ const onBlur = vi.fn()
169
+ render(<Input {...defaultProps} onBlur={onBlur} />)
170
+
171
+ const input = screen.getByPlaceholderText('请输入内容')
172
+ fireEvent.blur(input)
173
+
174
+ expect(onBlur).toHaveBeenCalledWith(expect.any(Object))
175
+ })
176
+
177
+ it('handles confirm event', () => {
178
+ const onConfirm = vi.fn()
179
+ render(<Input {...defaultProps} onConfirm={onConfirm} />)
180
+
181
+ const input = screen.getByPlaceholderText('请输入内容')
182
+ // TaroInput uses onConfirm event, trigger with keyDown
183
+ fireEvent.keyDown(input, { key: 'Enter' })
184
+
185
+ expect(onConfirm).toHaveBeenCalledWith('', expect.any(Object))
186
+ })
187
+
188
+ it('handles clear event', () => {
189
+ const onClear = vi.fn()
190
+ render(<Input {...defaultProps} clearable value="test" onClear={onClear} clearTrigger="always" />)
191
+
192
+ const clearButton = screen.getByText('×')
193
+ fireEvent.click(clearButton)
194
+
195
+ expect(onClear).toHaveBeenCalledWith(expect.any(Object))
196
+ })
197
+
198
+ it('handles password toggle', () => {
199
+ render(<Input {...defaultProps} type="password" showPasswordToggle />)
200
+
201
+ const toggleButton = screen.getByText('👁️‍🗨️')
202
+ fireEvent.click(toggleButton)
203
+
204
+ const input = screen.getByPlaceholderText('请输入内容')
205
+ expect(input).toHaveAttribute('type', 'text')
206
+ })
207
+
208
+ it('does not handle events when disabled', () => {
209
+ const onChange = vi.fn()
210
+ render(<Input placeholder="请输入内容" disabled onChange={onChange} value="" />)
211
+
212
+ const input = screen.getByPlaceholderText('请输入内容')
213
+ fireEvent.input(input, { target: { value: 'test' } })
214
+
215
+ expect(onChange).not.toHaveBeenCalled()
216
+ })
217
+
218
+ it('does not handle events when readonly', () => {
219
+ const onChange = vi.fn()
220
+ render(<Input placeholder="请输入内容" readonly onChange={onChange} value="" />)
221
+
222
+ const input = screen.getByPlaceholderText('请输入内容')
223
+ fireEvent.input(input, { target: { value: 'test' } })
224
+
225
+ expect(onChange).not.toHaveBeenCalled()
226
+ })
227
+ })
228
+
229
+ describe('Controlled vs Uncontrolled', () => {
230
+ it('works as controlled component', () => {
231
+ const onChange = vi.fn()
232
+ const { rerender } = render(<Input placeholder="请输入内容" value="test" onChange={onChange} />)
233
+
234
+ const input = screen.getByPlaceholderText('请输入内容')
235
+ expect(input).toHaveValue('test')
236
+
237
+ rerender(<Input placeholder="请输入内容" value="updated" onChange={onChange} />)
238
+ expect(input).toHaveValue('updated')
239
+ })
240
+
241
+ it('works as uncontrolled component', () => {
242
+ render(<Input {...defaultProps} defaultValue="test" />)
243
+
244
+ const input = screen.getByPlaceholderText('请输入内容')
245
+ expect(input).toHaveValue('test')
246
+
247
+ fireEvent.input(input, { target: { value: 'updated' } })
248
+ expect(input).toHaveValue('updated')
249
+ })
250
+ })
251
+
252
+ describe('Validation', () => {
253
+ it('validates required rule', async () => {
254
+ const rules = [{ required: true, message: '此字段为必填项' }]
255
+ render(<Input {...defaultProps} rules={rules} validateTrigger="onChange" />)
256
+
257
+ const input = screen.getByPlaceholderText('请输入内容')
258
+ fireEvent.input(input, { target: { value: 'test' } })
259
+
260
+ await waitFor(() => {
261
+ expect(screen.queryByText('此字段为必填项')).not.toBeInTheDocument()
262
+ })
263
+ })
264
+
265
+ it('validates pattern rule', async () => {
266
+ const rules = [{ pattern: /^[A-Za-z]+$/, message: '只能输入字母' }]
267
+ render(<Input placeholder="请输入内容" rules={rules} validateTrigger="onChange" value="" onChange={vi.fn()} />)
268
+
269
+ const input = screen.getByPlaceholderText('请输入内容')
270
+ fireEvent.input(input, { target: { value: '123' } })
271
+
272
+ await waitFor(() => {
273
+ expect(screen.getByText('只能输入字母')).toBeInTheDocument()
274
+ })
275
+ })
276
+
277
+ it('validates length rule', async () => {
278
+ render(<Input {...defaultProps} minLength={3} maxLength={10} validateTrigger="onChange" />)
279
+
280
+ const input = screen.getByPlaceholderText('请输入内容')
281
+ fireEvent.input(input, { target: { value: 'ab' } })
282
+
283
+ await waitFor(() => {
284
+ expect(screen.getByText('最少需要3个字符')).toBeInTheDocument()
285
+ })
286
+ })
287
+
288
+ it('validates custom validator', async () => {
289
+ const validator = vi.fn().mockResolvedValue('自定义验证失败')
290
+ render(<Input {...defaultProps} validator={validator} validateTrigger="onChange" />)
291
+
292
+ const input = screen.getByPlaceholderText('请输入内容')
293
+ fireEvent.input(input, { target: { value: 'test' } })
294
+
295
+ await waitFor(() => {
296
+ expect(screen.getByText('自定义验证失败')).toBeInTheDocument()
297
+ })
298
+ })
299
+
300
+ it('validates on blur', async () => {
301
+ const rules = [{ required: true, message: '此字段为必填项' }]
302
+ render(<Input {...defaultProps} rules={rules} validateTrigger="onBlur" />)
303
+
304
+ const input = screen.getByPlaceholderText('请输入内容')
305
+ fireEvent.blur(input)
306
+
307
+ await waitFor(() => {
308
+ expect(screen.getByText('此字段为必填项')).toBeInTheDocument()
309
+ })
310
+ })
311
+
312
+ it('validates on submit', async () => {
313
+ const rules = [{ required: true, message: '此字段为必填项' }]
314
+ render(<Input {...defaultProps} rules={rules} validateTrigger="onSubmit" />)
315
+
316
+ const input = screen.getByPlaceholderText('请输入内容')
317
+ fireEvent.keyDown(input, { key: 'Enter' })
318
+
319
+ await waitFor(() => {
320
+ expect(screen.getByText('此字段为必填项')).toBeInTheDocument()
321
+ })
322
+ })
323
+ })
324
+
325
+ describe('Input Formatting', () => {
326
+ it('formats number input', () => {
327
+ const onChange = vi.fn()
328
+ render(<Input placeholder="请输入内容" type="number" onChange={onChange} value="" />)
329
+
330
+ // Find input by placeholder
331
+ const input = screen.getByPlaceholderText('请输入内容')
332
+
333
+ // Test that number input accepts numeric values
334
+ fireEvent.input(input, { target: { value: '123' } })
335
+
336
+ // The formatting should pass through valid numbers unchanged
337
+ expect(onChange).toHaveBeenCalledWith('123', expect.any(Object))
338
+ })
339
+
340
+ it('formats phone input', () => {
341
+ const onChange = vi.fn()
342
+ render(<Input placeholder="请输入内容" type="tel" onChange={onChange} value="" />)
343
+
344
+ const input = screen.getByPlaceholderText('请输入内容')
345
+ fireEvent.input(input, { target: { value: '138-1234-5678' } })
346
+
347
+ expect(onChange).toHaveBeenCalledWith('13812345678', expect.any(Object))
348
+ })
349
+
350
+ it('formats idcard input', () => {
351
+ const onChange = vi.fn()
352
+ render(<Input placeholder="请输入内容" type="idcard" onChange={onChange} value="" />)
353
+
354
+ const input = screen.getByPlaceholderText('请输入内容')
355
+ fireEvent.input(input, { target: { value: 'abc123xyz456' } })
356
+
357
+ expect(onChange).toHaveBeenCalledWith('123x456', expect.any(Object))
358
+ })
359
+
360
+ it('respects maxLength', () => {
361
+ const onChange = vi.fn()
362
+ render(<Input placeholder="请输入内容" maxLength={5} onChange={onChange} value="" />)
363
+
364
+ const input = screen.getByPlaceholderText('请输入内容')
365
+ fireEvent.input(input, { target: { value: '123456789' } })
366
+
367
+ expect(onChange).toHaveBeenCalledWith('12345', expect.any(Object))
368
+ })
369
+ })
370
+
371
+ describe('Ref API', () => {
372
+ it('exposes ref methods', () => {
373
+ const ref = React.createRef<InputRef>()
374
+ render(<Input {...defaultProps} ref={ref} />)
375
+
376
+ expect(ref.current).toBeTruthy()
377
+ expect(ref.current.element).toBeTruthy()
378
+ expect(typeof ref.current.getValue).toBe('function')
379
+ expect(typeof ref.current.setValue).toBe('function')
380
+ expect(typeof ref.current.focus).toBe('function')
381
+ expect(typeof ref.current.blur).toBe('function')
382
+ expect(typeof ref.current.validate).toBe('function')
383
+ expect(typeof ref.current.clear).toBe('function')
384
+ })
385
+
386
+ it('can get and set value via ref', async () => {
387
+ const ref = React.createRef<InputRef>()
388
+ // Use uncontrolled mode (no value prop, no onChange prop)
389
+ render(<Input placeholder="请输入内容" ref={ref} />)
390
+
391
+ // Check initial value
392
+ expect(ref.current?.getValue()).toBe('')
393
+
394
+ ref.current?.setValue('test')
395
+
396
+ // Wait for state update to complete
397
+ await waitFor(() => {
398
+ expect(ref.current?.getValue()).toBe('test')
399
+ })
400
+ })
401
+
402
+ it('can focus and blur via ref', () => {
403
+ const ref = React.createRef<InputRef>()
404
+ render(<Input {...defaultProps} ref={ref} />)
405
+
406
+ ref.current?.focus()
407
+ const input = screen.getByPlaceholderText('请输入内容')
408
+ expect(input).toHaveFocus()
409
+
410
+ ref.current?.blur()
411
+ expect(input).not.toHaveFocus()
412
+ })
413
+
414
+ it('can validate via ref', async () => {
415
+ const rules = [{ required: true, message: '此字段为必填项' }]
416
+ const ref = React.createRef<InputRef>()
417
+ render(<Input {...defaultProps} ref={ref} rules={rules} />)
418
+
419
+ const result = await ref.current?.validate()
420
+ expect(result?.valid).toBe(false)
421
+ expect(result?.message).toBe('此字段为必填项')
422
+ })
423
+
424
+ it('can clear via ref', async () => {
425
+ const ref = React.createRef<InputRef>()
426
+ // Use uncontrolled mode (defaultValue instead of value, no onChange prop)
427
+ render(<Input placeholder="请输入内容" ref={ref} defaultValue="test" />)
428
+
429
+ expect(ref.current?.getValue()).toBe('test')
430
+ ref.current?.clear()
431
+
432
+ // Wait for state update to complete
433
+ await waitFor(() => {
434
+ expect(ref.current?.getValue()).toBe('')
435
+ })
436
+ })
437
+
438
+ it('can reset via ref', () => {
439
+ const ref = React.createRef<InputRef>()
440
+ render(<Input {...defaultProps} ref={ref} defaultValue="test" />)
441
+
442
+ ref.current?.setValue('updated')
443
+ ref.current?.reset()
444
+ expect(ref.current?.getValue()).toBe('test')
445
+ })
446
+ })
447
+
448
+
449
+ describe('Edge Cases', () => {
450
+ it('handles empty value', () => {
451
+ render(<Input {...defaultProps} value="" />)
452
+
453
+ const input = screen.getByPlaceholderText('请输入内容')
454
+ expect(input).toHaveValue('')
455
+ })
456
+
457
+ it('handles null value', () => {
458
+ render(<Input {...defaultProps} value={null as any} />)
459
+
460
+ const input = screen.getByPlaceholderText('请输入内容')
461
+ expect(input).toHaveValue('')
462
+ })
463
+
464
+ it('handles undefined value', () => {
465
+ render(<Input {...defaultProps} value={undefined} />)
466
+
467
+ const input = screen.getByPlaceholderText('请输入内容')
468
+ expect(input).toHaveValue('')
469
+ })
470
+
471
+ it('handles numeric value', () => {
472
+ render(<Input {...defaultProps} value={123} />)
473
+
474
+ const input = screen.getByPlaceholderText('请输入内容')
475
+ expect(input).toHaveValue('123')
476
+ })
477
+
478
+ it('handles very long text', () => {
479
+ const longText = 'a'.repeat(1000)
480
+ render(<Input {...defaultProps} value={longText} />)
481
+
482
+ const input = screen.getByPlaceholderText('请输入内容')
483
+ expect(input).toHaveValue(longText)
484
+ })
485
+
486
+ it('handles special characters', () => {
487
+ const specialText = '!@#$%^&*()_+-=[]{}|;:,.<>?'
488
+ render(<Input {...defaultProps} value={specialText} />)
489
+
490
+ const input = screen.getByPlaceholderText('请输入内容')
491
+ expect(input).toHaveValue(specialText)
492
+ })
493
+ })
494
+ })