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,159 @@
1
+ import type { RowProps, RowGutter } from './Row.types';
2
+
3
+ /** Row组件样式管理器 */
4
+ export const rowStyles = {
5
+ /** 尺寸映射表 */
6
+ SIZE_MAP: {
7
+ small: 8,
8
+ medium: 16,
9
+ large: 24,
10
+ default: 16,
11
+ } as const,
12
+
13
+ /** 对齐方式映射表 */
14
+ ALIGN_MAP: {
15
+ top: 'flex-start',
16
+ middle: 'center',
17
+ bottom: 'flex-end',
18
+ stretch: 'stretch',
19
+ } as const,
20
+
21
+ /** 对齐方式映射表 */
22
+ JUSTIFY_MAP: {
23
+ start: 'flex-start',
24
+ end: 'flex-end',
25
+ center: 'center',
26
+ 'space-around': 'space-around',
27
+ 'space-between': 'space-between',
28
+ 'space-evenly': 'space-evenly',
29
+ } as const,
30
+
31
+ /**
32
+ * 解析尺寸值
33
+ */
34
+ parseSize: (size: any): string => {
35
+ if (typeof size === 'number') {
36
+ return `${size}px`;
37
+ }
38
+
39
+ if (typeof size === 'string') {
40
+ if (size in rowStyles.SIZE_MAP) {
41
+ return `${rowStyles.SIZE_MAP[size as keyof typeof rowStyles.SIZE_MAP]}px`;
42
+ }
43
+ return size;
44
+ }
45
+
46
+ return `${rowStyles.SIZE_MAP.default}px`;
47
+ },
48
+
49
+ /**
50
+ * 解析尺寸值为数字
51
+ */
52
+ parseSizeNumber: (size: any): number => {
53
+ if (typeof size === 'number') {
54
+ return size;
55
+ }
56
+
57
+ if (typeof size === 'string') {
58
+ if (size in rowStyles.SIZE_MAP) {
59
+ return rowStyles.SIZE_MAP[size as keyof typeof rowStyles.SIZE_MAP];
60
+ }
61
+ // Try to parse number from string
62
+ const match = size && size.match ? size.match(/^(\d+)/) : null;
63
+ return match && match[1] ? parseInt(match[1], 10) : rowStyles.SIZE_MAP.default;
64
+ }
65
+
66
+ return rowStyles.SIZE_MAP.default;
67
+ },
68
+
69
+ /**
70
+ * 解析间距值
71
+ */
72
+ parseGutter: (gutter: RowGutter): string => {
73
+ if (Array.isArray(gutter)) {
74
+ const [rowGutter, colGutter] = gutter;
75
+ return `${rowStyles['parseSize'](rowGutter)} ${rowStyles['parseSize'](colGutter)}`;
76
+ }
77
+ return rowStyles['parseSize'](gutter);
78
+ },
79
+
80
+ /**
81
+ * 获取基础样式
82
+ */
83
+ getBaseStyle: (props: RowProps): React.CSSProperties => {
84
+ const { gutter = 0, align = 'top', justify = 'start', wrap = true, style = {} } = props;
85
+
86
+ // 计算对齐方式
87
+ const alignItems = rowStyles['ALIGN_MAP'][align];
88
+ const justifyContent = rowStyles['JUSTIFY_MAP'][justify];
89
+
90
+ return {
91
+ display: 'flex',
92
+ flexDirection: 'row',
93
+ flexWrap: wrap ? 'wrap' : 'nowrap',
94
+ alignItems,
95
+ justifyContent,
96
+ marginLeft: Array.isArray(gutter)
97
+ ? `-${rowStyles['parseSizeNumber'](gutter[0]) / 2}px`
98
+ : `-${rowStyles['parseSizeNumber'](gutter) / 2}px`,
99
+ marginRight: Array.isArray(gutter)
100
+ ? `-${rowStyles['parseSizeNumber'](gutter[0]) / 2}px`
101
+ : `-${rowStyles['parseSizeNumber'](gutter) / 2}px`,
102
+ marginTop: Array.isArray(gutter)
103
+ ? `-${rowStyles['parseSizeNumber'](gutter[1]) / 2}px`
104
+ : `-${rowStyles['parseSizeNumber'](gutter) / 2}px`,
105
+ marginBottom: Array.isArray(gutter)
106
+ ? `-${rowStyles['parseSizeNumber'](gutter[1]) / 2}px`
107
+ : `-${rowStyles['parseSizeNumber'](gutter) / 2}px`,
108
+ boxSizing: 'border-box',
109
+ ...style,
110
+ };
111
+ },
112
+
113
+ /**
114
+ * 获取类名
115
+ */
116
+ getClassName: (props: RowProps): string => {
117
+ const { align = 'top', justify = 'start', wrap = true, className = '' } = props;
118
+
119
+ const baseClass = 'taro-uno-row';
120
+ const alignClass = `${baseClass}--${align}`;
121
+ const justifyClass = `${baseClass}--${justify}`;
122
+ const wrapClass = wrap ? `${baseClass}--wrap` : `${baseClass}--nowrap`;
123
+
124
+ return [baseClass, alignClass, justifyClass, wrapClass, className].filter(Boolean).join(' ');
125
+ },
126
+
127
+ /**
128
+ * 获取响应式样式
129
+ */
130
+ getResponsiveStyle: (responsive: RowProps['responsive']): React.CSSProperties => {
131
+ if (!responsive) return {};
132
+
133
+ const responsiveStyle: React.CSSProperties = {};
134
+
135
+ Object.entries(responsive).forEach(([_breakpoint, props]) => {
136
+ if (props) {
137
+ // 这里需要配合CSS-in-JS库来处理响应式样式
138
+ // 暂时返回空对象
139
+ }
140
+ });
141
+
142
+ return responsiveStyle;
143
+ },
144
+
145
+ /**
146
+ * 获取断点值
147
+ */
148
+ getBreakpointValue: (breakpoint: string): number => {
149
+ const breakpoints = {
150
+ xs: 0,
151
+ sm: 640,
152
+ md: 768,
153
+ lg: 1024,
154
+ xl: 1280,
155
+ xxl: 1536,
156
+ };
157
+ return breakpoints[breakpoint as keyof typeof breakpoints] || 0;
158
+ },
159
+ };
@@ -0,0 +1,467 @@
1
+ import React from 'react'
2
+ import { render, screen, fireEvent } from '@testing-library/react'
3
+ import { Row } from '../Row'
4
+ import { Col } from '../Col'
5
+ import type { RowProps, RowRef } from '../Row.types'
6
+
7
+ // Mock Taro components
8
+ vi.mock('@tarojs/components', () => ({
9
+ View: 'div'
10
+ }))
11
+
12
+ // Mock styles
13
+ vi.mock('../Row.styles', () => ({
14
+ rowStyles: {
15
+ ALIGN_MAP: {
16
+ top: 'flex-start',
17
+ middle: 'center',
18
+ bottom: 'flex-end',
19
+ stretch: 'stretch'
20
+ },
21
+ JUSTIFY_MAP: {
22
+ start: 'flex-start',
23
+ end: 'flex-end',
24
+ center: 'center',
25
+ 'space-around': 'space-around',
26
+ 'space-between': 'space-between',
27
+ 'space-evenly': 'space-evenly'
28
+ },
29
+ getBaseStyle: (props: any) => ({
30
+ display: 'flex',
31
+ flexWrap: props.wrap ? 'wrap' : 'nowrap',
32
+ alignItems: props.align,
33
+ justifyContent: props.justify,
34
+ gap: typeof props.gutter === 'number' ? `${props.gutter}px` : props.gutter || '0px'
35
+ }),
36
+ getResponsiveStyle: (responsive: any) => responsive ? { '@media (max-width: 768px)': { flexWrap: 'wrap' } } : {},
37
+ getClassName: (props: any) => `taro-uno-row taro-uno-row--${props.align} taro-uno-row--${props.justify} ${props.wrap ? 'taro-uno-row--wrap' : ''} ${props.className || ''}`
38
+ }
39
+ }))
40
+
41
+ // Mock Col component
42
+ vi.mock('../Col', () => ({
43
+ Col: ({ children, span, offset, className, ...props }: any) => (
44
+ <div className={`taro-uno-col taro-uno-col--${span} ${className || ''}`} {...props}>
45
+ {children}
46
+ </div>
47
+ )
48
+ }))
49
+
50
+ describe('Row Component', () => {
51
+ const mockRef = React.createRef<RowRef>()
52
+
53
+ beforeEach(() => {
54
+ vi.clearAllMocks()
55
+ })
56
+
57
+ describe('Rendering', () => {
58
+ it('renders row with default props', () => {
59
+ render(<Row data-testid="row">Test Row</Row>)
60
+ const row = screen.getByTestId('row')
61
+ expect(row).toBeInTheDocument()
62
+ expect(row).toHaveTextContent('Test Row')
63
+ })
64
+
65
+ it('renders row with custom gutter', () => {
66
+ render(<Row gutter={16} data-testid="row">Gutter Row</Row>)
67
+ const row = screen.getByTestId('row')
68
+ expect(row).toBeInTheDocument()
69
+ })
70
+
71
+ it('renders row with custom align', () => {
72
+ render(<Row align="middle" data-testid="row">Aligned Row</Row>)
73
+ const row = screen.getByTestId('row')
74
+ expect(row).toBeInTheDocument()
75
+ })
76
+
77
+ it('renders row with custom justify', () => {
78
+ render(<Row justify="center" data-testid="row">Justified Row</Row>)
79
+ const row = screen.getByTestId('row')
80
+ expect(row).toBeInTheDocument()
81
+ })
82
+
83
+ it('renders row with wrap disabled', () => {
84
+ render(<Row wrap={false} data-testid="row">No Wrap Row</Row>)
85
+ const row = screen.getByTestId('row')
86
+ expect(row).toBeInTheDocument()
87
+ })
88
+
89
+ it('renders row with custom className', () => {
90
+ render(<Row className="custom-row" data-testid="row">Custom Class Row</Row>)
91
+ const row = screen.getByTestId('row')
92
+ expect(row).toBeInTheDocument()
93
+ expect(row).toHaveClass('custom-row')
94
+ })
95
+
96
+ it('renders empty row', () => {
97
+ render(<Row data-testid="row" />)
98
+ const row = screen.getByTestId('row')
99
+ expect(row).toBeInTheDocument()
100
+ expect(row).toBeEmptyDOMElement()
101
+ })
102
+
103
+ it('renders row with multiple children', () => {
104
+ render(
105
+ <Row data-testid="row">
106
+ <div>Child 1</div>
107
+ <div>Child 2</div>
108
+ <div>Child 3</div>
109
+ </Row>
110
+ )
111
+ const row = screen.getByTestId('row')
112
+ expect(row).toBeInTheDocument()
113
+ expect(row.children).toHaveLength(3)
114
+ })
115
+
116
+ it('renders row with Col components', () => {
117
+ render(
118
+ <Row data-testid="row">
119
+ <Col span={12}>Column 1</Col>
120
+ <Col span={12}>Column 2</Col>
121
+ </Row>
122
+ )
123
+ const row = screen.getByTestId('row')
124
+ expect(row).toBeInTheDocument()
125
+ expect(row.children).toHaveLength(2)
126
+ })
127
+
128
+ it('renders row with responsive props', () => {
129
+ render(<Row responsive={{ xs: { gutter: 8 } }} data-testid="row">Responsive Row</Row>)
130
+ const row = screen.getByTestId('row')
131
+ expect(row).toBeInTheDocument()
132
+ })
133
+
134
+ it('renders row with array gutter', () => {
135
+ render(<Row gutter={[16, 24]} data-testid="row">Array Gutter Row</Row>)
136
+ const row = screen.getByTestId('row')
137
+ expect(row).toBeInTheDocument()
138
+ })
139
+ })
140
+
141
+ describe('Col Component Integration', () => {
142
+ it('passes gutter prop to Col components', () => {
143
+ const { container } = render(
144
+ <Row gutter={16} data-testid="row">
145
+ <Col span={12}>Column 1</Col>
146
+ <Col span={12}>Column 2</Col>
147
+ </Row>
148
+ )
149
+ const row = screen.getByTestId('row')
150
+ expect(row).toBeInTheDocument()
151
+ expect(row.children).toHaveLength(2)
152
+ })
153
+
154
+ it('handles mixed children (Col and non-Col)', () => {
155
+ const { container } = render(
156
+ <Row gutter={16} data-testid="row">
157
+ <Col span={12}>Column 1</Col>
158
+ <div>Regular Div</div>
159
+ <Col span={12}>Column 2</Col>
160
+ </Row>
161
+ )
162
+ const row = screen.getByTestId('row')
163
+ expect(row).toBeInTheDocument()
164
+ expect(row.children).toHaveLength(3)
165
+ })
166
+
167
+ it('handles nested Row components', () => {
168
+ const { container } = render(
169
+ <Row data-testid="outer-row">
170
+ <Col span={12}>
171
+ <Row data-testid="inner-row">
172
+ <Col span={12}>Nested Column</Col>
173
+ </Row>
174
+ </Col>
175
+ <Col span={12}>Outer Column</Col>
176
+ </Row>
177
+ )
178
+ const outerRow = screen.getByTestId('outer-row')
179
+ const innerRow = screen.getByTestId('inner-row')
180
+ expect(outerRow).toBeInTheDocument()
181
+ expect(innerRow).toBeInTheDocument()
182
+ })
183
+ })
184
+
185
+ describe('Event Handling', () => {
186
+ it('handles click events', () => {
187
+ const handleClick = vi.fn()
188
+ render(<Row onClick={handleClick} data-testid="row">Clickable Row</Row>)
189
+ const row = screen.getByTestId('row')
190
+ fireEvent.click(row)
191
+ expect(handleClick).toHaveBeenCalledTimes(1)
192
+ })
193
+
194
+ it('handles click events with children', () => {
195
+ const handleClick = vi.fn()
196
+ render(
197
+ <Row onClick={handleClick} data-testid="row">
198
+ <div>Child 1</div>
199
+ <div>Child 2</div>
200
+ </Row>
201
+ )
202
+ const row = screen.getByTestId('row')
203
+ fireEvent.click(row)
204
+ expect(handleClick).toHaveBeenCalledTimes(1)
205
+ })
206
+
207
+ it('does not interfere with child click events', () => {
208
+ const handleRowClick = vi.fn()
209
+ const handleChildClick = vi.fn((e) => e.stopPropagation())
210
+ render(
211
+ <Row onClick={handleRowClick} data-testid="row">
212
+ <div onClick={handleChildClick} data-testid="child">Child</div>
213
+ </Row>
214
+ )
215
+ const child = screen.getByTestId('child')
216
+ fireEvent.click(child)
217
+ expect(handleChildClick).toHaveBeenCalledTimes(1)
218
+ expect(handleRowClick).not.toHaveBeenCalled()
219
+ })
220
+ })
221
+
222
+ describe('Props Updates', () => {
223
+ it('updates gutter prop correctly', () => {
224
+ const { rerender } = render(<Row gutter={8} data-testid="row">Gutter Test</Row>)
225
+ const row = screen.getByTestId('row')
226
+ rerender(<Row gutter={16} data-testid="row">Gutter Test</Row>)
227
+ expect(row).toBeInTheDocument()
228
+ })
229
+
230
+ it('updates align prop correctly', () => {
231
+ const { rerender } = render(<Row align="top" data-testid="row">Align Test</Row>)
232
+ const row = screen.getByTestId('row')
233
+ rerender(<Row align="middle" data-testid="row">Align Test</Row>)
234
+ expect(row).toBeInTheDocument()
235
+ })
236
+
237
+ it('updates justify prop correctly', () => {
238
+ const { rerender } = render(<Row justify="start" data-testid="row">Justify Test</Row>)
239
+ const row = screen.getByTestId('row')
240
+ rerender(<Row justify="center" data-testid="row">Justify Test</Row>)
241
+ expect(row).toBeInTheDocument()
242
+ })
243
+
244
+ it('updates wrap prop correctly', () => {
245
+ const { rerender } = render(<Row wrap={true} data-testid="row">Wrap Test</Row>)
246
+ const row = screen.getByTestId('row')
247
+ rerender(<Row wrap={false} data-testid="row">Wrap Test</Row>)
248
+ expect(row).toBeInTheDocument()
249
+ })
250
+
251
+ it('updates array gutter prop correctly', () => {
252
+ const { rerender } = render(<Row gutter={[8, 12]} data-testid="row">Array Gutter Test</Row>)
253
+ const row = screen.getByTestId('row')
254
+ rerender(<Row gutter={[16, 24]} data-testid="row">Array Gutter Test</Row>)
255
+ expect(row).toBeInTheDocument()
256
+ })
257
+ })
258
+
259
+ describe('Ref API', () => {
260
+ it('exposes ref methods correctly', () => {
261
+ render(<Row ref={mockRef} data-testid="row">Ref Test</Row>)
262
+
263
+ expect(mockRef.current).toBeDefined()
264
+ expect(mockRef.current?.getAlign()).toBe('top')
265
+ expect(mockRef.current?.getJustify()).toBe('start')
266
+ expect(mockRef.current?.getGutter()).toBe(0)
267
+ })
268
+
269
+ it('sets align via ref method', () => {
270
+ render(<Row ref={mockRef} data-testid="row">Ref Align Test</Row>)
271
+
272
+ if (mockRef.current) {
273
+ expect(() => mockRef.current.setAlign('middle')).not.toThrow()
274
+ }
275
+ })
276
+
277
+ it('sets justify via ref method', () => {
278
+ render(<Row ref={mockRef} data-testid="row">Ref Justify Test</Row>)
279
+
280
+ if (mockRef.current) {
281
+ expect(() => mockRef.current.setJustify('center')).not.toThrow()
282
+ }
283
+ })
284
+
285
+ it('sets gutter via ref method', () => {
286
+ render(<Row ref={mockRef} data-testid="row">Ref Gutter Test</Row>)
287
+
288
+ if (mockRef.current) {
289
+ expect(() => mockRef.current.setGutter(16)).not.toThrow()
290
+ }
291
+ })
292
+
293
+ it('calls scrollIntoView via ref method', () => {
294
+ render(<Row ref={mockRef} data-testid="row">Ref Scroll Test</Row>)
295
+
296
+ if (mockRef.current) {
297
+ expect(typeof mockRef.current.scrollIntoView).toBe('function')
298
+ }
299
+ })
300
+
301
+ it('provides element access via ref', () => {
302
+ render(<Row ref={mockRef} data-testid="row">Ref Element Test</Row>)
303
+
304
+ expect(mockRef.current?.element).toBeDefined()
305
+ })
306
+ })
307
+
308
+ describe('Accessibility', () => {
309
+ it('has proper role attribute', () => {
310
+ render(<Row role="row" data-testid="row">Accessible Row</Row>)
311
+ const row = screen.getByTestId('row')
312
+ expect(row).toHaveAttribute('role', 'row')
313
+ })
314
+
315
+ it('supports aria-label', () => {
316
+ render(<Row aria-label="Main row" data-testid="row">Labeled Row</Row>)
317
+ const row = screen.getByTestId('row')
318
+ expect(row).toHaveAttribute('aria-label', 'Main row')
319
+ })
320
+
321
+ it('supports aria-labelledby', () => {
322
+ render(<Row aria-labelledby="row-title" data-testid="row">Labelled By Row</Row>)
323
+ const row = screen.getByTestId('row')
324
+ expect(row).toHaveAttribute('aria-labelledby', 'row-title')
325
+ })
326
+
327
+ it('supports tabIndex for keyboard navigation', () => {
328
+ render(<Row tabIndex={0} data-testid="row">Tabbable Row</Row>)
329
+ const row = screen.getByTestId('row')
330
+ expect(row).toHaveAttribute('tabindex', '0')
331
+ })
332
+
333
+ it('supports data attributes', () => {
334
+ render(<Row data-testid="row" data-custom="value">Data Attr Row</Row>)
335
+ const row = screen.getByTestId('row')
336
+ expect(row).toHaveAttribute('data-custom', 'value')
337
+ })
338
+ })
339
+
340
+ describe('Edge Cases', () => {
341
+ it('handles invalid align prop gracefully', () => {
342
+ const { container } = render(<Row align="invalid" as any data-testid="row">Invalid Align</Row>)
343
+ expect(screen.getByTestId('row')).toBeInTheDocument()
344
+ })
345
+
346
+ it('handles invalid justify prop gracefully', () => {
347
+ const { container } = render(<Row justify="invalid" as any data-testid="row">Invalid Justify</Row>)
348
+ expect(screen.getByTestId('row')).toBeInTheDocument()
349
+ })
350
+
351
+ it('handles negative gutter gracefully', () => {
352
+ render(<Row gutter={-16} data-testid="row">Negative Gutter</Row>)
353
+ const row = screen.getByTestId('row')
354
+ expect(row).toBeInTheDocument()
355
+ })
356
+
357
+ it('handles very large gutter', () => {
358
+ render(<Row gutter={9999} data-testid="row">Large Gutter</Row>)
359
+ const row = screen.getByTestId('row')
360
+ expect(row).toBeInTheDocument()
361
+ })
362
+
363
+ it('handles undefined children', () => {
364
+ render(<Row data-testid="row">{undefined}</Row>)
365
+ const row = screen.getByTestId('row')
366
+ expect(row).toBeInTheDocument()
367
+ })
368
+
369
+ it('handles null children', () => {
370
+ render(<Row data-testid="row">{null}</Row>)
371
+ const row = screen.getByTestId('row')
372
+ expect(row).toBeInTheDocument()
373
+ })
374
+
375
+ it('handles boolean children', () => {
376
+ render(<Row data-testid="row">{true}</Row>)
377
+ const row = screen.getByTestId('row')
378
+ expect(row).toBeInTheDocument()
379
+ })
380
+
381
+ it('handles mixed children types', () => {
382
+ render(
383
+ <Row data-testid="row">
384
+ <div>String</div>
385
+ {123}
386
+ {true}
387
+ {null}
388
+ {undefined}
389
+ <div>Another Div</div>
390
+ </Row>
391
+ )
392
+ const row = screen.getByTestId('row')
393
+ expect(row).toBeInTheDocument()
394
+ })
395
+ })
396
+
397
+ describe('Responsive Behavior', () => {
398
+ it('applies responsive styles correctly', () => {
399
+ const responsiveProps = {
400
+ xs: { gutter: 8, align: 'middle' },
401
+ sm: { gutter: 16, align: 'top' },
402
+ md: { gutter: 24, align: 'bottom' }
403
+ }
404
+ render(<Row responsive={responsiveProps} data-testid="row">Responsive Row</Row>)
405
+ const row = screen.getByTestId('row')
406
+ expect(row).toBeInTheDocument()
407
+ })
408
+
409
+ it('handles empty responsive object', () => {
410
+ render(<Row responsive={{}} data-testid="row">Empty Responsive Row</Row>)
411
+ const row = screen.getByTestId('row')
412
+ expect(row).toBeInTheDocument()
413
+ })
414
+
415
+ it('handles partial responsive object', () => {
416
+ render(<Row responsive={{ xs: { gutter: 8 } }} data-testid="row">Partial Responsive Row</Row>)
417
+ const row = screen.getByTestId('row')
418
+ expect(row).toBeInTheDocument()
419
+ })
420
+ })
421
+
422
+ describe('Performance', () => {
423
+ it('renders efficiently with many children', () => {
424
+ const children = Array.from({ length: 50 }, (_, i) => <Col key={i} span={1}>Col {i}</Col>)
425
+ render(<Row data-testid="row">{children}</Row>)
426
+ const row = screen.getByTestId('row')
427
+ expect(row).toBeInTheDocument()
428
+ expect(row.children).toHaveLength(50)
429
+ })
430
+
431
+ it('handles frequent prop updates efficiently', () => {
432
+ const { rerender } = render(<Row gutter={8} data-testid="row">Performance Row</Row>)
433
+
434
+ for (let i = 0; i < 10; i++) {
435
+ rerender(<Row gutter={i * 8} data-testid="row">Performance Row</Row>)
436
+ }
437
+
438
+ expect(screen.getByTestId('row')).toBeInTheDocument()
439
+ })
440
+ })
441
+
442
+ describe('Gutter Types', () => {
443
+ it('handles string gutter', () => {
444
+ render(<Row gutter="16px" data-testid="row">String Gutter</Row>)
445
+ const row = screen.getByTestId('row')
446
+ expect(row).toBeInTheDocument()
447
+ })
448
+
449
+ it('handles array gutter with strings', () => {
450
+ render(<Row gutter={['16px', '24px']} data-testid="row">Array String Gutter</Row>)
451
+ const row = screen.getByTestId('row')
452
+ expect(row).toBeInTheDocument()
453
+ })
454
+
455
+ it('handles array gutter with mixed types', () => {
456
+ render(<Row gutter={[16, '24px']} data-testid="row">Mixed Array Gutter</Row>)
457
+ const row = screen.getByTestId('row')
458
+ expect(row).toBeInTheDocument()
459
+ })
460
+
461
+ it('handles Size enum gutter', () => {
462
+ render(<Row gutter="medium" data-testid="row">Size Gutter</Row>)
463
+ const row = screen.getByTestId('row')
464
+ expect(row).toBeInTheDocument()
465
+ })
466
+ })
467
+ })