Compare commits

...

15 Commits

Author SHA1 Message Date
80f618cb53 Selection colors; removed prevent-select from most of the stuff since it may be uncomfortable for the user 2024-08-20 21:05:16 +03:00
5b39a91bdb Adaptive announcement size 2024-08-19 16:54:01 +03:00
03706b785a Fix: production builds break Icon component when SVGs are loaded as inline code. Adjusted vite.config.js. Updated the Node.js version in Dockerfile 2024-08-17 20:45:19 +03:00
0550f9e6dd Adjusted padding in footer (adaptive mode) 2024-08-16 23:25:35 +03:00
b90b7fdd66 Footer title line design tweaks 2024-08-15 09:38:35 +03:00
738ed45659 icon cleanup 2024-08-15 09:22:19 +03:00
054769158b announcement cleanup 2024-08-14 19:50:02 +03:00
726f610bb1 searchbar cleanup 2024-08-14 19:47:37 +03:00
ec7cb9d97b Spacer component removed (obsolete and unsed) 2024-08-14 19:46:05 +03:00
06da63caaf header & footer polish 2024-08-14 19:44:38 +03:00
e08264d81d Paddings for header and footer to make them match each other better 2024-08-14 18:53:35 +03:00
c9dbdc459f Renamed the container class to footer__social-notice-box 2024-08-14 18:09:50 +03:00
a15db2b4b8 Footer adaptive for galaxy fold; 2024-08-14 18:07:56 +03:00
884a61fa99 Removed spacer in footer and added additional social-notice area instead; uppercase titles in columns; proper column alignment; social notice text centered; copyright paddings added; adaptive up to 582px as of now 2024-08-13 09:33:09 +03:00
b91de98589 Cat footer icon 2024-08-13 09:10:09 +03:00
10 changed files with 205 additions and 149 deletions

View File

@@ -1,4 +1,4 @@
FROM node:22.5.1-alpine AS builder FROM node:22.6.0-alpine AS builder
WORKDIR /app WORKDIR /app
@@ -11,7 +11,7 @@ COPY . .
RUN npm run build --env-file=production.env RUN npm run build --env-file=production.env
RUN npm prune --omit=dev RUN npm prune --omit=dev
FROM node:22.5.1-alpine AS deployer FROM node:22.6.0-alpine AS deployer
WORKDIR /app WORKDIR /app

View File

