:root {
    /* https://paletton.com/#uid=4120N0kymrngCCipKvQFvkQQEcW */
    --primary-lighter: #ffe29d;
    --primary-light: #ffc53d;
    --primary: #da9900;
    --primary-dark: #996b00;
    --primary-darker: #3d2b00;

    --secondary-lighter: #b487d3;
    --secondary-light: #7c32ae;
    --secondary: #5a0892;
    --secondary-dark: #3f0467;
    --secondary-darker: #190029;

    --tertiary-lighter: #83d4b3;
    --tertiary-light: #2ab17a;
    --tertiary: #009459;
    --tertiary-dark: #00683e;
    --tertiary-darker: #002a19;

    --complement-lighter: #8d9bd4;
    --complement-light: #3a52b1;
    --complement: #112a94;
    --complement-dark: #081b68;
    --complement-darker: #010929;

    --standout-color: var(--tertiary);
    --standout-alt-color: var(--secondary);

    --font-color: var(--complement-darker);
    --font-emph-color: var(--secondary-darker);
    --background-color: var(--primary-lighter);
    --background-special-color: hsl(from var(--background-color) h s 90%);
    --font-alt-color: var(--complement-lighter);
    --font-alt-emph-color: var(--secondary-lighter);
    --background-alt-color: var(--primary-darker);

    --link-color: var(--tertiary-light);
    --link-background: var(--secondary-dark);
    --link-active-color: var(--tertiary-lighter);
    --link-active-background: var(--secondary);

    --border-color: var(--complement-light);
    --shadow-color: var(--complement-darker);
    --border-standout-color: var(--tertiary);

    --glass-color: var(--tertiary-lighter);
    --glass-border-color: hsl(from var(--glass-color) h s 80%);
    --glass-shadow-color: var(--tertiary-darker);

    @media (prefers-color-scheme: dark) {
        --font-color: var(--primary-lighter);
        --font-emph-color: var(--secondary-lighter);
        --background-color: var(--complement-darker);
        --background-special-color: hsl(from var(--background-color) h s 10%);

        --glass-color: var(--tertiary);
        --glass-border-color: hsl(from var(--glass-color) h s 40%);
        --glass-shadow-color: hsl(from var(--tertiary-darker) h s 5%);
    }
}

* {
    box-sizing: border-box;
}

/* Layout */

body {
    margin: 0;
    overflow-x: hidden;
    background-color: var(--background-color);
    color: var(--font-color);
    font-size: 1.2em;
}

.page-wrapper {
    display: flex;
    flex-direction: column;
    height: 100lvh;
}

main {
    flex: 1;
    max-width: min(50rem, 100vw);
    margin: auto;
    padding-inline: 0.5em;
}

.page-wrapper > footer {
    width: 100%;
    margin-block-start: 1em;
    border-block-start: 0.1em solid var(--border-color);
    padding: 1em;
    background-color: var(--background-special-color);
}

/* Base styling */

h1 {
    text-align: center;
}

h2 {
    text-align: center;
    margin-block: 0.5em;
}

p {
    margin-block: 0;
    text-align: justify;
    text-indent: 2em;
    &+ p {
        margin-block-start: 0.2em;
    }
}

hr {
    border-style: none;
    border-block-start: 0.1em ridge var(--font-color);
}

a {
    transition:
        color 0.2s ease-in-out,
        background-color 0.2s ease-in-out,
        text-shadow 0.1s ease-in;
    text-decoration: none;
    font-weight: bold;

    &:link,
    &:visited {
        color: var(--link-color)
    }

    &:hover {
        color: var(--link-active-color);
    }

    @media print {
        &[href]::after {
            text-transform: none;
            content: " (" attr(href) ")";
        }
    }
}

/* Navigation */

nav {
    &:has(ul) {
        margin-block: 0.5em;
        padding: 0.5em;
        position: relative;
        
        &::before {
            display: block;
            position: absolute;
            z-index: -1;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            border: 0.5px solid var(--glass-border-color);
            background-color: var(--glass-color);
            filter: drop-shadow(0.2em 0.2em 0.5em var(--glass-shadow-color)) opacity(0.1);
            content: "";
        }

        ul {
            list-style: none;
            margin: 0;
            padding: 0;
        }

        li {
            margin-block: 0.5em;
        }

        h2 {
            filter: drop-shadow(0 0 0.02em hsl(from var(--font-color) h s 90%));
        }
    }

    a {
        display: block;
        padding: 1em;
    
        @media (max-width: 767px) {
            padding: 1em 0.5em;
        }
    
        background-color: var(--link-background);
        border: 1px solid var(--link-background);
        text-transform: uppercase;
    
        &::before {
            display: inline-block;
            margin-inline-end: 0.2em;
            color: inherit;
            font-weight: normal;
            content: "⎆";
        }
    
        @media print {
            &[href]::after {
                /* Remove href from printing as there is no point in showing it for internal navigation. */
                content: normal;
            }
        }
    
        &:hover {
            text-shadow: 0 0 0.1em var(--link-active-color);
            background-color: var(--link-active-background);
        }
    
        &:active {
            text-shadow: 0 0 0.6em var(--link-active-color);
        }
    }

    &.backlink {
        display: block;
        /* Don't care about orientation, margin needs to be on top and left. */
        margin-top: 1em;
        margin-left: 0.5em;

        @media (min-width: 60rem) {
            position: absolute;
            float: left;
            writing-mode: sideways-lr;
        }

        @media print {
            display: none;
        }

        a {
            padding: 0.5em 1em;
            text-align: center;
        }
    }
}

