@rainbow-oh/yee-c 0.2.0 → 0.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.
Files changed (218) hide show
  1. package/dist/cjs/Button/button.js +2 -2
  2. package/dist/cjs/Button/style/index.less +23 -8
  3. package/dist/cjs/Card/demo/collapsible.js +2 -1
  4. package/dist/cjs/Carousel/demo/arrows.js +1 -1
  5. package/dist/cjs/Carousel/demo/autoplay.js +1 -1
  6. package/dist/cjs/Carousel/demo/effect.js +1 -1
  7. package/dist/cjs/Carousel/demo/position.js +1 -1
  8. package/dist/cjs/Config-Provider/interface.d.ts +4 -0
  9. package/dist/cjs/Form/Field.js +32 -10
  10. package/dist/cjs/Form/interface.d.ts +17 -1
  11. package/dist/cjs/Menu/style/index.less +2 -2
  12. package/dist/cjs/Radio/demo/button.js +1 -0
  13. package/dist/cjs/Radio/interface.d.ts +4 -0
  14. package/dist/cjs/Radio/radio-group.js +28 -14
  15. package/dist/cjs/Radio/radio.js +3 -1
  16. package/dist/cjs/Radio/style/index.less +19 -5
  17. package/dist/cjs/Segmented/demo/basic.d.ts +3 -0
  18. package/dist/cjs/Segmented/demo/basic.js +51 -0
  19. package/dist/cjs/Segmented/demo/block.d.ts +3 -0
  20. package/dist/cjs/Segmented/demo/block.js +49 -0
  21. package/dist/cjs/Segmented/demo/disabled.d.ts +3 -0
  22. package/dist/cjs/Segmented/demo/disabled.js +47 -0
  23. package/dist/cjs/Segmented/demo/size.d.ts +3 -0
  24. package/dist/cjs/Segmented/demo/size.js +37 -0
  25. package/dist/cjs/Segmented/index.d.ts +3 -0
  26. package/dist/cjs/Segmented/index.js +36 -0
  27. package/dist/cjs/Segmented/interface.d.ts +82 -0
  28. package/dist/cjs/Segmented/interface.js +17 -0
  29. package/dist/cjs/Segmented/segmented.d.ts +5 -0
  30. package/dist/cjs/Segmented/segmented.js +177 -0
  31. package/dist/cjs/Segmented/style/index.less +104 -0
  32. package/dist/cjs/Spin/spin.js +2 -1
  33. package/dist/cjs/Steps/step.js +1 -1
  34. package/dist/cjs/Steps/style/index.less +8 -2
  35. package/dist/cjs/Switch/demo/content.js +22 -1
  36. package/dist/cjs/Switch/style/index.less +16 -0
  37. package/dist/cjs/Switch/switch.js +9 -2
  38. package/dist/cjs/Table/interface.d.ts +5 -1
  39. package/dist/cjs/Table/theader/cell.js +4 -5
  40. package/dist/cjs/Tag/demo/size.js +1 -1
  41. package/dist/cjs/Tag/style/index.less +1 -0
  42. package/dist/cjs/Tour/demo/basic.d.ts +3 -0
  43. package/dist/cjs/Tour/demo/basic.js +69 -0
  44. package/dist/cjs/Tour/demo/indicators.d.ts +3 -0
  45. package/dist/cjs/Tour/demo/indicators.js +76 -0
  46. package/dist/cjs/Tour/demo/placement.d.ts +3 -0
  47. package/dist/cjs/Tour/demo/placement.js +80 -0
  48. package/dist/cjs/Tour/demo/scroll.d.ts +3 -0
  49. package/dist/cjs/Tour/demo/scroll.js +72 -0
  50. package/dist/cjs/Tour/index.d.ts +3 -0
  51. package/dist/cjs/Tour/index.js +36 -0
  52. package/dist/cjs/Tour/interface.d.ts +118 -0
  53. package/dist/cjs/Tour/interface.js +17 -0
  54. package/dist/cjs/Tour/style/index.less +103 -0
  55. package/dist/cjs/Tour/tour.d.ts +5 -0
  56. package/dist/cjs/Tour/tour.js +403 -0
  57. package/dist/cjs/Tree/demo/checkable.js +6 -6
  58. package/dist/cjs/index.d.ts +4 -0
  59. package/dist/cjs/index.js +6 -0
  60. package/dist/cjs/locale/interface.d.ts +7 -0
  61. package/dist/cjs/locale/lang/en_US.js +6 -0
  62. package/dist/cjs/locale/lang/ja_JP.js +6 -0
  63. package/dist/cjs/locale/lang/zh_CN.js +6 -0
  64. package/dist/cjs/locale/lang/zh_TW.js +6 -0
  65. package/dist/cjs/style/color.blue.css +1 -1
  66. package/dist/cjs/style/color.crimson.css +1 -1
  67. package/dist/cjs/style/color.css +18 -1
  68. package/dist/cjs/style/size.css +38 -0
  69. package/dist/cjs/style/themes.css +3 -3
  70. package/dist/cjs/style/variables.css +57 -2
  71. package/dist/cjs/version.d.ts +1 -1
  72. package/dist/cjs/version.js +1 -1
  73. package/dist/esm/Button/button.js +2 -2
  74. package/dist/esm/Button/style/index.less +23 -8
  75. package/dist/esm/Card/demo/collapsible.js +2 -1
  76. package/dist/esm/Carousel/demo/arrows.js +1 -1
  77. package/dist/esm/Carousel/demo/autoplay.js +1 -1
  78. package/dist/esm/Carousel/demo/effect.js +1 -1
  79. package/dist/esm/Carousel/demo/position.js +1 -1
  80. package/dist/esm/Config-Provider/interface.d.ts +4 -0
  81. package/dist/esm/Form/Field.js +11 -4
  82. package/dist/esm/Form/interface.d.ts +17 -1
  83. package/dist/esm/Menu/style/index.less +2 -2
  84. package/dist/esm/Radio/demo/button.js +1 -0
  85. package/dist/esm/Radio/interface.d.ts +4 -0
  86. package/dist/esm/Radio/radio-group.js +9 -2
  87. package/dist/esm/Radio/radio.js +3 -1
  88. package/dist/esm/Radio/style/index.less +19 -5
  89. package/dist/esm/Segmented/demo/basic.d.ts +3 -0
  90. package/dist/esm/Segmented/demo/basic.js +33 -0
  91. package/dist/esm/Segmented/demo/block.d.ts +3 -0
  92. package/dist/esm/Segmented/demo/block.js +29 -0
  93. package/dist/esm/Segmented/demo/disabled.d.ts +3 -0
  94. package/dist/esm/Segmented/demo/disabled.js +22 -0
  95. package/dist/esm/Segmented/demo/size.d.ts +3 -0
  96. package/dist/esm/Segmented/demo/size.js +15 -0
  97. package/dist/esm/Segmented/index.d.ts +3 -0
  98. package/dist/esm/Segmented/index.js +2 -0
  99. package/dist/esm/Segmented/interface.d.ts +82 -0
  100. package/dist/esm/Segmented/interface.js +1 -0
  101. package/dist/esm/Segmented/segmented.d.ts +5 -0
  102. package/dist/esm/Segmented/segmented.js +110 -0
  103. package/dist/esm/Segmented/style/index.less +104 -0
  104. package/dist/esm/Spin/spin.js +2 -1
  105. package/dist/esm/Steps/step.js +4 -1
  106. package/dist/esm/Steps/style/index.less +8 -2
  107. package/dist/esm/Switch/demo/content.js +12 -3
  108. package/dist/esm/Switch/style/index.less +16 -0
  109. package/dist/esm/Switch/switch.js +7 -5
  110. package/dist/esm/Table/interface.d.ts +5 -1
  111. package/dist/esm/Table/theader/cell.js +2 -3
  112. package/dist/esm/Tag/demo/size.js +6 -2
  113. package/dist/esm/Tag/style/index.less +1 -0
  114. package/dist/esm/Tour/demo/basic.d.ts +3 -0
  115. package/dist/esm/Tour/demo/basic.js +69 -0
  116. package/dist/esm/Tour/demo/indicators.d.ts +3 -0
  117. package/dist/esm/Tour/demo/indicators.js +73 -0
  118. package/dist/esm/Tour/demo/placement.d.ts +3 -0
  119. package/dist/esm/Tour/demo/placement.js +53 -0
  120. package/dist/esm/Tour/demo/scroll.d.ts +3 -0
  121. package/dist/esm/Tour/demo/scroll.js +58 -0
  122. package/dist/esm/Tour/index.d.ts +3 -0
  123. package/dist/esm/Tour/index.js +2 -0
  124. package/dist/esm/Tour/interface.d.ts +118 -0
  125. package/dist/esm/Tour/interface.js +1 -0
  126. package/dist/esm/Tour/style/index.less +103 -0
  127. package/dist/esm/Tour/tour.d.ts +5 -0
  128. package/dist/esm/Tour/tour.js +383 -0
  129. package/dist/esm/Tree/demo/checkable.js +6 -6
  130. package/dist/esm/index.d.ts +4 -0
  131. package/dist/esm/index.js +4 -0
  132. package/dist/esm/locale/interface.d.ts +7 -0
  133. package/dist/esm/locale/lang/en_US.js +6 -0
  134. package/dist/esm/locale/lang/ja_JP.js +6 -0
  135. package/dist/esm/locale/lang/zh_CN.js +6 -0
  136. package/dist/esm/locale/lang/zh_TW.js +6 -0
  137. package/dist/esm/style/color.blue.css +1 -1
  138. package/dist/esm/style/color.crimson.css +1 -1
  139. package/dist/esm/style/color.css +18 -1
  140. package/dist/esm/style/size.css +38 -0
  141. package/dist/esm/style/themes.css +3 -3
  142. package/dist/esm/style/variables.css +57 -2
  143. package/dist/esm/version.d.ts +1 -1
  144. package/dist/esm/version.js +1 -1
  145. package/dist/umd/yee-c.min.css +3 -3
  146. package/dist/umd/yee-c.min.js +1 -1
  147. package/package.json +1 -1
  148. package/src/Button/button.tsx +2 -2
  149. package/src/Button/style/index.less +23 -8
  150. package/src/Card/demo/collapsible.tsx +1 -0
  151. package/src/Carousel/demo/arrows.tsx +1 -1
  152. package/src/Carousel/demo/autoplay.tsx +1 -1
  153. package/src/Carousel/demo/effect.tsx +1 -1
  154. package/src/Carousel/demo/position.tsx +1 -1
  155. package/src/Config-Provider/index.en-US.md +2 -0
  156. package/src/Config-Provider/index.zh-CN.md +2 -0
  157. package/src/Config-Provider/interface.ts +4 -0
  158. package/src/Form/Field.tsx +30 -11
  159. package/src/Form/index.en-US.md +4 -0
  160. package/src/Form/index.zh-CN.md +4 -0
  161. package/src/Form/interface.ts +17 -1
  162. package/src/Menu/style/index.less +2 -2
  163. package/src/Radio/demo/button.tsx +1 -0
  164. package/src/Radio/index.en-US.md +2 -0
  165. package/src/Radio/index.zh-CN.md +2 -0
  166. package/src/Radio/interface.ts +4 -0
  167. package/src/Radio/radio-group.tsx +9 -1
  168. package/src/Radio/radio.tsx +2 -1
  169. package/src/Radio/style/index.less +19 -5
  170. package/src/Segmented/demo/basic.tsx +24 -0
  171. package/src/Segmented/demo/block.tsx +17 -0
  172. package/src/Segmented/demo/disabled.tsx +18 -0
  173. package/src/Segmented/demo/size.tsx +10 -0
  174. package/src/Segmented/index.en-US.md +47 -0
  175. package/src/Segmented/index.ts +12 -0
  176. package/src/Segmented/index.zh-CN.md +47 -0
  177. package/src/Segmented/interface.ts +87 -0
  178. package/src/Segmented/segmented.tsx +134 -0
  179. package/src/Segmented/style/index.less +104 -0
  180. package/src/Spin/spin.tsx +1 -0
  181. package/src/Steps/step.tsx +1 -1
  182. package/src/Steps/style/index.less +8 -2
  183. package/src/Switch/demo/content.tsx +15 -5
  184. package/src/Switch/style/index.less +16 -0
  185. package/src/Switch/switch.tsx +14 -6
  186. package/src/Table/index.en-US.md +1 -0
  187. package/src/Table/index.zh-CN.md +1 -0
  188. package/src/Table/interface.ts +5 -1
  189. package/src/Table/theader/cell.tsx +2 -9
  190. package/src/Tag/demo/size.tsx +2 -2
  191. package/src/Tag/style/index.less +1 -0
  192. package/src/Tour/demo/basic.tsx +52 -0
  193. package/src/Tour/demo/indicators.tsx +63 -0
  194. package/src/Tour/demo/placement.tsx +55 -0
  195. package/src/Tour/demo/scroll.tsx +49 -0
  196. package/src/Tour/index.en-US.md +61 -0
  197. package/src/Tour/index.ts +10 -0
  198. package/src/Tour/index.zh-CN.md +61 -0
  199. package/src/Tour/interface.ts +126 -0
  200. package/src/Tour/style/index.less +103 -0
  201. package/src/Tour/tour.tsx +399 -0
  202. package/src/Tree/demo/checkable.tsx +6 -6
  203. package/src/index.ts +6 -0
  204. package/src/locale/interface.ts +9 -0
  205. package/src/locale/lang/en_US.ts +7 -0
  206. package/src/locale/lang/ja_JP.ts +7 -0
  207. package/src/locale/lang/zh_CN.ts +7 -0
  208. package/src/locale/lang/zh_TW.ts +7 -0
  209. package/src/style/color.blue.css +1 -1
  210. package/src/style/color.crimson.css +1 -1
  211. package/src/style/color.css +18 -1
  212. package/src/style/size.css +38 -0
  213. package/src/version.ts +1 -1
  214. package/dist/cjs/utils/x.d.ts +0 -11
  215. package/dist/cjs/utils/x.js +0 -51
  216. package/dist/esm/utils/x.d.ts +0 -11
  217. package/dist/esm/utils/x.js +0 -49
  218. package/src/utils/x.ts +0 -33
