aboutsummaryrefslogtreecommitdiffstats
path: root/htdocs/src/scss/layout
diff options
context:
space:
mode:
Diffstat (limited to 'htdocs/src/scss/layout')
-rw-r--r--htdocs/src/scss/layout/_footer.scss24
-rw-r--r--htdocs/src/scss/layout/_grid.scss44
-rw-r--r--htdocs/src/scss/layout/_header.scss121
-rw-r--r--htdocs/src/scss/layout/_main.scss109
-rw-r--r--htdocs/src/scss/layout/_nav.scss64
-rw-r--r--htdocs/src/scss/layout/_toolbar.scss30
6 files changed, 392 insertions, 0 deletions
diff --git a/htdocs/src/scss/layout/_footer.scss b/htdocs/src/scss/layout/_footer.scss
new file mode 100644
index 0000000..776ea57
--- /dev/null
+++ b/htdocs/src/scss/layout/_footer.scss
@@ -0,0 +1,24 @@
+@use "../abstracts/functions" as fun;
+@use "../abstracts/mixins" as mix;
+
+.footer {
+ background: fun.get-var(color-bg-secondary);
+ padding: fun.get-var(spacing-sm) fun.get-var(spacing-md)
+ calc(#{fun.get-var(toolbar-height)} + #{fun.get-var(spacing-sm)});
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ padding: fun.get-var(spacing-sm) fun.get-var(spacing-md);
+ }
+ }
+}
+
+.copyright {
+ align-items: center;
+ display: flex;
+ flex-flow: row wrap;
+ font-family: fun.get-var(font-family-secondary);
+ font-size: fun.get-var(font-size-md);
+ gap: fun.get-var(spacing-3xs);
+ justify-content: center;
+}
diff --git a/htdocs/src/scss/layout/_grid.scss b/htdocs/src/scss/layout/_grid.scss
new file mode 100644
index 0000000..5a61f1a
--- /dev/null
+++ b/htdocs/src/scss/layout/_grid.scss
@@ -0,0 +1,44 @@
+@use "../abstracts/functions" as fun;
+@use "../abstracts/mixins" as mix;
+
+.body {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ grid-template-rows: minmax(0, 1fr) max-content;
+ height: 100vh;
+ position: relative;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ grid-template-columns: 1.5fr 4fr;
+ }
+
+ @include mix.dimensions("xl") {
+ grid-template-columns: 1fr 4fr;
+ }
+ }
+}
+
+.header {
+ grid-column: 1;
+ grid-row: 1;
+ overflow-y: auto;
+ width: 100%;
+}
+
+.main {
+ grid-column: 1;
+ grid-row: 1 / -1;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ grid-column: 2;
+ }
+ }
+}
+
+.footer {
+ grid-column: 1;
+ grid-row: 2;
+ width: 100%;
+}
diff --git a/htdocs/src/scss/layout/_header.scss b/htdocs/src/scss/layout/_header.scss
new file mode 100644
index 0000000..622a100
--- /dev/null
+++ b/htdocs/src/scss/layout/_header.scss
@@ -0,0 +1,121 @@
+@use "../abstracts/functions" as fun;
+
+.header {
+ background: fun.get-var(color-bg-secondary);
+ padding: fun.get-var(spacing-md)
+ clamp(#{fun.get-var(spacing-md)}, 3vw, #{fun.get-var(spacing-lg)});
+ z-index: 5;
+}
+
+.branding {
+ margin-bottom: fun.get-var(spacing-sm);
+ text-align: center;
+
+ &__title {
+ font-family: fun.get-var(font-family-secondary);
+ font-size: fun.get-var(font-size-3xl);
+ font-weight: 500;
+ margin: fun.get-var(spacing-xs) 0;
+ }
+
+ &__link {
+ background: linear-gradient(
+ to top,
+ fun.get-var(color-primary-light) fun.convert-px(5),
+ transparent fun.convert-px(5)
+ )
+ center / 0 100% no-repeat;
+ text-decoration: none;
+ transition: all 0.5s ease-in-out 0s;
+
+ &:hover,
+ &:focus {
+ background-size: 100% 100%;
+ }
+
+ &:active {
+ background-size: 0 100%;
+ }
+ }
+
+ &__description {
+ font-family: fun.get-var(font-family-secondary);
+ font-size: fun.get-var(font-size-md);
+ font-weight: 400;
+ letter-spacing: fun.convert-px(1);
+ margin: 0;
+ text-transform: uppercase;
+ }
+}
+
+.logo {
+ margin: auto;
+ position: relative;
+ width: max-content;
+
+ &__image {
+ backface-visibility: hidden;
+ border: fun.convert-px(3) solid fun.get-var(color-border-light);
+ border-radius: 50%;
+ box-shadow: 0 0 fun.convert-px(6) fun.convert-px(1)
+ fun.get-var(color-shadow-darker);
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+
+ &--back {
+ transform: rotateY(180deg);
+ }
+ }
+
+ &__link {
+ display: block;
+ height: clamp(#{fun.convert-px(75)}, 15vmin, #{fun.convert-px(90)});
+ transform-style: preserve-3d;
+ transition: all 0.6s linear 0s;
+ width: clamp(#{fun.convert-px(75)}, 15vmin, #{fun.convert-px(90)});
+
+ &:hover,
+ &:focus {
+ outline: none;
+ transform: rotateY(180deg);
+ }
+
+ &:hover &,
+ &:focus & {
+ &__image {
+ &---front {
+ transform: none;
+ }
+
+ &--back {
+ transform: rotateY(180deg);
+ }
+ }
+ }
+
+ &:focus & {
+ &__image {
+ box-shadow: 0 0 fun.convert-px(6) fun.convert-px(1)
+ fun.get-var(color-shadow-dark),
+ 0 0 0 fun.convert-px(5) fun.get-var(color-primary-light-opacity);
+ outline: none;
+ }
+ }
+
+ &:active & {
+ &__image {
+ box-shadow: 0 0 fun.convert-px(6) fun.convert-px(1)
+ fun.get-var(color-shadow-dark),
+ 0 0 0 fun.convert-px(7) fun.get-var(color-primary-light-opacity);
+ }
+ }
+ }
+
+ &:hover & {
+ &__link {
+ transform: rotateY(180deg);
+ }
+ }
+}
diff --git a/htdocs/src/scss/layout/_main.scss b/htdocs/src/scss/layout/_main.scss
new file mode 100644
index 0000000..9adb18d
--- /dev/null
+++ b/htdocs/src/scss/layout/_main.scss
@@ -0,0 +1,109 @@
+@use "../abstracts/functions" as fun;
+@use "../abstracts/mixins" as mix;
+@use "../abstracts/placeholders";
+
+.main {
+ display: flex;
+ flex-flow: column nowrap;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ display: grid;
+ grid-template-columns: 5fr 2fr;
+ }
+
+ @include mix.dimensions("xl") {
+ grid-template-columns: 4fr 1fr;
+ }
+ }
+}
+
+.instructions {
+ align-items: center;
+ background: fun.get-var(color-bg);
+ display: flex;
+ height: 100%;
+ justify-content: center;
+ padding: fun.get-var(spacing-md);
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ grid-column: 1 / -1;
+ }
+ }
+}
+
+.project-preview {
+ background: fun.get-var(color-bg);
+ flex: 1;
+ width: 100%;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ height: 100%;
+ }
+ }
+
+ iframe {
+ border: 0;
+ height: 100%;
+ width: 100%;
+ }
+}
+
+.project-details {
+ background: fun.get-var(color-bg-secondary);
+ display: flex;
+ flex-flow: column nowrap;
+ font-size: fun.get-var(font-size-sm);
+ padding: fun.get-var(spacing-md) fun.get-var(spacing-md)
+ calc(#{fun.get-var(toolbar-height)} + #{fun.get-var(spacing-md)});
+
+ @include mix.media("screen") {
+ @include mix.dimensions("lg") {
+ font-size: fun.get-var(font-size-md);
+ }
+ }
+
+ .list {
+ &--tech {
+ padding-left: fun.get-var(spacing-sm);
+ }
+
+ &--repos {
+ @extend %flex-list;
+
+ gap: fun.get-var(spacing-xs);
+ }
+
+ &__link {
+ background-repeat: no-repeat;
+ background-size: contain;
+ box-shadow: 0 0 0 0 fun.get-var(color-shadow);
+ display: block;
+ height: fun.convert-px(50);
+ transition: transform 0.3s ease-in-out 0s,
+ box-shadow 0.15s ease-in-out 0.15s;
+ width: fun.convert-px(50);
+
+ &--github {
+ background: url(#{fun.encode-svg('<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path style="fill:#1b1817;fill-opacity:1;opacity:1;stroke-width:6.55748" d="M0 0h100v100H0z"/><path d="M50.003 15.864C69.33 15.864 85 31.534 85 50.865c0 15.464-10.028 28.581-23.936 33.211-1.75.32-2.389-.76-2.389-1.689 0-.829.03-3.031.047-5.951 9.736 2.114 11.79-4.693 11.79-4.693 1.592-4.044 3.887-5.12 3.887-5.12 3.178-2.17-.241-2.127-.241-2.127-3.513.247-5.36 3.607-5.36 3.607-3.123 5.348-8.193 3.803-10.187 2.907-.318-2.26-1.22-3.803-2.222-4.677 7.772-.883 15.943-3.887 15.943-17.299 0-3.82-1.365-6.944-3.604-9.391.361-.886 1.563-4.444-.341-9.263 0 0-2.94-.941-9.626 3.588-2.791-.778-5.786-1.164-8.762-1.177-2.972.013-5.967.4-8.762 1.177-6.682-4.53-9.615-3.588-9.615-3.588-1.91 4.82-.71 8.377-.348 9.263-2.243 2.447-3.6 5.571-3.6 9.391 0 13.446 8.185 16.405 15.982 17.271-1.257 1.08-2.376 3.216-2.376 6.482 0 4.678.043 8.453.043 9.6 0 .937-.63 2.027-2.407 1.685C25.02 79.433 15 66.324 15 50.865c0-19.331 15.672-35.001 35.003-35.001" style="fill:#fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:.999999"/></svg>')});
+ }
+
+ &--gitlab {
+ background: url(#{fun.encode-svg('<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path style="opacity:1;fill:#ccc;fill-opacity:1;stroke-width:7.26231" d="M0 0h100v100H0z"/><path class="st3" d="m49.998 82.237 12.895-39.668H37.121Z" style="fill:#e24329;stroke-width:1"/><path class="st4" d="M19.058 42.57 15.13 54.62a2.67 2.67 0 0 0 .966 2.984l33.9 24.632Z" style="fill:#fca326;stroke-width:1"/><path class="st3" d="M19.058 42.57H37.12l-7.774-23.89c-.398-1.222-2.132-1.222-2.544 0z" style="fill:#e24329;stroke-width:1"/><path class="st4" d="m80.956 42.57 3.914 12.05a2.67 2.67 0 0 1-.966 2.984L49.998 82.237Z" style="fill:#fca326;stroke-width:1"/><path class="st3" d="M80.956 42.57H62.894l7.759-23.89c.398-1.222 2.132-1.222 2.544 0z" style="fill:#e24329;stroke-width:1"/><path style="fill:#fc6d26;stroke-width:4.82321" class="st5" d="m50.017 82.237 30.94-39.667H62.893Zm-.019 0L19.058 42.57H37.12z"/></svg>')});
+ }
+
+ &:hover,
+ &:focus {
+ box-shadow: fun.convert-px(-1) fun.convert-px(1) fun.convert-px(4)
+ fun.convert-px(2) fun.get-var(color-shadow-light);
+ transform: scale(1.15);
+ }
+
+ &:active {
+ opacity: 1;
+ }
+ }
+ }
+}
diff --git a/htdocs/src/scss/layout/_nav.scss b/htdocs/src/scss/layout/_nav.scss
new file mode 100644
index 0000000..f4508d0
--- /dev/null
+++ b/htdocs/src/scss/layout/_nav.scss
@@ -0,0 +1,64 @@
+@use "../abstracts/functions" as fun;
+@use "../abstracts/placeholders";
+
+.nav {
+ text-align: center;
+
+ &__label {
+ font-weight: 600;
+ }
+
+ &__list {
+ @extend %reset-list;
+
+ .btn {
+ width: 100%;
+ }
+ }
+
+ &__link {
+ &--back {
+ display: inline-block;
+ margin: fun.get-var(spacing-sm) 0;
+
+ &::before {
+ content: "\1F810";
+ display: inline-block;
+ text-decoration: none;
+ }
+ }
+
+ &--app {
+ background: fun.get-var(color-bg);
+ border: fun.convert-px(1) solid fun.get-var(color-border);
+ display: block;
+ padding: fun.get-var(spacing-2xs);
+ position: relative;
+ text-decoration: none;
+ transition: all 0.3s ease-in-out 0s;
+ width: 100%;
+
+ &:hover,
+ &:focus {
+ background: fun.get-var(color-primary);
+ color: fun.get-var(color-fg-inverted);
+ }
+
+ &:active {
+ background: fun.get-var(color-bg);
+ color: fun.get-var(color-primary-dark);
+ text-decoration: fun.convert-px(1) solid underline;
+ }
+ }
+ }
+
+ &__item:not(:first-child) & {
+ &__link {
+ border-top: 0;
+ }
+ }
+
+ .btn {
+ margin: auto;
+ }
+}
diff --git a/htdocs/src/scss/layout/_toolbar.scss b/htdocs/src/scss/layout/_toolbar.scss
new file mode 100644
index 0000000..585b3e6
--- /dev/null
+++ b/htdocs/src/scss/layout/_toolbar.scss
@@ -0,0 +1,30 @@
+@use "../abstracts/functions" as fun;
+
+.toolbar {
+ align-items: center;
+ background: fun.get-var(color-primary);
+ bottom: 0;
+ color: fun.get-var(color-fg-inverted);
+ display: flex;
+ flex-flow: row wrap;
+ gap: fun.get-var(spacing-xs);
+ height: fun.get-var(toolbar-height);
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+
+ & > &__options {
+ background: fun.get-var(color-primary);
+ color: fun.get-var(color-fg-inverted);
+ font-size: fun.get-var(font-size-sm);
+ height: 85%;
+ padding: 0 fun.get-var(spacing-sm);
+
+ &:hover,
+ &:focus {
+ background: fun.get-var(color-bg);
+ color: fun.get-var(color-primary);
+ }
+ }
+}