heropage matrix

This commit is contained in:
365884
2026-03-07 19:47:38 +01:00
parent e4cd6977a9
commit 57927e4419
3 changed files with 257 additions and 127 deletions

View File

@@ -7,37 +7,63 @@ gsap.registerPlugin(ScrollTrigger)
const main = ref(null); const main = ref(null);
let tl; let tl;
let ctx; let ctx;
function setBoxes() {
const wrapper = main.value.querySelector('.content-wrapper');
const rect = wrapper.getBoundingClientRect();
const boxes = gsap.utils.toArray(".box");
gsap.set(".title", { y: 200 });
boxes.forEach((box) => {
const randomX = gsap.utils.random(0, rect.width);
const randomY = gsap.utils.random(0, rect.height);
gsap.set(box, {
x: randomX,
y: randomY,
xPercent: -50,
yPercent: -50
});
});
}
function toggleTimeline() { function toggleTimeline() {
tl.reversed(!tl.reversed()) tl.reversed(!tl.reversed())
} }
function startNextAnimation() { function startNextAnimation() {
const centerX = window.innerWidth / 2
const centerY = window.innerHeight / 2
const radius = 250
ctx = gsap.context(() => { ctx = gsap.context(() => {
const boxes = gsap.utils.toArray(".box") const boxes = gsap.utils.toArray(".box")
tl = gsap.timeline({ tl = gsap.timeline({
scrollTrigger: { scrollTrigger: {
trigger: ".scroll-trigger-ready__worm-wrap", trigger: ".scroll-trigger-ready__worm-wrap",
start: "top 00%", start: "top 00%",
end: "bottom 30%", end: "bottom 35%",
scrub: 1 scrub: 2
} }
}) })
tl tl.to(boxes, {
.to(boxes[0], { x: gsap.utils.random(300, 600), rotate: 180 }) y: () => gsap.utils.random(-400, -150),
.to(boxes[1], { x: -gsap.utils.random(300, 500), rotate: -180 }, "<")
.to(boxes[2], { x: gsap.utils.random(300, 400), rotate: 180 }) rotate: () => gsap.utils.random(-180, 180),
.to(boxes[3], { x: gsap.utils.random(300, 500), rotate: 180 }) ease: "none",
.to(boxes[4], { x: -gsap.utils.random(300, 400), rotate: -180 }, "<") stagger: 0.05
.to(boxes[5], { x: gsap.utils.random(300, 500), rotate: 180 }) }).to(".title", {
.to(boxes[6], { x: -gsap.utils.random(300, 600), rotate: 180 })
.to(".title", {
y: window.innerHeight - 130, y: window.innerHeight - 130,
duration: 4.0, duration: 4.0,
ease: "power2.inOut" ease: "power2.inOut"
@@ -47,6 +73,7 @@ function startNextAnimation() {
} }
onMounted(() => { onMounted(() => {
setBoxes();
startNextAnimation(); startNextAnimation();
}); });
@@ -57,22 +84,36 @@ onUnmounted(() => {
</script> </script>
<template> <template>
<section class="container" ref="main"> <section class="container" ref="main">
<h1 class="title">Welcome</h1> <div class="content-wrapper">
<div> <h1 class="title">Welcome</h1>
</div> <div class="box">l</div>
<div class="box">e</div>
<div class="box">e</div>
<div class="box">r</div>
<div class="box">p</div>
<div class="box"></div> <div class="box"></div>
<div class="box"></div> <div class="box">H</div>
<div class="box"></div> <div class="box">e</div>
<div class="box"></div> <div class="box">d</div>
<div class="box"></div> <div class="box">n</div>
<div class="box"></div> <div class="box">a</div>
<div class="box"></div> <div class="box">e</div>
<div class="box">l</div>
<div class="box">A</div>
<div class="box">x</div>
<div class="box">m</div>
<div class="box">o</div>
<div class="box">T</div>
<div class="box">r</div>
</section> </div>
</section>
</template> </template>
<style scoped> <style scoped>
.container { .container {
background: radial-gradient( background: radial-gradient(
129% 99% at 20% 85%, 129% 99% at 20% 85%,
@@ -88,43 +129,37 @@ onUnmounted(() => {
align-items: center; align-items: center;
} }
.content-wrapper {
position: relative;
width: 100%;
height: 80vh;
}
.title { .title {
font-display: block; position: relative;
font-style: normal; z-index: 1;
font-weight: bold; text-align: center;
color: #ffffff;
font-size: clamp(2rem, 12rem, 5vw); font-size: clamp(2rem, 12rem, 5vw);
box-sizing: border-box; margin: 0;
font-display: block;
font-style: normal;
font-weight: bold;
} }
.box { .box {
width: 100px;
height: 100px;
background: linear-gradient(111.45deg, #ffffff 19.42%, #f7bdf8 73.08%);
border-radius: 20%;
}
.box:nth-child(2) { display: flex;
background: linear-gradient(111.45deg, #ffffff 19.42%, #39ffba 73.08%); align-items: center;
} justify-content: center;
text-align: center;
font-weight: 600;
color: var(--green);
.box:nth-child(3) { line-height: 1.2;
background: linear-gradient(111.45deg, #ffffff 56.42%, #aed1e3 73.08%); will-change: transform;
} position: absolute;
.box:nth-child(4) {
background: linear-gradient(111.45deg, #ffffff 90.42%, #f8e3bd 12.08%);
}
.box:nth-child(5) {
background: linear-gradient(111.45deg, #ffffff 19.42%, #76aaee 73.08%);
} }

View File

@@ -1,6 +1,7 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import router from './router' import router from './router'
import "./style.css"
createApp(App) createApp(App)

View File

@@ -1,79 +1,173 @@
:root { :root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; --color-shockingly-green: #0ae448;
line-height: 1.5; --color-just-black: #0e100f;
font-weight: 400; --color-surface-white: #fffce1;
--color-pink: #fec5fb;
color-scheme: light dark; --color-shockingly-pink: #f100cb;
color: rgba(255, 255, 255, 0.87); --color-orangey: #ff8709;
background-color: #242424; --color-lilac: #9d95ff;
--color-lt-green: #abff84;
font-synthesis: none; --color-blue: #00bae2;
text-rendering: optimizeLegibility; --color-grey: gray;
-webkit-font-smoothing: antialiased; --color-surface75: #bbbaa6;
-moz-osx-font-smoothing: grayscale; --color-surface50: #7c7c6f;
--color-surface25: #42433d;
--gradient-macha: linear-gradient(
114.41deg,
var(--color-shockingly-green) 20.74%,
var(--color-lt-green) 65.5%
);
--gradient-orange-crush: linear-gradient(
111.45deg,
var(--color-orangey) 19.42%,
#f7bdf8 73.08%
);
--gradient-lipstick: linear-gradient(
165.72deg,
#f7bdf8 21.15%,
#cd237f 81.93%
);
--gradient-purple-haze: linear-gradient(
153.58deg,
#f7bdf8 32.25%,
#2f3cc0 92.68%
);
--gradient-skyfall: linear-gradient(
131.77deg,
#0a157a 30.82%,
#15bfe4 81.82%
);
--gradient-emerald-city: linear-gradient(
166.9deg,
var(--color-shockingly-green) 53.19%,
#0085d0 107.69%
);
--gradient-summer-fair: linear-gradient(
144.02deg,
var(--color-blue) 4.56%,
var(--color-pink) 72.98%
);
--color-core-green: #dfffd1;
--color-core-green-lt: #f3ffee;
--color-core-gradient: radial-gradient(
89.08% 84.62% at 16.54% 78.46%,
#fbfefa 0%,
#c9f6b4 39.58%,
#abff84 77.6%,
#2fee65 100%
);
--color-core-button-gradient: linear-gradient(
114.41deg,
#0ae448 20.74%,
#abff84 65.5%
);
--color-core-heading-gradient: linear-gradient(
180deg,
#d6ffc3 0%,
rgba(214, 255, 195, 0) 100%
),
#f3ffee;
--color-core-intro-gradient: linear-gradient(
144.5deg,
#e8ffdd 65.09%,
#7dea7b 122.73%
),
linear-gradient(311.31deg, #7ef89e 36.08%, #e5ffd9 106.98%);
--color-text-purple: #d2ceff;
--color-text-purple-lt: #dfdcff;
--color-text-gradient: radial-gradient(
129.03% 100% at 120.97% 81.45%,
#dfdcff 27.08%,
#a69eff 100%
);
--color-svg-tangerine: #ffe3c7;
--color-svg-tangerine-lt: #fff0e0;
--color-svg-gradient: radial-gradient(
70.77% 70.77% at 0% 70.77%,
#ffd9b0 0%,
#fd9f3b 80.73%,
#ff8709 100%
);
--color-svg-heading-gradient: linear-gradient(
180deg,
#ffbd77 0%,
rgba(254, 197, 251, 0) 100%
),
#ffe4c7;
--color-ui-blue: #bef3fe;
--color-ui-blue-lt: #e1faff;
--color-ui-blue-codeblk: #f6feff;
--color-ui-text-gradient: linear-gradient(
168.89deg,
#fec5fb -21.3%,
#00bae2 89.88%
);
--color-ui-code-blocktext-gradient: linear-gradient(
142.91deg,
#cef6ff 18.75%,
#a6efff 54.93%
);
--color-ui-gradient: radial-gradient(
78.77% 78.77% at 71.71% 30.77%,
#f0fcff 0%,
#9bedff 67.21%,
#98ecff 76.04%,
#5be1ff 84.9%,
#00bae2 94.79%
);
--color-ui-gradient-background: linear-gradient(
137.1deg,
#ecfcff 27.5%,
#a6efff 94.09%
);
--color-ui-gradient-flip-background: radial-gradient(
140% 190% at 117.54% 131.12%,
#f0fcff 0%,
#9bedff 25.52%,
#98ecff 42.71%,
#5be1ff 60.94%,
#00bae2 94.79%
);
--color-scroll-pink: #ffd7fd;
--color-scroll-pink-lt: #ffe9fe;
--color-scroll-gradient: linear-gradient(
317.42deg,
#ffe9fe 10.4%,
#ff96f9 83.03%
);
--ease-in: cubic-bezier(0.755, 0.05, 0.855, 0.06);
--ease-out: cubic-bezier(0.23, 1, 0.32, 1);
--ease-in-out: cubic-bezier(0.86, 0, 0.07, 1);
--ease-out-quart: cubic-bezier(0.175, 0.79, 0.38, 0.905);
--ease-in-out-quart: cubic-bezier(0.645, 0.045, 0.355, 1);
} }
a { :root {
font-weight: 500; --dark: var(--color-just-black);
color: #646cff; --grey-dark: #42433d;
text-decoration: inherit; --light: var(--color-surface-white);
} --mid: #7c7c6f;
a:hover { --grey: #gray;
color: #535bf2; --gray: #gray;
--green: var(--color-shockingly-green);
--green-dark: #0ae448;
--green-light: var(--color-lt-green);
--blue: var(--color-blue);
--purple: var(--color-lilac);
--red: #cd237f;
--orange: var(--color-orangey);
accent-color: var(--color-shockingly-green);
} }
/* lovely fluid fonts */
body { :root {
margin: 0; --fluid-min-width: 320;
display: flex; --fluid-max-width: 1140;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 { --fluid-screen: 100vw;
font-size: 3.2em; --fluid-bp: calc(
line-height: 1.1; (var(--fluid-screen) - var(--fluid-min-width) / 16 * 1rem) /
} (var(--fluid-max-width) - var(--fluid-min-width))
);
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
} }