@@ -0,0 +1,47 @@
1
+ ---
2
+ category: Components
3
+ title: Segmented
4
+ subtitle: 分段选择器
5
+ group:
6
+ title: 数据录入
7
+ order: 3
8
+ toc: 'content'
9
+ ---
10
+
11
+ # Segmented 分段选择器
12
+
13
+ 展示一组互斥选项,选中项以高亮滑块(thumb)跟随切换,常用于视图切换、模式切换等场景。
14
+
15
+ ## 代码演示
16
+
17
+ <code src="./demo/basic.tsx" title="基础用法" description="Segmented 的基础用法,支持受控与非受控,options 支持配置对象或原始值简写"></code>
18
+ <code src="./demo/disabled.tsx" title="禁用" description="禁用单个选项或整组"></code>
19
+ <code src="./demo/size.tsx" title="尺寸" description="small / default / large 三种尺寸"></code>
20
+ <code src="./demo/block.tsx" title="撑满与图标" description="block 撑满容器宽度,选项可带图标"></code>
21
+
22
+ ## API
23
+
24
+ ### SegmentedProps
25
+
26
+ | 属性名 | 类型 | 描述 | 默认值 |
27
+ | --- | --- | --- | --- |
28
+ | prefixCls | `string` | 自定义类名前缀 | - |
29
+ | className | `string` | 自定义根类名 | - |
30
+ | style | `React.CSSProperties` | 自定义根样式 | - |
31
+ | classNames | `Partial<Record<'item' \| 'thumb', string>>` | 语义化结构类名 | - |
32
+ | styles | `Partial<Record<'item' \| 'thumb', React.CSSProperties>>` | 语义化结构样式 | - |
33
+ | options | `Array<SegmentedOption>` | 选项,支持配置对象或 `string \| number` 简写 | - |
34
+ | value | `string \| number` | 受控选中值 | - |
35
+ | defaultValue | `string \| number` | 默认选中值 | - |
36
+ | onChange | `(value: string \| number) => void` | 值改变时的回调 | - |
37
+ | disabled | `boolean` | 是否禁用所有选项 | - |
38
+ | size | `'small' \| 'default' \| 'large'` | 尺寸 | - |
39
+ | block | `boolean` | 是否撑满容器宽度,选项等分 | - |
40
+ | name | `string` | 底层 radio input 的 name,用于表单分组 | - |
41
+
42
+ ### SegmentedOption
43
+
44
+ | 类型 | 描述 |
45
+ | --- | --- |
46
+ | `SegmentedLabeledOption` | `{ label?: ReactNode; value: string \| number; disabled?: boolean; icon?: ReactNode; className?: string }` |
47
+ | `SegmentedRawOption` | `string \| number`,简写形式,label 取值转字符串 |
@@ -0,0 +1,87 @@
1
+ import type { DataAttributeProps } from '../utils/types';
2
+
3
+ export type SegmentedValue = string | number;
4
+
5
+ export type SegmentedSemanticDOM = 'item' | 'thumb';
6
+
7
+ export interface SegmentedLabeledOption {
8
+ /**
9
+ * Custom item class name
10
+ */
11
+ className?: string;
12
+ /**
13
+ * Item label
14
+ */
15
+ label?: React.ReactNode;
16
+ /**
17
+ * Item value
18
+ */
19
+ value: SegmentedValue;
20
+ /**
21
+ * Whether the item is disabled
22
+ */
23
+ disabled?: boolean;
24
+ /**
25
+ * Item icon
26
+ */
27
+ icon?: React.ReactNode;
28
+ }
29
+
30
+ export type SegmentedRawOption = SegmentedValue;
31
+
32
+ export type SegmentedOption = SegmentedLabeledOption | SegmentedRawOption;
33
+
34
+ export interface SegmentedProps extends DataAttributeProps {
35
+ /**
36
+ * Custom prefix class name
37
+ */
38
+ prefixCls?: string;
39
+ /**
40
+ * Custom root class name
41
+ */
42
+ className?: string;
43
+ /**
44
+ * Custom root style
45
+ */
46
+ style?: React.CSSProperties;
47
+ /**
48
+ * Semantic structure class names
49
+ */
50
+ classNames?: Partial<Record<SegmentedSemanticDOM, string>>;
51
+ /**
52
+ * Semantic structure styles
53
+ */
54
+ styles?: Partial<Record<SegmentedSemanticDOM, React.CSSProperties>>;
55
+ /**
56
+ * Options, supports config objects or primitive shorthand (string/number)
57
+ */
58
+ options?: SegmentedOption[];
59
+ /**
60
+ * Controlled selected value
61
+ */
62
+ value?: SegmentedValue;
63
+ /**
64
+ * Default selected value
65
+ */
66
+ defaultValue?: SegmentedValue;
67
+ /**
68
+ * Callback when selected value changes
69
+ */
70
+ onChange?: (value: SegmentedValue) => void;
71
+ /**
72
+ * Whether to disable all options
73
+ */
74
+ disabled?: boolean;
75
+ /**
76
+ * Size
77
+ */
78
+ size?: 'small' | 'default' | 'large';
79
+ /**
80
+ * Whether to fill the container width, options share the space equally
81
+ */
82
+ block?: boolean;
83
+ /**
84
+ * Group name for the underlying radio inputs
85
+ */
86
+ name?: string;
87
+ }
@@ -0,0 +1,134 @@
1
+ import clsx from 'clsx';
2
+ import React, { useContext, useId, useMemo } from 'react';
3
+ import { motion } from 'motion/react';
4
+ import { GlobalContext } from '../Config-Provider';
5
+ import useMergedState from '../hooks/useMergedState';
6
+ import mergeContextToProps from '../utils/mergeContextToProps';
7
+ import type {
8
+ SegmentedLabeledOption,
9
+ SegmentedOption,
10
+ SegmentedProps,
11
+ SegmentedValue,
12
+ } from './interface';
13
+
14
+ import './style/index.less';
15
+
16
+ const normalizeOption = (
17
+ option: SegmentedOption,
18
+ ): SegmentedLabeledOption => {
19
+ if (typeof option === 'string' || typeof option === 'number') {
20
+ return { label: String(option), value: option };
21
+ }
22
+ return option;
23
+ };
24
+
25
+ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
26
+ (baseprops, ref) => {
27
+ const { segmented } = useContext(GlobalContext);
28
+ const props = mergeContextToProps<SegmentedProps>(baseprops, segmented);
29
+
30
+ const uid = useId();
31
+
32
+ const {
33
+ prefixCls = 'yee-segmented',
34
+ className,
35
+ style,
36
+ classNames,
37
+ styles,
38
+ options = [],
39
+ value,
40
+ defaultValue,
41
+ disabled,
42
+ size,
43
+ block,
44
+ name = uid,
45
+ onChange,
46
+ ...rest
47
+ } = props;
48
+
49
+ const items = useMemo(
50
+ () => options.map(normalizeOption),
51
+ [options],
52
+ );
53
+
54
+ const firstValue = items[0]?.value;
55
+
56
+ const [mergedValue, setMergedValue] = useMergedState<
57
+ SegmentedValue | undefined
58
+ >(firstValue, {
59
+ value,
60
+ defaultValue,
61
+ });
62
+
63
+ const cls = clsx(
64
+ prefixCls,
65
+ {
66
+ [`${prefixCls}-${size}`]: size,
67
+ [`${prefixCls}-block`]: block,
68
+ [`${prefixCls}-disabled`]: disabled,
69
+ },
70
+ className,
71
+ );
72
+
73
+ const handleChange = (itemValue: SegmentedValue) => {
74
+ setMergedValue(itemValue);
75
+ onChange?.(itemValue);
76
+ };
77
+
78
+ return (
79
+ <div {...rest} ref={ref} className={cls} style={style} role="radiogroup">
80
+ {items.map((item) => {
81
+ const selected = item.value === mergedValue;
82
+ const itemDisabled = disabled || item.disabled;
83
+ return (
84
+ <label
85
+ key={item.value}
86
+ className={clsx(`${prefixCls}-item`, item.className, {
87
+ [`${prefixCls}-item-selected`]: selected,
88
+ [`${prefixCls}-item-disabled`]: itemDisabled,
89
+ })}
90
+ >
91
+ {selected ? (
92
+ <motion.span
93
+ layoutId={`${prefixCls}-thumb-${uid}`}
94
+ className={clsx(`${prefixCls}-thumb`, classNames?.thumb)}
95
+ style={styles?.thumb}
96
+ transition={{
97
+ type: 'spring',
98
+ visualDuration: 0.3,
99
+ bounce: 0.2,
100
+ }}
101
+ />
102
+ ) : null}
103
+ <span className={`${prefixCls}-item-inner`}>
104
+ {item.icon ? (
105
+ <span className={`${prefixCls}-item-icon`}>
106
+ {item.icon}
107
+ </span>
108
+ ) : null}
109
+ {item.label !== undefined && item.label !== null ? (
110
+ <span className={`${prefixCls}-item-label`}>
111
+ {item.label}
112
+ </span>
113
+ ) : null}
114
+ </span>
115
+ <input
116
+ type="radio"
117
+ className={`${prefixCls}-input`}
118
+ name={name}
119
+ value={item.value}
120
+ checked={selected}
121
+ disabled={itemDisabled}
122
+ onChange={() => handleChange(item.value)}
123
+ />
124
+ </label>
125
+ );
126
+ })}
127
+ </div>
128
+ );
129
+ },
130
+ );
131
+
132
+ Segmented.displayName = 'Segmented';
133
+
134
+ export default Segmented;
@@ -0,0 +1,104 @@
1
+ @pls: .yee-segmented;
2
+
3
+ @{pls} {
4
+ display: inline-flex;
5
+ box-sizing: border-box;
6
+ padding: var(--yee-segmented-padding);
7
+ border-radius: var(--yee-segmented-border-radius);
8
+ background-color: var(--yee-segmented-bg-color);
9
+
10
+ &-block {
11
+ display: flex;
12
+ width: 100%;
13
+
14
+ @{pls}-item {
15
+ flex: 1;
16
+ justify-content: center;
17
+ }
18
+ }
19
+
20
+ &-disabled {
21
+ cursor: not-allowed;
22
+ }
23
+
24
+ &-item {
25
+ position: relative;
26
+ display: inline-flex;
27
+ flex: none;
28
+ align-items: center;
29
+ justify-content: center;
30
+ box-sizing: border-box;
31
+ padding: var(--yee-segmented-item-padding);
32
+ border-radius: var(--yee-segmented-item-border-radius);
33
+ font-size: var(--yee-segmented-font-size);
34
+ color: var(--yee-segmented-item-color);
35
+ white-space: nowrap;
36
+ cursor: pointer;
37
+ user-select: none;
38
+ transition: color var(--yee-segmented-transition-duration) linear;
39
+
40
+ &:hover:not(&-disabled):not(&-selected) {
41
+ color: var(--yee-segmented-item-hover-color);
42
+ }
43
+ }
44
+
45
+ &-item-inner {
46
+ position: relative;
47
+ z-index: 1;
48
+ display: inline-flex;
49
+ align-items: center;
50
+ gap: var(--yee-segmented-item-gap);
51
+ }
52
+
53
+ &-item-icon {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ }
57
+
58
+ &-item-selected {
59
+ color: var(--yee-segmented-item-selected-color);
60
+ cursor: default;
61
+ }
62
+
63
+ &-item-disabled {
64
+ color: var(--yee-segmented-item-disabled-color);
65
+ cursor: not-allowed;
66
+ }
67
+
68
+ &-thumb {
69
+ position: absolute;
70
+ inset: 0;
71
+ z-index: 0;
72
+ border-radius: var(--yee-segmented-thumb-border-radius);
73
+ background-color: var(--yee-segmented-thumb-bg-color);
74
+ box-shadow: var(--yee-segmented-thumb-box-shadow);
75
+ }
76
+
77
+ &-input {
78
+ position: absolute;
79
+ inset: 0;
80
+ width: 100%;
81
+ height: 100%;
82
+ margin: 0;
83
+ opacity: 0;
84
+ cursor: inherit;
85
+ }
86
+
87
+ &-item:has(&-input:focus-visible) {
88
+ box-shadow: 0 0 0 2px var(--yee-primary-color);
89
+ }
90
+
91
+ &-small {
92
+ @{pls}-item {
93
+ padding: var(--yee-segmented-item-small-padding);
94
+ font-size: var(--yee-segmented-font-small-size);
95
+ }
96
+ }
97
+
98
+ &-large {
99
+ @{pls}-item {
100
+ padding: var(--yee-segmented-item-large-padding);
101
+ font-size: var(--yee-segmented-font-large-size);
102
+ }
103
+ }
104
+ }
package/src/Spin/spin.tsx CHANGED
@@ -55,6 +55,7 @@ const Spin: FC<SpinProps> = (baseprops) => {
55
55
  styles={styles}
56
56
  size={size}
57
57
  variant={variant}
58
+ color={color}
58
59
  />
59
60
  {tip && (
60
61
  <span
@@ -64,7 +64,7 @@ const Step: React.FC<StepProps> = (props) => {
64
64
 
65
65
  return index < current ? (
66
66
  <span className={`${prefixCls}-item-serial ${prefixCls}-item-icon-check`}>
67
- <Check />
67
+ <Check size={18} strokeWidth={3} />
68
68
  </span>
69
69
  ) : (
70
70
  <span className={`${prefixCls}-item-serial`}>{index + 1}</span>
@@ -142,7 +142,7 @@
142
142
  background-color: var(--yee-steps-serial-done-bg-color, #fff);
143
143
  background-clip: padding-box;
144
144
  border-color: var(--yee-steps-serial-done-border-color, #1890ff);
145
- color: var(--yee-steps-serial-done-color, #1890ff);
145
+ color: var(--yee-steps-step-done-color);
146
146
  }
147
147
 
148
148
  @{pls}-item-title {
@@ -283,9 +283,15 @@
283
283
  margin-bottom: 8px;
284
284
  padding-left: 0;
285
285
 
286
+ &-title {
287
+ &::after {
288
+ display: none;
289
+ }
290
+ }
291
+
286
292
  &-content {
287
293
  align-items: flex-start;
288
- margin-left: 8px;
294
+ margin-left: 12px;
289
295
  }
290
296
 
291
297
  &-icon {
@@ -4,11 +4,21 @@ import React from 'react';
4
4
  export default () => {
5
5
  return (
6
6
  <Space direction="vertical">
7
- <Switch checkedChildren="ON" unCheckedChildren="OFF" />
8
-
9
- <Switch checkedChildren="On" unCheckedChildren="Off" />
10
-
11
- <Switch checkedChildren="✅" unCheckedChildren="❌" />
7
+ <Switch
8
+ checkedChildren="ON"
9
+ unCheckedChildren="OFF"
10
+ style={{ width: 60 }}
11
+ />
12
+ <Switch
13
+ checkedChildren="On"
14
+ unCheckedChildren="OFF"
15
+ style={{ width: 60 }}
16
+ />
17
+ <Switch
18
+ checkedChildren="✅"
19
+ unCheckedChildren="❌"
20
+ style={{ width: 48 }}
21
+ />
12
22
  </Space>
13
23
  );
14
24
  };
@@ -15,6 +15,10 @@
15
15
  cursor: pointer;
16
16
  transition: background 0.2s linear;
17
17
 
18
+ &-spin {
19
+ position: absolute;
20
+ }
21
+
18
22
  &-handle {
19
23
  position: absolute;
20
24
  top: var(--yee-switch-handle-top);
@@ -67,6 +71,12 @@
67
71
  var(--m-switch-handle-size) + var(--yee-switch-inner-padding-offset)
68
72
  );
69
73
  }
74
+
75
+ @{pls}-spin {
76
+ inset-inline-end: calc(
77
+ var(--m-switch-handle-size) + var(--yee-switch-handle-offset)
78
+ );
79
+ }
70
80
  }
71
81
 
72
82
  &-unchecked {
@@ -77,6 +87,12 @@
77
87
  var(--m-switch-handle-size) + var(--yee-switch-inner-padding-offset)
78
88
  );
79
89
  }
90
+
91
+ @{pls}-spin {
92
+ padding-inline-start: calc(
93
+ var(--m-switch-handle-size) + var(--yee-switch-inner-padding-offset)
94
+ );
95
+ }
80
96
  }
81
97
 
82
98
  --m-switch-handle-size: var(--yee-switch-handle-size);
@@ -58,7 +58,7 @@ const Switch = (baseprops: SwitchProps) => {
58
58
  role="switch"
59
59
  aria-checked={mergedChecked}
60
60
  className={cls}
61
- disabled={disabled}
61
+ disabled={disabled || loading}
62
62
  onClick={onClick}
63
63
  style={style}
64
64
  >
@@ -71,11 +71,19 @@ const Switch = (baseprops: SwitchProps) => {
71
71
  bounce: 0.2,
72
72
  }}
73
73
  >
74
- {loading ? (
75
- <Spin size="small" />
76
- ) : (
77
- <span className={clsx(`${prefixCls}-handle-inner`)}></span>
78
- )}
74
+ {/* {loading ? (
75
+
76
+ ) : ( */}
77
+ <span className={clsx(`${prefixCls}-handle-inner`)}>
78
+ {loading ? (
79
+ <Spin
80
+ size="small"
81
+ className={`${prefixCls}-spin`}
82
+ color={checked ? '#fff' : undefined}
83
+ />
84
+ ) : null}
85
+ </span>
86
+ {/* )} */}
79
87
  </motion.span>
80
88
  <span
81
89
  className={clsx(`${prefixCls}-inner`, classNames?.inner)}
@@ -38,6 +38,7 @@ A table displays rows of data.
38
38
  | columns | `ColumnProps[]` | Table column configuration | - |
39
39
  | children | `Array<React.ReactElement<ColumnProps>> | React.ReactElement<ColumnProps>` | Children elements | - |
40
40
  | locale | `Record<string, string>` | Locale messages | - |
41
+ | noData | `React.ReactNode` | Content displayed when no data is available | - |
41
42
  | dataSource | `Array<Record<string, any>>` | Data source | - |
42
43
  | footer | `React.ReactNode \| (() => React.ReactNode)` | Table footer | - |
43
44
  | loading | `boolean` | Loading state | - |
@@ -43,6 +43,7 @@ toc: 'content'
43
43
  | columns | `ColumnProps[]` | 表格列的配置信息 | - |
44
44
  | children | `Array<React.ReactElement<ColumnProps>> \| React.ReactElement<ColumnProps>` | 子元素 | - |
45
45
  | locale | `Record<string, string>` | 提示信息 | - |
46
+ | noData | `React.ReactNode` | 无数据时展示的内容 | - |
46
47
  | dataSource | `Array<Record<string, any>>` | 数据 | - |
47
48
  | footer | `React.ReactNode \| (() => React.ReactNode)` | 表格底部 | - |
48
49
  | loading | `boolean` | 加载状态 | - |
@@ -267,7 +267,7 @@ export interface ColumnProps {
267
267
  * Custom render cell content
268
268
  */
269
269
  render?: (
270
- record: HeadCellProps | Record<string, unknown>,
270
+ record: Record<string, unknown>,
271
271
  rowIndex: number,
272
272
  ) => React.ReactNode;
273
273
  }
@@ -492,6 +492,10 @@ export interface TableProps
492
492
  * Locale text, including sort and empty data hints
493
493
  */
494
494
  locale?: Record<string, string>;
495
+ /**
496
+ * Content displayed when no data is available
497
+ * */
498
+ noData?: React.ReactNode;
495
499
  /**
496
500
  * Data
497
501
  */
@@ -29,7 +29,6 @@ const HeadCell: React.FC<HeadCellProps> = (props) => {
29
29
  onHeaderCell,
30
30
  onSort,
31
31
  onInternalFilter,
32
- render,
33
32
  ...rest
34
33
  } = props;
35
34
 
@@ -117,14 +116,8 @@ const HeadCell: React.FC<HeadCellProps> = (props) => {
117
116
  className={`${prefixCls}-thead-cell`}
118
117
  style={{ justifyContent: align }}
119
118
  >
120
- {render ? (
121
- render(props, 0)
122
- ) : (
123
- <>
124
- {renderTitle()}
125
- {renderFilter()}
126
- </>
127
- )}
119
+ {renderTitle()}
120
+ {renderFilter()}
128
121
  </div>
129
122
  );
130
123
  };
@@ -4,13 +4,13 @@ import React from 'react';
4
4
  export default () => {
5
5
  return (
6
6
  <Space direction="vertical">
7
- <Space>
7
+ <Space block>
8
8
  <Tag size="small">Small</Tag>
9
9
  <Tag size="default">Default</Tag>
10
10
  <Tag size="large">Large</Tag>
11
11
  </Space>
12
12
 
13
- <Space>
13
+ <Space block>
14
14
  <Tag size="small" status="success">
15
15
  Small Success
16
16
  </Tag>
@@ -5,6 +5,7 @@
5
5
  align-items: center;
6
6
  box-sizing: content-box;
7
7
  max-width: 100%;
8
+ white-space: nowrap;
8
9
  height: var(--yee-tag-height);
9
10
  padding: var(--yee-tag-padding);
10
11
  color: var(--yee-tag-color);
@@ -0,0 +1,52 @@
1
+ import { Button, Space, Tour } from '@rainbow-oh/yee-c';
2
+ import React, { useRef, useState } from 'react';
3
+
4
+ export default () => {
5
+ const [open, setOpen] = useState(false);
6
+ const startRef = useRef<HTMLDivElement>(null);
7
+ const midRef = useRef<HTMLDivElement>(null);
8
+ const endRef = useRef<HTMLDivElement>(null);
9
+
10
+ return (
11
+ <Space direction="vertical">
12
+ <Space>
13
+ <div ref={startRef} style={{ display: 'inline-block' }}>
14
+ <Button type="primary" onClick={() => setOpen(true)}>
15
+ 开始引导
16
+ </Button>
17
+ </div>
18
+ <div ref={midRef} style={{ display: 'inline-block' }}>
19
+ <Button>导出</Button>
20
+ </div>
21
+ <div ref={endRef} style={{ display: 'inline-block' }}>
22
+ <Button>设置</Button>
23
+ </div>
24
+ </Space>
25
+
26
+ <Tour
27
+ open={open}
28
+ onClose={() => setOpen(false)}
29
+ onFinish={() => setOpen(false)}
30
+ steps={[
31
+ {
32
+ target: () => startRef.current,
33
+ title: '欢迎使用',
34
+ description: '点击此处开始你的操作流程。',
35
+ },
36
+ {
37
+ target: () => midRef.current,
38
+ title: '导出数据',
39
+ description: '在这里可以将数据导出为文件。',
40
+ placement: 'bottom',
41
+ },
42
+ {
43
+ target: () => endRef.current,
44
+ title: '系统设置',
45
+ description: '配置系统参数。点击「完成」结束引导。',
46
+ placement: 'left',
47
+ },
48
+ ]}
49
+ />
50
+ </Space>
51
+ );
52
+ };