@@ -1,9 +1,3 @@
<!--
announcement.svelte
used to display a short announcement at the top of the site
-->
<script> <script>
import { slide } from 'svelte/transition'; import { slide } from 'svelte/transition';
export let message; export let message;
@@ -15,13 +9,16 @@
</script> </script>
{#if visible} {#if visible}
<div transition:slide bind:this={noderef} class="announcement prevent-select" style="background-color: {color};"> <div transition:slide bind:this={noderef} class="announcement" style="background-color: {color};">
{#if link}
<a href={link}>{message}</a>
{:else}
{message}
{/if}
<span class="announcement__message">
{#if link}
<a href={link}>{message}</a>
{:else}
{message}
{/if}
</span>
<input class="close-button" type="button" value="" on:click={() => visible = false}> <input class="close-button" type="button" value="" on:click={() => visible = false}>
</div> </div>
{/if} {/if}
@@ -31,22 +28,39 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
gap: 5px; gap: 5px;
height: 36px; height: 36px;
}
.announcement__message {
font-size: min(2.9vw, 18px);
overflow: hidden;
white-space: nowrap;
text-size-adjust: auto;
font-size: 18px; font-size: 18px;
color: white; color: white;
/*TODO: selection color*/
}
.announcement__message::selection {
background-color: var(--col_panel);
} }
.close-button { .close-button {
height: 25px;
width: 25px;
cursor: pointer; cursor: pointer;
background-color: white; background-color: white;
object-fit: contain; object-fit: contain;
-webkit-mask-image: url('$lib/images/icons/ui/cross.svg'); -webkit-mask-image: url('$lib/images/icons/ui/cross.svg');
mask-image: url('$lib/images/icons/ui/cross.svg'); mask-image: url('$lib/images/icons/ui/cross.svg');
mask-repeat: no-repeat; mask-repeat: no-repeat;
mask-size: contain; mask-size: contain;
height: 25px;
width: 25px;
} }
a, a:visited, a:hover, a:active { a, a:visited, a:hover, a:active {

View File

@@ -4,18 +4,16 @@
import CatIcon from "$lib/images/icons/misc/cat.svg"; import CatIcon from "$lib/images/icons/misc/cat.svg";
import TelegramIcon from "$lib/images/icons/social/telegram.svg"; import TelegramIcon from "$lib/images/icons/social/telegram.svg";
import MatrixIcon from "$lib/images/icons/social/matrix.svg"; import MatrixIcon from "$lib/images/icons/social/matrix.svg";
import GiteaIcon from "$lib/images/icons/social/gitea.svg";
import DiscordIcon from "$lib/images/icons/social/discord.svg"; import DiscordIcon from "$lib/images/icons/social/discord.svg";
</script> </script>
<footer class="footer prevent-select"> <footer class="footer">
<div class="container"> <div class="footer__social-notice-box">
<p class="social-row footer__social-notice">Me on other resources:</p> <p class="social-row footer__social-notice-text">Me on other resources:</p>
</div> </div>
<div class="social-row footer__social-spacer"></div>
<div class="social-row footer__social-links"> <div class="social-row footer__social-links">
<Icon image={TelegramIcon} size="32px"/> <Icon image={TelegramIcon} size="32px"/>
<Icon image={MatrixIcon} size="32px"/> <Icon image={MatrixIcon} size="32px"/>
@@ -23,24 +21,25 @@
</div> </div>
<div class="footer-column footer__column1"> <div class="footer-column footer__column1">
<p class="footer-column-title">Мясо</p> <p class="footer-column-title">WeirdCat.su</p>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitrtempor invidunt ut aliquyam erat, sed diam voluptua. At vero eo</p> <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitrtempor invidunt ut aliquyam erat, sed diam voluptua. At vero eo</p>
</div> </div>
<div class="footer-column footer__column2"> <div class="footer-column footer__column2">
<p class="footer-column-title">Мясо</p> <p class="footer-column-title">Useful links</p>
<p>Buy a slave</p> <p>Buy a slave</p>
<p>Hire me please</p> <p>Hire me please</p>
<p>Buy me a coffee</p> <p>Buy me a coffee</p>
<p>Help</p> <p>Help</p>
</div> </div>
<div class="footer-column footer__column3"> <div class="footer-column footer__column3">
<p class="footer-column-title">Мясо</p> <p class="footer-column-title">Contact</p>
<p>Мясо</p> <p>nikolai@weirdcat.su</p>
<p>Мясо</p> <p>+7 999 999 99 99</p>
<Icon image={CatIcon} size="64px"/>
</div> </div>
<p class="footer__copyright">(C) WeirdCat 2024</p> <p class="footer__copyright">© WeirdCat 2024</p>
</footer> </footer>
@@ -54,26 +53,65 @@
.footer { .footer {
display: grid; display: grid;
grid-template-columns: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr 1fr;
grid-template-areas: "social-notice spacer social-links" grid-template-areas: "social-notice social-notice social-links"
"column1 column2 column3" "column1 column2 column3"
"copyright copyright copyright"; "copyright copyright copyright";
box-shadow: 0px 5px var(--col_footer_copyright); box-shadow: 0px 5px var(--col_footer_copyright);
background-color: var(--col_footer); background-color: var(--col_footer);
} }
.social-row { .social-row {
padding: 20px; padding: 20px;
background-color: var(--col_panel); background-color: var(--col_panel);
} }
.footer__social-notice-box {
grid-area: social-notice;
height: 100%;
margin: 0;
padding: inherit 40px;
line-height: 30px;
background-color: var(--col_panel);
}
.footer__social-notice-text {
display: inline-block;
vertical-align: middle;
margin: 0 auto;
padding: inherit 40px;
width: 100%;
font-family: 'Source_Sans_3' sans-serif;
font-weight: bold;
font-size: 20px;
line-height:1fr;
color: var(--col_text_panel);
}
.footer__social-links {
display: flex;
justify-content: right;
grid-area: social-links;
gap: 20px;
width: auto;
}
.footer-column { .footer-column {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-self: center;
gap: 20px; gap: 20px;
padding: 30px 90px; padding: 30px 20px;
font-family: "Montserrat" sans-serif; font-family: "Montserrat" sans-serif;
font-size: 20px; font-size: 20px;
@@ -85,79 +123,106 @@
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
padding: 0; padding: 0;
}
.footer__column1 {
grid-area: column1;
}
.footer__column2 {
grid-area: column2;
}
.footer__column3 {
grid-area: column3;
} }
.footer-column-title { .footer-column-title {
position: relative; position: relative;
padding-bottom: 5px; padding-bottom: 20px;
font-family: "Source_Sans_3" sans-serif; font-family: "Source_Sans_3" sans-serif;
font-weight: bold; font-weight: bold;
text-transform: uppercase;
} }
.footer-column-title::after { .footer-column-title::after {
content: ""; content: "";
background-color: var(--col_text_footer);
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
height: 2px; height: 2px;
width: 45%; width: 100px;
}
/*FIXME: Make another class title here*/
.container {
grid-area: social-notice;
color: var(--col_panel);
margin: 0;
}
.footer__social-notice {
margin: 0;
padding: 20px;
height: 32px;
font-family: 'Source_Sans_3' sans-serif;
font-weight: bold;
font-size: 20px;
color: var(--col_text_panel);
}
.footer__social-spacer {
grid-area: spacer;
width: auto;
}
.footer__social-links {
display: flex;
justify-content: right;
gap: 20px;
grid-area: social-links;
width: 1fr;
background-color: var(--col_text_footer);
} }
.footer__copyright { .footer__copyright {
grid-area: copyright; grid-area: copyright;
margin: auto 0 0 0; margin: auto 0 0 0;
padding: 10px;
height: fit-content; height: fit-content;
width: 100%;
font-family: "Montserrat" sans-serif; font-family: "Montserrat" sans-serif;
font-size: 24px; font-size: 24px;
color: var(--col_text_copyright);
text-align: center; text-align: center;
color: var(--col_text_copyright);
background-color: var(--col_footer_copyright); background-color: var(--col_footer_copyright);
} }
@media screen and (max-width: 800px) {
.footer {
grid-template-areas: "social-notice social-notice social-links"
"column1 column1 column1"
"column2 column2 column2"
"column3 column3 column3"
"copyright copyright copyright";
}
.footer-column
{
justify-content: center;
justify-items: center;
padding: 30px 20px;
max-width: 60%;
width: 100%;
text-align: center;
}
.footer-column > :global(.icon) {
align-self: center;
}
.footer-column-title::after {
left: 0;
width: 100%;
max-width: 100%;
}
}
@media screen and (max-width: 543px) {
.footer {
grid-template-areas: "social-links social-links social-links"
"column1 column1 column1"
"column2 column2 column2"
"column3 column3 column3"
"copyright copyright copyright";
}
.footer__social-notice-text {
display: none;
}
.footer__social-links {
justify-content: center;
gap: 10%;
margin: inherit 20px;
}
}
</style> </style>

View File

@@ -5,14 +5,14 @@
import MenuIcon from "$lib/images/icons/ui/menu.svg"; import MenuIcon from "$lib/images/icons/ui/menu.svg";
import LanguageIcon from "$lib/images/icons/ui/language.svg"; import LanguageIcon from "$lib/images/icons/ui/language.svg";
import DarkmodeIcon from "$lib/images/icons/ui/darkmode.svg"; import DarkmodeIcon from "$lib/images/icons/ui/darkmode.svg";
import Spacer from "./service/spacer.svelte";
import Searchbar from "./searchbar.svelte"; import Searchbar from "./searchbar.svelte";
</script> </script>
<header class="header prevent-select" data-sveltekit-preload-data="hover"> <header class="header" data-sveltekit-preload-data="hover">
<div class="container"> <div class="container header-left">
<Icon class="header__menu-button" image={MenuIcon} size="64px"/> <Icon class="header__menu-button" image={MenuIcon} size="64px"/>
<img class="header__logo" alt="WeirdCat.su" src={Logo}> <img class="header__logo" alt="WeirdCat.su" src={Logo}>
@@ -24,8 +24,8 @@
<Searchbar id="searchbar"/> <Searchbar id="searchbar"/>
<div class="container"> <div class="container header-right">
<Spacer type="left"/>
<Icon class="header__language-button" image={LanguageIcon} size="40px"/> <Icon class="header__language-button" image={LanguageIcon} size="40px"/>
<Icon class="header__darkmode-button" image={DarkmodeIcon} size="40px"/> <Icon class="header__darkmode-button" image={DarkmodeIcon} size="40px"/>
</div> </div>
@@ -39,17 +39,30 @@
align-items: center; align-items: center;
gap: 20px; gap: 20px;
padding: 5px 20px 5px 20px; padding: 5px 10px;
height: 74px; height: 74px;
background-color: var(--col_panel); background-color: var(--col_panel);
box-shadow: 0px 6px 5px -5px rgba(0,0,0,0.3); box-shadow: 0px 6px 5px -5px rgba(0,0,0,0.3);
} }
.container {
display: flex;
align-items: inherit;
justify-self: right;
padding: inherit;
gap: inherit;
}
.header-left {
margin-right: auto;
}
.header__logo { .header__logo {
height: 64px; height: 64px;
width: 64px; width: 64px;
} }
:global(.header__menu-button) { :global(.header__menu-button) {
@@ -66,11 +79,8 @@
color: var(--col_text_hint); color: var(--col_text_hint);
} }
.container { .header-right {
display: flex; justify-self: right;
align-items: inherit;
padding: inherit;
gap: inherit;
} }
@media only screen and (max-width: 1036px) { @media only screen and (max-width: 1036px) {
@@ -80,14 +90,12 @@
} }
@media only screen and (max-width: 935px) { @media only screen and (max-width: 935px) {
.header { .header {
grid-template-columns: auto auto 1fr; grid-template-columns: auto auto 1fr;
} }
} }
@media only screen and (max-width: 730px) { @media only screen and (max-width: 730px) {
.header { .header {
grid-template-columns: auto auto auto; grid-template-columns: auto auto auto;
} }
@@ -110,5 +118,4 @@
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
} }
} }
</style> </style>

