Skip to content

Commit

Permalink
Merge pull request #39 from kimcoder/feature/issue-36
Browse files Browse the repository at this point in the history
feat: add Props, navSize, navMargin
  • Loading branch information
kimcoder authored Apr 8, 2021
2 parents e67ed4d + 031688c commit 88efca2
Show file tree
Hide file tree
Showing 13 changed files with 119 additions and 31 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ If You want to see more detail source,<br>
| **style** | `String` | `Optional` | css object | |
| **slideDuration** | `Number` | `Optional` | css transition-duration property | `0.5` |
| **navStyle** | `Number` | `Optional` | Arrow Navgation Style,<br>1 or 2 | `1` |
| **navSize** | `Number` | `Optional` | Arrow Size | 50 |
| **navMargin** | `Number` | `Optional` | Arrow Margin | 30 |
| **showNavs** | `Boolean` | `Optional` | Toggle Arrow Navgation | `true` |
| **showBullets** | `Boolean` | `Optional` | Toggle Bullets | `true` |
| **useGPURender** | `Boolean` | `Optional` | Toggle GPU Render | `true` |
Expand Down
49 changes: 36 additions & 13 deletions example/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import Select from '@material-ui/core/Select';
import SimpleImageSlider from '../dist';
import Input from '@material-ui/core/Input';

