1
0
Эх сурвалжийг харах

feat: add slider handle dot

代强 1 жил өмнө
parent
commit
f4b572a8e0

+ 44 - 27
content/input/slider/index-en-US.md

@@ -238,35 +238,52 @@ import { Slider } from '@douyinfe/semi-ui';
 );
 ```
 
+### Handle with dot
+```jsx live=true
+  <div>
+        <div>
+            <div>Default</div>
+            <Slider showBoundary={true} handleDot={{size:'4px',color:'blue'}}></Slider>
+        </div>
+        <br/>
+        <br/>
+        <div>
+            <div>Range</div>
+            <Slider defaultValue={[20, 60]} range handleDot={[{size:'4px',color:'blue'},{size:'4px',color:'pink'}]}></Slider>
+        </div>
+    </div>
+```
+
 ## API Reference
 
-| Property         | Instructions                                                                                                                                                                                                                                                                                          | type          | Default | Version | 
-|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- |---------|------ |
-| aria-label       | [aria-label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label) used to define a string that labels the current element. Use it in cases where a text label is not visible on the screen                                                                          | string | -       |-|
-| aria-labelledby  | [aria-labelledby](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby) attribute establishes relationships between objects and their label(s), and its value should be one or more element IDs, which refer to elements that have the text needed for labeling | string | -       |-|
-| aria-valuetext   | [aria-valuetext](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-valuetext) used to provide a user-friendly name for the current value of the slider                                                                                                                  | string | -       |-|
-| defaultValue     | Default value                                                                                                                                                                                                                                                                                         | number \| number[] | 0       |- |
-| disabled         | Disable slider                                                                                                                                                                                                                                                                                        | boolean       | false   |- |
-| showMarkLabel    | Whether to show the label                                                                                                                                                                                                                                                                             | boolean | true    | 2.48.0 |
-| included         | Takes effect when `marks` is not null, true means containment and false means coordination                                                                                                                                                                                                            | boolean       | true    |- |
-| marks            | Tick mark of Slider, type of key must be number, and must in closed interval [min, max]                                                                                                                                                                                                               | Record<number, string \>        | -       |- |
-| max              | Maximum value of the slider.                                                                                                                                                                                                                                                                          | number        | 100     |- |
-| min              | Minimum value of the slider.                                                                                                                                                                                                                                                                          | number        | 0       |- |
-| railStyle        | Style for slide rail                                                                                                                                                                                                                                                                                  | CSSProperties | -       |0.31.0|
-| range            | Toggle whether it is allow to move slider from both sides                                                                                                                                                                                                                                             | boolean       | false   |- |
-| showArrow        | whether the tooltip has an arrow                                                                                                                                                                                                                                                                      | boolean | true    | 2.48.0|
-| showBoundary     | Toggle whether show max/min value when hover                                                                                                                                                                                                                                                          | boolean       | false   |- |
-| step             | Increment between successive values                                                                                                                                                                                                                                                                   | number        | 1       |- |
-| tipFormatter     | Format Tooltip content, by default display current value                                                                                                                                                                                                                                              | (value: string \| number \| boolean \| (string \| number \| boolean)[]) => any      | v => v  |- |
-| tooltipOnMark    | Whether the mark on the slide rail has a tooltip                                                                                                                                                                                                                                                      | false | 2.48.0  |
-| tooltipVisible   | Toggle whether to display tooltip all the time                                                                                                                                                                                                                                                        | boolean       | -       |- |
-| value            | Set current value, used in controlled component                                                                                                                                                                                                                                                       | number \| number[] |         |- |
-| vertical         | Toggle whether to display slider vertically                                                                                                                                                                                                                                                           | boolean       | false   |- |
-| verticalReverse  | Vertical but reverse direction >=1.29.0                                                                                                                                                                                                                                                               | boolean | false   |-|
-| onAfterChange    | Triggered when slider changed, passed in current value as params                                                                                                                                                                                                                                      | (value: number \| number[]) => void      | -       |- |
-| onChange         | Callback function when slider value changes                                                                                                                                                                                                                                                           | (value: number \| number[]) => void      | -       |- |
-| onMouseUp        | Trigged when mouse up on handle                                                                                                                                                                                                                                                                       | (e: React.MouseEvent<HTMLDivElement\>) => void                                | -       | 2.41.0 |
-| getAriaValueText | Used to provide a user-friendly name for the current value of the slider, important for screen reader users,  The parameters value and index are the current slider value, order                                                                                                                      | (value: number, index?: number) => string | -       |-|
+| Property         | Instructions                                                                                                                                                                                                                                                                                          | type                                                                           | Default | Version | 
+|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|---------|------ |
+| aria-label       | [aria-label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label) used to define a string that labels the current element. Use it in cases where a text label is not visible on the screen                                                                          | string                                                                         | -       |-|
+| aria-labelledby  | [aria-labelledby](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby) attribute establishes relationships between objects and their label(s), and its value should be one or more element IDs, which refer to elements that have the text needed for labeling | string                                                                         | -       |-|
+| aria-valuetext   | [aria-valuetext](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-valuetext) used to provide a user-friendly name for the current value of the slider                                                                                                                  | string                                                                         | -       |-|
+| defaultValue     | Default value                                                                                                                                                                                                                                                                                         | number \| number[]                                                             | 0       |- |
+| disabled         | Disable slider                                                                                                                                                                                                                                                                                        | boolean                                                                        | false   |- |
+| handleDot | Whether to show the dot on the handle                                                                                                                                                                                                                                                                 | { color: string, size: string} \| <br/> { color: string, size: string}[]       | -      | 2.52.0 |
+| included         | Takes effect when `marks` is not null, true means containment and false means coordination                                                                                                                                                                                                            | boolean                                                                        | true    |- |
+| marks            | Tick mark of Slider, type of key must be number, and must in closed interval [min, max]                                                                                                                                                                                                               | Record<number, string \>                                                       | -       |- |
+| max              | Maximum value of the slider.                                                                                                                                                                                                                                                                          | number                                                                         | 100     |- |
+| min              | Minimum value of the slider.                                                                                                                                                                                                                                                                          | number                                                                         | 0       |- |
+| railStyle        | Style for slide rail                                                                                                                                                                                                                                                                                  | CSSProperties                                                                  | -       |0.31.0|
+| range            | Toggle whether it is allow to move slider from both sides                                                                                                                                                                                                                                             | boolean                                                                        | false   |- |
+| showArrow        | whether the tooltip has an arrow                                                                                                                                                                                                                                                                      | boolean                                                                        | true    | 2.48.0|
+| showBoundary     | Toggle whether show max/min value when hover                                                                                                                                                                                                                                                          | boolean                                                                        | false   |- |
+| showMarkLabel    | Whether to show the label                                                                                                                                                                                                                                                                             | boolean                                                                        | true    | 2.48.0 |
+| step             | Increment between successive values                                                                                                                                                                                                                                                                   | number                                                                         | 1       |- |
+| tipFormatter     | Format Tooltip content, by default display current value                                                                                                                                                                                                                                              | (value: string \| number \| boolean \| (string \| number \| boolean)[]) => any | v => v  |- |
+| tooltipOnMark    | Whether the mark on the slide rail has a tooltip                                                                                                                                                                                                                                                      | false                                                                          | 2.48.0  |
+| tooltipVisible   | Toggle whether to display tooltip all the time                                                                                                                                                                                                                                                        | boolean                                                                        | -       |- |
+| value            | Set current value, used in controlled component                                                                                                                                                                                                                                                       | number \| number[]                                                             |         |- |
+| vertical         | Toggle whether to display slider vertically                                                                                                                                                                                                                                                           | boolean                                                                        | false   |- |
+| verticalReverse  | Vertical but reverse direction >=1.29.0                                                                                                                                                                                                                                                               | boolean                                                                        | false   |-|
+| onAfterChange    | Triggered when slider changed, passed in current value as params                                                                                                                                                                                                                                      | (value: number \| number[]) => void                                            | -       |- |
+| onChange         | Callback function when slider value changes                                                                                                                                                                                                                                                           | (value: number \| number[]) => void                                            | -       |- |
+| onMouseUp        | Trigged when mouse up on handle                                                                                                                                                                                                                                                                       | (e: React.MouseEvent<HTMLDivElement\>) => void                                 | -       | 2.41.0 |
+| getAriaValueText | Used to provide a user-friendly name for the current value of the slider, important for screen reader users,  The parameters value and index are the current slider value, order                                                                                                                      | (value: number, index?: number) => string                                      | -       |-|
 ## Accessibility
 
 ### ARIA

+ 43 - 26
content/input/slider/index.md

@@ -226,34 +226,51 @@ import { Slider } from '@douyinfe/semi-ui';
 
 ```
 