View File

@@ -1,5 +1,3 @@
<!-- FIXME: deal with this mess in style property. You can't do all that right in your HTML -->
<script> <script>
export let image = ""; export let image = "";
export let onclick; export let onclick;
@@ -13,21 +11,23 @@
</script> </script>
<!-- FIXME: You horrible son of a goose--> <input class="{externalClasses} {Clickablility} icon prevent-select" type="button" value=""
<input class="{externalClasses} {Clickablility} icon" type="button" value="" style="--icon-image: url({image}); --icon-color: {color}; --icon-size: {size};"
style="--image: url({image}); --color: {color}; background-color: {color}; --size: {size};"
on:click={onclick ? onclick : null}> on:click={onclick ? onclick : null}>
<style> <style>
:global(.icon) { :global(.icon) {
background-color: var(--color);
height: var(--icon-size);
width: var(--icon-size);
background-color: var(--icon-color);
object-fit: contain; object-fit: contain;
-webkit-mask-image: var(--image); -webkit-mask-image: var(--icon-image);
mask-image: var(--image); mask-image: var(--icon-image);
mask-repeat: no-repeat; mask-repeat: no-repeat;
mask-size: contain; mask-size: contain;
height: var(--size);
width: var(--size);
} }
.clickable { .clickable {

View File

@@ -19,26 +19,25 @@
<style> <style>
.searchbar { .searchbar {
display: flex; display: flex;
align-items: center; align-items: center;
background-color: var(--col_panel_field);
border-radius: 30px;
width: auto; width: auto;
height: 36px; height: 36px;
padding: 10px; padding: 10px;
background-color: var(--col_panel_field);
border-radius: 30px;
} }
.searchbar__input { .searchbar__input {
border: none;
background-color: transparent;
color: var(--col_text_panel);
max-width: 200px; max-width: 200px;
font-size: 16px; font-size: 16px;
color: var(--col_text_panel);
background-color: transparent;
border: none;
} }
.searchbar__input:focus { .searchbar__input:focus {
@@ -50,7 +49,6 @@
} }
@media only screen and (max-width: 935px) { @media only screen and (max-width: 935px) {
.searchbar { .searchbar {
margin-left: auto; margin-left: auto;
} }
@@ -63,7 +61,6 @@
} }
@media only screen and (max-width: 730px) { @media only screen and (max-width: 730px) {
.searchbar { .searchbar {
margin-left: auto; margin-left: auto;
} }
@@ -73,11 +70,9 @@
.compact { .compact {
display: none; display: none;
} }
} }
@media only screen and (max-width: 506px) { @media only screen and (max-width: 506px) {
.searchbar { .searchbar {
margin-left: auto; margin-left: auto;
} }
@@ -88,5 +83,4 @@
display: flex; display: flex;
} }
} }
</style> </style>

