@tendaui/components 1.2.4 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_util/scroll.ts +9 -0
- package/alert/_example/base.tsx +13 -0
- package/alert/_example/collapse.tsx +15 -0
- package/badge/_example/base.tsx +10 -0
- package/badge/_example/count.tsx +29 -0
- package/badge/_example/custom-color.tsx +32 -0
- package/badge/_example/dot.tsx +26 -0
- package/badge/_example/max-count.tsx +26 -0
- package/badge/_example/offset.tsx +29 -0
- package/badge/_example/shape.tsx +32 -0
- package/badge/_example/show-zero.tsx +23 -0
- package/badge/_example/size.tsx +35 -0
- package/badge/_example/standalone.tsx +14 -0
- package/badge/_example/text-count.tsx +26 -0
- package/badge/_example/with-button.tsx +23 -0
- package/button/_example/block.tsx +18 -0
- package/button/_example/disabled.tsx +22 -0
- package/button/_example/ghost.tsx +21 -0
- package/button/_example/link.tsx +15 -0
- package/button/_example/loading.tsx +19 -0
- package/button/_example/shape.tsx +18 -0
- package/button/_example/size.tsx +18 -0
- package/button/_example/suffix.tsx +16 -0
- package/button/_example/theme.tsx +14 -0
- package/button/_example/variant-base.tsx +24 -0
- package/button/_example/variant-dashed.tsx +24 -0
- package/button/_example/variant-outline.tsx +24 -0
- package/button/_example/variant-text.tsx +24 -0
- package/checkbox/_example/base.tsx +8 -0
- package/checkbox/_example/controlled.tsx +11 -0
- package/checkbox/_example/group-disabled.tsx +13 -0
- package/checkbox/_example/group-with-check-all.tsx +22 -0
- package/checkbox/_example/group-with-max.tsx +17 -0
- package/checkbox/_example/group-with-options.tsx +18 -0
- package/checkbox/_example/group.tsx +17 -0
- package/checkbox/_example/states.tsx +19 -0
- package/color-picker/ColorPicker.tsx +16 -2
- package/color-picker/_example/base.tsx +12 -0
- package/color-picker/_example/borderless.tsx +17 -0
- package/color-picker/_example/clearable.tsx +12 -0
- package/color-picker/_example/disabled.tsx +17 -0
- package/color-picker/_example/formats.tsx +30 -0
- package/color-picker/_example/manual-input.tsx +39 -0
- package/color-picker/_example/recent-colors.tsx +19 -0
- package/color-picker/_example/swatch-colors.tsx +28 -0
- package/color-picker/_example/with-alpha.tsx +21 -0
- package/color-picker/components/panel/format/inputs.tsx +1 -1
- package/color-picker/components/panel/index.tsx +13 -0
- package/color-picker/components/trigger.tsx +64 -13
- package/color-picker/defaultProps.ts +4 -1
- package/color-picker/utils/color-picker/cmyk.ts +5 -5
- package/color-picker/utils/color-picker/draggable.ts +14 -15
- package/color-picker/utils/color-picker/format.ts +21 -26
- package/color-picker/utils/color-picker/gradient.ts +35 -41
- package/color-picker/utils/color-picker/types.ts +4 -4
- package/config-provider/ConfigContext.tsx +1 -0
- package/config-provider/ConfigProvider.tsx +18 -1
- package/config-provider/type.ts +5 -0
- package/dialog/_example/base.tsx +27 -0
- package/dialog/_example/confirm-loading.tsx +32 -0
- package/dialog/_example/custom-buttons.tsx +24 -0
- package/dialog/_example/full-screen.tsx +26 -0
- package/dialog/_example/hide-buttons.tsx +39 -0
- package/dialog/_example/modeless.tsx +25 -0
- package/dialog/_example/placement.tsx +40 -0
- package/dialog/_example/plugin-example.tsx +69 -0
- package/dialog/_example/themes.tsx +41 -0
- package/drawer/Drawer.tsx +17 -9
- package/drawer/_example/custom-header-footer.tsx +29 -0
- package/drawer/_example/default.tsx +20 -0
- package/drawer/_example/events.tsx +53 -0
- package/drawer/_example/no-footer.tsx +20 -0
- package/drawer/_example/no-overlay.tsx +20 -0
- package/drawer/_example/placement.tsx +43 -0
- package/drawer/_example/size-draggable.tsx +26 -0
- package/drawer/_example/size.tsx +40 -0
- package/drawer/defaultProps.ts +1 -1
- package/fireworks/Fireworks.tsx +1 -10
- package/fireworks/index.ts +0 -1
- package/fireworks/type.ts +0 -1
- package/form/_example/complex.tsx +76 -0
- package/form/_example/default.tsx +58 -0
- package/form/_example/disabled.tsx +26 -0
- package/form/_example/form-list.tsx +74 -0
- package/form/_example/inline-layout.tsx +20 -0
- package/form/_example/label-align.tsx +46 -0
- package/form/_example/methods.tsx +66 -0
- package/form/_example/validation.tsx +71 -0
- package/form/hooks/useFormItemStyle.tsx +19 -7
- package/form/index.ts +20 -2
- package/global-config/default-config.ts +28 -28
- package/global-config/locale/ar_KW.ts +176 -187
- package/global-config/locale/en_US.ts +180 -195
- package/global-config/locale/it_IT.ts +174 -197
- package/global-config/locale/ja_JP.ts +178 -193
- package/global-config/locale/ko_KR.ts +178 -193
- package/global-config/locale/ru_RU.ts +189 -200
- package/global-config/locale/zh_CN.ts +179 -193
- package/global-config/locale/zh_TW.ts +178 -192
- package/global-config/mobile/default-config.ts +3 -3
- package/global-config/mobile/locale/ar_KW.ts +76 -77
- package/global-config/mobile/locale/en_US.ts +76 -77
- package/global-config/mobile/locale/it_IT.ts +76 -77
- package/global-config/mobile/locale/ja_JP.ts +64 -65
- package/global-config/mobile/locale/ko_KR.ts +64 -65
- package/global-config/mobile/locale/ru_RU.ts +76 -77
- package/global-config/mobile/locale/zh_CN.ts +64 -65
- package/global-config/mobile/locale/zh_TW.ts +64 -65
- package/global-config/t.ts +12 -12
- package/hooks/useDebounce.ts +27 -0
- package/hooks/useLastest.ts +6 -2
- package/hooks/useResizeObserve.ts +0 -1
- package/index.ts +1 -1
- package/input/Input.tsx +53 -10
- package/input/_example/auto-width.tsx +14 -0
- package/input/_example/borderless.tsx +17 -0
- package/input/_example/clearable.tsx +14 -0
- package/input/_example/default.tsx +10 -0
- package/input/_example/disabled-readonly.tsx +12 -0
- package/input/_example/events.tsx +42 -0
- package/input/_example/group.tsx +14 -0
- package/input/_example/label-suffix.tsx +12 -0
- package/input/_example/max-length.tsx +11 -0
- package/input/_example/password.tsx +14 -0
- package/input/_example/sizes.tsx +12 -0
- package/input/_example/status.tsx +13 -0
- package/input/_example/text-align.tsx +12 -0
- package/input/_example/with-icon.tsx +13 -0
- package/input/type.ts +3 -0
- package/input/useLengthLimit.ts +122 -0
- package/input-number/_example/align.tsx +23 -0
- package/input-number/_example/auto-width.tsx +8 -0
- package/input-number/_example/default.tsx +8 -0
- package/input-number/_example/events.tsx +45 -0
- package/input-number/_example/format.tsx +27 -0
- package/input-number/_example/large-number.tsx +17 -0
- package/input-number/_example/min-max.tsx +14 -0
- package/input-number/_example/sizes.tsx +35 -0
- package/input-number/_example/status.tsx +65 -0
- package/input-number/_example/step-and-decimal.tsx +14 -0
- package/input-number/_example/themes.tsx +21 -0
- package/input-number/_example/with-suffix.tsx +12 -0
- package/ip-input/_example/controlled.tsx +26 -0
- package/ip-input/_example/default.tsx +12 -0
- package/ip-input/_example/full-featured.tsx +32 -0
- package/ip-input/_example/ipv6.tsx +23 -0
- package/ip-input/_example/keyboard-navigation.tsx +19 -0
- package/ip-input/_example/paste-demo.tsx +23 -0
- package/ip-input/_example/states.tsx +21 -0
- package/ip-input/_example/with-cidr.tsx +23 -0
- package/layout/_example/combine-left.tsx +54 -0
- package/layout/_example/combine-right.tsx +54 -0
- package/layout/_example/custom-aside-width.tsx +56 -0
- package/layout/_example/custom-height.tsx +45 -0
- package/layout/_example/double-sidebar.tsx +57 -0
- package/layout/_example/side-navigation-right.tsx +51 -0
- package/layout/_example/side-navigation.tsx +51 -0
- package/layout/_example/top-navigation.tsx +41 -0
- package/list/_example/async-loading.tsx +46 -0
- package/list/_example/default.tsx +23 -0
- package/list/_example/header-footer.tsx +40 -0
- package/list/_example/multiline.tsx +24 -0
- package/list/_example/scroll-loading.tsx +69 -0
- package/list/_example/sizes.tsx +45 -0
- package/list/_example/split.tsx +36 -0
- package/list/_example/stripe.tsx +24 -0
- package/list/_example/virtual-scroll.tsx +51 -0
- package/list/_example/with-image.tsx +26 -0
- package/loading/_example/default.tsx +6 -0
- package/loading/_example/delay.tsx +53 -0
- package/loading/_example/fullscreen.tsx +29 -0
- package/loading/_example/inherit-color.tsx +24 -0
- package/loading/_example/no-overlay.tsx +15 -0
- package/loading/_example/sizes.tsx +25 -0
- package/loading/_example/with-text.tsx +12 -0
- package/loading/_example/wrapper.tsx +30 -0
- package/notification/_example/default.tsx +31 -0
- package/notification/_example/long-content.tsx +37 -0
- package/notification/_example/stacking.tsx +40 -0
- package/notification/_example/types.tsx +78 -0
- package/notification/_example/usage-example.tsx +62 -0
- package/package.json +4 -3
- package/popup/Popup.tsx +17 -5
- package/popup/_example/controlled.tsx +32 -0
- package/popup/_example/custom-content.tsx +64 -0
- package/popup/_example/default.tsx +19 -0
- package/popup/_example/delay.tsx +35 -0
- package/popup/_example/disabled.tsx +17 -0
- package/popup/_example/no-arrow.tsx +17 -0
- package/popup/_example/placements.tsx +61 -0
- package/popup/_example/triggers.tsx +26 -0
- package/radio/_example/allow-uncheck.tsx +19 -0
- package/radio/_example/button-style.tsx +40 -0
- package/radio/_example/controlled.tsx +13 -0
- package/radio/_example/default.tsx +13 -0
- package/radio/_example/group-disabled.tsx +22 -0
- package/radio/_example/group-with-options.tsx +20 -0
- package/radio/_example/group.tsx +19 -0
- package/radio/_example/sizes.tsx +37 -0
- package/radio/_example/states.tsx +20 -0
- package/select/_example/collapsed.tsx +30 -0
- package/select/_example/creatable.tsx +36 -0
- package/select/_example/custom-content.tsx +26 -0
- package/select/_example/default.tsx +29 -0
- package/select/_example/disabled.tsx +20 -0
- package/select/_example/filterable.tsx +27 -0
- package/select/_example/group-options.tsx +44 -0
- package/select/_example/label-suffix.tsx +24 -0
- package/select/_example/loading.tsx +19 -0
- package/select/_example/multiple.tsx +31 -0
- package/select/_example/sizes.tsx +20 -0
- package/select/_example/status.tsx +27 -0
- package/slider/Slider.tsx +13 -5
- package/slider/_example/custom-label.tsx +19 -0
- package/slider/_example/default.tsx +14 -0
- package/slider/_example/disabled.tsx +17 -0
- package/slider/_example/marks.tsx +31 -0
- package/slider/_example/range.tsx +16 -0
- package/slider/_example/step.tsx +14 -0
- package/slider/_example/vertical.tsx +26 -0
- package/slider/_example/with-input-number.tsx +21 -0
- package/slider/type.ts +1 -1
- package/styles/_vars.scss +16 -0
- package/styles/components/button/_index.scss +3 -3
- package/styles/components/dialog/_index.scss +18 -20
- package/styles/components/drawer/_index.scss +4 -3
- package/styles/components/drawer/_var.scss +1 -1
- package/styles/components/form/_index.scss +7 -6
- package/styles/components/input/_mixins.scss +7 -5
- package/styles/components/input-number/_index.scss +13 -12
- package/styles/components/list/_index.scss +5 -5
- package/styles/components/notification/_index.scss +4 -4
- package/styles/components/slider/_index.scss +8 -8
- package/styles/components/switch/_index.scss +98 -15
- package/styles/components/table/_index.scss +37 -29
- package/styles/components/tabs/_index.scss +8 -9
- package/styles/components/tooltip/_index.scss +104 -0
- package/styles/components/tooltip/_vars.scss +23 -0
- package/switch/_example/async-change.tsx +25 -0
- package/switch/_example/before-change.tsx +22 -0
- package/switch/_example/controlled.tsx +14 -0
- package/switch/_example/custom-value.tsx +21 -0
- package/switch/_example/default.tsx +6 -0
- package/switch/_example/disabled.tsx +25 -0
- package/switch/_example/loading.tsx +17 -0
- package/switch/_example/sizes.tsx +21 -0
- package/switch/_example/with-label.tsx +21 -0
- package/tab/TabPanel.tsx +9 -6
- package/tab/_example/addable.tsx +45 -0
- package/tab/_example/card-theme.tsx +22 -0
- package/tab/_example/default.tsx +22 -0
- package/tab/_example/disabled.tsx +38 -0
- package/tab/_example/lazy.tsx +25 -0
- package/tab/_example/placement.tsx +36 -0
- package/tab/_example/removable.tsx +31 -0
- package/tab/_example/sizes.tsx +31 -0
- package/tab/_example/with-action.tsx +26 -0
- package/table/Cell.tsx +3 -6
- package/table/Ellipsis.tsx +73 -0
- package/table/_example/alignment.tsx +46 -0
- package/table/_example/auto-width.tsx +47 -0
- package/table/_example/bordered-stripe-hover.tsx +42 -0
- package/table/_example/bordered.tsx +42 -0
- package/table/_example/cell-click.tsx +52 -0
- package/table/_example/complex.tsx +82 -0
- package/table/_example/custom-cell.tsx +68 -0
- package/table/_example/custom-empty.tsx +37 -0
- package/table/_example/custom-row-class-name.tsx +57 -0
- package/table/_example/default.tsx +42 -0
- package/table/_example/ellipsis.tsx +56 -0
- package/table/_example/empty.tsx +28 -0
- package/table/_example/fixed-width.tsx +48 -0
- package/table/_example/hover.tsx +42 -0
- package/table/_example/row-click.tsx +52 -0
- package/table/_example/sizes.tsx +57 -0
- package/table/_example/stripe.tsx +42 -0
- package/table/_example/vertical-align.tsx +110 -0
- package/table/hooks/useTableClassName.ts +3 -3
- package/table/index.ts +2 -0
- package/table/type.ts +1 -0
- package/tag/Tag.tsx +1 -1
- package/tag/_example/closable.tsx +44 -0
- package/tag/_example/default.tsx +17 -0
- package/tag/_example/disabled.tsx +19 -0
- package/tag/_example/sizes.tsx +18 -0
- package/tag/_example/variants.tsx +37 -0
- package/tag-input/_example/collapsed.tsx +27 -0
- package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
- package/tag-input/_example/default.tsx +15 -0
- package/tag-input/_example/disabled-readonly.tsx +21 -0
- package/tag-input/_example/events.tsx +64 -0
- package/tag-input/_example/excess-display.tsx +27 -0
- package/tag-input/_example/max-tags.tsx +22 -0
- package/tag-input/_example/sizes.tsx +21 -0
- package/tag-input/_example/status.tsx +37 -0
- package/tag-input/_example/with-label.tsx +23 -0
- package/tag-input/hooks/useTagList.tsx +1 -1
- package/tooltip/Tooltip.tsx +76 -0
- package/tooltip/_example/base.tsx +26 -0
- package/tooltip/_example/custom-content.tsx +47 -0
- package/tooltip/_example/placement.tsx +33 -0
- package/tooltip/_example/theme.tsx +34 -0
- package/tooltip/defaultProps.ts +14 -0
- package/tooltip/index.ts +7 -0
- package/tooltip/style/index.js +1 -0
- package/tooltip/type.ts +99 -0
- package/utils/log/index.ts +1 -1
- package/utils/log/log.ts +2 -3
- package/utils/log/types.ts +1 -4
|
@@ -1,101 +1,100 @@
|
|
|
1
|
-
/* eslint-disable no-template-curly-in-string */
|
|
2
1
|
// 文件有效,为国际化做准备
|
|
3
|
-
import
|
|
2
|
+
import "dayjs/locale/zh-cn";
|
|
4
3
|
|
|
5
4
|
export default {
|
|
6
5
|
actionSheet: {
|
|
7
|
-
cancel:
|
|
6
|
+
cancel: "取消"
|
|
8
7
|
},
|
|
9
8
|
calendar: {
|
|
10
|
-
title:
|
|
11
|
-
confirm:
|
|
12
|
-
weekdays: [
|
|
13
|
-
monthTitle:
|
|
14
|
-
months: [
|
|
9
|
+
title: "请选择日期",
|
|
10
|
+
confirm: "确认",
|
|
11
|
+
weekdays: ["日", "一", "二", "三", "四", "五", "六"],
|
|
12
|
+
monthTitle: "{year} 年 {month}",
|
|
13
|
+
months: ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月", "7 月", "8 月", "9 月", "10 月", "11 月", "12 月"]
|
|
15
14
|
},
|
|
16
15
|
cascader: {
|
|
17
|
-
title:
|
|
18
|
-
placeholder:
|
|
16
|
+
title: "标题",
|
|
17
|
+
placeholder: "选择选项"
|
|
19
18
|
},
|
|
20
19
|
dropdownMenu: {
|
|
21
|
-
reset:
|
|
22
|
-
confirm:
|
|
20
|
+
reset: "重置",
|
|
21
|
+
confirm: "确定"
|
|
23
22
|
},
|
|
24
23
|
dateTimePicker: {
|
|
25
|
-
title:
|
|
26
|
-
cancel:
|
|
27
|
-
confirm:
|
|
28
|
-
format:
|
|
29
|
-
yearLabel:
|
|
30
|
-
monthLabel:
|
|
31
|
-
dateLabel:
|
|
32
|
-
hourLabel:
|
|
33
|
-
minuteLabel:
|
|
34
|
-
secondLabel:
|
|
24
|
+
title: "选择时间",
|
|
25
|
+
cancel: "取消",
|
|
26
|
+
confirm: "确定",
|
|
27
|
+
format: "YYYY-MM-DD",
|
|
28
|
+
yearLabel: "年",
|
|
29
|
+
monthLabel: "月",
|
|
30
|
+
dateLabel: "日",
|
|
31
|
+
hourLabel: "时",
|
|
32
|
+
minuteLabel: "分",
|
|
33
|
+
secondLabel: "秒"
|
|
35
34
|
},
|
|
36
35
|
form: {
|
|
37
36
|
errorMessage: {
|
|
38
|
-
date:
|
|
39
|
-
url:
|
|
40
|
-
required:
|
|
41
|
-
whitespace:
|
|
42
|
-
max:
|
|
43
|
-
min:
|
|
44
|
-
len:
|
|
45
|
-
enum:
|
|
46
|
-
idcard:
|
|
47
|
-
telnumber:
|
|
48
|
-
pattern:
|
|
49
|
-
validator:
|
|
50
|
-
boolean:
|
|
51
|
-
number:
|
|
37
|
+
date: "请输入正确的${name}",
|
|
38
|
+
url: "请输入正确的${name}",
|
|
39
|
+
required: "${name}必填",
|
|
40
|
+
whitespace: "${name}不能为空",
|
|
41
|
+
max: "${name}字符长度不能超过 ${validate} 个字符,一个中文等于两个字符",
|
|
42
|
+
min: "${name}字符长度不能少于 ${validate} 个字符,一个中文等于两个字符",
|
|
43
|
+
len: "${name}字符长度必须是 ${validate}",
|
|
44
|
+
enum: "${name}只能是${validate}等",
|
|
45
|
+
idcard: "请输入正确的${name}",
|
|
46
|
+
telnumber: "请输入正确的${name}",
|
|
47
|
+
pattern: "请输入正确的${name}",
|
|
48
|
+
validator: "${name}不符合要求",
|
|
49
|
+
boolean: "${name}数据类型必须是布尔类型",
|
|
50
|
+
number: "${name}必须是数字"
|
|
52
51
|
},
|
|
53
|
-
colonText:
|
|
52
|
+
colonText: ":"
|
|
54
53
|
},
|
|
55
54
|
picker: {
|
|
56
|
-
cancel:
|
|
57
|
-
confirm:
|
|
55
|
+
cancel: "取消",
|
|
56
|
+
confirm: "确认"
|
|
58
57
|
},
|
|
59
58
|
pullDownRefresh: {
|
|
60
|
-
loadingTexts: [
|
|
59
|
+
loadingTexts: ["下拉刷新", "松手刷新", "正在刷新", "刷新完成"]
|
|
61
60
|
},
|
|
62
61
|
rate: {
|
|
63
|
-
valueText:
|
|
64
|
-
noValueText:
|
|
62
|
+
valueText: "{value} 分",
|
|
63
|
+
noValueText: "未评分"
|
|
65
64
|
},
|
|
66
65
|
tabBar: {
|
|
67
|
-
newsAriaLabel:
|
|
68
|
-
moreNewsAriaLabel:
|
|
69
|
-
haveMoreNewsAriaLabel:
|
|
70
|
-
haveNewsAriaLabel:
|
|
66
|
+
newsAriaLabel: "有新的消息",
|
|
67
|
+
moreNewsAriaLabel: "有很多消息",
|
|
68
|
+
haveMoreNewsAriaLabel: "有 {value}+ 条消息",
|
|
69
|
+
haveNewsAriaLabel: "有 {value} 条消息"
|
|
71
70
|
},
|
|
72
71
|
table: {
|
|
73
|
-
empty:
|
|
72
|
+
empty: "暂无数据"
|
|
74
73
|
},
|
|
75
74
|
list: {
|
|
76
|
-
loading:
|
|
77
|
-
loadingMoreText:
|
|
78
|
-
pulling:
|
|
79
|
-
loosing:
|
|
80
|
-
success:
|
|
75
|
+
loading: "加载中...",
|
|
76
|
+
loadingMoreText: "点击加载更多",
|
|
77
|
+
pulling: "下拉即可刷新...",
|
|
78
|
+
loosing: "释放即可刷新...",
|
|
79
|
+
success: "刷新成功"
|
|
81
80
|
},
|
|
82
81
|
upload: {
|
|
83
82
|
progress: {
|
|
84
|
-
uploadingText:
|
|
85
|
-
waitingText:
|
|
86
|
-
failText:
|
|
87
|
-
successText:
|
|
88
|
-
}
|
|
83
|
+
uploadingText: "上传中...",
|
|
84
|
+
waitingText: "待上传",
|
|
85
|
+
failText: "上传失败",
|
|
86
|
+
successText: "上传成功"
|
|
87
|
+
}
|
|
89
88
|
},
|
|
90
89
|
guide: {
|
|
91
|
-
next:
|
|
92
|
-
skip:
|
|
93
|
-
finish:
|
|
94
|
-
back:
|
|
90
|
+
next: "下一步",
|
|
91
|
+
skip: "跳过",
|
|
92
|
+
finish: "完成",
|
|
93
|
+
back: "返回"
|
|
95
94
|
},
|
|
96
95
|
qrcode: {
|
|
97
|
-
expiredText:
|
|
98
|
-
refreshText:
|
|
99
|
-
scannedText:
|
|
100
|
-
}
|
|
96
|
+
expiredText: "二维码过期",
|
|
97
|
+
refreshText: "点击刷新",
|
|
98
|
+
scannedText: "已扫描"
|
|
99
|
+
}
|
|
101
100
|
};
|
|
@@ -1,101 +1,100 @@
|
|
|
1
|
-
/* eslint-disable no-template-curly-in-string */
|
|
2
1
|
// 文件有效,为国际化做准备
|
|
3
|
-
import
|
|
2
|
+
import "dayjs/locale/zh-tw";
|
|
4
3
|
|
|
5
4
|
export default {
|
|
6
5
|
actionSheet: {
|
|
7
|
-
cancel:
|
|
6
|
+
cancel: "取消"
|
|
8
7
|
},
|
|
9
8
|
calendar: {
|
|
10
|
-
title:
|
|
11
|
-
confirm:
|
|
12
|
-
weekdays: [
|
|
13
|
-
monthTitle:
|
|
14
|
-
months: [
|
|
9
|
+
title: "請選擇日期",
|
|
10
|
+
confirm: "確認",
|
|
11
|
+
weekdays: ["日", "一", "二", "三", "四", "五", "六"],
|
|
12
|
+
monthTitle: "{year} 年 {month}",
|
|
13
|
+
months: ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月", "7 月", "8 月", "9 月", "10 月", "11 月", "12 月"]
|
|
15
14
|
},
|
|
16
15
|
cascader: {
|
|
17
|
-
title:
|
|
18
|
-
placeholder:
|
|
16
|
+
title: "標題",
|
|
17
|
+
placeholder: "選擇選項"
|
|
19
18
|
},
|
|
20
19
|
dropdownMenu: {
|
|
21
|
-
reset:
|
|
22
|
-
confirm:
|
|
20
|
+
reset: "重置",
|
|
21
|
+
confirm: "確定"
|
|
23
22
|
},
|
|
24
23
|
dateTimePicker: {
|
|
25
|
-
title:
|
|
26
|
-
cancel:
|
|
27
|
-
confirm:
|
|
28
|
-
format:
|
|
29
|
-
yearLabel:
|
|
30
|
-
monthLabel:
|
|
31
|
-
dateLabel:
|
|
32
|
-
hourLabel:
|
|
33
|
-
minuteLabel:
|
|
34
|
-
secondLabel:
|
|
24
|
+
title: "選擇時間",
|
|
25
|
+
cancel: "取消",
|
|
26
|
+
confirm: "確定",
|
|
27
|
+
format: "YYYY-MM-DD",
|
|
28
|
+
yearLabel: "年",
|
|
29
|
+
monthLabel: "月",
|
|
30
|
+
dateLabel: "日",
|
|
31
|
+
hourLabel: "時",
|
|
32
|
+
minuteLabel: "分",
|
|
33
|
+
secondLabel: "秒"
|
|
35
34
|
},
|
|
36
35
|
form: {
|
|
37
36
|
errorMessage: {
|
|
38
|
-
date:
|
|
39
|
-
url:
|
|
40
|
-
whitespace:
|
|
41
|
-
required:
|
|
42
|
-
max:
|
|
43
|
-
min:
|
|
44
|
-
len:
|
|
45
|
-
enum:
|
|
46
|
-
idcard:
|
|
47
|
-
telnumber:
|
|
48
|
-
pattern:
|
|
49
|
-
validator:
|
|
50
|
-
boolean:
|
|
51
|
-
number:
|
|
37
|
+
date: "請輸入正確的${name}",
|
|
38
|
+
url: "請輸入正確的${name}",
|
|
39
|
+
whitespace: "${name}不能為空",
|
|
40
|
+
required: "${name}必填",
|
|
41
|
+
max: "${name}字符長度不能超過 ${validate} 個字符,一個中文等於兩個字符",
|
|
42
|
+
min: "${name}字符長度不能少於 ${validate} 個字符,一個中文等於兩個字符",
|
|
43
|
+
len: "${name}字符長度必須是 ${validate}",
|
|
44
|
+
enum: "${name}只能是${validate}等",
|
|
45
|
+
idcard: "請輸入正確的${name}",
|
|
46
|
+
telnumber: "請輸入正確的${name}",
|
|
47
|
+
pattern: "請輸入正確的${name}",
|
|
48
|
+
validator: "${name}不符合要求",
|
|
49
|
+
boolean: "${name}數據類型必須是布林類型",
|
|
50
|
+
number: "${name}必須是數字"
|
|
52
51
|
},
|
|
53
|
-
colonText:
|
|
52
|
+
colonText: ":"
|
|
54
53
|
},
|
|
55
54
|
picker: {
|
|
56
|
-
cancel:
|
|
57
|
-
confirm:
|
|
55
|
+
cancel: "取消",
|
|
56
|
+
confirm: "確認"
|
|
58
57
|
},
|
|
59
58
|
pullDownRefresh: {
|
|
60
|
-
loadingTexts: [
|
|
59
|
+
loadingTexts: ["下拉刷新", "鬆手刷新", "正在刷新", "刷新完成"]
|
|
61
60
|
},
|
|
62
61
|
rate: {
|
|
63
|
-
valueText:
|
|
64
|
-
noValueText:
|
|
62
|
+
valueText: "{value} 分",
|
|
63
|
+
noValueText: "未評分"
|
|
65
64
|
},
|
|
66
65
|
tabBar: {
|
|
67
|
-
newsAriaLabel:
|
|
68
|
-
moreNewsAriaLabel:
|
|
69
|
-
haveMoreNewsAriaLabel:
|
|
70
|
-
haveNewsAriaLabel:
|
|
66
|
+
newsAriaLabel: "有新消息",
|
|
67
|
+
moreNewsAriaLabel: "有很多消息",
|
|
68
|
+
haveMoreNewsAriaLabel: "有 {value}+ 條消息",
|
|
69
|
+
haveNewsAriaLabel: "有 {value} 條消息"
|
|
71
70
|
},
|
|
72
71
|
table: {
|
|
73
|
-
empty:
|
|
72
|
+
empty: "暫無數據"
|
|
74
73
|
},
|
|
75
74
|
list: {
|
|
76
|
-
loading:
|
|
77
|
-
loadingMoreText:
|
|
78
|
-
pulling:
|
|
79
|
-
loosing:
|
|
80
|
-
success:
|
|
75
|
+
loading: "加載中...",
|
|
76
|
+
loadingMoreText: "點擊加載更多",
|
|
77
|
+
pulling: "下拉即可刷新...",
|
|
78
|
+
loosing: "釋放即可刷新...",
|
|
79
|
+
success: "刷新成功"
|
|
81
80
|
},
|
|
82
81
|
upload: {
|
|
83
82
|
progress: {
|
|
84
|
-
uploadingText:
|
|
85
|
-
waitingText:
|
|
86
|
-
failText:
|
|
87
|
-
successText:
|
|
88
|
-
}
|
|
83
|
+
uploadingText: "上傳中...",
|
|
84
|
+
waitingText: "待上傳",
|
|
85
|
+
failText: "上傳失敗",
|
|
86
|
+
successText: "上傳成功"
|
|
87
|
+
}
|
|
89
88
|
},
|
|
90
89
|
guide: {
|
|
91
|
-
next:
|
|
92
|
-
skip:
|
|
93
|
-
finish:
|
|
94
|
-
back:
|
|
90
|
+
next: "下一步",
|
|
91
|
+
skip: "跳過",
|
|
92
|
+
finish: "完成",
|
|
93
|
+
back: "返回"
|
|
95
94
|
},
|
|
96
95
|
qrcode: {
|
|
97
|
-
expiredText:
|
|
98
|
-
refreshText:
|
|
99
|
-
scannedText:
|
|
100
|
-
}
|
|
96
|
+
expiredText: "二維碼過期",
|
|
97
|
+
refreshText: "點擊刷新",
|
|
98
|
+
scannedText: "已掃描"
|
|
99
|
+
}
|
|
101
100
|
};
|
package/global-config/t.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isString } from
|
|
1
|
+
import { isString } from "lodash-es";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* 复数规则判断函数
|
|
@@ -55,26 +55,26 @@ export function t<T>(pattern: T, ...args: any[]): string {
|
|
|
55
55
|
if (args.length > 0) {
|
|
56
56
|
const [firstArg, secondArg] = args;
|
|
57
57
|
|
|
58
|
-
if (typeof firstArg ===
|
|
59
|
-
|
|
58
|
+
if (typeof firstArg === "number") {
|
|
59
|
+
// 第一个参数是数字,表示 count
|
|
60
60
|
count = firstArg;
|
|
61
|
-
if (secondArg && typeof secondArg ===
|
|
62
|
-
|
|
61
|
+
if (secondArg && typeof secondArg === "object") {
|
|
62
|
+
// 第二个参数是对象,表示额外的数据
|
|
63
63
|
data = secondArg;
|
|
64
64
|
} else {
|
|
65
65
|
data.count = count; // 若没有提供第二个参数,则将 count 添加到数据中
|
|
66
66
|
}
|
|
67
|
-
} else if (typeof firstArg ===
|
|
68
|
-
|
|
67
|
+
} else if (typeof firstArg === "object" && firstArg !== null) {
|
|
68
|
+
// 第一个参数是对象,表示数据
|
|
69
69
|
data = firstArg;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
// 处理复数形式:支持 "no items | one item | {count} items" 格式
|
|
74
|
-
if (text.includes(
|
|
75
|
-
const pluralParts = text.split(
|
|
74
|
+
if (text.includes("|")) {
|
|
75
|
+
const pluralParts = text.split("|").map((part) => part.trim());
|
|
76
76
|
|
|
77
|
-
if (typeof count ===
|
|
77
|
+
if (typeof count === "number") {
|
|
78
78
|
// 使用 count 进行复数处理
|
|
79
79
|
const pluralIndex = getPluralIndex(count);
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ export function t<T>(pattern: T, ...args: any[]): string {
|
|
|
82
82
|
if (pluralIndex < pluralParts.length) {
|
|
83
83
|
text = pluralParts[pluralIndex];
|
|
84
84
|
} else {
|
|
85
|
-
|
|
85
|
+
// 如果索引超出范围,使用最后一个选项
|
|
86
86
|
text = pluralParts[pluralParts.length - 1];
|
|
87
87
|
}
|
|
88
88
|
} else {
|
|
@@ -107,5 +107,5 @@ export function t<T>(pattern: T, ...args: any[]): string {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// 如果不是字符串或函数,返回空字符串
|
|
110
|
-
return
|
|
110
|
+
return "";
|
|
111
111
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useCallback, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 防抖钩子
|
|
5
|
+
* @param fn 要执行的函数
|
|
6
|
+
* @param delay 延迟时间(毫秒)
|
|
7
|
+
* @returns 防抖后的函数
|
|
8
|
+
*/
|
|
9
|
+
export default function useDebounce<T extends (...args: any[]) => any>(
|
|
10
|
+
fn: T,
|
|
11
|
+
delay: number
|
|
12
|
+
): (...args: Parameters<T>) => void {
|
|
13
|
+
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
14
|
+
|
|
15
|
+
return useCallback(
|
|
16
|
+
(...args: Parameters<T>) => {
|
|
17
|
+
if (timeoutRef.current) {
|
|
18
|
+
clearTimeout(timeoutRef.current);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
timeoutRef.current = setTimeout(() => {
|
|
22
|
+
fn(...args);
|
|
23
|
+
}, delay);
|
|
24
|
+
},
|
|
25
|
+
[fn, delay]
|
|
26
|
+
);
|
|
27
|
+
}
|
package/hooks/useLastest.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { useRef } from "react";
|
|
1
|
+
import { useRef, useEffect } from "react";
|
|
2
2
|
|
|
3
3
|
const useLatest = <T>(value: T) => {
|
|
4
4
|
const ref = useRef(value);
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
ref.current = value;
|
|
8
|
+
}, [value]);
|
|
9
|
+
|
|
6
10
|
return ref;
|
|
7
11
|
};
|
|
8
12
|
|
package/index.ts
CHANGED
|
@@ -34,7 +34,7 @@ export * from "./switch";
|
|
|
34
34
|
export * from "./form";
|
|
35
35
|
export * from "./ip-input";
|
|
36
36
|
export * from "./fireworks";
|
|
37
|
-
|
|
37
|
+
export * from "./tooltip";
|
|
38
38
|
export * from "./drawer";
|
|
39
39
|
// export * from './progress';
|
|
40
40
|
// export * from './popconfirm';
|
package/input/Input.tsx
CHANGED
|
@@ -11,6 +11,8 @@ import { StyledProps, TNode, TElement } from "../common";
|
|
|
11
11
|
import { isFunction } from "lodash-es";
|
|
12
12
|
import useConfig from "../hooks/useConfig";
|
|
13
13
|
import { useLocaleReceiver } from "../locale/LocalReceiver";
|
|
14
|
+
import useLengthLimit from "./useLengthLimit";
|
|
15
|
+
|
|
14
16
|
export interface InputProps extends TdInputProps, StyledProps {
|
|
15
17
|
showInput?: boolean; // 控制透传readonly同时是否展示input 默认保留 因为正常Input需要撑开宽度
|
|
16
18
|
keepWrapperWidth?: boolean; // 控制透传autoWidth之后是否容器宽度也自适应 多选等组件需要用到自适应但也需要保留宽度
|
|
@@ -81,6 +83,12 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
81
83
|
onCompositionstart,
|
|
82
84
|
onCompositionend,
|
|
83
85
|
onChange: onChangeFromProps,
|
|
86
|
+
maxlength,
|
|
87
|
+
maxcharacter,
|
|
88
|
+
allowInputOverMax = false,
|
|
89
|
+
status,
|
|
90
|
+
onValidate,
|
|
91
|
+
showLimitNumber = true,
|
|
84
92
|
...restProps
|
|
85
93
|
} = props;
|
|
86
94
|
const composingRef = useRef(false);
|
|
@@ -97,6 +105,16 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
97
105
|
const isInnerInputReadonly = readonly || !allowInput;
|
|
98
106
|
const isValueEnabled = value && !disabled;
|
|
99
107
|
const isShowClearIcon = ((clearable && isValueEnabled) || showClearIconOnEmpty) && isHover;
|
|
108
|
+
|
|
109
|
+
// 使用长度限制 hook
|
|
110
|
+
const { limitNumber, getValueByLimitNumber, tStatus } = useLengthLimit({
|
|
111
|
+
value: value === undefined ? undefined : String(value),
|
|
112
|
+
status,
|
|
113
|
+
maxlength,
|
|
114
|
+
maxcharacter,
|
|
115
|
+
allowInputOverMax,
|
|
116
|
+
onValidate
|
|
117
|
+
});
|
|
100
118
|
let suffixIconNew = suffixIcon;
|
|
101
119
|
if (isShowClearIcon)
|
|
102
120
|
suffixIconNew = (
|
|
@@ -128,6 +146,8 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
128
146
|
const suffixIconContent = renderIcon("t", "suffix", parseTNode(suffixIconNew));
|
|
129
147
|
const labelContent = isFunction(label) ? label() : label;
|
|
130
148
|
const suffixContent = isFunction(suffix) ? suffix() : suffix;
|
|
149
|
+
const limitNumberNode =
|
|
150
|
+
limitNumber && showLimitNumber ? <div className={`${classPrefix}-input__limit-number`}>{limitNumber}</div> : null;
|
|
131
151
|
|
|
132
152
|
const updateInputWidth = () => {
|
|
133
153
|
if (!autoWidth || !inputRef.current) return;
|
|
@@ -167,6 +187,17 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
167
187
|
setRenderType(type);
|
|
168
188
|
}, [type]);
|
|
169
189
|
|
|
190
|
+
// 初始判断长度,如超限自动截断并触发onchange
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
if (value) {
|
|
193
|
+
const limitedValue = getValueByLimitNumber(value);
|
|
194
|
+
if (limitedValue.length !== value.length && !allowInputOverMax) {
|
|
195
|
+
onChange?.(limitedValue, { trigger: "initial" });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
199
|
+
}, []);
|
|
200
|
+
|
|
170
201
|
const innerValue = composingRef.current ? composingValue : value ?? "";
|
|
171
202
|
const formatDisplayValue = format && !isFocused ? format(innerValue) : innerValue;
|
|
172
203
|
|
|
@@ -204,9 +235,10 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
204
235
|
[`${classPrefix}-size-s`]: size === "small",
|
|
205
236
|
[`${classPrefix}-size-l`]: size === "large",
|
|
206
237
|
[`${classPrefix}-align-${align}`]: align,
|
|
207
|
-
[`${classPrefix}-
|
|
208
|
-
[`${classPrefix}-
|
|
209
|
-
[`${classPrefix}-
|
|
238
|
+
[`${classPrefix}-is-${tStatus}`]: tStatus && tStatus !== "default",
|
|
239
|
+
[`${classPrefix}-input--prefix`]: prefixIcon || labelContent,
|
|
240
|
+
[`${classPrefix}-input--suffix`]: suffixIconContent || suffixContent || limitNumberNode,
|
|
241
|
+
[`${classPrefix}-input--borderless`]: borderless,
|
|
210
242
|
[`${classPrefix}-input--focused`]: isFocused
|
|
211
243
|
})}
|
|
212
244
|
onMouseEnter={handleMouseEnter}
|
|
@@ -225,7 +257,12 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
225
257
|
{innerValue || placeholder}
|
|
226
258
|
</span>
|
|
227
259
|
)}
|
|
228
|
-
{suffixContent
|
|
260
|
+
{suffixContent || limitNumberNode ? (
|
|
261
|
+
<div className={`${classPrefix}-input__suffix`}>
|
|
262
|
+
{suffixContent}
|
|
263
|
+
{limitNumberNode}
|
|
264
|
+
</div>
|
|
265
|
+
) : null}
|
|
229
266
|
{suffixIconContent}
|
|
230
267
|
</div>
|
|
231
268
|
);
|
|
@@ -256,17 +293,17 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
256
293
|
trigger: InputContextTrigger = "input"
|
|
257
294
|
) {
|
|
258
295
|
let { value: newStr } = e.currentTarget;
|
|
296
|
+
// 应用长度限制
|
|
297
|
+
const limitedValue = getValueByLimitNumber(newStr);
|
|
259
298
|
if (composingRef.current) {
|
|
260
|
-
setComposingValue(
|
|
299
|
+
setComposingValue(limitedValue);
|
|
261
300
|
} else {
|
|
262
301
|
// 完成中文输入时同步一次 composingValue
|
|
263
|
-
setComposingValue(
|
|
264
|
-
onChange(
|
|
302
|
+
setComposingValue(limitedValue);
|
|
303
|
+
onChange(limitedValue, { e, trigger });
|
|
265
304
|
}
|
|
266
305
|
}
|
|
267
306
|
|
|
268
|
-
// 添加MouseDown阻止冒泡,防止點擊Clear value會導致彈窗閃爍一下
|
|
269
|
-
// https://github.com/Tencent/tdesign-react/issues/2320
|
|
270
307
|
function handleMouseDown(e: React.MouseEvent<HTMLSpanElement, globalThis.MouseEvent>) {
|
|
271
308
|
e.stopPropagation();
|
|
272
309
|
// 兼容React16
|
|
@@ -378,7 +415,13 @@ const Input = forwardRef<HTMLInputElement, InputProps>((originalProps, ref) => {
|
|
|
378
415
|
{...restProps}
|
|
379
416
|
>
|
|
380
417
|
{renderInputNode}
|
|
381
|
-
{tips &&
|
|
418
|
+
{tips && (
|
|
419
|
+
<div
|
|
420
|
+
className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${tStatus || "default"}`)}
|
|
421
|
+
>
|
|
422
|
+
{tips}
|
|
423
|
+
</div>
|
|
424
|
+
)}
|
|
382
425
|
</div>
|
|
383
426
|
);
|
|
384
427
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const AutoWidthInput = () => {
|
|
5
|
+
const [value, setValue] = useState("自适应宽度");
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
8
|
+
<Input autoWidth value={value} onChange={(val) => setValue(val)} placeholder="宽度随内容变化" />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>输入更多内容,输入框会自动变宽</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default AutoWidthInput;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const BorderlessInput = () => (
|
|
5
|
+
<div style={{ display: "flex", gap: "24px", width: "500px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>有边框</div>
|
|
8
|
+
<Input placeholder="有边框" />
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>无边框</div>
|
|
12
|
+
<Input borderless placeholder="无边框" />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export default BorderlessInput;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const ClearableInput = () => {
|
|
5
|
+
const [value, setValue] = useState("可清空的内容");
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
8
|
+
<Input clearable value={value} onChange={(val) => setValue(val)} placeholder="输入内容后显示清除按钮" />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>当前值:{value || "(空)"}</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default ClearableInput;
|