@tendaui/components 1.0.0 → 1.2.3
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.
- package/LICENSE +21 -21
- package/README.md +176 -176
- package/alert/Alert.tsx +3 -2
- package/button/_example/base.tsx +10 -0
- package/button/_example/icon.tsx +20 -0
- package/color-picker/ColorPickPanel.tsx +9 -0
- package/color-picker/ColorPicker.tsx +67 -0
- package/color-picker/components/panel/alpha.tsx +32 -0
- package/color-picker/components/panel/format/index.tsx +47 -0
- package/color-picker/components/panel/format/inputs.tsx +119 -0
- package/color-picker/components/panel/header.tsx +37 -0
- package/color-picker/components/panel/hue.tsx +20 -0
- package/color-picker/components/panel/index.tsx +191 -0
- package/color-picker/components/panel/saturation.tsx +81 -0
- package/color-picker/components/panel/slider.tsx +76 -0
- package/color-picker/components/panel/swatches.tsx +84 -0
- package/color-picker/components/trigger.tsx +49 -0
- package/color-picker/defaultProps.ts +7 -0
- package/color-picker/helpers.ts +53 -0
- package/color-picker/hooks/useClassNames.ts +9 -0
- package/color-picker/hooks/useStyles.ts +39 -0
- package/color-picker/index.ts +12 -0
- package/color-picker/style/css.js +1 -0
- package/color-picker/style/index.js +1 -0
- package/color-picker/type.ts +143 -0
- package/color-picker/utils/color-picker/cmyk.ts +89 -0
- package/color-picker/utils/color-picker/color.ts +467 -0
- package/color-picker/utils/color-picker/constants.ts +187 -0
- package/color-picker/utils/color-picker/draggable.ts +100 -0
- package/color-picker/utils/color-picker/format.ts +95 -0
- package/color-picker/utils/color-picker/gradient.ts +243 -0
- package/color-picker/utils/color-picker/index.ts +7 -0
- package/color-picker/utils/color-picker/types.ts +33 -0
- package/common/observe.ts +33 -0
- package/common.ts +20 -0
- package/config-provider/ConfigContext.tsx +4 -1
- package/config-provider/index.ts +1 -1
- package/dialog/DialogCard.tsx +4 -6
- package/dialog/hooks/useDialogPosition.ts +1 -2
- package/dialog/plugin.tsx +3 -2
- package/drawer/Drawer.tsx +264 -0
- package/drawer/defaultProps.ts +19 -0
- package/drawer/hooks/useDrag.ts +98 -0
- package/drawer/hooks/useLockStyle.ts +36 -0
- package/drawer/index.ts +5 -0
- package/drawer/style/css.js +1 -0
- package/drawer/style/index.js +1 -0
- package/drawer/type.ts +193 -0
- package/drawer/utils/index.ts +76 -0
- package/fireworks/Fireworks.tsx +138 -0
- package/fireworks/index.ts +10 -0
- package/fireworks/style/css.js +0 -0
- package/fireworks/style/index.js +0 -0
- package/fireworks/type.ts +72 -0
- package/form/FormItem.tsx +5 -5
- package/form/easing.ts +10 -0
- package/form/scroll.ts +124 -0
- package/form/type.ts +519 -519
- package/global-config/default-config.ts +95 -0
- package/global-config/locale/ar_KW.ts +270 -0
- package/global-config/locale/en_US.ts +280 -0
- package/global-config/locale/it_IT.ts +287 -0
- package/global-config/locale/ja_JP.ts +279 -0
- package/global-config/locale/ko_KR.ts +279 -0
- package/global-config/locale/ru_RU.ts +288 -0
- package/global-config/locale/zh_CN.ts +279 -0
- package/global-config/locale/zh_TW.ts +279 -0
- package/global-config/mobile/default-config.ts +6 -0
- package/global-config/mobile/locale/ar_KW.ts +113 -0
- package/global-config/mobile/locale/en_US.ts +114 -0
- package/global-config/mobile/locale/it_IT.ts +114 -0
- package/global-config/mobile/locale/ja_JP.ts +101 -0
- package/global-config/mobile/locale/ko_KR.ts +101 -0
- package/global-config/mobile/locale/ru_RU.ts +113 -0
- package/global-config/mobile/locale/zh_CN.ts +101 -0
- package/global-config/mobile/locale/zh_TW.ts +101 -0
- package/global-config/t.ts +111 -0
- package/hooks/useControlled.ts +3 -3
- package/hooks/useDeepEffect.ts +32 -0
- package/hooks/useGlobalIcon.ts +10 -3
- package/hooks/useLastest.ts +2 -6
- package/hooks/useResizeObserve.ts +36 -0
- package/index.ts +10 -7
- package/input/Input.tsx +4 -1
- package/input/defaultProps.ts +0 -2
- package/input/type.ts +1 -6
- package/input-number/InputNumber.tsx +124 -0
- package/input-number/defaultProps.ts +17 -0
- package/input-number/index.ts +9 -0
- package/input-number/style/css.js +1 -0
- package/input-number/style/index.js +1 -0
- package/input-number/type.ts +147 -0
- package/input-number/useInputNumber.tsx +270 -0
- package/ip-input/IPInput.tsx +516 -0
- package/ip-input/defaultProps.ts +11 -0
- package/ip-input/index.ts +3 -0
- package/ip-input/style/css.js +1 -0
- package/ip-input/style/index.js +1 -0
- package/ip-input/type.ts +115 -0
- package/ip-input/utils.ts +112 -0
- package/layout/Aside.tsx +38 -0
- package/layout/Layout.tsx +104 -0
- package/layout/defaultProps.ts +9 -0
- package/layout/index.ts +9 -0
- package/layout/style/css.js +1 -0
- package/layout/style/index.js +1 -0
- package/layout/type.ts +43 -0
- package/list/List.tsx +144 -0
- package/list/ListItem.tsx +36 -0
- package/list/ListItemMeta.tsx +40 -0
- package/list/defaultProps.ts +11 -0
- package/list/hooks/useListVirtualScroll.ts +82 -0
- package/list/index.ts +11 -0
- package/list/style/css.js +1 -0
- package/list/style/index.js +1 -0
- package/list/type.ts +93 -0
- package/locale/LocalReceiver.ts +55 -0
- package/locale/ar_KW.ts +7 -0
- package/locale/en_US.ts +7 -0
- package/locale/it_IT.ts +6 -0
- package/locale/ja_JP.ts +6 -0
- package/locale/ko_KR.ts +6 -0
- package/locale/ru_RU.ts +6 -0
- package/locale/zh_CN.ts +5 -0
- package/locale/zh_TW.ts +7 -0
- package/notification/NotifyContainer.tsx +2 -2
- package/notification/NotifyContext.tsx +1 -0
- package/package.json +6 -3
- package/popup/Popup.tsx +34 -10
- package/radio/Radio.tsx +24 -0
- package/radio/RadioGroup.tsx +159 -0
- package/radio/defaultProps.ts +18 -0
- package/radio/index.ts +12 -0
- package/radio/style/css.js +0 -0
- package/radio/style/index.js +1 -0
- package/radio/type.ts +115 -0
- package/radio/useKeyboard.ts +36 -0
- package/select/hooks/useOptions.ts +10 -7
- package/select/hooks/usePanelVirtualScroll.ts +1 -1
- package/select/type.ts +382 -382
- package/select-input/type.ts +280 -280
- package/slider/Slider.tsx +270 -0
- package/slider/SliderHandleButton.tsx +50 -0
- package/slider/defaultProps.ts +15 -0
- package/slider/index.ts +9 -0
- package/slider/style/css.js +1 -0
- package/slider/style/index.js +1 -0
- package/slider/type.ts +77 -0
- package/style/all.js +26 -0
- package/styles/_global.scss +39 -39
- package/styles/_vars.scss +358 -386
- package/styles/components/alert/_index.scss +175 -175
- package/styles/components/alert/_vars.scss +39 -39
- package/styles/components/badge/_index.scss +70 -70
- package/styles/components/badge/_vars.scss +25 -25
- package/styles/components/button/_index.scss +499 -511
- package/styles/components/button/_mixins.scss +39 -39
- package/styles/components/button/_vars.scss +120 -122
- package/styles/components/checkbox/_index.scss +158 -158
- package/styles/components/checkbox/_var.scss +60 -60
- package/styles/components/color-picker/_index.scss +586 -0
- package/styles/components/color-picker/_mixins.scss +0 -0
- package/styles/components/color-picker/_vars.scss +84 -0
- package/styles/components/dialog/_animate.scss +135 -135
- package/styles/components/dialog/_index.scss +311 -311
- package/styles/components/dialog/_vars.scss +59 -59
- package/styles/components/drawer/_index.scss +205 -0
- package/styles/components/drawer/_mixins.scss +1 -0
- package/styles/components/drawer/_var.scss +53 -0
- package/styles/components/fireworks/_index.scss +86 -0
- package/styles/components/fireworks/_vars.scss +4 -0
- package/styles/components/form/_index.scss +174 -174
- package/styles/components/form/_mixins.scss +76 -76
- package/styles/components/form/_vars.scss +100 -100
- package/styles/components/input/_index.scss +349 -349
- package/styles/components/input/_mixins.scss +116 -116
- package/styles/components/input/_vars.scss +134 -134
- package/styles/components/input-number/_index.scss +353 -0
- package/styles/components/input-number/_mixins.scss +0 -0
- package/styles/components/input-number/_vars.scss +65 -0
- package/styles/components/ip-input/_index.scss +280 -0
- package/styles/components/layout/_index.scss +47 -0
- package/styles/components/layout/_mixin.scss +0 -0
- package/styles/components/layout/_vars.scss +18 -0
- package/styles/components/layout/doc.scss +74 -0
- package/styles/components/list/_index.scss +172 -0
- package/styles/components/list/_mixins.scss +0 -0
- package/styles/components/list/_vars.scss +41 -0
- package/styles/components/loading/_index.scss +112 -112
- package/styles/components/loading/_vars.scss +39 -39
- package/styles/components/notification/_index.scss +160 -160
- package/styles/components/notification/_mixins.scss +12 -12
- package/styles/components/notification/_vars.scss +59 -59
- package/styles/components/popup/_index.scss +82 -82
- package/styles/components/popup/_mixin.scss +149 -149
- package/styles/components/popup/_var.scss +31 -31
- package/styles/components/radio/_index.scss +376 -0
- package/styles/components/radio/_mixins.scss +0 -0
- package/styles/components/radio/_var.scss +92 -0
- package/styles/components/select/_index.scss +290 -290
- package/styles/components/select/_var.scss +65 -65
- package/styles/components/select-input/_index.scss +5 -5
- package/styles/components/select-input/_var.scss +3 -3
- package/styles/components/slider/_index.scss +241 -0
- package/styles/components/slider/_mixins.scss +0 -0
- package/styles/components/slider/_vars.scss +50 -0
- package/styles/components/switch/_index.scss +279 -279
- package/styles/components/switch/_vars.scss +61 -61
- package/styles/components/table/_index.scss +193 -0
- package/styles/components/table/_var.scss +52 -0
- package/styles/components/tabs/_index.scss +165 -0
- package/styles/components/tabs/_mixins.scss +11 -0
- package/styles/components/tabs/_vars.scss +71 -0
- package/styles/components/tag/_index.scss +316 -316
- package/styles/components/tag/_var.scss +85 -85
- package/styles/components/tag-input/_index.scss +163 -163
- package/styles/components/tag-input/_vars.scss +16 -16
- package/styles/globals.css +250 -250
- package/styles/mixins/_focus.scss +7 -7
- package/styles/mixins/_layout.scss +32 -32
- package/styles/mixins/_reset.scss +10 -10
- package/styles/mixins/_scrollbar.scss +31 -31
- package/styles/mixins/_text.scss +48 -48
- package/styles/rillple.css +16 -16
- package/styles/scrollbar.css +41 -41
- package/styles/themes/_dark.scss +191 -191
- package/styles/themes/_font.scss +69 -79
- package/styles/themes/_index.scss +5 -5
- package/styles/themes/_light.scss +190 -190
- package/styles/themes/_radius.scss +9 -9
- package/styles/themes/_size.scss +68 -68
- package/styles/themes.css +66 -66
- package/styles/utilities/_animation.scss +57 -57
- package/styles/utilities/_tips.scss +9 -9
- package/tab/TabBar.tsx +85 -0
- package/tab/TabNav.tsx +103 -0
- package/tab/TabNavItem.tsx +80 -0
- package/tab/TabPanel.tsx +42 -0
- package/tab/Tabs.tsx +71 -0
- package/tab/defaultProps.ts +19 -0
- package/tab/index.ts +7 -0
- package/tab/style/index.js +1 -0
- package/tab/type.ts +125 -0
- package/tab/useTabClass.ts +20 -0
- package/table/Cell.tsx +109 -0
- package/table/TBody.tsx +77 -0
- package/table/THead.tsx +63 -0
- package/table/TR.tsx +78 -0
- package/table/Table.tsx +73 -0
- package/table/defaultProps.ts +14 -0
- package/table/hooks/index.ts +4 -0
- package/table/hooks/useTableClassName.ts +63 -0
- package/table/hooks/useTableStyle.ts +93 -0
- package/table/index.ts +7 -0
- package/table/style/css.js +1 -0
- package/table/style/index.js +1 -0
- package/table/type.ts +192 -0
- package/tag/Tag.tsx +1 -1
- package/tag-input/hooks/useTagList.tsx +1 -1
- package/utils/dom.ts +4 -0
- package/utils/forwardRefWithStatics.ts +1 -4
- package/utils/input-number/large-number.ts +423 -0
- package/utils/input-number/number.ts +257 -0
- package/utils/isFragment.ts +6 -6
- package/utils/log/index.ts +3 -0
- package/utils/log/log.ts +30 -0
- package/utils/log/types.ts +12 -0
- package/utils/number.ts +21 -0
- package/utils/scroll.ts +26 -0
- 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
|
-
|
|
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,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);
|