/* Expo project search page. */

:root {
    --bg: #0a0a0d;
    --bg-soft: #111116;
    --bg-soft-2: #16161d;
    --paper: #f5f3ed;
    --dim: #8b8b93;
    --accent: #3e63ff;
    --accent-hover: #5478ff;
    --line: rgba(245, 243, 237, 0.13);
    --line-strong: rgba(245, 243, 237, 0.24);
    --shadow: rgba(0, 0, 0, 0.55);
    --radius: 0.5rem;
    --radius-lg: 0.75rem;

    color-scheme: dark;
}

*,
*::before,
*::after {
    box-sizing: border-box;
}

html,
body {
    margin: 0;
    padding: 0;
    background-color: var(--bg);
    color: var(--paper);
    font-family: "Montserrat", var(--font-script, ui-sans-serif), ui-sans-serif, system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, p, fieldset, legend, figure {
    margin: 0;
    padding: 0;
}

fieldset {
    border: 0;
    min-width: 0;
}

img {
    display: block;
    max-width: 100%;
}

a {
    color: inherit;
    text-decoration: none;
}

svg {
    display: block;
    flex-shrink: 0;
}

::selection {
    background: var(--accent);
    color: var(--paper);
}

.hide-scrollbar {
    -ms-overflow-style: none;
    scrollbar-width: none;
}

.hide-scrollbar::-webkit-scrollbar {
    display: none;
}

/* Page shell */

.expo-search {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    min-height: 100svh;
    background-color: var(--bg);
    color: var(--paper);
    overflow-wrap: anywhere;
}

/* The projects area always has the full page width. */
.expo-search__main {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    min-width: 0;
}

.expo-search__content {
    flex: 1 1 auto;
    padding: 1rem;
}

/* Sticky page header: the shared site nav, carrying the search field. Nav sizing is brand.css's - it matches the
   landing page. */

.expo-header {
    position: sticky;
    top: 0;
    z-index: 30;
    background-color: var(--bg-soft);
    border-bottom: 1px solid var(--line);
    box-shadow: 0 1px 2px 0 var(--shadow);
}

/* The field takes the room between the brand and the links. */
.site-nav .search-field--top {
    flex: 1 1 16rem;
    min-width: 12rem;
    margin: 0 2rem;
}

/* brand.css stacks these into a column under 1000px, which is affordable
   over a full-bleed hero but not in a docked bar that every scroll position
   has to pay for. They stay on one row here and wrap only if they must. */
.expo-header .nav-links {
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: flex-end;
    flex-shrink: 1;
    gap: 0.25rem 1rem;
}

/* Phone: the lockup and the burger share the top row and the search field
   takes the second. The links live in the burger's full-screen menu, which
   brand.css styles for every page that uses it. */
@media (max-width: 767px) {
    .expo-header .site-nav {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-areas:
            "brand  toggle"
            "search search";
        align-items: center;
        gap: 0.75rem;
    }

    .expo-header .nav-brand {
        grid-area: brand;
    }

    .expo-header .nav-toggle {
        grid-area: toggle;
    }

    .site-nav .search-field--top {
        grid-area: search;
        margin: 0;
    }
}

/* Search field */

.search-field {
    position: relative;
}

.search-field--top {
    width: 100%;
    min-width: 0;
}

.search-field__input {
    width: 100%;
    padding: 0.625rem 3rem 0.625rem 2.75rem;
    font: inherit;
    font-size: 0.9375rem;
    color: var(--paper);
    background-color: var(--bg-soft-2);
    border: 1px solid var(--line);
    border-radius: 0.75rem;
    transition: padding 0.2s ease, font-size 0.2s ease;
}

.search-field__input::placeholder {
    color: var(--dim);
}

.search-field__input:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 2px var(--accent);
}

/* Chrome repaints autofilled fields white - force them back. */
.search-field__input:-webkit-autofill,
.search-field__input:-webkit-autofill:focus {
    -webkit-text-fill-color: var(--paper);
    -webkit-box-shadow: 0 0 0 1000px var(--bg-soft-2) inset;
    transition: background-color 9999s ease-in-out 0s;
}

