Compare commits

...

2 commits

Author SHA1 Message Date
8e23062fa9 Scroll Behaviour Changes using GSAP
- Currently broken on Chromium. Safari and Firefox work just fine.
2024-03-12 18:14:54 +01:00
da885bec57 Initial Project Refactoring and Cleanup 2024-03-12 16:26:21 +01:00
21 changed files with 203 additions and 200 deletions

View file

@ -31,6 +31,7 @@
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"gsap": "^3.12.5",
"md-block": "^0.0.1", "md-block": "^0.0.1",
"svelte-material-icons": "^3.0.5", "svelte-material-icons": "^3.0.5",
"svelte-transition": "^0.0.10" "svelte-transition": "^0.0.10"

View file

@ -1,30 +1,5 @@
<script lang="ts"> <script lang="ts">
import { goto } from '$app/navigation'; import { smoothScrollTo, handleKeydown } from '$lib/index';
function smoothScrollTo(elementId: string) {
const element = document.getElementById(elementId);
if (element) {
element.scrollIntoView({
behavior: 'smooth'
});
}
}
function redirectToHome() {
// goto('/');
smoothScrollTo('home');
}
function handleKeydown(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') {
redirectToHome();
}
}
function openWebsite(url: string) {
goto(url);
}
</script> </script>
<div id="about" class="section"> <div id="about" class="section">
@ -38,7 +13,7 @@
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
tabindex="0" tabindex="0"
on:click={redirectToHome} on:click={() => smoothScrollTo('home')}
on:keydown={handleKeydown} on:keydown={handleKeydown}
> >
<mask <mask
@ -79,5 +54,5 @@
</div> </div>
<style lang="scss"> <style lang="scss">
@import '../styles/about.scss'; @import '$styles/about.scss';
</style> </style>

View file

@ -1,32 +1,6 @@
<script lang='ts'> <script lang='ts'>
import { goto } from '$app/navigation';
import IconChevronDown from 'svelte-material-icons/ChevronDown.svelte'; import IconChevronDown from 'svelte-material-icons/ChevronDown.svelte';
import { smoothScrollTo, handleKeydown } from '$lib/index';
function smoothScrollTo(elementId: string) {
const element = document.getElementById(elementId);
if (element) {
element.scrollIntoView({
behavior: 'smooth'
});
}
}
function redirectToHome() {
// goto('/');
smoothScrollTo('home');
}
function handleKeydown(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') {
redirectToHome();
}
}
function openWebsite(url: string) {
goto(url);
}
</script> </script>
<div id="home" class="section"> <div id="home" class="section">
@ -80,6 +54,6 @@
</div> </div>
<style lang="scss"> <style lang="scss">
@import '../styles/index.scss'; @import '$styles/index.scss';
@import '../styles/home.scss'; @import '$styles/home.scss';
</style> </style>

View file

@ -1,15 +1,17 @@
<script lang="ts"> <script lang="ts">
import { goto } from '$app/navigation';
import Modal from './Modal.svelte';
import DashinitModal from './modals/dashinit.svelte';
import SangeFaultModal from './modals/sangefault.svelte';
import ExploreCraftModal from './modals/explorecraft.svelte';
import UtilityClientModal from './modals/utilityclient.svelte';
import SangeloSpaceModal from './modals/sangelospace.svelte';
import LunivityModal from './modals/lunivity.svelte';
import MoreProjectsModal from './modals/more.svelte';
// import type { SvelteComponent } from 'svelte';
import { smoothScrollTo, handleKeydown } from '$lib/index';
// Modal
import Modal from '$lib/components/Modal.svelte';
import DashinitModal from '$lib/modals/dashinit.svelte';
import SangeFaultModal from '$lib/modals/sangefault.svelte';
import ExploreCraftModal from '$lib/modals/explorecraft.svelte';
import UtilityClientModal from '$lib/modals/utilityclient.svelte';
import SangeloSpaceModal from '$lib/modals/sangelospace.svelte';
import LunivityModal from '$lib/modals/lunivity.svelte';
import MoreProjectsModal from '$lib/modals/more.svelte';
let showModal = false; let showModal = false;
let selectedModule: any = null; let selectedModule: any = null;
@ -22,27 +24,6 @@
showModal = false; showModal = false;
} }
function smoothScrollTo(elementId: string) {
const element = document.getElementById(elementId);
if (element) {
element.scrollIntoView({
behavior: 'smooth'
});
}
}
function redirectToHome() {
// goto('/');
smoothScrollTo('home');
}
function handleKeydown(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') {
redirectToHome();
}
}
</script> </script>
<div id="projects" class="section"> <div id="projects" class="section">
@ -56,7 +37,7 @@
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
tabindex="0" tabindex="0"
on:click={redirectToHome} on:click={() => smoothScrollTo('home')}
on:keydown={handleKeydown} on:keydown={handleKeydown}
> >
<mask <mask
@ -119,5 +100,5 @@
</div> </div>
<style lang="scss"> <style lang="scss">
@import '../styles/projects.scss'; @import '$styles/projects.scss';
</style> </style>