+### 滑块带圆点
+```jsx live=true
+  <div>
+        <div>
+            <div>Default</div>
+            <Slider showBoundary={true} handleDot={{size:'4px',color:'blue'}}></Slider>
+        </div>
+        <br/>
+        <br/>
+        <div>
+            <div>Range</div>
+            <Slider defaultValue={[20, 60]} range handleDot={[{size:'4px',color:'blue'},{size:'4px',color:'pink'}]}></Slider>
+        </div>
+    </div>
+```
+
 ## API参考
-| 属性               | 说明                                                                                                                                                                 | 类型                                                                            | 默认值    | 版本     | 
-|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|--------|--------|
-| aria-label       | [aria-label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label)属性,用来给当前元素加上的标签描述, 提升可访问性                                       | string                                                                        | -      | -      |
-| aria-labelledby  | [aria-labelledby](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby)属性,表明某些元素的 id 是某一对象的标签。它被用来确定控件或控件组与它们标签之间的联系, 提升可访问性 | string                                                                        | -      | -      |
-| aria-valuetext   | [aria-valuetext](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-valuetext)属性,为滑块的当前值提供用户友好的名称。                                    | string                                                                        | -      | -      |
-| defaultValue     | 设置初始取值                                                                                                                                                             | number \| number[]                                                            | 0      | -      |
-| disabled         | 滑块是否禁用                                                                                                                                                             | boolean                                                                       | false  | -      |
-| showMarkLabel    | 是否隐藏标签 | boolean | true   | 2.48.0 |
-| included         | `marks` 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列                                                                                                                      | boolean                                                                       | true   | -      |
-| marks            | 刻度,key 的类型必须为 `number` 且取值在闭区间 \[min, max] 内                                                                                                                       | Record<number, string \>                                                      | 无      | -      |
-| max              | 最大值                                                                                                                                                                | number                                                                        | 100    | -      |
-| min              | 最小值                                                                                                                                                                | number                                                                        | 0      | -      |
-| railStyle        | 滑块轨道的样式                                                                                                                                                            | CSSProperties                                                                 | -      | 0.31.0 |
-| range            | 是否支持两边同时可滑动                                                                                                                                                        | boolean                                                                       | false  | -      |
-| showArrow        | tooltip 是否带箭头 | boolean | true   | 2.48.0|
-| showBoundary     | 是否在 hover 时展示最大值最小值                                                                                                                                                | boolean                                                                       | false  | -      |
-| step             | 步长                                                                                                                                                                 | number                                                                        | 1      | -      |
+| 属性               | 说明                                                                                                                                                                 | 类型                                                                             | 默认值    | 版本     | 
+|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|--------|--------|
+| aria-label       | [aria-label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label)属性,用来给当前元素加上的标签描述, 提升可访问性                                       | string                                                                         | -      | -      |
+| aria-labelledby  | [aria-labelledby](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby)属性,表明某些元素的 id 是某一对象的标签。它被用来确定控件或控件组与它们标签之间的联系, 提升可访问性 | string                                                                         | -      | -      |
+| aria-valuetext   | [aria-valuetext](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-valuetext)属性,为滑块的当前值提供用户友好的名称。                                    | string                                                                         | -      | -      |
+| defaultValue     | 设置初始取值                                                                                                                                                             | number \| number[]                                                             | 0      | -      |
+| disabled         | 滑块是否禁用                                                                                                                                                             | boolean                                                                        | false  | -      |
+| handleDot | 滑块是否带有圆点 | { color: string, size: string} \| <br/> { color: string, size: string}[]                                                | -      | 2.52.0 |
+| included         | `marks` 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列                                                                                                                      | boolean                                                                        | true   | -      |
+| marks            | 刻度,key 的类型必须为 `number` 且取值在闭区间 \[min, max] 内                                                                                                                       | Record<number, string \>                                                       | 无      | -      |
+| max              | 最大值                                                                                                                                                                | number                                                                         | 100    | -      |
+| min              | 最小值                                                                                                                                                                | number                                                                         | 0      | -      |
+| railStyle        | 滑块轨道的样式                                                                                                                                                            | CSSProperties                                                                  | -      | 0.31.0 |
+| range            | 是否支持两边同时可滑动                                                                                                                                                        | boolean                                                                        | false  | -      |
+| showArrow        | tooltip 是否带箭头 | boolean                                                                        | true   | 2.48.0 |
+| showBoundary     | 是否在 hover 时展示最大值最小值                                                                                                                                                | boolean                                                                        | false  | -      |
+| showMarkLabel    | 是否隐藏标签 | boolean                                                                        | true   | 2.48.0 |
+| step             | 步长                                                                                                                                                                 | number                                                                         | 1      | -      |
 | tipFormatter     | 设置Tooltip的展示格式,默认显示当前选值                                                                                                                                            | (value: string \| number \| boolean \| (string \| number \| boolean)[]) => any | v => v | -      |
