From c1e28224aa2e1450031669d9a7e359b63e04687d Mon Sep 17 00:00:00 2001 From: Volpeon Date: Wed, 22 Jul 2026 19:40:59 +0200 Subject: Init --- src/styles/components/_home-banner.scss | 39 +++++++ src/styles/components/_logo.scss | 81 +++++++++++++ src/styles/components/_site-footer.scss | 157 ++++++++++++++++++++++++++ src/styles/components/_site-footer.vars.scss | 34 ++++++ src/styles/components/_site-header.scss | 136 ++++++++++++++++++++++ src/styles/components/_site-header.vars.scss | 14 +++ src/styles/components/_site-nav.scss | 30 +++++ src/styles/components/_subtitle.scss | 11 ++ src/styles/components/_visited-indicator.scss | 27 +++++ 9 files changed, 529 insertions(+) create mode 100644 src/styles/components/_home-banner.scss create mode 100644 src/styles/components/_logo.scss create mode 100644 src/styles/components/_site-footer.scss create mode 100644 src/styles/components/_site-footer.vars.scss create mode 100644 src/styles/components/_site-header.scss create mode 100644 src/styles/components/_site-header.vars.scss create mode 100644 src/styles/components/_site-nav.scss create mode 100644 src/styles/components/_subtitle.scss create mode 100644 src/styles/components/_visited-indicator.scss (limited to 'src/styles/components') diff --git a/src/styles/components/_home-banner.scss b/src/styles/components/_home-banner.scss new file mode 100644 index 0000000..660cd9b --- /dev/null +++ b/src/styles/components/_home-banner.scss @@ -0,0 +1,39 @@ +@use "sass:map"; +@use "sass:string"; +@use "sass:meta"; + +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; +@use "pkg:iro-design" as iro; + +@use "site-header.vars" as site-header; + +@mixin styles { + @include bem.component("home-banner") { + @include bem.elem("intro") { + margin-block-start: 0; + font-size: clamp(props.get(iro.$core--font-size--500), 5.3vw, 5rem); + font-weight: 300; + color: props.get(iro.$core--theme, --text); + line-height: 1.2; + + strong { + font-family: props.get(iro.$core--font--headline--family); + font-weight: 900; + text-transform: uppercase; + letter-spacing: 2px; + color: props.get(iro.$core--theme, --heading); + } + } + + @include iro.media--media("<=md") { + @include bem.elem("intro") { + font-size: props.get(iro.$core--font-size--500); + } + + @include bem.elem("buttons") { + justify-content: center; + } + } + } +} diff --git a/src/styles/components/_logo.scss b/src/styles/components/_logo.scss new file mode 100644 index 0000000..3450817 --- /dev/null +++ b/src/styles/components/_logo.scss @@ -0,0 +1,81 @@ +@use "sass:map"; +@use "sass:string"; + +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; +@use "pkg:iro-design" as iro; + +@mixin styles { + @include bem.component("logo") { + display: block; + padding: props.get(iro.$core--size--50); + margin-inline: calc(-1 * props.get(iro.$core--size--50)); + border-radius: props.get(iro.$s-links--rounding); + color: props.get(iro.$core--theme, --heading); + + &:link, + &:visited { + &:hover { + text-decoration: none; + color: props.get(iro.$core--theme, --text-mute); + } + + &:focus-visible { + color: props.get(iro.$s-links--key-focus--text-color); + text-decoration: none; + outline: props.get(iro.$s-links--key-focus--border-color) solid + props.get(iro.$s-links--key-focus--border-width); + box-shadow: 0 0 0 + calc( + props.get(iro.$s-links--key-focus--border-width) + + props.get(iro.$s-links--key-focus--outline-width) + ) + props.get(iro.$s-links--key-focus--outline-color); + } + } + + @include bem.elem("img") { + display: block; + block-size: 1.7em; + aspect-ratio: 2700 / 600; + } + + @include bem.modifier("sm") { + @include bem.elem("img") { + aspect-ratio: 600 / 600; + } + } + + @include bem.modifier("lg") { + @include bem.elem("img") { + block-size: 2em; + } + } + + @each $theme in map.keys(props.get(iro.$core--transparent-colors)) { + $logo-theme: static-#{string.slice($theme, 3)}; + + @include bem.modifier($logo-theme) { + color: props.get(iro.$core--transparent-colors, $theme, --900); + + &:link, + &:visited { + &:hover { + color: props.get(iro.$core--transparent-colors, $theme, --800); + } + + &:focus-visible { + color: props.get(iro.$core--transparent-colors, $theme, --900); + outline-color: props.get(iro.$core--transparent-colors, $theme, --900); + box-shadow: 0 0 0 + calc( + props.get(iro.$s-links--key-focus--border-width) + + props.get(iro.$s-links--key-focus--outline-width) + ) + props.get(iro.$core--transparent-colors, $theme, --300); + } + } + } + } + } +} diff --git a/src/styles/components/_site-footer.scss b/src/styles/components/_site-footer.scss new file mode 100644 index 0000000..33608ff --- /dev/null +++ b/src/styles/components/_site-footer.scss @@ -0,0 +1,157 @@ +@use "sass:math"; +@use "sass:meta"; + +@use "pkg:iro-design" as iro; +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; + +@forward "site-footer.vars"; +@use "site-footer.vars" as vars; + +@mixin styles { + @include iro.props--materialize-at-root(meta.module-variables("vars")); + + @property --site-footer--l1-y { + initial-value: 0px; + inherits: true; + syntax: ""; + } + + @property --site-footer--cloud-y { + initial-value: 0px; + inherits: true; + syntax: ""; + } + + @property --site-footer--moon-y { + initial-value: 0px; + inherits: true; + syntax: ""; + } + + @property --site-footer--star-y { + initial-value: 0px; + inherits: true; + syntax: ""; + } + + @keyframes footer-l1-ani { + from { + --site-footer--l1-y: -300px; + --site-footer--cloud-y: -400px; + --site-footer--moon-y: -500px; + --site-footer--star-y: -500px; + } + to { + --site-footer--l1-y: 300px; + --site-footer--cloud-y: 400px; + --site-footer--moon-y: 500px; + --site-footer--star-y: 500px; + } + } + + @include bem.component("site-footer") { + position: sticky; + inset-block-start: 100%; + + @include bem.elem("banner") { + position: relative; + display: flex; + block-size: 33rem; + justify-content: end; + overflow: hidden; + background: linear-gradient( + to bottom, + props.get(vars.$colors, --bg-from) 35%, + props.get(vars.$colors, --bg) 85% + ); + + animation-name: footer-l1-ani; + //animation-fill-mode: both; + animation-duration: 1ms; + animation-timeline: view(block 0% 0%); + animation-timing-function: linear; + } + + @include bem.elem("banner-img") { + position: relative; + z-index: 2; + flex: 0 0 auto; + display: block; + block-size: 100%; + margin-inline: auto; + aspect-ratio: 3840 / 1600; + } + + @include bem.elem("banner-bg") { + position: absolute; + inset-inline-start: 50%; + inset-block-end: 0; + z-index: 1; + display: block; + inline-size: 100%; + block-size: 100%; + transform: translateX(-50%); + } + + @include bem.elem("content-wrap") { + padding-block-end: props.get(iro.$core--size--400); + background-color: props.get(iro.$core--transparent-colors, --black, --900); + } + + @include bem.elem("content") { + display: flex; + flex-wrap: wrap; + gap: props.get(iro.$core--size--600); + } + + @include bem.elem("sections") { + display: flex; + flex-wrap: wrap; + gap: props.get(iro.$core--size--400) props.get(iro.$core--size--800); + } + + @include bem.elem("table") { + display: grid; + grid-template-columns: auto auto auto auto; + column-gap: props.get(iro.$core--size--200); + } + + @include bem.elem("table-row") { + display: contents; + } + + @include bem.elem("divider") { + display: none; + } + + @include bem.elem("logo") { + margin-block: auto; + margin-inline-start: auto; + } + + @include iro.media--media("<=md") { + @include bem.elem("content") { + flex-direction: column; + align-items: center; + } + + @include bem.elem("divider") { + display: flex; + inline-size: 100%; + } + + @include bem.elem("logo") { + margin-inline-start: 0; + } + } + + @include iro.media--media("<=sm") { + transform: translateY(calc(-1 * props.get(iro.$o-navbar--block-size))); + + @include bem.elem("banner-img") { + transform: translateX(max(0rem, 19rem - 50vw)); + } + } + } +} diff --git a/src/styles/components/_site-footer.vars.scss b/src/styles/components/_site-footer.vars.scss new file mode 100644 index 0000000..0b2f968 --- /dev/null +++ b/src/styles/components/_site-footer.vars.scss @@ -0,0 +1,34 @@ +@use "pkg:iro-design/core.vars" as core; +@use "pkg:iro-design/objects/backdrop.vars" as backdrop; +@use "pkg:iro-sass/props"; + +$colors: props.def( + --site-footer, + ( + --bg-from: props.get(core.$theme, --bg-l1), + --bg: props.get(core.$theme, --bg-l1), + --star: transparent, + --cloud: props.get(core.$theme, --base, --50), + --l1: props.get(core.$theme, --bg-base), + --dragon-awake: props.get(core.$transparent-colors, --black, --900), + --dragon-asleep--eye: transparent, + --dragon-asleep: transparent, + --fg: props.get(core.$transparent-colors, --black, --900), + ), + "color" +); + +$colors--dark: props.def( + --site-footer, + ( + --bg: props.get(core.$theme, --bg-l2), + --star: #fff, + --cloud: props.get(core.$theme, --base, --100), + --l1: props.get(core.$theme, --bg-l1), + --dragon-awake: transparent, + --dragon-asleep--eye: #fff, + --dragon-asleep: #000, + --fg: #000, + ), + "dark" +); diff --git a/src/styles/components/_site-header.scss b/src/styles/components/_site-header.scss new file mode 100644 index 0000000..d23fa7c --- /dev/null +++ b/src/styles/components/_site-header.scss @@ -0,0 +1,136 @@ +@use "sass:math"; +@use "sass:meta"; + +@use "pkg:iro-design" as iro; +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; + +@forward "site-header.vars"; +@use "site-header.vars" as vars; + +@mixin styles { + @include iro.props--materialize-at-root(meta.module-variables("vars")); + + @include bem.component("site-header") { + position: sticky; + inset-block-start: 0; + z-index: props.get(vars.$z-index); + display: flex; + gap: props.get(vars.$spacing); + align-items: center; + line-height: 1.4; + block-size: props.get(vars.$block-size); + padding-inline: props.get(iro.$l-container--pad-i); + background-color: props.get(iro.$core--theme, --bg-l1); + overflow: hidden; + transition: + background-color 0.2s ease, + opacity 0.2s ease, + transform 0.2s ease, + visibility 0s linear 0.2s; + + @include bem.at-theme("js") { + background-color: transparent; + } + + @include bem.modifier("hidden") { + margin-block-start: calc(-1 * props.get(vars.$block-size)); + opacity: 0; + visibility: hidden; + transform: translateY(-0.2em); + + @include bem.is("scroll") { + transition: + background-color 0.2s ease, + opacity 0.2s ease, + transform 0.2s ease, + visibility 0s linear; + visibility: visible; + opacity: 1; + transform: none; + } + } + + @include bem.modifier("end") { + background-color: props.get(iro.$core--transparent-colors, --black, --900); + } + + @include bem.is("scroll") { + background-color: props.get(iro.$core--theme, --base, --50); + } + + @include bem.elem("logo") { + @include bem.modifier("sm") { + display: none; + } + } + + @include bem.elem("nav", "back") { + margin-inline-end: calc(-1 * props.get(vars.$nav-pull)); + } + + @include bem.elem("back") { + display: none; + } + + @include bem.elem("spacer") { + margin-inline-start: auto; + } + + @include bem.elem("slot") { + display: contents; + + @include bem.modifier("sm") { + display: none; + } + } + + @include iro.media--media("<=sm") { + @include bem.elem("logo") { + display: none; + + @include bem.modifier("sm") { + display: block; + } + } + + @include bem.elem("nav") { + display: none; + } + + @include bem.elem("back") { + display: block; + } + + @include bem.elem("slot") { + @include bem.modifier("end") { + display: none; + } + + @include bem.modifier("sm") { + display: contents; + } + } + + @include bem.modifier("end") { + @include bem.elem("logo") { + display: block; + + @include bem.modifier("sm") { + display: none; + } + } + + @include bem.elem("slot") { + @include bem.modifier("sm") { + display: none; + } + } + } + } + + @include iro.media--media("height<=500px") { + position: relative; + } + } +} diff --git a/src/styles/components/_site-header.vars.scss b/src/styles/components/_site-header.vars.scss new file mode 100644 index 0000000..282e944 --- /dev/null +++ b/src/styles/components/_site-header.vars.scss @@ -0,0 +1,14 @@ +@use "pkg:iro-design/core.vars" as core; +@use "pkg:iro-design/objects/backdrop.vars" as backdrop; +@use "pkg:iro-sass/props"; + +$z-index: props.def(--c-site-header--z-index, calc(props.get(backdrop.$z-index) - 10)); +$block-size: props.def(--c-site-header--block-size, props.get(core.$size--800)); +$spacing: props.def(--c-site-header--spacing, props.get(core.$size--500)); +$nav-pull: props.def(--c-site-header--nav-pull, props.get(core.$size--300)); + +$spacing--md: props.def(--c-site-header--spacing, props.get(core.$size--400), "md"); +$nav-pull--md: props.def(--c-site-header--nav-pull, props.get(core.$size--200), "md"); + +$block-size--sm: props.def(--c-site-header--block-size, props.get(core.$size--700), "sm"); +$spacing--sm: props.def(--c-site-header--spacing, props.get(core.$size--300), "sm"); diff --git a/src/styles/components/_site-nav.scss b/src/styles/components/_site-nav.scss new file mode 100644 index 0000000..99a8afc --- /dev/null +++ b/src/styles/components/_site-nav.scss @@ -0,0 +1,30 @@ +@use "sass:math"; +@use "sass:meta"; + +@use "pkg:iro-design" as iro; +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; + +@mixin styles { + @include bem.component("site-nav-placeholder") { + block-size: props.get(iro.$o-navbar--block-size); + + @include iro.media--media(">sm") { + display: none; + } + } + + @include bem.component("site-nav") { + position: fixed; + inset-block-end: 0; + inset-inline: 0; + z-index: calc(props.get(iro.$o-backdrop--z-index) - 10); + background-color: props.get(iro.$core--transparent-colors, --black, --900); + //border-block-start: 1px solid props.get(iro.$core--theme, --border-mute); + overflow-x: auto; + + @include iro.media--media(">sm") { + display: none; + } + } +} diff --git a/src/styles/components/_subtitle.scss b/src/styles/components/_subtitle.scss new file mode 100644 index 0000000..e9a40bb --- /dev/null +++ b/src/styles/components/_subtitle.scss @@ -0,0 +1,11 @@ +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; +@use "pkg:iro-design" as iro; + +@mixin styles { + @include bem.component("subtitle") { + margin-block-start: props.get(iro.$s-implicit--paragraph--margin-bs); + color: props.get(iro.$core--theme, --text-mute-more); + font-size: props.get(iro.$core--font-size--300); + } +} diff --git a/src/styles/components/_visited-indicator.scss b/src/styles/components/_visited-indicator.scss new file mode 100644 index 0000000..7aa1f38 --- /dev/null +++ b/src/styles/components/_visited-indicator.scss @@ -0,0 +1,27 @@ +@use "pkg:iro-sass/bem"; +@use "pkg:iro-sass/props"; +@use "pkg:iro-design" as iro; + +@mixin styles { + @include bem.component("with-visited-indicator") { + @include bem.elem("indicator") { + block-size: 1.4em; + color: props.get(iro.$core--theme, --text); + + &::after { + content: ""; + display: block; + block-size: 100%; + inline-size: props.get(iro.$core--border-width--thick); + border-radius: 10em; + background-color: currentColor; + } + } + + &:visited { + @include bem.elem("indicator") { + color: props.get(iro.$core--theme, --border-mute); + } + } + } +} -- cgit v1.3.1