mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 07:26:59 +00:00
More perf changes
This commit is contained in:
parent
7ef0e2273e
commit
dfbca746b2
@ -12,36 +12,6 @@
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.control {
|
|
||||||
@apply bg-violet absolute bottom-10 right-10 flex flex-row
|
|
||||||
border-accent-0 border text-accent-0 z-30 shadow-xl select-none;
|
|
||||||
height: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftControl,
|
|
||||||
.rightControl {
|
|
||||||
@apply px-9 cursor-pointer;
|
|
||||||
transition: background-color 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftControl:hover,
|
|
||||||
.rightControl:hover {
|
|
||||||
background-color: var(--violet-dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftControl:focus,
|
|
||||||
.rightControl:focus {
|
|
||||||
@apply outline-none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightControl {
|
|
||||||
@apply border-l border-accent-0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftControl {
|
|
||||||
margin-right: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.thumb {
|
.thumb {
|
||||||
@apply transition-transform transition-colors
|
@apply transition-transform transition-colors
|
||||||
ease-linear duration-75 overflow-hidden inline-block
|
ease-linear duration-75 overflow-hidden inline-block
|
||||||
|
@ -10,7 +10,7 @@ import React, {
|
|||||||
import cn from 'classnames'
|
import cn from 'classnames'
|
||||||
import { a } from '@react-spring/web'
|
import { a } from '@react-spring/web'
|
||||||
import s from './ProductSlider.module.css'
|
import s from './ProductSlider.module.css'
|
||||||
import { ArrowLeft, ArrowRight } from '@components/icons'
|
import ProductSliderControl from '../ProductSliderControl'
|
||||||
|
|
||||||
const ProductSlider: FC = ({ children }) => {
|
const ProductSlider: FC = ({ children }) => {
|
||||||
const [currentSlide, setCurrentSlide] = useState(0)
|
const [currentSlide, setCurrentSlide] = useState(0)
|
||||||
@ -73,30 +73,16 @@ const ProductSlider: FC = ({ children }) => {
|
|||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
const onPrev = React.useCallback(() => slider.prev(), [slider])
|
||||||
|
const onNext = React.useCallback(() => slider.next(), [slider])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={s.root} ref={sliderContainerRef}>
|
<div className={s.root} ref={sliderContainerRef}>
|
||||||
<div
|
<div
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(s.slider, { [s.show]: isMounted }, 'keen-slider')}
|
className={cn(s.slider, { [s.show]: isMounted }, 'keen-slider')}
|
||||||
>
|
>
|
||||||
{slider && (
|
{slider && <ProductSliderControl onPrev={onPrev} onNext={onNext} />}
|
||||||
<div className={s.control}>
|
|
||||||
<button
|
|
||||||
className={cn(s.leftControl)}
|
|
||||||
onClick={slider.prev}
|
|
||||||
aria-label="Previous Product Image"
|
|
||||||
>
|
|
||||||
<ArrowLeft />
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className={cn(s.rightControl)}
|
|
||||||
onClick={slider.next}
|
|
||||||
aria-label="Next Product Image"
|
|
||||||
>
|
|
||||||
<ArrowRight />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{Children.map(children, (child) => {
|
{Children.map(children, (child) => {
|
||||||
// Add the keen-slider__slide className to children
|
// Add the keen-slider__slide className to children
|
||||||
if (isValidElement(child)) {
|
if (isValidElement(child)) {
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
.control {
|
||||||
|
@apply bg-violet absolute bottom-10 right-10 flex flex-row
|
||||||
|
border-accent-0 border text-accent-0 z-30 shadow-xl select-none;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftControl,
|
||||||
|
.rightControl {
|
||||||
|
@apply px-9 cursor-pointer;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftControl:hover,
|
||||||
|
.rightControl:hover {
|
||||||
|
background-color: var(--violet-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftControl:focus,
|
||||||
|
.rightControl:focus {
|
||||||
|
@apply outline-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rightControl {
|
||||||
|
@apply border-l border-accent-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftControl {
|
||||||
|
margin-right: -1px;
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import cn from 'classnames'
|
||||||
|
import React from 'react'
|
||||||
|
import s from './ProductSliderControl.module.css'
|
||||||
|
import { ArrowLeft, ArrowRight } from '@components/icons'
|
||||||
|
|
||||||
|
interface ProductSliderControl {
|
||||||
|
onPrev: React.MouseEventHandler<HTMLButtonElement>
|
||||||
|
onNext: React.MouseEventHandler<HTMLButtonElement>
|
||||||
|
}
|
||||||
|
|
||||||
|
const ProductSliderControl: React.FC<ProductSliderControl> = React.memo(
|
||||||
|
({ onPrev, onNext }) => (
|
||||||
|
<div className={s.control}>
|
||||||
|
<button
|
||||||
|
className={cn(s.leftControl)}
|
||||||
|
onClick={onPrev}
|
||||||
|
aria-label="Previous Product Image"
|
||||||
|
>
|
||||||
|
<ArrowLeft />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={cn(s.rightControl)}
|
||||||
|
onClick={onNext}
|
||||||
|
aria-label="Next Product Image"
|
||||||
|
>
|
||||||
|
<ArrowRight />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
)
|
||||||
|
export default ProductSliderControl
|
1
components/product/ProductSliderControl/index.ts
Normal file
1
components/product/ProductSliderControl/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default } from './ProductSliderControl'
|
Loading…
x
Reference in New Issue
Block a user