/* Files and code */

.file {
    margin-block: 0.5em;
    margin-inline-end: auto;
    border-inline-start: 0.5em solid var(--border-standout-color);
    padding-inline-start: 1em;
    background-color: var(--background-alt-color);
    font-family: "Linux Libertine";
    
    .filename {
        display: inline-block;
        font-size: smaller;
        color: var(--font-alt-color);
    }
    .file-language {
        display: inline-block;
        font-size: smaller;
        font-style: italic;
        color: var(--font-alt-color);
    }
    .filename + .file-language::before {
        display: inline-block;
        position: relative;
        top: calc((1cap - 1ex) / 2);
        margin-inline-start: 0.5em;
        margin-inline-end: 0.2em;
        font-size: larger;
        font-style: normal;
        content: "⌑";
    }
}

pre {
    margin-block: 0.2em;
    margin-inline-start: -1em;
    padding-block: 0.2em;
    padding-inline-start: 1em;
    background-color: var(--background-special-color);
    overflow-x: auto;
    tab-size: 4;
    /* Prevent font size from being different (affects em). */
    font-family: inherit;
}

code,
kbd {
    font-family: "Fira Code", monospace;
}
code {
    font-size: 0.8em;

    .comment {
        color: var(--font-alt-color);
    }

    &[data-lang="sh"] {
        padding: 0.2em;
        background-color: var(--background-alt-color);
        color: var(--font-alt-color);
    
        &::before {
            font-style: normal;
            color: var(--font-alt-emph-color);
            content: "$ ";
        }
    }
}


/* Figures with images */

figure {
    max-width: 100%;
    width: fit-content;
    height: fit-content;
    margin: auto;
    margin-block: 0.5em;

    > img,
    > svg {
        display: block;
        max-width: 100%;
        margin: auto;
        border-style: ridge;
        border-width: 0.5em;
        border-color: var(--border-color);
        background-color: var(--background-color);
        filter: drop-shadow(0em 0.2em 0.2em var(--shadow-color));
    }

    figcaption {
        margin-block-start: 0.1em;
        border: 0.1em solid var(--border-color);
        padding: 0.2em;
        text-align: center;
        background-color: var(--background-color);
        filter: drop-shadow(0em 0.05em 0.05em var(--shadow-color));
    }
}
article > figure {
    width: fit-content;
}

/* Gallery */

.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
    grid-auto-rows: minmax(20rem, auto);
    gap: 1em;

    & > * {
        margin: auto;
    }
}

/* Links to source, license, etc. */

.original-reference {
    text-align: end;
}

.license {
    display: inline-block;

    a[href^="https://creativecommons.org/licenses/"]::before,
    a[href^="https://creativecommons.org/publicdomain/"]::before {
        display: inline-block;
        width: 1em;
        height: 1em;
        position: relative;
        top: 0.2em;
        margin-inline-end: 0.2em;
        background-image: url(/cc.svg);
        background-size: contain;
        background-repeat: no-repeat;
        content: "";

        @media print {
            display: hidden;
            background-image: none;
            content: none;
        }
    }
}

.fine-print {
    max-width: min(50rem, 100vw);
    margin: auto;
    color: var(--font-emph-color);
    text-align: center;
    font-size: smaller;
}

/* Quotes */

div:has(> blockquote) {
    margin-block: 0.5em;
    margin-inline: 1em;
    border-left-style: ridge;
    border-left-width: 0.4em;
    border-top-left-radius: 1em;
    border-bottom-left-radius: 1em;
    border-color: var(--border-color);
    padding: 0.5em 1em;

    &:has(> .quote-source) {
        padding-block-end: 0;
    }

    > blockquote {
        margin: 0;
    }

    &> blockquote:has(+ .quote-source) {
        margin-block-end: 0.2em;
    }

    .quote-source {
        text-align: end;

        &::after {
            display: block;
            width: 50%;
            margin-inline-start: auto;
            border-bottom-style: solid;
            border-color: var(--border-color);
            content: "";
        }
    }
}
