Fully working links. in terms of frontend.
This commit is contained in:
parent
c1a69f3346
commit
3970f85e89
8 changed files with 148 additions and 34 deletions
|
@ -1,11 +1,72 @@
|
||||||
<script>
|
<script>
|
||||||
import '$lib/css/base.css';
|
import '$lib/css/base.css';
|
||||||
import '$lib/css/link.css';
|
import '$lib/css/link.css';
|
||||||
|
import { hexTorgb, darkenHexTorgb } from '$lib/js/color.js';
|
||||||
|
|
||||||
import SvgIcon from '$lib/components/svg-icon-custom.svelte';
|
import SvgIcon from '$lib/components/svg-icon-custom.svelte';
|
||||||
import { mdiChevronRight } from '@mdi/js';
|
import { mdiChevronRight } from '@mdi/js';
|
||||||
|
import anime from 'animejs';
|
||||||
|
|
||||||
|
let color = '9A031E';
|
||||||
|
const color_rgb = hexTorgb(color);
|
||||||
|
const color_darken = darkenHexTorgb(color, 0.8);
|
||||||
|
let imgBase = 'placeholder_link.png';
|
||||||
|
let imgHover = 'placeholder_link_hover.png';
|
||||||
|
let base;
|
||||||
|
let hover;
|
||||||
|
|
||||||
|
let span_link;
|
||||||
|
let svg_icon;
|
||||||
|
let div_background;
|
||||||
|
let span_width = '0%';
|
||||||
|
|
||||||
|
async function enter() {
|
||||||
|
span_width = '100%';
|
||||||
|
span_link.style.color = 'var(--color-background)';
|
||||||
|
svg_icon.svgElement.style.color = 'var(--color-background)';
|
||||||
|
svg_icon.svgElement.style.transform = 'translateX(8px)';
|
||||||
|
updatePicture(false, base);
|
||||||
|
updatePicture(true, hover);
|
||||||
|
updatePicture(true, div_background);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function leave() {
|
||||||
|
span_width = '0%';
|
||||||
|
span_link.style.color = 'var(--color-text)';
|
||||||
|
svg_icon.svgElement.style.color = 'var(--color-text)';
|
||||||
|
svg_icon.svgElement.style.transform = '';
|
||||||
|
updatePicture(true, base);
|
||||||
|
updatePicture(false, hover);
|
||||||
|
updatePicture(false, div_background);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updatePicture(show, img) {
|
||||||
|
const targetOpacity = show ? 1 : 0;
|
||||||
|
|
||||||
|
anime({
|
||||||
|
targets: img,
|
||||||
|
opacity: [1 - targetOpacity, targetOpacity],
|
||||||
|
duration: 400,
|
||||||
|
easing: 'easeInOutQuad'
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="link-container flex-row center">
|
<div
|
||||||
<span>Link</span>
|
style="--shadow: rgba({color_rgb.r}, {color_rgb.g}, {color_rgb.b}, 0.4) 0px 30px 60px -12px, rgba({color_darken.r}, {color_darken.g}, {color_darken.b}, 0.3) 0px 18px 36px -18px; --gradient: linear-gradient(180deg, #{color} 0%, rgba({color_darken.r},{color_darken.g}, {color_darken.b}, 1) 100%); --span-width: {span_width};"
|
||||||
<SvgIcon type="mdi" path={mdiChevronRight} size={80}></SvgIcon>
|
class="link-container"
|
||||||
|
on:mouseenter={enter}
|
||||||
|
on:mouseleave={leave}
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div class="link-background" bind:this={div_background} />
|
||||||
|
<div class="link-content flex-row center">
|
||||||
|
<div class="link-img">
|
||||||
|
<img bind:this={base} alt="base" src={imgBase} />
|
||||||
|
<img bind:this={hover} alt="hover" class="link-img-hover" src={imgHover} />
|
||||||
|
</div>
|
||||||
|
<span bind:this={span_link}>Link</span>
|
||||||
|
<SvgIcon type="mdi" path={mdiChevronRight} size={80} bind:this={svg_icon}></SvgIcon>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -64,6 +64,7 @@ h2 {
|
||||||
--2-rem: clamp(1.4rem, -0.834rem + 4.0851vw, 2rem);
|
--2-rem: clamp(1.4rem, -0.834rem + 4.0851vw, 2rem);
|
||||||
|
|
||||||
--navbar-height: 6rem;
|
--navbar-height: 6rem;
|
||||||
|
--transition: all .4s ease 0s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.base {
|
.base {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
font-size: var(--1-2-rem);
|
font-size: var(--1-2-rem);
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-icon-text h1 {
|
.page-icon-text h1 {
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
height: 0.2rem;
|
height: 0.2rem;
|
||||||
background-color: var(--palette-pink);
|
background-color: var(--palette-pink);
|
||||||
width: 0%;
|
width: 0%;
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-icon-text > a:hover::after {
|
.page-icon-text > a:hover::after {
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
:root {
|
:root {
|
||||||
--link-color: #0174BE;
|
|
||||||
--line-size: 5px;
|
--line-size: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,46 +6,78 @@
|
||||||
width: 60rem;
|
width: 60rem;
|
||||||
height: 20rem;
|
height: 20rem;
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
margin-left: 1rem;
|
cursor: pointer;
|
||||||
margin-right: 1rem;
|
transition: var(--transition);
|
||||||
box-shadow: rgba(79, 50, 93, 0.25) 0px 30px 60px -12px, rgba(0, 0, 0, 0.3) 0px 18px 36px -18px;
|
display: grid;
|
||||||
|
border-radius: 1rem;
|
||||||
|
grid-template-areas:
|
||||||
|
"overlay";
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-container:hover {
|
||||||
|
box-shadow: var(--shadow);
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-container svg {
|
.link-container svg {
|
||||||
margin-left: 1rem;
|
margin-left: 1rem;
|
||||||
|
color: var(--color-text);
|
||||||
|
transition: var(--transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-img {
|
||||||
|
display: grid;
|
||||||
|
grid-template-areas:
|
||||||
|
"overlay";
|
||||||
|
max-width: 30rem;
|
||||||
|
height: 20rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-img img {
|
||||||
|
grid-area: overlay;
|
||||||
|
height: 100%;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-img-hover {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-content {
|
||||||
|
grid-area: overlay;
|
||||||
|
width: 60rem;
|
||||||
|
height: 20rem;
|
||||||
|
border-radius: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-background {
|
||||||
|
grid-area: overlay;
|
||||||
|
width: 60rem;
|
||||||
|
height: 20rem;
|
||||||
|
border-radius: 1rem;
|
||||||
|
opacity: 0;
|
||||||
|
background-image: var(--gradient);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Link Underlined */
|
/* Link Underlined */
|
||||||
|
|
||||||
.link-container > span {
|
.link-content>span {
|
||||||
font-family: 'JetBrains Mono';
|
font-family: 'JetBrains Mono';
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: all .3s ease 0s;
|
color: var(--color-text);
|
||||||
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-container > span:hover {
|
.link-content>span::after {
|
||||||
cursor: pointer;
|
|
||||||
color: var(--link-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-container > span::after {
|
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 0;
|
background-color: var(--color-background);
|
||||||
background-color: var(--link-color);
|
|
||||||
transition: all .3s ease 0s;
|
|
||||||
height: var(--line-size);
|
height: var(--line-size);
|
||||||
}
|
|
||||||
|
|
||||||
.link-container > span::after {
|
|
||||||
bottom: calc(0px - var(--line-size));
|
bottom: calc(0px - var(--line-size));
|
||||||
height: var(--line-size);
|
height: var(--line-size);
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
transition: var(--transition);
|
||||||
|
width: var(--span-width);
|
||||||
.link-container > span:hover::after {
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
:root {
|
:root {
|
||||||
--transition: all .4s ease 0s;
|
|
||||||
--navbar-dark: #261C2CFF;
|
--navbar-dark: #261C2CFF;
|
||||||
--navbar-darker: #261C2CFF;
|
--navbar-darker: #261C2CFF;
|
||||||
--navbar-light: #413543FF;
|
--navbar-light: #413543FF;
|
||||||
|
@ -89,7 +88,7 @@ a {
|
||||||
font-family: JetBrains Mono;
|
font-family: JetBrains Mono;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
color: var(--color-background);
|
color: var(--color-background);
|
||||||
transition: var(--transition);
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +105,7 @@ a {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 0;
|
width: 0;
|
||||||
background-color: var(--palette-pink);
|
background-color: var(--palette-pink);
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
height: 3px;
|
height: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,13 @@
|
||||||
margin-top: 1.2rem;
|
margin-top: 1.2rem;
|
||||||
margin-bottom: 1.2rem;
|
margin-bottom: 1.2rem;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-link img {
|
.social-link img {
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-link img:hover {
|
.social-link img:hover {
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-link svg {
|
.social-link svg {
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-link svg:hover {
|
.social-link svg:hover {
|
||||||
|
@ -90,7 +90,7 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 0;
|
width: 0;
|
||||||
background-color: var(--social-color);
|
background-color: var(--social-color);
|
||||||
transition: all .3s ease 0s;
|
transition: var(--transition);
|
||||||
height: 3px;
|
height: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
22
frontend/src/lib/js/color.js
Normal file
22
frontend/src/lib/js/color.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
export function hexTorgb(hex) {
|
||||||
|
return {
|
||||||
|
r: parseInt(hex.substring(0, 2), 16),
|
||||||
|
g: parseInt(hex.substring(2, 4), 16),
|
||||||
|
b: parseInt(hex.substring(4, 6), 16),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* should be type {r,g,b} */
|
||||||
|
export function rgbTohex(rgb) {
|
||||||
|
return (rgb.r.toString(16) + rgb.g.toString(16) + rgb.b.toString(16));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function darkenHexTorgb(hex, darken) {
|
||||||
|
let rgb = hexTorgb(hex);
|
||||||
|
console.log(hex);
|
||||||
|
console.log(rgb);
|
||||||
|
rgb.r = Math.floor(Math.round(rgb.r * darken));
|
||||||
|
rgb.g = Math.floor(Math.round(rgb.g * darken));
|
||||||
|
rgb.b = Math.floor(Math.round(rgb.b * darken));
|
||||||
|
return rgb;
|
||||||
|
}
|
BIN
frontend/static/placeholder_link_hover.png
Executable file
BIN
frontend/static/placeholder_link_hover.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
Loading…
Add table
Reference in a new issue