未验证 提交 01d757b6 编写于 作者: 偏右 提交者: GitHub

Merge pull request #26923 from ant-design/master

chore: merge master into feature
...@@ -15,6 +15,21 @@ timeline: true ...@@ -15,6 +15,21 @@ timeline: true
--- ---
## 4.6.6
`2020-09-27`
- 🐞 Fix Steps first item shifts in small screen. [#26894](https://github.com/ant-design/ant-design/pull/26894)
- 💄 Fix Divider border style not work when text is provided. [#26863](https://github.com/ant-design/ant-design/pull/26863)
- 🐞 Fix Radio.Button validation error highlight. [#26849](https://github.com/ant-design/ant-design/pull/26849) [@dhorelik](https://github.com/dhorelik)
- 💄 Fix Typography link-decoration style. [#26854](https://github.com/ant-design/ant-design/pull/26854) [@vineetvk01](https://github.com/vineetvk01)
- Locale
- 🌐 Add Thai locale support. [#26906](https://github.com/ant-design/ant-design/pull/26906) [@anawinwz](https://github.com/anawinwz)
- TypeScript
- 🤖 Fix message.destroy parameter type. [#26864](https://github.com/ant-design/ant-design/pull/26864) [@lihqi](https://github.com/lihqi)
- 🤖 Optimize Slider type definition. [#26884](https://github.com/ant-design/ant-design/pull/26884)
- 🤖 Form properly export `FormListProps` type. [#26831](https://github.com/ant-design/ant-design/pull/26831) [@mgcrea](https://github.com/mgcrea)
## 4.6.5 ## 4.6.5
`2020-09-20` `2020-09-20`
......
...@@ -15,6 +15,21 @@ timeline: true ...@@ -15,6 +15,21 @@ timeline: true
--- ---
## 4.6.6
`2020-09-27`
- 🐞 修复 Steps 在小屏幕下第一项偏移的问题。[#26894](https://github.com/ant-design/ant-design/pull/26894)
- 💄 修复 Divider 在有文字时,设置边框颜色无效的问题。[#26863](https://github.com/ant-design/ant-design/pull/26863)
- 🐞 修复 Radio.Button 错误校验高亮样式的问题。[#26849](https://github.com/ant-design/ant-design/pull/26849) [@dhorelik](https://github.com/dhorelik)
- 💄 修复 Typography 链接下划线样式。[#26854](https://github.com/ant-design/ant-design/pull/26854) [@vineetvk01](https://github.com/vineetvk01)
- 国际化
- 🌐 添加泰语支持。[#26906](https://github.com/ant-design/ant-design/pull/26906) [@anawinwz](https://github.com/anawinwz)
- TypeScript
- 🤖 修复 message.destroy 参数类型错误。[#26864](https://github.com/ant-design/ant-design/pull/26864) [@lihqi](https://github.com/lihqi)
- 🤖 优化 Slider 类型定义。[#26884](https://github.com/ant-design/ant-design/pull/26884)
- 🤖 导出 Form 中的 `FormListProps` 类型。[#26831](https://github.com/ant-design/ant-design/pull/26831) [@mgcrea](https://github.com/mgcrea)
## 4.6.5 ## 4.6.5
`2020-09-20` `2020-09-20`
......
...@@ -16,6 +16,9 @@ const localeValues: Locale = { ...@@ -16,6 +16,9 @@ const localeValues: Locale = {
filterReset: 'Wyczyść', filterReset: 'Wyczyść',
selectAll: 'Zaznacz bieżącą stronę', selectAll: 'Zaznacz bieżącą stronę',
selectInvert: 'Odwróć zaznaczenie', selectInvert: 'Odwróć zaznaczenie',
triggerDesc: 'Sortuj rosnąco',
triggerAsc: 'Sortuj malejąco',
cancelSort: 'Usuń sortowanie',
}, },
Modal: { Modal: {
okText: 'OK', okText: 'OK',
......
import { sleep } from '../../../tests/utils'; import { sleep } from '../../../tests/utils';
import message from '..'; import message, { getInstance } from '..';
describe('message.config', () => { describe('message.config', () => {
// Mock for rc-util raf
window.requestAnimationFrame = callback => {
return window.setTimeout(callback, 16);
};
window.cancelAnimationFrame = id => {
window.clearTimeout(id);
};
beforeEach(() => { beforeEach(() => {
jest.useFakeTimers(); jest.useFakeTimers();
}); });
...@@ -47,11 +55,12 @@ describe('message.config', () => { ...@@ -47,11 +55,12 @@ describe('message.config', () => {
for (let i = 0; i < 10; i += 1) { for (let i = 0; i < 10; i += 1) {
message.info('test'); message.info('test');
} }
message.info('last'); message.info('last');
expect(document.querySelectorAll('.ant-message-notice').length).toBe(5); expect(document.querySelectorAll('.ant-message-notice').length).toBe(5);
expect(document.querySelectorAll('.ant-message-notice')[4].textContent).toBe('last'); expect(document.querySelectorAll('.ant-message-notice')[4].textContent).toBe('last');
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be able to config duration', async () => { it('should be able to config duration', async () => {
...@@ -60,8 +69,10 @@ describe('message.config', () => { ...@@ -60,8 +69,10 @@ describe('message.config', () => {
duration: 0.5, duration: 0.5,
}); });
message.info('last'); message.info('last');
expect(getInstance().component.state.notices).toHaveLength(1);
await sleep(1000); await sleep(1000);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
message.config({ message.config({
duration: 3, duration: 3,
}); });
......
/* eslint-disable jsx-a11y/control-has-associated-label */ /* eslint-disable jsx-a11y/control-has-associated-label */
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import message from '..'; import message, { getInstance } from '..';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';
describe('message.hooks', () => { describe('message.hooks', () => {
...@@ -171,7 +171,7 @@ describe('message.hooks', () => { ...@@ -171,7 +171,7 @@ describe('message.hooks', () => {
expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1);
hide(); hide();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.my-test-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be same hook', () => { it('should be same hook', () => {
......
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { SmileOutlined } from '@ant-design/icons'; import { SmileOutlined } from '@ant-design/icons';
import message from '..'; import message, { getInstance } from '..';
describe('message', () => { describe('message', () => {
beforeEach(() => { beforeEach(() => {
...@@ -19,10 +19,10 @@ describe('message', () => { ...@@ -19,10 +19,10 @@ describe('message', () => {
expect(document.querySelectorAll('.ant-message-notice').length).toBe(2); expect(document.querySelectorAll('.ant-message-notice').length).toBe(2);
hide1(); hide1();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(getInstance().component.state.notices).toHaveLength(1);
hide2(); hide2();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be able to remove manually with a unique key', () => { it('should be able to remove manually with a unique key', () => {
...@@ -33,10 +33,10 @@ describe('message', () => { ...@@ -33,10 +33,10 @@ describe('message', () => {
expect(document.querySelectorAll('.ant-message-notice').length).toBe(2); expect(document.querySelectorAll('.ant-message-notice').length).toBe(2);
message.destroy(key1); message.destroy(key1);
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(getInstance().component.state.notices).toHaveLength(1);
message.destroy(key2); message.destroy(key2);
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be able to destroy globally', () => { it('should be able to destroy globally', () => {
...@@ -93,7 +93,7 @@ describe('message', () => { ...@@ -93,7 +93,7 @@ describe('message', () => {
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(document.querySelectorAll('.ant-message-notice').length).toBe(1);
hide(); hide();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should allow custom icon', () => { it('should allow custom icon', () => {
...@@ -169,7 +169,7 @@ describe('message', () => { ...@@ -169,7 +169,7 @@ describe('message', () => {
mount(<Test />); mount(<Test />);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(document.querySelectorAll('.ant-message-notice').length).toBe(1);
jest.advanceTimersByTime(1500); jest.advanceTimersByTime(1500);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should not throw error when pass null', () => { it('should not throw error when pass null', () => {
......
...@@ -193,7 +193,7 @@ function isArgsProps(content: JointContent): content is ArgsProps { ...@@ -193,7 +193,7 @@ function isArgsProps(content: JointContent): content is ArgsProps {
const api: any = { const api: any = {
open: notice, open: notice,
config: setMessageConfig, config: setMessageConfig,
destroy(messageKey?: number | string) { destroy(messageKey?: React.Key) {
if (messageInstance) { if (messageInstance) {
if (messageKey) { if (messageKey) {
const { removeNotice } = messageInstance; const { removeNotice } = messageInstance;
...@@ -243,8 +243,13 @@ export interface MessageInstance { ...@@ -243,8 +243,13 @@ export interface MessageInstance {
export interface MessageApi extends MessageInstance { export interface MessageApi extends MessageInstance {
warn(content: JointContent, duration?: ConfigDuration, onClose?: ConfigOnClose): MessageType; warn(content: JointContent, duration?: ConfigDuration, onClose?: ConfigOnClose): MessageType;
config(options: ConfigOptions): void; config(options: ConfigOptions): void;
destroy(): void; destroy(messageKey?: React.Key): void;
useMessage(): [MessageInstance, React.ReactElement]; useMessage(): [MessageInstance, React.ReactElement];
} }
/** @private test only function. Not work on production */
export const getInstance = () => {
return process.env.NODE_ENV === 'test' ? messageInstance : null;
};
export default api as MessageApi; export default api as MessageApi;
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { UserOutlined } from '@ant-design/icons'; import { UserOutlined } from '@ant-design/icons';
import notification from '..'; import notification, { getInstance } from '..';
describe('notification', () => { describe('notification', () => {
beforeAll(() => { beforeEach(() => {
jest.useFakeTimers(); jest.useFakeTimers();
}); });
afterAll(() => {
jest.useRealTimers();
});
afterEach(() => { afterEach(() => {
jest.useRealTimers();
notification.destroy(); notification.destroy();
}); });
...@@ -54,14 +51,18 @@ describe('notification', () => { ...@@ -54,14 +51,18 @@ describe('notification', () => {
await Promise.resolve(); await Promise.resolve();
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2); expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2);
notification.close('1'); notification.close('1');
await Promise.resolve();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(1); expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength(
1,
);
notification.close('2'); notification.close('2');
await Promise.resolve();
jest.runAllTimers(); jest.runAllTimers();
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(0); expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength(
0,
);
}); });
it('should be able to destroy globally', async () => { it('should be able to destroy globally', async () => {
......
...@@ -280,4 +280,9 @@ export interface NotificationApi extends NotificationInstance { ...@@ -280,4 +280,9 @@ export interface NotificationApi extends NotificationInstance {
useNotification: () => [NotificationInstance, React.ReactElement]; useNotification: () => [NotificationInstance, React.ReactElement];
} }
/** @private test only function. Not work on production */
export const getInstance = async (cacheKey: string) => {
return process.env.NODE_ENV === 'test' ? notificationInstance[cacheKey] : null;
};
export default api as NotificationApi; export default api as NotificationApi;
import * as React from 'react'; import * as React from 'react';
import RcSlider from 'rc-slider/lib/Slider'; import RcSlider, { Range as RcRange, Handle as RcHandle } from 'rc-slider';
import RcRange from 'rc-slider/lib/Range';
import RcHandle from 'rc-slider/lib/Handle';
import classNames from 'classnames'; import classNames from 'classnames';
import { TooltipPlacement } from '../tooltip'; import { TooltipPlacement } from '../tooltip';
import SliderTooltip from './SliderTooltip'; import SliderTooltip from './SliderTooltip';
...@@ -18,16 +16,15 @@ export interface SliderMarks { ...@@ -18,16 +16,15 @@ export interface SliderMarks {
interface HandleGeneratorInfo { interface HandleGeneratorInfo {
value?: number; value?: number;
dragging: boolean; dragging?: boolean;
index: number; index: number;
rest: any[];
} }
export type HandleGeneratorFn = (config: { export type HandleGeneratorFn = (config: {
tooltipPrefixCls?: string; tooltipPrefixCls?: string;
prefixCls?: string; prefixCls?: string;
info: HandleGeneratorInfo; info: HandleGeneratorInfo;
}) => React.ReactNode; }) => React.ReactElement;
export interface SliderBaseProps { export interface SliderBaseProps {
prefixCls?: string; prefixCls?: string;
...@@ -35,7 +32,7 @@ export interface SliderBaseProps { ...@@ -35,7 +32,7 @@ export interface SliderBaseProps {
reverse?: boolean; reverse?: boolean;
min?: number; min?: number;
max?: number; max?: number;
step?: number | null; step?: number;
marks?: SliderMarks; marks?: SliderMarks;
dots?: boolean; dots?: boolean;
included?: boolean; included?: boolean;
...@@ -70,81 +67,98 @@ export interface SliderRangeProps extends SliderBaseProps { ...@@ -70,81 +67,98 @@ export interface SliderRangeProps extends SliderBaseProps {
export type Visibles = { [index: number]: boolean }; export type Visibles = { [index: number]: boolean };
const Slider = React.forwardRef<unknown, SliderSingleProps | SliderRangeProps>((props, ref) => { const Slider = React.forwardRef<unknown, SliderSingleProps | SliderRangeProps>(
const { getPrefixCls, direction, getPopupContainer } = React.useContext(ConfigContext); (props, ref: any) => {
const [visibles, setVisibles] = React.useState<Visibles>({}); const { getPrefixCls, direction, getPopupContainer } = React.useContext(ConfigContext);
const [visibles, setVisibles] = React.useState<Visibles>({});
const toggleTooltipVisible = (index: number, visible: boolean) => { const toggleTooltipVisible = (index: number, visible: boolean) => {
setVisibles((prev: Visibles) => { setVisibles((prev: Visibles) => {
return { ...prev, [index]: visible }; return { ...prev, [index]: visible };
}); });
}; };
const getTooltipPlacement = (tooltipPlacement?: TooltipPlacement, vertical?: boolean) => { const getTooltipPlacement = (tooltipPlacement?: TooltipPlacement, vertical?: boolean) => {
if (tooltipPlacement) { if (tooltipPlacement) {
return tooltipPlacement; return tooltipPlacement;
} }
if (!vertical) { if (!vertical) {
return 'top'; return 'top';
} }
return direction === 'rtl' ? 'left' : 'right'; return direction === 'rtl' ? 'left' : 'right';
}; };
const handleWithTooltip: HandleGeneratorFn = ({
tooltipPrefixCls,
prefixCls,
info: { value, dragging, index, ...restProps },
}) => {
const {
tipFormatter,
tooltipVisible,
tooltipPlacement,
getTooltipPopupContainer,
vertical,
} = props;
const isTipFormatter = tipFormatter ? visibles[index] || dragging : false;
const visible = tooltipVisible || (tooltipVisible === undefined && isTipFormatter);
return (
<SliderTooltip
prefixCls={tooltipPrefixCls}
title={tipFormatter ? tipFormatter(value) : ''}
visible={visible}
placement={getTooltipPlacement(tooltipPlacement, vertical)}
transitionName="zoom-down"
key={index}
overlayClassName={`${prefixCls}-tooltip`}
getPopupContainer={getTooltipPopupContainer || getPopupContainer || (() => document.body)}
>
<RcHandle
{...restProps}
value={value}
onMouseEnter={() => toggleTooltipVisible(index, true)}
onMouseLeave={() => toggleTooltipVisible(index, false)}
/>
</SliderTooltip>
);
};
const handleWithTooltip: HandleGeneratorFn = ({
tooltipPrefixCls,
prefixCls,
info: { value, dragging, index, ...restProps },
}) => {
const { const {
tipFormatter, prefixCls: customizePrefixCls,
tooltipVisible, tooltipPrefixCls: customizeTooltipPrefixCls,
tooltipPlacement, range,
getTooltipPopupContainer, className,
vertical, ...restProps
} = props; } = props;
const isTipFormatter = tipFormatter ? visibles[index] || dragging : false; const prefixCls = getPrefixCls('slider', customizePrefixCls);
const visible = tooltipVisible || (tooltipVisible === undefined && isTipFormatter); const tooltipPrefixCls = getPrefixCls('tooltip', customizeTooltipPrefixCls);
return ( const cls = classNames(className, {
<SliderTooltip [`${prefixCls}-rtl`]: direction === 'rtl',
prefixCls={tooltipPrefixCls} });
title={tipFormatter ? tipFormatter(value) : ''} // make reverse default on rtl direction
visible={visible} if (direction === 'rtl' && !restProps.vertical) {
placement={getTooltipPlacement(tooltipPlacement, vertical)} restProps.reverse = !restProps.reverse;
transitionName="zoom-down" }
key={index} if (range) {
overlayClassName={`${prefixCls}-tooltip`} return (
getPopupContainer={getTooltipPopupContainer || getPopupContainer || (() => document.body)} <RcRange
> {...(restProps as SliderRangeProps)}
<RcHandle className={cls}
{...restProps} ref={ref}
value={value} handle={(info: HandleGeneratorInfo) =>
onMouseEnter={() => toggleTooltipVisible(index, true)} handleWithTooltip({
onMouseLeave={() => toggleTooltipVisible(index, false)} tooltipPrefixCls,
prefixCls,
info,
})
}
prefixCls={prefixCls}
/> />
</SliderTooltip> );
); }
};
const {
prefixCls: customizePrefixCls,
tooltipPrefixCls: customizeTooltipPrefixCls,
range,
className,
...restProps
} = props;
const prefixCls = getPrefixCls('slider', customizePrefixCls);
const tooltipPrefixCls = getPrefixCls('tooltip', customizeTooltipPrefixCls);
const cls = classNames(className, {
[`${prefixCls}-rtl`]: direction === 'rtl',
});
// make reverse default on rtl direction
if (direction === 'rtl' && !restProps.vertical) {
restProps.reverse = !restProps.reverse;
}
if (range) {
return ( return (
<RcRange <RcSlider
{...restProps} {...(restProps as SliderSingleProps)}
className={cls} className={cls}
ref={ref} ref={ref}
handle={(info: HandleGeneratorInfo) => handle={(info: HandleGeneratorInfo) =>
...@@ -155,27 +169,10 @@ const Slider = React.forwardRef<unknown, SliderSingleProps | SliderRangeProps>(( ...@@ -155,27 +169,10 @@ const Slider = React.forwardRef<unknown, SliderSingleProps | SliderRangeProps>((
}) })
} }
prefixCls={prefixCls} prefixCls={prefixCls}
tooltipPrefixCls={tooltipPrefixCls}
/> />
); );
} },
return ( );
<RcSlider
{...restProps}
className={cls}
ref={ref}
handle={(info: HandleGeneratorInfo) =>
handleWithTooltip({
tooltipPrefixCls,
prefixCls,
info,
})
}
prefixCls={prefixCls}
tooltipPrefixCls={tooltipPrefixCls}
/>
);
});
Slider.displayName = 'Slider'; Slider.displayName = 'Slider';
......
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
.@{steps-prefix-cls}-item { .@{steps-prefix-cls}-item {
display: block; display: block;
flex: 1 0 auto; flex: 1 0 auto;
padding-left: 0;
overflow: visible; overflow: visible;
&-icon { &-icon {
float: left; float: left;
margin-right: @steps-vertical-icon-width; margin-right: @steps-vertical-icon-width;
......
/* eslint no-console:0 */ /* eslint no-console:0 */
function camelCase(name) { function pascalCase(name) {
return name.charAt(0).toUpperCase() + name.slice(1).replace(/-(\w)/g, (m, n) => n.toUpperCase()); return name.charAt(0).toUpperCase() + name.slice(1).replace(/-(\w)/g, (m, n) => n.toUpperCase());
} }
...@@ -17,7 +17,7 @@ req.keys().forEach(mod => { ...@@ -17,7 +17,7 @@ req.keys().forEach(mod => {
// message & notification should not be capitalized // message & notification should not be capitalized
exports[match[1]] = v; exports[match[1]] = v;
} else { } else {
exports[camelCase(match[1])] = v; exports[pascalCase(match[1])] = v;
} }
} }
}); });
......
{ {
"name": "antd", "name": "antd",
"version": "4.6.5", "version": "4.6.6",
"description": "An enterprise-class UI design language and React components implementation", "description": "An enterprise-class UI design language and React components implementation",
"title": "Ant Design", "title": "Ant Design",
"keywords": [ "keywords": [
...@@ -129,15 +129,15 @@ ...@@ -129,15 +129,15 @@
"rc-input-number": "~6.0.0", "rc-input-number": "~6.0.0",
"rc-mentions": "~1.5.0", "rc-mentions": "~1.5.0",
"rc-menu": "~8.7.1", "rc-menu": "~8.7.1",
"rc-motion": "^2.0.0", "rc-motion": "^2.2.0",
"rc-notification": "~4.4.0", "rc-notification": "~4.5.2",
"rc-pagination": "~3.0.3", "rc-pagination": "~3.0.3",
"rc-picker": "~2.2.1", "rc-picker": "~2.2.1",
"rc-progress": "~3.1.0", "rc-progress": "~3.1.0",
"rc-rate": "~2.8.2", "rc-rate": "~2.8.2",
"rc-resize-observer": "^0.2.3", "rc-resize-observer": "^0.2.3",
"rc-select": "~11.3.2", "rc-select": "~11.3.2",
"rc-slider": "~9.4.1", "rc-slider": "~9.5.1",
"rc-steps": "~4.1.0", "rc-steps": "~4.1.0",
"rc-switch": "~3.2.0", "rc-switch": "~3.2.0",
"rc-table": "~7.9.2", "rc-table": "~7.9.2",
...@@ -195,7 +195,7 @@ ...@@ -195,7 +195,7 @@
"enquire-js": "^0.2.1", "enquire-js": "^0.2.1",
"enzyme": "^3.10.0", "enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0", "enzyme-adapter-react-16": "^1.14.0",
"enzyme-to-json": "^3.3.5", "enzyme-to-json": "^3.6.0",
"esbuild-webpack-plugin": "^1.0.0", "esbuild-webpack-plugin": "^1.0.0",
"eslint": "^7.9.0", "eslint": "^7.9.0",
"eslint-config-airbnb": "^18.0.0", "eslint-config-airbnb": "^18.0.0",
......
...@@ -46,14 +46,6 @@ declare module 'rc-rate'; ...@@ -46,14 +46,6 @@ declare module 'rc-rate';
declare module 'rc-queue-anim'; declare module 'rc-queue-anim';
declare module 'rc-slider';
declare module 'rc-slider/lib/Slider';
declare module 'rc-slider/lib/Range';
declare module 'rc-slider/lib/Handle';
declare module 'rc-steps'; declare module 'rc-steps';
declare module 'rc-switch'; declare module 'rc-switch';
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册