@tendaui/components 1.2.3 → 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 -39
- package/styles/_vars.scss +374 -358
- package/styles/components/alert/_index.scss +175 -175
- package/styles/components/alert/_vars.scss +41 -39
- package/styles/components/badge/_index.scss +71 -70
- package/styles/components/badge/_vars.scss +26 -25
- package/styles/components/button/_index.scss +499 -499
- package/styles/components/button/_mixins.scss +40 -39
- package/styles/components/button/_vars.scss +121 -120
- package/styles/components/checkbox/_index.scss +158 -158
- package/styles/components/checkbox/_var.scss +59 -60
- package/styles/components/color-picker/_index.scss +586 -586
- package/styles/components/color-picker/_vars.scss +79 -84
- package/styles/components/dialog/_animate.scss +133 -135
- package/styles/components/dialog/_index.scss +310 -311
- package/styles/components/dialog/_vars.scss +60 -59
- package/styles/components/drawer/_index.scss +206 -205
- package/styles/components/drawer/_var.scss +55 -53
- package/styles/components/fireworks/_index.scss +86 -86
- package/styles/components/fireworks/_vars.scss +5 -4
- package/styles/components/form/_index.scss +175 -173
- package/styles/components/form/_mixins.scss +74 -76
- package/styles/components/form/_vars.scss +101 -100
- package/styles/components/input/_index.scss +350 -349
- package/styles/components/input/_mixins.scss +120 -116
- package/styles/components/input/_vars.scss +130 -134
- package/styles/components/input-number/_index.scss +342 -343
- package/styles/components/input-number/_vars.scss +56 -65
- package/styles/components/ip-input/_index.scss +277 -280
- package/styles/components/layout/_index.scss +47 -47
- package/styles/components/layout/_vars.scss +19 -18
- package/styles/components/layout/doc.scss +74 -74
- package/styles/components/list/_index.scss +172 -172
- package/styles/components/list/_vars.scss +42 -41
- package/styles/components/loading/_index.scss +113 -112
- package/styles/components/loading/_vars.scss +40 -39
- package/styles/components/notification/_index.scss +144 -143
- package/styles/components/notification/_mixins.scss +13 -12
- package/styles/components/notification/_vars.scss +60 -59
- package/styles/components/popup/_index.scss +78 -82
- package/styles/components/popup/_mixin.scss +149 -149
- package/styles/components/popup/{_var.scss → _vars.scss} +33 -31
- package/styles/components/radio/_index.scss +376 -376
- package/styles/components/radio/{_var.scss → _vars.scss} +89 -92
- package/styles/components/select/_index.scss +291 -290
- package/styles/components/select/_var.scss +64 -65
- package/styles/components/select-input/_index.scss +5 -5
- package/styles/components/select-input/_var.scss +4 -3
- package/styles/components/slider/_index.scss +241 -241
- package/styles/components/slider/_vars.scss +51 -50
- package/styles/components/switch/_index.scss +248 -164
- package/styles/components/switch/_vars.scss +63 -61
- package/styles/components/table/_index.scss +194 -193
- package/styles/components/table/_var.scss +52 -52
- package/styles/components/tabs/_index.scss +165 -165
- package/styles/components/tabs/_mixins.scss +11 -11
- package/styles/components/tabs/_vars.scss +72 -71
- package/styles/components/tag/_index.scss +317 -316
- package/styles/components/tag/_var.scss +86 -85
- package/styles/components/tag-input/_index.scss +164 -163
- package/styles/components/tag-input/_vars.scss +17 -16
- package/styles/components/tooltip/_index.scss +104 -0
- package/styles/components/tooltip/_vars.scss +23 -0
- package/styles/mixins/_focus.scss +8 -7
- package/styles/mixins/_layout.scss +32 -32
- package/styles/mixins/_reset.scss +11 -10
- package/styles/mixins/_scrollbar.scss +32 -31
- package/styles/mixins/_text.scss +50 -48
- package/styles/themes/_dark.scss +169 -191
- package/styles/themes/_font.scss +69 -69
- package/styles/themes/_index.scss +5 -5
- package/styles/themes/_light.scss +170 -190
- package/styles/themes/_radius.scss +9 -9
- package/styles/themes/_size.scss +68 -68
- package/styles/utilities/_animation.scss +58 -57
- package/styles/utilities/_tips.scss +10 -9
- 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
package/global-config/t.ts
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import { isString } from
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 复数规则判断函数
|
|
5
|
-
* @param count 数量
|
|
6
|
-
* @returns 返回复数形式的索引 (0: zero/none, 1: one, 2: other/many)
|
|
7
|
-
*/
|
|
8
|
-
function getPluralIndex(count: number): number {
|
|
9
|
-
if (count === 0) return 0; // no items
|
|
10
|
-
if (count === 1) return 1; // one item
|
|
11
|
-
return 2; // multiple items
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @see https://github.com/Tencent/tdesign-vue-next/blob/develop/packages/components/config-provider/hooks/useConfig.ts#L48
|
|
16
|
-
* 自定义 t function 可能依赖特定库函数,例如 tdesign-vue-next 中使用了 vue 的 h 函数
|
|
17
|
-
* 因此交由各个类库自行实现
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* 国际化函数,支持复数处理和变量替换
|
|
22
|
-
*
|
|
23
|
-
* 示例用法:
|
|
24
|
-
* 1. 基本变量替换:
|
|
25
|
-
* t('Hello {name}', { name: 'World' }) // => 'Hello World'
|
|
26
|
-
*
|
|
27
|
-
* 2. 复数处理(传入数字):
|
|
28
|
-
* t('no apples | one apple | {count} apples', 0) // => 'no apples'
|
|
29
|
-
* t('no apples | one apple | {count} apples', 1) // => 'one apple'
|
|
30
|
-
* t('no apples | one apple | {count} apples', 5) // => '5 apples'
|
|
31
|
-
*
|
|
32
|
-
* 3. 复合使用:
|
|
33
|
-
* t('no items found | found {count} item | found {count} items', 3, { count: 3 }) // => 'found 3 items'
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
// 类型重载定义
|
|
37
|
-
export function t(pattern: string): string;
|
|
38
|
-
export function t(pattern: string, data: Record<string, any>): string;
|
|
39
|
-
export function t(pattern: string, count: number): string;
|
|
40
|
-
export function t(pattern: string, count: number, data: Record<string, any>): string;
|
|
41
|
-
export function t<T>(pattern: T): string;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* @param pattern 文本模式,可以是字符串、函数或其他类型
|
|
45
|
-
* @param args 参数列表,支持 (count: number) 或 (count: number, data: object) 或 (data: object)
|
|
46
|
-
* @returns 处理后的文本
|
|
47
|
-
*/
|
|
48
|
-
export function t<T>(pattern: T, ...args: any[]): string {
|
|
49
|
-
if (isString(pattern)) {
|
|
50
|
-
let text = pattern as string;
|
|
51
|
-
let count: number | undefined;
|
|
52
|
-
let data: Record<string, any> = {};
|
|
53
|
-
|
|
54
|
-
// 解析参数
|
|
55
|
-
if (args.length > 0) {
|
|
56
|
-
const [firstArg, secondArg] = args;
|
|
57
|
-
|
|
58
|
-
if (typeof firstArg ===
|
|
59
|
-
|
|
60
|
-
count = firstArg;
|
|
61
|
-
if (secondArg && typeof secondArg ===
|
|
62
|
-
|
|
63
|
-
data = secondArg;
|
|
64
|
-
} else {
|
|
65
|
-
data.count = count; // 若没有提供第二个参数,则将 count 添加到数据中
|
|
66
|
-
}
|
|
67
|
-
} else if (typeof firstArg ===
|
|
68
|
-
|
|
69
|
-
data = firstArg;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// 处理复数形式:支持 "no items | one item | {count} items" 格式
|
|
74
|
-
if (text.includes(
|
|
75
|
-
const pluralParts = text.split(
|
|
76
|
-
|
|
77
|
-
if (typeof count ===
|
|
78
|
-
// 使用 count 进行复数处理
|
|
79
|
-
const pluralIndex = getPluralIndex(count);
|
|
80
|
-
|
|
81
|
-
// 根据复数索引选择对应的文本
|
|
82
|
-
if (pluralIndex < pluralParts.length) {
|
|
83
|
-
text = pluralParts[pluralIndex];
|
|
84
|
-
} else {
|
|
85
|
-
|
|
86
|
-
text = pluralParts[pluralParts.length - 1];
|
|
87
|
-
}
|
|
88
|
-
} else {
|
|
89
|
-
// 如果没有 count,默认使用第一个选项
|
|
90
|
-
const [firstPart] = pluralParts;
|
|
91
|
-
text = firstPart;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 处理变量替换:{key} 格式
|
|
96
|
-
if (data && Object.keys(data).length > 0) {
|
|
97
|
-
const regular = /\{\s*([\w-]+)\s*\}/g;
|
|
98
|
-
text = text.replace(regular, (match, key) => {
|
|
99
|
-
if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
100
|
-
return String(data[key]);
|
|
101
|
-
}
|
|
102
|
-
return match; // 如果找不到对应的键,保留原始占位符
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return text as any;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// 如果不是字符串或函数,返回空字符串
|
|
110
|
-
return
|
|
111
|
-
}
|
|
1
|
+
import { isString } from "lodash-es";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 复数规则判断函数
|
|
5
|
+
* @param count 数量
|
|
6
|
+
* @returns 返回复数形式的索引 (0: zero/none, 1: one, 2: other/many)
|
|
7
|
+
*/
|
|
8
|
+
function getPluralIndex(count: number): number {
|
|
9
|
+
if (count === 0) return 0; // no items
|
|
10
|
+
if (count === 1) return 1; // one item
|
|
11
|
+
return 2; // multiple items
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @see https://github.com/Tencent/tdesign-vue-next/blob/develop/packages/components/config-provider/hooks/useConfig.ts#L48
|
|
16
|
+
* 自定义 t function 可能依赖特定库函数,例如 tdesign-vue-next 中使用了 vue 的 h 函数
|
|
17
|
+
* 因此交由各个类库自行实现
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 国际化函数,支持复数处理和变量替换
|
|
22
|
+
*
|
|
23
|
+
* 示例用法:
|
|
24
|
+
* 1. 基本变量替换:
|
|
25
|
+
* t('Hello {name}', { name: 'World' }) // => 'Hello World'
|
|
26
|
+
*
|
|
27
|
+
* 2. 复数处理(传入数字):
|
|
28
|
+
* t('no apples | one apple | {count} apples', 0) // => 'no apples'
|
|
29
|
+
* t('no apples | one apple | {count} apples', 1) // => 'one apple'
|
|
30
|
+
* t('no apples | one apple | {count} apples', 5) // => '5 apples'
|
|
31
|
+
*
|
|
32
|
+
* 3. 复合使用:
|
|
33
|
+
* t('no items found | found {count} item | found {count} items', 3, { count: 3 }) // => 'found 3 items'
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
// 类型重载定义
|
|
37
|
+
export function t(pattern: string): string;
|
|
38
|
+
export function t(pattern: string, data: Record<string, any>): string;
|
|
39
|
+
export function t(pattern: string, count: number): string;
|
|
40
|
+
export function t(pattern: string, count: number, data: Record<string, any>): string;
|
|
41
|
+
export function t<T>(pattern: T): string;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param pattern 文本模式,可以是字符串、函数或其他类型
|
|
45
|
+
* @param args 参数列表,支持 (count: number) 或 (count: number, data: object) 或 (data: object)
|
|
46
|
+
* @returns 处理后的文本
|
|
47
|
+
*/
|
|
48
|
+
export function t<T>(pattern: T, ...args: any[]): string {
|
|
49
|
+
if (isString(pattern)) {
|
|
50
|
+
let text = pattern as string;
|
|
51
|
+
let count: number | undefined;
|
|
52
|
+
let data: Record<string, any> = {};
|
|
53
|
+
|
|
54
|
+
// 解析参数
|
|
55
|
+
if (args.length > 0) {
|
|
56
|
+
const [firstArg, secondArg] = args;
|
|
57
|
+
|
|
58
|
+
if (typeof firstArg === "number") {
|
|
59
|
+
// 第一个参数是数字,表示 count
|
|
60
|
+
count = firstArg;
|
|
61
|
+
if (secondArg && typeof secondArg === "object") {
|
|
62
|
+
// 第二个参数是对象,表示额外的数据
|
|
63
|
+
data = secondArg;
|
|
64
|
+
} else {
|
|
65
|
+
data.count = count; // 若没有提供第二个参数,则将 count 添加到数据中
|
|
66
|
+
}
|
|
67
|
+
} else if (typeof firstArg === "object" && firstArg !== null) {
|
|
68
|
+
// 第一个参数是对象,表示数据
|
|
69
|
+
data = firstArg;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 处理复数形式:支持 "no items | one item | {count} items" 格式
|
|
74
|
+
if (text.includes("|")) {
|
|
75
|
+
const pluralParts = text.split("|").map((part) => part.trim());
|
|
76
|
+
|
|
77
|
+
if (typeof count === "number") {
|
|
78
|
+
// 使用 count 进行复数处理
|
|
79
|
+
const pluralIndex = getPluralIndex(count);
|
|
80
|
+
|
|
81
|
+
// 根据复数索引选择对应的文本
|
|
82
|
+
if (pluralIndex < pluralParts.length) {
|
|
83
|
+
text = pluralParts[pluralIndex];
|
|
84
|
+
} else {
|
|
85
|
+
// 如果索引超出范围,使用最后一个选项
|
|
86
|
+
text = pluralParts[pluralParts.length - 1];
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
// 如果没有 count,默认使用第一个选项
|
|
90
|
+
const [firstPart] = pluralParts;
|
|
91
|
+
text = firstPart;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 处理变量替换:{key} 格式
|
|
96
|
+
if (data && Object.keys(data).length > 0) {
|
|
97
|
+
const regular = /\{\s*([\w-]+)\s*\}/g;
|
|
98
|
+
text = text.replace(regular, (match, key) => {
|
|
99
|
+
if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
100
|
+
return String(data[key]);
|
|
101
|
+
}
|
|
102
|
+
return match; // 如果找不到对应的键,保留原始占位符
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return text as any;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 如果不是字符串或函数,返回空字符串
|
|
110
|
+
return "";
|
|
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;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const DisabledReadonlyInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input placeholder="正常状态" />
|
|
7
|
+
<Input disabled placeholder="禁用状态" defaultValue="禁用内容" />
|
|
8
|
+
<Input readonly placeholder="只读状态" defaultValue="只读内容" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default DisabledReadonlyInput;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const EventsInput = () => {
|
|
5
|
+
const [log, setLog] = useState<string[]>([]);
|
|
6
|
+
|
|
7
|
+
const addLog = (msg: string) => {
|
|
8
|
+
setLog((prev) => [...prev.slice(-4), msg]);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
13
|
+
<Input
|
|
14
|
+
placeholder="触发各种事件(查看下方日志)"
|
|
15
|
+
clearable
|
|
16
|
+
onChange={(val) => addLog(`onChange: ${val}`)}
|
|
17
|
+
onFocus={() => addLog("onFocus")}
|
|
18
|
+
onBlur={() => addLog("onBlur")}
|
|
19
|
+
onEnter={(val) => addLog(`onEnter: ${val}`)}
|
|
20
|
+
onClear={() => addLog("onClear")}
|
|
21
|
+
/>
|
|
22
|
+
<div
|
|
23
|
+
style={{
|
|
24
|
+
padding: "12px",
|
|
25
|
+
background: "var(--tendaui-color-primary-1)",
|
|
26
|
+
borderRadius: "4px",
|
|
27
|
+
fontSize: "12px",
|
|
28
|
+
fontFamily: "monospace"
|
|
29
|
+
}}
|
|
30
|
+
>
|
|
31
|
+
<div style={{ marginBottom: "8px", fontWeight: "bold" }}>事件日志:</div>
|
|
32
|
+
{log.length === 0 ? (
|
|
33
|
+
<div style={{ color: "#999" }}>暂无事件触发</div>
|
|
34
|
+
) : (
|
|
35
|
+
log.map((item, index) => <div key={index}>{item}</div>)
|
|
36
|
+
)}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default EventsInput;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input, InputGroup } from "../index";
|
|
3
|
+
import { IconUser, IconLock } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const InputGroupExample = () => (
|
|
6
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
7
|
+
<InputGroup separate>
|
|
8
|
+
<Input placeholder="用户名" prefixIcon={<IconUser />} />
|
|
9
|
+
<Input type="password" placeholder="密码" prefixIcon={<IconLock />} />
|
|
10
|
+
</InputGroup>
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
export default InputGroupExample;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const LabelSuffixInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input label="http://" placeholder="请输入网址" />
|
|
7
|
+
<Input suffix=".com" placeholder="请输入域名" />
|
|
8
|
+
<Input label="http://" suffix=".com" placeholder="请输入域名" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default LabelSuffixInput;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const MaxLengthInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input maxlength={10} placeholder="最多输入10个字符" />
|
|
7
|
+
<Input maxcharacter={20} placeholder="最多输入20个字符(中文算2个)" />
|
|
8
|
+
</div>
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
export default MaxLengthInput;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
import { IconLock, IconEyeOpened, IconEyeClosed } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const PasswordInput = () => {
|
|
6
|
+
const [visible, setVisible] = useState(false);
|
|
7
|
+
return (
|
|
8
|
+
<div style={{ width: 500 }}>
|
|
9
|
+
<Input type={visible ? "text" : "password"} prefixIcon={<IconLock />} placeholder="请输入密码" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default PasswordInput;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const SizesInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input size="small" placeholder="小尺寸" />
|
|
7
|
+
<Input size="medium" placeholder="中尺寸(默认)" />
|
|
8
|
+
<Input size="large" placeholder="大尺寸" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default SizesInput;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const StatusInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px", width: "500px", margin: "8px 0" }}>
|
|
6
|
+
<Input status="default" placeholder="默认状态" tips="这是一条提示信息" />
|
|
7
|
+
<Input status="success" placeholder="成功状态" tips="校验通过" />
|
|
8
|
+
<Input status="warning" placeholder="警告状态" tips="请注意输入内容" />
|
|
9
|
+
<Input status="error" placeholder="错误状态" tips="输入内容有误" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export default StatusInput;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const TextAlignInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: 500 }}>
|
|
6
|
+
<Input align="left" placeholder="左对齐" defaultValue="左对齐内容" />
|
|
7
|
+
<Input align="center" placeholder="居中对齐" defaultValue="居中对齐内容" />
|
|
8
|
+
<Input align="right" placeholder="右对齐" defaultValue="右对齐内容" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default TextAlignInput;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
import { IconSearch, IconUser } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const WithIconInput = () => (
|
|
6
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
7
|
+
<Input prefixIcon={<IconSearch />} placeholder="前置图标" />
|
|
8
|
+
<Input suffixIcon={<IconSearch />} placeholder="后置图标" />
|
|
9
|
+
<Input prefixIcon={<IconUser />} suffixIcon={<IconSearch />} placeholder="前后图标" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export default WithIconInput;
|
package/input/type.ts
CHANGED