.search-field__icon {
    position: absolute;
    left: 0.875rem;
    top: 50%;
    transform: translateY(-50%);
    width: 1.125rem;
    height: 1.125rem;
    color: var(--dim);
    opacity: 0.8;
    pointer-events: none;
}

.search-field__voice {
    position: absolute;
    right: 0.625rem;
    top: 50%;
    transform: translateY(-50%);
    padding: 0.25rem;
    color: var(--dim);
    background: none;
    border: 0;
    border-radius: 0.375rem;
    cursor: pointer;
}

.search-field__voice svg {
    width: 1.125rem;
    height: 1.125rem;
}

.search-field__voice:hover {
    color: var(--paper);
    background-color: var(--bg-soft-2);
}

.search-field__voice:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

/* Suggestions */

.suggestions {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    z-index: 30;
    margin-top: 0.25rem;
    max-height: 24rem;
    overflow-y: auto;
    background-color: var(--bg-soft);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: 0 10px 15px -3px var(--shadow);
}

.suggestions__group {
    padding: 0.5rem 0.75rem 0.25rem;
    font-size: 0.6875rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--dim);
}

.suggestions__item {
    display: block;
    width: 100%;
    padding: 0.5rem 0.75rem;
    font: inherit;
    text-align: left;
    color: var(--paper);
    background: none;
    border: 0;
    cursor: pointer;
}

.suggestions__item:hover,
.suggestions__item:focus,
.suggestions__item.is-active {
    background-color: var(--bg-soft-2);
    outline: none;
}

.suggestions__label {
    display: block;
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--paper);
}

.suggestions__sub {
    display: block;
    font-size: 0.75rem;
    color: var(--dim);
}

/* Section headings */

.expo-section {
    margin-bottom: 2rem;
}

.expo-section__head {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    margin-bottom: 1rem;
}

.expo-section__head--baseline {
    align-items: baseline;
}

.expo-section__title {
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--paper);
    text-transform: uppercase;
}

.expo-section__count {
    font-size: 0.875rem;
    color: var(--dim);
}

.expo-section__scrollhint {
    display: flex;
    align-items: center;
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--dim);
}

.expo-section__scrollhint svg {
    width: 0.75rem;
    height: 0.75rem;
    margin-left: 0.25rem;
}

.expo-section__scrollhint--desktop {
    display: none;
}

/* Category tiles */









/* Project cards */

.project-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.5rem;
}

.project-grid__empty {
    grid-column: 1 / -1;
    padding: 4rem 0;
    text-align: center;
    color: var(--dim);
}

.project-card {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background-color: var(--bg-soft);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    box-shadow: 0 1px 2px 0 var(--shadow);
    transition: box-shadow 0.2s;
}

.project-card:hover {
    box-shadow: 0 4px 6px -1px var(--shadow);
}

.project-card__media {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    overflow: hidden;
    width: 100%;
    aspect-ratio: 16 / 9;
    border-bottom: 1px solid var(--line);
    background-color: var(--bg-soft-2);
    background-image: repeating-linear-gradient(
        135deg,
        transparent,
        transparent 13px,
        rgba(245, 243, 237, 0.022) 13px,
        rgba(245, 243, 237, 0.022) 14px
    );
}

.project-card__image {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.3s, opacity 0.4s;
}

/* Until it arrives, expo.js hides it over the card's placeholder. */
.project-card__image.is-loading {
    opacity: 0;
}

.project-card:hover .project-card__image {
    transform: scale(1.05);
}

.project-card__placeholder {
    width: 3rem;
    height: 3rem;
    color: var(--dim);
    opacity: 0.8;
}

.project-card__body {
    display: flex;
    flex: 1 1 0%;
    flex-direction: column;
    justify-content: space-between;
    min-width: 0;
    padding: 1rem;
}

.project-card__tags {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    margin-bottom: 0.5rem;
}

/* Badge colours are paired inline for contrast. */
.project-card__tag {
    padding: 0.125rem 0.5rem;
    font-size: 0.625rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    border-radius: 0.25rem;
}

.project-card__title {
    font-size: 1.125rem;
    font-weight: 700;
    line-height: 1.25;
    color: var(--paper);
    margin-bottom: 0.25rem;
}

