community slice

This commit is contained in:
Christofer 2023-07-31 11:32:19 +02:00
parent 40a6544b85
commit 00837d5526
49 changed files with 1282 additions and 541 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
old old
.svelte-kit .svelte-kit
build
# Logs # Logs
logs logs

View File

@ -4,7 +4,7 @@
"description": "Website for Hyprland - Hyprland - A wayland compositor with the looks.", "description": "Website for Hyprland - Hyprland - A wayland compositor with the looks.",
"repository": "github:hyprwm/hyprland-website", "repository": "github:hyprwm/hyprland-website",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "echo 'Remove no-index for production!' && vite dev",
"build": "vite build", "build": "vite build",
"preview": "vite preview", "preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
@ -26,34 +26,34 @@
"node": ">=16.0.0" "node": ">=16.0.0"
}, },
"devDependencies": { "devDependencies": {
"@fontsource/fira-mono": "^4.5.10", "@iconify/json": "^2.2.95",
"@iconify/json": "^2.2.88", "@interactjs/types": "^1.10.17",
"@neoconfetti/svelte": "^1.0.0", "@sveltejs/adapter-auto": "^2.1.0",
"@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-static": "^2.0.3",
"@sveltejs/kit": "^1.20.4", "@sveltejs/kit": "^1.22.3",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"eslint": "^8.28.0", "eslint": "^8.46.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.9.0",
"eslint-plugin-svelte": "^2.30.0", "eslint-plugin-svelte": "^2.32.4",
"postcss": "^8.4.25", "postcss": "^8.4.27",
"prettier": "^2.8.0", "prettier": "^3.0.0",
"prettier-plugin-svelte": "^2.10.1", "prettier-plugin-svelte": "^3.0.3",
"svelte": "^4.0.0", "svelte": "^4.1.1",
"svelte-check": "^3.4.3", "svelte-add": "2023.6.28-0.0",
"tailwindcss": "^3.3.2", "svelte-check": "^3.4.6",
"typescript": "^5.0.0", "tailwindcss": "^3.3.3",
"vite": "^4.3.6" "tailwindcss-animate": "^1.0.6",
"typescript": "^5.1.6",
"unplugin-icons": "^0.16.5",
"vite": "^4.4.7"
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"clsx": "^1.2.1", "clsx": "^2.0.0",
"less": "^4.1.3", "interactjs": "^1.10.17",
"remeda": "^1.24.0", "remeda": "^1.24.0",
"sass": "^1.64.1",
"simplex-noise": "^4.0.1", "simplex-noise": "^4.0.1",
"svelte-inview": "^4.0.1", "svelte-inview": "^4.0.1",
"tailwindcss-animate": "^1.0.6", "ts-pattern": "^5.0.4"
"ts-pattern": "^5.0.1",
"unplugin-icons": "^0.16.3"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,8 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.ico" /> <link rel="icon" href="%sveltekit.assets%/favicon.ico" />
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<!-- ! Remember to remove this once done -->
<meta name="robots" content="noindex" />
<style></style> <style></style>
%sveltekit.head% %sveltekit.head%
</head> </head>

View File

@ -14,7 +14,7 @@ import { pick } from 'remeda'
* *
* Slide: Slide in in pixels. * Slide: Slide in in pixels.
* *
* @param {{fade?: number, zoom?: number, slide?: number, duration?: number, threshold?: number}} options * @param {{fade?: number, zoom?: number, slide?: number, duration?: number, delay?: number, threshold?: number}} options
* @param { HTMLElement } node * @param { HTMLElement } node
* @returns * @returns
*/ */
@ -23,10 +23,10 @@ export function animateIn(node, options) {
options.duration ??= 840 options.duration ??= 840
const effects = Object.entries(pick(options, ['fade', 'zoom', 'slide'])) const effects = Object.entries(pick(options, ['fade', 'zoom', 'slide', 'duration']))
const style = effects const style = effects
.map(([effect, value], _, all) => { .map(([effect, value]) => {
if (effect === 'slide') return `translate: 0px ${value}px` if (effect === 'slide') return `translate: 0px ${value}px`
if (effect === 'fade') return `opacity: ${value}` if (effect === 'fade') return `opacity: ${value}`
@ -41,20 +41,35 @@ export function animateIn(node, options) {
node.style = style node.style = style
let timeoutId
node.addEventListener('inview_enter', callback) node.addEventListener('inview_enter', callback)
function callback() { function callback() {
timeoutId = setTimeout(
effects.forEach(([effect]) => { effects.forEach(([effect]) => {
if (effect === 'slide') node.style.translate = '0 0' if (effect === 'slide') node.style.removeProperty('translate')
else if (effect === 'fade') node.style.opacity = '1' else if (effect === 'fade') node.style.removeProperty('opacity')
else if (effect === 'zoom') node.style.scale = '1 1' else if (effect === 'zoom') node.style.removeProperty('scale')
}) }),
options.delay ?? 0
)
} }
return { destroy: observer.destroy } return {
destroy: () => {
observer.destroy()
clearTimeout(timeoutId)
}
}
} }
// export function animateIn(styles) { /**
// const inview = inview() * @param {number} start
// // return ({ details: { invView, scrollDirection: vertical, node } }) => {} * @param {number} end
// } * @param {number} given
* @returns
*/
export function lerp(start, end, given) {
return (1 - given) * start + given * end
}

View File

@ -1,3 +1,3 @@
<footer class="h-96 flex items-center p-8 mt-20 border border-blue-500 rounded-3xl mx-8 mb-8"> <footer class="h-96 flex items-center p-8 mt-20 border border-blue-500 rounded-3xl mx-8 mb-8">
<p>Footer</p> <br />
</footer> </footer>

View File

@ -1,5 +1,5 @@
<script> <script>
import Community from './Community.svelte' import Community from './CommunitySlice.svelte'
import FeaturesSlice from './FeaturesSlice.svelte' import FeaturesSlice from './FeaturesSlice.svelte'
import HallOfFameSlice from './HallOfFameSlice.svelte' import HallOfFameSlice from './HallOfFameSlice.svelte'
import Hero from './Hero.svelte' import Hero from './Hero.svelte'
@ -14,8 +14,8 @@
<Hero /> <Hero />
<div class="-mt-8 mx-auto gap-[16rem] flex flex-col items-center"> <div class="-mt-8 mx-auto gap-[16rem] flex flex-col items-center">
<div class="px-8 lg:px-32"> <div class="px-8 mx-auto flex flex-col items-center lg:px-32">
<PreviewRiceSlice /> <PreviewRiceSlice class="mb-52" />
<FeaturesSlice /> <FeaturesSlice />
</div> </div>

View File

@ -1,59 +0,0 @@
<script lang="ts">
import Button from '$lib/components/Button.svelte'
import DiscordIcon from '~icons/prime/discord'
</script>
<section class="relative overflow-hidden w-screen min-h-max h-[850px]">
<h1 class="text-8xl font-bold text-center mb-8">Join a great community</h1>
<div class="text-center font-extrabold text-slate-300">
Get help from Distro Hoppers, Haiku writers, Hydrohomies and human_(probably)
</div>
<div class="flex flex-col w-full items-center">
<div class="w-28 h-28"><DiscordIcon class="h-full w-full" /></div>
<a href="https://discord.com/invite/hQ9XvMUjjr">
<Button type="fancyOutline">Join us on Discord</Button>
</a>
</div>
<div class=" absolute inset-0 w-[1024px]">
<div class="_bg-color bg-yellow-500 top-[146px] right-[17px] w-[359px] h-[207px] opacity-20" />
<div class="_bg-color bg-orange-500 top-[411px] right-0 w-[400px] h-[300px] opacity-30" />
<div class="_bg-color bg-purple-500 opacity-30 w-[321px] h-[295px] top-[209px] left-[368px]" />
<div class="_bg-color bg-cyan-500 opacity-30 w-[363px] h-[250px] left-[402px] top-[462px]" />
<div class="_bg-color bg-red-500 opacity-30 w-[323px] h-[482px] left-[53px] top-[179px]" />
<div class="_bg-color bg-fuchsia-500 opacity-30 w-[243px] h-[167px] left-[135px] top-[596px]" />
</div>
</section>
<style lang="sass">
// taken from https://codepen.io/mikegolus/pen/Jegvym?editors=1100
$quantity: 6
._bg-color
position: absolute
animation: ease 200s alternate infinite
pointer-events: none
animation: drift ease alternate infinite
filter: blur(80px)
border-radius: 50%
z-index: -50
// Randomize Motion
@for $i from 1 through $quantity
$steps: random(12) + 16
._bg-color:nth-child(#{$i})
// animation-name: move#{$i}
animation-duration: random(6000) + 50000ms
animation-delay: 0ms, random(8000) + 500ms
@keyframes move#{$i}
@for $step from 0 through $steps
#{$step * (100 / $steps)}%
transform: translateX(random(50) - 50px) translateY(random(50) - 50px) scale(calc(random(5) / 100 + 0.95))
</style>

View File

@ -0,0 +1,263 @@
<script context="module">
export const contextId = Symbol('community context')
</script>
<script>
import Button from '$lib/components/Button.svelte'
import DiscordIcon from '~icons/prime/discord'
import DiscordProfilePicture from './DiscordProfilePicture.svelte'
import clsx from 'clsx'
import { animateIn } from '$lib/Helper.mjs'
import { setContext } from 'svelte'
let sectionElement
let isDraggingChan = false
/** @type {{image: string coordinates: [number, number] containerClass: string}[], size: number, quote?: string } */
const profiles = [
{
image: '/imgs/profile_pictures/vaxry.gif',
coordinates: [187, 296],
size: 172,
class: 'outline-red-500'
},
{
image: '/imgs/profile_pictures/fufexan.webp',
coordinates: [735, 441],
size: 164,
class: 'outline-yellow-500'
},
{
image: '/imgs/profile_pictures/raf-notashelf.webp',
coordinates: [391, 615],
size: 149,
class: 'outline-orange-500'
},
{
image: '/imgs/profile_pictures/Mathisbuilder.png',
coordinates: [568, 568],
size: 120,
class: 'outline-amber-500'
},
{
image: '/imgs/profile_pictures/dani_666..webp',
coordinates: [525, 764],
size: 80,
class: 'outline-red-500'
},
{
image: '/imgs/profile_pictures/end_4.webp',
coordinates: [648, 709],
size: 128,
class: 'outline-cyan-400'
},
{
image: '/imgs/profile_pictures/ardishco.webp',
coordinates: [65, 208],
size: 100,
class: 'outline-slate-200'
},
{
image: '/imgs/profile_pictures/outfoxxed.webp',
coordinates: [53, 399],
size: 75,
class: 'outline-orange-500'
},
{
image: '/imgs/profile_pictures/beardwarrior.webp',
coordinates: [24, 341],
size: 49,
class: 'outline-amber-500'
},
{
image: '/imgs/profile_pictures/captainiveau.webp',
coordinates: [47, 86],
size: 48,
class: 'outline-red-500'
},
{
image: '/imgs/profile_pictures/etrigan63.webp',
coordinates: [135, 538],
size: 93,
class: 'outline-amber-500'
},
{
image: '/imgs/profile_pictures/jsw.webp',
coordinates: [41, 566],
size: 49,
class: 'outline-sky-500'
},
{
image: 'imgs/chan/cool.webp',
coordinates: [284, 533],
size: 90,
class: 'outline-cyan-500',
onDragStart: ({ detail: { currentTarget } }) => {
isDraggingChan = true
currentTarget.src = 'imgs/chan/quirky.webp'
},
onDragEnd: ({ detail: { currentTarget } }) => {
isDraggingChan = false
currentTarget.src = 'imgs/chan/cool.webp'
},
onHover: ({ detail: { srcElement } }) =>
!isDraggingChan && (srcElement.src = 'imgs/chan/love.webp')
},
{
image: '/imgs/profile_pictures/7.webp',
coordinates: [273, 687],
size: 52,
quote: '"Meds"',
class: 'outline-cyan-500'
},
{
image: '/imgs/profile_pictures/kcrmson.webp',
coordinates: [648, 364],
size: 80,
class: 'outline-sky-500'
},
{
image: '/imgs/profile_pictures/kirottum.webp',
coordinates: [772, 651],
size: 62,
class: 'outline-purple-500'
},
{
image: '/imgs/profile_pictures/loseardes77.gif',
coordinates: [736, 277],
size: 87,
class: 'outline-green-500'
},
{
image: '/imgs/profile_pictures/neoney.webp',
coordinates: [898, 364],
size: 68,
class: 'outline-green-500'
},
{
image: '/imgs/profile_pictures/qwaranou.webp',
coordinates: [873, 224],
size: 79,
class: 'outline-slate-500'
},
{
image: '/imgs/profile_pictures/SimplyKyle!.webp',
coordinates: [859, 159],
size: 39,
class: 'outline-rose-500'
},
{
image: '/imgs/profile_pictures/sioodmy.webp',
coordinates: [974, 107],
size: 48,
class: 'outline-amber-500'
},
{
image: '/imgs/profile_pictures/flafy.webp',
coordinates: [340, 790],
size: 80,
class: 'outline-pink-500'
}
]
setContext(contextId, {
biggestSize: profiles.reduce(
(previousSize, { size }) => (size > previousSize ? size : previousSize),
1
),
smallestSize: profiles.reduce(
(previousSize, { size }) => (size < previousSize ? size : previousSize),
Number.POSITIVE_INFINITY
),
getSectionElement: () => sectionElement
})
</script>
<section
class="relative flex flex-col items-center w-screen min-h-max h-[1200px] max-w-[100vw] overflow-x-hidden"
bind:this={sectionElement}
>
<div use:animateIn={{ slide: 24, fade: 0 }}>
<h1 class="text-8xl font-bold text-center mb-8">Join a great<br />community</h1>
<div class="text-center text-lg font-extrabold text-slate-300">
Get help from Distro Hoppers, Haiku writers,<br />Hydrohomies and human_(probably)
</div>
</div>
<div class="flex flex-col items-center gap-2 group mt-16">
<a
class="discord p-4"
href="https://discord.com/invite/hQ9XvMUjjr"
target="_blank"
rel="noopener"
>
<DiscordIcon class="w-full h-full " />
</a>
<a href="https://discord.com/invite/hQ9XvMUjjr">
<Button type="fancyOutline">Join us on Discord</Button>
</a>
</div>
<div class="absolute w-[1024px]">
<div class="flex flex-wrap gap-4 origin-bottom-right h-full">
{#each profiles as { onDragEnd, onDragStart, onHover, ...props }}
<DiscordProfilePicture
{...props}
on:dragStart={onDragStart}
on:dragEnd={onDragEnd}
on:hover={onHover}
/>
{/each}
</div>
<div class="">
<!-- Background color blobs -->
<div
class="_bg-color bg-yellow-500 top-[146px] right-[17px] w-[359px] h-[207px] opacity-20"
/>
<div class="_bg-color bg-orange-500 top-[411px] right-0 w-[400px] h-[300px] opacity-30" />
<div
class="_bg-color bg-purple-500 opacity-30 w-[321px] h-[295px] top-[209px] left-[368px]"
/>
<div class="_bg-color bg-cyan-500 opacity-30 w-[363px] h-[250px] left-[402px] top-[462px]" />
<div class="_bg-color bg-red-500 opacity-30 w-[323px] h-[482px] left-[53px] top-[179px]" />
<div
class="_bg-color bg-fuchsia-500 opacity-30 w-[243px] h-[167px] left-[135px] top-[596px]"
/>
</div>
</div>
</section>
<style lang="postcss">
.discord {
width: 9rem;
height: 9rem;
transition:
rotate 480ms cubic-bezier(0.5, 0, 0.5, 1.5),
scale 440ms cubic-bezier(1, -1.4, 0, 2),
filter 240ms;
filter: drop-shadow(0px 0px 0px cyan) drop-shadow(0px 0px 0px blue);
&:hover,
.group:hover & {
scale: 1.2 1.2;
rotate: 360deg;
filter: drop-shadow(4px 4px 14px #0fffef7a) drop-shadow(-4px -4px 12px purple);
animation: bounce 1s infinite;
}
&:active {
scale: 1;
transition: scale 80ms;
}
}
._bg-color {
position: absolute;
pointer-events: none;
filter: blur(80px);
border-radius: 50%;
z-index: -50;
contain: strict;
}
</style>

View File

@ -0,0 +1,125 @@
<script>
import { json } from '@sveltejs/kit'
import clsx from 'clsx'
import interact from 'interactjs'
import { createEventDispatcher, getContext, onMount } from 'svelte'
import { spring } from 'svelte/motion'
import { contextId } from './CommunitySlice.svelte'
import { lerp } from '$lib/Helper.mjs'
import { inview } from 'svelte-inview'
/** @type {string} */
export let image
/** @type {string} */
export let containerClass = ''
/** @type {number} */
export let size
/** @type {[number, number]} */
export let coordinates
/** @type {string | undefined} */
export let quote = undefined
const { biggestSize, getSectionElement } = getContext(contextId)
const dispatch = createEventDispatcher()
const relativeSize = size / biggestSize
const delay = (biggestSize - size) * 5
const dragCoordinates = spring([0, 0], {
damping: lerp(0.2, 0.03, relativeSize),
stiffness: lerp(0.2, 0.01, relativeSize),
// stiffness: lerp(0.81, 0.9, relativeSize),
precision: 0.001
})
let imageElement
let hasEnteredView = false
onMount(() => {
let interactionjs = interact(imageElement).draggable({
inertia: { resistance: lerp(5, 200, relativeSize) },
listeners: {
move({ dx, dy }) {
dragCoordinates.update(([x, y]) => {
x += dx
y += dy
return [x, y]
})
},
start(event) {
dispatch('dragStart', event)
},
end(event) {
dispatch('dragEnd', event)
}
},
modifiers: [
interact.modifiers.restrictRect({
restriction: getSectionElement,
endOnly: true
})
]
})
return () => interactionjs.off()
})
</script>
<div
class={clsx('absolute top-0 left-0 select-none touch-none ', containerClass)}
style:translate={coordinates.map((xy) => xy + 'px').join(' ')}
style="width: {size}px; height: {size}px;--delay: {delay}ms;"
>
<div
class="absolute inset-0 w-full h-full group opacity-0 select-none touch-none"
style:translate={`calc( ${$dragCoordinates[0]}px ) ${$dragCoordinates[1]}px`}
use:inview={{ unobserveOnEnter: true, threshold: 0.4 }}
class:_animate={hasEnteredView}
on:inview_enter={() => setTimeout(() => (hasEnteredView = true), 750)}
>
<img
class="w-full h-full group select-none touch-none outline-4 outline rounded-[50%] {$$restProps.class}"
bind:this={imageElement}
src={image}
alt={'community profile picture'}
aria-hidden="true"
on:mouseenter={(event) => dispatch('hover', event)}
class:hover:scale-125={!!quote}
/>
{#if quote}
<div
class="absolute tracking-wide opacity-0 -top-6 px-2 py-1 rounded left-1/2 -translate-x-1/2 bg-slate-800/50 pointer-events-none font-medium text-sm group-hover:opacity-100 select-none duration-150"
>
{quote}
</div>
{/if}
</div>
</div>
<style lang="postcss">
._animate {
animation: reveal 440ms 1 var(--delay) both cubic-bezier(0, 1, 0.765, 3.8);
touch-action: none;
user-select: none;
img {
transition: scale cubic-bezier(0.95, 0.82, 0.165, 2) 180ms;
&:hover {
scale: 1.05;
}
}
}
@keyframes reveal {
from {
opacity: 0%;
scale: 0.72 0.72;
}
to {
opacity: 100%;
scale: 1 1;
}
}
</style>

View File

@ -1,8 +1,6 @@
<script> <script>
import { animateIn } from '$lib/Helper.mjs' import { animateIn } from '$lib/Helper.mjs'
/** @type {{ name: string, url: string }} */
export let createdBy
/** @type {string} /** @type {string}
* The path to the image. Usually the file within `static`, but can also be an URL * The path to the image. Usually the file within `static`, but can also be an URL
*/ */
@ -13,19 +11,14 @@
export let containerClass = undefined export let containerClass = undefined
</script> </script>
<div <div class="rice {containerClass} group">
class="rice {containerClass} group" <div class="w-full h-full" use:animateIn={{ slide: 20, duration: 800 }}>
use:animateIn={{ fade: 0, duration: 1200, threshold: 0.4 }}
>
<img <img
src={image} src={image}
alt="Rice desktop" alt="Rice desktop"
class="w-full nice-hover object-cover object-top rounded-xl overflow-hidden shadow-2xl hover:scale-[1.01] {imageClass}" class="w-full nice-hover object-cover object-top rounded-xl overflow-hidden shadow-2xl hover:scale-[1.01] {imageClass}"
/> />
<img src={image} alt="Rice desktop" aria-hidden="true" class="rice-bg" /> <img src={image} alt="Rice desktop" aria-hidden="true" class="rice-bg" />
<div class="group-hover:opacity-100 opacity-0 transition-opacity absolute top-6 right-6 p-4">
{createdBy.name}
{createdBy.url}
</div> </div>
</div> </div>
@ -34,7 +27,7 @@
@apply relative w-full max-w-[1100px]; @apply relative w-full max-w-[1100px];
} }
.nice-hover { .nice-hover {
transition: transform 540ms cubic-bezier(0.1, -0.81, 0.31, 2); transition: all 540ms cubic-bezier(0.1, -0.81, 0.31, 2);
} }
.rice-bg { .rice-bg {
@apply w-[calc(100%-24px)] pointer-events-none transition-[filter] duration-500 absolute left-3 brightness-150 rounded-3xl -z-10 saturate-[5] h-full blur-2xl -bottom-10 opacity-50; @apply w-[calc(100%-24px)] pointer-events-none transition-[filter] duration-500 absolute left-3 brightness-150 rounded-3xl -z-10 saturate-[5] h-full blur-2xl -bottom-10 opacity-50;

View File

@ -71,6 +71,7 @@
> >
<div class="p-12 z-10 w-full h-full"> <div class="p-12 z-10 w-full h-full">
<h1 class="text-5xl font-bold mb-6 text-white">{title}</h1> <h1 class="text-5xl font-bold mb-6 text-white">{title}</h1>
<slot>Nothing in the slot here</slot> <slot>Nothing in the slot here</slot>
</div> </div>
<div class="gradient" /> <div class="gradient" />
@ -93,8 +94,8 @@
background: black background: black
radial-gradient( radial-gradient(
circle at bottom right, circle at bottom right,
theme(colors.neutral.900 / 30%), theme(colors.neutral.900 / 80%),
theme(colors.neutral.500 / 30%), theme(colors.neutral.500 / 10%),
black black
); );
} }
@ -115,7 +116,7 @@
contain: strict; contain: strict;
background: radial-gradient( background: radial-gradient(
320px circle at calc(var(--borderX) * 1px) calc(var(--borderY) * 1px), 320px circle at calc(var(--borderX) * 1px) calc(var(--borderY) * 1px),
color-mix(in srgb, var(--color1, theme(colors.cyan.500)), transparent 50%), color-mix(in srgb, var(--color1, theme(colors.cyan.500)), transparent 70%),
color-mix(in srgb, var(--color2, theme(colors.blue.500)), transparent 90%) color-mix(in srgb, var(--color2, theme(colors.blue.500)), transparent 90%)
); );

View File

@ -12,6 +12,11 @@
import BleedingEdgeIcon from '~icons/gg/controller' import BleedingEdgeIcon from '~icons/gg/controller'
import { animateIn } from '$lib/Helper.mjs' import { animateIn } from '$lib/Helper.mjs'
/**
* type {{name: string, github: string}}
*/
let createdBy
const context = setContext(mouseContext, { const context = setContext(mouseContext, {
x: writable(0), x: writable(0),
y: writable(0), y: writable(0),
@ -36,7 +41,7 @@
</script> </script>
<section class="flex flex-col items-center"> <section class="flex flex-col items-center">
<div use:animateIn={{ fade: 0, slide: 24, duration: 1480, threshold: 0.4 }}> <div class="text-center" use:animateIn={{ fade: 0, slide: 24, duration: 1480, threshold: 0.4 }}>
<div class="font-extrabold mb-3 text-slate-300">TLDR</div> <div class="font-extrabold mb-3 text-slate-300">TLDR</div>
<h1 class="text-8xl font-bold mb-14">Features</h1> <h1 class="text-8xl font-bold mb-14">Features</h1>
</div> </div>
@ -51,7 +56,7 @@
<FeatureCard title="Smooth" class="row-span-2"> <FeatureCard title="Smooth" class="row-span-2">
<p> <p>
Transition from windows and workspaces smoothly, without abrupt changes. Instant input with Transition from windows and workspaces smoothly, without abrupt changes. Instant input with
a custom wslroot patch included a custom WSLroot patch included
</p></FeatureCard </p></FeatureCard
> >
<FeatureCard title="Easy to configure" color="purple"> <FeatureCard title="Easy to configure" color="purple">

View File

@ -5,10 +5,10 @@
</script> </script>
<section <section
class="w-full relative" class="w-full relative flex flex-col items-center"
use:animateIn={{ fade: 0, slide: 24, duration: 1200, threshold: 0.1 }} use:animateIn={{ fade: 0, slide: 24, duration: 3000, threshold: 0.1 }}
> >
<div class="absolute inset-0"> <div class="absolute top-0 inset-x-0 z-30">
<div class="text-center font-extrabold mb-3 text-slate-300"> <div class="text-center font-extrabold mb-3 text-slate-300">
Memorials of the ricing legends Memorials of the ricing legends
</div> </div>
@ -16,28 +16,30 @@
</div> </div>
<div <div
class="w-full flex relative flex-col gap-16 lg:gap-24 items-center justify-end pt-16 overflow-hidden px-16 [perspective:100px]" class="w-full -mt-24 max-w-[1100px] flex relative flex-col gap-16 lg:gap-24 items-center justify-end overflow-hidden px-16 [perspective:100px]"
use:animateIn={{ slide: 24, fade: 0.5, duration: 800 }}
> >
<a class="absolute bottom-24 left-1/2 z-20 -translate-x-1/2" href="/hall-of-fame"> <a class="absolute bottom-24 left-1/2 z-20 -translate-x-1/2" href="/#">
<Button size="lg" type="fancyOutline">Go to Hall of Fame</Button> <Button size="lg" type="fancyOutline">Go to Hall of Fame</Button>
</a> </a>
<div
class="bg-blue-500 w-full [translate:0px_0px_-100px] aspect-square rounded-[50%] absolute top-0 inset-x-0 -z-30 blur-[200px]"
/>
<FameRicePreview <FameRicePreview
createdBy={{ name: 'flicko', url: 'http://flicko.com' }} image="/imgs/ricingcomp1/lauroro.jpg"
image="/imgs/ricingcomp1/flicko.png" containerClass="[translate:0px_0px_-100px] -mb-[30%] hover:[translate:0px_0px_-98px] transition-all duration-500"
containerClass="[translate:0px_0px_-100px] -mb-[30%] hover:[translate:0px_0px_-70px] hover:mb-[-15%] transition-all duration-500" imageClass="[mask-image:linear-gradient(black,black_45%,transparent_65%)] opacity-50 hover:opacity-60"
imageClass="[mask-image:linear-gradient(black_50%,transparent_95%)] "
/> />
<FameRicePreview <FameRicePreview
createdBy={{ name: 'flicko', url: 'http://flicko.com' }}
image="/imgs/env_4 novelknock-10.png"
containerClass="[translate:0px_0px_-40px] -mb-[30%]"
imageClass="[mask-image:linear-gradient(black,transparent_95%)]"
/>
<FameRicePreview
createdBy={{ name: 'flicko', url: 'http://flicko.com' }}
image="/imgs/ricingcomp1/amadeus.png" image="/imgs/ricingcomp1/amadeus.png"
imageClass="rounded-none [mask-image:linear-gradient(black,transparent)] rounded-t-xl h-[200px] sm:h-[250px] lg:h-[500px]" containerClass="[translate:0px_0px_-40px] hover:[translate:0px_0px_-38px] -mb-[30%] duration-500 transition-all group"
imageClass="[mask-image:linear-gradient(black,black_50%,transparent_75%)] opacity-80 group-hover:opacity-100 transition-all duration-500"
/>
<FameRicePreview
image="/imgs/ricingcomp1/flicko.png"
imageClass="!rounded-none !rounded-t-xl [mask-image:linear-gradient(black,black_50%,transparent)] rounded-t-xl h-[200px] sm:h-[250px] lg:h-[500px]"
/> />
</div> </div>
@ -50,16 +52,16 @@
width: 100%; width: 100%;
/* min-width: 8800px; */ /* min-width: 8800px; */
position: absolute; position: absolute;
opacity: 0.5; opacity: 0.3;
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
pointer-events: none; pointer-events: none;
background-image: radial-gradient( background-image: radial-gradient(
ellipse at bottom, ellipse at bottom,
theme(colors.cyan.500), theme(colors.pink.400),
theme(colors.blue.700 / 50%) 50%, theme(colors.indigo.700 / 50%) 50%,
theme(colors.blue.950 / 0%) 80% theme(colors.indigo.950 / 0%) 80%
); );
} }
</style> </style>

View File

@ -31,7 +31,7 @@
</div> </div>
</div> </div>
<h2 <h2
class="ani-in text-center mb-14 [animation-delay:944ms] fill-mode-backwards font-medium text-xl text-blue-200/60" class="ani-in text-center mb-10 [animation-delay:944ms] fill-mode-backwards font-medium text-xl text-blue-200/60"
> >
Dynamic tiling Wayland compositor<br />with the looks. Dynamic tiling Wayland compositor<br />with the looks.
</h2> </h2>

View File

@ -6,14 +6,17 @@
</script> </script>
<header <header
class="flex items-center z-40 p-1 justify-between text-blue-300 bg-black/50 fixed inset-4 h-7 rounded-full backdrop-blur animate-in slide-in-from-top-1 [animation-delay:1250ms] fade-in-0 duration-1000 fill-mode-backwards" class="flex items-center z-30 justify-between fixed top-4 inset-x-6 rounded-full animate-in slide-in-from-top-1 [animation-delay:1250ms] fade-in-0 duration-1000 fill-mode-backwards"
> >
<a href="/" class="flex gap-2 pl-2 text-sm items-center font-bold tracking-wide text-white"> <a
href="/"
class="flex gap-2 px-4 py-1 text-sm rounded-full bg-black/50 items-center font-bold tracking-wide text-white"
>
<img src={logo} alt="Hyprland Logo" class="w-6" />Hyprland</a <img src={logo} alt="Hyprland Logo" class="w-6" />Hyprland</a
> >
<nav class="flex font-semibold gap-4 items-center"> <nav class="flex font-semibold items-center backdrop-blur pl-5 rounded-full bg-black/50">
<ul class="flex gap-4 px-3 rounded-full max-h-full border-primary border-1 border h-full"> <ul class="flex gap-5 rounded-full items-center max-h-full h-full hover:[&_li]:text-cyan-300">
<li> <li>
<a href="https://wiki.hyprland.org/Getting-Started/Master-Tutorial/">Get_started</a> <a href="https://wiki.hyprland.org/Getting-Started/Master-Tutorial/">Get_started</a>
</li> </li>
@ -21,27 +24,24 @@
<a href="https://wiki.hyprland.org">Wiki</a> <a href="https://wiki.hyprland.org">Wiki</a>
</li> </li>
<li aria-current={$page.url.pathname === '/about' ? 'page' : undefined}> <li aria-current={$page.url.pathname === '/about' ? 'page' : undefined}>
<a href="/rices">Wall_of_fame</a> <a href="/#">Wall_of_fame</a>
</li> </li>
</ul> </ul>
<ul class="bg-purple-400 rounded-full flex items-center gap-3 px-2 py-1"> <ul class="border-purple-400 border mr-2 ml-4 rounded-full flex items-center gap-3 px-4">
<li> <li>
<a href="https://github.com/hyprwm/Hyprland"> <a href="https://github.com/hyprwm/Hyprland">
<DiscordIcon class="text-black" /> <DiscordIcon class="w-8 h-8 p-1 rounded-full hover:bg-purple-500 hover:text-white" />
</a> </a>
</li> </li>
<li> <li>
<a href="https://github.com/hyprwm/Hyprland"> <a href="https://github.com/hyprwm/Hyprland">
<GithubIcon class="text-black" /> <GithubIcon class="w-8 h-8 p-1 hover:bg-purple-500 rounded-full hover:text-white" />
</a> </a>
</li> </li>
</ul> </ul>
<a <a
class="bg-primary rounded-full px-4 py-1 text-black" class="bg-primary rounded-full px-4 py-1 uppercase tracking-wide text-black hover:bg-cyan-200"
href="https://wiki.hyprland.org/Getting-Started/Installation/">Install</a href="https://wiki.hyprland.org/Getting-Started/Installation/">Install</a
> >
</nav> </nav>
</header> </header>
<style>
</style>

View File

@ -15,10 +15,9 @@
on:inview_enter={({ detail: { node } }) => { on:inview_enter={({ detail: { node } }) => {
node.classList.remove('opacity-20') node.classList.remove('opacity-20')
node.classList.remove('scale-90') node.classList.remove('scale-90')
// videoElement.play() videoElement.play()
}} }}
> >
<!--TODO Play and scale up on enter -->
<video <video
bind:this={videoElement} bind:this={videoElement}
src={previewRice} src={previewRice}

BIN
static/imgs/chan/cool.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
static/imgs/chan/love.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
static/imgs/chan/sad.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
static/imgs/chan/thonk.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 KiB

View File

@ -1,5 +1,5 @@
import adapter from '@sveltejs/adapter-auto'; import adapter from '@sveltejs/adapter-static'
import { vitePreprocess } from '@sveltejs/kit/vite'; import { vitePreprocess } from '@sveltejs/kit/vite'
/** @type {import('@sveltejs/kit').Config} */ /** @type {import('@sveltejs/kit').Config} */
const config = { const config = {
@ -10,6 +10,6 @@ const config = {
adapter: adapter() adapter: adapter()
}, },
preprocess: vitePreprocess() preprocess: vitePreprocess()
}; }
export default config; export default config

View File

@ -16,5 +16,6 @@ export default {
} }
} }
}, },
plugins: [require('tailwindcss-animate')] plugins: [require('tailwindcss-animate')],
safelist: ['animate-bounce', 'outline-amber-500']
} }

View File

@ -8,5 +8,12 @@ export default defineConfig({
Icons({ Icons({
compiler: 'svelte' compiler: 'svelte'
}) })
] ],
build: {
rollupOptions: {
output: {
manualChunks: {}
}
}
}
}) })