@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/foundation/index.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 基础层出口:桥接样式、根提供器、图标、尺寸令牌与样式工具。
|
|
3
|
-
*
|
|
4
|
-
* @module @dsh-plugin/dsh-ui-components/foundation
|
|
5
|
-
*/
|
|
6
|
-
export { BRIDGE_CSS, BRIDGE_PALETTE } from './bridge.js'
|
|
7
|
-
export { DshProvider, type DshProviderProps } from './provider.js'
|
|
8
|
-
export { G, OVERLAY_MAX_HEIGHT, overlayMaxHeight } from './tokens.js'
|
|
9
|
-
export { OWNER, PORTAL_ID, ROOT_CLASS, cx, injectUiStyle } from './style.js'
|
|
10
|
-
export {
|
|
11
|
-
DSH_ICON_CONFIG,
|
|
12
|
-
DshIconProvider,
|
|
13
|
-
ICON_NAMES,
|
|
14
|
-
Icon,
|
|
15
|
-
IconProvider,
|
|
16
|
-
Icons,
|
|
17
|
-
icon,
|
|
18
|
-
type IconByNameProps,
|
|
19
|
-
type IconComponent,
|
|
20
|
-
type IconName,
|
|
21
|
-
type IconOfProps,
|
|
22
|
-
type IconProps,
|
|
23
|
-
} from './icons.js'
|
|
24
|
-
export {
|
|
25
|
-
BLACK,
|
|
26
|
-
STATIC,
|
|
27
|
-
WHITE,
|
|
28
|
-
declareRamp,
|
|
29
|
-
mixTriple,
|
|
30
|
-
ramp,
|
|
31
|
-
type Triple,
|
|
32
|
-
} from './palette.js'
|
|
33
|
-
export { ICON_COUNT, ICON_INDEX, type IconMeta } from '../icons-index.js'
|
|
1
|
+
/**
|
|
2
|
+
* 基础层出口:桥接样式、根提供器、图标、尺寸令牌与样式工具。
|
|
3
|
+
*
|
|
4
|
+
* @module @dsh-plugin/dsh-ui-components/foundation
|
|
5
|
+
*/
|
|
6
|
+
export { BRIDGE_CSS, BRIDGE_PALETTE } from './bridge.js'
|
|
7
|
+
export { DshProvider, type DshProviderProps } from './provider.js'
|
|
8
|
+
export { G, OVERLAY_MAX_HEIGHT, overlayMaxHeight } from './tokens.js'
|
|
9
|
+
export { OWNER, PORTAL_ID, ROOT_CLASS, cx, injectUiStyle } from './style.js'
|
|
10
|
+
export {
|
|
11
|
+
DSH_ICON_CONFIG,
|
|
12
|
+
DshIconProvider,
|
|
13
|
+
ICON_NAMES,
|
|
14
|
+
Icon,
|
|
15
|
+
IconProvider,
|
|
16
|
+
Icons,
|
|
17
|
+
icon,
|
|
18
|
+
type IconByNameProps,
|
|
19
|
+
type IconComponent,
|
|
20
|
+
type IconName,
|
|
21
|
+
type IconOfProps,
|
|
22
|
+
type IconProps,
|
|
23
|
+
} from './icons.js'
|
|
24
|
+
export {
|
|
25
|
+
BLACK,
|
|
26
|
+
STATIC,
|
|
27
|
+
WHITE,
|
|
28
|
+
declareRamp,
|
|
29
|
+
mixTriple,
|
|
30
|
+
ramp,
|
|
31
|
+
type Triple,
|
|
32
|
+
} from './palette.js'
|
|
33
|
+
export { ICON_COUNT, ICON_INDEX, type IconMeta } from '../icons-index.js'
|
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DSH 静态调色板,以 `R,G,B` 三元组表示。
|
|
3
|
-
*
|
|
4
|
-
* Arco 以 `rgb(var(--primary-6))` 的形式消费色阶,无法引用一个 `rgb(...)`
|
|
5
|
-
* 字符串令牌,因此色阶必须写成三元组。这里的取值来自 DSH 源码
|
|
6
|
-
* `packages/client/ui-theme/src/styles/design-platform.css` 的 `--dsw-static-*`,
|
|
7
|
-
* 改宿主配色时同步修改本文件。
|
|
8
|
-
*
|
|
9
|
-
* @module @dsh-plugin/dsh-ui-components/foundation/palette
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/** 一个 `[R, G, B]` 三元组,取值 0–255。 */
|
|
13
|
-
export type Triple = readonly [number, number, number]
|
|
14
|
-
|
|
15
|
-
/** DSH 静态色值,按色系分组。 */
|
|
16
|
-
export const STATIC = {
|
|
17
|
-
neutral: {
|
|
18
|
-
0: [255, 255, 255],
|
|
19
|
-
50: [250, 250, 250],
|
|
20
|
-
100: [245, 245, 245],
|
|
21
|
-
150: [237, 237, 237],
|
|
22
|
-
200: [229, 229, 229],
|
|
23
|
-
250: [220, 220, 220],
|
|
24
|
-
300: [212, 212, 212],
|
|
25
|
-
400: [162, 164, 166],
|
|
26
|
-
500: [127, 130, 135],
|
|
27
|
-
550: [101, 103, 107],
|
|
28
|
-
600: [84, 85, 87],
|
|
29
|
-
700: [60, 60, 61],
|
|
30
|
-
800: [41, 41, 41],
|
|
31
|
-
850: [33, 33, 35],
|
|
32
|
-
900: [15, 15, 15],
|
|
33
|
-
},
|
|
34
|
-
bluish: {
|
|
35
|
-
0: [255, 255, 255],
|
|
36
|
-
50: [249, 250, 251],
|
|
37
|
-
55: [245, 247, 250],
|
|
38
|
-
60: [245, 246, 247],
|
|
39
|
-
75: [241, 243, 245],
|
|
40
|
-
90: [237, 240, 244],
|
|
41
|
-
100: [235, 238, 242],
|
|
42
|
-
150: [233, 236, 242],
|
|
43
|
-
200: [225, 229, 238],
|
|
44
|
-
300: [207, 211, 214],
|
|
45
|
-
400: [173, 178, 184],
|
|
46
|
-
500: [151, 157, 166],
|
|
47
|
-
600: [129, 133, 140],
|
|
48
|
-
700: [97, 102, 107],
|
|
49
|
-
750: [67, 69, 74],
|
|
50
|
-
800: [53, 54, 56],
|
|
51
|
-
850: [44, 44, 46],
|
|
52
|
-
875: [35, 35, 36],
|
|
53
|
-
900: [27, 27, 28],
|
|
54
|
-
950: [21, 21, 23],
|
|
55
|
-
1000: [15, 17, 21],
|
|
56
|
-
},
|
|
57
|
-
deepseek: {
|
|
58
|
-
50: [237, 243, 254],
|
|
59
|
-
100: [228, 237, 253],
|
|
60
|
-
200: [211, 226, 255],
|
|
61
|
-
300: [183, 200, 254],
|
|
62
|
-
400: [122, 170, 255],
|
|
63
|
-
450: [86, 134, 254],
|
|
64
|
-
500: [65, 118, 230],
|
|
65
|
-
600: [72, 104, 178],
|
|
66
|
-
800: [52, 65, 91],
|
|
67
|
-
900: [40, 49, 66],
|
|
68
|
-
},
|
|
69
|
-
blue: {
|
|
70
|
-
50: [239, 246, 255],
|
|
71
|
-
100: [219, 234, 254],
|
|
72
|
-
300: [147, 197, 253],
|
|
73
|
-
400: [96, 165, 250],
|
|
74
|
-
450: [77, 147, 248],
|
|
75
|
-
500: [59, 130, 246],
|
|
76
|
-
600: [37, 99, 235],
|
|
77
|
-
800: [30, 64, 175],
|
|
78
|
-
900: [14, 48, 116],
|
|
79
|
-
},
|
|
80
|
-
green: {
|
|
81
|
-
100: [230, 250, 237],
|
|
82
|
-
400: [78, 209, 126],
|
|
83
|
-
500: [34, 197, 94],
|
|
84
|
-
},
|
|
85
|
-
amber: {
|
|
86
|
-
100: [254, 245, 231],
|
|
87
|
-
400: [247, 173, 49],
|
|
88
|
-
500: [245, 158, 11],
|
|
89
|
-
600: [221, 134, 41],
|
|
90
|
-
},
|
|
91
|
-
red: {
|
|
92
|
-
50: [254, 242, 242],
|
|
93
|
-
100: [254, 226, 226],
|
|
94
|
-
400: [242, 90, 90],
|
|
95
|
-
500: [239, 68, 68],
|
|
96
|
-
600: [236, 19, 19],
|
|
97
|
-
},
|
|
98
|
-
violet: {
|
|
99
|
-
400: [167, 139, 250],
|
|
100
|
-
600: [124, 58, 237],
|
|
101
|
-
},
|
|
102
|
-
} as const satisfies Record<string, Record<number, Triple>>
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 从基准色向目标色按比例混合,用于补全 Arco 需要的十级色阶。
|
|
106
|
-
*
|
|
107
|
-
* @param base - 第 6 级(Arco 的默认主色位)取值。
|
|
108
|
-
* @param toward - 混合目标色。
|
|
109
|
-
* @param t - 混合比例,0 为完全取 `base`,1 为完全取 `toward`。
|
|
110
|
-
* @returns 四舍五入到整数的三元组。
|
|
111
|
-
*/
|
|
112
|
-
export function mixTriple(base: Triple, toward: Triple, t: number): Triple {
|
|
113
|
-
return [
|
|
114
|
-
Math.round(base[0] * (1 - t) + toward[0] * t),
|
|
115
|
-
Math.round(base[1] * (1 - t) + toward[1] * t),
|
|
116
|
-
Math.round(base[2] * (1 - t) + toward[2] * t),
|
|
117
|
-
]
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** 白色与黑色,供 {@link ramp} 白化、黑化使用。 */
|
|
121
|
-
export const WHITE: Triple = [255, 255, 255]
|
|
122
|
-
/** 黑色。 */
|
|
123
|
-
export const BLACK: Triple = [0, 0, 0]
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* 以第 6 级基准色展开 Arco 的十级色阶。
|
|
127
|
-
*
|
|
128
|
-
* 1–5 级向白色递进,用来做浅色填充与禁用态;7–10 级向黑色递进,用来做
|
|
129
|
-
* 悬停、按下与深色文字。递进比例沿用 Arco 自身色板的视觉节奏。
|
|
130
|
-
*
|
|
131
|
-
* @param base - 第 6 级取值,即 Arco 的主色位。
|
|
132
|
-
* @returns 长度为 10 的色阶,下标 0 对应 `-1`。
|
|
133
|
-
*/
|
|
134
|
-
export function ramp(base: Triple): Triple[] {
|
|
135
|
-
const steps = [0.92, 0.8, 0.64, 0.44, 0.2]
|
|
136
|
-
const darker = [0.18, 0.36, 0.54, 0.72]
|
|
137
|
-
return [
|
|
138
|
-
...steps.map(t => mixTriple(base, WHITE, t)),
|
|
139
|
-
base,
|
|
140
|
-
...darker.map(t => mixTriple(base, BLACK, t)),
|
|
141
|
-
]
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* 把一条色阶序列化为 CSS 自定义属性声明。
|
|
146
|
-
*
|
|
147
|
-
* @param prefix - 属性名前缀,不含 `--`,例如 `primary`。
|
|
148
|
-
* @param steps - 十级色阶。
|
|
149
|
-
* @returns 每行一条、带两空格缩进与换行的声明文本。
|
|
150
|
-
*/
|
|
151
|
-
export function declareRamp(prefix: string, steps: readonly Triple[]): string {
|
|
152
|
-
return steps.map((step, index) => ` --${prefix}-${index + 1}: ${step.join(',')};`).join('\n')
|
|
153
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* DSH 静态调色板,以 `R,G,B` 三元组表示。
|
|
3
|
+
*
|
|
4
|
+
* Arco 以 `rgb(var(--primary-6))` 的形式消费色阶,无法引用一个 `rgb(...)`
|
|
5
|
+
* 字符串令牌,因此色阶必须写成三元组。这里的取值来自 DSH 源码
|
|
6
|
+
* `packages/client/ui-theme/src/styles/design-platform.css` 的 `--dsw-static-*`,
|
|
7
|
+
* 改宿主配色时同步修改本文件。
|
|
8
|
+
*
|
|
9
|
+
* @module @dsh-plugin/dsh-ui-components/foundation/palette
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** 一个 `[R, G, B]` 三元组,取值 0–255。 */
|
|
13
|
+
export type Triple = readonly [number, number, number]
|
|
14
|
+
|
|
15
|
+
/** DSH 静态色值,按色系分组。 */
|
|
16
|
+
export const STATIC = {
|
|
17
|
+
neutral: {
|
|
18
|
+
0: [255, 255, 255],
|
|
19
|
+
50: [250, 250, 250],
|
|
20
|
+
100: [245, 245, 245],
|
|
21
|
+
150: [237, 237, 237],
|
|
22
|
+
200: [229, 229, 229],
|
|
23
|
+
250: [220, 220, 220],
|
|
24
|
+
300: [212, 212, 212],
|
|
25
|
+
400: [162, 164, 166],
|
|
26
|
+
500: [127, 130, 135],
|
|
27
|
+
550: [101, 103, 107],
|
|
28
|
+
600: [84, 85, 87],
|
|
29
|
+
700: [60, 60, 61],
|
|
30
|
+
800: [41, 41, 41],
|
|
31
|
+
850: [33, 33, 35],
|
|
32
|
+
900: [15, 15, 15],
|
|
33
|
+
},
|
|
34
|
+
bluish: {
|
|
35
|
+
0: [255, 255, 255],
|
|
36
|
+
50: [249, 250, 251],
|
|
37
|
+
55: [245, 247, 250],
|
|
38
|
+
60: [245, 246, 247],
|
|
39
|
+
75: [241, 243, 245],
|
|
40
|
+
90: [237, 240, 244],
|
|
41
|
+
100: [235, 238, 242],
|
|
42
|
+
150: [233, 236, 242],
|
|
43
|
+
200: [225, 229, 238],
|
|
44
|
+
300: [207, 211, 214],
|
|
45
|
+
400: [173, 178, 184],
|
|
46
|
+
500: [151, 157, 166],
|
|
47
|
+
600: [129, 133, 140],
|
|
48
|
+
700: [97, 102, 107],
|
|
49
|
+
750: [67, 69, 74],
|
|
50
|
+
800: [53, 54, 56],
|
|
51
|
+
850: [44, 44, 46],
|
|
52
|
+
875: [35, 35, 36],
|
|
53
|
+
900: [27, 27, 28],
|
|
54
|
+
950: [21, 21, 23],
|
|
55
|
+
1000: [15, 17, 21],
|
|
56
|
+
},
|
|
57
|
+
deepseek: {
|
|
58
|
+
50: [237, 243, 254],
|
|
59
|
+
100: [228, 237, 253],
|
|
60
|
+
200: [211, 226, 255],
|
|
61
|
+
300: [183, 200, 254],
|
|
62
|
+
400: [122, 170, 255],
|
|
63
|
+
450: [86, 134, 254],
|
|
64
|
+
500: [65, 118, 230],
|
|
65
|
+
600: [72, 104, 178],
|
|
66
|
+
800: [52, 65, 91],
|
|
67
|
+
900: [40, 49, 66],
|
|
68
|
+
},
|
|
69
|
+
blue: {
|
|
70
|
+
50: [239, 246, 255],
|
|
71
|
+
100: [219, 234, 254],
|
|
72
|
+
300: [147, 197, 253],
|
|
73
|
+
400: [96, 165, 250],
|
|
74
|
+
450: [77, 147, 248],
|
|
75
|
+
500: [59, 130, 246],
|
|
76
|
+
600: [37, 99, 235],
|
|
77
|
+
800: [30, 64, 175],
|
|
78
|
+
900: [14, 48, 116],
|
|
79
|
+
},
|
|
80
|
+
green: {
|
|
81
|
+
100: [230, 250, 237],
|
|
82
|
+
400: [78, 209, 126],
|
|
83
|
+
500: [34, 197, 94],
|
|
84
|
+
},
|
|
85
|
+
amber: {
|
|
86
|
+
100: [254, 245, 231],
|
|
87
|
+
400: [247, 173, 49],
|
|
88
|
+
500: [245, 158, 11],
|
|
89
|
+
600: [221, 134, 41],
|
|
90
|
+
},
|
|
91
|
+
red: {
|
|
92
|
+
50: [254, 242, 242],
|
|
93
|
+
100: [254, 226, 226],
|
|
94
|
+
400: [242, 90, 90],
|
|
95
|
+
500: [239, 68, 68],
|
|
96
|
+
600: [236, 19, 19],
|
|
97
|
+
},
|
|
98
|
+
violet: {
|
|
99
|
+
400: [167, 139, 250],
|
|
100
|
+
600: [124, 58, 237],
|
|
101
|
+
},
|
|
102
|
+
} as const satisfies Record<string, Record<number, Triple>>
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 从基准色向目标色按比例混合,用于补全 Arco 需要的十级色阶。
|
|
106
|
+
*
|
|
107
|
+
* @param base - 第 6 级(Arco 的默认主色位)取值。
|
|
108
|
+
* @param toward - 混合目标色。
|
|
109
|
+
* @param t - 混合比例,0 为完全取 `base`,1 为完全取 `toward`。
|
|
110
|
+
* @returns 四舍五入到整数的三元组。
|
|
111
|
+
*/
|
|
112
|
+
export function mixTriple(base: Triple, toward: Triple, t: number): Triple {
|
|
113
|
+
return [
|
|
114
|
+
Math.round(base[0] * (1 - t) + toward[0] * t),
|
|
115
|
+
Math.round(base[1] * (1 - t) + toward[1] * t),
|
|
116
|
+
Math.round(base[2] * (1 - t) + toward[2] * t),
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** 白色与黑色,供 {@link ramp} 白化、黑化使用。 */
|
|
121
|
+
export const WHITE: Triple = [255, 255, 255]
|
|
122
|
+
/** 黑色。 */
|
|
123
|
+
export const BLACK: Triple = [0, 0, 0]
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 以第 6 级基准色展开 Arco 的十级色阶。
|
|
127
|
+
*
|
|
128
|
+
* 1–5 级向白色递进,用来做浅色填充与禁用态;7–10 级向黑色递进,用来做
|
|
129
|
+
* 悬停、按下与深色文字。递进比例沿用 Arco 自身色板的视觉节奏。
|
|
130
|
+
*
|
|
131
|
+
* @param base - 第 6 级取值,即 Arco 的主色位。
|
|
132
|
+
* @returns 长度为 10 的色阶,下标 0 对应 `-1`。
|
|
133
|
+
*/
|
|
134
|
+
export function ramp(base: Triple): Triple[] {
|
|
135
|
+
const steps = [0.92, 0.8, 0.64, 0.44, 0.2]
|
|
136
|
+
const darker = [0.18, 0.36, 0.54, 0.72]
|
|
137
|
+
return [
|
|
138
|
+
...steps.map(t => mixTriple(base, WHITE, t)),
|
|
139
|
+
base,
|
|
140
|
+
...darker.map(t => mixTriple(base, BLACK, t)),
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 把一条色阶序列化为 CSS 自定义属性声明。
|
|
146
|
+
*
|
|
147
|
+
* @param prefix - 属性名前缀,不含 `--`,例如 `primary`。
|
|
148
|
+
* @param steps - 十级色阶。
|
|
149
|
+
* @returns 每行一条、带两空格缩进与换行的声明文本。
|
|
150
|
+
*/
|
|
151
|
+
export function declareRamp(prefix: string, steps: readonly Triple[]): string {
|
|
152
|
+
return steps.map((step, index) => ` --${prefix}-${index + 1}: ${step.join(',')};`).join('\n')
|
|
153
|
+
}
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DSH 组件树的根提供器。
|
|
3
|
-
*
|
|
4
|
-
* 它做三件事:注入桥接样式表、把 Arco 的全部浮层挂到带同一套变量的容器
|
|
5
|
-
* 上、并把 `.dsh-ui` 容器类交给子树。插件在自己的 React 树根部挂一次即可,
|
|
6
|
-
* 组件本身不依赖它也能渲染(样式表会在首个组件渲染时补注入),但没有它时
|
|
7
|
-
* 浮层会挂到 `body` 下而拿不到 `.dsh-ui` 的变量。
|
|
8
|
-
*
|
|
9
|
-
* @module @dsh-plugin/dsh-ui-components/foundation/provider
|
|
10
|
-
*/
|
|
11
|
-
import * as React from 'react'
|
|
12
|
-
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
13
|
-
import { BRIDGE_CSS } from './bridge.js'
|
|
14
|
-
import { ROOT_CLASS, ensureOverlayContainer, injectUiStyle } from './style.js'
|
|
15
|
-
|
|
16
|
-
/** {@link DshProvider} 的 props。 */
|
|
17
|
-
export interface DshProviderProps {
|
|
18
|
-
/** 子树内容。 */
|
|
19
|
-
children?: React.ReactNode
|
|
20
|
-
/** 追加到根容器的类名。 */
|
|
21
|
-
className?: string
|
|
22
|
-
/** 追加到根容器的内联样式。 */
|
|
23
|
-
style?: React.CSSProperties
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* 取得或创建浮层容器。
|
|
28
|
-
*
|
|
29
|
-
* 容器挂在 `body` 下并带 `.dsh-ui-overlay`,因此浮层即使在 body 层也能读到
|
|
30
|
-
* 同一套变量。多个 provider 共用同一个容器,卸载时只解除自己的引用。
|
|
31
|
-
*
|
|
32
|
-
* @returns 浮层容器元素;服务端渲染时返回 `null`。
|
|
33
|
-
*/
|
|
34
|
-
function ensurePortal(): HTMLElement | null {
|
|
35
|
-
return ensureOverlayContainer()
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 包裹子树,注入 DSH 皮肤并把 Arco 浮层收进统一容器。
|
|
40
|
-
*
|
|
41
|
-
* @param props - 见 {@link DshProviderProps}。
|
|
42
|
-
* @returns 带 `.dsh-ui` 容器的 `ConfigProvider` 子树。
|
|
43
|
-
*/
|
|
44
|
-
export function DshProvider({ children, className, style }: DshProviderProps): React.ReactElement {
|
|
45
|
-
// 注入放在渲染期:样式必须先于首帧存在,而 injectUiStyle 幂等。
|
|
46
|
-
injectUiStyle('foundation/bridge.css', BRIDGE_CSS)
|
|
47
|
-
|
|
48
|
-
const getPopupContainer = React.useCallback((node: HTMLElement): HTMLElement => {
|
|
49
|
-
// 浮层优先留在触发元素所在的滚动/裁剪上下文里,只有在它不在 `.dsh-ui`
|
|
50
|
-
// 子树内时才回退到 body 级容器。
|
|
51
|
-
const scope = node.closest(`.${ROOT_CLASS}`)
|
|
52
|
-
return scope instanceof HTMLElement ? scope : (ensurePortal() ?? document.body)
|
|
53
|
-
}, [])
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<Arco.ConfigProvider getPopupContainer={getPopupContainer}>
|
|
57
|
-
<div className={[ROOT_CLASS, className].filter(Boolean).join(' ')} style={style}>
|
|
58
|
-
{children}
|
|
59
|
-
</div>
|
|
60
|
-
</Arco.ConfigProvider>
|
|
61
|
-
)
|
|
62
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* DSH 组件树的根提供器。
|
|
3
|
+
*
|
|
4
|
+
* 它做三件事:注入桥接样式表、把 Arco 的全部浮层挂到带同一套变量的容器
|
|
5
|
+
* 上、并把 `.dsh-ui` 容器类交给子树。插件在自己的 React 树根部挂一次即可,
|
|
6
|
+
* 组件本身不依赖它也能渲染(样式表会在首个组件渲染时补注入),但没有它时
|
|
7
|
+
* 浮层会挂到 `body` 下而拿不到 `.dsh-ui` 的变量。
|
|
8
|
+
*
|
|
9
|
+
* @module @dsh-plugin/dsh-ui-components/foundation/provider
|
|
10
|
+
*/
|
|
11
|
+
import * as React from 'react'
|
|
12
|
+
import { Arco } from '@dsh-plugin/dsh-loader/client'
|
|
13
|
+
import { BRIDGE_CSS } from './bridge.js'
|
|
14
|
+
import { ROOT_CLASS, ensureOverlayContainer, injectUiStyle } from './style.js'
|
|
15
|
+
|
|
16
|
+
/** {@link DshProvider} 的 props。 */
|
|
17
|
+
export interface DshProviderProps {
|
|
18
|
+
/** 子树内容。 */
|
|
19
|
+
children?: React.ReactNode
|
|
20
|
+
/** 追加到根容器的类名。 */
|
|
21
|
+
className?: string
|
|
22
|
+
/** 追加到根容器的内联样式。 */
|
|
23
|
+
style?: React.CSSProperties
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 取得或创建浮层容器。
|
|
28
|
+
*
|
|
29
|
+
* 容器挂在 `body` 下并带 `.dsh-ui-overlay`,因此浮层即使在 body 层也能读到
|
|
30
|
+
* 同一套变量。多个 provider 共用同一个容器,卸载时只解除自己的引用。
|
|
31
|
+
*
|
|
32
|
+
* @returns 浮层容器元素;服务端渲染时返回 `null`。
|
|
33
|
+
*/
|
|
34
|
+
function ensurePortal(): HTMLElement | null {
|
|
35
|
+
return ensureOverlayContainer()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 包裹子树,注入 DSH 皮肤并把 Arco 浮层收进统一容器。
|
|
40
|
+
*
|
|
41
|
+
* @param props - 见 {@link DshProviderProps}。
|
|
42
|
+
* @returns 带 `.dsh-ui` 容器的 `ConfigProvider` 子树。
|
|
43
|
+
*/
|
|
44
|
+
export function DshProvider({ children, className, style }: DshProviderProps): React.ReactElement {
|
|
45
|
+
// 注入放在渲染期:样式必须先于首帧存在,而 injectUiStyle 幂等。
|
|
46
|
+
injectUiStyle('foundation/bridge.css', BRIDGE_CSS)
|
|
47
|
+
|
|
48
|
+
const getPopupContainer = React.useCallback((node: HTMLElement): HTMLElement => {
|
|
49
|
+
// 浮层优先留在触发元素所在的滚动/裁剪上下文里,只有在它不在 `.dsh-ui`
|
|
50
|
+
// 子树内时才回退到 body 级容器。
|
|
51
|
+
const scope = node.closest(`.${ROOT_CLASS}`)
|
|
52
|
+
return scope instanceof HTMLElement ? scope : (ensurePortal() ?? document.body)
|
|
53
|
+
}, [])
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<Arco.ConfigProvider getPopupContainer={getPopupContainer}>
|
|
57
|
+
<div className={[ROOT_CLASS, className].filter(Boolean).join(' ')} style={style}>
|
|
58
|
+
{children}
|
|
59
|
+
</div>
|
|
60
|
+
</Arco.ConfigProvider>
|
|
61
|
+
)
|
|
62
|
+
}
|
package/src/foundation/style.ts
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 样式注入与类名拼接。
|
|
3
|
-
*
|
|
4
|
-
* 样式以字符串常量形式注入,消费方不需要任何 CSS 处理管线。注入走
|
|
5
|
-
* `@dsh-plugin/dsh-loader/client` 的 `injectStyle`,它带 `data-plugin` /
|
|
6
|
-
* `data-plugin-css` 归属属性,宿主热重载时可以回收。
|
|
7
|
-
*
|
|
8
|
-
* @module @dsh-plugin/dsh-ui-components/foundation/style
|
|
9
|
-
*/
|
|
10
|
-
import { injectStyle } from '@dsh-plugin/dsh-loader/client'
|
|
11
|
-
|
|
12
|
-
/** 本包在宿主样式归属属性中使用的插件 id。 */
|
|
13
|
-
export const OWNER = '@dsh-plugin/dsh-ui-components'
|
|
14
|
-
|
|
15
|
-
/** 组件样式统一使用的根类名。 */
|
|
16
|
-
export const ROOT_CLASS = 'dsh-ui'
|
|
17
|
-
|
|
18
|
-
/** 浮层容器元素 id。 */
|
|
19
|
-
export const PORTAL_ID = 'dsh-ui-portal'
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 幂等注入一张样式表。
|
|
23
|
-
*
|
|
24
|
-
* @param cssId - 表内唯一标识,例如 `foundation/bridge.css`。
|
|
25
|
-
* @param css - 样式表文本。
|
|
26
|
-
* @returns 释放函数,移除本次注入的标签;重复注入时返回空实现。
|
|
27
|
-
*/
|
|
28
|
-
export function injectUiStyle(cssId: string, css: string): () => void {
|
|
29
|
-
return injectStyle(OWNER, cssId, css)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** 浮层容器的类名,带上它才能在 body 层读到同一套变量。 */
|
|
33
|
-
export const OVERLAY_CLASS = `${ROOT_CLASS}-overlay`
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 取得或创建 body 级浮层容器。
|
|
37
|
-
*
|
|
38
|
-
* Arco 的 `Modal`、`Drawer` 与命令式弹层自带 `getPopupContainer` 默认值
|
|
39
|
-
* (直接返回 `document.body`),不读 `ConfigProvider` 的设置,因此这类组件
|
|
40
|
-
* 必须显式传入本容器,否则浮层挂在 `body` 下拿不到 `.dsh-ui` 的变量。
|
|
41
|
-
*
|
|
42
|
-
* @returns 容器元素;服务端渲染时返回 `null`。
|
|
43
|
-
*/
|
|
44
|
-
export function ensureOverlayContainer(): HTMLElement | null {
|
|
45
|
-
if (typeof document === 'undefined') return null
|
|
46
|
-
const existing = document.getElementById(PORTAL_ID)
|
|
47
|
-
if (existing !== null) return existing
|
|
48
|
-
const host = document.createElement('div')
|
|
49
|
-
host.id = PORTAL_ID
|
|
50
|
-
host.className = OVERLAY_CLASS
|
|
51
|
-
document.body.appendChild(host)
|
|
52
|
-
return host
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 拼接类名,忽略假值。
|
|
57
|
-
*
|
|
58
|
-
* @param parts - 类名片段,假值被跳过。
|
|
59
|
-
* @returns 以单个空格连接的类名字符串。
|
|
60
|
-
*/
|
|
61
|
-
export function cx(...parts: Array<string | false | null | undefined>): string {
|
|
62
|
-
return parts.filter(Boolean).join(' ')
|
|
63
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 样式注入与类名拼接。
|
|
3
|
+
*
|
|
4
|
+
* 样式以字符串常量形式注入,消费方不需要任何 CSS 处理管线。注入走
|
|
5
|
+
* `@dsh-plugin/dsh-loader/client` 的 `injectStyle`,它带 `data-plugin` /
|
|
6
|
+
* `data-plugin-css` 归属属性,宿主热重载时可以回收。
|
|
7
|
+
*
|
|
8
|
+
* @module @dsh-plugin/dsh-ui-components/foundation/style
|
|
9
|
+
*/
|
|
10
|
+
import { injectStyle } from '@dsh-plugin/dsh-loader/client'
|
|
11
|
+
|
|
12
|
+
/** 本包在宿主样式归属属性中使用的插件 id。 */
|
|
13
|
+
export const OWNER = '@dsh-plugin/dsh-ui-components'
|
|
14
|
+
|
|
15
|
+
/** 组件样式统一使用的根类名。 */
|
|
16
|
+
export const ROOT_CLASS = 'dsh-ui'
|
|
17
|
+
|
|
18
|
+
/** 浮层容器元素 id。 */
|
|
19
|
+
export const PORTAL_ID = 'dsh-ui-portal'
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 幂等注入一张样式表。
|
|
23
|
+
*
|
|
24
|
+
* @param cssId - 表内唯一标识,例如 `foundation/bridge.css`。
|
|
25
|
+
* @param css - 样式表文本。
|
|
26
|
+
* @returns 释放函数,移除本次注入的标签;重复注入时返回空实现。
|
|
27
|
+
*/
|
|
28
|
+
export function injectUiStyle(cssId: string, css: string): () => void {
|
|
29
|
+
return injectStyle(OWNER, cssId, css)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** 浮层容器的类名,带上它才能在 body 层读到同一套变量。 */
|
|
33
|
+
export const OVERLAY_CLASS = `${ROOT_CLASS}-overlay`
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 取得或创建 body 级浮层容器。
|
|
37
|
+
*
|
|
38
|
+
* Arco 的 `Modal`、`Drawer` 与命令式弹层自带 `getPopupContainer` 默认值
|
|
39
|
+
* (直接返回 `document.body`),不读 `ConfigProvider` 的设置,因此这类组件
|
|
40
|
+
* 必须显式传入本容器,否则浮层挂在 `body` 下拿不到 `.dsh-ui` 的变量。
|
|
41
|
+
*
|
|
42
|
+
* @returns 容器元素;服务端渲染时返回 `null`。
|
|
43
|
+
*/
|
|
44
|
+
export function ensureOverlayContainer(): HTMLElement | null {
|
|
45
|
+
if (typeof document === 'undefined') return null
|
|
46
|
+
const existing = document.getElementById(PORTAL_ID)
|
|
47
|
+
if (existing !== null) return existing
|
|
48
|
+
const host = document.createElement('div')
|
|
49
|
+
host.id = PORTAL_ID
|
|
50
|
+
host.className = OVERLAY_CLASS
|
|
51
|
+
document.body.appendChild(host)
|
|
52
|
+
return host
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 拼接类名,忽略假值。
|
|
57
|
+
*
|
|
58
|
+
* @param parts - 类名片段,假值被跳过。
|
|
59
|
+
* @returns 以单个空格连接的类名字符串。
|
|
60
|
+
*/
|
|
61
|
+
export function cx(...parts: Array<string | false | null | undefined>): string {
|
|
62
|
+
return parts.filter(Boolean).join(' ')
|
|
63
|
+
}
|