View file

@ -1,7 +1,8 @@
<script lang="ts"> <script lang="ts">
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { goto } from '$app/navigation';
import { slide } from 'svelte/transition'; import { slide } from 'svelte/transition';
import { smoothScrollTo, handleKeydown, openWebsite } from '$lib/index';
import { emojis } from '$lib/emojis';
// Icons // Icons
import IconDiscord from 'svelte-material-icons/Discord.svelte'; import IconDiscord from 'svelte-material-icons/Discord.svelte';
@ -14,93 +15,27 @@
import IconMastodon from 'svelte-material-icons/Mastodon.svelte'; import IconMastodon from 'svelte-material-icons/Mastodon.svelte';
import IconSteam from 'svelte-material-icons/Steam.svelte'; import IconSteam from 'svelte-material-icons/Steam.svelte';
// Initialisations
let showMore = false; let showMore = false;
const emojis = [
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ☕️',
'with 🍵',
'with 🍪',
'with 💤',
'on a 💻',
'in 🏫',
'at 🏠',
'with passion',
'with <img src="/assets/emojis/vscodium.png" alt="VSCodium" style="height: 18px;"/>',
'with <img src="/assets/emojis/stackoverflow.png" alt="StackOverflow" style="height: 18px;"/>',
'with <img src="/assets/emojis/svelte.png" alt="Svelte" style="height: 18px;" />'
];
let emoji = ''; let emoji = '';
// Functions export function changeEmoji() {
function changeEmoji() {
emoji = emojis[Math.floor(Math.random() * emojis.length)]; emoji = emojis[Math.floor(Math.random() * emojis.length)];
} }
function toggleShowMore() { export function toggleShowMore() {
showMore = !showMore; showMore = !showMore;
} }
onMount(() => { export function handleKeydownToggleMore(event: KeyboardEvent) {
changeEmoji();
});
function smoothScrollTo(elementId: string) {
const element = document.getElementById(elementId);
if (element) {
element.scrollIntoView({
behavior: 'smooth'
});
}
}
function redirectToHome() {
// goto('/');
smoothScrollTo('home');
}
function handleKeydownHome(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') {
redirectToHome();
}
}
function handleKeydownToggleMore(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar // Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') { if (event.key === 'Enter' || event.key === ' ') {
toggleShowMore(); toggleShowMore();
} }
} }
function openWebsite(url: string) { onMount(() => {
goto(url); changeEmoji();
} });
</script> </script>
<div id="socials" class="section"> <div id="socials" class="section">
@ -299,8 +234,8 @@
fill="none" fill="none"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
tabindex="0" tabindex="0"
on:click={redirectToHome} on:click={() => smoothScrollTo('home')}
on:keydown={handleKeydownHome} on:keydown={handleKeydown}
> >
<mask <mask
id="mask0_1404_2" id="mask0_1404_2"
@ -336,5 +271,5 @@
</div> </div>
<style lang="scss"> <style lang="scss">
@import '../styles/socials.scss'; @import '$styles/socials.scss';
</style> </style>

37
src/lib/emojis.ts Normal file
View file

@ -0,0 +1,37 @@
// Initialisations
export const emojis = [
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ❤️',
'with ☕️',
'with 🍵',
'with 🍪',
'with 💤',
'on a 💻',
'in 🏫',
'at 🏠',
'with passion',
'with <img src="/assets/emojis/vscodium.png" alt="VSCodium" style="height: 18px;"/>',
'with <img src="/assets/emojis/stackoverflow.png" alt="StackOverflow" style="height: 18px;"/>',
'with <img src="/assets/emojis/svelte.png" alt="Svelte" style="height: 18px;" />'
];

View file

