react-multi-carousel
Advanced tools
Comparing version 1.3.8 to 1.3.9
@@ -5,5 +5,5 @@ # Contributing | ||
If you are interested in contributing, and you are making a feature/fixing a bug that's related or not related to the `Infinite mode`, its important for you to know which files/codes are for infinite mode and which files/codes are not for the `Infinite mode`, so that you don't get confused. | ||
If you are interested in contributing. | ||
Here are a list of files/functions that are for the infinite mode only, if you are making a feature/fixing a bug that's not related to the `Infinite mode` you can safely ignore them. | ||
Here are a list of files/functions that are for the infinite mode only. | ||
@@ -10,0 +10,0 @@ - throttle |
import * as React from 'react'; | ||
import { stateCallBack } from './types'; | ||
interface LeftArrowProps { | ||
customLeftArrow?: React.ReactElement<any> | null; | ||
getState: () => any; | ||
getState: () => stateCallBack; | ||
previous: () => void; | ||
@@ -9,3 +10,3 @@ } | ||
customRightArrow?: React.ReactElement<any> | null; | ||
getState: () => any; | ||
getState: () => stateCallBack; | ||
next: () => void; | ||
@@ -12,0 +13,0 @@ } |
import * as React from "react"; | ||
import { CarouselInternalState, CarouselProps } from "./types"; | ||
declare class Carousel extends React.Component<CarouselProps, CarouselInternalState> { | ||
static defaultProps: any; | ||
static defaultProps: { | ||
slidesToSlide: number; | ||
infinite: boolean; | ||
draggable: boolean; | ||
swipeable: boolean; | ||
arrows: boolean; | ||
containerClass: string; | ||
sliderClass: string; | ||
itemClass: string; | ||
keyBoardControl: boolean; | ||
autoPlaySpeed: number; | ||
showDots: boolean; | ||
minimumTouchDrag: number; | ||
dotListClass: string; | ||
focusOnSelect: boolean; | ||
centerMode: boolean; | ||
}; | ||
private readonly containerRef; | ||
@@ -22,3 +38,4 @@ onMove: boolean; | ||
componentDidUpdate({ keyBoardControl, autoPlay }: CarouselProps, { containerWidth, domLoaded, isSliding }: CarouselInternalState): void; | ||
correctClonesPosition({ domLoaded, isSliding }: { | ||
correctClonesPosition({ domLoaded, // this domLoaded comes from previous state, only use to tell if we are on client-side or server-side because this functin relies the dom. | ||
isSliding }: { | ||
domLoaded?: boolean; | ||
@@ -25,0 +42,0 @@ isSliding?: boolean; |
@@ -51,3 +51,2 @@ "use strict"; | ||
}; | ||
var infinite = props.infinite, transitionDuration = props.transitionDuration; | ||
_this.onResize = _this.onResize.bind(_this); | ||
@@ -92,2 +91,6 @@ _this.handleDown = _this.handleDown.bind(_this); | ||
var _this = this; | ||
// if forResizing is true, means we are on client-side. | ||
// if forResizing is false, means we are on server-side. | ||
// because the first time we set the clones, we change the position of all carousel items when entering client-side from server-side. | ||
// but still, we want to maintain the same position as it was on the server-side which is translateX(0) by getting the couter part of the original first slide. | ||
this.isAnimationAllowed = false; | ||
@@ -116,3 +119,3 @@ var childrenArr = React.Children.toArray(this.props.children); | ||
}; | ||
// this is for resizing. | ||
// this is for resizing only or the first time when we entered client-side from server-side. | ||
Carousel.prototype.setContainerAndItemWidth = function (slidesToShow, shouldCorrectItemPosition) { | ||
@@ -177,3 +180,3 @@ var _this = this; | ||
this.containerRef.current.offsetWidth !== containerWidth) { | ||
// this is for handing resizing. | ||
// this is for handing resizing only. | ||
setTimeout(function () { | ||
@@ -194,3 +197,3 @@ _this.setItemsToShow(true); | ||
if (this.props.infinite) { | ||
// this is to quicly cancel the animation and move the items position to create the infinite effects. | ||
// this is to quickly cancel the animation and move the items position to create the infinite effects. | ||
this.correctClonesPosition({ domLoaded: domLoaded, isSliding: isSliding }); | ||
@@ -201,3 +204,4 @@ } | ||
var _this = this; | ||
var domLoaded = _a.domLoaded, isSliding = _a.isSliding; | ||
var domLoaded = _a.domLoaded, // this domLoaded comes from previous state, only use to tell if we are on client-side or server-side because this functin relies the dom. | ||
isSliding = _a.isSliding; | ||
var childrenArr = React.Children.toArray(this.props.children); | ||
@@ -225,59 +229,30 @@ var _b = utils_1.whenEnteredClones(this.state, childrenArr, this.props), hasEnterClonedAfter = _b.hasEnterClonedAfter, hasEnterClonedBefore = _b.hasEnterClonedBefore, nextSlide = _b.nextSlide, nextPosition = _b.nextPosition; | ||
if (slidesHavePassed === void 0) { slidesHavePassed = 0; } | ||
var slidesToShow = this.state.slidesToShow; | ||
var _a = this.props, slidesToSlide = _a.slidesToSlide, infinite = _a.infinite, afterChange = _a.afterChange, beforeChange = _a.beforeChange; | ||
var nextMaximumSlides = this.state.currentSlide + | ||
1 + | ||
slidesHavePassed + | ||
slidesToShow + | ||
(slidesHavePassed > 0 ? 0 : slidesToSlide); | ||
var nextSlides = this.state.currentSlide + | ||
slidesHavePassed + | ||
(slidesHavePassed > 0 ? 0 : slidesToSlide); | ||
var nextPosition = -(this.state.itemWidth * nextSlides); | ||
var _a = this.props, afterChange = _a.afterChange, beforeChange = _a.beforeChange; | ||
/* | ||
two cases: | ||
1. We are not over-sliding. | ||
2. We are sliding over to what we have, that means nextslides > this.props.children.length. (does not apply to the inifnite mode) | ||
*/ | ||
var _b = utils_1.populateNextSlides(this.state, this.props, slidesHavePassed), nextSlides = _b.nextSlides, nextPosition = _b.nextPosition; | ||
var previousSlide = this.state.currentSlide; | ||
if (nextMaximumSlides <= this.state.totalItems) { | ||
// It means if we have next slides go back to on the right-hand side. | ||
if (typeof beforeChange === "function") { | ||
beforeChange(nextSlides, this.getState()); | ||
} | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: nextPosition, | ||
currentSlide: nextSlides | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
}); | ||
if (nextSlides === undefined || nextPosition === undefined) { | ||
// they can be 0. | ||
return; | ||
} | ||
else if (nextMaximumSlides > this.state.totalItems && | ||
this.state.currentSlide !== this.state.totalItems - slidesToShow) { | ||
// This is to prevent oversliding | ||
// This is not for inifinite mode as for inifinite mode is never over-sliding. | ||
var maxSlides = this.state.totalItems - slidesToShow; | ||
var maxPosition = -(this.state.itemWidth * maxSlides); | ||
if (typeof beforeChange === "function") { | ||
beforeChange(maxSlides, this.getState()); | ||
if (typeof beforeChange === "function") { | ||
beforeChange(nextSlides, this.getState()); | ||
} | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: nextPosition, | ||
currentSlide: nextSlides | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: maxPosition, | ||
currentSlide: maxSlides | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
}); | ||
} | ||
else { | ||
return; | ||
} | ||
}); | ||
}; | ||
@@ -287,52 +262,25 @@ Carousel.prototype.previous = function (slidesHavePassed) { | ||
if (slidesHavePassed === void 0) { slidesHavePassed = 0; } | ||
var slidesToShow = this.state.slidesToShow; | ||
var _a = this.props, slidesToSlide = _a.slidesToSlide, infinite = _a.infinite, afterChange = _a.afterChange, beforeChange = _a.beforeChange; | ||
var nextSlides = this.state.currentSlide - | ||
slidesHavePassed - | ||
(slidesHavePassed > 0 ? 0 : slidesToSlide); | ||
var nextPosition = -(this.state.itemWidth * nextSlides); | ||
var _a = this.props, afterChange = _a.afterChange, beforeChange = _a.beforeChange; | ||
var _b = utils_1.populatePreviousSlides(this.state, this.props, slidesHavePassed), nextSlides = _b.nextSlides, nextPosition = _b.nextPosition; | ||
if (nextSlides === undefined || nextPosition === undefined) { | ||
// they can be 0, which goes back to the first slide. | ||
return; | ||
} | ||
var previousSlide = this.state.currentSlide; | ||
if (nextSlides >= 0) { | ||
// It means if we have next slides go back to on the left-hand side. | ||
if (typeof beforeChange === "function") { | ||
beforeChange(nextSlides, this.getState()); | ||
} | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: nextPosition, | ||
currentSlide: nextSlides | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
}); | ||
if (typeof beforeChange === "function") { | ||
beforeChange(nextSlides, this.getState()); | ||
} | ||
else if (nextSlides < 0 && this.state.currentSlide !== 0) { | ||
// prevent oversliding. | ||
// it means the user has almost scrolling over to what we have. | ||
// this is not for infinite mode as infinite mode always has items to go back to. | ||
if (typeof beforeChange === "function") { | ||
beforeChange(0, this.getState()); | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: nextPosition, | ||
currentSlide: nextSlides | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
this.isAnimationAllowed = true; | ||
this.setState({ | ||
isSliding: true, | ||
transform: 0, | ||
currentSlide: 0 | ||
}, function () { | ||
_this.setState({ isSliding: false }); | ||
if (typeof afterChange === "function") { | ||
setTimeout(function () { | ||
afterChange(previousSlide, _this.getState()); | ||
}, _this.props.transitionDuration || defaultTransitionDuration); | ||
} | ||
}); | ||
} | ||
else { | ||
return; | ||
} | ||
}); | ||
}; | ||
@@ -378,28 +326,10 @@ Carousel.prototype.componentWillUnmount = function () { | ||
if (this.onMove) { | ||
// making sure we have items to slide back to, prevent oversliding. | ||
var slidesHavePassedRight = Math.round((this.initialPosition - this.lastPosition) / this.state.itemWidth); | ||
// making sure we have items to slide back to, prevent oversliding. | ||
var slidesHavePassedLeft = Math.round((this.lastPosition - this.initialPosition) / this.state.itemWidth); | ||
if (this.initialPosition > clientX && | ||
slidesHavePassedRight <= this.state.slidesToShow) { | ||
this.direction = "right"; | ||
var translateXLimit = Math.abs(-(this.state.itemWidth * | ||
(this.state.totalItems - this.state.slidesToShow))); | ||
var nextTranslate = this.state.transform - (this.lastPosition - clientX); | ||
var isLastSlide = this.state.currentSlide === | ||
this.state.totalItems - this.state.slidesToShow; | ||
if (Math.abs(nextTranslate) <= translateXLimit || | ||
(isLastSlide && this.props.infinite)) { | ||
this.setState({ transform: nextTranslate }); | ||
var _a = utils_1.populateSlidesOnMouseTouchMove(this.state, this.props, this.initialPosition, this.lastPosition, clientX), direction = _a.direction, nextPosition = _a.nextPosition, canContinue = _a.canContinue; | ||
if (direction) { | ||
this.direction = direction; | ||
if (canContinue && nextPosition !== undefined) { | ||
// nextPosition can be 0; | ||
this.setState({ transform: nextPosition }); | ||
} | ||
} | ||
if (clientX > this.initialPosition && | ||
slidesHavePassedLeft <= this.state.slidesToShow) { | ||
this.direction = "left"; | ||
var nextTranslate = this.state.transform + (clientX - this.lastPosition); | ||
var isFirstSlide = this.state.currentSlide === 0; | ||
if (nextTranslate <= 0 || (isFirstSlide && this.props.infinite)) { | ||
this.setState({ transform: nextTranslate }); | ||
} | ||
} | ||
this.lastPosition = clientX; | ||
@@ -420,5 +350,6 @@ } | ||
if (this.direction === "right") { | ||
var slidesHavePassed = Math.round((this.initialPosition - this.lastPosition) / this.state.itemWidth); | ||
if (this.initialPosition - this.lastPosition >= | ||
this.props.minimumTouchDrag) { | ||
var canGoNext = this.initialPosition - this.lastPosition >= | ||
this.props.minimumTouchDrag; | ||
if (canGoNext) { | ||
var slidesHavePassed = Math.round((this.initialPosition - this.lastPosition) / this.state.itemWidth); | ||
this.next(slidesHavePassed); | ||
@@ -431,5 +362,6 @@ } | ||
if (this.direction === "left") { | ||
var slidesHavePassed = Math.round((this.lastPosition - this.initialPosition) / this.state.itemWidth); | ||
if (this.lastPosition - this.initialPosition > | ||
this.props.minimumTouchDrag) { | ||
var canGoNext = this.lastPosition - this.initialPosition > | ||
this.props.minimumTouchDrag; | ||
if (canGoNext) { | ||
var slidesHavePassed = Math.round((this.lastPosition - this.initialPosition) / this.state.itemWidth); | ||
this.previous(slidesHavePassed); | ||
@@ -436,0 +368,0 @@ } |
import * as React from "react"; | ||
import { CarouselInternalState, CarouselProps } from "./types"; | ||
import { CarouselInternalState, CarouselProps, stateCallBack } from "./types"; | ||
interface DotsTypes { | ||
@@ -7,5 +7,5 @@ props: CarouselProps; | ||
goToSlide: (index: number) => void; | ||
getState: () => any; | ||
getState: () => stateCallBack; | ||
} | ||
declare const Dots: ({ props, state, goToSlide, getState }: DotsTypes) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null; | ||
export default Dots; |
@@ -1,3 +0,3 @@ | ||
/// <reference types="react" /> | ||
interface responsiveType { | ||
import * as React from "react"; | ||
export interface responsiveType { | ||
[key: string]: { | ||
@@ -12,7 +12,7 @@ breakpoint: { | ||
} | ||
interface CarouselProps { | ||
export interface CarouselProps { | ||
responsive: responsiveType; | ||
deviceType?: string; | ||
ssr?: boolean; | ||
slidesToSlide: number; | ||
slidesToSlide?: number; | ||
draggable?: boolean; | ||
@@ -28,3 +28,3 @@ arrows?: boolean; | ||
infinite?: boolean; | ||
minimumTouchDrag: number; | ||
minimumTouchDrag?: number; | ||
afterChange?: (previousSlide: number, state: stateCallBack) => void; | ||
@@ -46,13 +46,23 @@ beforeChange?: (nextSlide: number, state: stateCallBack) => void; | ||
} | ||
interface buttonGroupCallBack { | ||
export interface stateCallBack extends CarouselInternalState { | ||
onMove: boolean; | ||
direction: string | undefined; | ||
} | ||
export interface buttonGroupProps { | ||
previous: () => void; | ||
next: () => void; | ||
goToSlide: (index: number) => void; | ||
state: stateCallBack; | ||
carouselState: stateCallBack; | ||
} | ||
interface stateCallBack extends CarouselInternalState { | ||
onMove: boolean; | ||
direction: string | undefined; | ||
export interface ArrowProps { | ||
onClick: () => void; | ||
carouselState: stateCallBack; | ||
} | ||
interface CarouselInternalState { | ||
export interface DotProps { | ||
index: number; | ||
active?: boolean; | ||
onClick: () => void; | ||
carouselState: stateCallBack; | ||
} | ||
export interface CarouselInternalState { | ||
itemWidth: number; | ||
@@ -69,2 +79,3 @@ containerWidth: number; | ||
} | ||
export { CarouselInternalState, CarouselProps, responsiveType, stateCallBack, buttonGroupCallBack }; | ||
export default class Carousel extends React.PureComponent<CarouselProps> { | ||
} |
"use strict"; | ||
var __extends = (this && this.__extends) || (function () { | ||
var extendStatics = function (d, b) { | ||
extendStatics = Object.setPrototypeOf || | ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; | ||
return extendStatics(d, b); | ||
}; | ||
return function (d, b) { | ||
extendStatics(d, b); | ||
function __() { this.constructor = d; } | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
})(); | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var React = require("react"); | ||
var Carousel = /** @class */ (function (_super) { | ||
__extends(Carousel, _super); | ||
function Carousel() { | ||
return _super !== null && _super.apply(this, arguments) || this; | ||
} | ||
return Carousel; | ||
}(React.PureComponent)); | ||
exports.default = Carousel; | ||
//# sourceMappingURL=types.js.map |
import { CarouselInternalState, CarouselProps } from "../types"; | ||
declare function getOriginalCounterPart(index: number, { slidesToShow, currentSlide, totalItems }: { | ||
declare function getOriginalCounterPart(index: number, { slidesToShow, currentSlide }: { | ||
slidesToShow: number; | ||
@@ -7,3 +7,3 @@ currentSlide: number; | ||
}, childrenArr: any[]): number; | ||
declare function getCloneCounterPart(index: number, { slidesToShow, totalItems, currentSlide }: { | ||
declare function getCloneCounterPart(index: number, { slidesToShow }: { | ||
slidesToShow: number; | ||
@@ -10,0 +10,0 @@ currentSlide: number; |
@@ -11,3 +11,3 @@ "use strict"; | ||
function getOriginalCounterPart(index, _a, childrenArr) { | ||
var slidesToShow = _a.slidesToShow, currentSlide = _a.currentSlide, totalItems = _a.totalItems; | ||
var slidesToShow = _a.slidesToShow, currentSlide = _a.currentSlide; | ||
// this function is only used for "infinite and showDots are true"; | ||
@@ -38,3 +38,3 @@ if (childrenArr.length > slidesToShow * 2) { | ||
function getCloneCounterPart(index, _a, childrenArr) { | ||
var slidesToShow = _a.slidesToShow, totalItems = _a.totalItems, currentSlide = _a.currentSlide; | ||
var slidesToShow = _a.slidesToShow; | ||
// this function is only used for "infinite and showDots are true"; | ||
@@ -41,0 +41,0 @@ if (childrenArr.length > slidesToShow * 2) { |
@@ -6,2 +6,5 @@ import { getOriginalCounterPart, getCloneCounterPart, getClones, whenEnteredClones } from "./clones"; | ||
import throwError from './throwError'; | ||
export { getOriginalCounterPart, getCloneCounterPart, getClones, getWidthFromDeviceType, whenEnteredClones, getItemClientSideWidth, getParitialVisibilityGutter, throttle, getInitialState, getIfSlideIsVisbile, getTransformForCenterMode, getTransformForPartialVsibile, throwError }; | ||
import { populateNextSlides } from './next'; | ||
import { populatePreviousSlides } from './previous'; | ||
import { populateSlidesOnMouseTouchMove } from './mouseOrTouchMove'; | ||
export { getOriginalCounterPart, getCloneCounterPart, getClones, getWidthFromDeviceType, whenEnteredClones, getItemClientSideWidth, getParitialVisibilityGutter, throttle, getInitialState, getIfSlideIsVisbile, getTransformForCenterMode, getTransformForPartialVsibile, throwError, populateNextSlides, populatePreviousSlides, populateSlidesOnMouseTouchMove }; |
@@ -21,2 +21,8 @@ "use strict"; | ||
exports.throwError = throwError_1.default; | ||
var next_1 = require("./next"); | ||
exports.populateNextSlides = next_1.populateNextSlides; | ||
var previous_1 = require("./previous"); | ||
exports.populatePreviousSlides = previous_1.populatePreviousSlides; | ||
var mouseOrTouchMove_1 = require("./mouseOrTouchMove"); | ||
exports.populateSlidesOnMouseTouchMove = mouseOrTouchMove_1.populateSlidesOnMouseTouchMove; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "react-multi-carousel", | ||
"version": "1.3.8", | ||
"version": "1.3.9", | ||
"description": "", | ||
"main": "index.js", | ||
"types": "/lib/index.d.ts", | ||
"types": "./lib/types.d.ts", | ||
"scripts": { | ||
@@ -69,3 +69,3 @@ "build": "rm -rf ./lib && tsc && npm run after-build", | ||
"@types/jest": "^24.0.9", | ||
"@types/react": "^16.8.6", | ||
"@types/react": "^16.8.13", | ||
"@types/react-dom": "^16.8.2", | ||
@@ -88,6 +88,6 @@ "awesome-typescript-loader": "^5.2.1", | ||
"storybook-addon-jsx": "^6.0.0", | ||
"ts-jest": "^24.0.0", | ||
"typescript": "^3.3.3333" | ||
"ts-jest": "^24.0.2", | ||
"typescript": "^3.4.3" | ||
}, | ||
"dependencies": {} | ||
} |
@@ -38,3 +38,3 @@ # react-multi-carousel | ||
Demo and documentation can be found at [here](https://w3js.com/react-multi-carousel/). | ||
Documentation is [here](https://w3js.com/react-multi-carousel/). | ||
@@ -76,4 +76,8 @@ Demo for the SSR <https://react-multi-carousel.now.sh/> | ||
## Usage | ||
## Usage with TypeScript | ||
Please read https://github.com/YIZHUANG/react-multi-carousel/blob/master/TypeScriptUsage.md | ||
## Common Usage | ||
```js | ||
@@ -129,3 +133,3 @@ import Carousel from "react-multi-carousel"; | ||
[An Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=Custom%20arrow&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel). | ||
[An Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=Custom%20arrow&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel) | ||
@@ -150,3 +154,3 @@ [Code](https://github.com/YIZHUANG/react-multi-carousel/blob/master/stories/CustomArrows.js) | ||
[Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=With%20custom%20button%20group&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel). | ||
[Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=With%20custom%20button%20group&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel) | ||
@@ -176,3 +180,3 @@ [Code](https://github.com/YIZHUANG/react-multi-carousel/blob/master/stories/CustomArrows.js) | ||
Custom dots can also be a copy or an image of your carousel item. See example in this [One](https://react-multi-carousel.now.sh/) | ||
Custom dots can also be a copy or an image of your carousel item. See example in this [one](https://react-multi-carousel.now.sh/) | ||
@@ -183,3 +187,3 @@ The codes for this [example](https://github.com/YIZHUANG/react-multi-carousel/blob/master/examples/ssr/components/carousel-with-custom-dots.js) | ||
[An Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=custom%20dots&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel). | ||
[An Example](https://w3js.com/react-multi-carousel/?selectedKind=Carousel&selectedStory=custom%20dots&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel) | ||
@@ -186,0 +190,0 @@ [Code](https://github.com/YIZHUANG/react-multi-carousel/blob/master/stories/CustomDot.js) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
150576
57
1409
379