diff --git a/src/packages/indicator/__test__/indicator.spec.tsx b/src/packages/indicator/__test__/indicator.spec.tsx index b0d76e67e6..12f422e297 100644 --- a/src/packages/indicator/__test__/indicator.spec.tsx +++ b/src/packages/indicator/__test__/indicator.spec.tsx @@ -33,17 +33,6 @@ test('should be shown when custom node', () => { expect(container.querySelectorAll('.nut-indicator-dot')).toHaveLength(5) }) -test('should be shown when custom node', () => { - const { container } = render( - - -
{5}
-
-
- ) - expect(container.querySelectorAll('.nut-indicator-dot')).toHaveLength(5) -}) - test('should be shown when slide', () => { const { container } = render( @@ -54,3 +43,71 @@ test('should be shown when slide', () => { 1 ) }) + +test('should render dualScreen type with fixed-width', () => { + const { container } = render( + + ) + expect( + container.querySelector('.nut-indicator-fixed-width') + ).toBeInTheDocument() + expect(container.querySelectorAll('.nut-indicator-dot')).toHaveLength(2) +}) + +test('should render white color variant', () => { + const { container } = render( + + ) + expect(container.querySelector('.nut-indicator-white')).toBeInTheDocument() +}) + +test('should render vertical direction', () => { + const { container } = render( + + ) + expect(container.querySelector('.nut-indicator-vertical')).toBeInTheDocument() +}) + +test('should render placement outside', () => { + const { container } = render( + + ) + expect(container.querySelector('.nut-indicator-outside')).toBeInTheDocument() +}) + +test('should render placement inside-top-right', () => { + const { container } = render( + + ) + expect( + container.querySelector('.nut-indicator-inside-top-right') + ).toBeInTheDocument() +}) + +test('should render placement inside-bottom-center', () => { + const { container } = render( + + ) + expect( + container.querySelector('.nut-indicator-inside-bottom-center') + ).toBeInTheDocument() +}) + +test('should render placement inside-bottom-left', () => { + const { container } = render( + + ) + expect( + container.querySelector('.nut-indicator-inside-bottom-left') + ).toBeInTheDocument() +}) + +test('slide type should set CSS custom properties for transform', () => { + const { container } = render() + const line = container.querySelector( + '.nut-indicator-line-active' + ) as HTMLElement + expect(line).toBeInTheDocument() + expect(line.style.getPropertyValue('--nutui-indicator-current')).toBe('1') + expect(line.style.getPropertyValue('--nutui-indicator-total')).toBe('3') +}) diff --git a/src/packages/indicator/demo.taro.tsx b/src/packages/indicator/demo.taro.tsx index 3fa9e1d208..638db49b2a 100644 --- a/src/packages/indicator/demo.taro.tsx +++ b/src/packages/indicator/demo.taro.tsx @@ -9,6 +9,7 @@ import Demo3 from './demos/taro/demo3' import Demo4 from './demos/taro/demo4' import Demo5 from './demos/taro/demo5' import Demo6 from './demos/taro/demo6' +import Demo7 from './demos/taro/demo7' const IndicatorDemo = () => { const [translated] = useTranslate({ @@ -19,6 +20,7 @@ const IndicatorDemo = () => { customNode: '自定义节点', custom: '自定义', vertical: '竖向展示', + placement: '定位布局', }, 'zh-TW': { basic: '基礎用法', @@ -27,6 +29,7 @@ const IndicatorDemo = () => { customNode: '自定义节点', custom: '自定义', vertical: '豎向展示', + placement: '定位佈局', }, 'en-US': { basic: 'Basic usage', @@ -35,6 +38,7 @@ const IndicatorDemo = () => { customNode: 'Custom Node', custom: 'Custom', vertical: 'Vertical display', + placement: 'Placement', }, }) @@ -54,6 +58,8 @@ const IndicatorDemo = () => { {translated.vertical} + {translated.placement} + ) diff --git a/src/packages/indicator/demo.tsx b/src/packages/indicator/demo.tsx index 1f2695c0af..253dd00e0f 100644 --- a/src/packages/indicator/demo.tsx +++ b/src/packages/indicator/demo.tsx @@ -6,6 +6,7 @@ import Demo3 from './demos/h5/demo3' import Demo4 from './demos/h5/demo4' import Demo5 from './demos/h5/demo5' import Demo6 from './demos/h5/demo6' +import Demo7 from './demos/h5/demo7' const IndicatorDemo = () => { const [translated] = useTranslate({ @@ -16,6 +17,7 @@ const IndicatorDemo = () => { customNode: '自定义节点', custom: '自定义', vertical: '竖向展示', + placement: '定位布局', }, 'zh-TW': { basic: '基礎用法', @@ -24,6 +26,7 @@ const IndicatorDemo = () => { customNode: '自定义节点', custom: '自定义', vertical: '豎向展示', + placement: '定位佈局', }, 'en-US': { basic: 'Basic usage', @@ -32,6 +35,7 @@ const IndicatorDemo = () => { customNode: 'Custom Node', custom: 'Custom', vertical: 'Vertical display', + placement: 'Placement', }, }) @@ -55,6 +59,9 @@ const IndicatorDemo = () => {

{translated.vertical}

+ +

{translated.placement}

+ ) diff --git a/src/packages/indicator/demos/h5/demo7.tsx b/src/packages/indicator/demos/h5/demo7.tsx new file mode 100644 index 0000000000..f1705b02e9 --- /dev/null +++ b/src/packages/indicator/demos/h5/demo7.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import { Indicator } from '@nutui/nutui-react' + +const Demo7 = () => { + const containerStyle: React.CSSProperties = { + position: 'relative', + width: '100%', + height: '120px', + background: 'var(--nutui-color-background-overlay, #f5f5f5)', + borderRadius: '8px', + marginBottom: '12px', + } + return ( + <> +
+
+ +
+
+ +
+
+ +
+
+ +
+ + ) +} +export default Demo7 diff --git a/src/packages/indicator/demos/taro/demo7.tsx b/src/packages/indicator/demos/taro/demo7.tsx new file mode 100644 index 0000000000..a8f2565a68 --- /dev/null +++ b/src/packages/indicator/demos/taro/demo7.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { View } from '@tarojs/components' +import { Indicator } from '@nutui/nutui-react-taro' + +const Demo7 = () => { + const containerStyle: React.CSSProperties = { + position: 'relative', + width: '100%', + height: '120px', + background: 'var(--nutui-color-background-overlay, #f5f5f5)', + borderRadius: '8px', + marginBottom: '12px', + } + return ( + <> + + + + + + + + + + + + + + + ) +} +export default Demo7 diff --git a/src/packages/indicator/doc.en-US.md b/src/packages/indicator/doc.en-US.md index c31be85650..eb57e4a087 100644 --- a/src/packages/indicator/doc.en-US.md +++ b/src/packages/indicator/doc.en-US.md @@ -28,6 +28,8 @@ import { Indicator } from '@nutui/nutui-react' ### Type +Supports three types: anchor indicator (anchor, 2-6 pages), slide indicator (slide, 2-11 pages), dual-screen indicator (dualScreen, fixed 2 pages). + :::demo @@ -58,6 +60,16 @@ import { Indicator } from '@nutui/nutui-react' ::: +### Placement + +Supports placing the indicator outside or inside the content module at different positions. For inside placement (inside-\*), the parent container must have `position: relative`. + +:::demo + + + +::: + ## Indicator ### Props @@ -65,10 +77,11 @@ import { Indicator } from '@nutui/nutui-react' | Property | Description | Type | Default | | --- | --- | --- | --- | | current | current step | `number` | `0` | -| total | step total size | `number` | `3` | -| direction | display directory,default is horizontal | `horizontal` \| `vertical` | `horizontal` | +| total | step total size | `number` | `2` | +| direction | display directory, default is horizontal | `horizontal` \| `vertical` | `horizontal` | | color | color | `primary` \| `default` | `primary` | -| type | interactivity Type | `anchor` \| `slide`\| `dualScreen` | `anchor` | +| type | interactivity type | `anchor` \| `slide`\| `dualScreen` | `anchor` | +| placement | placement layout | `outside` \| `inside-top-right` \| `inside-bottom-center` \| `inside-bottom-left` | `-` | ## Theming @@ -79,10 +92,17 @@ The component provides the following CSS variables, which can be used to customi | Name | Description | Default Value | | --- | --- | --- | | \--nutui-indicator-color | indicator active color | `$color-primary` | -| \--nutui-indicator-dot-color | indicator default color | `$color-text-disabled` | -| \--nutui-indicator-dot-size | indicator dot size | `3px` | -| \--nutui-indicator-dot-active-size | indicator dot active size | `6px` | +| \--nutui-indicator-dot-color | indicator default color | `$color-border` | +| \--nutui-indicator-dot-size | indicator dot size | `4px` | +| \--nutui-indicator-dot-active-size | indicator dot active size | `8px` | | \--nutui-indicator-border-radius | indicator active border size | `$radius-xxs` | -| \--nutui-indicator-dot-margin | when horizontal, indicator margin | `$spacing-xxxs` | +| \--nutui-indicator-dot-margin | when horizontal, indicator margin | `$spacing-xxs` | +| \--nutui-indicator-dot-border | indicator inner border | `0.33px solid $color-border` | +| \--nutui-indicator-dot-inactive-color | indicator inactive fill color | `var(--nutui-color-background-component, #f0f2f7)` | +| \--nutui-indicator-track-width | slide indicator track width | `24px` | +| \--nutui-indicator-slider-width | slide indicator slider width | `8px` | +| \--nutui-indicator-dual-screen-inactive-width | dual-screen indicator inactive width | `16px` | +| \--nutui-indicator-placement-gap | placement gap to content | `8px` | +| \--nutui-indicator-placement-safe-gap | outside placement safe gap below | `12px` | diff --git a/src/packages/indicator/doc.md b/src/packages/indicator/doc.md index 295660e849..9e78954f4b 100644 --- a/src/packages/indicator/doc.md +++ b/src/packages/indicator/doc.md @@ -28,6 +28,8 @@ import { Indicator } from '@nutui/nutui-react' ### 类型 +支持三种类型:锚点指示器(anchor,2-6页)、滑动指示器(slide,2-11页)、双屏指示器(dualScreen,固定2页)。 + :::demo @@ -58,6 +60,16 @@ import { Indicator } from '@nutui/nutui-react' ::: +### 定位布局 + +支持将指示器放置在内容模块外部或内部的不同位置。内部定位(inside-\*)时需要父容器设置 `position: relative`。 + +:::demo + + + +::: + ## Indicator ### Props @@ -69,6 +81,7 @@ import { Indicator } from '@nutui/nutui-react' | direction | 方向,默认为水平方向 | `horizontal` \| `vertical` | `horizontal` | | color | 颜色 | `primary` \| `default` | `primary` | | type | 交互类型 | `anchor` \| `slide`\| `dualScreen` | `anchor` | +| placement | 定位布局 | `outside` \| `inside-top-right` \| `inside-bottom-center` \| `inside-bottom-left` | `-` | ## 主题定制 @@ -79,10 +92,17 @@ import { Indicator } from '@nutui/nutui-react' | 名称 | 说明 | 默认值 | | --- | --- | --- | | \--nutui-indicator-color | 指示器焦点时色值 | `$color-primary` | -| \--nutui-indicator-dot-color | 指示器默认色值 | `$color-text-disabled` | -| \--nutui-indicator-dot-size | 指示器尺寸 | `3px` | -| \--nutui-indicator-dot-active-size | 指示器焦点时尺寸 | `6px` | +| \--nutui-indicator-dot-color | 指示器默认色值 | `$color-border` | +| \--nutui-indicator-dot-size | 指示器尺寸 | `4px` | +| \--nutui-indicator-dot-active-size | 指示器焦点时尺寸 | `8px` | | \--nutui-indicator-border-radius | 指示器焦点时的border值 | `$radius-xxs` | -| \--nutui-indicator-dot-margin | 指示器横向时的margin值 | `$spacing-xxxs` | +| \--nutui-indicator-dot-margin | 指示器横向时的margin值 | `$spacing-xxs` | +| \--nutui-indicator-dot-border | 指示器内描边 | `0.33px solid $color-border` | +| \--nutui-indicator-dot-inactive-color | 指示器非焦点时的填充色 | `var(--nutui-color-background-component, #f0f2f7)` | +| \--nutui-indicator-track-width | 滑动指示器轨道宽度 | `24px` | +| \--nutui-indicator-slider-width | 滑动指示器滑块宽度 | `8px` | +| \--nutui-indicator-dual-screen-inactive-width | 双屏指示器非焦点时宽度 | `16px` | +| \--nutui-indicator-placement-gap | 定位布局与内容的间距 | `8px` | +| \--nutui-indicator-placement-safe-gap | 外部定位时与下方模块的安全间距 | `12px` | diff --git a/src/packages/indicator/doc.taro.md b/src/packages/indicator/doc.taro.md index 6de815d619..bceb739833 100644 --- a/src/packages/indicator/doc.taro.md +++ b/src/packages/indicator/doc.taro.md @@ -28,6 +28,8 @@ import { Indicator } from '@nutui/nutui-react-taro' ### 类型 +支持三种类型:锚点指示器(anchor,2-6页)、滑动指示器(slide,2-11页)、双屏指示器(dualScreen,固定2页)。 + :::demo @@ -58,6 +60,16 @@ import { Indicator } from '@nutui/nutui-react-taro' ::: +### 定位布局 + +支持将指示器放置在内容模块外部或内部的不同位置。内部定位(inside-\*)时需要父容器设置 `position: relative`。 + +:::demo + + + +::: + ## Indicator ### Props @@ -69,6 +81,7 @@ import { Indicator } from '@nutui/nutui-react-taro' | direction | 方向,默认为水平方向 | `horizontal` \| `vertical` | `horizontal` | | color | 颜色 | `primary` \| `default` | `primary` | | type | 交互类型 | `anchor` \| `slide`\| `dualScreen` | `anchor` | +| placement | 定位布局 | `outside` \| `inside-top-right` \| `inside-bottom-center` \| `inside-bottom-left` | `-` | ## 主题定制 @@ -79,10 +92,17 @@ import { Indicator } from '@nutui/nutui-react-taro' | 名称 | 说明 | 默认值 | | --- | --- | --- | | \--nutui-indicator-color | 指示器焦点时色值 | `$color-primary` | -| \--nutui-indicator-dot-color | 指示器默认色值 | `$color-text-disabled` | -| \--nutui-indicator-dot-size | 指示器尺寸 | `3px` | -| \--nutui-indicator-dot-active-size | 指示器焦点时尺寸 | `6px` | +| \--nutui-indicator-dot-color | 指示器默认色值 | `$color-border` | +| \--nutui-indicator-dot-size | 指示器尺寸 | `4px` | +| \--nutui-indicator-dot-active-size | 指示器焦点时尺寸 | `8px` | | \--nutui-indicator-border-radius | 指示器焦点时的border值 | `$radius-xxs` | -| \--nutui-indicator-dot-margin | 指示器横向时的margin值 | `$spacing-xxxs` | +| \--nutui-indicator-dot-margin | 指示器横向时的margin值 | `$spacing-xxs` | +| \--nutui-indicator-dot-border | 指示器内描边 | `0.33px solid $color-border` | +| \--nutui-indicator-dot-inactive-color | 指示器非焦点时的填充色 | `var(--nutui-color-background-component, #f0f2f7)` | +| \--nutui-indicator-track-width | 滑动指示器轨道宽度 | `24px` | +| \--nutui-indicator-slider-width | 滑动指示器滑块宽度 | `8px` | +| \--nutui-indicator-dual-screen-inactive-width | 双屏指示器非焦点时宽度 | `16px` | +| \--nutui-indicator-placement-gap | 定位布局与内容的间距 | `8px` | +| \--nutui-indicator-placement-safe-gap | 外部定位时与下方模块的安全间距 | `12px` | diff --git a/src/packages/indicator/doc.zh-TW.md b/src/packages/indicator/doc.zh-TW.md index 5647afb61c..852b62ea88 100644 --- a/src/packages/indicator/doc.zh-TW.md +++ b/src/packages/indicator/doc.zh-TW.md @@ -26,7 +26,9 @@ import { Indicator } from '@nutui/nutui-react' ::: -### 类型 +### 類型 + +支持三種類型:錨點指示器(anchor,2-6頁)、滑動指示器(slide,2-11頁)、雙屏指示器(dualScreen,固定2頁)。 :::demo @@ -58,6 +60,16 @@ import { Indicator } from '@nutui/nutui-react' ::: +### 定位佈局 + +支持將指示器放置在內容模塊外部或內部的不同位置。內部定位(inside-\*)時需要父容器設置 `position: relative`。 + +:::demo + + + +::: + ## Indicator ### Props @@ -69,6 +81,7 @@ import { Indicator } from '@nutui/nutui-react' | direction | 方向,預設為水平方向 | `horizontal` \| `vertical` | `horizontal` | | color | 顏色 | `primary` \| `default` | `primary` | | type | 互動類型 | `anchor` \| `slide`\| `dualScreen` | `anchor` | +| placement | 定位佈局 | `outside` \| `inside-top-right` \| `inside-bottom-center` \| `inside-bottom-left` | `-` | ## 主題定製 @@ -79,10 +92,17 @@ import { Indicator } from '@nutui/nutui-react' | 名稱 | 說明 | 默認值 | | --- | --- | --- | | \--nutui-indicator-color | 指示器焦點時色值 | `$color-primary` | -| \--nutui-indicator-dot-color | 指示器默認色值 | `$color-text-disabled` | -| \--nutui-indicator-dot-size | 指示器尺寸 | `3px` | -| \--nutui-indicator-dot-active-size | 指示器焦點時尺寸 | `6px` | +| \--nutui-indicator-dot-color | 指示器默認色值 | `$color-border` | +| \--nutui-indicator-dot-size | 指示器尺寸 | `4px` | +| \--nutui-indicator-dot-active-size | 指示器焦點時尺寸 | `8px` | | \--nutui-indicator-border-radius | 指示器焦點時的border值 | `$radius-xxs` | -| \--nutui-indicator-dot-margin | 指示器橫向時的margin值 | `$spacing-xxxs` | +| \--nutui-indicator-dot-margin | 指示器橫向時的margin值 | `$spacing-xxs` | +| \--nutui-indicator-dot-border | 指示器內描邊 | `0.33px solid $color-border` | +| \--nutui-indicator-dot-inactive-color | 指示器非焦點時的填充色 | `var(--nutui-color-background-component, #f0f2f7)` | +| \--nutui-indicator-track-width | 滑動指示器軌道寬度 | `24px` | +| \--nutui-indicator-slider-width | 滑動指示器滑塊寬度 | `8px` | +| \--nutui-indicator-dual-screen-inactive-width | 雙屏指示器非焦點時寬度 | `16px` | +| \--nutui-indicator-placement-gap | 定位佈局與內容的間距 | `8px` | +| \--nutui-indicator-placement-safe-gap | 外部定位時與下方模塊的安全間距 | `12px` | diff --git a/src/packages/indicator/indicator.scss b/src/packages/indicator/indicator.scss index 6c442de3f5..93a153abc3 100644 --- a/src/packages/indicator/indicator.scss +++ b/src/packages/indicator/indicator.scss @@ -6,7 +6,7 @@ align-items: center; &-fixed-width { - width: 21px; + width: $indicator-track-width; } &-dot, @@ -16,9 +16,10 @@ width: $indicator-dot-size; height: $indicator-dot-size; border-radius: 50%; - background-color: $color-border-disabled; + background-color: $indicator-dot-inactive-color; + border: $indicator-dot-border; + box-sizing: border-box; margin-left: $indicator-dot-margin; - opacity: 0.4; &-0 { margin-left: 0px; @@ -26,21 +27,23 @@ &-active { width: $indicator-dot-active-size; + height: $indicator-dot-size; border-radius: $indicator-border-radius; background: $indicator-color; - opacity: 1; + border: $indicator-dot-border; } } - // 固定宽度 + // 双屏模式 &-fixed-width { - // 两个页码的时候 .nut-indicator-dot { - width: 12px; + width: $indicator-dual-screen-inactive-width; + height: $indicator-dot-size; border-radius: $indicator-border-radius; &-active { - width: 6px; + width: $indicator-dot-active-size; + height: $indicator-dot-size; } } } @@ -49,44 +52,71 @@ // 竖向固定高度 &.nut-indicator-fixed-width { justify-content: flex-start; - height: 21px; + height: $indicator-track-width; width: auto; - // 竖向两个页码 + // 竖向双屏 .nut-indicator-dot { - width: 3px; - height: 12px; + width: $indicator-dot-size; + height: $indicator-dual-screen-inactive-width; border-radius: $indicator-border-radius; &-active { - height: 6px; - } - } - - &.nut-indicator-fixed-width { - &.nut-indicator-white { - .nut-indicator-dot { - &-active { - height: 6px; - } - } + width: $indicator-dot-size; + height: $indicator-dot-active-size; } } } } &-line { - width: $indicator-dot-active-size; + width: $indicator-slider-width; margin: 0; - border-radius: $indicator-border-radius; background-color: transparent; + border: none; &-active { + position: relative; + z-index: 1; transition: transform 0.3s ease-in-out; background: $indicator-color; + border: $indicator-dot-border; + transform: translateX( + calc( + var(--nutui-indicator-current, 0) / + (var(--nutui-indicator-total, 2) - 1) * + (#{$indicator-track-width} - #{$indicator-slider-width}) + ) + ); } } + + // 定位布局 + &-outside { + margin-top: $indicator-placement-gap; + margin-bottom: $indicator-placement-safe-gap; + justify-content: center; + } + + &-inside-top-right { + position: absolute; + top: $indicator-placement-gap; + right: $indicator-placement-gap; + } + + &-inside-bottom-center { + position: absolute; + bottom: $indicator-placement-gap; + left: 50%; + transform: translateX(-50%); + } + + &-inside-bottom-left { + position: absolute; + bottom: $indicator-placement-gap; + left: $indicator-placement-gap; + } } .nut-indicator-track { @@ -100,8 +130,8 @@ height: 100%; box-sizing: border-box; border-radius: $indicator-border-radius; - background-color: $color-border-disabled; - opacity: 0.4; + background-color: $indicator-dot-inactive-color; + border: $indicator-dot-border; } } @@ -110,11 +140,8 @@ &-dot, &-line { position: relative; - /* #ifndef dynamic*/ - box-sizing: content-box; - /* #endif */ - background: rgba(255, 255, 255, 0.4); - opacity: 1; + background: $color-primary-text; + opacity: 0.4; } &-line { @@ -122,13 +149,14 @@ &-active { opacity: 1; - background: rgba(255, 255, 255, 1); + background: $color-primary-text; } } &-dot { &-active { - background: rgba(255, 255, 255, 1); + background: $color-primary-text; + opacity: 1; } } } @@ -136,8 +164,8 @@ .nut-indicator-track.nut-indicator-white { &:after { - border: 1px solid rgba(0, 0, 0, 0.06); - background: rgba(255, 255, 255, 0.4); + background: $color-primary-text; + opacity: 0.4; } } @@ -167,7 +195,17 @@ .nut-indicator { &-line { width: $indicator-dot-size; - height: $indicator-dot-active-size; + height: $indicator-slider-width; + + &-active { + transform: translateY( + calc( + var(--nutui-indicator-current, 0) / + (var(--nutui-indicator-total, 2) - 1) * + (#{$indicator-track-width} - #{$indicator-slider-width}) + ) + ); + } } } } @@ -181,4 +219,14 @@ margin-left: 0px; } } + + &-inside-top-right { + right: auto; + left: $indicator-placement-gap; + } + + &-inside-bottom-left { + left: auto; + right: $indicator-placement-gap; + } } diff --git a/src/packages/indicator/indicator.taro.tsx b/src/packages/indicator/indicator.taro.tsx index e32d72161d..962adbd2b8 100644 --- a/src/packages/indicator/indicator.taro.tsx +++ b/src/packages/indicator/indicator.taro.tsx @@ -1,7 +1,6 @@ import React, { FunctionComponent, ReactNode } from 'react' import classNames from 'classnames' import { View, ViewProps } from '@tarojs/components' -import { pxTransform } from '@/utils/taro/px-transform' import { TaroIndicatorProps, IndicatorType } from '@/types' const defaultProps = { @@ -25,6 +24,7 @@ export const Indicator: FunctionComponent< children, className, direction, + placement, ...rest } = { ...defaultProps, @@ -34,6 +34,7 @@ export const Indicator: FunctionComponent< [`${classPrefix}-vertical`]: direction === 'vertical', [`${classPrefix}-white`]: color === 'default', [`${classPrefix}-track`]: type === 'slide', + [`${classPrefix}-${placement}`]: !!placement, }) const renderDotElement = () => { @@ -58,13 +59,11 @@ export const Indicator: FunctionComponent< return childs } const renderLineElement = () => { - const trackWidth: number = 21 - const sliderWidth: number = 6 - const stride = (trackWidth - sliderWidth) / (total - 1) return ( diff --git a/src/packages/indicator/indicator.tsx b/src/packages/indicator/indicator.tsx index cb099eb335..45556b50d1 100644 --- a/src/packages/indicator/indicator.tsx +++ b/src/packages/indicator/indicator.tsx @@ -23,6 +23,7 @@ export const Indicator: FunctionComponent> = ( children, className, direction, + placement, ...rest } = { ...defaultProps, @@ -32,6 +33,7 @@ export const Indicator: FunctionComponent> = ( [`${classPrefix}-vertical`]: direction === 'vertical', [`${classPrefix}-white`]: color === 'default', [`${classPrefix}-track`]: type === 'slide', + [`${classPrefix}-${placement}`]: !!placement, }) const renderDotElement = () => { @@ -53,14 +55,14 @@ export const Indicator: FunctionComponent> = ( return childs } const renderLineElement = () => { - const trackWidth: number = 21 - const sliderWidth: number = 6 - const stride = (trackWidth - sliderWidth) / (total - 1) return (
) diff --git a/src/styles/theme-dark.scss b/src/styles/theme-dark.scss index 8e0d9928e2..1a6ae5cdf2 100644 --- a/src/styles/theme-dark.scss +++ b/src/styles/theme-dark.scss @@ -379,4 +379,7 @@ page, --nutui-line-tag: var(--nutui-line-1); // 间隔线/组件边框 --nutui-line-component: var(--nutui-line-2); + + // indicator 圆角(不随 radius-xxs 归零) + --nutui-indicator-border-radius: var(--nutui-radius-2); } diff --git a/src/styles/theme-default.scss b/src/styles/theme-default.scss index 4445e08a24..24aef40b07 100644 --- a/src/styles/theme-default.scss +++ b/src/styles/theme-default.scss @@ -380,4 +380,7 @@ page { --nutui-line-tag: var(--nutui-line-1); // 间隔线/组件边框 --nutui-line-component: var(--nutui-line-2); + + // indicator 圆角(不随 radius-xxs 归零) + --nutui-indicator-border-radius: var(--nutui-radius-2); } diff --git a/src/styles/variables.scss b/src/styles/variables.scss index dcb34659c2..81322d1ac3 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -2082,16 +2082,44 @@ $tabs-tabpane-background-color: var( // indicator(✅) $indicator-color: var(--nutui-indicator-color, $color-primary) !default; $indicator-dot-color: var(--nutui-indicator-dot-color, $color-border) !default; -$indicator-dot-size: var(--nutui-indicator-dot-size, scale-px(3px)) !default; +$indicator-dot-size: var(--nutui-indicator-dot-size, scale-px(4px)) !default; $indicator-dot-active-size: var( --nutui-indicator-dot-active-size, - scale-px(6px) + scale-px(8px) ) !default; $indicator-border-radius: var( --nutui-indicator-border-radius, $radius-xxs ) !default; $indicator-dot-margin: var(--nutui-indicator-dot-margin, $spacing-xxs) !default; +$indicator-dot-border: var( + --nutui-indicator-dot-border, + scale-px(0.33px) solid $color-border +) !default; +$indicator-dot-inactive-color: var( + --nutui-indicator-dot-inactive-color, + var(--nutui-color-background-component, #f0f2f7) +) !default; +$indicator-track-width: var( + --nutui-indicator-track-width, + scale-px(24px) +) !default; +$indicator-slider-width: var( + --nutui-indicator-slider-width, + scale-px(8px) +) !default; +$indicator-dual-screen-inactive-width: var( + --nutui-indicator-dual-screen-inactive-width, + scale-px(16px) +) !default; +$indicator-placement-gap: var( + --nutui-indicator-placement-gap, + scale-px(8px) +) !default; +$indicator-placement-safe-gap: var( + --nutui-indicator-placement-safe-gap, + scale-px(12px) +) !default; // menu(✅) $menu-scroll-fixed-top: var(--nutui-menu-scroll-fixed-top, 0) !default; diff --git a/src/types/spec/indicator/base.ts b/src/types/spec/indicator/base.ts index 99ed251bbe..86c02e38d9 100644 --- a/src/types/spec/indicator/base.ts +++ b/src/types/spec/indicator/base.ts @@ -3,6 +3,11 @@ import { UIType } from '../../base/atoms' export type IndicatorType = 'anchor' | 'slide' | 'dualScreen' export type IndicatorColor = Extract +export type IndicatorPlacement = + | 'outside' + | 'inside-top-right' + | 'inside-bottom-center' + | 'inside-bottom-left' export interface BaseIndicator extends BaseProps { total: number @@ -10,4 +15,5 @@ export interface BaseIndicator extends BaseProps { direction: string color: IndicatorColor type: IndicatorType + placement: IndicatorPlacement }