@ -1 +1,59 @@
// place files you want to import through the `$lib` alias in this folder. // index.ts
import { goto } from '$app/navigation';
import { gsap } from 'gsap';
import { ScrollToPlugin } from 'gsap/dist/ScrollToPlugin';
// export function smoothScrollTo(elementId: string) {
// const element = document.getElementById(elementId);
// if (element) {
// element.scrollIntoView({
// behavior: 'smooth'
// });
// }
// }
export function smoothScrollTo(elementId: string) {
gsap.registerPlugin(ScrollToPlugin);
const element = document.getElementById(elementId);
if (!element) return;
// Function to disable scrolling
const disableScroll = (event: Event) => event.preventDefault();
// Disable scrolling through various events
window.addEventListener('wheel', disableScroll, { passive: false });
window.addEventListener('touchmove', disableScroll, { passive: false });
window.addEventListener('keydown', (event) => {
// Prevent scrolling through spacebar, arrow keys, page up/down
if (['Space', 'PageUp', 'PageDown', 'ArrowUp', 'ArrowDown'].includes(event.code)) {
event.preventDefault();
}
}, { passive: false });
gsap.to(window, {
scrollTo: { y: element, autoKill: false },
duration: 0.1,
ease: "power4.out",
onComplete: () => {
// Re-enable scrolling after animation
window.removeEventListener('wheel', disableScroll);
window.removeEventListener('touchmove', disableScroll);
window.removeEventListener('keydown', disableScroll);
}
});
}
export function handleKeydown(event: KeyboardEvent) {
// Trigger redirection on Enter key or Space bar
if (event.key === 'Enter' || event.key === ' ') {
smoothScrollTo('home');
}
}
export function openWebsite(url: string) {
goto(url);
}

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -1,11 +1,5 @@
<script lang="ts"> <script lang="ts">
import Modal from '../Modal.svelte';
import DashinitModal from './dashinit.svelte';
import SangeFaultModal from './sangefault.svelte';
import ExploreCraftModal from './explorecraft.svelte';
import UtilityClientModal from './utilityclient.svelte';
import SangeloSpaceModal from './sangelospace.svelte'
import IconCobweb from 'svelte-material-icons/SpiderWeb.svelte'; import IconCobweb from 'svelte-material-icons/SpiderWeb.svelte';
import IconArchive from 'svelte-material-icons/ArchiveOutline.svelte'; import IconArchive from 'svelte-material-icons/ArchiveOutline.svelte';
@ -132,7 +126,7 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
@import '../../styles/modal-more.scss'; @import '$styles/modal-more.scss';
</style> </style>

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -37,6 +37,6 @@
</content> </content>
<style lang="scss"> <style lang="scss">
@import '../../styles/modal.scss'; @import '$styles/modal.scss';
@import '../../styles/mobile/modal-mobile.scss'; @import '$styles/mobile/modal-mobile.scss';
</style> </style>

View file

@ -1,6 +1,6 @@
<script> <script>
import '../app.scss'; import '../app.scss';
import Navbar from './Navbar.svelte'; import Navbar from '$lib/components/Navbar.svelte';
import { fly } from 'svelte/transition'; import { fly } from 'svelte/transition';
export let data; export let data;

View file

@ -1,9 +1,39 @@
<script lang="ts"> <script lang="ts">
import { onMount } from 'svelte';
import { smoothScrollTo } from '$lib/index';
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/dist/ScrollTrigger';
import { ScrollToPlugin } from 'gsap/dist/ScrollToPlugin';
import Home from './Home.svelte'; import Home from '$lib/components/Home.svelte';
import About from './About.svelte'; import About from '$lib/components/About.svelte';
import Projects from './Projects.svelte'; import Projects from '$lib/components/Projects.svelte';
import Socials from './Socials.svelte'; import Socials from '$lib/components/Socials.svelte';
import { goto } from '$app/navigation';
onMount(() => {
gsap.registerPlugin(ScrollTrigger, ScrollToPlugin);
// Assuming each section component has an id set to 'home', 'about', 'projects', 'socials'
const sectionIds = ['home', 'about', 'projects', 'socials'];
sectionIds.forEach((id, i) => {
ScrollTrigger.create({
trigger: `#${id}`,
onEnter: () => smoothScrollTo(id),
start: 'top bottom',
end: 'bottom top',
markers: true
});
ScrollTrigger.create({
trigger: `#${id}`,
start: 'bottom top',
onEnterBack: () => smoothScrollTo(id),
markers: true
});
});
});
</script> </script>
@ -15,5 +45,5 @@
</div> </div>
<style lang="scss"> <style lang="scss">
@import '../styles/index.scss'; @import '$styles/index.scss';
</style> </style>

View file

@ -2,8 +2,8 @@
.container { .container {
height: 100vh; height: 100vh;
width: 100%; width: 100%;
scroll-snap-type: y mandatory; // scroll-snap-type: y mandatory;
overflow-y: scroll; // overflow-y: scroll;
} }
.section { .section {

View file

@ -8,6 +8,13 @@ const config = {
// for more information about preprocessors // for more information about preprocessors
preprocess: [vitePreprocess({})], preprocess: [vitePreprocess({})],
onwarn: (warning, handler) => {
if (warning.code === 'css-unused-selector') {
return;
}
handler(warning);
},
kit: { kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter. // If your environment is not supported or you settled on a specific environment, switch out the adapter.
@ -20,7 +27,13 @@ const config = {
fallback: undefined, fallback: undefined,
precompress: false, precompress: false,
strict: true strict: true
}) }),
alias: {
$routes: "src/routes",
$components: "src/components",
$styles: "src/styles"
},
} }
}; };

View file

@ -934,6 +934,11 @@ graphemer@^1.4.0:
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
gsap@^3.12.5:
version "3.12.5"
resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4"
integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==
has-flag@^4.0.0: has-flag@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"