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,535 @@
1
+ import React from 'react'
2
+ import { render, screen, fireEvent } from '@testing-library/react'
3
+ import { Col } from '../Col'
4
+ import { Row } from '../Row'
5
+ import type { ColProps, ColRef } from '../Col.types'
6
+
7
+ // Mock Taro components
8
+ vi.mock('@tarojs/components', () => ({
9
+ View: 'div'
10
+ }))
11
+
12
+ // Mock styles
13
+ vi.mock('../Col.styles', () => ({
14
+ colStyles: {
15
+ getBaseStyle: (props: any) => ({
16
+ flex: `0 0 ${(props.span / 24) * 100}%`,
17
+ maxWidth: `${(props.span / 24) * 100}%`,
18
+ marginLeft: props.offset > 0 ? `${(props.offset / 24) * 100}%` : '0',
19
+ order: props.order || 0,
20
+ padding: typeof props.gutter === 'number' ? `${props.gutter / 2}px` : '0px',
21
+ flex: props.flex || undefined
22
+ }),
23
+ getResponsiveStyle: (responsive: any) => responsive ? { '@media (max-width: 768px)': { flex: '0 0 100%' } } : {},
24
+ getClassName: (props: any) => `taro-uno-col taro-uno-col--${props.span} ${props.offset > 0 ? `taro-uno-col--offset-${props.offset}` : ''} ${props.flex ? 'taro-uno-col--flex' : ''} ${props.className || ''}`
25
+ }
26
+ }))
27
+
28
+ // Mock Row component
29
+ vi.mock('../Row', () => ({
30
+ Row: ({ children, ...props }: any) => (
31
+ <div className="taro-uno-row" {...props}>
32
+ {children}
33
+ </div>
34
+ )
35
+ }))
36
+
37
+ describe('Col Component', () => {
38
+ const mockRef = React.createRef<ColRef>()
39
+
40
+ beforeEach(() => {
41
+ vi.clearAllMocks()
42
+ })
43
+
44
+ describe('Rendering', () => {
45
+ it('renders column with default props', () => {
46
+ render(<Col data-testid="col">Test Column</Col>)
47
+ const col = screen.getByTestId('col')
48
+ expect(col).toBeInTheDocument()
49
+ expect(col).toHaveTextContent('Test Column')
50
+ })
51
+
52
+ it('renders column with custom span', () => {
53
+ render(<Col span={12} data-testid="col">Span 12</Col>)
54
+ const col = screen.getByTestId('col')
55
+ expect(col).toBeInTheDocument()
56
+ })
57
+
58
+ it('renders column with custom offset', () => {
59
+ render(<Col offset={6} data-testid="col">Offset 6</Col>)
60
+ const col = screen.getByTestId('col')
61
+ expect(col).toBeInTheDocument()
62
+ })
63
+
64
+ it('renders column with custom order', () => {
65
+ render(<Col order={2} data-testid="col">Order 2</Col>)
66
+ const col = screen.getByTestId('col')
67
+ expect(col).toBeInTheDocument()
68
+ })
69
+
70
+ it('renders column with custom gutter', () => {
71
+ render(<Col gutter={16} data-testid="col">Gutter 16</Col>)
72
+ const col = screen.getByTestId('col')
73
+ expect(col).toBeInTheDocument()
74
+ })
75
+
76
+ it('renders column with flex property', () => {
77
+ render(<Col flex={1} data-testid="col">Flex 1</Col>)
78
+ const col = screen.getByTestId('col')
79
+ expect(col).toBeInTheDocument()
80
+ })
81
+
82
+ it('renders column with custom className', () => {
83
+ render(<Col className="custom-col" data-testid="col">Custom Class</Col>)
84
+ const col = screen.getByTestId('col')
85
+ expect(col).toBeInTheDocument()
86
+ expect(col).toHaveClass('custom-col')
87
+ })
88
+
89
+ it('renders empty column', () => {
90
+ render(<Col data-testid="col" />)
91
+ const col = screen.getByTestId('col')
92
+ expect(col).toBeInTheDocument()
93
+ expect(col).toBeEmptyDOMElement()
94
+ })
95
+
96
+ it('renders column with multiple children', () => {
97
+ render(
98
+ <Col data-testid="col">
99
+ <div>Child 1</div>
100
+ <div>Child 2</div>
101
+ <div>Child 3</div>
102
+ </Col>
103
+ )
104
+ const col = screen.getByTestId('col')
105
+ expect(col).toBeInTheDocument()
106
+ expect(col.children).toHaveLength(3)
107
+ })
108
+
109
+ it('renders column with responsive props', () => {
110
+ render(<Col responsive={{ xs: { span: 24 } }} data-testid="col">Responsive</Col>)
111
+ const col = screen.getByTestId('col')
112
+ expect(col).toBeInTheDocument()
113
+ })
114
+
115
+ it('renders column with maximum span', () => {
116
+ render(<Col span={24} data-testid="col">Full Width</Col>)
117
+ const col = screen.getByTestId('col')
118
+ expect(col).toBeInTheDocument()
119
+ })
120
+
121
+ it('renders column with minimum span', () => {
122
+ render(<Col span={1} data-testid="col">Minimum Width</Col>)
123
+ const col = screen.getByTestId('col')
124
+ expect(col).toBeInTheDocument()
125
+ })
126
+ })
127
+
128
+ describe('Event Handling', () => {
129
+ it('handles click events', () => {
130
+ const handleClick = vi.fn()
131
+ render(<Col onClick={handleClick} data-testid="col">Clickable</Col>)
132
+ const col = screen.getByTestId('col')
133
+ fireEvent.click(col)
134
+ expect(handleClick).toHaveBeenCalledTimes(1)
135
+ })
136
+
137
+ it('handles click events with children', () => {
138
+ const handleClick = vi.fn()
139
+ render(
140
+ <Col onClick={handleClick} data-testid="col">
141
+ <div>Child Content</div>
142
+ </Col>
143
+ )
144
+ const col = screen.getByTestId('col')
145
+ fireEvent.click(col)
146
+ expect(handleClick).toHaveBeenCalledTimes(1)
147
+ })
148
+
149
+ it('does not interfere with child click events', () => {
150
+ const handleColClick = vi.fn()
151
+ const handleChildClick = vi.fn((e) => e.stopPropagation())
152
+ render(
153
+ <Col onClick={handleColClick} data-testid="col">
154
+ <div onClick={handleChildClick} data-testid="child">Child</div>
155
+ </Col>
156
+ )
157
+ const child = screen.getByTestId('child')
158
+ fireEvent.click(child)
159
+ expect(handleChildClick).toHaveBeenCalledTimes(1)
160
+ expect(handleColClick).not.toHaveBeenCalled()
161
+ })
162
+ })
163
+
164
+ describe('Props Updates', () => {
165
+ it('updates span prop correctly', () => {
166
+ const { rerender } = render(<Col span={12} data-testid="col">Span Test</Col>)
167
+ const col = screen.getByTestId('col')
168
+ rerender(<Col span={8} data-testid="col">Span Test</Col>)
169
+ expect(col).toBeInTheDocument()
170
+ })
171
+
172
+ it('updates offset prop correctly', () => {
173
+ const { rerender } = render(<Col offset={4} data-testid="col">Offset Test</Col>)
174
+ const col = screen.getByTestId('col')
175
+ rerender(<Col offset={8} data-testid="col">Offset Test</Col>)
176
+ expect(col).toBeInTheDocument()
177
+ })
178
+
179
+ it('updates order prop correctly', () => {
180
+ const { rerender } = render(<Col order={1} data-testid="col">Order Test</Col>)
181
+ const col = screen.getByTestId('col')
182
+ rerender(<Col order={3} data-testid="col">Order Test</Col>)
183
+ expect(col).toBeInTheDocument()
184
+ })
185
+
186
+ it('updates gutter prop correctly', () => {
187
+ const { rerender } = render(<Col gutter={8} data-testid="col">Gutter Test</Col>)
188
+ const col = screen.getByTestId('col')
189
+ rerender(<Col gutter={16} data-testid="col">Gutter Test</Col>)
190
+ expect(col).toBeInTheDocument()
191
+ })
192
+
193
+ it('updates flex prop correctly', () => {
194
+ const { rerender } = render(<Col flex={1} data-testid="col">Flex Test</Col>)
195
+ const col = screen.getByTestId('col')
196
+ rerender(<Col flex={2} data-testid="col">Flex Test</Col>)
197
+ expect(col).toBeInTheDocument()
198
+ })
199
+ })
200
+
201
+ describe('Ref API', () => {
202
+ it('exposes ref methods correctly', () => {
203
+ render(<Col ref={mockRef} data-testid="col">Ref Test</Col>)
204
+
205
+ expect(mockRef.current).toBeDefined()
206
+ expect(mockRef.current?.getSpan()).toBe(24)
207
+ expect(mockRef.current?.getOffset()).toBe(0)
208
+ expect(mockRef.current?.getOrder()).toBe(0)
209
+ })
210
+
211
+ it('sets span via ref method', () => {
212
+ render(<Col ref={mockRef} data-testid="col">Ref Span Test</Col>)
213
+
214
+ if (mockRef.current) {
215
+ expect(() => mockRef.current.setSpan(12)).not.toThrow()
216
+ }
217
+ })
218
+
219
+ it('sets offset via ref method', () => {
220
+ render(<Col ref={mockRef} data-testid="col">Ref Offset Test</Col>)
221
+
222
+ if (mockRef.current) {
223
+ expect(() => mockRef.current.setOffset(6)).not.toThrow()
224
+ }
225
+ })
226
+
227
+ it('sets order via ref method', () => {
228
+ render(<Col ref={mockRef} data-testid="col">Ref Order Test</Col>)
229
+
230
+ if (mockRef.current) {
231
+ expect(() => mockRef.current.setOrder(2)).not.toThrow()
232
+ }
233
+ })
234
+
235
+ it('calls scrollIntoView via ref method', () => {
236
+ render(<Col ref={mockRef} data-testid="col">Ref Scroll Test</Col>)
237
+
238
+ if (mockRef.current) {
239
+ expect(typeof mockRef.current.scrollIntoView).toBe('function')
240
+ }
241
+ })
242
+
243
+ it('provides element access via ref', () => {
244
+ render(<Col ref={mockRef} data-testid="col">Ref Element Test</Col>)
245
+
246
+ expect(mockRef.current?.element).toBeDefined()
247
+ })
248
+ })
249
+
250
+ describe('Grid Layout Integration', () => {
251
+ it('works correctly within Row component', () => {
252
+ render(
253
+ <Row data-testid="row">
254
+ <Col span={12} data-testid="col">Column 1</Col>
255
+ <Col span={12} data-testid="col2">Column 2</Col>
256
+ </Row>
257
+ )
258
+ const row = screen.getByTestId('row')
259
+ const col1 = screen.getByTestId('col')
260
+ const col2 = screen.getByTestId('col2')
261
+ expect(row).toBeInTheDocument()
262
+ expect(col1).toBeInTheDocument()
263
+ expect(col2).toBeInTheDocument()
264
+ expect(row.children).toHaveLength(2)
265
+ })
266
+
267
+ it('handles multiple columns in row', () => {
268
+ render(
269
+ <Row data-testid="row">
270
+ <Col span={6}>Col 1</Col>
271
+ <Col span={6}>Col 2</Col>
272
+ <Col span={6}>Col 3</Col>
273
+ <Col span={6}>Col 4</Col>
274
+ </Row>
275
+ )
276
+ const row = screen.getByTestId('row')
277
+ expect(row).toBeInTheDocument()
278
+ expect(row.children).toHaveLength(4)
279
+ })
280
+
281
+ it('handles columns with different spans', () => {
282
+ render(
283
+ <Row data-testid="row">
284
+ <Col span={8}>Col 1</Col>
285
+ <Col span={12}>Col 2</Col>
286
+ <Col span={4}>Col 3</Col>
287
+ </Row>
288
+ )
289
+ const row = screen.getByTestId('row')
290
+ expect(row).toBeInTheDocument()
291
+ expect(row.children).toHaveLength(3)
292
+ })
293
+
294
+ it('handles columns with offsets', () => {
295
+ render(
296
+ <Row data-testid="row">
297
+ <Col span={12} offset={6}>Offset Column</Col>
298
+ <Col span={6}>Regular Column</Col>
299
+ </Row>
300
+ )
301
+ const row = screen.getByTestId('row')
302
+ expect(row).toBeInTheDocument()
303
+ expect(row.children).toHaveLength(2)
304
+ })
305
+
306
+ it('handles columns with custom order', () => {
307
+ render(
308
+ <Row data-testid="row">
309
+ <Col span={8} order={2}>Second</Col>
310
+ <Col span={8} order={1}>First</Col>
311
+ <Col span={8} order={3}>Third</Col>
312
+ </Row>
313
+ )
314
+ const row = screen.getByTestId('row')
315
+ expect(row).toBeInTheDocument()
316
+ expect(row.children).toHaveLength(3)
317
+ })
318
+ })
319
+
320
+ describe('Accessibility', () => {
321
+ it('has proper role attribute', () => {
322
+ render(<Col role="cell" data-testid="col">Accessible Col</Col>)
323
+ const col = screen.getByTestId('col')
324
+ expect(col).toHaveAttribute('role', 'cell')
325
+ })
326
+
327
+ it('supports aria-label', () => {
328
+ render(<Col aria-label="Main column" data-testid="col">Labeled Col</Col>)
329
+ const col = screen.getByTestId('col')
330
+ expect(col).toHaveAttribute('aria-label', 'Main column')
331
+ })
332
+
333
+ it('supports aria-labelledby', () => {
334
+ render(<Col aria-labelledby="col-title" data-testid="col">Labelled By Col</Col>)
335
+ const col = screen.getByTestId('col')
336
+ expect(col).toHaveAttribute('aria-labelledby', 'col-title')
337
+ })
338
+
339
+ it('supports tabIndex for keyboard navigation', () => {
340
+ render(<Col tabIndex={0} data-testid="col">Tabbable Col</Col>)
341
+ const col = screen.getByTestId('col')
342
+ expect(col).toHaveAttribute('tabindex', '0')
343
+ })
344
+
345
+ it('supports data attributes', () => {
346
+ render(<Col data-testid="col" data-custom="value">Data Attr Col</Col>)
347
+ const col = screen.getByTestId('col')
348
+ expect(col).toHaveAttribute('data-custom', 'value')
349
+ })
350
+ })
351
+
352
+ describe('Edge Cases', () => {
353
+ it('handles span greater than 24', () => {
354
+ render(<Col span={30} data-testid="col">Oversized</Col>)
355
+ const col = screen.getByTestId('col')
356
+ expect(col).toBeInTheDocument()
357
+ })
358
+
359
+ it('handles negative span gracefully', () => {
360
+ const { container } = render(<Col span={-6} data-testid="col">Negative Span</Col>)
361
+ expect(screen.getByTestId('col')).toBeInTheDocument()
362
+ })
363
+
364
+ it('handles span of 0', () => {
365
+ render(<Col span={0} data-testid="col">Zero Span</Col>)
366
+ const col = screen.getByTestId('col')
367
+ expect(col).toBeInTheDocument()
368
+ })
369
+
370
+ it('handles negative offset gracefully', () => {
371
+ const { container } = render(<Col offset={-6} data-testid="col">Negative Offset</Col>)
372
+ expect(screen.getByTestId('col')).toBeInTheDocument()
373
+ })
374
+
375
+ it('handles offset greater than 24', () => {
376
+ render(<Col offset={30} data-testid="col">Large Offset</Col>)
377
+ const col = screen.getByTestId('col')
378
+ expect(col).toBeInTheDocument()
379
+ })
380
+
381
+ it('handles negative order gracefully', () => {
382
+ const { container } = render(<Col order={-2} data-testid="col">Negative Order</Col>)
383
+ expect(screen.getByTestId('col')).toBeInTheDocument()
384
+ })
385
+
386
+ it('handles very large order', () => {
387
+ render(<Col order={999} data-testid="col">Large Order</Col>)
388
+ const col = screen.getByTestId('col')
389
+ expect(col).toBeInTheDocument()
390
+ })
391
+
392
+ it('handles negative gutter gracefully', () => {
393
+ const { container } = render(<Col gutter={-16} data-testid="col">Negative Gutter</Col>)
394
+ expect(screen.getByTestId('col')).toBeInTheDocument()
395
+ })
396
+
397
+ it('handles very large gutter', () => {
398
+ render(<Col gutter={9999} data-testid="col">Large Gutter</Col>)
399
+ const col = screen.getByTestId('col')
400
+ expect(col).toBeInTheDocument()
401
+ })
402
+
403
+ it('handles undefined children', () => {
404
+ render(<Col data-testid="col">{undefined}</Col>)
405
+ const col = screen.getByTestId('col')
406
+ expect(col).toBeInTheDocument()
407
+ })
408
+
409
+ it('handles null children', () => {
410
+ render(<Col data-testid="col">{null}</Col>)
411
+ const col = screen.getByTestId('col')
412
+ expect(col).toBeInTheDocument()
413
+ })
414
+
415
+ it('handles boolean children', () => {
416
+ render(<Col data-testid="col">{true}</Col>)
417
+ const col = screen.getByTestId('col')
418
+ expect(col).toBeInTheDocument()
419
+ })
420
+ })
421
+
422
+ describe('Responsive Behavior', () => {
423
+ it('applies responsive styles correctly', () => {
424
+ const responsiveProps = {
425
+ xs: { span: 24 },
426
+ sm: { span: 12 },
427
+ md: { span: 8 },
428
+ lg: { span: 6 }
429
+ }
430
+ render(<Col responsive={responsiveProps} data-testid="col">Responsive</Col>)
431
+ const col = screen.getByTestId('col')
432
+ expect(col).toBeInTheDocument()
433
+ })
434
+
435
+ it('handles empty responsive object', () => {
436
+ render(<Col responsive={{}} data-testid="col">Empty Responsive</Col>)
437
+ const col = screen.getByTestId('col')
438
+ expect(col).toBeInTheDocument()
439
+ })
440
+
441
+ it('handles partial responsive object', () => {
442
+ render(<Col responsive={{ xs: { span: 24 } }} data-testid="col">Partial Responsive</Col>)
443
+ const col = screen.getByTestId('col')
444
+ expect(col).toBeInTheDocument()
445
+ })
446
+
447
+ it('handles responsive offset', () => {
448
+ const responsiveProps = {
449
+ xs: { offset: 0 },
450
+ sm: { offset: 6 },
451
+ md: { offset: 12 }
452
+ }
453
+ render(<Col responsive={responsiveProps} data-testid="col">Responsive Offset</Col>)
454
+ const col = screen.getByTestId('col')
455
+ expect(col).toBeInTheDocument()
456
+ })
457
+ })
458
+
459
+ describe('Flex Layout', () => {
460
+ it('handles flex property as number', () => {
461
+ render(<Col flex={1} data-testid="col">Flex Number</Col>)
462
+ const col = screen.getByTestId('col')
463
+ expect(col).toBeInTheDocument()
464
+ })
465
+
466
+ it('handles flex property as string', () => {
467
+ render(<Col flex="1 1 auto" data-testid="col">Flex String</Col>)
468
+ const col = screen.getByTestId('col')
469
+ expect(col).toBeInTheDocument()
470
+ })
471
+
472
+ it('handles flex property as object', () => {
473
+ render(<Col flex={{ grow: 1, shrink: 0, basis: 'auto' } as any} data-testid="col">Flex Object</Col>)
474
+ const col = screen.getByTestId('col')
475
+ expect(col).toBeInTheDocument()
476
+ })
477
+
478
+ it('handles flex with span', () => {
479
+ render(<Col span={12} flex={1} data-testid="col">Flex with Span</Col>)
480
+ const col = screen.getByTestId('col')
481
+ expect(col).toBeInTheDocument()
482
+ })
483
+ })
484
+
485
+ describe('Performance', () => {
486
+ it('renders efficiently with many columns', () => {
487
+ const columns = Array.from({ length: 24 }, (_, i) => <Col key={i} span={1} data-testid={`col-${i}`}>Col {i}</Col>)
488
+ render(<Row>{columns}</Row>)
489
+ expect(screen.getAllByText(/^Col \d+$/)).toHaveLength(24)
490
+ })
491
+
492
+ it('handles frequent prop updates efficiently', () => {
493
+ const { rerender } = render(<Col span={12} data-testid="col">Performance Col</Col>)
494
+
495
+ for (let i = 0; i < 10; i++) {
496
+ rerender(<Col span={i + 1} data-testid="col">Performance Col</Col>)
497
+ }
498
+
499
+ expect(screen.getByTestId('col')).toBeInTheDocument()
500
+ })
501
+ })
502
+
503
+ describe('Nesting', () => {
504
+ it('handles nested Row within Col', () => {
505
+ render(
506
+ <Row>
507
+ <Col span={12}>
508
+ <Row>
509
+ <Col span={12}>Nested Column</Col>
510
+ </Row>
511
+ </Col>
512
+ <Col span={12}>Outer Column</Col>
513
+ </Row>
514
+ )
515
+ expect(screen.getAllByText(/Column/)).toHaveLength(2)
516
+ })
517
+
518
+ it('handles deeply nested columns', () => {
519
+ render(
520
+ <Row>
521
+ <Col span={12}>
522
+ <Row>
523
+ <Col span={12}>
524
+ <Row>
525
+ <Col span={12}>Deeply Nested</Col>
526
+ </Row>
527
+ </Col>
528
+ </Row>
529
+ </Col>
530
+ </Row>
531
+ )
532
+ expect(screen.getByText('Deeply Nested')).toBeInTheDocument()
533
+ })
534
+ })
535
+ })
@@ -0,0 +1,115 @@
1
+ import React, { forwardRef, useRef, useState, useEffect, useCallback } from 'react';
2
+ import { View } from '@tarojs/components';
3
+ import { colStyles } from './Col.styles';
4
+ import type { ColProps, ColRef, ColSpan, ColOffset, ColOrder } from './Col.types';
5
+
6
+ /** Col组件 */
7
+ export const ColComponent = forwardRef<ColRef, ColProps>((props, ref) => {
8
+ const {
9
+ children,
10
+ span = 24,
11
+ offset = 0,
12
+ order = 0,
13
+ gutter = 0,
14
+ flex,
15
+ className,
16
+ style,
17
+ onClick,
18
+ responsive,
19
+ ...restProps
20
+ } = props;
21
+
22
+ const colRef = useRef<typeof View>(null);
23
+ const [internalSpan, setInternalSpan] = useState<ColSpan>(span);
24
+ const [internalOffset, setInternalOffset] = useState<ColOffset>(offset);
25
+ const [internalOrder, setInternalOrder] = useState<ColOrder>(order);
26
+ const [internalFlex, setInternalFlex] = useState(flex);
27
+
28
+ // 更新内部状态
29
+ useEffect(() => {
30
+ setInternalSpan(span);
31
+ }, [span]);
32
+
33
+ useEffect(() => {
34
+ setInternalOffset(offset);
35
+ }, [offset]);
36
+
37
+ useEffect(() => {
38
+ setInternalOrder(order);
39
+ }, [order]);
40
+
41
+ useEffect(() => {
42
+ setInternalFlex(flex);
43
+ }, [flex]);
44
+
45
+ // 处理点击事件
46
+ const handleClick = useCallback(
47
+ (event: React.MouseEvent) => {
48
+ onClick?.(event);
49
+ },
50
+ [onClick],
51
+ );
52
+
53
+ // 计算样式
54
+ const colStyle = colStyles['getBaseStyle']({
55
+ span: internalSpan,
56
+ offset: internalOffset,
57
+ order: internalOrder,
58
+ gutter,
59
+ flex: internalFlex,
60
+ style: style || {},
61
+ });
62
+
63
+ // 计算响应式样式
64
+ const responsiveStyle = responsive ? colStyles['getResponsiveStyle'](responsive) : {};
65
+
66
+ // 计算类名
67
+ const colClassName = colStyles['getClassName']({
68
+ span: internalSpan,
69
+ offset: internalOffset,
70
+ flex: internalFlex,
71
+ className: className || '',
72
+ });
73
+
74
+ // 暴露给外部的引用方法
75
+ React.useImperativeHandle(
76
+ ref,
77
+ () => ({
78
+ element: colRef.current,
79
+ getSpan: () => internalSpan,
80
+ getOffset: () => internalOffset,
81
+ getOrder: () => internalOrder,
82
+ setSpan: (newSpan: ColSpan) => {
83
+ setInternalSpan(newSpan);
84
+ },
85
+ setOffset: (newOffset: ColOffset) => {
86
+ setInternalOffset(newOffset);
87
+ },
88
+ setOrder: (newOrder: ColOrder) => {
89
+ setInternalOrder(newOrder);
90
+ },
91
+ scrollIntoView: (options?: ScrollIntoViewOptions) => {
92
+ (colRef.current as any)?.scrollIntoView(options);
93
+ },
94
+ }),
95
+ [internalSpan, internalOffset, internalOrder],
96
+ );
97
+
98
+ return (
99
+ <View
100
+ ref={colRef}
101
+ className={colClassName}
102
+ style={{ ...colStyle, ...responsiveStyle }}
103
+ onClick={handleClick}
104
+ {...restProps}
105
+ >
106
+ {children}
107
+ </View>
108
+ );
109
+ });
110
+
111
+ /** Col组件显示名称 */
112
+ ColComponent.displayName = 'Col';
113
+
114
+ /** 导出Col组件 */
115
+ export const Col = ColComponent;