-| tooltipOnMark    | 滑轨上的 mark 是否带有 tooltip | false | 2.48.0 |
-| tooltipVisible   | 是否始终显示Tooltip                                                                                                                                                      | boolean                                                                       | 无      | -      |
-| value            | 设置当前取值                                                                                                                                                             | number \| number[]                                                            |        | -      |
-| vertical         | 是否设置方向为垂直                                                                                                                                                          | boolean                                                                       | false  | -      |
-| verticalReverse  | 反转垂直方向,即上大下小 >=1.29.0                                                                                                                                              | boolean                                                                       | false  | -      |
-| onAfterChange    | 值变化后触发,把当前值作为参数传入                                                                                                                                                  | (value: number \| number[]) => void                                           | 无      | -      |
-| onChange         | 当 Slider 的值发生改变时的回调                                                                                                                                                | (value: number \| number[]) => void                                           | 无      | -      |
-| onMouseUp        | 鼠标松开滑块时触发                                                                                                                                                          | (e: React.MouseEvent<HTMLDivElement\>) => void                                | 无      | 2.41.0 |
-| getAriaValueText | 用于给滑块的当前值提供一个用户友好的名称,对屏幕阅读器用户很重要,参数value为当前滑块的值,index为当前滑块的顺序                                                                                                      | (value: number, index?: number) => string                                     | -      | -      |
+| tooltipOnMark    | 滑轨上的 mark 是否带有 tooltip | false                                                                          | 2.48.0 |
+| tooltipVisible   | 是否始终显示Tooltip                                                                                                                                                      | boolean                                                                        | 无      | -      |
+| value            | 设置当前取值                                                                                                                                                             | number \| number[]                                                             |        | -      |
+| vertical         | 是否设置方向为垂直                                                                                                                                                          | boolean                                                                        | false  | -      |
+| verticalReverse  | 反转垂直方向,即上大下小 >=1.29.0                                                                                                                                              | boolean                                                                        | false  | -      |
+| onAfterChange    | 值变化后触发,把当前值作为参数传入                                                                                                                                                  | (value: number \| number[]) => void                                            | 无      | -      |
+| onChange         | 当 Slider 的值发生改变时的回调                                                                                                                                                | (value: number \| number[]) => void                                            | 无      | -      |
+| onMouseUp        | 鼠标松开滑块时触发                                                                                                                                                          | (e: React.MouseEvent<HTMLDivElement\>) => void                                 | 无      | 2.41.0 |
+| getAriaValueText | 用于给滑块的当前值提供一个用户友好的名称,对屏幕阅读器用户很重要,参数value为当前滑块的值,index为当前滑块的顺序                                                                                                      | (value: number, index?: number) => string                                      | -      | -      |
 
 ## Accessibility
 

