@douyinfe/semi-ui 2.9.1 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/banner/_story/banner.stories.js +62 -1
  2. package/banner/index.tsx +5 -5
  3. package/button/buttonGroup.tsx +2 -2
  4. package/carousel/CarouselArrow.tsx +62 -0
  5. package/carousel/CarouselIndicator.tsx +83 -0
  6. package/carousel/__test__/carousel.test.js +159 -0
  7. package/carousel/_story/carousel.stories.js +486 -0
  8. package/carousel/index.tsx +292 -0
  9. package/carousel/interface.ts +63 -0
  10. package/cascader/index.tsx +1 -2
  11. package/datePicker/monthsGrid.tsx +8 -8
  12. package/dist/css/semi.css +342 -0
  13. package/dist/css/semi.min.css +1 -1
  14. package/dist/umd/semi-ui.js +1238 -266
  15. package/dist/umd/semi-ui.js.map +1 -1
  16. package/dist/umd/semi-ui.min.js +1 -1
  17. package/dist/umd/semi-ui.min.js.map +1 -1
  18. package/form/baseForm.tsx +10 -1
  19. package/form/hoc/withField.tsx +17 -5
  20. package/index.ts +2 -0
  21. package/inputNumber/__test__/inputNumber.test.js +40 -3
  22. package/inputNumber/_story/inputNumber.stories.js +56 -1
  23. package/inputNumber/index.tsx +22 -14
  24. package/lib/cjs/banner/index.js +11 -5
  25. package/lib/cjs/button/buttonGroup.d.ts +1 -1
  26. package/lib/cjs/carousel/CarouselArrow.d.ts +8 -0
  27. package/lib/cjs/carousel/CarouselArrow.js +88 -0
  28. package/lib/cjs/carousel/CarouselIndicator.d.ts +23 -0
  29. package/lib/cjs/carousel/CarouselIndicator.js +145 -0
  30. package/lib/cjs/carousel/index.d.ts +58 -0
  31. package/lib/cjs/carousel/index.js +343 -0
  32. package/lib/cjs/carousel/interface.d.ts +61 -0
  33. package/lib/cjs/carousel/interface.js +7 -0
  34. package/lib/cjs/cascader/index.js +1 -1
  35. package/lib/cjs/datePicker/monthsGrid.js +6 -6
  36. package/lib/cjs/form/baseForm.d.ts +1 -0
  37. package/lib/cjs/form/baseForm.js +10 -1
  38. package/lib/cjs/form/hoc/withField.js +8 -1
  39. package/lib/cjs/index.d.ts +1 -0
  40. package/lib/cjs/index.js +9 -0
  41. package/lib/cjs/inputNumber/index.d.ts +2 -6
  42. package/lib/cjs/inputNumber/index.js +27 -11
  43. package/lib/cjs/switch/index.d.ts +3 -0
  44. package/lib/cjs/switch/index.js +26 -6
  45. package/lib/cjs/transfer/index.js +5 -5
  46. package/lib/cjs/treeSelect/index.js +1 -1
  47. package/lib/es/banner/index.js +11 -5
  48. package/lib/es/button/buttonGroup.d.ts +1 -1
  49. package/lib/es/carousel/CarouselArrow.d.ts +8 -0
  50. package/lib/es/carousel/CarouselArrow.js +70 -0
  51. package/lib/es/carousel/CarouselIndicator.d.ts +23 -0
  52. package/lib/es/carousel/CarouselIndicator.js +125 -0
  53. package/lib/es/carousel/index.d.ts +58 -0
  54. package/lib/es/carousel/index.js +309 -0
  55. package/lib/es/carousel/interface.d.ts +61 -0
  56. package/lib/es/carousel/interface.js +1 -0
  57. package/lib/es/cascader/index.js +1 -1
  58. package/lib/es/datePicker/monthsGrid.js +7 -7
  59. package/lib/es/form/baseForm.d.ts +1 -0
  60. package/lib/es/form/baseForm.js +10 -1
  61. package/lib/es/form/hoc/withField.js +8 -1
  62. package/lib/es/index.d.ts +1 -0
  63. package/lib/es/index.js +1 -0
  64. package/lib/es/inputNumber/index.d.ts +2 -6
  65. package/lib/es/inputNumber/index.js +26 -11
  66. package/lib/es/switch/index.d.ts +3 -0
  67. package/lib/es/switch/index.js +26 -6
  68. package/lib/es/transfer/index.js +1 -1
  69. package/lib/es/treeSelect/index.js +1 -1
  70. package/package.json +9 -9
  71. package/switch/index.tsx +20 -3
  72. package/tagInput/__test__/tagInput.test.js +11 -11
  73. package/transfer/index.tsx +1 -1
  74. package/treeSelect/index.tsx +1 -1
