@tendaui/components 1.2.4 → 1.3.0
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/_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 +24 -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 +89 -89
- package/color-picker/utils/color-picker/color.ts +467 -467
- package/color-picker/utils/color-picker/constants.ts +187 -187
- package/color-picker/utils/color-picker/draggable.ts +99 -100
- package/color-picker/utils/color-picker/format.ts +90 -95
- package/color-picker/utils/color-picker/gradient.ts +237 -243
- package/color-picker/utils/color-picker/index.ts +7 -7
- package/color-picker/utils/color-picker/types.ts +33 -33
- 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/dialog/hooks/useDialogPosition.ts +35 -35
- 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/form/type.ts +519 -519
- package/global-config/default-config.ts +95 -95
- package/global-config/locale/ar_KW.ts +259 -270
- package/global-config/locale/en_US.ts +265 -280
- package/global-config/locale/it_IT.ts +264 -287
- package/global-config/locale/ja_JP.ts +264 -279
- package/global-config/locale/ko_KR.ts +264 -279
- package/global-config/locale/ru_RU.ts +277 -288
- package/global-config/locale/zh_CN.ts +265 -279
- package/global-config/locale/zh_TW.ts +265 -279
- package/global-config/mobile/default-config.ts +6 -6
- package/global-config/mobile/locale/ar_KW.ts +112 -113
- package/global-config/mobile/locale/en_US.ts +113 -114
- package/global-config/mobile/locale/it_IT.ts +113 -114
- package/global-config/mobile/locale/ja_JP.ts +100 -101
- package/global-config/mobile/locale/ko_KR.ts +100 -101
- package/global-config/mobile/locale/ru_RU.ts +112 -113
- package/global-config/mobile/locale/zh_CN.ts +100 -101
- package/global-config/mobile/locale/zh_TW.ts +100 -101
- package/global-config/t.ts +111 -111
- 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/InputNumber.tsx +124 -124
- 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/input-number/defaultProps.ts +17 -17
- package/input-number/index.ts +9 -9
- package/input-number/style/css.js +1 -1
- package/input-number/style/index.js +1 -1
- package/input-number/useInputNumber.tsx +270 -270
- 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/ListItem.tsx +36 -36
- package/list/ListItemMeta.tsx +40 -40
- 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/list/defaultProps.ts +11 -11
- package/list/hooks/useListVirtualScroll.ts +82 -82
- package/list/style/css.js +1 -1
- package/list/style/index.js +1 -1
- 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/locale/LocalReceiver.ts +55 -55
- package/locale/ar_KW.ts +7 -7
- package/locale/en_US.ts +7 -7
- package/locale/it_IT.ts +6 -6
- package/locale/ja_JP.ts +6 -6
- package/locale/ko_KR.ts +6 -6
- package/locale/ru_RU.ts +6 -6
- package/locale/zh_CN.ts +5 -5
- package/locale/zh_TW.ts +7 -7
- 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/select/type.ts +382 -382
- package/select-input/type.ts +280 -280
- package/slider/Slider.tsx +13 -5
- package/slider/SliderHandleButton.tsx +50 -50
- 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/defaultProps.ts +15 -15
- package/slider/style/css.js +1 -1
- package/slider/style/index.js +1 -1
- package/slider/type.ts +1 -1
- package/styles/_global.scss +40 -40
- package/styles/_vars.scss +374 -358
- package/styles/components/alert/_index.scss +175 -175
- package/styles/components/alert/_vars.scss +41 -41
- package/styles/components/badge/_index.scss +71 -71
- package/styles/components/badge/_vars.scss +26 -26
- package/styles/components/button/_index.scss +499 -499
- package/styles/components/button/_mixins.scss +40 -40
- package/styles/components/button/_vars.scss +121 -121
- package/styles/components/checkbox/_index.scss +158 -158
- package/styles/components/checkbox/_var.scss +59 -59
- package/styles/components/color-picker/_index.scss +586 -586
- package/styles/components/color-picker/_vars.scss +79 -79
- package/styles/components/dialog/_animate.scss +133 -133
- package/styles/components/dialog/_index.scss +310 -312
- package/styles/components/dialog/_vars.scss +60 -60
- package/styles/components/drawer/_index.scss +206 -205
- package/styles/components/drawer/_var.scss +55 -55
- package/styles/components/fireworks/_index.scss +86 -86
- package/styles/components/fireworks/_vars.scss +5 -5
- package/styles/components/form/_index.scss +175 -174
- package/styles/components/form/_mixins.scss +74 -74
- package/styles/components/form/_vars.scss +101 -101
- package/styles/components/input/_index.scss +350 -350
- package/styles/components/input/_mixins.scss +120 -118
- package/styles/components/input/_vars.scss +130 -130
- package/styles/components/input-number/_index.scss +340 -339
- package/styles/components/input-number/_vars.scss +56 -56
- package/styles/components/ip-input/_index.scss +277 -277
- package/styles/components/layout/_index.scss +47 -47
- package/styles/components/layout/_vars.scss +19 -19
- package/styles/components/layout/doc.scss +74 -74
- package/styles/components/list/_index.scss +172 -172
- package/styles/components/list/_vars.scss +42 -42
- package/styles/components/loading/_index.scss +113 -113
- package/styles/components/loading/_vars.scss +40 -40
- package/styles/components/notification/_index.scss +144 -144
- package/styles/components/notification/_mixins.scss +13 -13
- package/styles/components/notification/_vars.scss +60 -60
- package/styles/components/popup/_index.scss +78 -78
- package/styles/components/popup/_mixin.scss +149 -149
- package/styles/components/popup/_vars.scss +33 -33
- package/styles/components/radio/_index.scss +376 -376
- package/styles/components/radio/_vars.scss +89 -89
- package/styles/components/select/_index.scss +291 -291
- package/styles/components/select/_var.scss +64 -64
- package/styles/components/select-input/_index.scss +5 -5
- package/styles/components/select-input/_var.scss +4 -4
- package/styles/components/slider/_index.scss +241 -241
- package/styles/components/slider/_vars.scss +51 -51
- package/styles/components/switch/_index.scss +248 -165
- package/styles/components/switch/_vars.scss +63 -63
- package/styles/components/table/_index.scss +194 -186
- package/styles/components/table/_var.scss +52 -52
- package/styles/components/tabs/_index.scss +165 -166
- package/styles/components/tabs/_mixins.scss +11 -11
- package/styles/components/tabs/_vars.scss +72 -72
- package/styles/components/tag/_index.scss +317 -317
- package/styles/components/tag/_var.scss +86 -86
- package/styles/components/tag-input/_index.scss +164 -164
- package/styles/components/tag-input/_vars.scss +17 -17
- package/styles/components/tooltip/_index.scss +104 -0
- package/styles/components/tooltip/_vars.scss +23 -0
- package/styles/mixins/_focus.scss +8 -8
- package/styles/mixins/_layout.scss +32 -32
- package/styles/mixins/_reset.scss +11 -11
- package/styles/mixins/_scrollbar.scss +32 -32
- package/styles/mixins/_text.scss +50 -50
- package/styles/themes/_dark.scss +169 -169
- package/styles/themes/_font.scss +69 -69
- package/styles/themes/_index.scss +5 -5
- package/styles/themes/_light.scss +170 -170
- package/styles/themes/_radius.scss +9 -9
- package/styles/themes/_size.scss +68 -68
- package/styles/utilities/_animation.scss +58 -58
- package/styles/utilities/_tips.scss +10 -10
- 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/input-number/large-number.ts +423 -423
- package/utils/input-number/number.ts +257 -257
- package/utils/log/index.ts +3 -3
- package/utils/log/log.ts +29 -30
- package/utils/log/types.ts +9 -12
- package/utils/style.ts +58 -58
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
import { isNumber } from 'lodash-es';
|
|
3
|
+
import { TdInputProps } from './type';
|
|
4
|
+
|
|
5
|
+
// 计算字符长度,中文算两个字符
|
|
6
|
+
function getCharacterLength(str: string): number;
|
|
7
|
+
function getCharacterLength(str: string, maxCharacter?: number): { length: number; characters: string }
|
|
8
|
+
function getCharacterLength(str: string, maxCharacter?: number) {
|
|
9
|
+
const hasMaxCharacter = isNumber(maxCharacter);
|
|
10
|
+
if (!str || str.length === 0) {
|
|
11
|
+
if (hasMaxCharacter) {
|
|
12
|
+
return {
|
|
13
|
+
length: 0,
|
|
14
|
+
characters: str,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
let len = 0;
|
|
20
|
+
for (let i = 0; i < str.length; i++) {
|
|
21
|
+
let currentStringLength = 0;
|
|
22
|
+
if (str.charCodeAt(i) > 127) {
|
|
23
|
+
currentStringLength = 2;
|
|
24
|
+
} else {
|
|
25
|
+
currentStringLength = 1;
|
|
26
|
+
}
|
|
27
|
+
if (hasMaxCharacter && len + currentStringLength > maxCharacter) {
|
|
28
|
+
return {
|
|
29
|
+
length: len,
|
|
30
|
+
characters: str.slice(0, i),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
len += currentStringLength;
|
|
34
|
+
}
|
|
35
|
+
if (hasMaxCharacter) {
|
|
36
|
+
return {
|
|
37
|
+
length: len,
|
|
38
|
+
characters: str,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return len;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 计算 Unicode 长度
|
|
45
|
+
function getUnicodeLength(str: string): number {
|
|
46
|
+
return Array.from(str).length;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 限制 Unicode 最大长度
|
|
50
|
+
function limitUnicodeMaxLength(str: string, maxLength: number): string {
|
|
51
|
+
return Array.from(str).slice(0, maxLength).join('');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface UseLengthLimitParams {
|
|
55
|
+
value: string | undefined;
|
|
56
|
+
maxlength: number;
|
|
57
|
+
maxcharacter: number;
|
|
58
|
+
allowInputOverMax: boolean;
|
|
59
|
+
status: TdInputProps['status'];
|
|
60
|
+
onValidate: TdInputProps['onValidate'];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export default function useLengthLimit(params: UseLengthLimitParams) {
|
|
64
|
+
// 文本超出数量限制时,是否允许继续输入
|
|
65
|
+
const getValueByLimitNumber = (inputValue: string) => {
|
|
66
|
+
const { allowInputOverMax, maxlength, maxcharacter } = params;
|
|
67
|
+
if (!(maxlength || maxcharacter) || allowInputOverMax || !inputValue) return inputValue;
|
|
68
|
+
if (maxlength) {
|
|
69
|
+
// input value could be unicode 😊
|
|
70
|
+
return limitUnicodeMaxLength(inputValue, maxlength);
|
|
71
|
+
}
|
|
72
|
+
if (maxcharacter) {
|
|
73
|
+
const r = getCharacterLength(inputValue, maxcharacter);
|
|
74
|
+
if (typeof r === 'object') {
|
|
75
|
+
return r.characters;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return inputValue;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const limitNumber = useMemo(() => {
|
|
82
|
+
const { maxlength, maxcharacter, value } = params;
|
|
83
|
+
if (typeof value === 'number') return String(value);
|
|
84
|
+
if (maxlength && maxcharacter) {
|
|
85
|
+
console.warn('Input', 'Pick one of maxlength and maxcharacter please.');
|
|
86
|
+
}
|
|
87
|
+
if (maxlength) {
|
|
88
|
+
const length = value?.length ? getUnicodeLength(value) : 0;
|
|
89
|
+
return `${length}/${maxlength}`;
|
|
90
|
+
}
|
|
91
|
+
if (maxcharacter) {
|
|
92
|
+
return `${getCharacterLength(value || '')}/${maxcharacter}`;
|
|
93
|
+
}
|
|
94
|
+
return '';
|
|
95
|
+
}, [params.maxcharacter, params.maxlength, params.value]);
|
|
96
|
+
|
|
97
|
+
const innerStatus = useMemo(() => {
|
|
98
|
+
if (limitNumber) {
|
|
99
|
+
const [current, total] = limitNumber.split('/');
|
|
100
|
+
return Number(current) > Number(total) ? 'error' : '';
|
|
101
|
+
}
|
|
102
|
+
return '';
|
|
103
|
+
}, [limitNumber]);
|
|
104
|
+
|
|
105
|
+
const tStatus = useMemo(() => params.status || innerStatus, [params.status, innerStatus]);
|
|
106
|
+
|
|
107
|
+
const onValidateChange = () => {
|
|
108
|
+
params.onValidate?.({
|
|
109
|
+
error: innerStatus ? 'exceed-maximum' : undefined,
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
onValidateChange();
|
|
115
|
+
}, [innerStatus]);
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
tStatus,
|
|
119
|
+
limitNumber,
|
|
120
|
+
getValueByLimitNumber,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import React, { forwardRef, useImperativeHandle, useRef, ForwardedRef } from "react";
|
|
2
|
-
import {
|
|
3
|
-
IconChevronDown as TdChevronDownIcon,
|
|
4
|
-
IconMinusStroked as TdRemoveIcon,
|
|
5
|
-
IconChevronUp as TdChevronUpIcon,
|
|
6
|
-
IconPlus as TdAddIcon
|
|
7
|
-
} from "@tendaui/icons";
|
|
8
|
-
import classNames from "classnames";
|
|
9
|
-
import Input from "../input";
|
|
10
|
-
import Button from "../button";
|
|
11
|
-
import useInputNumber from "./useInputNumber";
|
|
12
|
-
import useGlobalIcon from "../hooks/useGlobalIcon";
|
|
13
|
-
import { inputNumberDefaultProps } from "./defaultProps";
|
|
14
|
-
import { InputNumberValue, TdInputNumberProps } from "./type";
|
|
15
|
-
import { StyledProps } from "../common";
|
|
16
|
-
import useDefaultProps from "../hooks/useDefaultProps";
|
|
17
|
-
|
|
18
|
-
export interface InputNumberProps<T = InputNumberValue> extends TdInputNumberProps<T>, StyledProps {}
|
|
19
|
-
|
|
20
|
-
export interface InputNumberRef {
|
|
21
|
-
currentElement: ForwardedRef<HTMLDivElement>;
|
|
22
|
-
inputElement: ForwardedRef<HTMLDivElement>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// https://fettblog.eu/typescript-react-generic-forward-refs/
|
|
26
|
-
function TdInputNumber<T extends InputNumberValue = InputNumberValue>(
|
|
27
|
-
originalProps: InputNumberProps<T>,
|
|
28
|
-
ref: ForwardedRef<InputNumberRef>
|
|
29
|
-
) {
|
|
30
|
-
const { ChevronDownIcon, RemoveIcon, ChevronUpIcon, AddIcon } = useGlobalIcon({
|
|
31
|
-
ChevronDownIcon: TdChevronDownIcon,
|
|
32
|
-
RemoveIcon: TdRemoveIcon,
|
|
33
|
-
ChevronUpIcon: TdChevronUpIcon,
|
|
34
|
-
AddIcon: TdAddIcon
|
|
35
|
-
});
|
|
36
|
-
const props = useDefaultProps<InputNumberProps<T>>(
|
|
37
|
-
originalProps,
|
|
38
|
-
inputNumberDefaultProps as Partial<InputNumberProps<T>>
|
|
39
|
-
);
|
|
40
|
-
const {
|
|
41
|
-
classPrefix,
|
|
42
|
-
wrapClasses,
|
|
43
|
-
addClasses,
|
|
44
|
-
reduceClasses,
|
|
45
|
-
listeners,
|
|
46
|
-
isError,
|
|
47
|
-
inputRef,
|
|
48
|
-
userInput,
|
|
49
|
-
handleAdd,
|
|
50
|
-
handleReduce,
|
|
51
|
-
onInnerInputChange
|
|
52
|
-
} = useInputNumber(props);
|
|
53
|
-
|
|
54
|
-
const wrapRef = useRef(null);
|
|
55
|
-
|
|
56
|
-
const status = isError ? "error" : props.status;
|
|
57
|
-
const iconSize = props.size === "medium" ? "default" : props.size;
|
|
58
|
-
const addIcon =
|
|
59
|
-
props.theme === "column" ? <ChevronUpIcon size={iconSize as any} /> : <AddIcon size={iconSize as any} />;
|
|
60
|
-
const reduceIcon =
|
|
61
|
-
props.theme === "column" ? <ChevronDownIcon size={iconSize as any} /> : <RemoveIcon size={iconSize as any} />;
|
|
62
|
-
|
|
63
|
-
useImperativeHandle(ref, () => ({
|
|
64
|
-
currentElement: wrapRef.current,
|
|
65
|
-
inputElement: inputRef.current
|
|
66
|
-
}));
|
|
67
|
-
|
|
68
|
-
return (
|
|
69
|
-
<div className={classNames(wrapClasses, props.className)} style={props.style} ref={wrapRef}>
|
|
70
|
-
{props.theme !== "normal" && (
|
|
71
|
-
<Button
|
|
72
|
-
className={reduceClasses}
|
|
73
|
-
disabled={props.disabled}
|
|
74
|
-
onClick={handleReduce}
|
|
75
|
-
variant="outline"
|
|
76
|
-
shape="square"
|
|
77
|
-
icon={reduceIcon}
|
|
78
|
-
/>
|
|
79
|
-
)}
|
|
80
|
-
<Input
|
|
81
|
-
ref={inputRef}
|
|
82
|
-
autocomplete="off"
|
|
83
|
-
disabled={props.disabled}
|
|
84
|
-
readonly={props.readonly}
|
|
85
|
-
placeholder={props.placeholder}
|
|
86
|
-
autoWidth={props.autoWidth}
|
|
87
|
-
align={props.align || (props.theme === "row" ? "center" : undefined)}
|
|
88
|
-
status={status}
|
|
89
|
-
label={props.label}
|
|
90
|
-
suffix={props.suffix}
|
|
91
|
-
value={userInput}
|
|
92
|
-
onChange={onInnerInputChange}
|
|
93
|
-
size={props.size}
|
|
94
|
-
{...listeners}
|
|
95
|
-
{...(props.inputProps || {})}
|
|
96
|
-
/>
|
|
97
|
-
{props.theme !== "normal" && (
|
|
98
|
-
<Button
|
|
99
|
-
className={addClasses}
|
|
100
|
-
disabled={props.disabled}
|
|
101
|
-
onClick={handleAdd}
|
|
102
|
-
variant="outline"
|
|
103
|
-
shape="square"
|
|
104
|
-
icon={addIcon}
|
|
105
|
-
/>
|
|
106
|
-
)}
|
|
107
|
-
{props.tips && (
|
|
108
|
-
<div className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${status}`)}>
|
|
109
|
-
{props.tips}
|
|
110
|
-
</div>
|
|
111
|
-
)}
|
|
112
|
-
</div>
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export type InputNumberOuterForwardRef = {
|
|
117
|
-
<T>(props: InputNumberProps<T> & { ref?: ForwardedRef<InputNumberRef> }): ReturnType<typeof TdInputNumber>;
|
|
118
|
-
} & React.ForwardRefExoticComponent<InputNumberProps>;
|
|
119
|
-
|
|
120
|
-
const InputNumber = forwardRef<InputNumberRef, InputNumberProps<InputNumberValue>>(TdInputNumber);
|
|
121
|
-
|
|
122
|
-
InputNumber.displayName = "InputNumber";
|
|
123
|
-
|
|
124
|
-
export default InputNumber;
|
|
1
|
+
import React, { forwardRef, useImperativeHandle, useRef, ForwardedRef } from "react";
|
|
2
|
+
import {
|
|
3
|
+
IconChevronDown as TdChevronDownIcon,
|
|
4
|
+
IconMinusStroked as TdRemoveIcon,
|
|
5
|
+
IconChevronUp as TdChevronUpIcon,
|
|
6
|
+
IconPlus as TdAddIcon
|
|
7
|
+
} from "@tendaui/icons";
|
|
8
|
+
import classNames from "classnames";
|
|
9
|
+
import Input from "../input";
|
|
10
|
+
import Button from "../button";
|
|
11
|
+
import useInputNumber from "./useInputNumber";
|
|
12
|
+
import useGlobalIcon from "../hooks/useGlobalIcon";
|
|
13
|
+
import { inputNumberDefaultProps } from "./defaultProps";
|
|
14
|
+
import { InputNumberValue, TdInputNumberProps } from "./type";
|
|
15
|
+
import { StyledProps } from "../common";
|
|
16
|
+
import useDefaultProps from "../hooks/useDefaultProps";
|
|
17
|
+
|
|
18
|
+
export interface InputNumberProps<T = InputNumberValue> extends TdInputNumberProps<T>, StyledProps {}
|
|
19
|
+
|
|
20
|
+
export interface InputNumberRef {
|
|
21
|
+
currentElement: ForwardedRef<HTMLDivElement>;
|
|
22
|
+
inputElement: ForwardedRef<HTMLDivElement>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// https://fettblog.eu/typescript-react-generic-forward-refs/
|
|
26
|
+
function TdInputNumber<T extends InputNumberValue = InputNumberValue>(
|
|
27
|
+
originalProps: InputNumberProps<T>,
|
|
28
|
+
ref: ForwardedRef<InputNumberRef>
|
|
29
|
+
) {
|
|
30
|
+
const { ChevronDownIcon, RemoveIcon, ChevronUpIcon, AddIcon } = useGlobalIcon({
|
|
31
|
+
ChevronDownIcon: TdChevronDownIcon,
|
|
32
|
+
RemoveIcon: TdRemoveIcon,
|
|
33
|
+
ChevronUpIcon: TdChevronUpIcon,
|
|
34
|
+
AddIcon: TdAddIcon
|
|
35
|
+
});
|
|
36
|
+
const props = useDefaultProps<InputNumberProps<T>>(
|
|
37
|
+
originalProps,
|
|
38
|
+
inputNumberDefaultProps as Partial<InputNumberProps<T>>
|
|
39
|
+
);
|
|
40
|
+
const {
|
|
41
|
+
classPrefix,
|
|
42
|
+
wrapClasses,
|
|
43
|
+
addClasses,
|
|
44
|
+
reduceClasses,
|
|
45
|
+
listeners,
|
|
46
|
+
isError,
|
|
47
|
+
inputRef,
|
|
48
|
+
userInput,
|
|
49
|
+
handleAdd,
|
|
50
|
+
handleReduce,
|
|
51
|
+
onInnerInputChange
|
|
52
|
+
} = useInputNumber(props);
|
|
53
|
+
|
|
54
|
+
const wrapRef = useRef(null);
|
|
55
|
+
|
|
56
|
+
const status = isError ? "error" : props.status;
|
|
57
|
+
const iconSize = props.size === "medium" ? "default" : props.size;
|
|
58
|
+
const addIcon =
|
|
59
|
+
props.theme === "column" ? <ChevronUpIcon size={iconSize as any} /> : <AddIcon size={iconSize as any} />;
|
|
60
|
+
const reduceIcon =
|
|
61
|
+
props.theme === "column" ? <ChevronDownIcon size={iconSize as any} /> : <RemoveIcon size={iconSize as any} />;
|
|
62
|
+
|
|
63
|
+
useImperativeHandle(ref, () => ({
|
|
64
|
+
currentElement: wrapRef.current,
|
|
65
|
+
inputElement: inputRef.current
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<div className={classNames(wrapClasses, props.className)} style={props.style} ref={wrapRef}>
|
|
70
|
+
{props.theme !== "normal" && (
|
|
71
|
+
<Button
|
|
72
|
+
className={reduceClasses}
|
|
73
|
+
disabled={props.disabled}
|
|
74
|
+
onClick={handleReduce}
|
|
75
|
+
variant="outline"
|
|
76
|
+
shape="square"
|
|
77
|
+
icon={reduceIcon}
|
|
78
|
+
/>
|
|
79
|
+
)}
|
|
80
|
+
<Input
|
|
81
|
+
ref={inputRef}
|
|
82
|
+
autocomplete="off"
|
|
83
|
+
disabled={props.disabled}
|
|
84
|
+
readonly={props.readonly}
|
|
85
|
+
placeholder={props.placeholder}
|
|
86
|
+
autoWidth={props.autoWidth}
|
|
87
|
+
align={props.align || (props.theme === "row" ? "center" : undefined)}
|
|
88
|
+
status={status}
|
|
89
|
+
label={props.label}
|
|
90
|
+
suffix={props.suffix}
|
|
91
|
+
value={userInput}
|
|
92
|
+
onChange={onInnerInputChange}
|
|
93
|
+
size={props.size}
|
|
94
|
+
{...listeners}
|
|
95
|
+
{...(props.inputProps || {})}
|
|
96
|
+
/>
|
|
97
|
+
{props.theme !== "normal" && (
|
|
98
|
+
<Button
|
|
99
|
+
className={addClasses}
|
|
100
|
+
disabled={props.disabled}
|
|
101
|
+
onClick={handleAdd}
|
|
102
|
+
variant="outline"
|
|
103
|
+
shape="square"
|
|
104
|
+
icon={addIcon}
|
|
105
|
+
/>
|
|
106
|
+
)}
|
|
107
|
+
{props.tips && (
|
|
108
|
+
<div className={classNames(`${classPrefix}-input__tips`, `${classPrefix}-input__tips--${status}`)}>
|
|
109
|
+
{props.tips}
|
|
110
|
+
</div>
|
|
111
|
+
)}
|
|
112
|
+
</div>
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export type InputNumberOuterForwardRef = {
|
|
117
|
+
<T>(props: InputNumberProps<T> & { ref?: ForwardedRef<InputNumberRef> }): ReturnType<typeof TdInputNumber>;
|
|
118
|
+
} & React.ForwardRefExoticComponent<InputNumberProps>;
|
|
119
|
+
|
|
120
|
+
const InputNumber = forwardRef<InputNumberRef, InputNumberProps<InputNumberValue>>(TdInputNumber);
|
|
121
|
+
|
|
122
|
+
InputNumber.displayName = "InputNumber";
|
|
123
|
+
|
|
124
|
+
export default InputNumber;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const AlignInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
6
|
+
<div style={{ display: "flex", gap: "16px" }}>
|
|
7
|
+
<div>
|
|
8
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>左对齐</div>
|
|
9
|
+
<InputNumber align="left" defaultValue={100} />
|
|
10
|
+
</div>
|
|
11
|
+
<div>
|
|
12
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>居中对齐</div>
|
|
13
|
+
<InputNumber align="center" defaultValue={200} />
|
|
14
|
+
</div>
|
|
15
|
+
<div>
|
|
16
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>右对齐</div>
|
|
17
|
+
<InputNumber align="right" defaultValue={300} />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
export default AlignInputNumber;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React, { useState, useMemo } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
type InputNumberValue = string | number;
|
|
5
|
+
type ErrorType = "exceed-maximum" | "below-minimum";
|
|
6
|
+
|
|
7
|
+
const EventsInputNumber = () => {
|
|
8
|
+
const [value, setValue] = useState<InputNumberValue>(100);
|
|
9
|
+
const [error, setError] = useState<ErrorType>();
|
|
10
|
+
|
|
11
|
+
const tips = useMemo(() => {
|
|
12
|
+
if (error === "exceed-maximum") return "数值不能超过最大值";
|
|
13
|
+
if (error === "below-minimum") return "数值不能小于最小值";
|
|
14
|
+
return undefined;
|
|
15
|
+
}, [error]);
|
|
16
|
+
|
|
17
|
+
const handleChange = (v: InputNumberValue, ctx: any) => {
|
|
18
|
+
console.info("change", v, ctx);
|
|
19
|
+
setValue(v);
|
|
20
|
+
};
|
|
21
|
+
const onValidate = (ctx: { error: ErrorType }) => {
|
|
22
|
+
setError(ctx.error);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
27
|
+
<InputNumber
|
|
28
|
+
value={value}
|
|
29
|
+
max={15}
|
|
30
|
+
min={-2}
|
|
31
|
+
inputProps={{ tips }}
|
|
32
|
+
suffix="个"
|
|
33
|
+
style={{ width: 300 }}
|
|
34
|
+
onChange={handleChange}
|
|
35
|
+
onValidate={onValidate}
|
|
36
|
+
onBlur={(v, ctx) => console.info("blur", v, ctx)}
|
|
37
|
+
onFocus={(v, ctx) => console.info("focus", v, ctx)}
|
|
38
|
+
onEnter={(v, ctx) => console.info("enter", v, ctx)}
|
|
39
|
+
/>
|
|
40
|
+
<div style={{ color: "#666", fontSize: "12px" }}>范围: -2 ~ 15, 查看控制台输出</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export default EventsInputNumber;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const FormatInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(50);
|
|
6
|
+
const [value2, setValue2] = useState(1000);
|
|
7
|
+
return (
|
|
8
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
9
|
+
<div>
|
|
10
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>百分比格式</div>
|
|
11
|
+
<InputNumber format={(val) => `${val} %`} value={value} onChange={setValue} style={{ width: 250 }} />
|
|
12
|
+
</div>
|
|
13
|
+
<div>
|
|
14
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>货币格式(保留2位小数)</div>
|
|
15
|
+
<InputNumber
|
|
16
|
+
decimalPlaces={2}
|
|
17
|
+
format={(_, { fixedNumber }) => `¥ ${fixedNumber}`}
|
|
18
|
+
value={value2}
|
|
19
|
+
onChange={setValue2}
|
|
20
|
+
style={{ width: 250 }}
|
|
21
|
+
/>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default FormatInputNumber;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const LargeNumberInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>大整数</div>
|
|
8
|
+
<InputNumber defaultValue="19999999999999999" largeNumber decimalPlaces={2} step={1} style={{ width: 350 }} />
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>大小数</div>
|
|
12
|
+
<InputNumber defaultValue="0.8975527383412673418" largeNumber step={0.888} style={{ width: 350 }} />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export default LargeNumberInputNumber;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const MinMaxInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(5);
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
8
|
+
<InputNumber min={0} max={10} value={value} onChange={setValue} />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>范围: 0 ~ 10, 当前值: {value}</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default MinMaxInputNumber;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const SizesInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
6
|
+
<div style={{ display: "flex", gap: "16px", alignItems: "flex-start" }}>
|
|
7
|
+
<div>
|
|
8
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>row 主题</div>
|
|
9
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
10
|
+
<InputNumber size="small" defaultValue={3} />
|
|
11
|
+
<InputNumber size="medium" defaultValue={6} />
|
|
12
|
+
<InputNumber size="large" defaultValue={9} />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
<div>
|
|
16
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>column 主题</div>
|
|
17
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
18
|
+
<InputNumber theme="column" size="small" defaultValue={3} />
|
|
19
|
+
<InputNumber theme="column" size="medium" defaultValue={6} />
|
|
20
|
+
<InputNumber theme="column" size="large" defaultValue={9} />
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div>
|
|
24
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>normal 主题</div>
|
|
25
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
26
|
+
<InputNumber theme="normal" size="small" defaultValue={3} />
|
|
27
|
+
<InputNumber theme="normal" size="medium" defaultValue={6} />
|
|
28
|
+
<InputNumber theme="normal" size="large" defaultValue={9} />
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
export default SizesInputNumber;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
import { Form } from "../../form";
|
|
4
|
+
import { Radio } from "../../radio";
|
|
5
|
+
|
|
6
|
+
const { FormItem } = Form;
|
|
7
|
+
|
|
8
|
+
type AlignType = "hide" | "align-left" | "align-input";
|
|
9
|
+
|
|
10
|
+
const StatusInputNumber = () => {
|
|
11
|
+
const [type, setType] = useState<AlignType>("align-input");
|
|
12
|
+
return (
|
|
13
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
14
|
+
<Radio.Group value={type} onChange={(val: AlignType) => setType(val)} variant="default-filled">
|
|
15
|
+
<Radio.Button value="hide">隐藏文本提示</Radio.Button>
|
|
16
|
+
<Radio.Button value="align-left">文本提示左对齐</Radio.Button>
|
|
17
|
+
<Radio.Button value="align-input">文本提示对齐输入框</Radio.Button>
|
|
18
|
+
</Radio.Group>
|
|
19
|
+
|
|
20
|
+
<Form>
|
|
21
|
+
{type === "hide" && (
|
|
22
|
+
<>
|
|
23
|
+
<FormItem label="禁用">
|
|
24
|
+
<InputNumber style={{ width: 300 }} disabled />
|
|
25
|
+
</FormItem>
|
|
26
|
+
<FormItem label="只读">
|
|
27
|
+
<InputNumber style={{ width: 300 }} readonly />
|
|
28
|
+
</FormItem>
|
|
29
|
+
<FormItem label="正常">
|
|
30
|
+
<InputNumber style={{ width: 300 }} />
|
|
31
|
+
</FormItem>
|
|
32
|
+
<FormItem label="成功">
|
|
33
|
+
<InputNumber style={{ width: 300 }} status="success" />
|
|
34
|
+
</FormItem>
|
|
35
|
+
<FormItem label="警告">
|
|
36
|
+
<InputNumber style={{ width: 300 }} status="warning" />
|
|
37
|
+
</FormItem>
|
|
38
|
+
<FormItem label="错误">
|
|
39
|
+
<InputNumber style={{ width: 300 }} status="error" />
|
|
40
|
+
</FormItem>
|
|
41
|
+
</>
|
|
42
|
+
)}
|
|
43
|
+
|
|
44
|
+
{(type === "align-left" || type === "align-input") && (
|
|
45
|
+
<>
|
|
46
|
+
<FormItem label="正常提示">
|
|
47
|
+
<InputNumber style={{ width: 300 }} tips="这是普通文本提示" />
|
|
48
|
+
</FormItem>
|
|
49
|
+
<FormItem label="成功提示">
|
|
50
|
+
<InputNumber style={{ width: 300 }} status="success" tips="校验通过文本提示" />
|
|
51
|
+
</FormItem>
|
|
52
|
+
<FormItem label="警告提示">
|
|
53
|
+
<InputNumber style={{ width: 300 }} status="warning" tips="校验不通过文本提示" />
|
|
54
|
+
</FormItem>
|
|
55
|
+
<FormItem label="错误提示">
|
|
56
|
+
<InputNumber style={{ width: 300 }} status="error" tips="校验存在严重问题文本提示" />
|
|
57
|
+
</FormItem>
|
|
58
|
+
</>
|
|
59
|
+
)}
|
|
60
|
+
</Form>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export default StatusInputNumber;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const StepAndDecimalInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(3.2);
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
8
|
+
<InputNumber step={1.2} decimalPlaces={2} value={value} onChange={setValue} />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>步长: 1.2, 保留2位小数, 当前值: {value}</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default StepAndDecimalInputNumber;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const ThemesInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>row - 横向按钮(默认)</div>
|
|
8
|
+
<InputNumber theme="row" defaultValue={5} />
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>column - 纵向按钮</div>
|
|
12
|
+
<InputNumber theme="column" defaultValue={5} />
|
|
13
|
+
</div>
|
|
14
|
+
<div>
|
|
15
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>normal - 无按钮</div>
|
|
16
|
+
<InputNumber theme="normal" defaultValue={5} />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export default ThemesInputNumber;
|