taro-uno-ui 0.9.0 → 1.0.1

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 (312) hide show
  1. package/README.md +21 -0
  2. package/dist/js/{index-DffLRSro.js → index-CDFsvu80.js} +15369 -10741
  3. package/dist/js/index-CDFsvu80.js.map +1 -0
  4. package/dist/js/index-DFdcksbe.js.map +1 -1
  5. package/dist/js/index-DXRIkWX1.js.map +1 -1
  6. package/dist/js/{index-6NJ3A1Dn.js → index-JffnTUrv.js} +15430 -10801
  7. package/dist/js/index-JffnTUrv.js.map +1 -0
  8. package/dist/utils/http/request.d.ts +280 -0
  9. package/package.json +14 -10
  10. package/src/components/basic/Button/Button.tsx +53 -13
  11. package/src/components/basic/Button/Button.types.ts +45 -9
  12. package/src/components/basic/Divider/Divider.tsx +60 -29
  13. package/src/components/basic/Icon/Icon.data.ts +474 -0
  14. package/src/components/basic/Icon/Icon.test.tsx +2 -2
  15. package/src/components/basic/Icon/Icon.tsx +48 -35
  16. package/src/components/basic/Icon/IconManager.ts +229 -0
  17. package/src/components/basic/Text/Text.styles.ts +3 -3
  18. package/src/components/basic/Text/Text.types.ts +14 -4
  19. package/src/components/basic/Typography/Typography.styles.ts +10 -9
  20. package/src/components/basic/Typography/Typography.tsx +15 -13
  21. package/src/components/basic/Typography/Typography.types.ts +41 -41
  22. package/src/components/basic/Typography/index.tsx +1 -1
  23. package/src/components/basic/Video/Video.styles.ts +777 -0
  24. package/src/components/basic/Video/Video.test.tsx +490 -0
  25. package/src/components/basic/Video/Video.tsx +1468 -0
  26. package/src/components/basic/Video/Video.types.ts +500 -0
  27. package/src/components/basic/Video/index.tsx +26 -0
  28. package/src/components/basic/index.tsx +13 -15
  29. package/src/components/common/ErrorBoundary.tsx +1 -1
  30. package/src/components/common/LazyComponent.tsx +9 -8
  31. package/src/components/common/SecurityProvider.tsx +2 -14
  32. package/src/components/common/ThemeProvider.tsx +43 -56
  33. package/src/components/common/VirtualList.tsx +187 -205
  34. package/src/components/common/index.tsx +25 -0
  35. package/src/components/display/Avatar/Avatar.styles.ts +1 -1
  36. package/src/components/display/Avatar/Avatar.tsx +6 -19
  37. package/src/components/display/Avatar/Avatar.types.ts +1 -1
  38. package/src/components/display/Avatar/index.ts +1 -1
  39. package/src/components/display/Badge/Badge.tsx +3 -16
  40. package/src/components/display/Badge/Badge.types.ts +1 -1
  41. package/src/components/display/Badge/index.ts +1 -1
  42. package/src/components/display/Calendar/Calendar.styles.ts +36 -36
  43. package/src/components/display/Calendar/Calendar.test.tsx +27 -15
  44. package/src/components/display/Calendar/Calendar.tsx +56 -35
  45. package/src/components/display/Calendar/Calendar.types.ts +1 -1
  46. package/src/components/display/Calendar/index.ts +1 -1
  47. package/src/components/display/Card/Card.styles.ts +2 -2
  48. package/src/components/display/Card/Card.test.tsx +6 -4
  49. package/src/components/display/Card/Card.tsx +1 -1
  50. package/src/components/display/Card/Card.types.ts +4 -4
  51. package/src/components/display/Card/index.ts +1 -1
  52. package/src/components/display/Carousel/Carousel.styles.ts +31 -31
  53. package/src/components/display/Carousel/Carousel.tsx +34 -39
  54. package/src/components/display/Carousel/Carousel.types.ts +1 -1
  55. package/src/components/display/Carousel/index.ts +1 -1
  56. package/src/components/display/List/List.styles.ts +3 -3
  57. package/src/components/display/List/List.tsx +0 -1
  58. package/src/components/display/List/index.ts +1 -1
  59. package/src/components/display/Rate/Rate.styles.ts +5 -17
  60. package/src/components/display/Rate/Rate.tsx +6 -14
  61. package/src/components/display/Rate/Rate.types.ts +4 -3
  62. package/src/components/display/Rate/index.ts +3 -11
  63. package/src/components/display/Table/Table.test.tsx +2 -0
  64. package/src/components/display/Table/Table.tsx +3 -7
  65. package/src/components/display/Table/Table.types.ts +3 -2
  66. package/src/components/display/Tag/Tag.styles.ts +31 -31
  67. package/src/components/display/Tag/Tag.tsx +9 -26
  68. package/src/components/display/Tag/Tag.types.ts +1 -1
  69. package/src/components/display/Tag/index.ts +1 -1
  70. package/src/components/display/Timeline/Timeline.styles.ts +32 -32
  71. package/src/components/display/Timeline/Timeline.tsx +23 -42
  72. package/src/components/display/Timeline/Timeline.types.ts +1 -1
  73. package/src/components/display/Timeline/index.ts +1 -1
  74. package/src/components/display/index.tsx +33 -29
  75. package/src/components/feedback/Loading/Loading.tsx +6 -1
  76. package/src/components/feedback/Loading/index.ts +2 -5
  77. package/src/components/feedback/Message/Message.styles.ts +3 -3
  78. package/src/components/feedback/Message/index.ts +2 -5
  79. package/src/components/feedback/Modal/Modal.styles.ts +1 -1
  80. package/src/components/feedback/Modal/Modal.tsx +9 -31
  81. package/src/components/feedback/Modal/Modal.types.ts +12 -2
  82. package/src/components/feedback/Notification/Notification.styles.ts +49 -39
  83. package/src/components/feedback/Notification/Notification.test.tsx +1 -1
  84. package/src/components/feedback/Notification/Notification.tsx +97 -120
  85. package/src/components/feedback/Notification/Notification.types.ts +11 -8
  86. package/src/components/feedback/Notification/NotificationManager.tsx +135 -106
  87. package/src/components/feedback/Notification/index.ts +10 -3
  88. package/src/components/feedback/Notification/index.tsx +16 -26
  89. package/src/components/feedback/Progress/Progress.styles.ts +23 -14
  90. package/src/components/feedback/Progress/Progress.tsx +93 -113
  91. package/src/components/feedback/Progress/Progress.types.ts +1 -1
  92. package/src/components/feedback/Progress/index.ts +1 -1
  93. package/src/components/feedback/Progress/utils/animation.ts +12 -23
  94. package/src/components/feedback/Progress/utils/index.ts +2 -2
  95. package/src/components/feedback/Progress/utils/progress-calculator.ts +14 -32
  96. package/src/components/feedback/Result/Result.styles.ts +29 -29
  97. package/src/components/feedback/Result/Result.tsx +8 -20
  98. package/src/components/feedback/Result/Result.types.ts +7 -7
  99. package/src/components/feedback/Result/index.tsx +1 -1
  100. package/src/components/feedback/Toast/Toast.styles.ts +1 -1
  101. package/src/components/feedback/Toast/Toast.tsx +25 -13
  102. package/src/components/feedback/Tooltip/Tooltip.examples.tsx +21 -44
  103. package/src/components/feedback/Tooltip/Tooltip.styles.ts +16 -22
  104. package/src/components/feedback/Tooltip/Tooltip.test.tsx +1 -1
  105. package/src/components/feedback/Tooltip/Tooltip.tsx +65 -46
  106. package/src/components/feedback/Tooltip/Tooltip.types.ts +14 -20
  107. package/src/components/feedback/Tooltip/index.ts +1 -1
  108. package/src/components/feedback/Tooltip/index.tsx +12 -24
  109. package/src/components/feedback/index.tsx +54 -42
  110. package/src/components/form/Cascader/Cascader.styles.ts +2 -2
  111. package/src/components/form/Cascader/Cascader.tsx +84 -88
  112. package/src/components/form/Cascader/Cascader.types.ts +49 -50
  113. package/src/components/form/Cascader/hooks/useCascaderFieldNames.ts +11 -8
  114. package/src/components/form/Cascader/hooks/useCascaderOptions.ts +73 -55
  115. package/src/components/form/Cascader/hooks/useCascaderState.ts +31 -25
  116. package/src/components/form/Cascader/index.ts +1 -1
  117. package/src/components/form/Cascader/utils/formatDisplayValue.ts +4 -4
  118. package/src/components/form/Checkbox/Checkbox.styles.ts +83 -84
  119. package/src/components/form/Checkbox/Checkbox.tsx +2 -9
  120. package/src/components/form/Checkbox/CheckboxGroup.tsx +7 -7
  121. package/src/components/form/DatePicker/DatePicker.test.tsx +1 -1
  122. package/src/components/form/DatePicker/DatePicker.tsx +91 -75
  123. package/src/components/form/DatePicker/DatePicker.types.ts +4 -1
  124. package/src/components/form/Form/Form.tsx +66 -504
  125. package/src/components/form/Form/Form.types.ts +16 -1
  126. package/src/components/form/Form/useFormLogic.ts +497 -0
  127. package/src/components/form/Input/Input.styles.ts +8 -1
  128. package/src/components/form/Input/Input.tsx +55 -291
  129. package/src/components/form/Input/Input.types.ts +13 -1
  130. package/src/components/form/Input/useInputLogic.test.ts +82 -0
  131. package/src/components/form/Input/useInputLogic.ts +260 -0
  132. package/src/components/form/InputNumber/InputNumber.styles.ts +76 -25
  133. package/src/components/form/InputNumber/InputNumber.tsx +53 -21
  134. package/src/components/form/InputNumber/InputNumber.types.ts +21 -3
  135. package/src/components/form/InputNumber/components/InputNumberClearButton.tsx +3 -11
  136. package/src/components/form/InputNumber/components/InputNumberControls.tsx +3 -12
  137. package/src/components/form/InputNumber/hooks/index.ts +1 -1
  138. package/src/components/form/InputNumber/hooks/useInputNumberState.ts +7 -9
  139. package/src/components/form/InputNumber/hooks/useInputNumberValidation.ts +18 -17
  140. package/src/components/form/InputNumber/index.ts +7 -7
  141. package/src/components/form/Radio/Radio.styles.ts +1 -8
  142. package/src/components/form/Radio/Radio.tsx +3 -9
  143. package/src/components/form/Radio/Radio.types.ts +5 -1
  144. package/src/components/form/Select/Select.styles.ts +5 -1
  145. package/src/components/form/Select/Select.tsx +15 -15
  146. package/src/components/form/Select/Select.types.ts +2 -1
  147. package/src/components/form/Slider/Slider.styles.ts +13 -13
  148. package/src/components/form/Slider/Slider.tsx +19 -33
  149. package/src/components/form/Slider/Slider.types.ts +14 -12
  150. package/src/components/form/Slider/index.tsx +2 -9
  151. package/src/components/form/Switch/Switch.styles.ts +1 -7
  152. package/src/components/form/Switch/Switch.tsx +7 -13
  153. package/src/components/form/Textarea/Textarea.styles.ts +4 -4
  154. package/src/components/form/Textarea/Textarea.tsx +7 -1
  155. package/src/components/form/Textarea/Textarea.types.ts +4 -1
  156. package/src/components/form/TimePicker/TimePicker.styles.ts +8 -12
  157. package/src/components/form/TimePicker/TimePicker.tsx +122 -100
  158. package/src/components/form/TimePicker/TimePicker.types.ts +2 -2
  159. package/src/components/form/TimePicker/index.ts +1 -1
  160. package/src/components/form/Transfer/Transfer.styles.ts +3 -15
  161. package/src/components/form/Transfer/Transfer.tsx +146 -134
  162. package/src/components/form/Transfer/Transfer.types.ts +34 -26
  163. package/src/components/form/Transfer/components/TransferItem.tsx +55 -62
  164. package/src/components/form/Transfer/components/TransferList.tsx +212 -199
  165. package/src/components/form/Transfer/components/TransferOperations.tsx +52 -55
  166. package/src/components/form/Transfer/components/TransferPagination.tsx +115 -111
  167. package/src/components/form/Transfer/components/TransferSearch.tsx +52 -55
  168. package/src/components/form/Transfer/hooks/useTransferData.ts +91 -81
  169. package/src/components/form/Transfer/hooks/useTransferState.ts +22 -16
  170. package/src/components/form/Transfer/index.ts +2 -8
  171. package/src/components/form/Upload/Upload.styles.ts +21 -21
  172. package/src/components/form/Upload/Upload.tsx +189 -142
  173. package/src/components/form/Upload/Upload.types.ts +31 -31
  174. package/src/components/form/Upload/index.tsx +1 -1
  175. package/src/components/form/index.tsx +60 -29
  176. package/src/components/index.tsx +0 -1
  177. package/src/components/layout/Affix/Affix.styles.ts +16 -11
  178. package/src/components/layout/Affix/Affix.tsx +67 -75
  179. package/src/components/layout/Affix/Affix.types.ts +18 -18
  180. package/src/components/layout/Affix/index.tsx +1 -1
  181. package/src/components/layout/Col/Col.styles.ts +17 -17
  182. package/src/components/layout/Col/Col.test.tsx +7 -5
  183. package/src/components/layout/Col/Col.tsx +3 -21
  184. package/src/components/layout/Col/Col.types.ts +1 -1
  185. package/src/components/layout/Container/Container.styles.ts +3 -1
  186. package/src/components/layout/Container/Container.tsx +2 -11
  187. package/src/components/layout/Grid/Grid.tsx +3 -53
  188. package/src/components/layout/Layout/Content.tsx +24 -32
  189. package/src/components/layout/Layout/Footer.tsx +24 -32
  190. package/src/components/layout/Layout/Header.tsx +24 -32
  191. package/src/components/layout/Layout/Layout.styles.ts +17 -17
  192. package/src/components/layout/Layout/Layout.tsx +14 -25
  193. package/src/components/layout/Layout/Layout.types.ts +29 -29
  194. package/src/components/layout/Layout/Sider.tsx +44 -56
  195. package/src/components/layout/Layout/index.tsx +16 -2
  196. package/src/components/layout/Row/Row.tsx +15 -43
  197. package/src/components/layout/Space/Space.tsx +3 -11
  198. package/src/components/layout/Space/Space.types.ts +1 -1
  199. package/src/components/layout/index.tsx +29 -19
  200. package/src/components/navigation/Menu/Menu.constants.ts +69 -0
  201. package/src/components/navigation/Menu/Menu.stories.tsx +107 -0
  202. package/src/components/navigation/Menu/Menu.styles.ts +25 -37
  203. package/src/components/navigation/Menu/Menu.tsx +8 -11
  204. package/src/components/navigation/Menu/Menu.types.ts +2 -2
  205. package/src/components/navigation/Menu/Menu.utils.ts +17 -17
  206. package/src/components/navigation/Menu/MenuItem.tsx +9 -11
  207. package/src/components/navigation/Menu/SubMenu.tsx +8 -6
  208. package/src/components/navigation/Menu/index.tsx +4 -69
  209. package/src/components/navigation/NavBar/NavBar.styles.ts +1 -1
  210. package/src/components/navigation/NavBar/NavBar.tsx +7 -10
  211. package/src/components/navigation/NavBar/NavBar.types.ts +3 -3
  212. package/src/components/navigation/NavBar/index.tsx +1 -1
  213. package/src/components/navigation/Pagination/Pagination.test.tsx +2 -3
  214. package/src/components/navigation/Pagination/Pagination.tsx +3 -3
  215. package/src/components/navigation/Pagination/Pagination.types.ts +3 -2
  216. package/src/components/navigation/Pagination/index.ts +9 -3
  217. package/src/components/navigation/Steps/Step.tsx +24 -44
  218. package/src/components/navigation/Steps/Steps.styles.ts +28 -13
  219. package/src/components/navigation/Steps/Steps.test.tsx +2 -0
  220. package/src/components/navigation/Steps/Steps.tsx +88 -89
  221. package/src/components/navigation/Steps/Steps.types.ts +30 -30
  222. package/src/components/navigation/Steps/index.tsx +1 -1
  223. package/src/components/navigation/Tabs/Tabs.test.tsx +3 -2
  224. package/src/components/navigation/Tabs/Tabs.types.ts +4 -3
  225. package/src/components/navigation/index.tsx +21 -16
  226. package/src/constants/index.ts +1 -1
  227. package/src/hooks/index.ts +52 -102
  228. package/src/hooks/types.ts +4 -5
  229. package/src/hooks/useAsync.ts +46 -47
  230. package/src/hooks/useClickOutside.ts +52 -0
  231. package/src/hooks/useCounter.ts +87 -0
  232. package/src/hooks/useDebounce.ts +150 -0
  233. package/src/hooks/useDeepCompareEffect.ts +88 -0
  234. package/src/hooks/useEventListener.ts +77 -0
  235. package/src/hooks/useMediaQuery.ts +75 -0
  236. package/src/hooks/useMutation.ts +233 -0
  237. package/src/hooks/usePerformance.ts +1 -64
  238. package/src/hooks/usePlatform.ts +3 -1
  239. package/src/hooks/usePrevious.ts +25 -0
  240. package/src/hooks/useRequest.ts +12 -7
  241. package/src/hooks/useStateManagement.ts +1 -1
  242. package/src/hooks/useStorage.ts +169 -0
  243. package/src/hooks/useStyle.ts +8 -2
  244. package/src/hooks/useToggle.ts +54 -0
  245. package/src/index.ts +34 -9
  246. package/src/theme/ThemeProvider.tsx +3 -7
  247. package/src/theme/ThemeProvider.types.ts +1 -1
  248. package/src/theme/defaults.ts +1 -1
  249. package/src/theme/design-system.ts +2 -2
  250. package/src/theme/design-tokens.ts +85 -99
  251. package/src/theme/generated/dark-theme.scss +1 -1
  252. package/src/theme/generated/tokens.scss +82 -18
  253. package/src/theme/index.ts +8 -29
  254. package/src/theme/responsive.tsx +36 -34
  255. package/src/theme/styles.ts +1 -1
  256. package/src/theme/useThemeUtils.ts +43 -43
  257. package/src/theme/utils.ts +32 -32
  258. package/src/theme/variables.ts +70 -51
  259. package/src/types/accessibility.ts +36 -37
  260. package/src/types/button.ts +25 -27
  261. package/src/types/component-props.ts +6 -1
  262. package/src/types/glob.d.ts +4 -0
  263. package/src/types/index.ts +2 -2
  264. package/src/types/standardized-components.ts +9 -3
  265. package/src/types/utils.ts +13 -23
  266. package/src/utils/__tests__/responsiveUtils.test.ts +5 -4
  267. package/src/utils/abort-controller.ts +48 -0
  268. package/src/utils/cache.ts +2 -6
  269. package/src/utils/createNamespace.ts +4 -4
  270. package/src/utils/environment.ts +26 -6
  271. package/src/utils/error-handler.ts +2 -2
  272. package/src/utils/errorLogger.ts +16 -20
  273. package/src/utils/formatUtils.ts +38 -70
  274. package/src/utils/http/error-codes.ts +314 -0
  275. package/src/utils/http/http-client.test.ts +63 -0
  276. package/src/utils/{network → http}/http-client.ts +45 -35
  277. package/src/utils/http/request-cache.ts +127 -0
  278. package/src/utils/http/request.ts +954 -0
  279. package/src/utils/http/taro-adapter.test.ts +74 -0
  280. package/src/utils/http/taro-adapter.ts +24 -0
  281. package/src/utils/http/types.ts +414 -0
  282. package/src/utils/http/web-adapter.ts +33 -0
  283. package/src/utils/index.ts +5 -8
  284. package/src/utils/inputValidator.ts +17 -14
  285. package/src/utils/performance/performance.ts +60 -71
  286. package/src/utils/responsiveUtils.ts +7 -16
  287. package/src/utils/rtl-support.ts +29 -19
  288. package/src/utils/security/api-security.ts +47 -39
  289. package/src/utils/securityHeaders.ts +61 -67
  290. package/src/utils/typeHelpers.ts +10 -10
  291. package/src/utils/types/dataProcessing.ts +93 -92
  292. package/src/utils/types/typeHelpers.ts +31 -21
  293. package/src/utils/xssProtection.ts +96 -48
  294. package/dist/js/index-6NJ3A1Dn.js.map +0 -1
  295. package/dist/js/index-DffLRSro.js.map +0 -1
  296. package/src/components/form/Input/Input.enhanced.tsx +0 -732
  297. package/src/components/navigation/Menu/__tests__/Menu.test.tsx +0 -687
  298. package/src/components/navigation/Tree/Tree.styles.ts +0 -553
  299. package/src/components/navigation/Tree/Tree.test.basic.tsx +0 -7
  300. package/src/components/navigation/Tree/Tree.test.functional.tsx +0 -496
  301. package/src/components/navigation/Tree/Tree.test.import.check.tsx +0 -6
  302. package/src/components/navigation/Tree/Tree.test.import.tsx +0 -6
  303. package/src/components/navigation/Tree/Tree.test.minimal.tsx +0 -5
  304. package/src/components/navigation/Tree/Tree.test.simple.tsx +0 -30
  305. package/src/components/navigation/Tree/Tree.test.tsx +0 -908
  306. package/src/components/navigation/Tree/Tree.test.working.tsx +0 -673
  307. package/src/components/navigation/Tree/Tree.tsx +0 -600
  308. package/src/components/navigation/Tree/Tree.types.ts +0 -909
  309. package/src/components/navigation/Tree/Tree.utils.ts +0 -452
  310. package/src/components/navigation/Tree/index.ts +0 -33
  311. package/src/components/navigation/Tree/index.tsx +0 -23
  312. package/src/utils/network/http-client.test.ts +0 -18
