@aloudata/aloudata-design 0.1.0-beta1

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 (293) hide show
  1. package/.editorconfig +16 -0
  2. package/.eslintrc.js +43 -0
  3. package/.fatherrc.ts +16 -0
  4. package/.prettierignore +7 -0
  5. package/.prettierrc.js +1 -0
  6. package/.stylelintrc.json +36 -0
  7. package/.umirc.ts +15 -0
  8. package/README.md +82 -0
  9. package/commitlint.config.js +21 -0
  10. package/docs/index.md +21 -0
  11. package/jest/setupTests.js +1 -0
  12. package/lib/Button/demo/Icon/index.d.ts +3 -0
  13. package/lib/Button/demo/Icon/index.js +82 -0
  14. package/lib/Button/demo/Icon/index.less +6 -0
  15. package/lib/Button/demo/basic/index.d.ts +4 -0
  16. package/lib/Button/demo/basic/index.js +73 -0
  17. package/lib/Button/demo/basic/index.less +7 -0
  18. package/lib/Button/demo/disable/index.d.ts +3 -0
  19. package/lib/Button/demo/disable/index.js +37 -0
  20. package/lib/Button/demo/disable/index.less +0 -0
  21. package/lib/Button/demo/href/index.d.ts +2 -0
  22. package/lib/Button/demo/href/index.js +30 -0
  23. package/lib/Button/demo/loading/index.d.ts +3 -0
  24. package/lib/Button/demo/loading/index.js +51 -0
  25. package/lib/Button/demo/loading/index.less +6 -0
  26. package/lib/Button/index.d.ts +50 -0
  27. package/lib/Button/index.js +124 -0
  28. package/lib/Button/style/index.d.ts +2 -0
  29. package/lib/Button/style/index.js +5 -0
  30. package/lib/Button/style/index.less +255 -0
  31. package/lib/Dropdown/Button.d.ts +69 -0
  32. package/lib/Dropdown/Button.js +52 -0
  33. package/lib/Dropdown/demo/basic/index.d.ts +4 -0
  34. package/lib/Dropdown/demo/basic/index.js +35 -0
  35. package/lib/Dropdown/demo/button/index.d.ts +3 -0
  36. package/lib/Dropdown/demo/button/index.js +182 -0
  37. package/lib/Dropdown/demo/button/index.less +9 -0
  38. package/lib/Dropdown/demo/placement/index.d.ts +2 -0
  39. package/lib/Dropdown/demo/placement/index.js +56 -0
  40. package/lib/Dropdown/demo/subMenu/index.d.ts +2 -0
  41. package/lib/Dropdown/demo/subMenu/index.js +59 -0
  42. package/lib/Dropdown/demo/trigger/index.d.ts +2 -0
  43. package/lib/Dropdown/demo/trigger/index.js +32 -0
  44. package/lib/Dropdown/index.d.ts +59 -0
  45. package/lib/Dropdown/index.js +47 -0
  46. package/lib/Dropdown/style/index.d.ts +2 -0
  47. package/lib/Dropdown/style/index.js +5 -0
  48. package/lib/Dropdown/style/index.less +40 -0
  49. package/lib/Icon/iconfont/demo.css +539 -0
  50. package/lib/Icon/iconfont/demo_index.html +628 -0
  51. package/lib/Icon/iconfont/iconfont.css +93 -0
  52. package/lib/Icon/iconfont/iconfont.js +48 -0
  53. package/lib/Icon/iconfont/iconfont.json +142 -0
  54. package/lib/Icon/iconfont/iconfont.ttf +0 -0
  55. package/lib/Icon/iconfont/iconfont.woff +0 -0
  56. package/lib/Icon/iconfont/iconfont.woff2 +0 -0
  57. package/lib/Icon/index.d.ts +11 -0
  58. package/lib/Icon/index.js +54 -0
  59. package/lib/Icon/index.less +32 -0
  60. package/lib/Input/components/Group/index.d.ts +15 -0
  61. package/lib/Input/components/Group/index.js +24 -0
  62. package/lib/Input/components/Password/index.d.ts +10 -0
  63. package/lib/Input/components/Password/index.js +33 -0
  64. package/lib/Input/components/TextArea/index.d.ts +52 -0
  65. package/lib/Input/components/TextArea/index.js +26 -0
  66. package/lib/Input/demo/allowClear/index.d.ts +3 -0
  67. package/lib/Input/demo/allowClear/index.js +25 -0
  68. package/lib/Input/demo/allowClear/index.less +0 -0
  69. package/lib/Input/demo/basic/index.d.ts +4 -0
  70. package/lib/Input/demo/basic/index.js +80 -0
  71. package/lib/Input/demo/basic/index.less +6 -0
  72. package/lib/Input/demo/gourp/index.d.ts +2 -0
  73. package/lib/Input/demo/gourp/index.js +81 -0
  74. package/lib/Input/demo/password/index.d.ts +3 -0
  75. package/lib/Input/demo/password/index.js +35 -0
  76. package/lib/Input/demo/password/index.less +0 -0
  77. package/lib/Input/demo/prefix/index.d.ts +3 -0
  78. package/lib/Input/demo/prefix/index.js +32 -0
  79. package/lib/Input/demo/prefix/index.less +0 -0
  80. package/lib/Input/demo/showCount/index.d.ts +3 -0
  81. package/lib/Input/demo/showCount/index.js +31 -0
  82. package/lib/Input/demo/showCount/index.less +0 -0
  83. package/lib/Input/demo/textArea/autoSize.d.ts +2 -0
  84. package/lib/Input/demo/textArea/autoSize.js +63 -0
  85. package/lib/Input/index.d.ts +65 -0
  86. package/lib/Input/index.js +63 -0
  87. package/lib/Input/style/index.d.ts +2 -0
  88. package/lib/Input/style/index.js +5 -0
  89. package/lib/Input/style/index.less +62 -0
  90. package/lib/Menu/Divider.d.ts +5 -0
  91. package/lib/Menu/Divider.js +28 -0
  92. package/lib/Menu/MenuItem.d.ts +17 -0
  93. package/lib/Menu/MenuItem.js +28 -0
  94. package/lib/Menu/SubMenu.d.ts +26 -0
  95. package/lib/Menu/SubMenu.js +44 -0
  96. package/lib/Menu/index.d.ts +20 -0
  97. package/lib/Menu/index.js +49 -0
  98. package/lib/Menu/style/index.d.ts +2 -0
  99. package/lib/Menu/style/index.js +5 -0
  100. package/lib/Menu/style/index.less +33 -0
  101. package/lib/Select/BaseSelect.d.ts +5 -0
  102. package/lib/Select/BaseSelect.js +433 -0
  103. package/lib/Select/OptionsList/OptGroup.d.ts +7 -0
  104. package/lib/Select/OptionsList/OptGroup.js +14 -0
  105. package/lib/Select/OptionsList/OptionItem.d.ts +35 -0
  106. package/lib/Select/OptionsList/OptionItem.js +185 -0
  107. package/lib/Select/OptionsList/Options.d.ts +7 -0
  108. package/lib/Select/OptionsList/Options.js +14 -0
  109. package/lib/Select/OptionsList/index.d.ts +4 -0
  110. package/lib/Select/OptionsList/index.js +207 -0
  111. package/lib/Select/Selector/index.d.ts +4 -0
  112. package/lib/Select/Selector/index.js +273 -0
  113. package/lib/Select/VirtualList.d.ts +5 -0
  114. package/lib/Select/VirtualList.js +42 -0
  115. package/lib/Select/demo/disabled/index.d.ts +2 -0
  116. package/lib/Select/demo/disabled/index.js +64 -0
  117. package/lib/Select/demo/multiple/index.d.ts +2 -0
  118. package/lib/Select/demo/multiple/index.js +154 -0
  119. package/lib/Select/demo/options/index.d.ts +2 -0
  120. package/lib/Select/demo/options/index.js +69 -0
  121. package/lib/Select/demo/single/index.d.ts +2 -0
  122. package/lib/Select/demo/single/index.js +99 -0
  123. package/lib/Select/hooks/useCacheOption.d.ts +9 -0
  124. package/lib/Select/hooks/useCacheOption.js +113 -0
  125. package/lib/Select/index.d.ts +12 -0
  126. package/lib/Select/index.js +34 -0
  127. package/lib/Select/interface.d.ts +221 -0
  128. package/lib/Select/interface.js +5 -0
  129. package/lib/Select/style/index.d.ts +2 -0
  130. package/lib/Select/style/index.js +5 -0
  131. package/lib/Select/style/index.less +539 -0
  132. package/lib/Select/utils.d.ts +21 -0
  133. package/lib/Select/utils.js +233 -0
  134. package/lib/Tabs/TabPane.d.ts +21 -0
  135. package/lib/Tabs/TabPane.js +24 -0
  136. package/lib/Tabs/demo/adaptHeight/index.d.ts +3 -0
  137. package/lib/Tabs/demo/adaptHeight/index.js +34 -0
  138. package/lib/Tabs/demo/adaptHeight/index.less +3 -0
  139. package/lib/Tabs/demo/basic/index.d.ts +4 -0
  140. package/lib/Tabs/demo/basic/index.js +67 -0
  141. package/lib/Tabs/demo/basic/index.less +5 -0
  142. package/lib/Tabs/demo/horizontalScroll/index.d.ts +3 -0
  143. package/lib/Tabs/demo/horizontalScroll/index.js +45 -0
  144. package/lib/Tabs/demo/horizontalScroll/index.less +3 -0
  145. package/lib/Tabs/index.d.ts +41 -0
  146. package/lib/Tabs/index.js +58 -0
  147. package/lib/Tabs/style/index.d.ts +2 -0
  148. package/lib/Tabs/style/index.js +5 -0
  149. package/lib/Tabs/style/index.less +61 -0
  150. package/lib/Tooltip/demo/basic/index.d.ts +2 -0
  151. package/lib/Tooltip/demo/basic/index.js +20 -0
  152. package/lib/Tooltip/demo/overflow/index.d.ts +2 -0
  153. package/lib/Tooltip/demo/overflow/index.js +20 -0
  154. package/lib/Tooltip/demo/placement/index.d.ts +6 -0
  155. package/lib/Tooltip/demo/placement/index.js +86 -0
  156. package/lib/Tooltip/demo/placement/index.less +7 -0
  157. package/lib/Tooltip/demo/trigger/index.d.ts +3 -0
  158. package/lib/Tooltip/demo/trigger/index.js +34 -0
  159. package/lib/Tooltip/demo/trigger/index.less +5 -0
  160. package/lib/Tooltip/index.d.ts +63 -0
  161. package/lib/Tooltip/index.js +44 -0
  162. package/lib/Tooltip/style/index.d.ts +2 -0
  163. package/lib/Tooltip/style/index.js +5 -0
  164. package/lib/Tooltip/style/index.less +14 -0
  165. package/lib/_utils/hooks/useControlledState.d.ts +2 -0
  166. package/lib/_utils/hooks/useControlledState.js +63 -0
  167. package/lib/_utils/hooks/usePrefixCls.d.ts +2 -0
  168. package/lib/_utils/hooks/usePrefixCls.js +27 -0
  169. package/lib/index.d.ts +8 -0
  170. package/lib/index.js +63 -0
  171. package/lib/style/index.d.ts +2 -0
  172. package/lib/style/index.js +5 -0
  173. package/lib/style/index.less +3 -0
  174. package/lib/style/mixins/index.less +0 -0
  175. package/lib/style/themes/default/index.less +36 -0
  176. package/lib/style/themes/default/themeColor.less +259 -0
  177. package/package.json +83 -0
  178. package/public/favicon.ico +0 -0
  179. package/src/Button/demo/Icon/index.less +6 -0
  180. package/src/Button/demo/Icon/index.tsx +41 -0
  181. package/src/Button/demo/basic/index.less +7 -0
  182. package/src/Button/demo/basic/index.tsx +26 -0
  183. package/src/Button/demo/disable/index.less +0 -0
  184. package/src/Button/demo/disable/index.tsx +16 -0
  185. package/src/Button/demo/href/index.tsx +14 -0
  186. package/src/Button/demo/loading/index.less +6 -0
  187. package/src/Button/demo/loading/index.tsx +21 -0
  188. package/src/Button/index.md +25 -0
  189. package/src/Button/index.test.tsx +58 -0
  190. package/src/Button/index.tsx +136 -0
  191. package/src/Button/style/index.less +255 -0
  192. package/src/Button/style/index.ts +2 -0
  193. package/src/Dropdown/Button.tsx +93 -0
  194. package/src/Dropdown/demo/basic/index.tsx +20 -0
  195. package/src/Dropdown/demo/button/index.less +9 -0
  196. package/src/Dropdown/demo/button/index.tsx +98 -0
  197. package/src/Dropdown/demo/placement/index.tsx +47 -0
  198. package/src/Dropdown/demo/subMenu/index.tsx +35 -0
  199. package/src/Dropdown/demo/trigger/index.tsx +19 -0
  200. package/src/Dropdown/index.md +35 -0
  201. package/src/Dropdown/index.test.tsx +185 -0
  202. package/src/Dropdown/index.tsx +71 -0
  203. package/src/Dropdown/style/index.less +40 -0
  204. package/src/Dropdown/style/index.ts +2 -0
  205. package/src/Icon/iconfont/demo.css +539 -0
  206. package/src/Icon/iconfont/demo_index.html +628 -0
  207. package/src/Icon/iconfont/iconfont.css +93 -0
  208. package/src/Icon/iconfont/iconfont.js +1 -0
  209. package/src/Icon/iconfont/iconfont.json +142 -0
  210. package/src/Icon/iconfont/iconfont.ttf +0 -0
  211. package/src/Icon/iconfont/iconfont.woff +0 -0
  212. package/src/Icon/iconfont/iconfont.woff2 +0 -0
  213. package/src/Icon/index.less +32 -0
  214. package/src/Icon/index.tsx +38 -0
  215. package/src/Input/components/Group/index.tsx +21 -0
  216. package/src/Input/components/Password/index.tsx +23 -0
  217. package/src/Input/components/TextArea/index.tsx +57 -0
  218. package/src/Input/demo/allowClear/index.less +0 -0
  219. package/src/Input/demo/allowClear/index.tsx +10 -0
  220. package/src/Input/demo/basic/index.less +6 -0
  221. package/src/Input/demo/basic/index.tsx +25 -0
  222. package/src/Input/demo/gourp/index.tsx +30 -0
  223. package/src/Input/demo/password/index.less +0 -0
  224. package/src/Input/demo/password/index.tsx +11 -0
  225. package/src/Input/demo/prefix/index.less +0 -0
  226. package/src/Input/demo/prefix/index.tsx +13 -0
  227. package/src/Input/demo/showCount/index.less +0 -0
  228. package/src/Input/demo/showCount/index.tsx +16 -0
  229. package/src/Input/demo/textArea/autoSize.tsx +21 -0
  230. package/src/Input/index.md +37 -0
  231. package/src/Input/index.test.tsx +78 -0
  232. package/src/Input/index.tsx +91 -0
  233. package/src/Input/style/index.less +62 -0
  234. package/src/Input/style/index.ts +2 -0
  235. package/src/Menu/Divider.tsx +12 -0
  236. package/src/Menu/MenuItem.tsx +24 -0
  237. package/src/Menu/SubMenu.tsx +37 -0
  238. package/src/Menu/index.md +36 -0
  239. package/src/Menu/index.test.tsx +144 -0
  240. package/src/Menu/index.tsx +27 -0
  241. package/src/Menu/style/index.less +33 -0
  242. package/src/Menu/style/index.ts +2 -0
  243. package/src/Select/BaseSelect.tsx +321 -0
  244. package/src/Select/OptionsList/OptGroup.tsx +9 -0
  245. package/src/Select/OptionsList/OptionItem.tsx +151 -0
  246. package/src/Select/OptionsList/Options.tsx +11 -0
  247. package/src/Select/OptionsList/index.tsx +169 -0
  248. package/src/Select/Selector/index.tsx +211 -0
  249. package/src/Select/VirtualList.tsx +36 -0
  250. package/src/Select/demo/disabled/index.tsx +44 -0
  251. package/src/Select/demo/multiple/index.tsx +77 -0
  252. package/src/Select/demo/options/index.tsx +63 -0
  253. package/src/Select/demo/single/index.tsx +50 -0
  254. package/src/Select/hooks/useCacheOption.ts +67 -0
  255. package/src/Select/index.md +72 -0
  256. package/src/Select/index.tsx +23 -0
  257. package/src/Select/interface.ts +231 -0
  258. package/src/Select/style/index.less +539 -0
  259. package/src/Select/style/index.ts +2 -0
  260. package/src/Select/utils.tsx +133 -0
  261. package/src/Tabs/TabPane.tsx +28 -0
  262. package/src/Tabs/demo/adaptHeight/index.less +3 -0
  263. package/src/Tabs/demo/adaptHeight/index.tsx +33 -0
  264. package/src/Tabs/demo/basic/index.less +5 -0
  265. package/src/Tabs/demo/basic/index.tsx +30 -0
  266. package/src/Tabs/demo/horizontalScroll/index.less +3 -0
  267. package/src/Tabs/demo/horizontalScroll/index.tsx +36 -0
  268. package/src/Tabs/index.md +30 -0
  269. package/src/Tabs/index.test.tsx +100 -0
  270. package/src/Tabs/index.tsx +64 -0
  271. package/src/Tabs/style/index.less +61 -0
  272. package/src/Tabs/style/index.ts +2 -0
  273. package/src/Tooltip/demo/basic/index.tsx +10 -0
  274. package/src/Tooltip/demo/overflow/index.tsx +10 -0
  275. package/src/Tooltip/demo/placement/index.less +7 -0
  276. package/src/Tooltip/demo/placement/index.tsx +60 -0
  277. package/src/Tooltip/demo/trigger/index.less +5 -0
  278. package/src/Tooltip/demo/trigger/index.tsx +22 -0
  279. package/src/Tooltip/index.md +28 -0
  280. package/src/Tooltip/index.test.tsx +152 -0
  281. package/src/Tooltip/index.tsx +113 -0
  282. package/src/Tooltip/style/index.less +14 -0
  283. package/src/Tooltip/style/index.ts +2 -0
  284. package/src/_utils/hooks/useControlledState.ts +39 -0
  285. package/src/_utils/hooks/usePrefixCls.ts +11 -0
  286. package/src/index.ts +8 -0
  287. package/src/style/index.less +3 -0
  288. package/src/style/index.ts +2 -0
  289. package/src/style/mixins/index.less +0 -0
  290. package/src/style/themes/default/index.less +36 -0
  291. package/src/style/themes/default/themeColor.less +259 -0
  292. package/tsconfig.json +13 -0
  293. package/typings.d.ts +3 -0
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import './index.less';
3
+
4
+ import { Tabs } from '@aloudata/aloudata-design';
5
+
6
+ const { TabPane } = Tabs;
7
+
8
+ export default () => {
9
+ return (
10
+ <div className="demo-adapt-height">
11
+ <Tabs adaptHeight>
12
+ <TabPane tab="Tab 1" key="1" className="demo-tabpane">
13
+ Content of Tab Pane 1
14
+ </TabPane>
15
+ <TabPane tab="Tab 2" key="2" className="demo-tabpane">
16
+ <>
17
+ <div>Content of Tab Pane 2</div>
18
+ <div>Content of Tab Pane 2</div>
19
+ <div>Content of Tab Pane 2</div>
20
+ <div>Content of Tab Pane 2</div>
21
+ <div>Content of Tab Pane 2</div>
22
+ <div>Content of Tab Pane 2</div>
23
+ <div>Content of Tab Pane 2</div>
24
+ <div>Content of Tab Pane 2</div>
25
+ <div>Content of Tab Pane 2</div>
26
+ <div>Content of Tab Pane 2</div>
27
+ <div>Content of Tab Pane 2</div>
28
+ </>
29
+ </TabPane>
30
+ </Tabs>
31
+ </div>
32
+ );
33
+ };
@@ -0,0 +1,5 @@
1
+ .demo-basic {
2
+ .tabs-container {
3
+ height: 100px;
4
+ }
5
+ }
@@ -0,0 +1,30 @@
1
+ import React, { useState } from 'react';
2
+ import Switch from 'antd/lib/switch';
3
+ import 'antd/lib//switch/style/index.less';
4
+ import './index.less';
5
+
6
+ import { Tabs } from '@aloudata/aloudata-design';
7
+
8
+ const { TabPane } = Tabs;
9
+
10
+ export default () => {
11
+ const [size, setSize] = useState('default');
12
+
13
+ return (
14
+ <div className="demo-basic">
15
+ <div>
16
+ large size: <Switch checked={size === 'large'} onChange={(checked) => setSize(checked ? 'large' : 'default')} />
17
+ </div>
18
+ <div className="tabs-container">
19
+ <Tabs size={size} destroyInactiveTabPane>
20
+ <TabPane tab="Tab 1" key="1">
21
+ Content of Tab Pane 1
22
+ </TabPane>
23
+ <TabPane tab="Tab 2" key="2">
24
+ Content of Tab Pane 2
25
+ </TabPane>
26
+ </Tabs>
27
+ </div>
28
+ </div>
29
+ );
30
+ };
@@ -0,0 +1,3 @@
1
+ .demo-horizontal-scroll {
2
+ width: 200px;
3
+ }
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import './index.less';
3
+
4
+ import { Tabs } from '@aloudata/aloudata-design';
5
+
6
+ const { TabPane } = Tabs;
7
+
8
+ export default () => {
9
+ return (
10
+ <div className="demo-horizontal-scroll">
11
+ <Tabs>
12
+ <TabPane tab="Tab 1" key="1">
13
+ Content of Tab Pane 1
14
+ </TabPane>
15
+ <TabPane tab="Tab 2" key="2">
16
+ Content of Tab Pane 2
17
+ </TabPane>
18
+ <TabPane tab="Tab 3" key="3">
19
+ Content of Tab Pane 3
20
+ </TabPane>
21
+ <TabPane tab="Tab 4" key="4">
22
+ Content of Tab Pane 4
23
+ </TabPane>
24
+ <TabPane tab="Tab 5" key="5">
25
+ Content of Tab Pane 5
26
+ </TabPane>
27
+ <TabPane tab="Tab 6" key="6">
28
+ Content of Tab Pane 6
29
+ </TabPane>
30
+ <TabPane tab="Tab 7" key="7">
31
+ Content of Tab Pane 7
32
+ </TabPane>
33
+ </Tabs>
34
+ </div>
35
+ );
36
+ };
@@ -0,0 +1,30 @@
1
+ ---
2
+ # nav:
3
+ # title: 组件
4
+ # path: /components
5
+ title: Tabs 标签页
6
+ group:
7
+ title: 组件
8
+ ---
9
+
10
+ # Tabs 标签页
11
+
12
+ 选项卡切换组件
13
+
14
+ ## 代码演示
15
+
16
+ <code src="./demo/basic" title="基本" description="默认选中第一项">
17
+
18
+ <code src="./demo/adaptHeight" title="自适应高度" description="自动撑满容器高度,body 内容超出时出现纵向滚动条">
19
+
20
+ <code src="./demo/horizontalScroll" title="滑动" description="可以左右滑动,容纳更多标签">
21
+
22
+ ## API
23
+
24
+ ### Tabs
25
+
26
+ <API exports='["default"]' hideTitle />
27
+
28
+ ### Tabs.TabPane
29
+
30
+ <API exports='["default.TabPane"]' hideTitle />
@@ -0,0 +1,100 @@
1
+ import '@testing-library/jest-dom';
2
+ import React from 'react';
3
+ import { fireEvent, render, screen } from '@testing-library/react';
4
+ import Tabs from './index';
5
+ import { act } from 'react-dom/test-utils';
6
+
7
+ const { TabPane } = Tabs;
8
+
9
+ describe('Tabs', () => {
10
+ it('activeKey', () => {
11
+ render(
12
+ <div className="activeKey">
13
+ <Tabs activeKey="2">
14
+ <TabPane tab="tab1" key="1">1</TabPane>
15
+ <TabPane tab="tab2" key="2">2</TabPane>
16
+ <TabPane tab="tab3" key="3">3</TabPane>
17
+ </Tabs>
18
+ </div>
19
+ );
20
+
21
+ const activeText = document.querySelector('.activeKey .ant-tabs-tabpane-active')?.textContent;
22
+ expect(activeText).toBe('2');
23
+ });
24
+
25
+ it('defaultActiveKey', () => {
26
+ render(
27
+ <div className="defaultActiveKey">
28
+ <Tabs defaultActiveKey="2">
29
+ <TabPane tab="tab1" key="1">1</TabPane>
30
+ <TabPane tab="tab2" key="2">2</TabPane>
31
+ <TabPane tab="tab3" key="3">3</TabPane>
32
+ </Tabs>
33
+ </div>
34
+ );
35
+
36
+ const activeText = document.querySelector('.defaultActiveKey .ant-tabs-tabpane-active')?.textContent;
37
+ expect(activeText).toBe('2');
38
+
39
+ act(() => {
40
+ fireEvent.click(screen.getByText('tab3'));
41
+ });
42
+
43
+ expect(document.querySelector('.defaultActiveKey .ant-tabs-tabpane-active')?.textContent).toBe('3');
44
+ });
45
+
46
+ it('onChange', () => {
47
+ let activeKey = '2';
48
+ render(
49
+ <div className="onChange">
50
+ <Tabs activeKey="2" onChange={(key) => { activeKey = key; }}>
51
+ <TabPane tab="tab1" key="1">1</TabPane>
52
+ <TabPane tab="tab2" key="2">2</TabPane>
53
+ <TabPane tab="tab3" key="3">3</TabPane>
54
+ </Tabs>
55
+ </div>
56
+ );
57
+
58
+ act(() => {
59
+ fireEvent.click(screen.getByText('tab3'));
60
+ });
61
+
62
+ expect(activeKey).toBe('3');
63
+ });
64
+
65
+ it('destroyInactiveTabPane', () => {
66
+ render(
67
+ <div className="destroyInactiveTabPane">
68
+ <Tabs defaultActiveKey="2" destroyInactiveTabPane>
69
+ <TabPane tab="tab1" key="1">1</TabPane>
70
+ <TabPane tab="tab2" key="2">
71
+ <div className="tabpane2">2</div>
72
+ </TabPane>
73
+ <TabPane tab="tab3" key="3">3</TabPane>
74
+ </Tabs>
75
+ </div>
76
+ );
77
+
78
+ expect(document.querySelector('.destroyInactiveTabPane .tabpane2')).not.toBeNull();
79
+
80
+ act(() => {
81
+ fireEvent.click(screen.getByText('tab3'));
82
+ });
83
+
84
+ expect(document.querySelector('.destroyInactiveTabPane .tabpane2')).toBeNull();
85
+ });
86
+
87
+ it('TabPane forceRender', () => {
88
+ render(
89
+ <div className="activeKey">
90
+ <Tabs activeKey="2">
91
+ <TabPane tab="tab1" key="1">1</TabPane>
92
+ <TabPane tab="tab2" key="2">2</TabPane>
93
+ <TabPane tab="tab3" key="3" forceRender>Content3</TabPane>
94
+ </Tabs>
95
+ </div>
96
+ );
97
+
98
+ expect(screen.getByText('Content3')).toBeInTheDocument();
99
+ });
100
+ });
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import AntdTabs, { TabsProps } from 'antd/lib/tabs';
3
+ import Icon from '../Icon';
4
+ import TabPane from './TabPane';
5
+ import classNames from 'classnames';
6
+ import './style';
7
+
8
+ export interface ITabsProps {
9
+ /**
10
+ * @description 大小
11
+ * @default default
12
+ */
13
+ size?: 'large' | 'default';
14
+ /**
15
+ * @description 当前激活 tab 面板的 key
16
+ * @default -
17
+ */
18
+ activeKey?: string;
19
+ /**
20
+ * @description 初始化选中面板的 key,如果没有设置 activeKey
21
+ * @default 第一个面板的 key
22
+ */
23
+ defaultActiveKey?: string;
24
+ /**
25
+ * @description 切换面板的回调
26
+ * @default -
27
+ */
28
+ onChange?: (activeKey: string) => void;
29
+ /**
30
+ * @description 被隐藏时是否销毁 DOM 结构
31
+ * @default false
32
+ */
33
+ destroyInactiveTabPane?: boolean;
34
+ /**
35
+ * @description 撑满容器的高度
36
+ * @default false
37
+ */
38
+ adaptHeight?: boolean;
39
+ className?: string;
40
+ children?: React.ReactNode;
41
+ }
42
+
43
+ export default function Tabs(props: ITabsProps) {
44
+ const { size, className, adaptHeight, ...otherProps } = props;
45
+
46
+ const tabsProps: TabsProps = {
47
+ ...otherProps,
48
+ };
49
+
50
+ if (size === 'large') {
51
+ tabsProps.size = size;
52
+ }
53
+
54
+ return (
55
+ <AntdTabs
56
+ moreIcon={<Icon type="more_vert" size={18} />}
57
+ tabBarGutter={24}
58
+ className={classNames('ald-tabs', className, { 'ald-adapt-height': adaptHeight })}
59
+ {...tabsProps}
60
+ />
61
+ );
62
+ }
63
+
64
+ Tabs.TabPane = TabPane;
@@ -0,0 +1,61 @@
1
+ @import '../../style/index.less';
2
+
3
+ .ald-tabs {
4
+ &.ant-tabs {
5
+ color: @NL30;
6
+ }
7
+
8
+ .ant-tabs-tab {
9
+ font-size: 14px;
10
+ line-height: 20px;
11
+
12
+ &:hover {
13
+ color: inherit;
14
+ }
15
+
16
+ &.ant-tabs-tab-active {
17
+ font-weight: 500;
18
+ }
19
+ }
20
+
21
+ .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
22
+ text-shadow: none;
23
+ }
24
+
25
+ /* large size */
26
+ &.ant-tabs-large {
27
+ .ant-tabs-tab {
28
+ font-size: 16px;
29
+ line-height: 24px;
30
+ }
31
+ }
32
+
33
+ .ant-tabs-nav-more {
34
+ margin: 0 !important;
35
+ }
36
+
37
+ /* body自适应高度 */
38
+ &.ald-adapt-height {
39
+ height: 100%;
40
+
41
+ .ant-tabs-content {
42
+ height: 100%;
43
+ }
44
+
45
+ .ant-tabs-tabpane {
46
+ height: 100%;
47
+ overflow-y: auto;
48
+ }
49
+ }
50
+
51
+ &.ant-tabs-top > .ant-tabs-nav,
52
+ &.ant-tabs-bottom > .ant-tabs-nav,
53
+ &.ant-tabs-top > div > .ant-tabs-nav,
54
+ &.ant-tabs-bottom > div > .ant-tabs-nav {
55
+ margin: 0 0 24px;
56
+
57
+ &::before {
58
+ border-color: @NL90;
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,2 @@
1
+ import '../../style'
2
+ import './index.less';
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { Tooltip } from '@aloudata/aloudata-design';
3
+
4
+ export default () => (
5
+ <>
6
+ <Tooltip title="Tooltip">
7
+ <span>Tooltip will show on mouse enter</span>
8
+ </Tooltip>
9
+ </>
10
+ );
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { Tooltip } from '@aloudata/aloudata-design';
3
+
4
+ export default () => (
5
+ <>
6
+ <Tooltip title="longMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsglongMsg">
7
+ <span>Tooltip will show on mouse enter</span>
8
+ </Tooltip>
9
+ </>
10
+ );
@@ -0,0 +1,7 @@
1
+ .demo-placement {
2
+ .ant-btn {
3
+ width: 70px;
4
+ margin-right: 8px;
5
+ margin-bottom: 8px;
6
+ }
7
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * title: 调整位置
3
+ */
4
+
5
+ import React from 'react';
6
+ import { Tooltip, Button } from '@aloudata/aloudata-design';
7
+ import './index.less';
8
+
9
+ const text = <span>prompt text</span>;
10
+
11
+ const buttonWidth = 70;
12
+
13
+ export default () => (
14
+ <div className="demo-placement">
15
+ <div style={{ marginLeft: buttonWidth, whiteSpace: 'nowrap' }}>
16
+ <Tooltip placement="topLeft" title={text}>
17
+ <Button>TL</Button>
18
+ </Tooltip>
19
+ <Tooltip placement="top" title={text}>
20
+ <Button>Top</Button>
21
+ </Tooltip>
22
+ <Tooltip placement="topRight" title={text}>
23
+ <Button>TR</Button>
24
+ </Tooltip>
25
+ </div>
26
+ <div style={{ width: buttonWidth, float: 'left' }}>
27
+ <Tooltip placement="leftTop" title={text}>
28
+ <Button>LT</Button>
29
+ </Tooltip>
30
+ <Tooltip placement="left" title={text}>
31
+ <Button>Left</Button>
32
+ </Tooltip>
33
+ <Tooltip placement="leftBottom" title={text}>
34
+ <Button>LB</Button>
35
+ </Tooltip>
36
+ </div>
37
+ <div style={{ width: buttonWidth, marginLeft: buttonWidth * 4 + 24 }}>
38
+ <Tooltip placement="rightTop" title={text}>
39
+ <Button>RT</Button>
40
+ </Tooltip>
41
+ <Tooltip placement="right" title={text}>
42
+ <Button>Right</Button>
43
+ </Tooltip>
44
+ <Tooltip placement="rightBottom" title={text}>
45
+ <Button>RB</Button>
46
+ </Tooltip>
47
+ </div>
48
+ <div style={{ marginLeft: buttonWidth, clear: 'both', whiteSpace: 'nowrap' }}>
49
+ <Tooltip placement="bottomLeft" title={text}>
50
+ <Button>BL</Button>
51
+ </Tooltip>
52
+ <Tooltip placement="bottom" title={text}>
53
+ <Button>Bottom</Button>
54
+ </Tooltip>
55
+ <Tooltip placement="bottomRight" title={text}>
56
+ <Button>BR</Button>
57
+ </Tooltip>
58
+ </div>
59
+ </div>
60
+ );
@@ -0,0 +1,5 @@
1
+ .demo-trigger {
2
+ .ant-btn {
3
+ margin-right: 8px;
4
+ }
5
+ }
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { Tooltip, Button } from '@aloudata/aloudata-design';
3
+ import './index.less';
4
+
5
+ export default () => (
6
+ <>
7
+ <div className="demo-trigger">
8
+ <Tooltip title="Tooltip" trigger="hover">
9
+ <Button>hover</Button>
10
+ </Tooltip>
11
+ <Tooltip title="Tooltip" trigger="click">
12
+ <Button>click</Button>
13
+ </Tooltip>
14
+ <Tooltip title="Tooltip" trigger="contextMenu">
15
+ <Button>contextMenu</Button>
16
+ </Tooltip>
17
+ <Tooltip title="Tooltip" trigger="focus">
18
+ <Button>focus</Button>
19
+ </Tooltip>
20
+ </div>
21
+ </>
22
+ );
@@ -0,0 +1,28 @@
1
+ ---
2
+ # nav:
3
+ # title: 组件
4
+ # path: /components
5
+ title: Tooltip 文字提示
6
+ group:
7
+ title: 组件
8
+ ---
9
+
10
+ # Tooltip 文字提示
11
+
12
+ 简单的文字提示气泡框
13
+
14
+ ## 代码演示
15
+
16
+ <code src="./demo/basic" title="基本" description="最简单的用法">
17
+
18
+ <code src="./demo/placement" title="位置" description="位置有12个方向">
19
+
20
+ <code src="./demo/trigger" title="触发方式" description="4种触发的方式">
21
+
22
+ <code src="./demo/overflow" title="内容超长" description="内容超长情况下的展示方式">
23
+
24
+ <API />
25
+
26
+ ## 注意
27
+
28
+ 请确保 `Tooltip` 的子元素都能接受 `onMouseEnter`、`onMouseLeave`、`onFocus`、`onClick` 事件。
@@ -0,0 +1,152 @@
1
+ import '@testing-library/jest-dom';
2
+ import React from 'react';
3
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
4
+ import Tooltip from './index';
5
+ import { act } from 'react-dom/test-utils';
6
+
7
+ describe('Tooltip', () => {
8
+ it('getPopupContainer', () => {
9
+ const msg = 'getPopupContainer';
10
+ const container = document.createElement('div');
11
+ container.classList.add('container');
12
+ document.body.appendChild(container);
13
+
14
+ render(<Tooltip visible title={msg} getPopupContainer={() => container} />);
15
+ expect(document.querySelector('.container .ald-tooltip-overlay')).not.toBeNull();
16
+
17
+ document.body.removeChild(container);
18
+ });
19
+
20
+ it('destroyTooltipOnHide', () => {
21
+ const msg = 'destroyTooltipOnHide';
22
+
23
+ const { rerender } = render(<Tooltip visible title={msg} destroyTooltipOnHide />);
24
+ rerender(<Tooltip visible={false} title={msg} destroyTooltipOnHide />);
25
+
26
+ expect(screen.queryByText(msg)).toBeNull();
27
+ });
28
+
29
+ it('visible', () => {
30
+ const msg = 'tooltipVisible';
31
+
32
+ const { rerender } = render(<Tooltip visible title={msg} />);
33
+ rerender(<Tooltip visible={false} title={msg} />);
34
+
35
+ expect(
36
+ screen.queryByText(msg)?.closest('.ald-tooltip-overlay.ant-tooltip-hidden'),
37
+ ).not.toBeNull();
38
+ });
39
+
40
+ it('zIndex', () => {
41
+ const zIndex = 10000;
42
+ const msg = 'zIndex';
43
+
44
+ render(<Tooltip visible title={msg} zIndex={zIndex} />);
45
+ const tooltipNode = screen.queryByText(msg)?.closest('.ald-tooltip-overlay');
46
+ expect(getComputedStyle(tooltipNode!).zIndex).toBe(`${zIndex}`);
47
+ });
48
+
49
+ it('onVisibleChange', async () => {
50
+ const msg = 'onVisibleChange';
51
+ const className = 'onVisibleChangeClassName';
52
+
53
+ let visible = false;
54
+ const onVisibleChange = (newVisible: boolean) => {
55
+ visible = newVisible;
56
+ };
57
+
58
+ render(
59
+ <Tooltip title={msg} onVisibleChange={onVisibleChange}>
60
+ <span className={className}>trigger</span>
61
+ </Tooltip>,
62
+ );
63
+
64
+ const innerDom = document.querySelector(`.${className}`);
65
+ fireEvent.mouseEnter(innerDom!);
66
+
67
+ // 等到 tooltip 的 DOM 渲染完成
68
+ await waitFor(() => screen.getByText(msg));
69
+
70
+ expect(visible).toBeTruthy();
71
+ });
72
+
73
+ it('mouseEnterDelay', () => {
74
+ jest.useFakeTimers();
75
+
76
+ const msg = 'mouseEnterDelay';
77
+ const DELAY_TIME = 2;
78
+ const SECONDS_TIMES = 1000;
79
+ const className = 'mouseEnterDelayClassName';
80
+
81
+ render(
82
+ <Tooltip title={msg} mouseEnterDelay={DELAY_TIME}>
83
+ <span className={className}>trigger</span>
84
+ </Tooltip>,
85
+ );
86
+
87
+ const innerDom = document.querySelector(`.${className}`);
88
+ act(() => {
89
+ fireEvent.mouseEnter(innerDom!);
90
+ });
91
+
92
+ act(() => {
93
+ jest.advanceTimersByTime(SECONDS_TIMES);
94
+ });
95
+ expect(screen.queryByText(msg)).toBeNull();
96
+
97
+ act(() => {
98
+ jest.advanceTimersByTime(DELAY_TIME * SECONDS_TIMES);
99
+ });
100
+ expect(screen.queryByText(msg)).not.toBeNull();
101
+
102
+ jest.runOnlyPendingTimers();
103
+ jest.useRealTimers();
104
+ });
105
+
106
+ it('mouseLeaveDelay', async () => {
107
+ jest.useFakeTimers();
108
+
109
+ const msg = 'mouseLeaveDelay';
110
+ const DELAY_TIME = 2;
111
+ const SECONDS_TIMES = 1000;
112
+ const className = 'mouseLeaveDelayClassName';
113
+
114
+ render(
115
+ <Tooltip title={msg} mouseLeaveDelay={DELAY_TIME} destroyTooltipOnHide>
116
+ <span className={className}>trigger</span>
117
+ </Tooltip>,
118
+ );
119
+
120
+ // mouseenter 召唤出 tooltip
121
+ const innerDom = document.querySelector(`.${className}`);
122
+ act(() => {
123
+ fireEvent.mouseEnter(innerDom!);
124
+ });
125
+ // 等到 tooltip 的 DOM 渲染完成
126
+ await waitFor(() => screen.getByText(msg));
127
+
128
+ // mouseleave 隐藏 tooltip
129
+ act(() => {
130
+ fireEvent.mouseLeave(innerDom!);
131
+ });
132
+
133
+ act(() => {
134
+ jest.advanceTimersByTime(SECONDS_TIMES);
135
+ });
136
+ expect(screen.queryByText(msg)).not.toBeNull();
137
+
138
+ act(() => {
139
+ jest.advanceTimersByTime(DELAY_TIME * SECONDS_TIMES);
140
+ });
141
+ expect(screen.queryByText(msg)).toBeNull();
142
+
143
+ jest.runOnlyPendingTimers();
144
+ jest.useRealTimers();
145
+ });
146
+
147
+ it('overlayClassName', () => {
148
+ const overlayClassName = 'overlayClassName';
149
+ render(<Tooltip visible title="tooltip" overlayClassName={overlayClassName} />);
150
+ expect(document.querySelector(`.${overlayClassName}.ant-tooltip`)).not.toBeNull();
151
+ });
152
+ });