improvements to `SlidesList`:

* better selection highlighting
* now auto scrolling

a bug in chrome seems to prevent us from enable smooth scrolling
pull/2/head
Michael Ochmann 3 years ago
parent f53f60667f
commit 280a4f5a50
  1. 6
      src/ui/src/assets/css/_slidesList.scss
  2. 8
      src/ui/src/components/Slide.js
  3. 14
      src/ui/src/components/SlidesList.js

@ -8,6 +8,7 @@
aspect-ratio: 1.333; aspect-ratio: 1.333;
overflow: hidden; overflow: hidden;
margin-bottom: 0.1rem; margin-bottom: 0.1rem;
z-index: 100;
} }
.slide { .slide {
@ -18,7 +19,10 @@
-webkit-transform-origin: top left; -webkit-transform-origin: top left;
&.active { &.active {
border: solid 3px color(hightlight); box-shadow:
5px 5px 0px color(hightlight) inset,
-5px -5px 0px color(hightlight) inset;
} }
} }
} }

@ -1,15 +1,15 @@
import React from "react"; import React, {forwardRef} from "react";
import SlideItem from "./SlideItem"; import SlideItem from "./SlideItem";
const Slide = ({data, className, ...props}) => { const Slide = forwardRef(({data, className, ...props}, ref) => {
return ( return (
<article className={`slide${data?.title ? " title" : ""} ${className}`} {...props}> <article className={`slide${data?.title ? " title" : ""} ${className}`} {...props} ref={ref}>
{data?.content.map((item, index) => {data?.content.map((item, index) =>
<SlideItem item={item} key={index} /> <SlideItem item={item} key={index} />
)} )}
</article> </article>
); );
}; });
export default Slide; export default Slide;

@ -6,7 +6,9 @@ import SlideContext from "../shared/SlideContext";
const SlidesList = ({deck}) => { const SlidesList = ({deck}) => {
const {slide, setSlide} = useContext(SlideContext); const {slide, setSlide} = useContext(SlideContext);
const container = useRef(); const container = useRef();
const current = useRef();
const [scale, setScale] = useState(1); const [scale, setScale] = useState(1);
const [first, setFirst] = useState(true);
const sizeChange = useCallback(() => { const sizeChange = useCallback(() => {
if (!container.current) if (!container.current)
@ -22,6 +24,16 @@ const SlidesList = ({deck}) => {
setScale(targetWidth / slideWidth); setScale(targetWidth / slideWidth);
}, [container]); }, [container]);
useEffect(() => {
if (first) {
setFirst(false);
return;
}
if (!current.current)
return;
current.current.scrollIntoView({inline : "nearest"});
}, [current, slide]);
useEffect(() => { useEffect(() => {
const resizeListener = () => { const resizeListener = () => {
sizeChange(); sizeChange();
@ -38,7 +50,7 @@ const SlidesList = ({deck}) => {
<aside className="slides-list" ref={container}> <aside className="slides-list" ref={container}>
{deck.map((currentSlide, index) => ( {deck.map((currentSlide, index) => (
<div className="slide-wrap" key={index}> <div className="slide-wrap" key={index}>
<Slide data={currentSlide} className={index === slide ? "active" : ""} style={{transform : `scale(${scale}) translateX(0)`}} onClick={() => setSlide(index)} /> <Slide data={currentSlide} className={index === slide ? "active" : ""} style={{transform : `scale(${scale}) translateX(0)`}} onClick={() => setSlide(index)} ref={index === slide ? current : null} />
</div> </div>
))} ))}
</aside> </aside>

Loading…
Cancel
Save