@rainbow-oh/yee-c 0.2.0 → 0.4.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 (242) 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/demo/basic.js +56 -81
  11. package/dist/cjs/Form/demo/form-table.js +68 -67
  12. package/dist/cjs/Form/interface.d.ts +17 -1
  13. package/dist/cjs/Menu/style/index.less +4 -2
  14. package/dist/cjs/Radio/demo/button.js +1 -0
  15. package/dist/cjs/Radio/interface.d.ts +4 -0
  16. package/dist/cjs/Radio/radio-group.js +28 -14
  17. package/dist/cjs/Radio/radio.js +3 -1
  18. package/dist/cjs/Radio/style/index.less +19 -5
  19. package/dist/cjs/Segmented/demo/basic.d.ts +3 -0
  20. package/dist/cjs/Segmented/demo/basic.js +51 -0
  21. package/dist/cjs/Segmented/demo/block.d.ts +3 -0
  22. package/dist/cjs/Segmented/demo/block.js +49 -0
  23. package/dist/cjs/Segmented/demo/disabled.d.ts +3 -0
  24. package/dist/cjs/Segmented/demo/disabled.js +47 -0
  25. package/dist/cjs/Segmented/demo/size.d.ts +3 -0
  26. package/dist/cjs/Segmented/demo/size.js +37 -0
  27. package/dist/cjs/Segmented/demo/variant.d.ts +3 -0
  28. package/dist/cjs/Segmented/demo/variant.js +50 -0
  29. package/dist/cjs/Segmented/index.d.ts +3 -0
  30. package/dist/cjs/Segmented/index.js +36 -0
  31. package/dist/cjs/Segmented/interface.d.ts +87 -0
  32. package/dist/cjs/Segmented/interface.js +17 -0
  33. package/dist/cjs/Segmented/segmented.d.ts +5 -0
  34. package/dist/cjs/Segmented/segmented.js +180 -0
  35. package/dist/cjs/Segmented/style/index.less +128 -0
  36. package/dist/cjs/Spin/spin.js +2 -1
  37. package/dist/cjs/Steps/step.js +1 -1
  38. package/dist/cjs/Steps/style/index.less +8 -2
  39. package/dist/cjs/Switch/demo/content.js +22 -1
  40. package/dist/cjs/Switch/style/index.less +16 -0
  41. package/dist/cjs/Switch/switch.js +9 -2
  42. package/dist/cjs/Table/interface.d.ts +5 -1
  43. package/dist/cjs/Table/theader/cell.js +4 -5
  44. package/dist/cjs/Tag/demo/size.js +1 -1
  45. package/dist/cjs/Tag/demo/variant.d.ts +3 -0
  46. package/dist/cjs/Tag/demo/variant.js +39 -0
  47. package/dist/cjs/Tag/interface.d.ts +5 -0
  48. package/dist/cjs/Tag/style/index.less +109 -25
  49. package/dist/cjs/Tag/tag.js +3 -0
  50. package/dist/cjs/Tour/demo/basic.d.ts +3 -0
  51. package/dist/cjs/Tour/demo/basic.js +69 -0
  52. package/dist/cjs/Tour/demo/indicators.d.ts +3 -0
  53. package/dist/cjs/Tour/demo/indicators.js +76 -0
  54. package/dist/cjs/Tour/demo/placement.d.ts +3 -0
  55. package/dist/cjs/Tour/demo/placement.js +80 -0
  56. package/dist/cjs/Tour/demo/scroll.d.ts +3 -0
  57. package/dist/cjs/Tour/demo/scroll.js +72 -0
  58. package/dist/cjs/Tour/index.d.ts +3 -0
  59. package/dist/cjs/Tour/index.js +36 -0
  60. package/dist/cjs/Tour/interface.d.ts +118 -0
  61. package/dist/cjs/Tour/interface.js +17 -0
  62. package/dist/cjs/Tour/style/index.less +103 -0
  63. package/dist/cjs/Tour/tour.d.ts +5 -0
  64. package/dist/cjs/Tour/tour.js +403 -0
  65. package/dist/cjs/Tree/demo/checkable.js +6 -6
  66. package/dist/cjs/index.d.ts +4 -0
  67. package/dist/cjs/index.js +6 -0
  68. package/dist/cjs/locale/interface.d.ts +7 -0
  69. package/dist/cjs/locale/lang/en_US.js +6 -0
  70. package/dist/cjs/locale/lang/ja_JP.js +6 -0
  71. package/dist/cjs/locale/lang/zh_CN.js +6 -0
  72. package/dist/cjs/locale/lang/zh_TW.js +6 -0
  73. package/dist/cjs/style/color.blue.css +1 -1
  74. package/dist/cjs/style/color.crimson.css +1 -1
  75. package/dist/cjs/style/color.css +21 -4
  76. package/dist/cjs/style/size.css +38 -0
  77. package/dist/cjs/style/themes.css +3 -3
  78. package/dist/cjs/style/variables.css +60 -5
  79. package/dist/cjs/version.d.ts +1 -1
  80. package/dist/cjs/version.js +1 -1
  81. package/dist/esm/Button/button.js +2 -2
  82. package/dist/esm/Button/style/index.less +23 -8
  83. package/dist/esm/Card/demo/collapsible.js +2 -1
  84. package/dist/esm/Carousel/demo/arrows.js +1 -1
  85. package/dist/esm/Carousel/demo/autoplay.js +1 -1
  86. package/dist/esm/Carousel/demo/effect.js +1 -1
  87. package/dist/esm/Carousel/demo/position.js +1 -1
  88. package/dist/esm/Config-Provider/interface.d.ts +4 -0
  89. package/dist/esm/Form/Field.js +11 -4
  90. package/dist/esm/Form/demo/basic.js +2 -18
  91. package/dist/esm/Form/demo/form-table.js +4 -10
  92. package/dist/esm/Form/interface.d.ts +17 -1
  93. package/dist/esm/Menu/style/index.less +4 -2
  94. package/dist/esm/Radio/demo/button.js +1 -0
  95. package/dist/esm/Radio/interface.d.ts +4 -0
  96. package/dist/esm/Radio/radio-group.js +9 -2
  97. package/dist/esm/Radio/radio.js +3 -1
  98. package/dist/esm/Radio/style/index.less +19 -5
  99. package/dist/esm/Segmented/demo/basic.d.ts +3 -0
  100. package/dist/esm/Segmented/demo/basic.js +33 -0
  101. package/dist/esm/Segmented/demo/block.d.ts +3 -0
  102. package/dist/esm/Segmented/demo/block.js +29 -0
  103. package/dist/esm/Segmented/demo/disabled.d.ts +3 -0
  104. package/dist/esm/Segmented/demo/disabled.js +22 -0
  105. package/dist/esm/Segmented/demo/size.d.ts +3 -0
  106. package/dist/esm/Segmented/demo/size.js +15 -0
  107. package/dist/esm/Segmented/demo/variant.d.ts +3 -0
  108. package/dist/esm/Segmented/demo/variant.js +49 -0
  109. package/dist/esm/Segmented/index.d.ts +3 -0
  110. package/dist/esm/Segmented/index.js +2 -0
  111. package/dist/esm/Segmented/interface.d.ts +87 -0
  112. package/dist/esm/Segmented/interface.js +1 -0
  113. package/dist/esm/Segmented/segmented.d.ts +5 -0
  114. package/dist/esm/Segmented/segmented.js +112 -0
  115. package/dist/esm/Segmented/style/index.less +128 -0
  116. package/dist/esm/Spin/spin.js +2 -1
  117. package/dist/esm/Steps/step.js +4 -1
  118. package/dist/esm/Steps/style/index.less +8 -2
  119. package/dist/esm/Switch/demo/content.js +12 -3
  120. package/dist/esm/Switch/style/index.less +16 -0
  121. package/dist/esm/Switch/switch.js +7 -5
  122. package/dist/esm/Table/interface.d.ts +5 -1
  123. package/dist/esm/Table/theader/cell.js +2 -3
  124. package/dist/esm/Tag/demo/size.js +6 -2
  125. package/dist/esm/Tag/demo/variant.d.ts +3 -0
  126. package/dist/esm/Tag/demo/variant.js +48 -0
  127. package/dist/esm/Tag/interface.d.ts +5 -0
  128. package/dist/esm/Tag/style/index.less +109 -25
  129. package/dist/esm/Tag/tag.js +4 -2
  130. package/dist/esm/Tour/demo/basic.d.ts +3 -0
  131. package/dist/esm/Tour/demo/basic.js +69 -0
  132. package/dist/esm/Tour/demo/indicators.d.ts +3 -0
  133. package/dist/esm/Tour/demo/indicators.js +73 -0
  134. package/dist/esm/Tour/demo/placement.d.ts +3 -0
  135. package/dist/esm/Tour/demo/placement.js +53 -0
  136. package/dist/esm/Tour/demo/scroll.d.ts +3 -0
  137. package/dist/esm/Tour/demo/scroll.js +58 -0
  138. package/dist/esm/Tour/index.d.ts +3 -0
  139. package/dist/esm/Tour/index.js +2 -0
  140. package/dist/esm/Tour/interface.d.ts +118 -0
  141. package/dist/esm/Tour/interface.js +1 -0
  142. package/dist/esm/Tour/style/index.less +103 -0
  143. package/dist/esm/Tour/tour.d.ts +5 -0
  144. package/dist/esm/Tour/tour.js +383 -0
  145. package/dist/esm/Tree/demo/checkable.js +6 -6
  146. package/dist/esm/index.d.ts +4 -0
  147. package/dist/esm/index.js +4 -0
  148. package/dist/esm/locale/interface.d.ts +7 -0
  149. package/dist/esm/locale/lang/en_US.js +6 -0
  150. package/dist/esm/locale/lang/ja_JP.js +6 -0
  151. package/dist/esm/locale/lang/zh_CN.js +6 -0
  152. package/dist/esm/locale/lang/zh_TW.js +6 -0
  153. package/dist/esm/style/color.blue.css +1 -1
  154. package/dist/esm/style/color.crimson.css +1 -1
  155. package/dist/esm/style/color.css +21 -4
  156. package/dist/esm/style/size.css +38 -0
  157. package/dist/esm/style/themes.css +3 -3
  158. package/dist/esm/style/variables.css +60 -5
  159. package/dist/esm/version.d.ts +1 -1
  160. package/dist/esm/version.js +1 -1
  161. package/dist/umd/yee-c.min.css +4 -4
  162. package/dist/umd/yee-c.min.js +1 -1
  163. package/package.json +1 -1
  164. package/src/Button/button.tsx +2 -2
  165. package/src/Button/style/index.less +23 -8
  166. package/src/Card/demo/collapsible.tsx +1 -0
  167. package/src/Carousel/demo/arrows.tsx +1 -1
  168. package/src/Carousel/demo/autoplay.tsx +1 -1
  169. package/src/Carousel/demo/effect.tsx +1 -1
  170. package/src/Carousel/demo/position.tsx +1 -1
  171. package/src/Config-Provider/index.en-US.md +2 -0
  172. package/src/Config-Provider/index.zh-CN.md +2 -0
  173. package/src/Config-Provider/interface.ts +4 -0
  174. package/src/Form/Field.tsx +30 -11
  175. package/src/Form/demo/basic.tsx +2 -24
  176. package/src/Form/demo/form-table.tsx +16 -13
  177. package/src/Form/index.en-US.md +4 -0
  178. package/src/Form/index.zh-CN.md +4 -0
  179. package/src/Form/interface.ts +17 -1
  180. package/src/Menu/style/index.less +4 -2
  181. package/src/Radio/demo/button.tsx +1 -0
  182. package/src/Radio/index.en-US.md +2 -0
  183. package/src/Radio/index.zh-CN.md +2 -0
  184. package/src/Radio/interface.ts +4 -0
  185. package/src/Radio/radio-group.tsx +9 -1
  186. package/src/Radio/radio.tsx +2 -1
  187. package/src/Radio/style/index.less +19 -5
  188. package/src/Segmented/demo/basic.tsx +24 -0
  189. package/src/Segmented/demo/block.tsx +17 -0
  190. package/src/Segmented/demo/disabled.tsx +18 -0
  191. package/src/Segmented/demo/size.tsx +10 -0
  192. package/src/Segmented/demo/variant.tsx +28 -0
  193. package/src/Segmented/index.en-US.md +49 -0
  194. package/src/Segmented/index.ts +12 -0
  195. package/src/Segmented/index.zh-CN.md +49 -0
  196. package/src/Segmented/interface.ts +92 -0
  197. package/src/Segmented/segmented.tsx +136 -0
  198. package/src/Segmented/style/index.less +128 -0
  199. package/src/Spin/spin.tsx +1 -0
  200. package/src/Steps/step.tsx +1 -1
  201. package/src/Steps/style/index.less +8 -2
  202. package/src/Switch/demo/content.tsx +15 -5
  203. package/src/Switch/style/index.less +16 -0
  204. package/src/Switch/switch.tsx +14 -6
  205. package/src/Table/index.en-US.md +1 -0
  206. package/src/Table/index.zh-CN.md +1 -0
  207. package/src/Table/interface.ts +5 -1
  208. package/src/Table/theader/cell.tsx +2 -9
  209. package/src/Tag/demo/size.tsx +2 -2
  210. package/src/Tag/demo/variant.tsx +47 -0
  211. package/src/Tag/index.en-US.md +2 -0
  212. package/src/Tag/index.zh-CN.md +2 -0
  213. package/src/Tag/interface.ts +5 -0
  214. package/src/Tag/style/index.less +109 -25
  215. package/src/Tag/tag.tsx +2 -0
  216. package/src/Tour/demo/basic.tsx +52 -0
  217. package/src/Tour/demo/indicators.tsx +63 -0
  218. package/src/Tour/demo/placement.tsx +55 -0
  219. package/src/Tour/demo/scroll.tsx +49 -0
  220. package/src/Tour/index.en-US.md +61 -0
  221. package/src/Tour/index.ts +10 -0
  222. package/src/Tour/index.zh-CN.md +61 -0
  223. package/src/Tour/interface.ts +126 -0
  224. package/src/Tour/style/index.less +103 -0
  225. package/src/Tour/tour.tsx +399 -0
  226. package/src/Tree/demo/checkable.tsx +6 -6
  227. package/src/index.ts +6 -0
  228. package/src/locale/interface.ts +9 -0
  229. package/src/locale/lang/en_US.ts +7 -0
  230. package/src/locale/lang/ja_JP.ts +7 -0
  231. package/src/locale/lang/zh_CN.ts +7 -0
  232. package/src/locale/lang/zh_TW.ts +7 -0
  233. package/src/style/color.blue.css +1 -1
  234. package/src/style/color.crimson.css +1 -1
  235. package/src/style/color.css +21 -4
  236. package/src/style/size.css +38 -0
  237. package/src/version.ts +1 -1
  238. package/dist/cjs/utils/x.d.ts +0 -11
  239. package/dist/cjs/utils/x.js +0 -51
  240. package/dist/esm/utils/x.d.ts +0 -11
  241. package/dist/esm/utils/x.js +0 -49
  242. package/src/utils/x.ts +0 -33
