Compare commits

...

2 Commits

Author SHA1 Message Date
49ae4b0dec Two way scroll binding 2022-05-20 02:19:23 +03:00
158d0efd40 Fix type errors 2022-05-20 00:50:34 +03:00
8 changed files with 32 additions and 13 deletions

View File

@@ -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;
} }

View File

@@ -1,14 +1,14 @@
import { For, createSignal } from 'solid-js'; import { For, createSignal, createEffect } from 'solid-js';
import { createEffect } from 'solid-js';
import { useStore } from '../store/index'; import { useStore } from '../store/index';
import type { Store } from '../store/index';
import styles from './Controls.module.css'; import styles from './Controls.module.css';
import LanguageSelector from './LanguageSelector'; import LanguageSelector from './LanguageSelector';
import homeIcon from '../assets/icons/home.svg' 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(); 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])

View File

@@ -2,12 +2,14 @@ import { useI18n } from "@solid-primitives/i18n";
import { createViewportObserver } from '@solid-primitives/intersection-observer'; import { createViewportObserver } from '@solid-primitives/intersection-observer';
import { useStore } from '../store/index'; import { useStore } 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(); const [store, { setVisibleChapter }] = useStore() as Store;
return ( return (
<header <header
@@ -16,6 +18,7 @@ export default () => {
setVisibleChapter('home'); setVisibleChapter('home');
}} }}
} }
ref={(element) => scrollHereWhenSelected(element, store, 'home')}
class={styles.Hero} class={styles.Hero}
> >
<div> <div>

View File

@@ -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;

View File

@@ -1,10 +1,12 @@
import { createViewportObserver } from '@solid-primitives/intersection-observer'; import { createViewportObserver } from '@solid-primitives/intersection-observer';
import { useStore } from '../../store/index'; import { useStore } 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(); const [store, { setVisibleChapter }] = useStore() as Store;
const [observer] = createViewportObserver({threshold: 0.9}); const [observer] = createViewportObserver({threshold: 0.9});
return ( return (
@@ -14,6 +16,7 @@ export default () => {
setVisibleChapter('projects'); setVisibleChapter('projects');
}} }}
} }
ref={(element) => scrollHereWhenSelected(element, store, 'projects')}
class={styles.Projects} class={styles.Projects}
> >

View File

@@ -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 {

View File

@@ -1,14 +1,14 @@
import { createSignal, createContext, useContext } from "solid-js"; import { createSignal, createContext, useContext } from "solid-js";
import type { Accessor, Setter } from 'solid-js'; import type { Accessor, Setter } from 'solid-js';
type Store = [ export type Store = [
{ visibleChapter: Accessor<string> }, { visibleChapter: Accessor<string> },
{ setVisibleChapter: Setter<string> } { setVisibleChapter: Setter<string> }
] ]
const StoreContext = createContext<Store>(); const StoreContext = createContext<Store>();
export function StoreProvider(props) { export function StoreProvider(props: any) {
const [visibleChapter, setVisibleChapter] = createSignal('home'); const [visibleChapter, setVisibleChapter] = createSignal('home');
const store: Store = [ const store: Store = [
{ {

10
src/utlis/scroll.ts Normal file
View 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();
});
}