From bf0d67b196a43049c033fc23bde08891b35559ea Mon Sep 17 00:00:00 2001 From: Binh Duc Tran Date: Wed, 27 Mar 2024 23:06:23 +0700 Subject: [PATCH] feat: enhance landing Include: - Enhance Landing - Refactor layout - Enhance error layout - Make loader internal --- src/components/cool_link.rs | 14 ++ src/components/header.rs | 23 +++ src/components/intro.rs | 14 ++ src/components/landing.rs | 14 ++ src/components/{layout.rs => loader.rs} | 24 ++- src/components/mod.rs | 9 +- src/components/scroll_down.rs | 17 ++ src/components/social.rs | 19 +++ src/components/social_link.rs | 43 +++++ src/error_views.rs | 8 +- src/layouts/error.rs | 33 ++++ src/layouts/index.rs | 27 ++++ src/layouts/mod.rs | 2 + src/main.rs | 14 +- src/templates/index.rs | 15 +- static/assets/images/background.jpg | Bin 0 -> 58559 bytes static/assets/svg/facebook.svg | 1 + static/assets/svg/github.svg | 1 + static/assets/svg/instagram.svg | 1 + static/assets/svg/linkedin.svg | 1 + static/assets/svg/youtube.svg | 1 + static/sass/_variables.scss | 13 ++ static/sass/base.scss | 13 +- static/sass/cool-item.scss | 141 +++++++++++++++++ static/sass/layout.scss | 199 ++++++++++++++++++++++++ static/sass/loader.scss | 50 +++--- static/sass/social-icon.scss | 39 +++++ 27 files changed, 675 insertions(+), 61 deletions(-) create mode 100644 src/components/cool_link.rs create mode 100644 src/components/header.rs create mode 100644 src/components/intro.rs create mode 100644 src/components/landing.rs rename src/components/{layout.rs => loader.rs} (63%) create mode 100644 src/components/scroll_down.rs create mode 100644 src/components/social.rs create mode 100644 src/components/social_link.rs create mode 100644 src/layouts/error.rs create mode 100644 src/layouts/index.rs create mode 100644 src/layouts/mod.rs create mode 100644 static/assets/images/background.jpg create mode 100644 static/assets/svg/facebook.svg create mode 100644 static/assets/svg/github.svg create mode 100644 static/assets/svg/instagram.svg create mode 100644 static/assets/svg/linkedin.svg create mode 100644 static/assets/svg/youtube.svg create mode 100644 static/sass/_variables.scss create mode 100644 static/sass/cool-item.scss create mode 100644 static/sass/layout.scss create mode 100644 static/sass/social-icon.scss diff --git a/src/components/cool_link.rs b/src/components/cool_link.rs new file mode 100644 index 0000000..3f81a6a --- /dev/null +++ b/src/components/cool_link.rs @@ -0,0 +1,14 @@ +use sycamore::prelude::*; + +#[component] +pub fn CoolLink(cx: Scope, CoolLinkProps { to, text }: CoolLinkProps) -> View { + view! {cx, + a(href=(to), class="cool-link", data-text=(text)){span{(text)}} + } +} + +#[derive(Prop)] +pub struct CoolLinkProps { + to: &'static str, + text: &'static str, +} diff --git a/src/components/header.rs b/src/components/header.rs new file mode 100644 index 0000000..58aa00e --- /dev/null +++ b/src/components/header.rs @@ -0,0 +1,23 @@ +use sycamore::prelude::*; + +use crate::components::cool_link::CoolLink; + +#[component] +pub fn Header(cx: Scope) -> View { + view! {cx, + header(class="header") { + div(class="header__container") { + ul(class="header__left") { + li(class="header--xs") { CoolLink(text="Home", to="") } + li(class="header--sm") { CoolLink(text="Reviews", to="#") } + li { CoolLink(text="Projects", to="#") } + li(class="header--sm") { CoolLink(text="Insights", to="#") } + li(class="header--sm") { CoolLink(text="Faq", to="#") } + } + div(class="header__right") { + button(class="cool-button") {span{"Contact"}} + } + } + } + } +} diff --git a/src/components/intro.rs b/src/components/intro.rs new file mode 100644 index 0000000..862d0a4 --- /dev/null +++ b/src/components/intro.rs @@ -0,0 +1,14 @@ +use sycamore::prelude::*; + +#[component] +pub fn Intro(cx: Scope) -> View { + view! {cx, + div(class="intro") { + h4 { "Hi 👋, My name is" } + h1 { "Binh Tran" } + h2 { "Full stack web developer" } + h2 { "Automation tester" } + h2 { "from Vietnam" } + } + } +} diff --git a/src/components/landing.rs b/src/components/landing.rs new file mode 100644 index 0000000..8d3e98d --- /dev/null +++ b/src/components/landing.rs @@ -0,0 +1,14 @@ +use crate::components::{header::Header, intro::Intro, scroll_down::ScrollDown, social::Social}; +use sycamore::prelude::*; + +#[component] +pub fn Landing(cx: Scope) -> View { + view! {cx, + main(class="landing") { + Header + Social + Intro + ScrollDown + } + } +} diff --git a/src/components/layout.rs b/src/components/loader.rs similarity index 63% rename from src/components/layout.rs rename to src/components/loader.rs index 8e191c8..f712ba9 100644 --- a/src/components/layout.rs +++ b/src/components/loader.rs @@ -1,13 +1,17 @@ +use std::fs; + use sycamore::prelude::*; #[component] -pub fn Layout<'a, G: Html>(cx: Scope<'a>, LayoutProps { children }: LayoutProps<'a, G>) -> View { - let children = children.call(cx); - - view! { cx, +pub fn Loader(cx: Scope) -> View { + view! {cx, div(class="loader") { + style { (fs::read_to_string("static/styles/loader.css").expect("Cannot read loader.css")) } div(class="loader__box") { - img(src=".perseus/static/assets/images/mangekyou-sharingan.svg", alt="Loader image", class="loader__image") + img(src=".perseus/static/assets/images/mangekyou-sharingan.svg", + loading="lazy", + alt="Loader image", + class="loader__image") div(class="loader__text") { "L" div(class="loader__text--dot") @@ -22,15 +26,7 @@ pub fn Layout<'a, G: Html>(cx: Scope<'a>, LayoutProps { children }: LayoutProps< span(class="loader__counter--number") {"0%"} } } - script(src=".perseus/static/scripts/loader.js", defer=true) - } - main { - (children) } + script { (fs::read_to_string("static/scripts/loader.js").expect("Cannot read loader.js")) } } } - -#[derive(Prop)] -pub struct LayoutProps<'a, G: Html> { - pub children: Children<'a, G>, -} diff --git a/src/components/mod.rs b/src/components/mod.rs index 6738e8c..9fe3947 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,2 +1,9 @@ -pub mod layout; +pub mod cool_link; +pub mod header; +pub mod intro; +pub mod landing; +pub mod loader; +pub mod scroll_down; pub mod seo; +pub mod social; +pub mod social_link; diff --git a/src/components/scroll_down.rs b/src/components/scroll_down.rs new file mode 100644 index 0000000..ba9538f --- /dev/null +++ b/src/components/scroll_down.rs @@ -0,0 +1,17 @@ +use sycamore::prelude::*; + +#[component] +pub fn ScrollDown(cx: Scope) -> View { + view!{cx, + div(class="scroll-down") { + div(class="scroll-down__wheel") { + div(class="scroll-down__wheel--inner") + } + div(class="scroll-down__arrows") { + span(class="scroll-down__arrow") + span(class="scroll-down__arrow") + span(class="scroll-down__arrow") + } + } + } +} diff --git a/src/components/social.rs b/src/components/social.rs new file mode 100644 index 0000000..89920e2 --- /dev/null +++ b/src/components/social.rs @@ -0,0 +1,19 @@ +use std::fs; + +use sycamore::prelude::*; + +use crate::components::social_link::{SocialLink, SocialType}; + +#[component] +pub fn Social(cx: Scope) -> View { + view! {cx, + div(class="social") { + style { (fs::read_to_string("static/styles/social-icon.css").expect("Cannot read social-icon.css")) } + SocialLink(to="https://www.linkedin.com/in/binhtran432k", typ=SocialType::LinkedIn) + SocialLink(to="https://github.com/binhtran432k", typ=SocialType::GitHub) + SocialLink(to="#", typ=SocialType::Instagram) + SocialLink(to="https://www.facebook.com/binhtran432k", typ=SocialType::Facebook) + SocialLink(to="https://www.youtube.com/@binhtran432k", typ=SocialType::Youtube) + } + } +} diff --git a/src/components/social_link.rs b/src/components/social_link.rs new file mode 100644 index 0000000..e359cda --- /dev/null +++ b/src/components/social_link.rs @@ -0,0 +1,43 @@ +use std::fmt; + +use sycamore::prelude::*; + +#[component] +pub fn SocialLink(cx: Scope, SocialProps { to, typ }: SocialProps) -> View { + view! {cx, + a(href=to, + target="_blank", + title=format!("Social link of {}", typ.to_string()), + class=format!("icon icon--{} colored-icon", typ.to_string())) + { + span{} + } + } +} + +#[derive(Clone, Copy)] +pub enum SocialType { + GitHub, + Youtube, + Instagram, + Facebook, + LinkedIn, +} + +impl fmt::Display for SocialType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SocialType::GitHub => write!(f, "github"), + SocialType::Youtube => write!(f, "youtube"), + SocialType::Instagram => write!(f, "instagram"), + SocialType::Facebook => write!(f, "facebook"), + SocialType::LinkedIn => write!(f, "linkedin"), + } + } +} + +#[derive(Prop)] +pub struct SocialProps { + pub to: &'static str, + pub typ: SocialType, +} diff --git a/src/error_views.rs b/src/error_views.rs index 1064f88..bdd69f1 100644 --- a/src/error_views.rs +++ b/src/error_views.rs @@ -1,14 +1,16 @@ use perseus::{errors::ClientError, prelude::*}; use sycamore::prelude::*; +use crate::layouts::error::{Error, ErrorHead}; + fn get_error_page(cx: Scope, title: String, message: String) -> (View, View) { ( view! { cx, title { (title) } + ErrorHead }, view! { cx, - // Don't worry, there are much better ways of styling in Perseus! - div(class="test") { + Error { h1 { (title) } p { (message) } } @@ -17,7 +19,7 @@ fn get_error_page(cx: Scope, title: String, message: String) -> (View() -> ErrorViews { - ErrorViews::new(|cx, err, _err_info, _err_pos| { + ErrorViews::new(|cx, err, _err_info, _err_pos| -> (View, View) { match err { ClientError::ServerError { status, message: _ } => match status { 404 => get_error_page( diff --git a/src/layouts/error.rs b/src/layouts/error.rs new file mode 100644 index 0000000..2f357ff --- /dev/null +++ b/src/layouts/error.rs @@ -0,0 +1,33 @@ +use perseus::prelude::*; +use sycamore::prelude::*; + +use crate::components::{header::Header, loader::Loader, social::Social}; + +#[component] +pub fn Error<'a, G: Html>(cx: Scope<'a>, ErrorProps { children }: ErrorProps<'a, G>) -> View { + let children = children.call(cx); + + view! { cx, + Loader + main(class="error") { + Header + Social + div(class="error__content") { + (children) + } + } + } +} + +#[component] +pub fn ErrorHead(cx: Scope) -> View { + view! { cx, + link(rel="stylesheet", href=".perseus/static/styles/layout.css") + link(rel="stylesheet", href=".perseus/static/styles/cool-item.css") + } +} + +#[derive(Prop)] +pub struct ErrorProps<'a, G: Html> { + pub children: Children<'a, G>, +} diff --git a/src/layouts/index.rs b/src/layouts/index.rs new file mode 100644 index 0000000..c77438f --- /dev/null +++ b/src/layouts/index.rs @@ -0,0 +1,27 @@ +use perseus::prelude::*; +use sycamore::prelude::*; + +use crate::components::loader::Loader; + +#[component] +pub fn Index<'a, G: Html>(cx: Scope<'a>, IndexProps { children }: IndexProps<'a, G>) -> View { + let children = children.call(cx); + + view! { cx, + Loader() + (children) + } +} + +#[component] +pub fn IndexHead(cx: Scope) -> View { + view! { cx, + link(rel="stylesheet", href=".perseus/static/styles/layout.css") + link(rel="stylesheet", href=".perseus/static/styles/cool-item.css") + } +} + +#[derive(Prop)] +pub struct IndexProps<'a, G: Html> { + pub children: Children<'a, G>, +} diff --git a/src/layouts/mod.rs b/src/layouts/mod.rs new file mode 100644 index 0000000..691cc3e --- /dev/null +++ b/src/layouts/mod.rs @@ -0,0 +1,2 @@ +pub mod index; +pub mod error; diff --git a/src/main.rs b/src/main.rs index 1ed206f..7f085cc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,13 +5,16 @@ use lol_alloc::{FreeListAllocator, LockedAllocator}; #[cfg(client)] #[global_allocator] -static ALLOCATOR: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); +static ALLOCATOR: LockedAllocator = + LockedAllocator::new(FreeListAllocator::new()); mod components; mod error_views; +mod layouts; mod templates; use perseus::prelude::*; +use std::fs; use sycamore::prelude::view; #[perseus::main_export] @@ -29,10 +32,13 @@ pub fn main() -> PerseusApp { // fonts link (rel="preconnect", href="https://fonts.googleapis.com") link (rel="preconnect", href="https://fonts.gstatic.com", crossorigin="crossorigin") - link (href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&family=Orbitron:wght@400;700&display=swap", rel="stylesheet") + link (rel="preload", href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&family=Orbitron:wght@400;700&display=swap", as="style", onload="this.onload=null;this.rel='stylesheet'") // styles - link(rel="stylesheet", href=".perseus/static/styles/base.css") - link(rel="stylesheet", href=".perseus/static/styles/loader.css") + style { (fs::read_to_string("static/styles/base.css").expect("Cannot read base.css")) } + // No scripts alternative + noscript { + link (href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&family=Orbitron:wght@400;700&display=swap", rel="stylesheet") + } } body { // Quirk: this creates a wrapper `
` around the root `
` by necessity diff --git a/src/templates/index.rs b/src/templates/index.rs index 35340e1..fe10835 100644 --- a/src/templates/index.rs +++ b/src/templates/index.rs @@ -1,17 +1,15 @@ use perseus::prelude::*; use sycamore::prelude::*; -use crate::components::layout::Layout; +use crate::{ + components::landing::Landing, + layouts::index::{Index, IndexHead}, +}; fn index_page(cx: Scope) -> View { view! { cx, - Layout { - h1 { "Welcome to Perseus!" } - p { - "This is just an example app. Try changing some code inside " - code { "src/templates/index.rs" } - " and you'll be able to see the results here!" - } + Index { + Landing } } } @@ -20,6 +18,7 @@ fn index_page(cx: Scope) -> View { fn head(cx: Scope) -> View { view! { cx, title { "BINH TRAN - Fullstack Developer" } + IndexHead } } diff --git a/static/assets/images/background.jpg b/static/assets/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6bc736fcd935f6f8426bcf8aa55fc84f9adfa97 GIT binary patch literal 58559 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 E*^A?!6#xJL literal 0 HcmV?d00001 diff --git a/static/assets/svg/facebook.svg b/static/assets/svg/facebook.svg new file mode 100644 index 0000000..b97a838 --- /dev/null +++ b/static/assets/svg/facebook.svg @@ -0,0 +1 @@ + diff --git a/static/assets/svg/github.svg b/static/assets/svg/github.svg new file mode 100644 index 0000000..7ddcfdc --- /dev/null +++ b/static/assets/svg/github.svg @@ -0,0 +1 @@ + diff --git a/static/assets/svg/instagram.svg b/static/assets/svg/instagram.svg new file mode 100644 index 0000000..0795a95 --- /dev/null +++ b/static/assets/svg/instagram.svg @@ -0,0 +1 @@ + diff --git a/static/assets/svg/linkedin.svg b/static/assets/svg/linkedin.svg new file mode 100644 index 0000000..035e08c --- /dev/null +++ b/static/assets/svg/linkedin.svg @@ -0,0 +1 @@ + diff --git a/static/assets/svg/youtube.svg b/static/assets/svg/youtube.svg new file mode 100644 index 0000000..0a718cd --- /dev/null +++ b/static/assets/svg/youtube.svg @@ -0,0 +1 @@ + diff --git a/static/sass/_variables.scss b/static/sass/_variables.scss new file mode 100644 index 0000000..afd2ad8 --- /dev/null +++ b/static/sass/_variables.scss @@ -0,0 +1,13 @@ +$green: #6cff8d; +$red: #FF5555; +$yellow: #F1FA8C; +$purple: #BD93F9; +$cyan: #8BE9FD; +$orange: #FFB86C; +$pink: #FF79C6; +$blue: mix($cyan, blue, $weight: 50%); +$fg: #F8F8F2; +$bg: #282A36; +$green-50: rgba($green, 0.4); +$fg-50: rgba($fg, 0.4); +$bg-50: rgba($bg, 50%); diff --git a/static/sass/base.scss b/static/sass/base.scss index 1aa5be7..d94d52c 100644 --- a/static/sass/base.scss +++ b/static/sass/base.scss @@ -43,10 +43,11 @@ svg { max-width: 100%; } -.test { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 95vh; +a { + text-decoration: none; + color: inherit; +} + +ul { + list-style-type: none; } diff --git a/static/sass/cool-item.scss b/static/sass/cool-item.scss new file mode 100644 index 0000000..33eb88d --- /dev/null +++ b/static/sass/cool-item.scss @@ -0,0 +1,141 @@ +@import "_variables"; + +.cool-link { + $transition-opts: 0.3s cubic-bezier(0.5, 0.5, 0.3, 1); + position: relative; + display: grid; + place-items: center; + width: fit-content; + overflow: hidden; + + & span { + transition: transform $transition-opts; + } + + &::before { + content: ""; + position: absolute; + width: 100%; + height: 0.125rem; + background-color: currentColor; + bottom: 0; + left: 0; + transform: scale3d(0, 1, 1); + transform-origin: right; + transition: transform $transition-opts; + } + + &:hover::before { + transform: scale3d(1, 1, 1); + transform-origin: left; + } + + &::after { + position: absolute; + content: attr(data-text); + top: 0; + left: 0; + height: 100%; + transform: translate3d(150%, 0, 0); + transition: transform $transition-opts; + } + + &:hover::after { + transform: translate3d(0, 0, 0); + } + + &:hover span { + transform: translate3d(-150%, 0, 0); + } +} + +.cool-button { + $transition-opts: 0.3s cubic-bezier(0.5, 2.5, 0.5, 0.5); + position: relative; + border: none; + cursor: pointer; + width: 11rem; + height: 7.5rem; + background: none; + color: $fg; + + @media (max-width: 800px) { + font-size: 1.4em; + transform-origin: right; + transform: scale3d(0.7, 0.7, 0.7); + } + + &::before, + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + } + + &::before { + width: 100%; + height: 100%; + background-color: $fg; + clip-path: path("M154,88 C131,113 62,110 30,89 C-2,69 -3.5,42 4,25 C12.5,9 33,-6 85,3 C136,13 178,63 154,88 Z"); + transition: clip-path $transition-opts; + } + + &:hover::before { + clip-path: path("M143,77 C117,96 74,100 45,91 C17,82 -10,57 5,31 C21,6 79,-5 130,4 C182,13 169,58 143,77 Z"); + } + + &::after { + width: 95%; + height: 85%; + top: 0.375rem; + border: 0.0625rem solid $fg; + border-radius: 58% 42% 55% 45% / 56% 45% 55% 44%; + transform: rotate(-20deg); + transition: transform $transition-opts; + } + + &:hover::after { + transform: translate3d(0, -0.375rem, 0); + } + + & span { + mix-blend-mode: difference; + font-weight: 500; + } +} + +.colored-icon { + $bs: 0.14em -0.11em; + $be: 0.14em 0.11em; + $ts: -0.14em -0.17em; + $te: -0.23em 0.11em; + $ts2: -0.14em 0; + font-size: 2.1rem; + + &:hover { + animation: colored-icon-animation 0.2s infinite; + } + + @keyframes colored-icon-animation { + 0% { + filter: drop-shadow($be $red) drop-shadow($ts $blue); + } + + 25% { + filter: drop-shadow($ts $red) drop-shadow($be $blue); + } + + 50% { + filter: drop-shadow($bs $red) drop-shadow($te $blue); + } + + 75% { + filter: drop-shadow($te $red) drop-shadow($ts $blue); + } + + 100% { + filter: drop-shadow($ts2 $red) drop-shadow($bs $blue); + } + } +} diff --git a/static/sass/layout.scss b/static/sass/layout.scss new file mode 100644 index 0000000..ceb5400 --- /dev/null +++ b/static/sass/layout.scss @@ -0,0 +1,199 @@ +@import "_variables"; + +.landing, +.error { + position: relative; + width: 100%; + height: 100vh; + background-color: $bg; + background-image: linear-gradient($bg-50, $bg-50), url("../assets/images/background.jpg"); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + color: $fg; + overflow: hidden; +} + +.error { + &__content { + padding: 1rem; + text-align: center; + } + .social { + bottom: 3rem; + } +} + +.social { + position: absolute; + left: 50%; + bottom: 30%; + width: 100%; + transform: translateX(-50%); + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 1rem; + + @media (max-height: 500px) { + flex-wrap: wrap-reverse; + left: 100%; + transform: translateX(-100%); + flex-direction: column; + width: auto; + bottom: 0; + max-height: calc(100vh - 8rem); + } +} + +.header { + padding-top: 1rem; + + &__left { + padding: 0 0.5rem; + } + + &__container { + margin: auto; + padding: 0.625rem; + display: flex; + align-items: center; + justify-content: space-between; + max-width: 1200px; + width: 100vw; + + @media (max-height: 500px) { + padding-top: 0; + } + } + + &--sm { + @media (max-width: 650px) { + display: none; + } + } + + &--xs { + @media (max-width: 370px) { + display: none; + } + } + + &__left { + display: flex; + align-items: center; + gap: 2rem; + + & li { + font-size: 1.125rem; + font-weight: 700; + + @media (max-width: 500px) { + font-size: 1rem; + } + } + } +} + +.scroll-down { + position: absolute; + left: 50%; + bottom: 3rem; + transform: translateX(-50%); + + &__wheel { + width: 1.5rem; + height: 2.63rem; + border-radius: 0.625rem; + border: 2px solid $fg; + + &--inner { + position: absolute; + left: 50%; + top: 15%; + width: 0.25rem; + height: 0.25rem; + border-radius: 50%; + background-color: $fg; + transform: translateX(-50%); + animation: movingwheel 0.2s linear alternate infinite; + + @keyframes movingwheel { + 0% { + top: 8%; + } + + 100% { + top: 14%; + } + } + } + } + + &__arrows { + display: flex; + flex-direction: column; + align-items: center; + + .scroll-down__arrow { + $border: 2px solid $fg; + width: 15px; + height: 15px; + border-right: $border; + border-bottom: $border; + transform: rotate(45deg); + animation: scroll-animation 0.7s alternate infinite; + opacity: 0; + + @for $i from 1 through 3 { + &:nth-child(#{$i}) { + animation-delay: $i * 0.1s; + } + } + + @keyframes scroll-animation { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + } + } +} + +.intro { + padding: 0 1rem; + width: 100%; + font-family: "Orbitron", sans-serif; + + @media (max-width: 600px) { + h1 { + font-size: 1.5rem; + } + + h2 { + font-size: 1.25rem; + } + + h4 { + font-size: 0.875rem; + } + } + + @media (max-width: 370px) or (max-height: 370px) { + h1 { + font-size: 1.25rem; + } + + h2 { + font-size: 1rem; + } + + h4 { + font-size: 0.75rem; + } + } +} diff --git a/static/sass/loader.scss b/static/sass/loader.scss index 1bbdeb2..5e627c1 100644 --- a/static/sass/loader.scss +++ b/static/sass/loader.scss @@ -1,8 +1,7 @@ +@import "_variables"; + .loader { - $green: #6cff8d; - $green-50: rgba($green, 0.4); - $fg: #fff; - $bg: #0b134f; + $size: min(500px, 100vw, 100vh); position: fixed; top: 0; right: 0; @@ -26,7 +25,7 @@ &__box { position: relative; - max-width: 500px; + max-width: $size; width: 90%; padding: 1rem; border: 0.1875rem solid $green; @@ -44,12 +43,12 @@ 50% { border-radius: 50%; - min-height: min(500px, 100vw); + min-height: $size; } 100% { border-radius: 50%; - min-height: min(500px, 100vw); + min-height: $size; border-color: transparent; } } @@ -59,7 +58,7 @@ width: 90%; height: 0.625rem; margin: 2rem auto 3rem auto; - background-color: #ccc; + background-color: $fg-50; &--inner { width: 0; @@ -163,37 +162,38 @@ width: 85%; height: auto; opacity: 0; - filter: hue-rotate(310deg); } - &--loaded &__image { - animation: image-amination 70s forwards; + @media (min-width: 500px) and (min-height: 500px) { + &--loaded &__image { + animation: image-amination 1.2s ease-out forwards; - @keyframes image-amination { - 0% { - opacity: 0; - } - - 2% { - opacity: 1; - rotate: -60deg; - } + @keyframes image-amination { + 0% { + opacity: 0; + } - 100% { - opacity: 1; - rotate: -720deg; + 100% { + opacity: 1; + rotate: -180deg; + filter: hue-rotate(-70deg); + } } } } &--loaded { animation: loaded-animation 600ms forwards; - animation-delay: 600ms; + + @media (min-width: 500px) and (min-height: 500px) { + animation-delay: 600ms; + } @keyframes loaded-animation { to { background-color: transparent; - opacity: 0.3; + opacity: 0; + display: none; } } } diff --git a/static/sass/social-icon.scss b/static/sass/social-icon.scss new file mode 100644 index 0000000..5c2d323 --- /dev/null +++ b/static/sass/social-icon.scss @@ -0,0 +1,39 @@ +.icon { + position: relative; + + span { + width: 1em; + height: 1em; + /* Add dimensions to span */ + display: inline-block; + /* Add background color */ + background-color: currentColor; + /* Add mask image, use variable to reduce duplication */ + -webkit-mask-image: var(--svg); + mask-image: var(--svg); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + } + + &--linkedin { + --svg: url('.perseus/static/assets/svg/linkedin.svg'); + } + + &--github { + --svg: url('.perseus/static/assets/svg/github.svg'); + } + + &--instagram { + --svg: url('.perseus/static/assets/svg/instagram.svg'); + } + + &--facebook { + --svg: url('.perseus/static/assets/svg/facebook.svg'); + } + + &--youtube { + --svg: url('.perseus/static/assets/svg/youtube.svg'); + } +}