/* A category name's size follows card, so the longest single word
   ("TECHNOLOGY", about 7.7em in capitals) fits whole any card width; wide
   cards keep full 18px. Phones get their own rule. */
.category-card { container-type: inline-size; }
.category-card .project-card__title {
    text-transform: uppercase;
    letter-spacing: 0.03em;
    font-size: clamp(0.75rem, (100cqi - 2rem) / 8, 1.125rem);
    overflow-wrap: break-word;
}

.project-card__meta {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.025em;
    color: var(--dim);
    margin-bottom: 0.5rem;
}

.project-card__excerpt {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--paper);
    opacity: 0.85;
}

/* Tablet and up */

@media (min-width: 768px) {
    /* One row from tablets up: links, their gaps and the search field's
       margins shrink with screen instead of wrapping onto second row. */
    .expo-header .nav-links {
        flex-wrap: nowrap;
        flex-shrink: 0;
        gap: clamp(0.75rem, 1.5vw, 2rem);
    }

    .expo-header .nav-links a {
        font-size: clamp(0.6875rem, 0.25rem + 0.85vw, 1rem);
        white-space: nowrap;
    }

    .expo-header .site-nav .search-field--top {
        min-width: 8rem;
        margin: 0 clamp(0.75rem, 2vw, 2rem);
    }
}

/* Below 1440px, where the links start to shrink, search takes its own
   row under the logo and links, as it does on phones: beside them it would
   be squeezed down to 128-300px. */
@media (min-width: 768px) and (max-width: 1439px) {
    .expo-header .site-nav {
        display: grid;
        grid-template-columns: auto minmax(0, 1fr);
        grid-template-areas:
            "brand  links"
            "search search";
        align-items: center;
        gap: 0.75rem 1.5rem;
    }

    .expo-header .nav-brand { grid-area: brand; }
    .expo-header .nav-links { grid-area: links; }

    .expo-header .site-nav .search-field--top {
        grid-area: search;
        margin: 0;
    }
}

@media (min-width: 768px) {

    .expo-search__content {
        padding: 2rem;
    }

    .expo-section__scrollhint--mobile {
        display: none;
    }

    .expo-section__scrollhint--desktop {
        display: flex;
    }

    /* Replace the mobile scroll strip with two rows. */



    .project-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .project-card__excerpt {
        -webkit-line-clamp: 3;
        line-clamp: 3;
    }
}

