/*** Variables ***/

:root {
    --tree-indent-width: 3.2rem;
    --button-bar-icon-size: 2.8rem;
}

/*** Breadcrumbs ***/

.breadcrumbs {
    list-style-type: none;
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;

    height: min-content;

    margin: 0;
    padding: 0;

    align-items: center;
}

.breadcrumb {
    opacity: 70%;
}

.breadcrumb::before {
    content: "";
    display: inline-block;

    background-image: var(--icon-breadcrumb);
    background-repeat: no-repeat;
    background-position: 50% 50%;
    opacity: 70%;

    width: 3.6rem;
    height: 1.7rem;

    vertical-align: text-bottom;
}

.breadcrumb a {
    font-family: var(--font-code);
    --recursive-mono: 1;
    font-weight: 500;

    color: var(--text-color);
    text-decoration: none;
}

.breadcrumb a:hover {
    text-decoration: underline;
}

.breadcrumbs > .root-breadcrumb {
    display: none; /* only when main logo is hidden */
    margin-right: -0.8rem;

    & a,
    & svg {
        display: block;
    }

    & .logo {
        /* NOTE: px used for pixel perfection */
        width: 48px;
        height: 48px;
        padding: 0.8rem;
        color: var(--text-color);
    }
}

@media (max-width: 450px) {
    .breadcrumbs > .root-breadcrumb {
        display: block;
    }
}

/*** Tree ***/

.tree {
    --tree-indent-guide-dim: transparent;
    --tree-indent-guide-highlighted: transparent;

    display: flex;
    flex-direction: column;

    align-self: start;
    align-items: center;

    & > article {
        padding: 1.6rem;
        width: 100%;
    }

    & > footer {
        max-width: none;
    }
}

.tree:has(.branch-container:hover) {
    --tree-indent-guide-highlighted: var(--border-1);
}

@media (hover: none) {
    .tree {
        --tree-indent-guide-dim: var(--border-1);
        --tree-indent-guide-highlighted: var(--border-1);
    }
}

/* Use an indent level appropriate for the viewport. */
.tree ul {
    --tree-responsive-indent-width: clamp(
        0.8rem,
        2vw,
        var(--tree-indent-width)
    );

    /* Draw indent guides. */
    padding-left: calc(var(--tree-responsive-indent-width) / 2);
    margin-left: calc(var(--tree-responsive-indent-width) / 2);
    border-left: 0.1rem solid var(--tree-indent-guide-dim);

    transition: border-left-color var(--transition-duration);
}

.tree details:has(.branch-container:hover) > ul {
    border-left-color: var(--tree-indent-guide-highlighted);
}

/* Top level should not have an indent or a border. */
.tree article > ul {
    padding-left: 0;
    margin-left: 0;
    border-left: none;
}

.tree details {
    /* Disable the rightwards chevron in <details> elements */
    & > summary {
        list-style: none;
        cursor: pointer;

        &::-webkit-details-marker {
            display: none;
        }
    }
}

/* Child branches */
.tree li {
    /* <li> elements should not have any bullet points or whatever */
    list-style: none;

    /* Stretch branch content to the full width of the page */
    & > div,
    & > details {
        width: 100%;
    }

    /* Add an underline for leaf branches */
    & > div {
        box-sizing: border-box;

        margin-bottom: -0.1rem;
        border-bottom: 0.1rem solid transparent;
        transition: border-bottom-color var(--transition-duration);

        &:hover {
            border-bottom-color: var(--border-1);
        }
    }

    & > div,
    & > details > summary {
        /* Child elements are laid out horizontally in a flexbox. */
        display: flex;
        align-items: center;
    }
}

/* <summary> is used for the visual content of branches with children. It's the large horizontal bar
    and notably *excludes* children. */
.tree details > summary {
    /* Slightly round for elegance */
    border-radius: 0.8rem;

    /* Give it a shaded background on hover */
    background-color: transparent;
    transition: background-color var(--transition-duration);

    &:hover {
        background-color: var(--shaded-background);
    }
}

/* For media without hover functionality, draw a bottom border everywhere as a visual anchor for where to tap */
@media (hover: none) {
    .tree li > div:first-child,
    .tree li > details > summary:first-child {
        border-bottom: 0.1rem solid var(--border-1);
    }

    .tree details > summary {
        /* In that case summaries shall not be rounded. */
        border-radius: 0;
    }
}

/* The following three elements - bp, bc, and bb - are there in all branches, regardless of their parent. */

/* bp - bullet point */
th-bp {
    display: block;
    width: var(--tree-indent-width);
    height: 2.8rem;

    background-image: var(--icon-leaf);
    background-repeat: no-repeat;
    background-position: 50% 50%;

    /* Prevent shrinkage when viewport is too low */
    flex-shrink: 0;
}

/* Change image of th-bp if it has children and/or is collapsible */
.tree details[open] > summary > th-bp {
    background-image: var(--icon-collapse);
}

.tree details:not([open]) > summary > th-bp {
    background-image: var(--icon-expand);
}

/* bc - branch content */
th-bc {
    display: block;
    padding-top: 0.6rem;
    padding-bottom: 0.6rem;

    /* Lines that are too long get very hard to read. */
    width: 100%;
    max-width: 72em;

    /* Bit of a hack to make <pre>s in <th-bc> have scrollbars proper. */
    &:has(pre, th-literate-program) {
        overflow: hidden;
    }
}