const IMAGES = [
{ url: 'images/1.jpg' },
Expand All @@ -28,6 +29,8 @@ type SliderOptions = {
showNavs: boolean;
showBullets: boolean;
navStyle: 1 | 2;
navSize: number;
navMargin: number;
duration: number;
bgColor: string;
};
Expand All @@ -38,6 +41,8 @@ const App: React.FC = () => {
showNavs: true,
showBullets: true,
navStyle: 1,
navSize: 50,
navMargin: 30,
duration: 0.5,
bgColor: '#000'
});
Expand Down Expand Up @@ -70,23 +75,17 @@ const App: React.FC = () => {
(key: string, value: boolean | number | string) => () => {
console.log(`[App updateOptions] ${key} ${value}`);
switch (key) {
case 'useGPURender':
setSliderOptions({ ...sliderOptions, useGPURender: value as boolean });
break;
case 'showNavs':
setSliderOptions({ ...sliderOptions, showNavs: value as boolean });
break;
case 'showBullets':
setSliderOptions({ ...sliderOptions, showBullets: value as boolean });
break;
case 'navStyle':
setSliderOptions({ ...sliderOptions, navStyle: value as 1 | 2 });
break;
case 'useGPURender':
case 'showNavs':
case 'showBullets':
case 'duration':
setSliderOptions({ ...sliderOptions, duration: value as number });
break;
case 'bgColor':
setSliderOptions({ ...sliderOptions, bgColor: value as string });
case 'navSize':
case 'navMargin':
setSliderOptions({ ...sliderOptions, [key]: value });
break;
}
},
Expand Down Expand Up @@ -125,6 +124,8 @@ const App: React.FC = () => {
showNavs={sliderOptions.showNavs}
useGPURender={sliderOptions.useGPURender}
navStyle={sliderOptions.navStyle}
navSize={sliderOptions.navSize}
navMargin={sliderOptions.navMargin}
slideDuration={sliderOptions.duration}
onClick={onClick}
onClickNav={onClickNav}
Expand All @@ -151,7 +152,7 @@ const App: React.FC = () => {
</ListItem>
))}
<ListItem>
<FormControl component="fieldset">
<FormControl>
<InputLabel>NavStyle</InputLabel>
<Select value={sliderOptions.navStyle} onChange={onChangeSelect} inputProps={{ name: 'navStyle' }}>
<MenuItem value={1}>1</MenuItem>
Expand All @@ -170,6 +171,28 @@ const App: React.FC = () => {
</Select>
</FormControl>
</ListItem>
<ListItem>
<FormControl>
<InputLabel>Navigation Size</InputLabel>
<Input
value={sliderOptions.navSize}
type="number"
name="navSize"
onChange={(event) => updateOptions(event.target.name, event.target.value)()}
/>
</FormControl>
</ListItem>
<ListItem>
<FormControl>
<InputLabel>Navigation Margin</InputLabel>
<Input
value={sliderOptions.navMargin}
type="number"
name="navMargin"
onChange={(event) => updateOptions(event.target.name, event.target.value)()}
/>
</FormControl>
</ListItem>
</List>
</div>
);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-simple-image-slider",
"version": "2.0.4",
"version": "2.1.0",
"description": "simple image slider component for react",
"main": "dist/index.js",
"scripts": {
Expand Down
20 changes: 18 additions & 2 deletions src/ImageSlider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export type SimpleImageSliderProps = {
slideDuration?: number;
bgColor?: string;
useGPURender?: boolean;
navSize?: number;
navMargin?: number;
navStyle?: ImageSliderNavStyle;
onClick?: (idx: number, event: React.SyntheticEvent) => void;
onClickNav?: (toRight: boolean) => void;
Expand All @@ -32,6 +34,8 @@ const SimpleImageSlider: React.FC<SimpleImageSliderProps> = ({
slideDuration = 0.5,
bgColor = '#000',
useGPURender = true,
navSize = 50,
navMargin = 30,
navStyle = ImageSliderNavStyle.NORMAL,
onClick = undefined,
onClickNav = undefined,
Expand Down Expand Up @@ -125,10 +129,22 @@ const SimpleImageSlider: React.FC<SimpleImageSliderProps> = ({

{/* Render Navigation */}
{showNavs && images.length > 0 && slideIdx > 0 && (
<ImageSliderNavigation direction={ImageSliderNavDirection.LEFT} navStyle={navStyle} onClickNav={handleClickNav} />
<ImageSliderNavigation
direction={ImageSliderNavDirection.LEFT}
navStyle={navStyle}
navSize={navSize}
navMargin={navMargin}
onClickNav={handleClickNav}
/>
)}
{showNavs && images.length > 0 && slideIdx < images.length - 1 && (
<ImageSliderNavigation direction={ImageSliderNavDirection.RIGHT} navStyle={navStyle} onClickNav={handleClickNav} />
<ImageSliderNavigation
direction={ImageSliderNavDirection.RIGHT}
navStyle={navStyle}
navSize={navSize}
navMargin={navMargin}
onClickNav={handleClickNav}
/>
)}

{/* Render Bullets */}
Expand Down
22 changes: 7 additions & 15 deletions src/ImageSliderNavigation.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import React from 'react';
import styles from './ImageSliderStyle';
import ImageNavArrowLeft1 from './images/arrow-left-1.png';
import ImageNavArrowLeft2 from './images/arrow-left-2.png';
import ImageNavArrowRight1 from './images/arrow-right-1.png';
import ImageNavArrowRight2 from './images/arrow-right-2.png';
import ImageNavArrowBold from './images/arrow-bold.svg';
import ImageNavArrowNormal from './images/arrow-normal.svg';

export enum ImageSliderNavStyle {
NORMAL = 1,
Expand All @@ -17,27 +15,21 @@ export enum ImageSliderNavDirection {

type ImageSliderNavigationProps = {
navStyle: ImageSliderNavStyle;
navSize: number;
navMargin: number;
direction: ImageSliderNavDirection;
onClickNav: (direction: ImageSliderNavDirection) => (event: React.SyntheticEvent<HTMLButtonElement>) => void;
};

const altNavArrowLeft = 'slide to left';
const altNavArrowRight = 'slide to right';
const images: { [key: string]: string } = {
[`image-${ImageSliderNavDirection.LEFT}-${ImageSliderNavStyle.NORMAL}`]: ImageNavArrowLeft1,
[`image-${ImageSliderNavDirection.RIGHT}-${ImageSliderNavStyle.NORMAL}`]: ImageNavArrowRight1,
[`image-${ImageSliderNavDirection.LEFT}-${ImageSliderNavStyle.BOLD}`]: ImageNavArrowLeft2,
[`image-${ImageSliderNavDirection.RIGHT}-${ImageSliderNavStyle.BOLD}`]: ImageNavArrowRight2
};

const ImageSliderNavigation: React.FC<ImageSliderNavigationProps> = (props: ImageSliderNavigationProps) => {
return (
<button
type="button"
style={props.direction === ImageSliderNavDirection.LEFT ? styles.NavLeft : styles.NavRight}
onClick={props.onClickNav(props.direction)}>
<button type="button" style={styles.getNavStyle(props.direction, props.navSize, props.navMargin)} onClick={props.onClickNav(props.direction)}>
<img
src={images[`image-${props.direction}-${props.navStyle}`]}
src={props.navStyle === ImageSliderNavStyle.NORMAL ? ImageNavArrowNormal : ImageNavArrowBold}
style={{ width: '100%', ...(props.direction === ImageSliderNavDirection.RIGHT && { transform: 'rotate(180deg)' }) }}
alt={props.direction === ImageSliderNavDirection.LEFT ? altNavArrowLeft : altNavArrowRight}
/>
</button>
Expand Down
10 changes: 10 additions & 0 deletions src/ImageSliderStyle.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ImageSliderNavDirection } from './ImageSliderNavigation';

const basic = {
display: 'block',
margin: '0',
Expand Down Expand Up @@ -69,5 +71,13 @@ export default {
transition: `${duration}s`,
backgroundImage: `url(${url})`,
transform: isGpuRender ? `translate3d(${idx * 100}%, 0px, 0px)` : `translate(${idx * 100}%, 0px)`
} as React.CSSProperties),
getNavStyle: (direction: ImageSliderNavDirection, size: number, margin: number): React.CSSProperties =>
({
...basic,
...basicNav,
...(direction === ImageSliderNavDirection.LEFT ? { left: `${margin}px` } : { right: `${margin}px` }),
marginTop: `-${Math.floor(size / 2)}px`,
width: `${size}px`
} as React.CSSProperties)
};
5 changes: 5 additions & 0 deletions src/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ declare module '*.png' {
const value: string;
export = value;
}

declare module '*.svg' {
const value: string;
export = value;
}
20 changes: 20 additions & 0 deletions src/images/arrow-bold.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/images/arrow-left-1.png
Binary file not shown.
Binary file removed src/images/arrow-left-2.png
Binary file not shown.
20 changes: 20 additions & 0 deletions src/images/arrow-normal.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/images/arrow-right-1.png
Binary file not shown.
Binary file removed src/images/arrow-right-2.png
Binary file not shown.

0 comments on commit 88efca2

Please sign in to comment.