+ 1 - 0
packages/semi-foundation/slider/constants.ts

@@ -8,6 +8,7 @@ const cssClasses = {
     DOTS: `${BASE_CLASS_PREFIX}-slider-dots`,
     MARKS: `${BASE_CLASS_PREFIX}-slider-marks`,
     HANDLE: `${BASE_CLASS_PREFIX}-slider-handle`,
+    HANDLE_DOT: `${BASE_CLASS_PREFIX}-slider-handle-dot`,
 };
 
 const strings = {

+ 8 - 1
packages/semi-foundation/slider/foundation.ts

@@ -36,7 +36,14 @@ export interface SliderProps{
     'aria-label'?: string;
     'aria-labelledby'?: string;
     'aria-valuetext'?: string;
-    getAriaValueText?: (value: number, index?: number) => string
+    getAriaValueText?: (value: number, index?: number) => string;
+    handleDot?: {
+        size: string;
+        color: string
+    } & ({
+        size: string;
+        color: string
+    }[])
 }
 
 export interface SliderState {

+ 10 - 0
packages/semi-foundation/slider/slider.scss

@@ -58,9 +58,19 @@ $module: #{$prefix}-slider;
         cursor: pointer;
         transition: background-color $transition_duration_slider_handle-bg $transition_function-slider-handle-bg $transition_delay-slider_handle-bg;
         transform: $transform_scale-slider_handle translateX(-50%) translateY($spacing-slider_handle-translateY);
+        display: inline-flex;
+        justify-content: center;
+        align-items: center;
         &:focus-visible {
             outline: $width-slider_handle-focus solid $color-slider_handle-focus;
         }
+
+        &-dot{
+            background:$color-slider_handle_dot;
+            width:$width-slider_handle_dot;
+            height: $width-slider_handle_dot;
+            border-radius: var(--semi-border-radius-circle);
+        }
     }
 
     &-handle:hover {

+ 2 - 0
packages/semi-foundation/slider/variables.scss

@@ -15,6 +15,7 @@ $color-slider_rail: rgba(0, 0, 0, 0.65);
 $color-slider_track-bg-default: var(--semi-color-primary); // 滑动条轨道颜色 - 已填充
 $color-slider_track_disabled-bg: var(--semi-color-primary-disabled); // 禁用滑动条轨道颜色 - 已填充
 $color-slider_handle-focus: var(--semi-color-primary-light-active); // 圆形按钮轮廓 - 聚焦
+$color-slider_handle_dot: var(--semi-color-primary); // 圆形按钮内部圆点颜色
 
 // Spacing
 $spacing-slider-paddingX: 13px; // 滑动条整体水平内边距
@@ -57,6 +58,7 @@ $height-slider_track: 4px; // 滚动条已填充轨道高度
 $width-slider_dot: 4px; // 滚动条圆形刻度点宽度
 $width-slider_handle_border_disabled: 1px; // 禁用滚动条圆形按钮按下后描边宽度
 $width-slider_handle-focus: 2px; // 圆形按钮轮廓 - 聚焦
+$width-slider_handle_dot: 4px; // 圆形按钮内部圆点宽度
 
 // Font
 $font-slider_rail-fontSize: 14px; // 滚动条轨道文本字号

+ 30 - 3
packages/semi-ui/slider/index.tsx

@@ -54,6 +54,18 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
         railStyle: PropTypes.object,
         verticalReverse: PropTypes.bool,
         getAriaValueText: PropTypes.func,
+        handleDot: PropTypes.oneOfType([
+            PropTypes.shape({
+                size: PropTypes.string.isRequired,
+                color: PropTypes.string.isRequired,
+            }),
+            PropTypes.arrayOf(
+                PropTypes.shape({
+                    size: PropTypes.string.isRequired,
+                    color: PropTypes.string.isRequired,
+                })
+            ),
+        ]),
     } as any;
 
     static defaultProps: Partial<SliderProps> = {
@@ -371,7 +383,12 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
                     aria-valuenow={currentValue as number}
                     aria-valuemax={max}
                     aria-valuemin={min}
-                />
+                >
+                    {this.props.handleDot && <div className={cssClasses.HANDLE_DOT} style={{
+                        ...(this.props.handleDot?.size?{ width: this.props.handleDot.size, height: this.props.handleDot.size }:{}),
+                        ...(this.props.handleDot?.color?{ backgroundColor: this.props.handleDot.color }:{}),
+                    }}/>}
+                </span>
             </Tooltip>
         ) : (
             <React.Fragment>
@@ -427,7 +444,12 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
                         aria-valuenow={currentValue[0]}
                         aria-valuemax={currentValue[1]}
                         aria-valuemin={min}
-                    />
+                    >
+                        {this.props.handleDot?.[0] && <div className={cssClasses.HANDLE_DOT} style={{
+                            ...(this.props.handleDot[0]?.size?{ width: this.props.handleDot[0].size, height: this.props.handleDot[0].size }:{}),
+                            ...(this.props.handleDot[0]?.color?{ backgroundColor: this.props.handleDot[0].color }:{}),
+                        }}/>}
+                    </span>
                 </Tooltip>
                 <Tooltip
                     content={tipChildren.max}
@@ -481,7 +503,12 @@ export default class Slider extends BaseComponent<SliderProps, SliderState> {
                         aria-valuenow={currentValue[1]}
                         aria-valuemax={max}
                         aria-valuemin={currentValue[0]}
-                    />
+                    >
+                        {this.props.handleDot?.[1] && <div className={cssClasses.HANDLE_DOT} style={{
+                            ...(this.props.handleDot[1]?.size?{ width: this.props.handleDot[1].size, height: this.props.handleDot[1].size }:{}),
+                            ...(this.props.handleDot[1]?.color?{ backgroundColor: this.props.handleDot[1].color }:{}),
+                        }}/>}
+                    </span> 
                 </Tooltip>
             </React.Fragment>
         );