@layer reset, base, components;

/* Fonts */

@font-face {
    font-family: "Inter";
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url("fonts/inter-normal.woff2") format("woff2");
}

@font-face {
    font-family: "Inter";
    font-style: italic;
    font-weight: 100 900;
    font-display: swap;
    src: url("fonts/inter-italic.woff2") format("woff2");
}

@font-face {
    font-family: "Nunito Sans";
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url("fonts/nunito-sans-normal.woff2") format("woff2");
}

@font-face {
    font-family: "Nunito Sans";
    font-style: italic;
    font-weight: 100 900;
    font-display: swap;
    src: url("fonts/nunito-sans-italic.woff2") format("woff2");
}

@font-face {
    font-family: "Fira Code";
    font-style: normal;
    font-weight: 300 700;
    font-display: swap;
    src: url("fonts/fira-code-normal.woff2") format("woff2");
}

/* Design tokens, shared with the blog. `light-dark()` follows the reader's
   preferred colour scheme. */

:root {
    color-scheme: light dark;

    --color-off-white: oklch(99% 0.002 247.839deg);
    --color-slight-gray: rgb(250 250 250);
    --color-base-100: oklch(96.7% 0.003 264.542deg);
    --color-base-150: oklch(95.5% 0.004 261.325deg);
    --color-base-200: oklch(92.8% 0.006 264.531deg);
    --color-base-300: oklch(87.2% 0.01 258.338deg);
    --color-base-400: oklch(70.7% 0.022 261.325deg);
    --color-base-600: oklch(44.6% 0.03 256.802deg);
    --color-base-700: oklch(37.3% 0.034 259.733deg);
    --color-base-750: oklch(32.5% 0.033 261.692deg);
    --color-base-800: oklch(27.8% 0.033 256.848deg);
    --color-base-950: oklch(13% 0.028 261.692deg);

    --background: light-dark(var(--color-off-white), var(--color-base-800));
    --foreground: light-dark(var(--color-base-950), var(--color-base-200));
    --primary: light-dark(var(--color-base-800), var(--color-base-200));
    --primary-foreground: light-dark(
        var(--color-base-100),
        var(--color-base-800)
    );
    --border: light-dark(var(--color-base-200), var(--color-base-600));
    --list-disc: light-dark(var(--color-base-400), var(--color-base-600));
    --secondary: light-dark(var(--color-slight-gray), var(--color-base-750));
    --button: light-dark(var(--color-base-150), var(--color-base-700));
    --foreground-secondary: light-dark(
        var(--color-base-700),
        var(--color-base-300)
    );

    --font-text: "Nunito Sans", system-ui, sans-serif;
    --font-heading: "Inter", system-ui, sans-serif;
    --font-mono: "Fira Code", ui-monospace, consolas, monospace;
    --font-normal: 450;
    --font-medium: 500;
    --font-semibold: 600;
    --font-bold: 700;

    --leading-small: 1.25;
    --leading-snug: 1.375;
    --leading-normal: 1.5;
    --leading-relaxed: 1.75;

    --text-1: clamp(1.75rem, 1.5rem + 1.1vw, 2.25rem);
    --text-2: clamp(1.5rem, 1.3rem + 0.8vw, 1.875rem);
    --text-3: clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem);
    --text-4: clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem);
    --text-5: 1.125rem;
    --text-6: 1rem;
    --text-7: 0.875rem;
    --text-8: 0.75rem;

    --space-half: 0.125rem;
    --space-1: 0.25rem;
    --space-2: 0.5rem;
    --space-3: 0.75rem;
    --space-4: 1rem;
    --space-5: 1.25rem;
    --space-6: 1.5rem;
    --space-8: 2rem;
    --space-10: 2.5rem;
    --space-12: 3rem;
    --space-16: 4rem;
    --space-char: 65ch;

    --radius-medium: 0.375rem;
    --radius-large: 0.75rem;

    --width-lg: 1120px;
    --transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
}

/* ---- reset ---- */
@layer reset {
    *,
    *::before,
    *::after {
        box-sizing: border-box;
    }

    *:not(dialog) {
        margin: 0;
    }

    body {
        -webkit-font-smoothing: auto;
    }

    img,
    picture,
    video,
    canvas,
    svg {
        display: block;
        max-width: 100%;
        vertical-align: middle;
    }

    input,
    button,
    textarea,
    select {
        font: inherit;
    }

    p,
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
        overflow-wrap: break-word;
    }

    p {
        text-wrap: pretty;
    }

    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
        text-wrap: balance;
    }

    button {
        appearance: none;
        background: transparent;
        border: none;
        padding: 0;
        font: inherit;
        color: inherit;
        cursor: pointer;
    }
}

