@dsh-plugin/dsh-ui-components 0.0.1 → 0.1.0-dev.43616582648
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/NOTICE +21 -21
- package/README.md +136 -136
- package/README.zh_CN.md +136 -136
- package/docs/tokens.md +67 -67
- package/lib/basic/form.js +49 -49
- package/lib/basic/styles.js +391 -391
- package/lib/composites/styles.js +427 -427
- package/lib/data/styles.js +257 -257
- package/lib/display/styles.js +310 -310
- package/lib/feedback/styles.js +228 -228
- package/lib/foundation/bridge.js +203 -203
- package/lib/navigation/styles.js +417 -417
- package/package.json +104 -104
- package/scripts/check-size.mjs +69 -69
- package/scripts/dump-npm-latest.mjs +59 -59
- package/scripts/gen-host-tokens.mjs +61 -61
- package/scripts/gen-icons.mjs +188 -178
- package/scripts/verify-no-literal-colors.mjs +63 -63
- package/scripts/verify-tokens.mjs +135 -135
- package/src/basic/button.tsx +76 -76
- package/src/basic/form.tsx +187 -187
- package/src/basic/icon-button.tsx +66 -66
- package/src/basic/index.ts +38 -38
- package/src/basic/input.tsx +140 -140
- package/src/basic/select.tsx +120 -120
- package/src/basic/styles.ts +412 -412
- package/src/basic/toggle.tsx +116 -116
- package/src/composites/data-view.tsx +189 -189
- package/src/composites/index.ts +11 -11
- package/src/composites/indicator.tsx +90 -90
- package/src/composites/menu-select.tsx +230 -230
- package/src/composites/panel.tsx +72 -72
- package/src/composites/settings.tsx +80 -80
- package/src/composites/styles.ts +450 -450
- package/src/data/collection.tsx +71 -71
- package/src/data/index.ts +39 -39
- package/src/data/info.tsx +89 -89
- package/src/data/picker.tsx +113 -113
- package/src/data/styles.ts +278 -278
- package/src/display/container.tsx +67 -67
- package/src/display/feedback.tsx +92 -92
- package/src/display/index.ts +44 -44
- package/src/display/label.tsx +165 -165
- package/src/display/overlay.tsx +103 -103
- package/src/display/styles.ts +332 -332
- package/src/feedback/global.tsx +110 -110
- package/src/feedback/index.ts +19 -19
- package/src/feedback/inline.tsx +50 -50
- package/src/feedback/panel.tsx +93 -93
- package/src/feedback/styles.ts +250 -250
- package/src/foundation/bridge.ts +318 -318
- package/src/foundation/icons.tsx +315 -315
- package/src/foundation/index.ts +33 -33
- package/src/foundation/palette.ts +153 -153
- package/src/foundation/provider.tsx +62 -62
- package/src/foundation/style.ts +63 -63
- package/src/foundation/tokens.ts +62 -62
- package/src/index.ts +18 -18
- package/src/navigation/hierarchy.tsx +82 -82
- package/src/navigation/index.ts +21 -21
- package/src/navigation/indicator.tsx +125 -125
- package/src/navigation/menu.tsx +94 -94
- package/src/navigation/segmented.tsx +136 -136
- package/src/navigation/styles.ts +438 -438
package/src/basic/input.tsx
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 文本类输入控件。
|
|
3
|
-
*
|
|
4
|
-
* `Input` / `Textarea` 沿用 Arco 的受控与非受控行为,追加 DSH 的两项约定:
|
|
5
|
-
* 等宽字体开关 `mono` 与校验失败标记 `invalid`。尺寸按 DSH 取 32(标准)/
|
|
6
|
-
* 28(紧凑)/ 44(大)。
|
|
7
|
-
*
|
|
8
|
-
* ref 的类型沿用 Arco 自己的签名:它暴露的是 `{ dom, focus, blur }` 这样的
|
|
9
|
-
* 句柄,而不是原生元素。需要原生元素时用 `ref.current.dom`。
|
|
10
|
-
*
|
|
11
|
-
* @module @dsh-plugin/dsh-ui-components/basic/input
|
|
12
|
-
*/
|
|
13
|
-
import * as React from 'react'
|
|
14
|
-
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
15
|
-
import { cx } from '../foundation/style.js'
|
|
16
|
-
import { injectBasicStyles } from './styles.js'
|
|
17
|
-
|
|
18
|
-
/** 输入控件的尺寸,与按钮分开定义,因为输入框标准高度是 32 而非 36。 */
|
|
19
|
-
export type FieldSize = 'md' | 'sm' | 'lg'
|
|
20
|
-
|
|
21
|
-
/** DSH 尺寸到 Arco 尺寸的映射。 */
|
|
22
|
-
const ARCO_SIZE: Record<FieldSize, 'default' | 'small' | 'large'> = {
|
|
23
|
-
md: 'default',
|
|
24
|
-
sm: 'small',
|
|
25
|
-
lg: 'large',
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* 合并 Arco 的 `className`(可能是字符串数组)与 DSH 的附加类名。
|
|
30
|
-
*
|
|
31
|
-
* @param className - Arco 传来的类名。
|
|
32
|
-
* @param extra - 需要追加的类名,假值忽略。
|
|
33
|
-
* @returns 归一化后的 `className`。
|
|
34
|
-
*/
|
|
35
|
-
function mergeClass(className: string | string[] | undefined, ...extra: Array<string | false | undefined>): string {
|
|
36
|
-
const inherited = Array.isArray(className) ? className : className === undefined ? [] : [className]
|
|
37
|
-
return cx(...inherited, ...extra)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Arco 输入框暴露的句柄。 */
|
|
41
|
-
export type InputRef = React.ElementRef<typeof Arco.Input>
|
|
42
|
-
|
|
43
|
-
/** Arco 文本域暴露的句柄。 */
|
|
44
|
-
export type TextareaRef = React.ElementRef<typeof Arco.Input.TextArea>
|
|
45
|
-
|
|
46
|
-
/** {@link Input} 的 props。 */
|
|
47
|
-
export type InputProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.Input>, 'size'> & {
|
|
48
|
-
/** 尺寸,默认 `md`。 */
|
|
49
|
-
size?: FieldSize
|
|
50
|
-
/** 使用等宽字体,用于路径、命令与标识符。 */
|
|
51
|
-
mono?: boolean
|
|
52
|
-
/** 校验失败。同时设置 `aria-invalid`。 */
|
|
53
|
-
invalid?: boolean
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 单行文本输入。
|
|
58
|
-
*
|
|
59
|
-
* @param props - 见 {@link InputProps}。
|
|
60
|
-
* @param ref - Arco 的输入框句柄,含 `dom`、`focus`、`blur`。
|
|
61
|
-
* @returns 输入框元素。
|
|
62
|
-
*/
|
|
63
|
-
export const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>> =
|
|
64
|
-
React.forwardRef<InputRef, InputProps>(function Input(
|
|
65
|
-
{ size = 'md', mono, invalid, className, status, ...rest },
|
|
66
|
-
ref,
|
|
67
|
-
) {
|
|
68
|
-
injectBasicStyles()
|
|
69
|
-
return (
|
|
70
|
-
<Arco.Input
|
|
71
|
-
{...rest}
|
|
72
|
-
ref={ref}
|
|
73
|
-
size={ARCO_SIZE[size]}
|
|
74
|
-
status={invalid === true ? 'error' : status}
|
|
75
|
-
aria-invalid={invalid === true ? true : undefined}
|
|
76
|
-
className={mergeClass(className, mono === true && 'dsh-mono')}
|
|
77
|
-
/>
|
|
78
|
-
)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
/** {@link Textarea} 的 props。 */
|
|
82
|
-
export type TextareaProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.Input.TextArea>, 'className'> & {
|
|
83
|
-
/** 尺寸,默认 `md`。Arco 的文本域不接受 `size`,此处以类名表达。 */
|
|
84
|
-
size?: FieldSize
|
|
85
|
-
/** 使用等宽字体。 */
|
|
86
|
-
mono?: boolean
|
|
87
|
-
/** 校验失败。 */
|
|
88
|
-
invalid?: boolean
|
|
89
|
-
/** 追加类名。 */
|
|
90
|
-
className?: string
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* 多行文本输入,默认最小高度 72 并允许竖向拉伸。
|
|
95
|
-
*
|
|
96
|
-
* @param props - 见 {@link TextareaProps}。
|
|
97
|
-
* @param ref - Arco 的文本域句柄。
|
|
98
|
-
* @returns 文本域元素。
|
|
99
|
-
*/
|
|
100
|
-
export const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<TextareaRef>> =
|
|
101
|
-
React.forwardRef<TextareaRef, TextareaProps>(function Textarea(
|
|
102
|
-
{ size = 'md', mono, invalid, className, status, ...rest },
|
|
103
|
-
ref,
|
|
104
|
-
) {
|
|
105
|
-
injectBasicStyles()
|
|
106
|
-
return (
|
|
107
|
-
<Arco.Input.TextArea
|
|
108
|
-
{...rest}
|
|
109
|
-
ref={ref}
|
|
110
|
-
status={invalid === true ? 'error' : status}
|
|
111
|
-
aria-invalid={invalid === true ? true : undefined}
|
|
112
|
-
className={mergeClass(className, `dsh-textarea-${size}`, mono === true && 'dsh-mono')}
|
|
113
|
-
/>
|
|
114
|
-
)
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
/** Arco 数字输入暴露的句柄。 */
|
|
118
|
-
export type InputNumberRef = React.ElementRef<typeof Arco.InputNumber>
|
|
119
|
-
|
|
120
|
-
/** {@link InputNumber} 的 props。 */
|
|
121
|
-
export type InputNumberProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.InputNumber>, 'size'> & {
|
|
122
|
-
/** 尺寸,默认 `md`。 */
|
|
123
|
-
size?: FieldSize
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* 数字输入,可带步进按钮。
|
|
128
|
-
*
|
|
129
|
-
* @param props - 见 {@link InputNumberProps}。
|
|
130
|
-
* @param ref - Arco 的数字输入句柄。
|
|
131
|
-
* @returns 数字输入元素。
|
|
132
|
-
*/
|
|
133
|
-
export const InputNumber: React.ForwardRefExoticComponent<InputNumberProps & React.RefAttributes<InputNumberRef>> =
|
|
134
|
-
React.forwardRef<InputNumberRef, InputNumberProps>(function InputNumber(
|
|
135
|
-
{ size = 'md', ...rest },
|
|
136
|
-
ref,
|
|
137
|
-
) {
|
|
138
|
-
injectBasicStyles()
|
|
139
|
-
return <Arco.InputNumber {...rest} ref={ref} size={ARCO_SIZE[size]} />
|
|
140
|
-
})
|
|
1
|
+
/**
|
|
2
|
+
* 文本类输入控件。
|
|
3
|
+
*
|
|
4
|
+
* `Input` / `Textarea` 沿用 Arco 的受控与非受控行为,追加 DSH 的两项约定:
|
|
5
|
+
* 等宽字体开关 `mono` 与校验失败标记 `invalid`。尺寸按 DSH 取 32(标准)/
|
|
6
|
+
* 28(紧凑)/ 44(大)。
|
|
7
|
+
*
|
|
8
|
+
* ref 的类型沿用 Arco 自己的签名:它暴露的是 `{ dom, focus, blur }` 这样的
|
|
9
|
+
* 句柄,而不是原生元素。需要原生元素时用 `ref.current.dom`。
|
|
10
|
+
*
|
|
11
|
+
* @module @dsh-plugin/dsh-ui-components/basic/input
|
|
12
|
+
*/
|
|
13
|
+
import * as React from 'react'
|
|
14
|
+
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
15
|
+
import { cx } from '../foundation/style.js'
|
|
16
|
+
import { injectBasicStyles } from './styles.js'
|
|
17
|
+
|
|
18
|
+
/** 输入控件的尺寸,与按钮分开定义,因为输入框标准高度是 32 而非 36。 */
|
|
19
|
+
export type FieldSize = 'md' | 'sm' | 'lg'
|
|
20
|
+
|
|
21
|
+
/** DSH 尺寸到 Arco 尺寸的映射。 */
|
|
22
|
+
const ARCO_SIZE: Record<FieldSize, 'default' | 'small' | 'large'> = {
|
|
23
|
+
md: 'default',
|
|
24
|
+
sm: 'small',
|
|
25
|
+
lg: 'large',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 合并 Arco 的 `className`(可能是字符串数组)与 DSH 的附加类名。
|
|
30
|
+
*
|
|
31
|
+
* @param className - Arco 传来的类名。
|
|
32
|
+
* @param extra - 需要追加的类名,假值忽略。
|
|
33
|
+
* @returns 归一化后的 `className`。
|
|
34
|
+
*/
|
|
35
|
+
function mergeClass(className: string | string[] | undefined, ...extra: Array<string | false | undefined>): string {
|
|
36
|
+
const inherited = Array.isArray(className) ? className : className === undefined ? [] : [className]
|
|
37
|
+
return cx(...inherited, ...extra)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Arco 输入框暴露的句柄。 */
|
|
41
|
+
export type InputRef = React.ElementRef<typeof Arco.Input>
|
|
42
|
+
|
|
43
|
+
/** Arco 文本域暴露的句柄。 */
|
|
44
|
+
export type TextareaRef = React.ElementRef<typeof Arco.Input.TextArea>
|
|
45
|
+
|
|
46
|
+
/** {@link Input} 的 props。 */
|
|
47
|
+
export type InputProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.Input>, 'size'> & {
|
|
48
|
+
/** 尺寸,默认 `md`。 */
|
|
49
|
+
size?: FieldSize
|
|
50
|
+
/** 使用等宽字体,用于路径、命令与标识符。 */
|
|
51
|
+
mono?: boolean
|
|
52
|
+
/** 校验失败。同时设置 `aria-invalid`。 */
|
|
53
|
+
invalid?: boolean
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 单行文本输入。
|
|
58
|
+
*
|
|
59
|
+
* @param props - 见 {@link InputProps}。
|
|
60
|
+
* @param ref - Arco 的输入框句柄,含 `dom`、`focus`、`blur`。
|
|
61
|
+
* @returns 输入框元素。
|
|
62
|
+
*/
|
|
63
|
+
export const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>> =
|
|
64
|
+
React.forwardRef<InputRef, InputProps>(function Input(
|
|
65
|
+
{ size = 'md', mono, invalid, className, status, ...rest },
|
|
66
|
+
ref,
|
|
67
|
+
) {
|
|
68
|
+
injectBasicStyles()
|
|
69
|
+
return (
|
|
70
|
+
<Arco.Input
|
|
71
|
+
{...rest}
|
|
72
|
+
ref={ref}
|
|
73
|
+
size={ARCO_SIZE[size]}
|
|
74
|
+
status={invalid === true ? 'error' : status}
|
|
75
|
+
aria-invalid={invalid === true ? true : undefined}
|
|
76
|
+
className={mergeClass(className, mono === true && 'dsh-mono')}
|
|
77
|
+
/>
|
|
78
|
+
)
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
/** {@link Textarea} 的 props。 */
|
|
82
|
+
export type TextareaProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.Input.TextArea>, 'className'> & {
|
|
83
|
+
/** 尺寸,默认 `md`。Arco 的文本域不接受 `size`,此处以类名表达。 */
|
|
84
|
+
size?: FieldSize
|
|
85
|
+
/** 使用等宽字体。 */
|
|
86
|
+
mono?: boolean
|
|
87
|
+
/** 校验失败。 */
|
|
88
|
+
invalid?: boolean
|
|
89
|
+
/** 追加类名。 */
|
|
90
|
+
className?: string
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 多行文本输入,默认最小高度 72 并允许竖向拉伸。
|
|
95
|
+
*
|
|
96
|
+
* @param props - 见 {@link TextareaProps}。
|
|
97
|
+
* @param ref - Arco 的文本域句柄。
|
|
98
|
+
* @returns 文本域元素。
|
|
99
|
+
*/
|
|
100
|
+
export const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<TextareaRef>> =
|
|
101
|
+
React.forwardRef<TextareaRef, TextareaProps>(function Textarea(
|
|
102
|
+
{ size = 'md', mono, invalid, className, status, ...rest },
|
|
103
|
+
ref,
|
|
104
|
+
) {
|
|
105
|
+
injectBasicStyles()
|
|
106
|
+
return (
|
|
107
|
+
<Arco.Input.TextArea
|
|
108
|
+
{...rest}
|
|
109
|
+
ref={ref}
|
|
110
|
+
status={invalid === true ? 'error' : status}
|
|
111
|
+
aria-invalid={invalid === true ? true : undefined}
|
|
112
|
+
className={mergeClass(className, `dsh-textarea-${size}`, mono === true && 'dsh-mono')}
|
|
113
|
+
/>
|
|
114
|
+
)
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
/** Arco 数字输入暴露的句柄。 */
|
|
118
|
+
export type InputNumberRef = React.ElementRef<typeof Arco.InputNumber>
|
|
119
|
+
|
|
120
|
+
/** {@link InputNumber} 的 props。 */
|
|
121
|
+
export type InputNumberProps = Omit<React.ComponentPropsWithoutRef<typeof Arco.InputNumber>, 'size'> & {
|
|
122
|
+
/** 尺寸,默认 `md`。 */
|
|
123
|
+
size?: FieldSize
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 数字输入,可带步进按钮。
|
|
128
|
+
*
|
|
129
|
+
* @param props - 见 {@link InputNumberProps}。
|
|
130
|
+
* @param ref - Arco 的数字输入句柄。
|
|
131
|
+
* @returns 数字输入元素。
|
|
132
|
+
*/
|
|
133
|
+
export const InputNumber: React.ForwardRefExoticComponent<InputNumberProps & React.RefAttributes<InputNumberRef>> =
|
|
134
|
+
React.forwardRef<InputNumberRef, InputNumberProps>(function InputNumber(
|
|
135
|
+
{ size = 'md', ...rest },
|
|
136
|
+
ref,
|
|
137
|
+
) {
|
|
138
|
+
injectBasicStyles()
|
|
139
|
+
return <Arco.InputNumber {...rest} ref={ref} size={ARCO_SIZE[size]} />
|
|
140
|
+
})
|
package/src/basic/select.tsx
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 选择类控件。
|
|
3
|
-
*
|
|
4
|
-
* 选项数据统一用 `options: { value, label, disabled }[]`,与 DSH 宿主自己的
|
|
5
|
-
* 选择器一致;`onChange` 直接回调选中的 value,而不是 DOM 事件。
|
|
6
|
-
*
|
|
7
|
-
* @module @dsh-plugin/dsh-ui-components/basic/select
|
|
8
|
-
*/
|
|
9
|
-
import * as React from 'react'
|
|
10
|
-
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
11
|
-
import { injectBasicStyles } from './styles.js'
|
|
12
|
-
import { type FieldSize } from './input.js'
|
|
13
|
-
|
|
14
|
-
/** DSH 尺寸到 Arco 尺寸的映射。 */
|
|
15
|
-
const ARCO_SIZE: Record<FieldSize, 'default' | 'small' | 'large'> = {
|
|
16
|
-
md: 'default',
|
|
17
|
-
sm: 'small',
|
|
18
|
-
lg: 'large',
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** 一个选项。 */
|
|
22
|
-
export interface SelectOption {
|
|
23
|
-
/** 提交值。 */
|
|
24
|
-
value: string
|
|
25
|
-
/** 展示文本。 */
|
|
26
|
-
label: React.ReactNode
|
|
27
|
-
/** 不可选。 */
|
|
28
|
-
disabled?: boolean
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** {@link Select} 的 props。 */
|
|
32
|
-
export interface SelectProps {
|
|
33
|
-
/** 选项列表。 */
|
|
34
|
-
options: readonly SelectOption[]
|
|
35
|
-
/** 当前值;多选时为数组。 */
|
|
36
|
-
value?: string | string[]
|
|
37
|
-
/** 默认值;多选时为数组。 */
|
|
38
|
-
defaultValue?: string | string[]
|
|
39
|
-
/** 选中项变化时回调,参数是选项 value(多选时为数组)。 */
|
|
40
|
-
onChange?: (value: string | string[]) => void
|
|
41
|
-
/** 多选模式。 */
|
|
42
|
-
multiple?: boolean
|
|
43
|
-
/** 允许清空。 */
|
|
44
|
-
allowClear?: boolean
|
|
45
|
-
/** 无选中项时显示的占位文本。 */
|
|
46
|
-
placeholder?: string
|
|
47
|
-
/** 禁用。 */
|
|
48
|
-
disabled?: boolean
|
|
49
|
-
/** 尺寸,默认 `md`。 */
|
|
50
|
-
size?: FieldSize
|
|
51
|
-
/** 校验失败。 */
|
|
52
|
-
invalid?: boolean
|
|
53
|
-
/** 前置标签。 */
|
|
54
|
-
prefix?: React.ReactNode
|
|
55
|
-
/** 输入框 id,用于与 `Field` 的 label 关联。 */
|
|
56
|
-
id?: string
|
|
57
|
-
/** 追加类名。 */
|
|
58
|
-
className?: string
|
|
59
|
-
/** 追加内联样式。 */
|
|
60
|
-
style?: React.CSSProperties
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* 下拉选择。
|
|
65
|
-
*
|
|
66
|
-
* @param props - 见 {@link SelectProps}。
|
|
67
|
-
* @returns 选择器元素。
|
|
68
|
-
*/
|
|
69
|
-
export function Select({
|
|
70
|
-
options,
|
|
71
|
-
value,
|
|
72
|
-
defaultValue,
|
|
73
|
-
onChange,
|
|
74
|
-
multiple,
|
|
75
|
-
allowClear,
|
|
76
|
-
placeholder,
|
|
77
|
-
disabled,
|
|
78
|
-
size = 'md',
|
|
79
|
-
invalid,
|
|
80
|
-
prefix,
|
|
81
|
-
id,
|
|
82
|
-
className,
|
|
83
|
-
style,
|
|
84
|
-
}: SelectProps): React.ReactElement {
|
|
85
|
-
injectBasicStyles()
|
|
86
|
-
return (
|
|
87
|
-
<Arco.Select
|
|
88
|
-
options={options as SelectOption[]}
|
|
89
|
-
value={value}
|
|
90
|
-
defaultValue={defaultValue}
|
|
91
|
-
onChange={onChange as (value: unknown) => void}
|
|
92
|
-
mode={multiple === true ? 'multiple' : undefined}
|
|
93
|
-
allowClear={allowClear}
|
|
94
|
-
placeholder={placeholder}
|
|
95
|
-
disabled={disabled}
|
|
96
|
-
size={ARCO_SIZE[size]}
|
|
97
|
-
status={invalid === true ? 'error' : undefined}
|
|
98
|
-
prefix={prefix}
|
|
99
|
-
id={id}
|
|
100
|
-
className={className}
|
|
101
|
-
style={style}
|
|
102
|
-
/>
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** {@link AutoComplete} 的 props。 */
|
|
107
|
-
export type AutoCompleteProps = React.ComponentPropsWithoutRef<typeof Arco.AutoComplete>
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* 带候选提示的文本输入。
|
|
111
|
-
*
|
|
112
|
-
* 高度沿用 Arco 的尺寸,通过 `inputProps` 透传输入框属性。
|
|
113
|
-
*
|
|
114
|
-
* @param props - 见 {@link AutoCompleteProps}。
|
|
115
|
-
* @returns 自动完成输入元素。
|
|
116
|
-
*/
|
|
117
|
-
export function AutoComplete(props: AutoCompleteProps): React.ReactElement {
|
|
118
|
-
injectBasicStyles()
|
|
119
|
-
return <Arco.AutoComplete {...props} />
|
|
120
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 选择类控件。
|
|
3
|
+
*
|
|
4
|
+
* 选项数据统一用 `options: { value, label, disabled }[]`,与 DSH 宿主自己的
|
|
5
|
+
* 选择器一致;`onChange` 直接回调选中的 value,而不是 DOM 事件。
|
|
6
|
+
*
|
|
7
|
+
* @module @dsh-plugin/dsh-ui-components/basic/select
|
|
8
|
+
*/
|
|
9
|
+
import * as React from 'react'
|
|
10
|
+
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
11
|
+
import { injectBasicStyles } from './styles.js'
|
|
12
|
+
import { type FieldSize } from './input.js'
|
|
13
|
+
|
|
14
|
+
/** DSH 尺寸到 Arco 尺寸的映射。 */
|
|
15
|
+
const ARCO_SIZE: Record<FieldSize, 'default' | 'small' | 'large'> = {
|
|
16
|
+
md: 'default',
|
|
17
|
+
sm: 'small',
|
|
18
|
+
lg: 'large',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** 一个选项。 */
|
|
22
|
+
export interface SelectOption {
|
|
23
|
+
/** 提交值。 */
|
|
24
|
+
value: string
|
|
25
|
+
/** 展示文本。 */
|
|
26
|
+
label: React.ReactNode
|
|
27
|
+
/** 不可选。 */
|
|
28
|
+
disabled?: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** {@link Select} 的 props。 */
|
|
32
|
+
export interface SelectProps {
|
|
33
|
+
/** 选项列表。 */
|
|
34
|
+
options: readonly SelectOption[]
|
|
35
|
+
/** 当前值;多选时为数组。 */
|
|
36
|
+
value?: string | string[]
|
|
37
|
+
/** 默认值;多选时为数组。 */
|
|
38
|
+
defaultValue?: string | string[]
|
|
39
|
+
/** 选中项变化时回调,参数是选项 value(多选时为数组)。 */
|
|
40
|
+
onChange?: (value: string | string[]) => void
|
|
41
|
+
/** 多选模式。 */
|
|
42
|
+
multiple?: boolean
|
|
43
|
+
/** 允许清空。 */
|
|
44
|
+
allowClear?: boolean
|
|
45
|
+
/** 无选中项时显示的占位文本。 */
|
|
46
|
+
placeholder?: string
|
|
47
|
+
/** 禁用。 */
|
|
48
|
+
disabled?: boolean
|
|
49
|
+
/** 尺寸,默认 `md`。 */
|
|
50
|
+
size?: FieldSize
|
|
51
|
+
/** 校验失败。 */
|
|
52
|
+
invalid?: boolean
|
|
53
|
+
/** 前置标签。 */
|
|
54
|
+
prefix?: React.ReactNode
|
|
55
|
+
/** 输入框 id,用于与 `Field` 的 label 关联。 */
|
|
56
|
+
id?: string
|
|
57
|
+
/** 追加类名。 */
|
|
58
|
+
className?: string
|
|
59
|
+
/** 追加内联样式。 */
|
|
60
|
+
style?: React.CSSProperties
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 下拉选择。
|
|
65
|
+
*
|
|
66
|
+
* @param props - 见 {@link SelectProps}。
|
|
67
|
+
* @returns 选择器元素。
|
|
68
|
+
*/
|
|
69
|
+
export function Select({
|
|
70
|
+
options,
|
|
71
|
+
value,
|
|
72
|
+
defaultValue,
|
|
73
|
+
onChange,
|
|
74
|
+
multiple,
|
|
75
|
+
allowClear,
|
|
76
|
+
placeholder,
|
|
77
|
+
disabled,
|
|
78
|
+
size = 'md',
|
|
79
|
+
invalid,
|
|
80
|
+
prefix,
|
|
81
|
+
id,
|
|
82
|
+
className,
|
|
83
|
+
style,
|
|
84
|
+
}: SelectProps): React.ReactElement {
|
|
85
|
+
injectBasicStyles()
|
|
86
|
+
return (
|
|
87
|
+
<Arco.Select
|
|
88
|
+
options={options as SelectOption[]}
|
|
89
|
+
value={value}
|
|
90
|
+
defaultValue={defaultValue}
|
|
91
|
+
onChange={onChange as (value: unknown) => void}
|
|
92
|
+
mode={multiple === true ? 'multiple' : undefined}
|
|
93
|
+
allowClear={allowClear}
|
|
94
|
+
placeholder={placeholder}
|
|
95
|
+
disabled={disabled}
|
|
96
|
+
size={ARCO_SIZE[size]}
|
|
97
|
+
status={invalid === true ? 'error' : undefined}
|
|
98
|
+
prefix={prefix}
|
|
99
|
+
id={id}
|
|
100
|
+
className={className}
|
|
101
|
+
style={style}
|
|
102
|
+
/>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** {@link AutoComplete} 的 props。 */
|
|
107
|
+
export type AutoCompleteProps = React.ComponentPropsWithoutRef<typeof Arco.AutoComplete>
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 带候选提示的文本输入。
|
|
111
|
+
*
|
|
112
|
+
* 高度沿用 Arco 的尺寸,通过 `inputProps` 透传输入框属性。
|
|
113
|
+
*
|
|
114
|
+
* @param props - 见 {@link AutoCompleteProps}。
|
|
115
|
+
* @returns 自动完成输入元素。
|
|
116
|
+
*/
|
|
117
|
+
export function AutoComplete(props: AutoCompleteProps): React.ReactElement {
|
|
118
|
+
injectBasicStyles()
|
|
119
|
+
return <Arco.AutoComplete {...props} />
|
|
120
|
+
}
|