@media (min-width: 1024px) {
    .project-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (min-width: 1280px) {
    .project-grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

/* Active voice search */
.search-field__voice.is-listening {
    color: #ef4444;
    animation: search-field-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

@keyframes search-field-pulse {
    50% { opacity: 0.5; }
}

@media (prefers-reduced-motion: reduce) {
    .search-field__voice.is-listening {
        animation: none;
    }
}
/* TESTMARKER-1789283299 */


/* ------------------------------------------------------------------
   Category page: a pinned ASCII hero, the project row scrolling over it.

   The hero stays stuck to the top for the whole page while the row rides
   up over it. --hero-progress (0 at rest, 1 once the hero has been
   scrolled its own height) is set by expo.js and is the only thing that
   drives the blur and the fade to the page background.
   ------------------------------------------------------------------ */

.category-hero {
    position: sticky;
    top: 0;
    z-index: 0;
    /* A full slide, same as the landing page's. The sticky header overlays
       its top; the figures bleed past the edges exactly as they do there. */
    height: 100svh;
    overflow: hidden;
    background-color: var(--bg);
}

.category-hero__art,
.category-hero__text,
.category-scroll {
    filter: blur(calc(var(--hero-progress, 0) * 1.5rem));
    opacity: calc(1 - var(--hero-progress, 0));
}

/* Same block the landing page's slider copy sits in: high rather than
   centred, so it clears the figures below it. */
.category-hero__text {
    position: absolute;
    top: 24%;
    left: 2rem;
    transform: translateY(-50%);
    width: 50%;
    z-index: 1;
    color: var(--monash-white);
}

/* Back to the search page, above the title. */
.category-back {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    margin-bottom: 1.25rem;
    padding: 0.5rem 1rem 0.5rem 0.625rem;
    font-family: var(--font-body);
    font-size: var(--type-button, 1rem);
    letter-spacing: 0.02em;
    text-transform: uppercase;
    line-height: 1;
    white-space: nowrap;
    color: var(--monash-white);
    border: 1px solid currentColor;
    border-radius: 2rem;
    background-color: rgba(0, 0, 0, 0.35);
    transition: background-color 0.2s ease, color 0.2s ease;
}

.category-scroll {
    transition: background-color 0.2s ease, color 0.2s ease;
}

.category-back svg {
    width: 1.125rem;
    height: 1.125rem;
}

/* Fills white with black text on hover, like the landing page's buttons. */
.category-back:hover,
.category-back:focus-visible {
    background-color: var(--monash-white);
    color: var(--monash-black, #000);
}

.category-back:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.category-hero__title {
    margin-bottom: 0.75rem;
    font-family: var(--font-heading);
    font-size: var(--type-intro-heading);
    line-height: 1.1;
}

.category-hero__count {
    font-family: var(--font-banner);
    font-size: var(--type-intro-text);
    line-height: 1.35;
}

/* Quote between the title and the project count (Categories > Category
   page quote), with who said it underneath in smaller type. */
.category-quote {
    max-width: 32em;
    margin: 0 0 1rem;
}

.category-quote blockquote {
    margin: 0;
    font-family: var(--font-heading);
    font-size: clamp(1rem, 1.6vw, 1.375rem);
    font-style: italic;
    line-height: 1.4;
}

.category-quote figcaption {
    margin-top: 0.35rem;
    font-family: var(--font-body);
    font-size: 0.875rem;
    opacity: 0.8;
}

/* Artwork credit (Categories > Artwork credit): a grey box with the info
   icon in the hero's bottom-right corner, level with the down arrow.
   Phones: centred just above the arrow, wrapping rather than running off. */
.category-credit {
    position: absolute;
    right: 2rem;
    bottom: calc(2rem + var(--expo-header-h, 0px));
    z-index: 1;
    display: flex;
    align-items: center;
    gap: 0.625rem;
    max-width: calc(50% - 4rem);
    padding: 0.625rem 1rem;
    font-family: var(--font-body);
    font-size: 1.125rem;
    line-height: 1.35;
    color: var(--monash-white);
    background-color: rgba(80, 80, 80, 0.85);
    border-radius: 0.375rem;
    filter: blur(calc(var(--hero-progress, 0) * 1.5rem));
    opacity: calc(1 - var(--hero-progress, 0));
}

.category-credit img {
    flex-shrink: 0;
    width: 1.5rem;
    height: 1.5rem;
}

/* The title, with the artist on its own line in smaller, softer type. */
.category-credit__title,
.category-credit__author {
    display: block;
}

.category-credit__author {
    font-size: 0.8em;
    opacity: 0.8;
}

@media (max-width: 767px) {
    .category-credit {
        right: 1rem;
        left: 1rem;
        /* The arrow's bottom, plus its 3rem height and a 0.75rem gap. */
        bottom: calc(5.75rem + var(--expo-header-h, 0px));
        justify-content: center;
        width: fit-content;
        max-width: calc(100% - 2rem);
        margin-inline: auto;
        font-size: 1rem;
    }
}

/* Down arrow at the foot of the hero, jumping to the project row. */
.category-scroll {
    position: absolute;
    left: 50%;
    bottom: calc(2rem + var(--expo-header-h, 0px));
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3rem;
    height: 3rem;
    margin-left: -1.5rem;
    color: var(--monash-white);
    border: 1px solid currentColor;
    border-radius: 50%;
    background-color: rgba(0, 0, 0, 0.35);
    animation: category-scroll-bob 2s ease-in-out infinite;
}

.category-scroll svg {
    width: 1.5rem;
    height: 1.5rem;
}

.category-scroll:hover,
.category-scroll:focus-visible {
    background-color: var(--monash-white);
    color: var(--monash-black, #000);
}

.category-scroll:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

@keyframes category-scroll-bob {
    0%, 100% { translate: 0 0; }
    50% { translate: 0 0.5rem; }
}

@media (prefers-reduced-motion: reduce) {
    .category-scroll {
        animation: none;
    }
}

/* The whole image (ASCII off) keeps a box of its own, clear of the title
   above and the down arrow below. */
.category-hero__photo {
    top: 38%;
    bottom: calc(var(--expo-header-h, 0px) + 6rem);
}

/* ASCII switched off: the one image, whole and uncropped. */
.category-hero__photo {
    position: absolute;
    left: 2rem;
    right: 2rem;
    display: flex;
    align-items: center;
    justify-content: center;
}

.category-hero__photo img {
    display: block;
    width: auto;
    height: auto;
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}

/* Wide screens have room beside the title, so the art can use the full
   height there instead of squeezing in underneath it. */
@media (min-width: 1024px) {
    /* The title column is 2rem + 50% wide; start clear of it. */
    .category-hero__photo {
        top: 2rem;
        left: calc(50% + 4rem);
    }
}

@media (max-width: 767px) {
    /* The title's 50% column is too narrow to read on a phone. */
    .category-hero__text {
        width: calc(100% - 4rem);
    }
}

/* No sizing of its own: the figures are laid out by ascii_figures.css
   exactly as the landing page lays them out - 40% wrappers, facing pairs
   pushed apart, split pairs butted together in the middle. Anything capped
   here changes the composition, because the canvas keeps its ratio and
   shrinking it leaves slack inside a wrapper that does not shrink. */

/* Scrolls over the pinned hero, so it needs its own opaque ground. */
.category-projects {
    position: relative;
    z-index: 1;
    padding: 2rem 2rem 6rem;
    background-color: var(--bg);
    /* The down arrow's jump lands below the sticky header, not under it. */
    scroll-margin-top: var(--expo-header-h, 0px);
}

/* Wide screens: projects start halfway down the hero, right in front of
   the ASCII art, and scroll up over it while it blurs away (--hero-progress).
   Five in a row, and the credit moves to the top so the cards do not cover it. */
@media (min-width: 1024px) {
    .category-projects {
        margin-top: -50svh;
        background-color: transparent;
    }

    .category-projects .project-grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }

    .category-scroll {
        display: none;
    }

    .category-credit {
        top: 2rem;
        bottom: auto;
    }
}

@media (min-width: 1280px) {
    .category-projects .project-grid {
        grid-template-columns: repeat(5, minmax(0, 1fr));
    }
}

/* Phones and tablets: the projects start just under the title block (and
   the art credit, moved up under it), over the ASCII art, as on wide
   screens. expo.js measures where those end. (width < 1024px leaves no gap with min-width: 1024px at
   zoomed, fractional widths, as max-width: 1023px would.) */
@media (width < 1024px) {
    .category-credit {
        top: calc(var(--hero-text-end, 0px) + 0.75rem);
        bottom: auto;
        left: 2rem;
        right: auto;
        max-width: calc(100% - 4rem);
    }

    .category-projects {
        margin-top: calc(var(--hero-content-end, 100svh) - 100svh + 1.5rem);
        background-color: transparent;
    }

    .category-scroll {
        display: none;
    }
}




/* ------------------------------------------------------------------
   Category slider: one continuous run of category cards, one centred,
   stepped by the arrows or dragged. expo.js drives it.
   ------------------------------------------------------------------ */

.pslider {
    position: relative;
    margin: 1.5rem 0 2.5rem;
    overflow: hidden;
    cursor: grab;
    user-select: none;
    /* Horizontal swipes go to expo.js; vertical ones still scroll the page. */
    touch-action: pan-y;
}

.pslider.is-dragging {
    cursor: grabbing;
}

.pslider__track {
    display: flex;
    /* JS writes translate3d here every frame. */
    will-change: transform;
}







/* The cards are the slides. --per-view of them (an odd number, so one sits
   in the middle) fill the slider exactly: the centred card's neighbours end
   flush with its edges, so nothing is cut off at either side. */
.pslider {
    --per-view: 5;
    --gap: 1rem;
}

.pslider .project-card {
    flex-shrink: 0;
    width: calc((100% - (var(--per-view) - 1) * var(--gap)) / var(--per-view));
    margin-right: var(--gap);
}

@media (max-width: 1023px) {
    .pslider { --per-view: 3; }
}

/* Phones show three, so the neighbours say there is more to swipe;
   the cards are narrow, so their padding and titles shrink to fit. */
@media (max-width: 599px) {
    .pslider { --per-view: 3; --gap: 0.5rem; }
    .pslider .project-card__body { padding: 0.5rem 0.375rem; }
    /* Cards are 65-80px wide, so size follows card (one size for
       the row): "Community" long word, about 6.2em, from a
       320px phone to a 599px one. Words wrap whole; past three lines ends in "…". */
    .pslider .project-card__title {
        font-size: clamp(0.5rem, (100cqi - 0.75rem) / 6.6, 0.875rem);
        text-transform: none;
        letter-spacing: normal;
        overflow-wrap: break-word;
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 3;
        line-clamp: 3;
        overflow: hidden;
    }
}

.pslider .project-card__media {
    /* Wide 16:9, so the row runs edge to edge. */
    aspect-ratio: 16 / 9;
}

.pslider .project-card__image {
    will-change: transform;
    -webkit-user-drag: none;
    /* expo.js sets this transform (the parallax) every frame; the cards'
       hover transition would restart on each one and make it stutter. */
    transition: none;
}

/* The arrows sit outside the slider, in a gutter either side, so they
   never cover a card. */
.pslider-wrap {
    position: relative;
    padding: 0 4rem;
}

.pslider__arrow {
    position: absolute;
    top: 50%;
    z-index: 2;
    display: grid;
    place-items: center;
    width: 3rem;
    height: 3rem;
    color: var(--monash-white, #fff);
    background-color: rgba(0, 0, 0, 0.55);
    border: 1px solid var(--line);
    border-radius: 50%;
    cursor: pointer;
    transform: translateY(-50%);
    transition: background-color 0.2s ease;
}

.pslider__arrow:hover,
.pslider__arrow:focus-visible {
    background-color: rgba(0, 0, 0, 0.8);
}

.pslider__arrow:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.pslider__arrow svg {
    width: 1.5rem;
    height: 1.5rem;
}

.pslider__arrow--prev { left: 0; }
.pslider__arrow--next { right: 0; }

/* Touch screens swipe too, but keep small arrows so the row reads as scrollable. */
@media (pointer: coarse), (max-width: 599px) {
    .pslider-wrap { padding: 0 2.25rem; }
    .pslider__arrow { width: 2rem; height: 2rem; }
    .pslider__arrow svg { width: 1.125rem; height: 1.125rem; }
}

/* Down arrow to the footer, bottom right instead as on the landing page, until the
   footer showing (expo.js adds .is-hidden). */
.expo-fab {
    position: fixed;
    right: 1.5rem;
    bottom: calc(1.5rem + var(--cms-preview-height, 0px));
    z-index: 5;
    display: grid;
    place-items: center;
    width: 3.5rem;
    height: 3.5rem;
    padding: 0;
    border: 1px solid rgba(255, 255, 255, 0.35);
    border-radius: 50%;
    color: #ffffff;
    /* See-through over the cards; solid accent on hover. */
    background-color: rgba(62, 99, 255, 0.35);
    cursor: pointer;
    transition: background-color 0.2s, border-color 0.2s, transform 0.3s ease, opacity 0.3s ease;
}

.expo-fab.is-hidden {
    transform: translateY(1rem);
    opacity: 0;
    pointer-events: none;
}

@media (max-width: 600px) {
    .expo-fab { right: 1rem; bottom: calc(1rem + var(--cms-preview-height, 0px)); width: 3rem; height: 3rem; }
}

.expo-fab:focus-visible {
    background-color: var(--accent);
    border-color: var(--accent);
}

/* Touch screens keep :hover after a tap, so only mice get it. */
@media (hover: hover) {
    .expo-fab:hover {
        background-color: var(--accent);
        border-color: var(--accent);
    }
}

.expo-fab:focus-visible {
    outline: 2px solid var(--paper);
    outline-offset: 3px;
}

.expo-fab svg {
    width: 1.5rem;
    height: 1.5rem;
}