/* Display a chevron hinting that the collapsed branch has more content in its children. */
.tree details:not([open])>summary>th-bc>:last-child,
/* NOTE: Linked branches have a slightly different structure (extra <noscript> tag) and therefore
   :last-child does not work. */
.tree li[th-link]>details:not([open])>summary>th-bc>:nth-last-child(2) {
    &::after {
        content: "\00A0";
        display: inline-block;

        background-image: var(--icon-more);
        background-repeat: no-repeat;
        background-position: 50% 50%;

        width: 1.6rem;
        height: 1.2em;

        vertical-align: text-bottom;
        margin-left: 0.5em;

        margin-right: -2.25rem;
    }
}

/* Display a [draft] pill for branches that are drafts. */
.tree li.draft {
    & > details > summary > th-bc::before,
    & > div > th-bc::before {
        content: "draft";

        display: block;
        width: min-content;

        background-color: #058ef0;
        color: #ffffff;
        padding: 0.4rem 1.2rem;
        margin-bottom: 0.4rem;
        border-radius: 100rem;
    }
}

/* bb - button bar */
th-bb {
    height: 100%;
    margin: 0.4rem;

    /* Should be displayed on the top of the branch rather than in the middle. */
    align-self: start;
    flex-grow: 1;

    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: end;

    /* Keep the button bar invisible by default. */
    opacity: 0%;
    transition: opacity var(--transition-duration);
}

/* When the parent is hovered over, display the button bar. */
.tree *:hover > th-bb {
    opacity: 100%;
}

/* For media without hover functionality, th-bb should always be visible. */
@media (hover: none) {
    :root {
        --button-bar-icon-size: 3.6rem;
    }

    .tree th-bb {
        opacity: 100%;

        /* Replace margin with button size to make it easier to click. */
        margin: 0;

        & a.icon {
            width: 3.6rem;
            height: 3.6rem;
        }
    }
}

/* Style branch dates to be smaller and less noticable. */
th-bd {
    opacity: 50%;
    font-size: 0.8em;
    font-variant-numeric: tabular-nums;
}

/* Hide branch dates on very small displays. No clue how to fix this just yet. */
@media (max-width: 600px) {
    th-bd {
        display: none;
    }
}

/* Icons (used in the button bar) */
.tree {
    & .icon {
        background-repeat: no-repeat;
        background-position: 50% 50%;
        opacity: 35%;

        width: var(--button-bar-icon-size);
        height: var(--button-bar-icon-size);
    }

    & .icon-permalink {
        background-image: var(--icon-permalink);
    }

    & .icon-go {
        background-image: var(--icon-go);
    }
}

/* Style the loading text to not be too attention grabbing. */
.tree .link-loading {
    padding-left: 1.75em;
    opacity: 50%;
}

/* Highlight branch selected by # or ? in URL.
    The latter is not supported by CSS so we use some auxiliary JavaScript to add a .target class
    to the element highlighted by ?. */
.tree :target {
    & > details > summary,
    & > div {
        background-color: var(--shaded-background);
        background: linear-gradient(
            to right,
            transparent 12.5%,
            var(--shaded-background),
            transparent,
            var(--shaded-background),
            transparent,
            var(--shaded-background) 87.5%
        );
        background-size: 800% 100%;
        background-position-x: 100%;
        animation: hey-listen 2s linear;
    }
}

@keyframes hey-listen {
    0% {
        background-position-x: 0%;
    }

    100% {
        background-position-x: 100%;
    }
}

/* <noscript> navigation links */
.tree .navigate {
    padding-left: 1.75em;
    background-repeat: no-repeat;
    background-position: 0% 50%;
    opacity: 80%;
}

/* Children containers */

.tree li.child-pages {
    /* I experimented with borders a bit but found them a bit ugly.
       Therefore, the listing is currently not separated from the main page anyhow.
       This should change once we have search bars. */
    /*
    margin-top: 0.8rem;
    padding-top: 0.8rem;
    padding-bottom: 0.8rem;
    border-top: 0.1rem solid var(--border-1);
    border-bottom: 0.1rem solid var(--border-1);
    */

    & > ul {
        /* Show child page lists without an indent.
           Visually they belong to the root of the page. */
        margin-left: 0;
        padding-left: 0;
        border-left: none;
    }
}

/* branch-quote class for "air quote branches"; used to separate a subtree from a parent tree
   stylistically such that it's interpretable as a form of block quote. */
ul.branch-quote {
    --vertical-margin: 0.8rem;
    --padding: 0.8rem;

    margin-top: var(--vertical-margin);
    margin-bottom: var(--vertical-margin);
    padding-top: var(--padding);
    padding-bottom: var(--padding);
    padding-right: var(--padding);
    border: 0.1rem solid var(--border-1);
    border-radius: 0.8rem;

    position: relative;

    &::before {
        font-weight: 900;

        content: "“";
        position: absolute;
        right: 1.6rem;
        top: 0.1rem;
        font-size: 4.8rem;
        opacity: 50%;

        transition: opacity var(--transition-duration);
    }

    &:hover::before {
        opacity: 0%;
    }
}
