@tendaui/components 1.0.0 → 1.0.2

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 (270) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/alert/Alert.tsx +3 -2
  4. package/button/_example/base.tsx +10 -0
  5. package/button/_example/icon.tsx +20 -0
  6. package/color-picker/ColorPickPanel.tsx +9 -0
  7. package/color-picker/ColorPicker.tsx +67 -0
  8. package/color-picker/components/panel/alpha.tsx +32 -0
  9. package/color-picker/components/panel/format/index.tsx +47 -0
  10. package/color-picker/components/panel/format/inputs.tsx +119 -0
  11. package/color-picker/components/panel/header.tsx +37 -0
  12. package/color-picker/components/panel/hue.tsx +20 -0
  13. package/color-picker/components/panel/index.tsx +191 -0
  14. package/color-picker/components/panel/saturation.tsx +81 -0
  15. package/color-picker/components/panel/slider.tsx +76 -0
  16. package/color-picker/components/panel/swatches.tsx +84 -0
  17. package/color-picker/components/trigger.tsx +49 -0
  18. package/color-picker/defaultProps.ts +7 -0
  19. package/color-picker/helpers.ts +53 -0
  20. package/color-picker/hooks/useClassNames.ts +9 -0
  21. package/color-picker/hooks/useStyles.ts +39 -0
  22. package/color-picker/index.ts +12 -0
  23. package/color-picker/style/css.js +1 -0
  24. package/color-picker/style/index.js +1 -0
  25. package/color-picker/type.ts +143 -0
  26. package/color-picker/utils/color-picker/cmyk.ts +89 -0
  27. package/color-picker/utils/color-picker/color.ts +467 -0
  28. package/color-picker/utils/color-picker/constants.ts +187 -0
  29. package/color-picker/utils/color-picker/draggable.ts +100 -0
  30. package/color-picker/utils/color-picker/format.ts +95 -0
  31. package/color-picker/utils/color-picker/gradient.ts +243 -0
  32. package/color-picker/utils/color-picker/index.ts +7 -0
  33. package/color-picker/utils/color-picker/types.ts +33 -0
  34. package/common/observe.ts +33 -0
  35. package/common.ts +20 -0
  36. package/config-provider/ConfigContext.tsx +4 -1
  37. package/config-provider/index.ts +1 -1
  38. package/dialog/DialogCard.tsx +4 -6
  39. package/dialog/hooks/useDialogPosition.ts +1 -2
  40. package/dialog/plugin.tsx +3 -2
  41. package/drawer/Drawer.tsx +264 -0
  42. package/drawer/defaultProps.ts +19 -0
  43. package/drawer/hooks/useDrag.ts +98 -0
  44. package/drawer/hooks/useLockStyle.ts +36 -0
  45. package/drawer/index.ts +5 -0
  46. package/drawer/style/css.js +1 -0
  47. package/drawer/style/index.js +1 -0
  48. package/drawer/type.ts +193 -0
  49. package/drawer/utils/index.ts +76 -0
  50. package/fireworks/Fireworks.tsx +138 -0
  51. package/fireworks/index.ts +10 -0
  52. package/fireworks/style/css.js +0 -0
  53. package/fireworks/style/index.js +0 -0
  54. package/fireworks/type.ts +72 -0
  55. package/form/FormItem.tsx +5 -5
  56. package/form/easing.ts +10 -0
  57. package/form/scroll.ts +124 -0
  58. package/form/type.ts +519 -519
  59. package/global-config/default-config.ts +95 -0
  60. package/global-config/locale/ar_KW.ts +270 -0
  61. package/global-config/locale/en_US.ts +280 -0
  62. package/global-config/locale/it_IT.ts +287 -0
  63. package/global-config/locale/ja_JP.ts +279 -0
  64. package/global-config/locale/ko_KR.ts +279 -0
  65. package/global-config/locale/ru_RU.ts +288 -0
  66. package/global-config/locale/zh_CN.ts +279 -0
  67. package/global-config/locale/zh_TW.ts +279 -0
  68. package/global-config/mobile/default-config.ts +6 -0
  69. package/global-config/mobile/locale/ar_KW.ts +113 -0
  70. package/global-config/mobile/locale/en_US.ts +114 -0
  71. package/global-config/mobile/locale/it_IT.ts +114 -0
  72. package/global-config/mobile/locale/ja_JP.ts +101 -0
  73. package/global-config/mobile/locale/ko_KR.ts +101 -0
  74. package/global-config/mobile/locale/ru_RU.ts +113 -0
  75. package/global-config/mobile/locale/zh_CN.ts +101 -0
  76. package/global-config/mobile/locale/zh_TW.ts +101 -0
  77. package/global-config/t.ts +111 -0
  78. package/hooks/useControlled.ts +3 -3
  79. package/hooks/useDeepEffect.ts +32 -0
  80. package/hooks/useGlobalIcon.ts +10 -3
  81. package/hooks/useLastest.ts +2 -6
  82. package/hooks/useResizeObserve.ts +36 -0
  83. package/index.ts +10 -7
  84. package/input/Input.tsx +4 -1
  85. package/input/defaultProps.ts +0 -2
  86. package/input/type.ts +1 -6
  87. package/input-number/InputNumber.tsx +124 -0
  88. package/input-number/defaultProps.ts +17 -0
  89. package/input-number/index.ts +9 -0
  90. package/input-number/style/css.js +1 -0
  91. package/input-number/style/index.js +1 -0
  92. package/input-number/type.ts +147 -0
  93. package/input-number/useInputNumber.tsx +270 -0
  94. package/ip-input/IPInput.tsx +516 -0
  95. package/ip-input/defaultProps.ts +11 -0
  96. package/ip-input/index.ts +3 -0
  97. package/ip-input/style/css.js +1 -0
  98. package/ip-input/style/index.js +1 -0
  99. package/ip-input/type.ts +115 -0
  100. package/ip-input/utils.ts +112 -0
  101. package/layout/Aside.tsx +38 -0
  102. package/layout/Layout.tsx +104 -0
  103. package/layout/defaultProps.ts +9 -0
  104. package/layout/index.ts +9 -0
  105. package/layout/style/css.js +1 -0
  106. package/layout/style/index.js +1 -0
  107. package/layout/type.ts +43 -0
  108. package/list/List.tsx +144 -0
  109. package/list/ListItem.tsx +36 -0
  110. package/list/ListItemMeta.tsx +40 -0
  111. package/list/defaultProps.ts +11 -0
  112. package/list/hooks/useListVirtualScroll.ts +82 -0
  113. package/list/index.ts +11 -0
  114. package/list/style/css.js +1 -0
  115. package/list/style/index.js +1 -0
  116. package/list/type.ts +93 -0
  117. package/locale/LocalReceiver.ts +55 -0
  118. package/locale/ar_KW.ts +7 -0
  119. package/locale/en_US.ts +7 -0
  120. package/locale/it_IT.ts +6 -0
  121. package/locale/ja_JP.ts +6 -0
  122. package/locale/ko_KR.ts +6 -0
  123. package/locale/ru_RU.ts +6 -0
  124. package/locale/zh_CN.ts +5 -0
  125. package/locale/zh_TW.ts +7 -0
  126. package/notification/NotifyContainer.tsx +2 -2
  127. package/notification/NotifyContext.tsx +1 -0
  128. package/package.json +6 -3
  129. package/popup/Popup.tsx +34 -10
  130. package/radio/Radio.tsx +24 -0
  131. package/radio/RadioGroup.tsx +159 -0
  132. package/radio/defaultProps.ts +18 -0
  133. package/radio/index.ts +12 -0
  134. package/radio/style/css.js +0 -0
  135. package/radio/style/index.js +1 -0
  136. package/radio/type.ts +115 -0
  137. package/radio/useKeyboard.ts +36 -0
  138. package/select/hooks/useOptions.ts +10 -7
  139. package/select/hooks/usePanelVirtualScroll.ts +1 -1
  140. package/select/type.ts +382 -382
  141. package/select-input/type.ts +280 -280
  142. package/slider/Slider.tsx +270 -0
  143. package/slider/SliderHandleButton.tsx +50 -0
  144. package/slider/defaultProps.ts +15 -0
  145. package/slider/index.ts +9 -0
  146. package/slider/style/css.js +1 -0
  147. package/slider/style/index.js +1 -0
  148. package/slider/type.ts +77 -0
  149. package/style/all.js +26 -0
  150. package/styles/_global.scss +39 -39
  151. package/styles/_vars.scss +358 -386
  152. package/styles/components/alert/_index.scss +175 -175
  153. package/styles/components/alert/_vars.scss +39 -39
  154. package/styles/components/badge/_index.scss +70 -70
  155. package/styles/components/badge/_vars.scss +25 -25
  156. package/styles/components/button/_index.scss +499 -511
  157. package/styles/components/button/_mixins.scss +39 -39
  158. package/styles/components/button/_vars.scss +120 -122
  159. package/styles/components/checkbox/_index.scss +158 -158
  160. package/styles/components/checkbox/_var.scss +60 -60
  161. package/styles/components/color-picker/_index.scss +586 -0
  162. package/styles/components/color-picker/_mixins.scss +0 -0
  163. package/styles/components/color-picker/_vars.scss +84 -0
  164. package/styles/components/dialog/_animate.scss +135 -135
  165. package/styles/components/dialog/_index.scss +311 -311
  166. package/styles/components/dialog/_vars.scss +59 -59
  167. package/styles/components/drawer/_index.scss +205 -0
  168. package/styles/components/drawer/_mixins.scss +1 -0
  169. package/styles/components/drawer/_var.scss +53 -0
  170. package/styles/components/fireworks/_index.scss +86 -0
  171. package/styles/components/fireworks/_vars.scss +4 -0
  172. package/styles/components/form/_index.scss +174 -174
  173. package/styles/components/form/_mixins.scss +76 -76
  174. package/styles/components/form/_vars.scss +100 -100
  175. package/styles/components/input/_index.scss +349 -349
  176. package/styles/components/input/_mixins.scss +116 -116
  177. package/styles/components/input/_vars.scss +134 -134
  178. package/styles/components/input-number/_index.scss +353 -0
  179. package/styles/components/input-number/_mixins.scss +0 -0
  180. package/styles/components/input-number/_vars.scss +65 -0
  181. package/styles/components/ip-input/_index.scss +280 -0
  182. package/styles/components/layout/_index.scss +47 -0
  183. package/styles/components/layout/_mixin.scss +0 -0
  184. package/styles/components/layout/_vars.scss +18 -0
  185. package/styles/components/layout/doc.scss +74 -0
  186. package/styles/components/list/_index.scss +172 -0
  187. package/styles/components/list/_mixins.scss +0 -0
  188. package/styles/components/list/_vars.scss +41 -0
  189. package/styles/components/loading/_index.scss +112 -112
  190. package/styles/components/loading/_vars.scss +39 -39
  191. package/styles/components/notification/_index.scss +160 -160
  192. package/styles/components/notification/_mixins.scss +12 -12
  193. package/styles/components/notification/_vars.scss +59 -59
  194. package/styles/components/popup/_index.scss +82 -82
  195. package/styles/components/popup/_mixin.scss +149 -149
  196. package/styles/components/popup/_var.scss +31 -31
  197. package/styles/components/radio/_index.scss +376 -0
  198. package/styles/components/radio/_mixins.scss +0 -0
  199. package/styles/components/radio/_var.scss +92 -0
  200. package/styles/components/select/_index.scss +290 -290
  201. package/styles/components/select/_var.scss +65 -65
  202. package/styles/components/select-input/_index.scss +5 -5
  203. package/styles/components/select-input/_var.scss +3 -3
  204. package/styles/components/slider/_index.scss +241 -0
  205. package/styles/components/slider/_mixins.scss +0 -0
  206. package/styles/components/slider/_vars.scss +50 -0
  207. package/styles/components/switch/_index.scss +279 -279
  208. package/styles/components/switch/_vars.scss +61 -61
  209. package/styles/components/table/_index.scss +193 -0
  210. package/styles/components/table/_var.scss +52 -0
  211. package/styles/components/tabs/_index.scss +165 -0
  212. package/styles/components/tabs/_mixins.scss +11 -0
  213. package/styles/components/tabs/_vars.scss +71 -0
  214. package/styles/components/tag/_index.scss +316 -316
  215. package/styles/components/tag/_var.scss +85 -85
  216. package/styles/components/tag-input/_index.scss +163 -163
  217. package/styles/components/tag-input/_vars.scss +16 -16
  218. package/styles/globals.css +250 -250
  219. package/styles/mixins/_focus.scss +7 -7
  220. package/styles/mixins/_layout.scss +32 -32
  221. package/styles/mixins/_reset.scss +10 -10
  222. package/styles/mixins/_scrollbar.scss +31 -31
  223. package/styles/mixins/_text.scss +48 -48
  224. package/styles/rillple.css +16 -16
  225. package/styles/scrollbar.css +41 -41
  226. package/styles/themes/_dark.scss +191 -191
  227. package/styles/themes/_font.scss +69 -79
  228. package/styles/themes/_index.scss +5 -5
  229. package/styles/themes/_light.scss +190 -190
  230. package/styles/themes/_radius.scss +9 -9
  231. package/styles/themes/_size.scss +68 -68
  232. package/styles/themes.css +66 -66
  233. package/styles/utilities/_animation.scss +57 -57
  234. package/styles/utilities/_tips.scss +9 -9
  235. package/tab/TabBar.tsx +85 -0
  236. package/tab/TabNav.tsx +103 -0
  237. package/tab/TabNavItem.tsx +80 -0
  238. package/tab/TabPanel.tsx +42 -0
  239. package/tab/Tabs.tsx +71 -0
  240. package/tab/defaultProps.ts +19 -0
  241. package/tab/index.ts +7 -0
  242. package/tab/style/index.js +1 -0
  243. package/tab/type.ts +125 -0
  244. package/tab/useTabClass.ts +20 -0
  245. package/table/Cell.tsx +109 -0
  246. package/table/TBody.tsx +77 -0
  247. package/table/THead.tsx +63 -0
  248. package/table/TR.tsx +78 -0
  249. package/table/Table.tsx +73 -0
  250. package/table/defaultProps.ts +14 -0
  251. package/table/hooks/index.ts +4 -0
  252. package/table/hooks/useTableClassName.ts +63 -0
  253. package/table/hooks/useTableStyle.ts +93 -0
  254. package/table/index.ts +7 -0
  255. package/table/style/css.js +1 -0
  256. package/table/style/index.js +1 -0
  257. package/table/type.ts +192 -0
  258. package/tag/Tag.tsx +1 -1
  259. package/tag-input/hooks/useTagList.tsx +1 -1
  260. package/utils/dom.ts +4 -0
  261. package/utils/forwardRefWithStatics.ts +1 -4
  262. package/utils/input-number/large-number.ts +423 -0
  263. package/utils/input-number/number.ts +257 -0
  264. package/utils/isFragment.ts +6 -6
  265. package/utils/log/index.ts +3 -0
  266. package/utils/log/log.ts +30 -0
  267. package/utils/log/types.ts +12 -0
  268. package/utils/number.ts +21 -0
  269. package/utils/scroll.ts +26 -0
  270. package/utils/style.ts +2 -4
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 TendaUI
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2024 TendaUI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,176 +1,176 @@
1
- # @tendaui/components
2
-
3
- TendaUI React 组件库的源代码包,包含所有 UI 组件的实现。
4
-
5
- ## 📦 安装
6
-
7
- 在 monorepo 的其他包中使用 `workspace` 协议安装:
8
-
9
- ```bash
10
- pnpm add @tendaui/components@workspace:*
11
- ```
12
-
13
- ## 🔗 在其他包中使用
14
-
15
- ### 1. 在 package.json 中添加依赖
16
-
17
- ```json
18
- {
19
- "dependencies": {
20
- "@tendaui/components": "workspace:*"
21
- }
22
- }
23
- ```
24
-
25
- ### 2. 在代码中导入使用
26
-
27
- #### 导入单个组件
28
-
29
- ```tsx
30
- import { Button } from "@tendaui/components";
31
- import "@tendaui/components/button/style";
32
-
33
- function App() {
34
- return <Button type="primary">点击我</Button>;
35
- }
36
- ```
37
-
38
- #### 导入多个组件
39
-
40
- ```tsx
41
- import { Button, Input, Form } from "@tendaui/components";
42
- import "@tendaui/components/styles/globals.css";
43
-
44
- function App() {
45
- return (
46
- <Form>
47
- <Input placeholder="请输入" />
48
- <Button type="primary">提交</Button>
49
- </Form>
50
- );
51
- }
52
- ```
53
-
54
- #### 按需导入组件
55
-
56
- ```tsx
57
- // 导入单个组件的所有导出
58
- import Button from "@tendaui/components/button";
59
- import "@tendaui/components/button/style";
60
-
61
- // 或者导入特定文件
62
- import { Button } from "@tendaui/components/button";
63
- ```
64
-
65
- #### 导入 Hooks
66
-
67
- ```tsx
68
- import { useConfig, useControlled } from "@tendaui/components/hooks";
69
- ```
70
-
71
- #### 导入工具函数
72
-
73
- ```tsx
74
- import { composeRefs, parseTNode } from "@tendaui/components/utils";
75
- ```
76
-
77
- ## 📝 TypeScript 支持
78
-
79
- 如果需要在 TypeScript 项目中使用,可以在 `tsconfig.json` 中添加路径映射:
80
-
81
- ```json
82
- {
83
- "compilerOptions": {
84
- "paths": {
85
- "@tendaui/components": ["../../packages/components"],
86
- "@tendaui/components/*": ["../../packages/components/*"]
87
- }
88
- }
89
- }
90
- ```
91
-
92
- ## 🎯 使用场景
93
-
94
- ### 场景 1: 在 `tendaui-react` 包中使用
95
-
96
- `tendaui-react` 包可以依赖 `@tendaui/components` 来构建最终发布的包:
97
-
98
- ```json
99
- {
100
- "name": "tendaui-react",
101
- "dependencies": {
102
- "@tendaui/components": "workspace:*"
103
- }
104
- }
105
- ```
106
-
107
- ### 场景 2: 在文档包中使用
108
-
109
- 在 Storybook 或其他文档工具中直接使用组件:
110
-
111
- ```tsx
112
- import { Button } from "@tendaui/components";
113
- import { Meta, Story } from "@storybook/react";
114
-
115
- export default {
116
- title: "Components/Button",
117
- component: Button
118
- } as Meta;
119
- ```
120
-
121
- ### 场景 3: 在测试中使用
122
-
123
- 在测试文件中导入组件进行测试:
124
-
125
- ```tsx
126
- import { render, screen } from "@testing-library/react";
127
- import { Button } from "@tendaui/components";
128
-
129
- test("renders button", () => {
130
- render(<Button>Test</Button>);
131
- expect(screen.getByText("Test")).toBeInTheDocument();
132
- });
133
- ```
134
-
135
- ## 📋 可用组件
136
-
137
- - `Alert` - 警告提示
138
- - `Badge` - 徽标
139
- - `Button` - 按钮
140
- - `Checkbox` - 复选框
141
- - `ConfigProvider` - 全局配置
142
- - `Dialog` - 对话框
143
- - `Form` - 表单
144
- - `Input` - 输入框
145
- - `Loading` - 加载中
146
- - `Notification` - 通知
147
- - `Popup` - 弹出层
148
- - `Select` - 选择器
149
- - `SelectInput` - 选择输入框
150
- - `Switch` - 开关
151
- - `Tag` - 标签
152
- - `TagInput` - 标签输入框
153
-
154
- ## 🔧 开发
155
-
156
- ### 本地开发
157
-
158
- 由于这是一个源代码包,修改组件代码后,使用它的包会自动看到更改(如果配置了正确的构建工具)。
159
-
160
- ### 构建
161
-
162
- 如果需要构建这个包,可以添加构建脚本:
163
-
164
- ```json
165
- {
166
- "scripts": {
167
- "build": "tsc --build"
168
- }
169
- }
170
- ```
171
-
172
- ## 📚 相关文档
173
-
174
- - [Monorepo 最佳实践](../../MONOREPO.md)
175
- - [发布指南](../../PUBLISH.md)
176
- - [Lerna 使用指南](../../LERNA.md)
1
+ # @tendaui/components
2
+
3
+ TendaUI React 组件库的源代码包,包含所有 UI 组件的实现。
4
+
5
+ ## 📦 安装
6
+
7
+ 在 monorepo 的其他包中使用 `workspace` 协议安装:
8
+
9
+ ```bash
10
+ pnpm add @tendaui/components@workspace:*
11
+ ```
12
+
13
+ ## 🔗 在其他包中使用
14
+
15
+ ### 1. 在 package.json 中添加依赖
16
+
17
+ ```json
18
+ {
19
+ "dependencies": {
20
+ "@tendaui/components": "workspace:*"
21
+ }
22
+ }
23
+ ```
24
+
25
+ ### 2. 在代码中导入使用
26
+
27
+ #### 导入单个组件
28
+
29
+ ```tsx
30
+ import { Button } from "@tendaui/components";
31
+ import "@tendaui/components/button/style";
32
+
33
+ function App() {
34
+ return <Button type="primary">点击我</Button>;
35
+ }
36
+ ```
37
+
38
+ #### 导入多个组件
39
+
40
+ ```tsx
41
+ import { Button, Input, Form } from "@tendaui/components";
42
+ import "@tendaui/components/styles/globals.css";
43
+
44
+ function App() {
45
+ return (
46
+ <Form>
47
+ <Input placeholder="请输入" />
48
+ <Button type="primary">提交</Button>
49
+ </Form>
50
+ );
51
+ }
52
+ ```
53
+
54
+ #### 按需导入组件
55
+
56
+ ```tsx
57
+ // 导入单个组件的所有导出
58
+ import Button from "@tendaui/components/button";
59
+ import "@tendaui/components/button/style";
60
+
61
+ // 或者导入特定文件
62
+ import { Button } from "@tendaui/components/button";
63
+ ```
64
+
65
+ #### 导入 Hooks
66
+
67
+ ```tsx
68
+ import { useConfig, useControlled } from "@tendaui/components/hooks";
69
+ ```
70
+
71
+ #### 导入工具函数
72
+
73
+ ```tsx
74
+ import { composeRefs, parseTNode } from "@tendaui/components/utils";
75
+ ```
76
+
77
+ ## 📝 TypeScript 支持
78
+
79
+ 如果需要在 TypeScript 项目中使用,可以在 `tsconfig.json` 中添加路径映射:
80
+
81
+ ```json
82
+ {
83
+ "compilerOptions": {
84
+ "paths": {
85
+ "@tendaui/components": ["../../packages/components"],
86
+ "@tendaui/components/*": ["../../packages/components/*"]
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
92
+ ## 🎯 使用场景
93
+
94
+ ### 场景 1: 在 `tendaui-react` 包中使用
95
+
96
+ `tendaui-react` 包可以依赖 `@tendaui/components` 来构建最终发布的包:
97
+
98
+ ```json
99
+ {
100
+ "name": "tendaui-react",
101
+ "dependencies": {
102
+ "@tendaui/components": "workspace:*"
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### 场景 2: 在文档包中使用
108
+
109
+ 在 Storybook 或其他文档工具中直接使用组件:
110
+
111
+ ```tsx
112
+ import { Button } from "@tendaui/components";
113
+ import { Meta, Story } from "@storybook/react";
114
+
115
+ export default {
116
+ title: "Components/Button",
117
+ component: Button
118
+ } as Meta;
119
+ ```
120
+
121
+ ### 场景 3: 在测试中使用
122
+
123
+ 在测试文件中导入组件进行测试:
124
+
125
+ ```tsx
126
+ import { render, screen } from "@testing-library/react";
127
+ import { Button } from "@tendaui/components";
128
+
129
+ test("renders button", () => {
130
+ render(<Button>Test</Button>);
131
+ expect(screen.getByText("Test")).toBeInTheDocument();
132
+ });
133
+ ```
134
+
135
+ ## 📋 可用组件
136
+
137
+ - `Alert` - 警告提示
138
+ - `Badge` - 徽标
139
+ - `Button` - 按钮
140
+ - `Checkbox` - 复选框
141
+ - `ConfigProvider` - 全局配置
142
+ - `Dialog` - 对话框
143
+ - `Form` - 表单
144
+ - `Input` - 输入框
145
+ - `Loading` - 加载中
146
+ - `Notification` - 通知
147
+ - `Popup` - 弹出层
148
+ - `Select` - 选择器
149
+ - `SelectInput` - 选择输入框
150
+ - `Switch` - 开关
151
+ - `Tag` - 标签
152
+ - `TagInput` - 标签输入框
153
+
154
+ ## 🔧 开发
155
+
156
+ ### 本地开发
157
+
158
+ 由于这是一个源代码包,修改组件代码后,使用它的包会自动看到更改(如果配置了正确的构建工具)。
159
+
160
+ ### 构建
161
+
162
+ 如果需要构建这个包,可以添加构建脚本:
163
+
164
+ ```json
165
+ {
166
+ "scripts": {
167
+ "build": "tsc --build"
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## 📚 相关文档
173
+
174
+ - [Monorepo 最佳实践](../../MONOREPO.md)
175
+ - [发布指南](../../PUBLISH.md)
176
+ - [Lerna 使用指南](../../LERNA.md)
package/alert/Alert.tsx CHANGED
@@ -18,6 +18,7 @@ import { StyledProps } from "../common";
18
18
  import { alertDefaultProps } from "./defaultProps";
19
19
  import composeRefs from "../utils/composeRefs";
20
20
  import useDefaultProps from "../hooks/useDefaultProps";
21
+ import { useLocaleReceiver } from "../locale/LocalReceiver";
21
22
 
22
23
  const transitionTime = 200;
23
24
 
@@ -25,7 +26,7 @@ export interface AlertProps extends TdAlertProps, StyledProps {}
25
26
 
26
27
  const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
27
28
  const { classPrefix } = useConfig();
28
- // const [local, t] = useLocaleReceiver('alert');
29
+ const [local, t] = useLocaleReceiver("alert");
29
30
  const { CloseIcon, InfoCircleFilledIcon, CheckCircleFilledIcon, ErrorCircleFilledIcon } = useGlobalIcon({
30
31
  CloseIcon: TdCloseIcon,
31
32
  InfoCircleFilledIcon: TdInfoCircleFilledIcon,
@@ -88,7 +89,7 @@ const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
88
89
  })}
89
90
  {+maxLine < message.length && (
90
91
  <div className={`${classPrefix}-alert__collapse`} onClick={handleCollapse}>
91
- {collapsed ? "展开" : "收起"}
92
+ {collapsed ? t(local.expandText) : t(local.collapseText)}
92
93
  </div>
93
94
  )}
94
95
  </div>
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { Button } from "@tendaui/react";
3
+
4
+ export default function Base() {
5
+ return (
6
+ <div style={{ display: "flex", gap: "8px" }}>
7
+ <Button theme="primary">Primary</Button>
8
+ </div>
9
+ );
10
+ }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Button } from "@tendaui/react";
3
+ import { IconArrowLeft, IconDelete, IconAlertTriangle, IconCheckCircleStroked } from "@tendaui/icons";
4
+
5
+ export default function Icon() {
6
+ return (
7
+ <div style={{ display: "flex", gap: "8px", alignItems: "center" }}>
8
+ <Button icon={<IconArrowLeft />}>默认按钮</Button>
9
+ <Button icon={<IconAlertTriangle />} theme="warning">
10
+ 警告按钮
11
+ </Button>
12
+ <Button icon={<IconDelete />} theme="danger">
13
+ 危险按钮
14
+ </Button>
15
+ <Button theme="success" icon={<IconCheckCircleStroked />}>
16
+ 成功按钮
17
+ </Button>
18
+ </div>
19
+ );
20
+ }
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import ColorPanel from "./components/panel";
3
+ import { ColorPickerProps } from "./type";
4
+
5
+ const ColorPickerPanel: React.FC<ColorPickerProps> = (props) => <ColorPanel {...props} popupProps={null} />;
6
+
7
+ ColorPickerPanel.displayName = "ColorPickerPanel";
8
+
9
+ export default React.memo(ColorPickerPanel);
@@ -0,0 +1,67 @@
1
+ import React, { useRef } from "react";
2
+ import classNames from "classnames";
3
+ import { Popup, PopupProps } from "../popup";
4
+ import { ColorPickerProps, TdColorContext } from "./type";
5
+ import useClassName from "./hooks/useClassNames";
6
+ import useControlled from "../hooks/useControlled";
7
+ import ColorTrigger from "./components/trigger";
8
+ import ColorPanel from "./components/panel/index";
9
+ import { colorPickerDefaultProps } from "./defaultProps";
10
+ import useDefaultProps from "../hooks/useDefaultProps";
11
+
12
+ const ColorPicker: React.FC<ColorPickerProps> = (props) => {
13
+ const baseClassName = useClassName();
14
+ const { popupProps, clearable, disabled, borderless, inputProps, onChange, onClear, ...panelProps } =
15
+ useDefaultProps<ColorPickerProps>(props, colorPickerDefaultProps);
16
+ const { overlayClassName, overlayInnerStyle = {}, ...restPopupProps } = popupProps || {};
17
+
18
+ const [innerValue, setInnerValue] = useControlled(props, "value", onChange);
19
+ const triggerRef = useRef<HTMLDivElement>(null);
20
+ const colorPanelRef = useRef<HTMLDivElement>(null);
21
+
22
+ const popProps: PopupProps = {
23
+ placement: "bottom-left",
24
+ expandAnimation: true,
25
+ trigger: "click",
26
+ ...restPopupProps,
27
+ overlayClassName: classNames(baseClassName, overlayClassName),
28
+ overlayInnerStyle: {
29
+ padding: 0,
30
+ ...overlayInnerStyle
31
+ }
32
+ };
33
+
34
+ return (
35
+ <Popup
36
+ {...popProps}
37
+ content={
38
+ !disabled && (
39
+ <ColorPanel
40
+ {...panelProps}
41
+ clearable={clearable}
42
+ disabled={disabled}
43
+ value={innerValue}
44
+ onChange={(value: string, context: TdColorContext) => setInnerValue(value, context)}
45
+ ref={colorPanelRef}
46
+ />
47
+ )
48
+ }
49
+ >
50
+ <div className={`${baseClassName}__trigger`} ref={triggerRef}>
51
+ <ColorTrigger
52
+ clearable={clearable}
53
+ disabled={disabled}
54
+ borderless={borderless}
55
+ inputProps={inputProps}
56
+ value={innerValue}
57
+ onChange={setInnerValue}
58
+ onClear={onClear}
59
+ />
60
+ </div>
61
+ </Popup>
62
+ );
63
+ };
64
+
65
+ ColorPicker.displayName = "ColorPicker";
66
+
67
+ export default React.memo(ColorPicker);
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import classNames from "classnames";
3
+ import type { TdColorBaseProps } from "../../type";
4
+ import ColorSlider from "./slider";
5
+
6
+ const Alpha = (props: TdColorBaseProps) => {
7
+ const { color, baseClassName, onChange, ...rest } = props;
8
+
9
+ const handleChange = (v: number) => {
10
+ onChange?.(v / 100);
11
+ };
12
+
13
+ const railStyle = {
14
+ background: `linear-gradient(to right, rgba(0, 0, 0, 0), ${props.color.rgb})`
15
+ };
16
+
17
+ return (
18
+ <ColorSlider
19
+ baseClassName={baseClassName}
20
+ className={classNames([`${baseClassName}__alpha`, `${baseClassName}--bg-alpha`])}
21
+ color={color}
22
+ value={color.alpha * 100}
23
+ onChange={handleChange}
24
+ railStyle={railStyle}
25
+ type="alpha"
26
+ maxValue={100}
27
+ {...rest}
28
+ />
29
+ );
30
+ };
31
+
32
+ export default React.memo(Alpha);
@@ -0,0 +1,47 @@
1
+ import React, { useState } from "react";
2
+ import { Color, getColorFormatOptions } from "../../../utils/color-picker";
3
+ import Select from "../../../../select";
4
+ import type { TdColorPickerProps } from "../../../type";
5
+ import FormatInputs from "./inputs";
6
+
7
+ export interface TdColorFormatProps extends TdColorPickerProps {
8
+ onInputChange: () => void;
9
+ baseClassName: string;
10
+ color: Color;
11
+ }
12
+
13
+ const FormatPanel = (props: TdColorFormatProps) => {
14
+ const { enableAlpha, baseClassName, format, selectInputProps } = props;
15
+ const [formatMode, setFormatMode] = useState(format);
16
+
17
+ const handleModeChange = (v: TdColorPickerProps["format"]) => {
18
+ setFormatMode(v);
19
+ };
20
+
21
+ return (
22
+ <div className={`${baseClassName}__format`}>
23
+ <div className={`${baseClassName}__format--item`}>
24
+ <Select
25
+ size="small"
26
+ className={`${baseClassName}__format-mode-select`}
27
+ popupProps={{
28
+ overlayClassName: `${baseClassName}__select-options`,
29
+ ...selectInputProps?.popupProps
30
+ }}
31
+ autoWidth
32
+ value={formatMode}
33
+ onChange={handleModeChange}
34
+ >
35
+ {getColorFormatOptions(enableAlpha).map((item) => (
36
+ <Select.Option key={item} value={item} label={item} style={{ fontSize: "12px" }} />
37
+ ))}
38
+ </Select>
39
+ </div>
40
+ <div className={`${baseClassName}__format--item`}>
41
+ <FormatInputs {...props} format={formatMode} />
42
+ </div>
43
+ </div>
44
+ );
45
+ };
46
+
47
+ export default React.memo(FormatPanel);