Two way scroll binding
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
.Controls {
|
.Controls {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
background: var(--clr-bg-secondary);
|
background: var(--clr-bg-secondary);
|
||||||
left: 16px;
|
left: var(--gap-sm);
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
padding: 18px;
|
padding: var(--gap-sm);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
width: 64px;
|
width: 64px;
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
height: calc(64px * 3);
|
height: calc(64px * 3);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-bottom: 32px;
|
margin-bottom: var(--gap-md);
|
||||||
}
|
}
|
||||||
|
|
||||||
.controlsWrapper, .gooWrapper {
|
.controlsWrapper, .gooWrapper {
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
padding: 18px;
|
padding: var(--gap-sm);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import homeIcon from '../assets/icons/home.svg'
|
|||||||
import gridIcon from '../assets/icons/grid.svg'
|
import gridIcon from '../assets/icons/grid.svg'
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const [store] = useStore() as Store;
|
const [store, {setVisibleChapter}] = useStore() as Store;
|
||||||
const [selected, setSelected] = createSignal('home');
|
const [selected, setSelected] = createSignal('home');
|
||||||
const [blobby, setBlobby] = createSignal(['home']);
|
const [blobby, setBlobby] = createSignal(['home']);
|
||||||
const chapters = [
|
const chapters = [
|
||||||
@@ -20,6 +20,7 @@ export default () => {
|
|||||||
const selectChapter = (chapterName: string) => {
|
const selectChapter = (chapterName: string) => {
|
||||||
if (chapterName !== selected()) {
|
if (chapterName !== selected()) {
|
||||||
setSelected(chapterName)
|
setSelected(chapterName)
|
||||||
|
setVisibleChapter(chapterName)
|
||||||
setBlobby(b => [chapterName, ...b])
|
setBlobby(b => [chapterName, ...b])
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setBlobby(b => [chapterName])
|
setBlobby(b => [chapterName])
|
||||||
|
|||||||
@@ -3,12 +3,13 @@ import { createViewportObserver } from '@solid-primitives/intersection-observer'
|
|||||||
|
|
||||||
import { useStore } from '../store/index';
|
import { useStore } from '../store/index';
|
||||||
import type { Store } from '../store/index';
|
import type { Store } from '../store/index';
|
||||||
|
import { scrollHereWhenSelected } from "../utlis/scroll";
|
||||||
import styles from './Hero.module.css';
|
import styles from './Hero.module.css';
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const [t] = useI18n();
|
const [t] = useI18n();
|
||||||
const [observer] = createViewportObserver({threshold: 0.9});
|
const [observer] = createViewportObserver({threshold: 0.9});
|
||||||
const [, { setVisibleChapter }] = useStore() as Store;
|
const [store, { setVisibleChapter }] = useStore() as Store;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header
|
<header
|
||||||
@@ -17,6 +18,7 @@ export default () => {
|
|||||||
setVisibleChapter('home');
|
setVisibleChapter('home');
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
ref={(element) => scrollHereWhenSelected(element, store, 'home')}
|
||||||
class={styles.Hero}
|
class={styles.Hero}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
.Projects {
|
.Projects {
|
||||||
height: 101vh;
|
padding: var(--gap-md);
|
||||||
padding: 32px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ import { createViewportObserver } from '@solid-primitives/intersection-observer'
|
|||||||
|
|
||||||
import { useStore } from '../../store/index';
|
import { useStore } from '../../store/index';
|
||||||
import type { Store } from '../../store/index';
|
import type { Store } from '../../store/index';
|
||||||
|
import { scrollHereWhenSelected } from "../../utlis/scroll";
|
||||||
import styles from './Projects.module.css';
|
import styles from './Projects.module.css';
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const [, { setVisibleChapter }] = useStore() as Store;
|
const [store, { setVisibleChapter }] = useStore() as Store;
|
||||||
const [observer] = createViewportObserver({threshold: 0.9});
|
const [observer] = createViewportObserver({threshold: 0.9});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -15,6 +16,7 @@ export default () => {
|
|||||||
setVisibleChapter('projects');
|
setVisibleChapter('projects');
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
ref={(element) => scrollHereWhenSelected(element, store, 'projects')}
|
||||||
class={styles.Projects}
|
class={styles.Projects}
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
:root {
|
:root {
|
||||||
--clr-bg: rgb(7, 6, 9);
|
--clr-bg: rgb(7, 6, 9);
|
||||||
--clr-bg-secondary: hsl(260, 20%, 16%);
|
--clr-bg-secondary: hsl(260, 20%, 16%);
|
||||||
|
--gap-sm: 18px;
|
||||||
|
--gap-md: 36px;
|
||||||
|
--gap-lg: 72px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
|||||||
10
src/utlis/scroll.ts
Normal file
10
src/utlis/scroll.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { createEffect } from "solid-js";
|
||||||
|
|
||||||
|
export const scrollHereWhenSelected = (element: HTMLElement, store, chapter) => {
|
||||||
|
return createEffect((prev) => {
|
||||||
|
if (prev !== store.visibleChapter() && store.visibleChapter() === chapter) {
|
||||||
|
element.scrollIntoView({behavior: "smooth"})
|
||||||
|
}
|
||||||
|
return store.visibleChapter();
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user