@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.
- package/dist/cjs/Button/button.js +2 -2
- package/dist/cjs/Button/style/index.less +23 -8
- package/dist/cjs/Card/demo/collapsible.js +2 -1
- package/dist/cjs/Carousel/demo/arrows.js +1 -1
- package/dist/cjs/Carousel/demo/autoplay.js +1 -1
- package/dist/cjs/Carousel/demo/effect.js +1 -1
- package/dist/cjs/Carousel/demo/position.js +1 -1
- package/dist/cjs/Config-Provider/interface.d.ts +4 -0
- package/dist/cjs/Form/Field.js +32 -10
- package/dist/cjs/Form/demo/basic.js +56 -81
- package/dist/cjs/Form/demo/form-table.js +68 -67
- package/dist/cjs/Form/interface.d.ts +17 -1
- package/dist/cjs/Menu/style/index.less +4 -2
- package/dist/cjs/Radio/demo/button.js +1 -0
- package/dist/cjs/Radio/interface.d.ts +4 -0
- package/dist/cjs/Radio/radio-group.js +28 -14
- package/dist/cjs/Radio/radio.js +3 -1
- package/dist/cjs/Radio/style/index.less +19 -5
- package/dist/cjs/Segmented/demo/basic.d.ts +3 -0
- package/dist/cjs/Segmented/demo/basic.js +51 -0
- package/dist/cjs/Segmented/demo/block.d.ts +3 -0
- package/dist/cjs/Segmented/demo/block.js +49 -0
- package/dist/cjs/Segmented/demo/disabled.d.ts +3 -0
- package/dist/cjs/Segmented/demo/disabled.js +47 -0
- package/dist/cjs/Segmented/demo/size.d.ts +3 -0
- package/dist/cjs/Segmented/demo/size.js +37 -0
- package/dist/cjs/Segmented/demo/variant.d.ts +3 -0
- package/dist/cjs/Segmented/demo/variant.js +50 -0
- package/dist/cjs/Segmented/index.d.ts +3 -0
- package/dist/cjs/Segmented/index.js +36 -0
- package/dist/cjs/Segmented/interface.d.ts +87 -0
- package/dist/cjs/Segmented/interface.js +17 -0
- package/dist/cjs/Segmented/segmented.d.ts +5 -0
- package/dist/cjs/Segmented/segmented.js +180 -0
- package/dist/cjs/Segmented/style/index.less +128 -0
- package/dist/cjs/Spin/spin.js +2 -1
- package/dist/cjs/Steps/step.js +1 -1
- package/dist/cjs/Steps/style/index.less +8 -2
- package/dist/cjs/Switch/demo/content.js +22 -1
- package/dist/cjs/Switch/style/index.less +16 -0
- package/dist/cjs/Switch/switch.js +9 -2
- package/dist/cjs/Table/interface.d.ts +5 -1
- package/dist/cjs/Table/theader/cell.js +4 -5
- package/dist/cjs/Tag/demo/size.js +1 -1
- package/dist/cjs/Tag/demo/variant.d.ts +3 -0
- package/dist/cjs/Tag/demo/variant.js +39 -0
- package/dist/cjs/Tag/interface.d.ts +5 -0
- package/dist/cjs/Tag/style/index.less +109 -25
- package/dist/cjs/Tag/tag.js +3 -0
- package/dist/cjs/Tour/demo/basic.d.ts +3 -0
- package/dist/cjs/Tour/demo/basic.js +69 -0
- package/dist/cjs/Tour/demo/indicators.d.ts +3 -0
- package/dist/cjs/Tour/demo/indicators.js +76 -0
- package/dist/cjs/Tour/demo/placement.d.ts +3 -0
- package/dist/cjs/Tour/demo/placement.js +80 -0
- package/dist/cjs/Tour/demo/scroll.d.ts +3 -0
- package/dist/cjs/Tour/demo/scroll.js +72 -0
- package/dist/cjs/Tour/index.d.ts +3 -0
- package/dist/cjs/Tour/index.js +36 -0
- package/dist/cjs/Tour/interface.d.ts +118 -0
- package/dist/cjs/Tour/interface.js +17 -0
- package/dist/cjs/Tour/style/index.less +103 -0
- package/dist/cjs/Tour/tour.d.ts +5 -0
- package/dist/cjs/Tour/tour.js +403 -0
- package/dist/cjs/Tree/demo/checkable.js +6 -6
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/locale/interface.d.ts +7 -0
- package/dist/cjs/locale/lang/en_US.js +6 -0
- package/dist/cjs/locale/lang/ja_JP.js +6 -0
- package/dist/cjs/locale/lang/zh_CN.js +6 -0
- package/dist/cjs/locale/lang/zh_TW.js +6 -0
- package/dist/cjs/style/color.blue.css +1 -1
- package/dist/cjs/style/color.crimson.css +1 -1
- package/dist/cjs/style/color.css +21 -4
- package/dist/cjs/style/size.css +38 -0
- package/dist/cjs/style/themes.css +3 -3
- package/dist/cjs/style/variables.css +60 -5
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Button/button.js +2 -2
- package/dist/esm/Button/style/index.less +23 -8
- package/dist/esm/Card/demo/collapsible.js +2 -1
- package/dist/esm/Carousel/demo/arrows.js +1 -1
- package/dist/esm/Carousel/demo/autoplay.js +1 -1
- package/dist/esm/Carousel/demo/effect.js +1 -1
- package/dist/esm/Carousel/demo/position.js +1 -1
- package/dist/esm/Config-Provider/interface.d.ts +4 -0
- package/dist/esm/Form/Field.js +11 -4
- package/dist/esm/Form/demo/basic.js +2 -18
- package/dist/esm/Form/demo/form-table.js +4 -10
- package/dist/esm/Form/interface.d.ts +17 -1
- package/dist/esm/Menu/style/index.less +4 -2
- package/dist/esm/Radio/demo/button.js +1 -0
- package/dist/esm/Radio/interface.d.ts +4 -0
- package/dist/esm/Radio/radio-group.js +9 -2
- package/dist/esm/Radio/radio.js +3 -1
- package/dist/esm/Radio/style/index.less +19 -5
- package/dist/esm/Segmented/demo/basic.d.ts +3 -0
- package/dist/esm/Segmented/demo/basic.js +33 -0
- package/dist/esm/Segmented/demo/block.d.ts +3 -0
- package/dist/esm/Segmented/demo/block.js +29 -0
- package/dist/esm/Segmented/demo/disabled.d.ts +3 -0
- package/dist/esm/Segmented/demo/disabled.js +22 -0
- package/dist/esm/Segmented/demo/size.d.ts +3 -0
- package/dist/esm/Segmented/demo/size.js +15 -0
- package/dist/esm/Segmented/demo/variant.d.ts +3 -0
- package/dist/esm/Segmented/demo/variant.js +49 -0
- package/dist/esm/Segmented/index.d.ts +3 -0
- package/dist/esm/Segmented/index.js +2 -0
- package/dist/esm/Segmented/interface.d.ts +87 -0
- package/dist/esm/Segmented/interface.js +1 -0
- package/dist/esm/Segmented/segmented.d.ts +5 -0
- package/dist/esm/Segmented/segmented.js +112 -0
- package/dist/esm/Segmented/style/index.less +128 -0
- package/dist/esm/Spin/spin.js +2 -1
- package/dist/esm/Steps/step.js +4 -1
- package/dist/esm/Steps/style/index.less +8 -2
- package/dist/esm/Switch/demo/content.js +12 -3
- package/dist/esm/Switch/style/index.less +16 -0
- package/dist/esm/Switch/switch.js +7 -5
- package/dist/esm/Table/interface.d.ts +5 -1
- package/dist/esm/Table/theader/cell.js +2 -3
- package/dist/esm/Tag/demo/size.js +6 -2
- package/dist/esm/Tag/demo/variant.d.ts +3 -0
- package/dist/esm/Tag/demo/variant.js +48 -0
- package/dist/esm/Tag/interface.d.ts +5 -0
- package/dist/esm/Tag/style/index.less +109 -25
- package/dist/esm/Tag/tag.js +4 -2
- package/dist/esm/Tour/demo/basic.d.ts +3 -0
- package/dist/esm/Tour/demo/basic.js +69 -0
- package/dist/esm/Tour/demo/indicators.d.ts +3 -0
- package/dist/esm/Tour/demo/indicators.js +73 -0
- package/dist/esm/Tour/demo/placement.d.ts +3 -0
- package/dist/esm/Tour/demo/placement.js +53 -0
- package/dist/esm/Tour/demo/scroll.d.ts +3 -0
- package/dist/esm/Tour/demo/scroll.js +58 -0
- package/dist/esm/Tour/index.d.ts +3 -0
- package/dist/esm/Tour/index.js +2 -0
- package/dist/esm/Tour/interface.d.ts +118 -0
- package/dist/esm/Tour/interface.js +1 -0
- package/dist/esm/Tour/style/index.less +103 -0
- package/dist/esm/Tour/tour.d.ts +5 -0
- package/dist/esm/Tour/tour.js +383 -0
- package/dist/esm/Tree/demo/checkable.js +6 -6
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/locale/interface.d.ts +7 -0
- package/dist/esm/locale/lang/en_US.js +6 -0
- package/dist/esm/locale/lang/ja_JP.js +6 -0
- package/dist/esm/locale/lang/zh_CN.js +6 -0
- package/dist/esm/locale/lang/zh_TW.js +6 -0
- package/dist/esm/style/color.blue.css +1 -1
- package/dist/esm/style/color.crimson.css +1 -1
- package/dist/esm/style/color.css +21 -4
- package/dist/esm/style/size.css +38 -0
- package/dist/esm/style/themes.css +3 -3
- package/dist/esm/style/variables.css +60 -5
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.css +4 -4
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/Button/button.tsx +2 -2
- package/src/Button/style/index.less +23 -8
- package/src/Card/demo/collapsible.tsx +1 -0
- package/src/Carousel/demo/arrows.tsx +1 -1
- package/src/Carousel/demo/autoplay.tsx +1 -1
- package/src/Carousel/demo/effect.tsx +1 -1
- package/src/Carousel/demo/position.tsx +1 -1
- package/src/Config-Provider/index.en-US.md +2 -0
- package/src/Config-Provider/index.zh-CN.md +2 -0
- package/src/Config-Provider/interface.ts +4 -0
- package/src/Form/Field.tsx +30 -11
- package/src/Form/demo/basic.tsx +2 -24
- package/src/Form/demo/form-table.tsx +16 -13
- package/src/Form/index.en-US.md +4 -0
- package/src/Form/index.zh-CN.md +4 -0
- package/src/Form/interface.ts +17 -1
- package/src/Menu/style/index.less +4 -2
- package/src/Radio/demo/button.tsx +1 -0
- package/src/Radio/index.en-US.md +2 -0
- package/src/Radio/index.zh-CN.md +2 -0
- package/src/Radio/interface.ts +4 -0
- package/src/Radio/radio-group.tsx +9 -1
- package/src/Radio/radio.tsx +2 -1
- package/src/Radio/style/index.less +19 -5
- package/src/Segmented/demo/basic.tsx +24 -0
- package/src/Segmented/demo/block.tsx +17 -0
- package/src/Segmented/demo/disabled.tsx +18 -0
- package/src/Segmented/demo/size.tsx +10 -0
- package/src/Segmented/demo/variant.tsx +28 -0
- package/src/Segmented/index.en-US.md +49 -0
- package/src/Segmented/index.ts +12 -0
- package/src/Segmented/index.zh-CN.md +49 -0
- package/src/Segmented/interface.ts +92 -0
- package/src/Segmented/segmented.tsx +136 -0
- package/src/Segmented/style/index.less +128 -0
- package/src/Spin/spin.tsx +1 -0
- package/src/Steps/step.tsx +1 -1
- package/src/Steps/style/index.less +8 -2
- package/src/Switch/demo/content.tsx +15 -5
- package/src/Switch/style/index.less +16 -0
- package/src/Switch/switch.tsx +14 -6
- package/src/Table/index.en-US.md +1 -0
- package/src/Table/index.zh-CN.md +1 -0
- package/src/Table/interface.ts +5 -1
- package/src/Table/theader/cell.tsx +2 -9
- package/src/Tag/demo/size.tsx +2 -2
- package/src/Tag/demo/variant.tsx +47 -0
- package/src/Tag/index.en-US.md +2 -0
- package/src/Tag/index.zh-CN.md +2 -0
- package/src/Tag/interface.ts +5 -0
- package/src/Tag/style/index.less +109 -25
- package/src/Tag/tag.tsx +2 -0
- package/src/Tour/demo/basic.tsx +52 -0
- package/src/Tour/demo/indicators.tsx +63 -0
- package/src/Tour/demo/placement.tsx +55 -0
- package/src/Tour/demo/scroll.tsx +49 -0
- package/src/Tour/index.en-US.md +61 -0
- package/src/Tour/index.ts +10 -0
- package/src/Tour/index.zh-CN.md +61 -0
- package/src/Tour/interface.ts +126 -0
- package/src/Tour/style/index.less +103 -0
- package/src/Tour/tour.tsx +399 -0
- package/src/Tree/demo/checkable.tsx +6 -6
- package/src/index.ts +6 -0
- package/src/locale/interface.ts +9 -0
- package/src/locale/lang/en_US.ts +7 -0
- package/src/locale/lang/ja_JP.ts +7 -0
- package/src/locale/lang/zh_CN.ts +7 -0
- package/src/locale/lang/zh_TW.ts +7 -0
- package/src/style/color.blue.css +1 -1
- package/src/style/color.crimson.css +1 -1
- package/src/style/color.css +21 -4
- package/src/style/size.css +38 -0
- package/src/version.ts +1 -1
- package/dist/cjs/utils/x.d.ts +0 -11
- package/dist/cjs/utils/x.js +0 -51
- package/dist/esm/utils/x.d.ts +0 -11
- package/dist/esm/utils/x.js +0 -49
- 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,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
package/src/Steps/step.tsx
CHANGED
|
@@ -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-
|
|
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:
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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);
|
package/src/Switch/switch.tsx
CHANGED
|
@@ -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
|
-
|
|
76
|
-
) : (
|
|
77
|
-
|
|
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)}
|
package/src/Table/index.en-US.md
CHANGED
|
@@ -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 | - |
|