View File

@@ -1,31 +0,0 @@
<script>
export let type = "left";
let rule = "";
if (type == "left") {
rule = "margin-left: auto";
}
if (type == "right") {
rule = "margin-right: auto";
}
if (type == "top") {
rule = "margin-top: auto";
}
if (type == "bottom") {
rule = "margin-bottom: auto";
}
if (type == "vertical") {
rule = "margin-top: auto; margin-bottom: auto";
}
if (type == "horizontal") {
rule = "margin-left: auto; margin-right: auto";
}
if (rule == "") {
console.error("Invalid spacer type: " + type);
}
</script>
<div class="spacer" style="{rule}"/>

View File

@@ -9,14 +9,16 @@
--col_accent: #5dc98e; --col_accent: #5dc98e;
--col_text: #000000; --col_text: #000000;
--col_text_select: #5dc98e;
--col_text_query: #ffffff; --col_text_query: #ffffff;
--col_text_invalid: #cc0000; --col_text_invalid: #cc0000;
--col_text_hint: #dedede; --col_text_hint: #dedede;
--col_text_panel: #ffffff; --col_text_panel: #ffffff;
--col_text_panel_select: #be4286;
--col_text_footer: #ffffff; --col_text_footer: #ffffff;
--col_text_footer_select: #5dc98e;
--col_text_copyright: #ffffff; --col_text_copyright: #ffffff;
--col_text_selection: #5dc98e;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -32,5 +34,5 @@ body {
::selection { ::selection {
color: var(--col_text_panel); color: var(--col_text_panel);
background: var(--col_text_selection); background: var(--col_text_select);
} }

View File

@@ -15,7 +15,7 @@
</script> </script>
<Announcement message="This site is yet in development" color="var(--col_accent)"/> <Announcement message="Lorem ipsum dolor sit ameto, consetetur sadipscing" color="var(--col_accent)"/>
<Header/> <Header/>
<main> <main>
<slot class="content"></slot> <slot class="content"></slot>
@@ -24,6 +24,6 @@
<style> <style>
main { main {
height: 100vh; height: 90vh;
} }
</style> </style>

View File

@@ -2,5 +2,10 @@ import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
export default defineConfig({ export default defineConfig({
build: {
assetsInlineLimit: (file) => {
return !file.endsWith('.svg');
}
},
plugins: [sveltekit()] plugins: [sveltekit()]
}); });