package/form/baseForm.tsx CHANGED
@@ -122,7 +122,7 @@ class Form extends BaseComponent<BaseFormProps, BaseFormState> {
122
122
  constructor(props: BaseFormProps) {
123
123
  super(props);
124
124
  this.state = {
125
- formId: getUuidv4(),
125
+ formId: '',
126
126
  };
127
127
  warning(
128
128
  Boolean(props.component && props.render),
@@ -145,6 +145,10 @@ class Form extends BaseComponent<BaseFormProps, BaseFormState> {
145
145
  }
146
146
  }
147
147
 
148
+ componentDidMount() {
149
+ this.foundation.init();
150
+ }
151
+
148
152
  componentWillUnmount() {
149
153
  this.foundation.destroy();
150
154
  this.foundation = null;
@@ -173,6 +177,11 @@ class Form extends BaseComponent<BaseFormProps, BaseFormState> {
173
177
  notifyReset: () => {
174
178
  this.props.onReset();
175
179
  },
180
+ initFormId: () => {
181
+ this.setState({
182
+ formId: getUuidv4()
183
+ });
184
+ },
176
185
  getInitValues: () => this.props.initValues,
177
186
  getFormProps: (keys: undefined | string | Array<string>) => {
178
187
  if (typeof keys === 'undefined') {
@@ -379,12 +379,24 @@ function withField<
379
379
  return () => {};
380
380
  }
381
381
  // log('register: ' + field);
382
- updater.register(field, fieldState, {
382
+
383
+ // field value may change after field component mounted, we use ref value here to get changed value
384
+ const refValue = getVal();
385
+ updater.register(
383
386
  field,
384
- fieldApi,
385
- keepState,
386
- allowEmpty: allowEmpty || allowEmptyString,
387
- });
387
+ {
388
+ value: refValue,
389
+ error,
390
+ touched,
391
+ status,
392
+ },
393
+ {
394
+ field,
395
+ fieldApi,
396
+ keepState,
397
+ allowEmpty: allowEmpty || allowEmptyString,
398
+ }
399
+ );
388
400
  // return unRegister cb
389
401
  return () => {
390
402
  updater.unRegister(field);
package/index.ts CHANGED
@@ -12,6 +12,7 @@ export { default as ButtonGroup } from './button/buttonGroup';
12
12
  export { default as Calendar } from './calendar';
13
13
  export { default as Card } from './card';
14
14
  export { default as CardGroup } from './card/cardGroup';
15
+ export { default as Carousel } from './carousel';
15
16
  export { default as Cascader } from './cascader';
16
17
  export { default as Checkbox } from './checkbox';
17
18
  export { default as CheckboxGroup } from './checkbox/checkboxGroup';
@@ -79,6 +80,7 @@ export { default as Upload } from './upload';
79
80
  export { default as Typography } from './typography';
80
81
  export { default as Transfer } from './transfer';
81
82
 
83
+
82
84
  export { default as LocaleProvider } from './locale/localeProvider';
83
85
 
84
86
  /** Form */
@@ -6,7 +6,7 @@ import keyCode from '@douyinfe/semi-foundation/utils/keyCode';
6
6
  import * as _ from 'lodash';
7
7
  import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
8
8
  import { numbers } from '@douyinfe/semi-foundation/inputNumber/constants';
9
- import { Form, withField } from '../../index';
9
+ import { Form, withField, useFormApi } from '../../index';
10
10
 
11
11
  const log = (...args) => console.log(...args);
12
12
  const times = (n = 0, fn) => {
@@ -182,8 +182,9 @@ describe(`InputNumber`, () => {
182
182
  const inputElem = inputNumber.find('input');
183
183
 
184
184
  inputElem.simulate('change', event);
185
- expect(onChange.calledOnce).toBe(true);
186
- expect(onChange.calledWithMatch(Number(newValue.toFixed(precision)))).toBe(true);
185
+ expect(onChange.calledTwice).toBe(true);
186
+ expect(onChange.getCall(1).args[0]).toEqual(Number(newValue.toFixed(precision)));
187
+ // expect(onChange.calledWithMatch(Number(newValue.toFixed(precision)))).toBe(true);
187
188
  expect(inputElem.instance().value).toBe(formatter(newValue));
188
189
 
189
190
  inputElem.simulate('blur');
@@ -395,4 +396,40 @@ describe(`InputNumber`, () => {
395
396
  expect(onUpClick.called).toBe(false);
396
397
  expect(onDownClick.called).toBe(false);
397
398
  });
399
+
400
+ it('fix controlled min value didMount', () => {
401
+ const spyChange = sinon.spy();
402
+ const inputNumber = mount(
403
+ <InputNumber min={1} value={0} onChange={spyChange} />
404
+ );
405
+ expect(spyChange.calledOnce).toBe(true);
406
+ });
407
+
408
+ it('fix controlled min value didUpdate', () => {
409
+ const spyChange = sinon.spy();
410
+ const value = undefined;
411
+ const inputNumber = mount(
412
+ <InputNumber min={1} value={value} onChange={spyChange} />
413
+ );
414
+ inputNumber.setProps({ value: 0 });
415
+ expect(spyChange.calledTwice).toBe(true);
416
+ expect(spyChange.getCall(0).args[0]).toEqual('');
417
+ expect(spyChange.getCall(1).args[0]).toEqual(1);
418
+ });
419
+
420
+ it('fix controlled min value form field', () => {
421
+ const spyChange = sinon.spy();
422
+ let formApi = null;
423
+ let getFormApi = api => {
424
+ formApi = api;
425
+ };
426
+ const inputNumber = mount(
427
+ <Form initValues={{ minControlled: 0 }} getFormApi={getFormApi}>
428
+ <Form.InputNumber field="minControlled" min={1} onChange={spyChange} />
429
+ </Form>
430
+ );
431
+ expect(spyChange.calledOnce).toBe(true);
432
+ expect(spyChange.getCall(0).args[0]).toEqual(1);
433
+ expect(formApi.getValue('minControlled')).toBe(1);
434
+ });
398
435
  });
@@ -4,6 +4,7 @@ import './inputNumber.scss';
4
4
  import InputNumber from '../index';
5
5
  import Button from '../../button/index';
6
6
  import { withField, Form } from '../../index';
7
+ import { useFormApi } from '../../form';
7
8
 
8
9
  export default {
9
10
  title: 'InputNumber',
@@ -656,4 +657,58 @@ export const FixPrecision = () => {
656
657
  <InputNumber keepFocus onBlur={() => console.log('blur')} onChange={v => setValue2(v)} value={value2} style={{ width: 190 }} precision={2} />
657
658
  </div>
658
659
  );
659
- }
660
+ }
661
+
662
+ /**
663
+ * 受控传超出 min value 的值,需要触发 onChange
664
+ * 不然在 Form 中使用可能会导致 Form State 与 InputNumber 展示的值不同问题
665
+ */
666
+ export const FixMinValue = () => {
667
+ const [value, setValue] = useState();
668
+ const formRef = useFormApi();
669
+ return (
670
+ <div style={{ width: 280 }}>
671
+ <Button onClick={() => setValue(0)}>min=1, setValue=0</Button>
672
+ <InputNumber
673
+ min={1}
674
+ value={value}
675
+ onChange={(v, e) => {
676
+ console.log('inputNumber1 change', `'${v}'`, e);
677
+ setValue(v);
678
+ }}
679
+ />
680
+ <InputNumber
681
+ min={1}
682
+ value={0}
683
+ onChange={(v, e) => {
684
+ console.log('inputNumber2 change', v, e);
685
+ }}
686
+ />
687
+ <Form initValues={{ minControlled: 0 }}>
688
+ <Form.InputNumber
689
+ field='minControlled'
690
+ min={1}
691
+ onChange={(v, e) => {
692
+ console.log('form inputNumber change', v, e);
693
+ }}
694
+ />
695
+ </Form>
696
+ <Button onClick={() => formRef.current.setValue('minControlled', 0) }>set form value</Button>
697
+ <Button onClick={() => { console.log('form value', JSON.stringify(formRef.current.getValues()))}}>get form values</Button>
698
+ </div>
699
+ );
700
+ }
701
+ FixMinValue.storyName = 'fix min value';
702
+
703
+ /**
704
+ * fix InputNumber precision 删除后,输入非法字符显示 0.00
705
+ * https://github.com/DouyinFE/semi-design/issues/786
706
+ */
707
+ export const FixPrecision786 = () => {
708
+ return (
709
+ <div data-cy="fix-precision-786">
710
+ <InputNumber defaultValue={10.00} precision={2} />
711
+ </div>
712
+ );
713
+ }
714
+ FixPrecision786.storyName = 'fix precision 删除后输入非法值会显示 0.00';
@@ -10,13 +10,13 @@ import Input, { InputProps } from '../input';
10
10
  import { forwardStatics } from '@douyinfe/semi-foundation/utils/object';
11
11
  import isNullOrUndefined from '@douyinfe/semi-foundation/utils/isNullOrUndefined';
12
12
  import isBothNaN from '@douyinfe/semi-foundation/utils/isBothNaN';
13
- import InputNumberFoundation, { InputNumberAdapter } from '@douyinfe/semi-foundation/inputNumber/foundation';
13
+ import InputNumberFoundation, { BaseInputNumberState, InputNumberAdapter } from '@douyinfe/semi-foundation/inputNumber/foundation';
14
14
  import BaseComponent from '../_base/baseComponent';
15
15
  import { cssClasses, numbers, strings } from '@douyinfe/semi-foundation/inputNumber/constants';
16
16
  import { IconChevronUp, IconChevronDown } from '@douyinfe/semi-icons';
17
17
 
18
18
  import '@douyinfe/semi-foundation/inputNumber/inputNumber.scss';
19
- import { isNaN, noop } from 'lodash';
19
+ import { isNaN, isString, noop } from 'lodash';
20
20
  import { ArrayElement } from '../_base/base';
21
21
 
22
22
  export interface InputNumberProps extends InputProps {
@@ -54,12 +54,7 @@ export interface InputNumberProps extends InputProps {
54
54
  onUpClick?: (value: string, e: React.MouseEvent<HTMLButtonElement>) => void;
55
55
  }
56
56
 
57
- export interface InputNumberState {
58
- value?: number | string;
59
- number?: number | null; // Current parsed numbers
60
- focusing?: boolean;
61
- hovering?: boolean;
62
- }
57
+ export interface InputNumberState extends BaseInputNumberState {}
63
58
 
64
59
  class InputNumber extends BaseComponent<InputNumberProps, InputNumberState> {
65
60
  static propTypes = {
@@ -222,6 +217,9 @@ class InputNumber extends BaseComponent<InputNumberProps, InputNumberState> {
222
217
  },
223
218
  setClickUpOrDown: value => {
224
219
  this.clickUpOrDown = value;
220
+ },
221
+ updateStates: (states, callback) => {
222
+ this.setState(states, callback);
225
223
  }
226
224
  };
227
225
  }
@@ -250,13 +248,15 @@ class InputNumber extends BaseComponent<InputNumberProps, InputNumberState> {
250
248
  componentDidUpdate(prevProps: InputNumberProps) {
251
249
  const { value } = this.props;
252
250
  const { focusing } = this.state;
251
+ let newValue;
253
252
  /**
254
253
  * To determine whether the front and back are equal
255
254
  * NaN need to check whether both are NaN
256
255
  */
257
256
  if (value !== prevProps.value && !isBothNaN(value, prevProps.value)) {
258
257
  if (isNullOrUndefined(value) || value === '') {
259
- this.setState({ value: '', number: null });
258
+ newValue = '';
259
+ this.foundation.updateStates({ value: newValue, number: null });
260
260
  } else {
261
261
  let valueStr = value;
262
262
  if (typeof value === 'number') {
@@ -306,22 +306,30 @@ class InputNumber extends BaseComponent<InputNumberProps, InputNumberState> {
306
306
  */
307
307
  if (this.clickUpOrDown) {
308
308
  obj.value = this.foundation.doFormat(valueStr, true);
309
+ newValue = obj.value;
309
310
  }
310
- this.setState(obj, () => this.adapter.restoreCursor());
311
+ this.foundation.updateStates(obj, () => this.adapter.restoreCursor());
311
312
  } else if (!isNaN(toNum)) {
312
313
  // Update input content when controlled input is illegal and not NaN
313
- this.setState({ value: this.foundation.doFormat(toNum, false) });
314
+ newValue = this.foundation.doFormat(toNum, false);
315
+ this.foundation.updateStates({ value: newValue });
314
316
  } else {
315
317
  // Update input content when controlled input NaN
316
- this.setState({ value: this.foundation.doFormat(valueStr, false) });
318
+ newValue = this.foundation.doFormat(valueStr, false);
319
+ this.foundation.updateStates({ value: newValue });
317
320
  }
318
321
  } else if (this.foundation.isValidNumber(parsedNum)) {
319
- this.setState({ number: parsedNum, value: this.foundation.doFormat(parsedNum) });
322
+ newValue = this.foundation.doFormat(parsedNum);
323
+ this.foundation.updateStates({ number: parsedNum, value: newValue });
320
324
  } else {
321
325
  // Invalid digital analog blurring effect instead of controlled failure
322
- this.setState({ number: null, value: '' });
326
+ newValue = '';
327
+ this.foundation.updateStates({ number: null, value: newValue });
323
328
  }
324
329
  }
330
+ if (isString(newValue) && newValue !== String(this.props.value)) {
331
+ this.foundation.notifyChange(newValue, null);
332
+ }
325
333
  }
326
334
 
327
335
  if (!this.clickUpOrDown) {
@@ -92,7 +92,9 @@ class Banner extends _baseComponent.default {
92
92
  const closer = /*#__PURE__*/_react.default.createElement(_iconButton.default, {
93
93
  className: "".concat(prefixCls, "-close"),
94
94
  onClick: this.remove,
95
- icon: closeIcon || /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, null),
95
+ icon: closeIcon || /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, {
96
+ "aria-hidden": true
97
+ }),
96
98
  theme: "borderless",
97
99
  size: "small",
98
100
  type: "tertiary",
@@ -109,16 +111,20 @@ class Banner extends _baseComponent.default {
109
111
  } = this.props;
110
112
  const iconMap = {
111
113
  warning: /*#__PURE__*/_react.default.createElement(_semiIcons.IconAlertTriangle, {
112
- size: "large"
114
+ size: "large",
115
+ "aria-label": 'warning'
113
116
  }),
114
117
  success: /*#__PURE__*/_react.default.createElement(_semiIcons.IconTickCircle, {
115
- size: "large"
118
+ size: "large",
119
+ "aria-label": 'success'
116
120
  }),
117
121
  info: /*#__PURE__*/_react.default.createElement(_semiIcons.IconInfoCircle, {
118
- size: "large"
122
+ size: "large",
123
+ "aria-label": 'info'
119
124
  }),
120
125
  danger: /*#__PURE__*/_react.default.createElement(_semiIcons.IconAlertCircle, {
121
- size: "large"
126
+ size: "large",
127
+ "aria-label": 'danger'
122
128
  })
123
129
  };
124
130
  let iconType = iconMap[type];
@@ -10,7 +10,7 @@ export interface ButtonGroupProps extends BaseProps {
10
10
  size?: Size;
11
11
  theme?: Theme;
12
12
  className?: string;
13
- children?: React.ReactChild;
13
+ children?: React.ReactNode;
14
14
  'aria-label'?: React.AriaAttributes['aria-label'];
15
15
  }
16
16
  export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
@@ -0,0 +1,8 @@
1
+ import React, { ReactNode } from "react";
2
+ import { CarouselArrowProps } from "./interface";
3
+ declare class CarouselArrow extends React.PureComponent<CarouselArrowProps> {
4
+ renderLeftIcon: () => any;
5
+ renderRightIcon: () => any;
6
+ render(): ReactNode;
7
+ }
8
+ export default CarouselArrow;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports.default = void 0;
12
+
13
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
14
+
15
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
16
+
17
+ var _get2 = _interopRequireDefault(require("lodash/get"));
18
+
19
+ var _react = _interopRequireDefault(require("react"));
20
+
21
+ var _classnames = _interopRequireDefault(require("classnames"));
22
+
23
+ var _constants = require("@douyinfe/semi-foundation/lib/cjs/carousel/constants");
24
+
25
+ var _semiIcons = require("@douyinfe/semi-icons");
26
+
27
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
28
+
29
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
30
+ class CarouselArrow extends _react.default.PureComponent {
31
+ constructor() {
32
+ super(...arguments);
33
+
34
+ this.renderLeftIcon = () => {
35
+ return (0, _get2.default)(this.props, 'arrowProps.leftArrow.children', /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronLeft, {
36
+ "aria-label": "Previous index",
37
+ size: "inherit"
38
+ }));
39
+ };
40
+
41
+ this.renderRightIcon = () => {
42
+ return (0, _get2.default)(this.props, 'arrowProps.rightArrow.children', /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronRight, {
43
+ "aria-label": "Next index",
44
+ size: "inherit"
45
+ }));
46
+ };
47
+ }
48
+
49
+ render() {
50
+ var _context, _context2, _context3;
51
+
52
+ const {
53
+ type,
54
+ theme,
55
+ prev,
56
+ next
57
+ } = this.props;
58
+ const classNames = (0, _classnames.default)({
59
+ [_constants.cssClasses.CAROUSEL_ARROW]: true,
60
+ [(0, _concat.default)(_context = "".concat(_constants.cssClasses.CAROUSEL_ARROW, "-")).call(_context, theme)]: theme,
61
+ ["".concat(_constants.cssClasses.CAROUSEL_ARROW, "-hover")]: type === 'hover'
62
+ });
63
+ const leftClassNames = (0, _classnames.default)({
64
+ ["".concat(_constants.cssClasses.CAROUSEL_ARROW, "-prev")]: true,
65
+ [(0, _concat.default)(_context2 = "".concat(_constants.cssClasses.CAROUSEL_ARROW, "-")).call(_context2, theme)]: theme
66
+ });
67
+ const rightClassNames = (0, _classnames.default)({
68
+ ["".concat(_constants.cssClasses.CAROUSEL_ARROW, "-next")]: true,
69
+ [(0, _concat.default)(_context3 = "".concat(_constants.cssClasses.CAROUSEL_ARROW, "-")).call(_context3, theme)]: theme
70
+ });
71
+ return /*#__PURE__*/_react.default.createElement("div", {
72
+ className: classNames
73
+ }, /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({
74
+ // role='button'
75
+ className: leftClassNames,
76
+ onClick: prev
77
+ }, (0, _get2.default)(this.props, 'arrowProps.leftArrow.props')), this.renderLeftIcon()), /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({
78
+ // role='button'
79
+ // tabIndex={0}
80
+ className: rightClassNames,
81
+ onClick: next
82
+ }, (0, _get2.default)(this.props, 'arrowProps.rightArrow.props')), this.renderRightIcon()));
83
+ }
84
+
85
+ }
86
+
87
+ var _default = CarouselArrow;
88
+ exports.default = _default;
@@ -0,0 +1,23 @@
1
+ import React, { ReactNode } from "react";
2
+ import PropTypes from 'prop-types';
3
+ import { CarouselIndicatorProps } from "./interface";
4
+ declare class CarouselIndicator extends React.PureComponent<CarouselIndicatorProps> {
5
+ static propTypes: {
6
+ activeKey: PropTypes.Requireable<number>;
7
+ className: PropTypes.Requireable<string>;
8
+ position: PropTypes.Requireable<"left" | "right" | "center">;
9
+ size: PropTypes.Requireable<"small" | "medium">;
10
+ style: PropTypes.Requireable<object>;
11
+ theme: PropTypes.Requireable<"primary" | "dark" | "light">;
12
+ total: PropTypes.Requireable<number>;
13
+ onIndicatorChange: PropTypes.Requireable<(...args: any[]) => any>;
14
+ type: PropTypes.Requireable<"line" | "dot" | "columnar">;
15
+ trigger: PropTypes.Requireable<"hover" | "click">;
16
+ };
17
+ onIndicatorChange: (activeIndex: number) => void;
18
+ handleIndicatorClick: (activeIndex: number) => void;
19
+ handleIndicatorHover: (activeIndex: number) => void;
20
+ renderIndicatorContent(): ReactNode;
21
+ render(): ReactNode;
22
+ }
23
+ export default CarouselIndicator;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports.default = void 0;
12
+
13
+ var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
14
+
15
+ var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
16
+
17
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
18
+
19
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
20
+
21
+ var _react = _interopRequireDefault(require("react"));
22
+
23
+ var _classnames = _interopRequireDefault(require("classnames"));
24
+
25
+ var _propTypes = _interopRequireDefault(require("prop-types"));
26
+
27
+ var _constants = require("@douyinfe/semi-foundation/lib/cjs/carousel/constants");
28
+
29
+ var _getDataAttr = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/utils/getDataAttr"));
30
+
31
+ var __rest = void 0 && (void 0).__rest || function (s, e) {
32
+ var t = {};
33
+
34
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && (0, _indexOf.default)(e).call(e, p) < 0) t[p] = s[p];
35
+
36
+ if (s != null && typeof _getOwnPropertySymbols.default === "function") for (var i = 0, p = (0, _getOwnPropertySymbols.default)(s); i < p.length; i++) {
37
+ if ((0, _indexOf.default)(e).call(e, p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
38
+ }
39
+ return t;
40
+ };
41
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
42
+
43
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
44
+
45
+
46
+ class CarouselIndicator extends _react.default.PureComponent {
47
+ constructor() {
48
+ super(...arguments);
49
+
50
+ this.onIndicatorChange = activeIndex => {
51
+ this.props.onIndicatorChange(activeIndex);
52
+ };
53
+
54
+ this.handleIndicatorClick = activeIndex => {
55
+ const {
56
+ trigger
57
+ } = this.props;
58
+
59
+ if (trigger === 'click') {
60
+ this.onIndicatorChange(activeIndex);
61
+ }
62
+ };
63
+
64
+ this.handleIndicatorHover = activeIndex => {
65
+ const {
66
+ trigger
67
+ } = this.props;
68
+
69
+ if (trigger === 'hover') {
70
+ this.onIndicatorChange(activeIndex);
71
+ }
72
+ };
73
+ }
74
+
75
+ renderIndicatorContent() {
76
+ const {
77
+ total,
78
+ theme,
79
+ size,
80
+ activeIndex
81
+ } = this.props;
82
+ const indicatorContent = [];
83
+
84
+ for (let i = 0; i < total; i++) {
85
+ var _context, _context2;
86
+
87
+ indicatorContent.push( /*#__PURE__*/_react.default.createElement("span", {
88
+ // role='none'
89
+ key: i,
90
+ "data-index": i,
91
+ className: (0, _classnames.default)(["".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-item")], {
92
+ ["".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-item-active")]: i === activeIndex,
93
+ [(0, _concat.default)(_context = "".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-item-")).call(_context, theme)]: theme,
94
+ [(0, _concat.default)(_context2 = "".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-item-")).call(_context2, size)]: size
95
+ }),
96
+ onClick: () => this.handleIndicatorClick(i),
97
+ onMouseEnter: () => this.handleIndicatorHover(i)
98
+ }));
99
+ }
100
+
101
+ return indicatorContent;
102
+ }
103
+
104
+ render() {
105
+ var _context3, _context4;
106
+
107
+ const _a = this.props,
108
+ {
109
+ type,
110
+ size,
111
+ theme,
112
+ style,
113
+ className,
114
+ position
115
+ } = _a,
116
+ restProps = __rest(_a, ["type", "size", "theme", "style", "className", "position"]);
117
+
118
+ const classNames = (0, _classnames.default)(className, {
119
+ [_constants.cssClasses.CAROUSEL_INDICATOR]: true,
120
+ [(0, _concat.default)(_context3 = "".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-")).call(_context3, type)]: type,
121
+ [(0, _concat.default)(_context4 = "".concat(_constants.cssClasses.CAROUSEL_INDICATOR, "-")).call(_context4, position)]: position
122
+ });
123
+ const indicatorContent = this.renderIndicatorContent();
124
+ return /*#__PURE__*/_react.default.createElement("div", (0, _assign.default)({
125
+ className: classNames,
126
+ style: style
127
+ }, (0, _getDataAttr.default)(restProps)), indicatorContent);
128
+ }
129
+
130
+ }
131
+
132
+ CarouselIndicator.propTypes = {
133
+ activeKey: _propTypes.default.number,
134
+ className: _propTypes.default.string,
135
+ position: _propTypes.default.oneOf(_constants.strings.POSITION_MAP),
136
+ size: _propTypes.default.oneOf(_constants.strings.SIZE),
137
+ style: _propTypes.default.object,
138
+ theme: _propTypes.default.oneOf(_constants.strings.THEME_MAP),
139
+ total: _propTypes.default.number,
140
+ onIndicatorChange: _propTypes.default.func,
141
+ type: _propTypes.default.oneOf(_constants.strings.TYPE_MAP),
142
+ trigger: _propTypes.default.oneOf(_constants.strings.TRIGGER)
143
+ };
144
+ var _default = CarouselIndicator;
145
+ exports.default = _default;
@@ -0,0 +1,58 @@
1
+ import { ReactNode, ReactChild, ReactFragment, ReactPortal } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import BaseComponent from "../_base/baseComponent";
4
+ import { CarouselProps } from './interface';
5
+ import CarouselFoundation, { CarouselAdapter } from '@douyinfe/semi-foundation/lib/cjs/carousel/foundation';
6
+ import '@douyinfe/semi-foundation/lib/cjs/carousel/carousel.css';
7
+ export interface CarouselState {
8
+ activeIndex: number;
9
+ children: (ReactChild | ReactFragment | ReactPortal)[];
10
+ preIndex: number;
11
+ isReverse: boolean;
12
+ isInit: boolean;
13
+ }
14
+ declare class Carousel extends BaseComponent<CarouselProps, CarouselState> {
15
+ static propTypes: {
16
+ activeIndex: PropTypes.Requireable<number>;
17
+ animation: PropTypes.Requireable<"slide" | "fade">;
18
+ arrowProps: PropTypes.Requireable<object>;
19
+ autoPlay: PropTypes.Requireable<boolean | object>;
20
+ className: PropTypes.Requireable<string>;
21
+ defaultActiveIndex: PropTypes.Requireable<number>;
22
+ indicatorPosition: PropTypes.Requireable<"left" | "right" | "center">;
23
+ indicatorSize: PropTypes.Requireable<"small" | "medium">;
24
+ indicatorType: PropTypes.Requireable<"line" | "dot" | "columnar">;
25
+ theme: PropTypes.Requireable<"primary" | "dark" | "light">;
26
+ onChange: PropTypes.Requireable<(...args: any[]) => any>;
27
+ arrowType: PropTypes.Requireable<"hover" | "always">;
28
+ showArrow: PropTypes.Requireable<boolean>;
29
+ showIndicator: PropTypes.Requireable<boolean>;
30
+ slideDirection: PropTypes.Requireable<"left" | "right">;
31
+ speed: PropTypes.Requireable<number>;
32
+ style: PropTypes.Requireable<object>;
33
+ trigger: PropTypes.Requireable<"hover" | "click">;
34
+ };
35
+ static defaultProps: CarouselProps;
36
+ foundation: CarouselFoundation;
37
+ constructor(props: CarouselProps);
38
+ get adapter(): CarouselAdapter<CarouselProps, CarouselState>;
39
+ static getDerivedStateFromProps(props: CarouselProps, state: CarouselState): Partial<CarouselState>;
40
+ componentDidMount(): void;
41
+ componentWillUnmount(): void;
42
+ play: () => void;
43
+ stop: () => void;
44
+ goTo: (targetIndex: number) => void;
45
+ prev: () => void;
46
+ next: () => void;
47
+ handleAutoPlay: () => void;
48
+ handleMouseEnter: () => void;
49
+ handleMouseLeave: () => void;
50
+ onIndicatorChange: (activeIndex: number) => void;
51
+ getChildren: () => (ReactChild | ReactFragment | ReactPortal)[];
52
+ getValidIndex: (activeIndex: number) => number;
53
+ renderChildren: () => JSX.Element;
54
+ renderIndicator: () => JSX.Element;
55
+ renderArrow: () => JSX.Element;
56
+ render(): ReactNode;
57
+ }
58
+ export default Carousel;