@@ -0,0 +1,18 @@
1
+ import { Segmented } from '@rainbow-oh/yee-c';
2
+ import React from 'react';
3
+
4
+ export default () => (
5
+ <>
6
+ <Segmented
7
+ options={[
8
+ { label: 'A', value: 'a' },
9
+ { label: 'B', value: 'b', disabled: true },
10
+ { label: 'C', value: 'c' },
11
+ ]}
12
+ defaultValue="a"
13
+ />
14
+ <br />
15
+ <br />
16
+ <Segmented disabled options={['A', 'B', 'C']} defaultValue="A" />
17
+ </>
18
+ );
@@ -0,0 +1,10 @@
1
+ import { Segmented, Space } from '@rainbow-oh/yee-c';
2
+ import React from 'react';
3
+
4
+ export default () => (
5
+ <Space direction="vertical">
6
+ <Segmented size="small" options={['Small', 'B', 'C']} />
7
+ <Segmented options={['Default', 'B', 'C']} />
8
+ <Segmented size="large" options={['Large', 'B', 'C']} />
9
+ </Space>
10
+ );
@@ -0,0 +1,28 @@
1
+ import { Segmented, Space } from '@rainbow-oh/yee-c';
2
+ import { LayoutGrid, List } from 'lucide-react';
3
+ import React from 'react';
4
+
5
+ export default () => (
6
+ <Space direction="vertical">
7
+ <Space block>
8
+ <Segmented options={['Daily', 'Weekly', 'Monthly']} />
9
+ <Segmented variant="pill" options={['Daily', 'Weekly', 'Monthly']} />
10
+ </Space>
11
+ <Space block>
12
+ <Segmented variant="pill" size="small" options={['Small', 'Default', 'Large']} />
13
+ <Segmented variant="pill" size="large" options={['Small', 'Default', 'Large']} />
14
+ </Space>
15
+ <div style={{ width: 480 }}>
16
+ <Segmented
17
+ variant="pill"
18
+ block
19
+ defaultValue="list"
20
+ options={[
21
+ { label: 'List', value: 'list', icon: <List size={16} /> },
22
+ { label: 'Grid', value: 'grid', icon: <LayoutGrid size={16} /> },
23
+ { label: 'Detail', value: 'detail' },
24
+ ]}
25
+ />
26
+ </div>
27
+ </Space>
28
+ );
@@ -0,0 +1,49 @@
1
+ ---
2
+ category: Components
3
+ title: Segmented
4
+ subtitle: Segmented
5
+ group:
6
+ title: Data Entry
7
+ order: 3
8
+ toc: 'content'
9
+ ---
10
+
11
+ # Segmented
12
+
13
+ Displays a group of mutually exclusive options, with the selected item highlighted by a sliding thumb. Commonly used for view/mode switching.
14
+
15
+ ## Code Demo
16
+
17
+ <code src="./demo/basic.tsx" title="Basic" description="Basic usage, supports controlled/uncontrolled, options accept config objects or primitive shorthand"></code>
18
+ <code src="./demo/disabled.tsx" title="Disabled" description="Disable a single option or the whole group"></code>
19
+ <code src="./demo/size.tsx" title="Size" description="small / default / large"></code>
20
+ <code src="./demo/block.tsx" title="Block & Icon" description="block fills the container width, options can carry icons"></code>
21
+ <code src="./demo/variant.tsx" title="Variant" description="pill style: selected item highlighted as a colored capsule, no container background"></code>
22
+
23
+ ## API
24
+
25
+ ### SegmentedProps
26
+
27
+ | Property | Type | Description | Default |
28
+ | --- | --- | --- | --- |
29
+ | prefixCls | `string` | Custom class name prefix | - |
30
+ | className | `string` | Custom root class name | - |
31
+ | style | `React.CSSProperties` | Custom root style | - |
32
+ | classNames | `Partial<Record<'item' \| 'thumb', string>>` | Semantic structure class names | - |
33
+ | styles | `Partial<Record<'item' \| 'thumb', React.CSSProperties>>` | Semantic structure styles | - |
34
+ | options | `Array<SegmentedOption>` | Options, supports config objects or `string \| number` shorthand | - |
35
+ | value | `string \| number` | Controlled selected value | - |
36
+ | defaultValue | `string \| number` | Default selected value | - |
37
+ | onChange | `(value: string \| number) => void` | Callback when selected value changes | - |
38
+ | disabled | `boolean` | Whether to disable all options | - |
39
+ | size | `'small' \| 'default' \| 'large'` | Size | - |
40
+ | variant | `'default' \| 'pill'` | Visual style variant, `pill` renders a capsule style | `default` |
41
+ | block | `boolean` | Whether to fill the container width, options share the space equally | - |
42
+ | name | `string` | Name of the underlying radio input, for form grouping | - |
43
+
44
+ ### SegmentedOption
45
+
46
+ | Type | Description |
47
+ | --- | --- |
48
+ | `SegmentedLabeledOption` | `{ label?: ReactNode; value: string \| number; disabled?: boolean; icon?: ReactNode; className?: string }` |
49
+ | `SegmentedRawOption` | `string \| number`, shorthand form, label is the value cast to string |
@@ -0,0 +1,12 @@
1
+ import InternalSegmented from './segmented';
2
+
3
+ export type {
4
+ SegmentedOption,
5
+ SegmentedLabeledOption,
6
+ SegmentedRawOption,
7
+ SegmentedSemanticDOM,
8
+ SegmentedValue,
9
+ SegmentedProps,
10
+ } from './interface';
11
+
12
+ export default InternalSegmented;
@@ -0,0 +1,49 @@
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
+ <code src="./demo/variant.tsx" title="变体" description="pill 胶囊风格:选中项以主色胶囊高亮,容器无底色"></code>
22
+
23
+ ## API
24
+
25
+ ### SegmentedProps
26
+
27
+ | 属性名 | 类型 | 描述 | 默认值 |
28
+ | --- | --- | --- | --- |
29
+ | prefixCls | `string` | 自定义类名前缀 | - |
30
+ | className | `string` | 自定义根类名 | - |
31
+ | style | `React.CSSProperties` | 自定义根样式 | - |
32
+ | classNames | `Partial<Record<'item' \| 'thumb', string>>` | 语义化结构类名 | - |
33
+ | styles | `Partial<Record<'item' \| 'thumb', React.CSSProperties>>` | 语义化结构样式 | - |
34
+ | options | `Array<SegmentedOption>` | 选项,支持配置对象或 `string \| number` 简写 | - |
35
+ | value | `string \| number` | 受控选中值 | - |
36
+ | defaultValue | `string \| number` | 默认选中值 | - |
37
+ | onChange | `(value: string \| number) => void` | 值改变时的回调 | - |
38
+ | disabled | `boolean` | 是否禁用所有选项 | - |
39
+ | size | `'small' \| 'default' \| 'large'` | 尺寸 | - |
40
+ | variant | `'default' \| 'pill'` | 视觉风格变体,`pill` 为胶囊药丸风格 | `default` |
41
+ | block | `boolean` | 是否撑满容器宽度,选项等分 | - |
42
+ | name | `string` | 底层 radio input 的 name,用于表单分组 | - |
43
+
44
+ ### SegmentedOption
45
+
46
+ | 类型 | 描述 |
47
+ | --- | --- |
48
+ | `SegmentedLabeledOption` | `{ label?: ReactNode; value: string \| number; disabled?: boolean; icon?: ReactNode; className?: string }` |
49
+ | `SegmentedRawOption` | `string \| number`,简写形式,label 取值转字符串 |
@@ -0,0 +1,92 @@
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
+ * Visual style variant. `pill` renders the selected item as a colored capsule with no container background
81
+ * @default default
82
+ */
83
+ variant?: 'default' | 'pill';
84
+ /**
85
+ * Whether to fill the container width, options share the space equally
86
+ */
87
+ block?: boolean;
88
+ /**
89
+ * Group name for the underlying radio inputs
90
+ */
91
+ name?: string;
92
+ }
@@ -0,0 +1,136 @@
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
+ variant = 'default',
44
+ block,
45
+ name = uid,
46
+ onChange,
47
+ ...rest
48
+ } = props;
49
+
50
+ const items = useMemo(
51
+ () => options.map(normalizeOption),
52
+ [options],
53
+ );
54
+
55
+ const firstValue = items[0]?.value;
56
+
57
+ const [mergedValue, setMergedValue] = useMergedState<
58
+ SegmentedValue | undefined
59
+ >(firstValue, {
60
+ value,
61
+ defaultValue,
62
+ });
63
+
64
+ const cls = clsx(
65
+ prefixCls,
66
+ {
67
+ [`${prefixCls}-${size}`]: size,
68
+ [`${prefixCls}-${variant}`]: variant && variant !== 'default',
69
+ [`${prefixCls}-block`]: block,
70
+ [`${prefixCls}-disabled`]: disabled,
71
+ },
72
+ className,
73
+ );
74
+
75
+ const handleChange = (itemValue: SegmentedValue) => {
76
+ setMergedValue(itemValue);
77
+ onChange?.(itemValue);
78
+ };
79
+
80
+ return (
81
+ <div {...rest} ref={ref} className={cls} style={style} role="radiogroup">
82
+ {items.map((item) => {
83
+ const selected = item.value === mergedValue;
84
+ const itemDisabled = disabled || item.disabled;
85
+ return (
86
+ <label
87
+ key={item.value}
88
+ className={clsx(`${prefixCls}-item`, item.className, {
89
+ [`${prefixCls}-item-selected`]: selected,
90
+ [`${prefixCls}-item-disabled`]: itemDisabled,
91
+ })}
92
+ >
93
+ {selected ? (
94
+ <motion.span
95
+ layoutId={`${prefixCls}-thumb-${uid}`}
96
+ className={clsx(`${prefixCls}-thumb`, classNames?.thumb)}
97
+ style={styles?.thumb}
98
+ transition={{
99
+ type: 'spring',
100
+ visualDuration: 0.3,
101
+ bounce: 0.2,
102
+ }}
103
+ />
104
+ ) : null}
105
+ <span className={`${prefixCls}-item-inner`}>
106
+ {item.icon ? (
107
+ <span className={`${prefixCls}-item-icon`}>
108
+ {item.icon}
109
+ </span>
110
+ ) : null}
111
+ {item.label !== undefined && item.label !== null ? (
112
+ <span className={`${prefixCls}-item-label`}>
113
+ {item.label}
114
+ </span>
115
+ ) : null}
116
+ </span>
117
+ <input
118
+ type="radio"
119
+ className={`${prefixCls}-input`}
120
+ name={name}
121
+ value={item.value}
122
+ checked={selected}
123
+ disabled={itemDisabled}
124
+ onChange={() => handleChange(item.value)}
125
+ />
126
+ </label>
127
+ );
128
+ })}
129
+ </div>
130
+ );
131
+ },
132
+ );
133
+
134
+ Segmented.displayName = 'Segmented';
135
+
136
+ export default Segmented;
@@ -0,0 +1,128 @@
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
+ // 变体:胶囊风格,选中项以主色胶囊高亮,容器无底色
92
+ &-pill {
93
+ padding: 0;
94
+ background-color: transparent;
95
+ gap: var(--yee-segmented-item-gap);
96
+
97
+ @{pls}-item {
98
+ border-radius: 999px;
99
+ }
100
+
101
+ @{pls}-item-selected {
102
+ color: var(--yee-segmented-pill-color, #fff);
103
+ }
104
+
105
+ @{pls}-thumb {
106
+ border-radius: 999px;
107
+ background-color: var(
108
+ --yee-segmented-pill-bg-color,
109
+ var(--yee-primary-color)
110
+ );
111
+ box-shadow: none;
112
+ }
113
+ }
114
+
115
+ &-small {
116
+ @{pls}-item {
117
+ padding: var(--yee-segmented-item-small-padding);
118
+ font-size: var(--yee-segmented-font-small-size);
119
+ }
120
+ }
121
+
122
+ &-large {
123
+ @{pls}-item {
124
+ padding: var(--yee-segmented-item-large-padding);
125
+ font-size: var(--yee-segmented-font-large-size);
126
+ }
127
+ }
128
+ }
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 | - |