/* ---- base ---- */
@layer base {
    * {
        border-color: var(--border);
    }

    body {
        color: var(--foreground);
        background-color: var(--background);
        font-family: var(--font-text);
        font-weight: var(--font-normal);
        font-size: var(--text-5);
        line-height: var(--leading-normal);
    }

    main {
        display: flex;
        flex-direction: column;
        max-width: var(--width-lg);
        margin-inline: auto;
        padding-block-start: var(--space-8);
        padding-inline: var(--space-6);
    }

    .sr-only {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        white-space: nowrap;
        border: 0;
    }

    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
        font-family: var(--font-heading);
        font-weight: var(--font-semibold);
        line-height: var(--leading-small);
    }

    h1 {
        font-size: var(--text-1);
        margin: var(--space-10) 0 var(--space-6);
    }

    h2 {
        font-size: var(--text-2);
        margin: var(--space-8) 0 var(--space-5);
    }

    h3 {
        font-size: var(--text-3);
        margin: var(--space-6) 0 var(--space-4);
    }

    h4 {
        font-size: var(--text-4);
        margin: var(--space-5) 0 var(--space-3);
    }

    h5,
    h6 {
        font-size: var(--text-5);
        margin: var(--space-4) 0 var(--space-2);
    }

    h1:first-child,
    h2:first-child,
    h3:first-child {
        margin-block-start: 0;
    }

    p {
        margin-block-end: var(--space-4);
    }

    p:last-child {
        margin-block-end: 0;
    }

    a {
        color: var(--foreground);
        font-weight: var(--font-semibold);
        text-decoration: underline;
        text-underline-offset: var(--space-1);
        transition: color var(--transition-fast);
    }

    a:hover {
        color: var(--foreground-secondary);
    }

    ul,
    ol {
        padding-inline-start: var(--space-6);
        margin-block-end: var(--space-4);
    }

    li {
        margin-block-end: var(--space-1);
    }

    ul > li::marker {
        color: var(--list-disc);
    }

    code {
        font-family: var(--font-mono);
        font-weight: var(--font-medium);
        font-size: var(--text-6);
    }

    :not(pre) > code {
        background: color-mix(in srgb, currentColor 6%, transparent);
        padding: var(--space-half) var(--space-1);
        border-radius: var(--radius-medium);
        overflow-wrap: break-word;
    }
}

