Files
pages/src/routes/+layout.svelte

449 lines
14 KiB
Svelte
Raw Normal View History

<script>
import Header from "$lib/viewport/header.svelte";
import Footer from "$lib/viewport/footer.svelte";
2025-04-03 21:38:34 +02:00
let { children } = $props();
</script>
2026-02-21 14:47:28 +01:00
<svelte:head>
<meta name="robots" content="noai, noimageai">
</svelte:head>
2025-04-01 21:30:20 +02:00
<div class="waters"></div>
<div class="all-content-container">
<Header />
{@render children()}
<Footer />
</div>
2025-04-03 21:38:34 +02:00
<style>
2026-01-21 11:05:03 +01:00
/* #region New Fonts */
/* Bai Jamjuree. wght: 200-700 */
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/extralight.ttf");
font-weight: 200;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/extralight-italic.ttf");
font-weight: 200;
font-style: italic;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/light.ttf");
font-weight: 300;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/light-italic.ttf");
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/regular.ttf");
font-weight: 400;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/italic.ttf");
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/medium.ttf");
font-weight: 500;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/medium-italic.ttf");
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/semibold.ttf");
font-weight: 600;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/semibold-italic.ttf");
font-weight: 600;
font-style: italic;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/bold.ttf");
font-weight: bold;
}
@font-face {
font-family: "Bai Jamjuree";
src: url("/fonts/bai-jamjuree/bold-italic.ttf");
font-weight: bold;
font-style: italic;
}
/* Kode Mono. wght: 400-700 */
@font-face {
font-family: "Kode Mono";
src: url("/fonts/kode-mono/variable-wght.ttf");
font-weight: 400 700;
font-style: normal;
}
/* OpenMoji */
@font-face {
font-family: "OpenMoji";
src: url("/fonts/openmoji/openmoji.woff2") format("woff2");
unicode-range: U+23,U+2A,U+2D,U+30-39,U+A9,U+AE,U+200D,U+203C,U+2049,U+20E3,U+2117,U+2120,U+2122,U+2139,U+2194-2199,U+21A9,U+21AA,U+229C,U+231A,U+231B,U+2328,U+23CF,U+23E9-23F3,U+23F8-23FE,U+24C2,U+25A1,U+25AA-25AE,U+25B6,U+25C0,U+25C9,U+25D0,U+25D1,U+25E7-25EA,U+25ED,U+25EE,U+25FB-25FE,U+2600-2605,U+260E,U+2611,U+2614,U+2615,U+2618,U+261D,U+2620,U+2622,U+2623,U+2626,U+262A,U+262E,U+262F,U+2638-263A,U+2640,U+2642,U+2648-2653,U+265F,U+2660,U+2663,U+2665,U+2666,U+2668,U+267B,U+267E,U+267F,U+2691-2697,U+2699,U+269B,U+269C,U+26A0,U+26A1,U+26A7,U+26AA,U+26AB,U+26B0,U+26B1,U+26BD,U+26BE,U+26C4,U+26C5,U+26C8,U+26CE,U+26CF,U+26D1,U+26D3,U+26D4,U+26E9,U+26EA,U+26F0-26F5,U+26F7-26FA,U+26FD,U+2702,U+2705,U+2708-270D,U+270F,U+2712,U+2714,U+2716,U+271D,U+2721,U+2728,U+2733,U+2734,U+2744,U+2747,U+274C,U+274E,U+2753-2755,U+2757,U+2763,U+2764,U+2795-2797,U+27A1,U+27B0,U+27BF,U+2934,U+2935,U+2B05-2B07,U+2B0C,U+2B0D,U+2B1B,U+2B1C,U+2B1F-2B24,U+2B2E,U+2B2F,U+2B50,U+2B55,U+2B58,U+2B8F,U+2BBA-2BBC,U+2BC3,U+2BC4,U+2BEA,U+2BEB,U+3030,U+303D,U+3297,U+3299,U+E000-E009,U+E010,U+E011,U+E040-E06D,U+E080-E0B4,U+E0C0-E0CC,U+E0FF-E10D,U+E140-E14A,U+E150-E157,U+E181-E189,U+E1C0-E1C4,U+E1C6-E1D9,U+E200-E216,U+E240-E269,U+E280-E283,U+E2C0-E2C4,U+E2C6-E2DA,U+E300-E303,U+E305-E30F,U+E312-E316,U+E318-E322,U+E324-E329,U+E32B,U+E340-E348,U+E380,U+E381,U+F000,U+F77A,U+F8FF,U+FE0F,U+1F004,U+1F0CF,U+1F10D-1F10F,U+1F12F,U+1F16D-1F171,U+1F17E,U+1F17F,U+1F18E,U+1F191-1F19A,U+1F1E6-1F1FF,U+1F201,U+1F202,U+1F21A,U+1F22F,U+1F232-1F23A,U+1F250,U+1F251,U+1F260-1F265,U+1F300-1F321,U+1F324-1F393,U+1F396,U+1F397,U+1F399-1F39B,U+1F39E-1F3F0,U+1F3F3-1F3F5,U+1F3F7-1F4FD,U+1F4FF-1F53D,U+1F549-1F54E,U+1F550-1F567,U+1F56F,U+1F570,U+1F573-1F57A,U+1F587,U+1F58A-1F58D,U+1F590,U+1F595,U+1F596,U+1F5A4,U+1F5A5,U+1F5A8,U+1F5B1,U+1F5B2,U+1F5BC,U+1F5C2-1F5C4,U+1F5D1-1F5D3,U+1F5DC-1F5DE,U+1F5E1,U+1F5E3,U+1F5E8,U+1F5EF,U+1F5F3,U+1F5FA-1F64F,U+1F680-1F6C5,U+1F6CB-1F6D2,U+1F6D5-1F6D7,U+1F6DC-1F6E5,U+1F6E9,U+1F6EB,U+1F6EC,U+1F6F0,U+1F6F3-1F6FC,U+1F7E0-1F7EB,U+1F7F0,U+1F90C-1F93A,U+1F93C-1F945,U+1F947-1F9FF,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FBC5-1FBC9,U+E0061-E0067,U+E0069,U+E006C-E0079,U+E007F;
}
2026-01-21 11:05:03 +01:00
/* #endregion */
2025-04-01 21:30:20 +02:00
2025-04-04 19:00:47 +02:00
:global {
2025-04-01 21:30:20 +02:00
:root {
2026-02-12 16:21:20 +01:00
/* colours */
2025-04-18 16:15:00 +02:00
--color-text: #d0d0d0;
2026-02-02 20:50:57 +01:00
--color-text-secondary: #b0b0b0;
2025-04-03 20:01:00 +02:00
--color-text-img: invert(98%) sepia(1%) saturate(4643%) hue-rotate(297deg) brightness(115%) contrast(76%);
2025-04-01 22:25:10 +02:00
--color-text-dark: #1e1e1e;
2025-12-30 20:33:09 +00:00
--color-highlight: #51B86B;
--color-highlight-dark: color-mix(in srgb, var(--color-highlight) 60%, black);
--color-highlight-alt: #d03b4a;
2025-12-30 20:33:09 +00:00
--color-header: color-mix(in srgb, var(--color-highlight) 80%, black);
--color-header-highlight: color-mix(in srgb, #6d1e26 80%, transparent);
2025-04-01 22:25:10 +02:00
2026-01-20 22:12:55 +01:00
--color-background: #111111;
2025-04-01 22:25:10 +02:00
--color-background-highlight: color-mix(in srgb, var(--color-highlight) 10%, transparent);
2025-04-03 20:01:00 +02:00
--color-background-highlight-hover: color-mix(in srgb, var(--color-highlight) 60%, transparent);
--color-background-highlight-hover-dark: color-mix(in srgb, var(--color-highlight-dark) 60%, transparent);
2025-04-01 22:25:10 +02:00
2026-01-20 22:12:55 +01:00
--color-waters: #242424;
2025-04-04 10:37:25 +02:00
--color-link-unvisited: #c2e8ff;
--color-link-visited: #ffd7f0;
--color-link-hovered: #ffdad5;
2025-04-04 19:00:47 +02:00
2026-02-12 16:21:20 +01:00
/* blurs */
2026-02-12 15:44:41 +01:00
--blur-radius-background: 6px;
2026-02-12 16:21:20 +01:00
/* borders */
--border-style: dashed;
--border-dash-size: 2px;
--underline-dash-size: 1px;
2026-02-12 16:21:20 +01:00
/* durations */
--duration-animation: 0.1s;
--duration-blur: 0.2s;
2026-01-21 12:32:47 +01:00
/* fonts */
--font-line-height: 1.6rem;
2026-01-21 12:32:47 +01:00
--font-sans-serif: 'Bai Jamjuree', 'OpenMoji', sans-serif;
2026-01-21 12:32:47 +01:00
--font-size-sans-serif: 1.1rem;
--font-mono: 'Kode Mono', 'OpenMoji', monospace;
2026-01-21 12:32:47 +01:00
--font-size-mono: 0.9em;
--font-size-h1: 2.0rem;
--font-size-h2: 1.5rem;
--font-size-h3: 1.3rem;
--font-size-h4: 1.2rem;
2025-07-14 12:12:30 +02:00
--margin-header-top: 16px;
--margin-header-bottom: 8px;
2026-01-30 20:28:23 +01:00
/* sizing */
--media-width: 80%;
2026-01-21 12:32:47 +01:00
/* page sizing */
2026-03-06 15:11:06 +01:00
--page-width: 1200px;
--screen-width-mobile: 800px;
--margin-content-side: 24px;
2026-02-12 16:21:20 +01:00
/* misc */
--notch-size: 32px;
--notch-size-small: 16px;
2025-04-01 21:30:20 +02:00
}
2025-04-01 22:25:10 +02:00
html {
scroll-behavior: smooth;
position: relative;
min-height: 100%;
}
body {
2025-04-04 19:00:47 +02:00
font-family: var(--font-sans-serif);
font-size: 1.2rem;
2025-04-01 21:30:20 +02:00
color: var(--color-text); /* text colour */
2025-07-14 12:12:30 +02:00
margin: 0;
2025-04-01 21:30:20 +02:00
background-color: var(--color-background);
}
.all-content-container {
display: flex;
flex-direction: column;
2026-01-10 19:40:32 +01:00
height: 100vh;
/* max-width: 100%; */
}
2025-04-01 21:30:20 +02:00
.waters {
position: fixed;
z-index: -99;
top: 0;
left: 0;
height: 100%;
width: 100%;
background-color: var(--color-waters);
mask-image: url('/bremen-waters-white.svg');
2025-04-01 21:30:20 +02:00
mask-position: center;
background-position: center;
background-attachment: fixed;
}
p, span, li, pre, a {
color: var(--color-text);
2026-01-21 12:32:47 +01:00
font-size: var(--font-size-sans-serif);
line-height: var(--font-line-height);
margin: 12px 0;
2025-07-14 12:12:30 +02:00
font-weight: 400;
}
button {
background-color: transparent;
border: none;
padding: 0;
}
/* #region Headers */
/* All headers */
h1, h2, h3, h4, h5, h6 {
font-weight: 700;
font-family: var(--font-mono);
color: var(--color-highlight);
margin-top: var(--margin-header-top);
margin-bottom: var(--margin-header-bottom);
width: fit-content;
}
h2 + h3, h3 + h4, h4 + h5, h5 + h6 {
/* Remove top margin when a header immediately preceds another header */
margin-top: 0;
}
/* Individual header settings */
h1 {
font-size: var(--font-size-h1);
line-height: var(--font-size-h1);
}
h2 {
font-size: var(--font-size-h2);
line-height: var(--font-size-h2);
}
h2::before {
content: '> ';
margin-right: 12px;
}
h3 {
font-size: var(--font-size-h3);
line-height: var(--font-size-h3);
}
h3::before {
content: '>> ';
margin-right: 4px;
}
h4, h5, h6 {
font-size: var(--font-size-h4);
line-height: var(--font-size-h4);
}
h4::before {
letter-spacing: -0.26rem;
content: '>>> ';
margin-right: 14px;
}
/* #endregion */
hr {
width: 100%;
height: 1px;
border: none;
border-top: var(--border-dash-size) var(--border-style) var(--color-highlight);
margin: 8px 0;
}
2025-04-04 10:37:25 +02:00
code, .code-block {
2025-04-04 19:00:47 +02:00
font-family: var(--font-mono);
2026-01-21 12:32:47 +01:00
font-size: var(--font-size-mono);
line-height: var(--font-line-height);
2025-04-18 16:15:00 +02:00
font-weight: 500;
background-color: var(--color-background-highlight);
backdrop-filter: blur(var(--blur-radius-background));
/* color: var(--color-background); */
border-radius: 8px;
padding-left: 6px;
padding-right: 6px;
}
img, video {
margin-left: auto;
margin-right: auto;
display: flex;
max-height: 400px;
object-fit: contain;
}
img {
width: var(--media-width);
}
video {
max-width: var(--media-width);
margin-top: 12px;
margin-bottom: 12px;
/* padding: 8px;
backdrop-filter: blur(var(--blur-radius-background));
border: var(--border-dash-size) var(--border-style) var(--color-highlight); */
}
.horizontally-centre-aligned {
2026-01-30 20:28:23 +01:00
width: var(--media-width);
display: flex;
justify-content: center;
align-items: center;
margin-left: auto;
margin-right: auto;
}
2025-04-27 19:24:41 +02:00
.inline-img-left {
float: left;
max-width: 24%;
margin: 0 24px 24px 0;
}
.inline-img-right {
float: right;
max-width: 24%;
margin: 0 0 24px 24px;
}
a:link {
color: var(--color-link-unvisited);
text-decoration-thickness: var(--underline-dash-size);
2026-02-21 14:52:56 +01:00
text-decoration-color: transparent;
text-decoration-style: var(--border-style);
2026-02-25 23:23:06 +01:00
font-weight: 500;
}
/* visited link */
a:visited {
color: var(--color-link-visited);
}
/* mouse over link */
a:hover {
color: var(--color-link-hovered);
2026-02-21 14:52:56 +01:00
text-decoration-color: var(--color-link-hovered);
}
2025-04-04 10:37:25 +02:00
.notched {
clip-path: polygon(
0% var(--notch-size),
var(--notch-size) 0%,
calc(100% - var(--notch-size)) 0%,
100% var(--notch-size),
100% calc(100% - var(--notch-size)),
calc(100% - var(--notch-size)) 100%,
var(--notch-size) 100%,
0% calc(100% - var(--notch-size))
);
}
.notched-small {
clip-path: polygon(
0% var(--notch-size-small),
var(--notch-size-small) 0%,
calc(100% - var(--notch-size-small)) 0%,
100% var(--notch-size-small),
100% calc(100% - var(--notch-size-small)),
calc(100% - var(--notch-size-small)) 100%,
var(--notch-size-small) 100%,
0% calc(100% - var(--notch-size-small))
);
}
.pixelated-img {
image-rendering: pixelated;
}
2026-02-02 20:50:57 +01:00
.small-supertext {
font-size: 0.7rem;
line-height: 0.7rem;
vertical-align: super;
}
/* #region Lists (ul and LinkList) */
.list, ul {
padding: 0;
2026-02-08 17:45:30 +01:00
display: table;
}
.list a, li {
2025-08-16 21:40:51 +02:00
width: 100%;
list-style-type: none;
2026-02-08 17:45:30 +01:00
display: table-row;
}
.list a::before, li::before {
content: "";
font-family: var(--font-mono);
font-weight: bold;
color: var(--color-highlight);
2026-02-08 17:45:30 +01:00
display: table-cell;
padding-left: 12px;
padding-right: 8px;
}
.list a:hover::before {
content: ">";
}
.list a:link, .list a:visited, li {
color: var(--color-text);
text-decoration: none;
}
.list a:hover {
color: var(--color-highlight);
2025-08-16 21:40:51 +02:00
}
.list img {
filter: var(--color-text-img);
margin-top: 4px;
margin-bottom: -4px;
width: fit-content !important;
margin-left: 0;
margin-right: 0;
display: inline;
2025-08-10 20:39:54 +02:00
}
/* #endregion */
2026-02-06 18:50:58 +01:00
.date-marker {
font-size: 1rem;
font-weight: 700;
line-height: 1rem;
width: fit-content;
margin: 0;
padding: 0;
color: var(--color-text-dark);
background-color: var(--color-highlight);
font-family: var(--font-sans-serif);
padding: 4px;
}
}
</style>