@@ -5,18 +5,7 @@ import type { RowProps, RowRef, RowAlign, RowJustify, RowGutter } from './Row.ty
5
5
 
6
6
  /** Row组件 */
7
7
  export const RowComponent = forwardRef<RowRef, RowProps>((props, ref) => {
8
- const {
9
- children,
10
- gutter = 0,
11
- align = 'top',
12
- justify = 'start',
13
- wrap = true,
14
- className,
15
- style,
16
- onClick,
17
- responsive,
18
- ...restProps
19
- } = props;
8
+ const { children, gutter = 0, align = 'top', justify = 'start', wrap = true, className, style, onClick } = props;
20
9
 
21
10
  const rowRef = useRef<any>(null);
22
11
  const [internalAlign, setInternalAlign] = useState<RowAlign>(align);
@@ -43,31 +32,12 @@ export const RowComponent = forwardRef<RowRef, RowProps>((props, ref) => {
43
32
 
44
33
  // 处理点击事件
45
34
  const handleClick = useCallback(
46
- (event: React.MouseEvent) => {
35
+ (event: any) => {
47
36
  onClick?.(event);
48
37
  },
49
38
  [onClick],
50
39
  );
51
40
 
52
- // 渲染子元素
53
- const renderChildren = () => {
54
- if (!children) return null;
55
-
56
- const childrenArray = React.Children.toArray(children);
57
-
58
- return childrenArray.map((child, index) => {
59
- // 为每个Col组件传递gutter属性
60
- if (React.isValidElement(child) && (child.type as any)?.displayName === 'Col') {
61
- return React.cloneElement(child, {
62
- key: index,
63
- gutter: internalGutter,
64
- } as any);
65
- }
66
-
67
- return child;
68
- });
69
- };
70
-
71
41
  // 计算样式
72
42
  const rowStyle = rowStyles['getBaseStyle']({
73
43
  gutter: internalGutter,
@@ -77,9 +47,6 @@ export const RowComponent = forwardRef<RowRef, RowProps>((props, ref) => {
77
47
  style: style || {},
78
48
  });
79
49
 
80
- // 计算响应式样式
81
- const responsiveStyle = responsive ? rowStyles['getResponsiveStyle'](responsive) : {};
82
-
83
50
  // 计算类名
84
51
  const rowClassName = rowStyles['getClassName']({
85
52
  align: internalAlign,
@@ -119,15 +86,20 @@ export const RowComponent = forwardRef<RowRef, RowProps>((props, ref) => {
119
86
  [internalAlign, internalJustify, internalGutter],
120
87
  );
121
88
 
89
+ // 渲染子元素,为每个Col组件传递gutter属性
90
+ const renderedChildren = React.Children.map(children, (child, index) => {
91
+ if (React.isValidElement(child) && (child.type as any)?.displayName === 'Col') {
92
+ return React.cloneElement(child, {
93
+ key: index,
94
+ gutter: internalGutter,
95
+ } as any);
96
+ }
97
+ return child;
98
+ });
99
+
122
100
  return (
123
- <View
124
- ref={rowRef}
125
- className={rowClassName}
126
- style={{ ...rowStyle, ...responsiveStyle }}
127
- onClick={handleClick}
128
- {...restProps}
129
- >
130
- {renderChildren()}
101
+ <View ref={rowRef} className={rowClassName} style={{ ...rowStyle, ...style }} onClick={handleClick}>
102
+ {renderedChildren}
131
103
  </View>
132
104
  );
133
105
  });
@@ -22,10 +22,8 @@ export const SpaceComponent = forwardRef<SpaceRef, SpaceProps>((props, ref) => {
22
22
  className,
23
23
  style,
24
24
  onClick,
25
- onItemHover,
26
25
  onItemClick,
27
26
  responsive,
28
- ...restProps
29
27
  } = props;
30
28
 
31
29
  const spaceRef = useRef<any>(null);
@@ -65,7 +63,7 @@ export const SpaceComponent = forwardRef<SpaceRef, SpaceProps>((props, ref) => {
65
63
 
66
64
  // 处理点击事件
67
65
  const handleClick = useCallback(
68
- (event: React.MouseEvent) => {
66
+ (event: any) => {
69
67
  onClick?.(event);
70
68
  },
71
69
  [onClick],
@@ -80,7 +78,7 @@ export const SpaceComponent = forwardRef<SpaceRef, SpaceProps>((props, ref) => {
80
78
  );
81
79
 
82
80
  // 处理子元素悬停事件
83
-
81
+
84
82
  // 渲染子元素
85
83
  const renderChildren = () => {
86
84
  if (!children) return null;
@@ -191,13 +189,7 @@ export const SpaceComponent = forwardRef<SpaceRef, SpaceProps>((props, ref) => {
191
189
  );
192
190
 
193
191
  return (
194
- <View
195
- ref={spaceRef}
196
- className={spaceClassName}
197
- style={{ ...spaceStyle, ...responsiveStyle }}
198
- onClick={handleClick}
199
- {...restProps}
200
- >
192
+ <View ref={spaceRef} className={spaceClassName} style={{ ...spaceStyle, ...responsiveStyle }} onClick={handleClick}>
201
193
  {renderChildren()}
202
194
  {renderEllipsis()}
203
195
  </View>
@@ -77,7 +77,7 @@ export interface SpaceProps extends BaseComponentProps {
77
77
  /** 点击事件 */
78
78
  onClick?: (_event: React.MouseEvent) => void;
79
79
  /** 子元素点击事件 */
80
- onItemHover?: (_index: number, event: React.MouseEvent) => void;
80
+ _onItemHover?: (_index: number, event: React.MouseEvent) => void;
81
81
  /** 子元素点击事件 */
82
82
  onItemClick?: (_index: number, event: ITouchEvent) => void;
83
83
  /** 响应式断点 */
@@ -1,21 +1,20 @@
1
- // 导出布局组件
2
- export * from './Grid';
3
- export * from './Layout';
4
- export * from './Space';
5
- export * from './Affix';
6
- export * from './Row';
7
- export * from './Col';
8
- export * from './Container';
1
+ /**
2
+ * Taro-Uno 布局组件库
3
+ * 提供用于页面布局的 UI 组件,包括网格、行列、容器、间距等
4
+ */
9
5
 
10
- // 导出类型
6
+ // 导出 Grid 组件
7
+ export { Grid } from './Grid';
11
8
  export type { GridProps, GridRef, GridAlign, GridJustify, GridGap, GridCols } from './Grid/Grid.types';
9
+ export { gridStyles } from './Grid/Grid.styles';
12
10
 
13
- export type { ContainerProps, ContainerRef, ContainerSize, ContainerAlign } from './Container/Container.types';
14
-
15
- export type { RowProps, RowRef, RowAlign, RowJustify, RowGutter } from './Row/Row.types';
16
-
17
- export type { ColProps, ColRef, ColSpan, ColOffset, ColOrder } from './Col/Col.types';
11
+ // 导出 Layout 组件
12
+ export { Layout } from './Layout';
13
+ export type { LayoutProps, LayoutRef } from './Layout/Layout.types';
14
+ export { layoutStyles } from './Layout/Layout.styles';
18
15
 
16
+ // 导出 Space 组件
17
+ export { Space } from './Space';
19
18
  export type {
20
19
  SpaceProps,
21
20
  SpaceRef,
@@ -26,16 +25,27 @@ export type {
26
25
  SpaceGap,
27
26
  SpaceSeparator,
28
27
  } from './Space/Space.types';
28
+ export { spaceStyles } from './Space/Space.styles';
29
29
 
30
+ // 导出 Affix 组件
31
+ export { Affix } from './Affix';
30
32
  export type { AffixProps, AffixRef, AffixOffset, AffixTarget } from './Affix/Affix.types';
33
+ export { affixStyles } from './Affix/Affix.styles';
31
34
 
32
- // 导出样式
33
- export { gridStyles } from './Grid/Grid.styles';
34
- export { containerStyles } from './Container/Container.styles';
35
+ // 导出 Row 组件
36
+ export { Row } from './Row';
37
+ export type { RowProps, RowRef, RowAlign, RowJustify, RowGutter } from './Row/Row.types';
35
38
  export { rowStyles } from './Row/Row.styles';
39
+
40
+ // 导出 Col 组件
41
+ export { Col } from './Col';
42
+ export type { ColProps, ColRef, ColSpan, ColOffset, ColOrder } from './Col/Col.types';
36
43
  export { colStyles } from './Col/Col.styles';
37
- export { spaceStyles } from './Space/Space.styles';
38
- export { affixStyles } from './Affix/Affix.styles';
44
+
45
+ // 导出 Container 组件
46
+ export { Container } from './Container';
47
+ export type { ContainerProps, ContainerRef, ContainerSize, ContainerAlign } from './Container/Container.types';
48
+ export { containerStyles } from './Container/Container.styles';
39
49
 
40
50
  // 布局组件工具函数
41
51
  export const LayoutUtils = {
@@ -0,0 +1,69 @@
1
+ import { MenuUtils } from './Menu.utils';
2
+ import type { MenuItem } from './Menu.types';
3
+
4
+ // 菜单组件版本
5
+ export const MENU_VERSION = '1.0.0';
6
+
7
+ // 菜单组件配置
8
+ export const MENU_CONFIG = {
9
+ version: MENU_VERSION,
10
+ platform: 'taro',
11
+ features: {
12
+ multiple: true,
13
+ accordion: true,
14
+ collapsible: true,
15
+ contextMenu: true,
16
+ accessibility: true,
17
+ theme: true,
18
+ responsive: true,
19
+ typescript: true,
20
+ },
21
+ };
22
+
23
+ // 菜单组件工具函数
24
+ export const MenuLibraryUtils = {
25
+ /**
26
+ * 获取菜单组件版本
27
+ */
28
+ getVersion: (): string => MENU_VERSION,
29
+
30
+ /**
31
+ * 获取菜单组件配置
32
+ */
33
+ getConfig: () => MENU_CONFIG,
34
+
35
+ /**
36
+ * 格式化菜单数据
37
+ */
38
+ formatMenuData: (data: any[]) => {
39
+ return MenuUtils.formatMenuData(data);
40
+ },
41
+
42
+ /**
43
+ * 查找菜单项
44
+ */
45
+ findMenuItem: (items: MenuItem[], key: string) => {
46
+ return MenuUtils.findItem(items, key);
47
+ },
48
+
49
+ /**
50
+ * 获取菜单项路径
51
+ */
52
+ getMenuItemPath: (items: MenuItem[], key: string) => {
53
+ return MenuUtils.getItemPath(items, key);
54
+ },
55
+
56
+ /**
57
+ * 展开菜单项的所有父级
58
+ */
59
+ expandParentKeys: (items: MenuItem[], key: string) => {
60
+ return MenuUtils.expandParents(items, key);
61
+ },
62
+
63
+ /**
64
+ * 验证菜单项
65
+ */
66
+ validateMenuItem: (item: MenuItem) => {
67
+ return MenuUtils.validateItem(item);
68
+ },
69
+ };
@@ -0,0 +1,107 @@
1
+ import { Menu } from './Menu';
2
+
3
+ export default {
4
+ title: 'Navigation/Menu',
5
+ component: Menu,
6
+ parameters: {
7
+ docs: {
8
+ description: {
9
+ component: 'Menu 组件是一个功能强大的导航菜单组件,支持多种模式、主题和交互功能。',
10
+ },
11
+ },
12
+ },
13
+ argTypes: {
14
+ mode: {
15
+ control: 'select',
16
+ options: ['vertical', 'horizontal', 'inline'],
17
+ },
18
+ theme: {
19
+ control: 'select',
20
+ options: ['light', 'dark'],
21
+ },
22
+ size: {
23
+ control: 'select',
24
+ options: ['small', 'medium', 'large'],
25
+ },
26
+ trigger: {
27
+ control: 'select',
28
+ options: ['hover', 'click'],
29
+ },
30
+ accordion: {
31
+ control: 'boolean',
32
+ },
33
+ collapsible: {
34
+ control: 'boolean',
35
+ },
36
+ collapsed: {
37
+ control: 'boolean',
38
+ },
39
+ },
40
+ };
41
+
42
+ const menuItems = [
43
+ { key: '1', title: '首页', icon: 'home', path: '/home' },
44
+ {
45
+ key: '2',
46
+ title: '产品',
47
+ icon: 'product',
48
+ children: [
49
+ { key: '2-1', title: '产品列表', path: '/products/list' },
50
+ { key: '2-2', title: '产品详情', path: '/products/detail' },
51
+ { key: '2-3', title: '新增产品', path: '/products/add' },
52
+ ],
53
+ },
54
+ {
55
+ key: '3',
56
+ title: '服务',
57
+ icon: 'service',
58
+ children: [
59
+ { key: '3-1', title: '服务1', path: '/services/1' },
60
+ { key: '3-2', title: '服务2', path: '/services/2' },
61
+ ],
62
+ },
63
+ { key: '4', title: '关于我们', icon: 'about', path: '/about' },
64
+ ];
65
+
66
+ export const Basic = {
67
+ args: {
68
+ items: menuItems,
69
+ defaultActiveKey: '1',
70
+ defaultOpenKeys: ['2'],
71
+ },
72
+ };
73
+
74
+ export const Horizontal = {
75
+ args: {
76
+ items: menuItems,
77
+ mode: 'horizontal',
78
+ defaultActiveKey: '1',
79
+ },
80
+ };
81
+
82
+ export const DarkTheme = {
83
+ args: {
84
+ items: menuItems,
85
+ theme: 'dark',
86
+ defaultActiveKey: '1',
87
+ defaultOpenKeys: ['2'],
88
+ },
89
+ };
90
+
91
+ export const Collapsible = {
92
+ args: {
93
+ items: menuItems,
94
+ collapsible: true,
95
+ defaultActiveKey: '1',
96
+ defaultOpenKeys: ['2'],
97
+ },
98
+ };
99
+
100
+ export const Accordion = {
101
+ args: {
102
+ items: menuItems,
103
+ accordion: true,
104
+ defaultActiveKey: '1',
105
+ defaultOpenKeys: ['2'],
106
+ },
107
+ };
@@ -1,7 +1,5 @@
1
1
  import type { CSSProperties } from 'react';
2
- import type {
3
- MenuItemStyles
4
- } from './Menu.types';
2
+ import type { MenuItemStyles } from './Menu.types';
5
3
 
6
4
  /** Menu组件样式配置接口 */
7
5
  interface MenuStyleConfig {
@@ -131,10 +129,7 @@ interface MenuStyleFunctions {
131
129
  danger?: boolean;
132
130
  }) => CSSProperties;
133
131
  /** 获取徽章样式 */
134
- getBadgeStyle: (props: {
135
- size?: 'small' | 'medium' | 'large';
136
- theme?: 'light' | 'dark';
137
- }) => CSSProperties;
132
+ getBadgeStyle: (props: { size?: 'small' | 'medium' | 'large'; theme?: 'light' | 'dark' }) => CSSProperties;
138
133
  /** 获取折叠按钮样式 */
139
134
  getCollapseButtonStyle: (props: {
140
135
  size?: 'small' | 'medium' | 'large';
@@ -507,23 +502,25 @@ export const menuStyles: MenuStyleConfig & MenuStyleFunctions = {
507
502
  responsive: {},
508
503
  },
509
504
  };
510
-
511
- return modeStyles[mode] || {
512
- container: {},
513
- item: {},
514
- selected: {},
515
- disabled: {},
516
- hover: {},
517
- danger: {},
518
- subMenu: {},
519
- groupTitle: {},
520
- icon: {},
521
- label: {},
522
- extra: {},
523
- badge: {},
524
- collapseButton: {},
525
- responsive: {},
526
- };
505
+
506
+ return (
507
+ modeStyles[mode] || {
508
+ container: {},
509
+ item: {},
510
+ selected: {},
511
+ disabled: {},
512
+ hover: {},
513
+ danger: {},
514
+ subMenu: {},
515
+ groupTitle: {},
516
+ icon: {},
517
+ label: {},
518
+ extra: {},
519
+ badge: {},
520
+ collapseButton: {},
521
+ responsive: {},
522
+ }
523
+ );
527
524
  },
528
525
 
529
526
  // 获取菜单项样式
@@ -632,7 +629,7 @@ export const menuStyles: MenuStyleConfig & MenuStyleFunctions = {
632
629
  } = props;
633
630
 
634
631
  // const themeStyles = menuStyles.getThemeStyles(theme); // Commented out - unused
635
-
632
+
636
633
  let style: CSSProperties = {
637
634
  ...menuStyles['subMenu'],
638
635
  };
@@ -670,13 +667,7 @@ export const menuStyles: MenuStyleConfig & MenuStyleFunctions = {
670
667
  collapsed?: boolean;
671
668
  style?: CSSProperties;
672
669
  }): CSSProperties => {
673
- const {
674
- mode = 'vertical',
675
- theme = 'light',
676
- size = 'medium',
677
- collapsed = false,
678
- style = {},
679
- } = props;
670
+ const { mode = 'vertical', theme = 'light', size = 'medium', collapsed = false, style = {} } = props;
680
671
 
681
672
  const sizeStyles = menuStyles.getSizeStyles(size);
682
673
  const themeStyles = menuStyles.getThemeStyles(theme);
@@ -749,10 +740,7 @@ export const menuStyles: MenuStyleConfig & MenuStyleFunctions = {
749
740
  },
750
741
 
751
742
  // 获取徽章样式
752
- getBadgeStyle: (props: {
753
- size?: 'small' | 'medium' | 'large';
754
- theme?: 'light' | 'dark';
755
- }): CSSProperties => {
743
+ getBadgeStyle: (props: { size?: 'small' | 'medium' | 'large'; theme?: 'light' | 'dark' }): CSSProperties => {
756
744
  const { size = 'medium' } = props;
757
745
  const sizeStyles = menuStyles.getSizeStyles(size);
758
746
 
@@ -776,4 +764,4 @@ export const menuStyles: MenuStyleConfig & MenuStyleFunctions = {
776
764
  ...sizeStyles['collapseButton'],
777
765
  };
778
766
  },
779
- };
767
+ };
@@ -28,7 +28,7 @@ export const MenuComponent = forwardRef<MenuRef, MenuProps>((props, ref) => {
28
28
  inlineIndent = 24,
29
29
  collapsible = false,
30
30
  collapsed: controlledCollapsed = false,
31
- collapsedIcon,
31
+ _collapsedIcon,
32
32
  expandIcon,
33
33
  contextMenu = false,
34
34
  onClick,
@@ -238,17 +238,14 @@ export const MenuComponent = forwardRef<MenuRef, MenuProps>((props, ref) => {
238
238
  onCollapse?.(newCollapsed);
239
239
  },
240
240
  getItem: (key: string) => MenuUtils.findItem(items, key),
241
- addItem: (item: MenuItem, parentKey?: string) => {
241
+ addItem: (_item: MenuItem, _parentKey?: string) => {
242
242
  // 静态方法,暂不实现
243
- console.log('Add item:', item, 'to parent:', parentKey);
244
243
  },
245
- removeItem: (key: string) => {
244
+ removeItem: (_key: string) => {
246
245
  // 静态方法,暂不实现
247
- console.log('Remove item:', key);
248
246
  },
249
- updateItem: (key: string, newItem: Partial<MenuItem>) => {
247
+ updateItem: (_key: string, _newItem: Partial<MenuItem>) => {
250
248
  // 静态方法,暂不实现
251
- console.log('Update item:', key, newItem);
252
249
  },
253
250
  expandAll: () => {
254
251
  const allKeys = MenuUtils.flattenItems(items)
@@ -306,12 +303,12 @@ export const MenuComponent = forwardRef<MenuRef, MenuProps>((props, ref) => {
306
303
  `taro-uno-h5-menu--${size}`,
307
304
  collapsed ? 'taro-uno-h5-menu--collapsed' : '',
308
305
  className,
309
- ].filter(Boolean).join(' ');
306
+ ]
307
+ .filter(Boolean)
308
+ .join(' ');
310
309
 
311
310
  // 处理无障碍状态序列化
312
- const serializedAccessibilityState = finalAccessibilityState
313
- ? JSON.stringify(finalAccessibilityState)
314
- : undefined;
311
+ const serializedAccessibilityState = finalAccessibilityState ? JSON.stringify(finalAccessibilityState) : undefined;
315
312
 
316
313
  return (
317
314
  <View
@@ -80,7 +80,7 @@ export interface MenuProps {
80
80
  /** 是否折叠 */
81
81
  collapsed?: boolean;
82
82
  /** 折叠图标 */
83
- collapsedIcon?: ReactNode;
83
+ _collapsedIcon?: ReactNode;
84
84
  /** 展开图标 */
85
85
  expandIcon?: ReactNode | ((_props: { isOpen: boolean; isSubMenu: boolean }) => ReactNode);
86
86
  /** 是否显示右键菜单 */
@@ -228,4 +228,4 @@ export type MenuSizeStyles = Record<MenuSize, Partial<MenuItemStyles>>;
228
228
  export type MenuThemeStyles = Record<MenuTheme, Partial<MenuItemStyles>>;
229
229
 
230
230
  /** 菜单模式样式映射 */
231
- export type MenuModeStyles = Record<MenuMode, Partial<MenuItemStyles>>;
231
+ export type MenuModeStyles = Record<MenuMode, Partial<MenuItemStyles>>;
@@ -28,7 +28,7 @@ export class MenuUtils {
28
28
  static findParentItem(items: MenuItem[], key: string): MenuItem | null {
29
29
  for (const item of items) {
30
30
  if (item.children) {
31
- if (item.children.some(child => child.key === key)) {
31
+ if (item.children.some((child) => child.key === key)) {
32
32
  return item;
33
33
  }
34
34
  const found = this.findParentItem(item.children, key);
@@ -45,16 +45,16 @@ export class MenuUtils {
45
45
  */
46
46
  static getItemPath(items: MenuItem[], key: string): MenuItem[] {
47
47
  const path: MenuItem[] = [];
48
-
48
+
49
49
  const findPath = (currentItems: MenuItem[], targetKey: string, currentPath: MenuItem[]): boolean => {
50
50
  for (const item of currentItems) {
51
51
  const newPath = [...currentPath, item];
52
-
52
+
53
53
  if (item.key === targetKey) {
54
54
  path.push(...newPath);
55
55
  return true;
56
56
  }
57
-
57
+
58
58
  if (item.children) {
59
59
  if (findPath(item.children, targetKey, newPath)) {
60
60
  return true;
@@ -63,7 +63,7 @@ export class MenuUtils {
63
63
  }
64
64
  return false;
65
65
  };
66
-
66
+
67
67
  findPath(items, key, []);
68
68
  return path;
69
69
  }
@@ -73,7 +73,7 @@ export class MenuUtils {
73
73
  */
74
74
  static expandParents(items: MenuItem[], key: string): string[] {
75
75
  const path = this.getItemPath(items, key);
76
- return path.slice(0, -1).map(item => item.key);
76
+ return path.slice(0, -1).map((item) => item.key);
77
77
  }
78
78
 
79
79
  /**
@@ -81,16 +81,16 @@ export class MenuUtils {
81
81
  */
82
82
  static flattenItems(items: MenuItem[], parentKey?: string): MenuItem[] {
83
83
  const result: MenuItem[] = [];
84
-
85
- items.forEach(item => {
84
+
85
+ items.forEach((item) => {
86
86
  const flatItem = { ...item, parentKey };
87
87
  result.push(flatItem);
88
-
88
+
89
89
  if (item.children) {
90
90
  result.push(...this.flattenItems(item.children, item.key));
91
91
  }
92
92
  });
93
-
93
+
94
94
  return result;
95
95
  }
96
96
 
@@ -98,14 +98,14 @@ export class MenuUtils {
98
98
  * 过滤菜单项
99
99
  */
100
100
  static filterItems(items: MenuItem[], keyword: string): MenuItem[] {
101
- return items.filter(item => {
101
+ return items.filter((item) => {
102
102
  const label = String(item.label).toLowerCase();
103
103
  const search = keyword.toLowerCase();
104
-
104
+
105
105
  if (label.includes(search)) {
106
106
  return true;
107
107
  }
108
-
108
+
109
109
  if (item.children) {
110
110
  const filteredChildren = this.filterItems(item.children, keyword);
111
111
  if (filteredChildren.length > 0) {
@@ -113,7 +113,7 @@ export class MenuUtils {
113
113
  return true;
114
114
  }
115
115
  }
116
-
116
+
117
117
  return false;
118
118
  });
119
119
  }
@@ -147,7 +147,7 @@ export class MenuUtils {
147
147
  * 格式化菜单数据
148
148
  */
149
149
  static formatMenuData(data: any[]): MenuItem[] {
150
- return data.map(item => ({
150
+ return data.map((item) => ({
151
151
  key: item.key || item.id,
152
152
  label: item.label || item.name || item.title,
153
153
  icon: item.icon,
@@ -169,7 +169,7 @@ export class MenuUtils {
169
169
  static handleItemClick(
170
170
  item: MenuItem,
171
171
  event: any,
172
- onClick?: (key: string, item: MenuItem, event: any) => void
172
+ onClick?: (key: string, item: MenuItem, event: any) => void,
173
173
  ): void {
174
174
  onClick?.(item.key, item, event);
175
175
  }
@@ -184,4 +184,4 @@ export class MenuUtils {
184
184
  console.log('Navigate to:', item.href, 'target:', item.target);
185
185
  }
186
186
  }
187
- }
187
+ }