/* ---- components ---- */
@layer components {
    .navbar {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        justify-content: space-between;
        gap: var(--space-3) var(--space-6);
        margin-bottom: var(--space-8);
        font-family: var(--font-heading);
    }

    .navbar a {
        text-decoration: none;
    }

    .navbar a:hover {
        color: var(--foreground-secondary);
        text-decoration: underline;
    }

    .brand {
        text-align: center;
    }

    .brand img {
        margin-inline: auto;
        height: 160px;
    }

    .navbar-links {
        margin-left: auto;
        font-size: var(--text-5);
        font-weight: var(--font-semibold);
    }

    /* Repo list */
    .repo-list {
        border-top: 1px solid var(--border);
    }

    .repo-item {
        display: flex;
        flex-wrap: wrap;
        align-items: baseline;
        justify-content: space-between;
        gap: var(--space-2) var(--space-6);
        padding: var(--space-3) var(--space-1);
        border-bottom: 1px solid var(--border);
    }

    .repo-main {
        display: flex;
        flex-wrap: wrap;
        align-items: baseline;
        gap: var(--space-1) var(--space-3);
        min-width: 0;
    }

    .repo-name {
        font-family: var(--font-heading);
        font-size: var(--text-5);
        font-weight: var(--font-semibold);
        text-decoration: none;
    }

    .repo-name:hover {
        color: var(--foreground-secondary);
        text-decoration: underline;
    }

    .repo-desc {
        color: var(--foreground-secondary);
        font-size: var(--text-7);
    }

    .repo-meta {
        display: flex;
        align-items: center;
        gap: var(--space-4);
        color: var(--foreground-secondary);
        font-size: var(--text-7);
        white-space: nowrap;
    }

    .repo-hash {
        font-family: var(--font-mono);
        font-weight: var(--font-medium);
        font-size: var(--text-7);
        color: var(--foreground-secondary);
    }

    /* Repo page */
    .breadcrumb {
        font-size: var(--text-7);
        margin-bottom: var(--space-3);
    }

    .breadcrumb a {
        color: var(--foreground-secondary);
        text-decoration: none;
    }

    .breadcrumb a:hover {
        color: var(--foreground);
        text-decoration: underline;
    }

    .repo-head h1 {
        margin-bottom: var(--space-1);
    }

    .repo-desc,
    .repo-license {
        color: var(--foreground-secondary);
        font-size: var(--text-6);
    }

    .card {
        border: 1px solid var(--border);
        border-radius: var(--radius-large);
        background-color: var(--secondary);
    }

    .meta {
        padding: var(--space-5) var(--space-6);
        margin-block: var(--space-6);
    }

    .meta h2 {
        margin: var(--space-5) 0 var(--space-2);
        font-family: var(--font-text);
        font-size: var(--text-8);
        font-weight: var(--font-semibold);
        letter-spacing: 0.06em;
        text-transform: uppercase;
        color: var(--foreground-secondary);
    }

    .meta h2:first-child {
        margin-top: 0;
    }

    .meta dl {
        display: grid;
        grid-template-columns: max-content 1fr;
        gap: var(--space-1) var(--space-4);
        font-size: var(--text-7);
    }

    .meta dt {
        color: var(--foreground-secondary);
    }

    .meta dd {
        margin: 0;
        overflow-wrap: anywhere;
    }

    .links {
        margin: 0;
        padding-inline-start: var(--space-5);
        font-size: var(--text-7);
    }

    .clone {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        gap: var(--space-2);
    }

    .clone code {
        flex: 1 1 18rem;
        min-width: 0;
        overflow-x: auto;
        white-space: nowrap;
        padding: var(--space-2) var(--space-3);
        background: var(--background);
        border: 1px solid var(--border);
        border-radius: var(--radius-medium);
        font-size: var(--text-7);
    }

    .clone button {
        padding: var(--space-2) var(--space-4);
        border: 1px solid var(--border);
        border-radius: var(--radius-medium);
        background: var(--button);
        font-family: var(--font-text);
        font-size: var(--text-7);
        font-weight: var(--font-semibold);
    }

    .clone button:hover {
        background: var(--primary);
        color: var(--primary-foreground);
        border-color: var(--primary);
    }

    /* README */
    .readme {
        /*max-width: var(--space-char);*/
        margin-top: var(--space-4);
    }

    .readme > :first-child {
        margin-top: 0;
    }

    .readme h1 {
        font-size: var(--text-2);
        margin: var(--space-8) 0 var(--space-4);
    }

    .readme h2 {
        font-size: var(--text-3);
        font-weight: var(--font-bold);
        margin: var(--space-8) 0 var(--space-4);
    }

    .readme h3 {
        margin: var(--space-6) 0 var(--space-3);
    }

    .readme p,
    .readme ul,
    .readme ol,
    .readme figure,
    .readme blockquote,
    .readme pre,
    .readme table,
    .readme aside {
        margin-bottom: var(--space-4);
    }

    .readme li {
        padding-inline-start: var(--space-1);
    }

    .readme blockquote {
        padding-inline-start: var(--space-4);
        border-left: 4px solid var(--border);
        color: var(--foreground-secondary);
        font-style: italic;
    }

    .readme img,
    .readme svg,
    .readme video {
        max-width: 100%;
        height: auto;
        border-radius: var(--radius-medium);
    }

    /* Keep images inline so badges and images in prose do not stack. An image
       alone in its paragraph acts as a figure and is centered. */
    .readme img {
        display: inline-block;
    }

    .readme p:has(> img:only-child),
    .readme p:has(> a:only-child > img:only-child) {
        text-align: center;
    }

    .readme table {
        width: 100%;
        border-collapse: collapse;
        border-radius: var(--radius-medium);
        overflow: hidden;
        box-shadow: 0 0 0 1px var(--border);
        background-color: var(--secondary);
        font-size: var(--text-7);
    }

    .readme thead {
        background-color: var(--button);
    }

    .readme th,
    .readme td {
        padding: var(--space-2);
        border-bottom: 1px solid var(--border);
        text-align: center;
    }

    .readme tbody tr:last-child td {
        border-bottom: 0;
    }

    .readme pre:not(.lumis) {
        padding: var(--space-4);
        background: var(--secondary);
        border: 1px solid var(--border);
        border-radius: var(--radius-medium);
        overflow-x: auto;
    }

    .readme pre:not(.lumis) code {
        background: none;
        padding: 0;
    }

    /* Empty and error states */
    .empty {
        color: var(--foreground-secondary);
        font-style: italic;
    }

    .notfound {
        max-width: var(--space-char);
        margin-block: var(--space-12);
    }

    .site-footer {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        justify-content: space-between;
        gap: var(--space-3);
        margin-top: var(--space-16);
        padding-block: var(--space-4);
        border-top: 1px solid var(--border);
        font-size: var(--text-7);
        color: var(--foreground-secondary);
    }

    .site-footer a {
        color: inherit;
    }
}
