/*
 * FameFitness LadiesOnly - DNN theme overrides
 * ---------------------------------------------------------------------------
 * css/ladies.css is GENERATED from scss/ in this project - never edit it by hand.
 * Run `npm run build` (or the Web Compiler extension via compilerconfig.json).
 *
 * This file only bridges the gap between that design and the markup DNN actually
 * renders: the <form> wrapper, the panes, the module containers and the DNN admin
 * controls. Design changes belong in scss/, not here.
 *
 * DNN loads skin.css at priority 15, after grid.css (11) and ladies.css (12),
 * so everything here wins without !important unless DNN itself is louder.
 */

/*
 * The palette, the type scale, the radii and the shadows are all published as
 * --ladies-* custom properties by scss/abstracts/_tokens.scss, which compiles
 * into css/ladies.css. They are NOT redeclared here: a second copy would win
 * (this file loads later) and silently ignore any change made in the Sass.
 *
 * Use them: --ladies-pink / --ladies-pink-hover are the ACCESSIBLE pink
 * (4.52:1 on white and under white text); --ladies-pink-brand is the brand pink
 * and is decoration only.
 *
 * The one value declared here is a fallback: js/ladies.js measures the rendered
 * navbar and overwrites --ladies-navbar-height on :root, so changing the logo
 * does not mean touching a number. ladies.css declares the same fallback; this
 * repeat only covers a page that somehow loads skin.css without it.
 */
:root {
    --ladies-navbar-height: 88px;
}

/* ---------------------------------------------------------------- page frame */

/*
 * ladies.css makes <body> a flex column so the footer is pushed down on short
 * pages. DNN puts everything inside <form id="Form">, which breaks that chain,
 * so the form has to become the flex column instead.
 */
html body {
    display: block;
    /*
     * The original site never painted a background and relied on the browser
     * default. DNN portals ship their own portal.css, so state it explicitly.
     */
    background-color: #fff;
}

body > form,
body > form#Form {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

body > form > .content,
main.content {
    flex: 1 0 auto;
}

/*
 * The navbar is fixed, so content needs to clear it. A hero is the exception:
 * it is designed to sit behind the transparent navbar, so a hero pane that has
 * content pulls itself back up by the same amount.
 */
main.content {
    padding-top: var(--ladies-navbar-height);
}

/*
 * A page that opens with a hero drops the clearance entirely: the hero is designed
 * to sit behind the transparent navbar, which is what the live site does
 * (main has padding-top: 0 and the hero starts at y=0).
 *
 * Two rules, because the hero can arrive two ways and both must work:
 *  - as its own module in HeroPane, matched by CSS below;
 *  - as the first section of a larger block of page HTML in ContentPane, which is
 *    how fameladies.nl is authored. Then an empty HeroPane precedes it and no
 *    :first-child selector can see it, so js/ladies.js adds .has-leading-hero.
 * Both only zero the same padding, so applying both is harmless. Both also
 * require a real .hero-image: the marker class alone would pull the page up
 * under the navbar on a page that has no hero to hide behind it.
 */
main.content:has(> .skin-pane-full:first-child .hero-image),
main.content.has-leading-hero:has(.hero-image) {
    padding-top: 0;
}

/* Full-bleed panes must not inherit any gutter. */
.skin-pane-full {
    width: 100%;
}

/* Grid rows collapse to nothing when their panes are empty. */
.skin-row > .row > [class^="col-"]:empty {
    display: none;
}

/* ------------------------------------------------------------- accessibility */

/*
 * Skip link: the first focusable element on the page, off-screen until focused.
 * The design had none, so keyboard users had to tab through the whole navbar on
 * every page.
 */
.skip-link {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 2000;
    padding: .7rem 1.2rem;
    background: var(--ladies-pink);
    color: #fff;
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    border-bottom-right-radius: var(--ladies-radius, .875rem);
    text-decoration: none;
    transform: translateY(-120%);
    transition: transform .15s ease-out;
}

.skip-link:focus {
    transform: translateY(0);
    color: #fff;
    outline: 3px solid #1a1418;
    outline-offset: -3px;
}

@media (prefers-reduced-motion: reduce) {
    .skip-link { transition: none; }
}

/* main gets tabindex="-1" so the skip link can focus it; never show that outline. */
main.content:focus {
    outline: none;
}

/*
 * A visible keyboard focus state. ladies.css sets `outline: 0` in several places
 * (form controls, buttons), which leaves keyboard users with no indication at all.
 */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
    outline: 3px solid var(--ladies-pink);
    outline-offset: 2px;
}

/*
 * On the saturated bands the pink outline would disappear; use white there.
 * #intro is no longer one of them - the redesign puts it on the blush tint with
 * ink text, so the pink ring is the readable one now.
 */
#subscribe a:focus-visible,
#subscribe button:focus-visible,
#subscribe input:focus-visible,
#reference a:focus-visible,
#notice a:focus-visible,
#cover a:focus-visible,
.section--pink a:focus-visible,
.section--pink button:focus-visible,
.section--dark a:focus-visible,
:is(body, form) > footer a:focus-visible {
    outline-color: #fff;
}

/* --------------------------------------------------------------- navigation */

/*
 * DDRMenu renders the main menu inside its own wrapper div. The original markup
 * had <ul class="navbar-nav"> as a direct child of #navbarResponsive, so the
 * wrapper has to be transparent to the flex layout.
 */
#navbarResponsive > div,
#navbarResponsive > .DDRMenu {
    display: contents;
}

/*
 * Room for DNN's own chrome above the fixed navbar.
 *
 * This used to be a flat `top: 55px` applied whenever #personabar-iframe existed
 * in the DOM. That iframe is present for ANY logged-in host or administrator, on
 * every page, not only while editing - so the site's navbar sat 55px below the
 * top of the window for the one person who looks at the site most. And the DNN
 * 9/10 Persona Bar is a vertical rail on the LEFT, so a top offset was
 * compensating on the wrong axis to begin with.
 *
 * The offset is a token now: zero by default, and only non-zero in edit state,
 * where DNN does put a bar across the top. If your installation renders it
 * differently, this is the one number to change.
 */
:root {
    --ladies-admin-offset: 0px;
}

body.dnnEditState {
    --ladies-admin-offset: 55px;
}

#mainNav {
    top: var(--ladies-admin-offset, 0px);
}

/* ---------------------------------------------------------------- containers */

/* Blank and Hero add no chrome of their own. */
.container-blank {
    width: 100%;
}

/* Section renders an empty heading when the module has no title; hide it. */
.section-title > h2:empty,
.page-title > h2:empty,
.skin-module > .underline:empty {
    display: none;
}

/* Main sits inside a grid column, so it must not add horizontal padding. */
.skin-module {
    width: 100%;
}

.skin-module > .underline {
    display: inline-block;
    margin-bottom: 1rem;
}

/* DNN wraps the module title in an anchor/span; inherit the theme heading. */
.section-title .Head,
.page-title .Head,
.skin-module .Head {
    color: inherit;
    font: inherit;
    text-decoration: none;
}

/* ------------------------------------------------------- responsive content */

/*
 * The ported design is already responsive: the grid has breakpoints, the navbar
 * collapses below 992px and the page-section rhythm drops from 105px to 45px.
 * What it never had to survive is a CMS. Module content is authored by editors,
 * so these rules stop arbitrary pasted content (wide tables, video embeds, long
 * URLs) from breaking the page open sideways.
 *
 * Verified against Documentation/preview-inner.html at 320, 360, 375, 414, 480,
 * 600, 768, 820, 992, 1024, 1200, 1440 and 1920px: no horizontal page scroll.
 */

/*
 * Grid columns are flex items, and a flex item's default min-width:auto lets
 * wide content push it past its declared basis. Allow them to shrink.
 */
[class^="col-"],
[class*=" col-"] {
    min-width: 0;
}

/* Long URLs and other unbroken strings wrap instead of overflowing. */
.ContainerPane,
.skin-module,
.hero-text {
    overflow-wrap: break-word;
    word-wrap: break-word;
}

/*
 * Tables scroll inside their own box instead of widening the page. `width` is
 * deliberately left alone so the design's own full-width tables
 * (.table, .schedule-table, .opening-hours-table) still fill their column.
 */
.ContainerPane table,
.dnnGrid {
    display: block;
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/*
 * Embeds never exceed their column. js/ladies.js additionally wraps fixed-size
 * iframes in the design's own responsive .video wrapper so they keep their
 * aspect ratio; this is the no-JS safety net.
 */
.ContainerPane iframe,
.ContainerPane video,
.ContainerPane embed,
.ContainerPane object {
    max-width: 100%;
}

/* Preformatted text scrolls rather than stretching the layout. */
.ContainerPane pre {
    max-width: 100%;
    overflow-x: auto;
}

/*
 * The hero used to need a max-width correction here: it positioned .hero-text
 * absolutely at left:15px with width:530px, which pushed past the right edge
 * between 480 and about 560px. The rebuilt hero lays the copy out in the grid
 * cell with the container's own gutters, so there is nothing left to correct.
 */

/* ------------------------------------------- module forms (Form and List) */

/*
 * The contact form is built with the "Form and List" module (UserDefinedTable).
 * That module generates its own markup, so it never emits the design's .formBox
 * wrapper - the pink bordered box that .formBox provides and whose inner input is
 * deliberately borderless.
 *
 * Rather than depend on Form and List's internal DOM (which differs between
 * versions), the .formBox look is applied to the controls themselves by element.
 * Any module that renders a form therefore adopts the design automatically.
 *
 * :where() is used so these rules keep a specificity of (0,1,1) and the design's
 * own .formBox / .mini-form treatments below still win.
 */
.ContainerPane input:where(:not([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [type="hidden"], [type="image"], [type="file"])),
.ContainerPane textarea,
.ContainerPane select {
    width: 100%;
    padding: 1rem 1.1rem;
    border: 1.5px solid var(--ladies-line-strong);
    border-radius: var(--ladies-radius);
    background: #fff;
    color: var(--ladies-ink);
    font-size: var(--ladies-text-sm);
    line-height: 1.4;
    outline: 0;
    -webkit-appearance: none;
    appearance: none;
    transition: border-color .25s var(--ladies-ease), box-shadow .25s var(--ladies-ease);
}

.ContainerPane textarea {
    min-height: 10rem;
    resize: vertical;
}

.ContainerPane select {
    min-height: 3.5rem;
    appearance: auto;
}

.ContainerPane input::placeholder,
.ContainerPane textarea::placeholder {
    color: var(--ladies-ink-3);
    opacity: 1;
}

/*
 * The pink is the FOCUS colour now, not the resting one. The old rule drew a 2px
 * pink border around every field on sight, which left nothing to say with when
 * you actually put the cursor in one.
 */
.ContainerPane input:hover,
.ContainerPane textarea:hover,
.ContainerPane select:hover {
    border-color: var(--ladies-ink-3);
}

.ContainerPane input:focus,
.ContainerPane textarea:focus,
.ContainerPane select:focus {
    border-color: var(--ladies-pink);
    box-shadow: 0 0 0 3px rgba(192, 76, 139, .38);
    outline: 0;
}

/*
 * Controls that already sit inside one of the design's own wrappers keep the
 * original treatment: the border belongs to the wrapper, not the control.
 */
.ContainerPane .formBox input,
.ContainerPane .formBox select,
.ContainerPane .formBox textarea,
.ContainerPane .mini-form input,
.ContainerPane .checkboxouter input {
    border: 0;
    border-radius: inherit;
}

/*
 * Checkboxes and radios must not be stretched to full width. They also must not
 * stay at the browser default of 13x13px: that is half the 24x24 WCAG 2.2 asks
 * for, on the one control in the form that legally has to be ticked on purpose.
 */
.ContainerPane input[type="checkbox"],
.ContainerPane input[type="radio"] {
    /* 1.5rem = 24px, exactly the WCAG 2.2 target-size minimum. */
    width: 1.5rem;
    height: 1.5rem;
    padding: 0;
    margin-right: .5rem;
    vertical-align: -.25rem;
    accent-color: var(--ladies-pink);
}

/* The label next to it is part of the same target, so it gets the same height. */
.ContainerPane label:has(+ input[type="checkbox"]),
.ContainerPane label:has(+ input[type="radio"]),
.ContainerPane input[type="checkbox"] + label,
.ContainerPane input[type="radio"] + label {
    display: inline-block;
    min-height: 1.5rem;
    padding: .25rem 0;
    cursor: pointer;
}

/*
 * Form and List follows the DNN form convention (.dnnForm > .dnnFormItem with a
 * .dnnLabel and a field). Stack label above field so long Dutch labels do not
 * squeeze the input on narrow screens.
 */
.ContainerPane .dnnForm,
.ContainerPane .dnnFormItem {
    max-width: 100%;
}

.ContainerPane .dnnFormItem {
    display: flex;
    flex-direction: column;
    margin-bottom: 1rem;
}

.ContainerPane .dnnFormItem > label,
.ContainerPane .dnnFormItem > .dnnLabel,
.ContainerPane .dnnLabel {
    width: auto;
    margin-bottom: .35rem;
    float: none;
    text-align: left;
    font-family: 'paralucent condensed demi bold', Arial, sans-serif;
}

.ContainerPane .dnnLabel label,
.ContainerPane .dnnLabel span {
    font-weight: 400;
}

/* Validation messages in the design's red. */
.ContainerPane .dnnFormMessage,
.ContainerPane .dnnFormError,
.ContainerPane .dnnFormRequired span,
.ContainerPane span[id*="Validator"],
.ContainerPane .NormalRed {
    color: #c73535;
    font-family: 'paralucent text book', Arial, sans-serif;
}

/* An invalid control echoes .formBox.invalid. */
.ContainerPane input.dnnFormError,
.ContainerPane textarea.dnnFormError,
.ContainerPane select.dnnFormError {
    border-color: #c73535;
    background: rgba(199, 53, 53, .05);
}

/*
 * Form and List renders its submit as an input or a link. ladies.css only styles
 * button[type=submit], so bring the other two into line with it.
 */
.ContainerPane input[type="submit"],
.ContainerPane input[type="button"] {
    cursor: pointer;
    margin-top: 1rem;
    padding: .3rem 1rem;
    border: 3px solid var(--ladies-pink);
    border-radius: .25rem;
    color: #fff;
    background-color: var(--ladies-pink);
    font-family: 'paralucent medium', Arial, sans-serif;
    font-size: 1.2rem;
    box-shadow: none;
}

.ContainerPane input[type="submit"]:hover,
.ContainerPane input[type="button"]:hover {
    background-color: var(--ladies-pink-hover);
    color: #fff;
}

/* Keep the module's action row from colliding with the fields. */
.ContainerPane .dnnActions,
.ContainerPane ul.dnnActions {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin-top: 1rem;
    padding-left: 0;
}

.ContainerPane .dnnActions li {
    list-style: none;
}

/* ------------------------------------------- the contact page (Form and List) */

/*
 * The contact page is one Form and List module rendering FormAndList/ContactForm/
 * form-template.html: the whole #contact section, with the design's .form-row /
 * .formBox structure around the module's own inputs. See that file and the README
 * next to it.
 *
 * Everything below bridges the three things the module renders that the template
 * cannot: the form wrapper it puts around the template, the label markup it emits
 * into [label-for:...], and the submit button and the message it renders OUTSIDE
 * the template (js/ladies.js moves those into the template's data-fnl-slot elements).
 */

/* The module's own stylesheet centres and spaces the form; here the section is the page. */
.ContainerPane .fnlForm {
    margin: 0;
    padding: 0;
}

/*
 * The design labels its fields with placeholders. js/ladies.js copies the template's
 * data-placeholder onto the control and marks the box, so the label is only hidden
 * once its text has actually moved into the placeholder. It stays in the DOM and
 * keeps its `for`, so screen readers still announce the field.
 */
#form-contact .formBox.has-placeholder .dnnFormLabelWithoutHelp,
#form-contact .formBox.has-placeholder .dnnLabel {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    border: 0;
    clip-path: inset(50%);
    white-space: nowrap;
}

/* An input is inline-block, which would leave a descender gap inside the box. */
#form-contact .formBox input,
#form-contact .formBox textarea {
    display: block;
}

/*
 * Form and List marks required controls with .dnnFormRequired, which its module.css
 * turns into a 5px red left border - with !important, and module.css loads before
 * skin.css. The design marks a required field when it is submitted empty, not on sight.
 */
#form-contact input.dnnFormRequired,
#form-contact textarea.dnnFormRequired,
#form-contact select.dnnFormRequired {
    border-left: 0 !important;
    padding-right: 0 !important;
}

/*
 * Validation is server side: on an invalid submit the module appends its message
 * INSIDE the control's slot, so inside the pink box. Lift it into the box's own
 * bottom margin instead, and give the box the design's invalid treatment.
 * (#contact .formBox > * sets line-height: 0, hence the explicit line-height.)
 */
#form-contact .formBox .dnnFormError {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    margin-top: .2rem;
    color: var(--ladies-red);
    font-family: var(--ladies-font-body, 'paralucent text book', Arial, sans-serif);
    font-size: 14px;
    line-height: 1.2;
    text-align: left;
}

#form-contact .formBox:has(.dnnFormError) {
    margin-bottom: 2.25rem;
    border-color: var(--ladies-red);
    animation: shake .82s cubic-bezier(.36, .07, .19, .97) both;
    transform: translate3d(0, 0, 0);
}

#form-contact .formBox:has(.dnnFormError) input,
#form-contact .formBox:has(.dnnFormError) textarea {
    background: rgba(199, 53, 53, .05);
}

/* A field that failed keeps the red ring on focus rather than flipping to pink. */
#form-contact .formBox:has(.dnnFormError):focus-within {
    border-color: var(--ladies-red);
    box-shadow: 0 0 0 3px rgba(199, 53, 53, .3);
}

/* ---------------------------------------------------------------- submit row */

/*
 * The module's submit is <ul class="dnnActions"><li><a class="dnnPrimaryAction">,
 * not the design's <button type="submit">, so the design's own rule cannot reach it.
 * These values mirror button[type=submit] and .btn in ladies.css one for one.
 */
#form-contact .dnnActions {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    align-items: center;
    margin: 0;
    padding: 0;
}

#form-contact .dnnActions li {
    list-style: none;
}

#form-contact .dnnActions a.dnnPrimaryAction {
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    margin-top: 1rem;
    padding: .72em 1.6em;
    border: 2px solid var(--ladies-pink);
    border-radius: var(--ladies-radius-pill);
    color: #fff;
    background-color: var(--ladies-pink);
    background-image: none;
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    font-size: var(--ladies-text-base);
    line-height: 1.25;
    text-align: center;
    text-decoration: none;
    text-shadow: none;
    box-shadow: 0 2px 6px rgba(192, 76, 139, .22);
    transition: background-color .25s var(--ladies-ease), border-color .25s var(--ladies-ease), box-shadow .25s var(--ladies-ease), transform .25s var(--ladies-ease);
}

#form-contact .dnnActions a.dnnPrimaryAction:hover {
    background-color: var(--ladies-pink-hover);
    border-color: var(--ladies-pink-hover);
    color: #fff;
    box-shadow: 0 6px 12px rgba(192, 76, 139, .18), 0 20px 44px rgba(192, 76, 139, .2);
    transform: translateY(-2px);
}

/*
 * The paper plane that sits in the design's submit button. It is a mask rather than
 * an inline <svg> because the button is the module's markup, not the template's: the
 * icon has to come from CSS. background-color is currentColor, so it follows the
 * hover colour the way fill: #fff did.
 */
#form-contact .dnnActions a.dnnPrimaryAction::after {
    content: "";
    display: inline-block;
    width: 20px;
    height: 20px;
    margin-left: 7px;
    vertical-align: -3px;
    background-color: currentColor;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M464 4.3L16 262.7C-7 276-4.7 309.9 19.8 320L160 378v102c0 30.2 37.8 43.3 56.7 20.3l60.7-73.8 126.4 52.2c19.1 7.9 40.7-4.2 43.8-24.7l64-417.1C515.7 10.2 487-9 464 4.3zM192 480v-88.8l54.5 22.5L192 480zm224-30.9l-206.2-85.2 199.5-235.8c4.8-5.6-2.9-13.2-8.5-8.4L145.5 337.3 32 290.5 480 32l-64 417.1z'/%3E%3C/svg%3E") no-repeat center / contain;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M464 4.3L16 262.7C-7 276-4.7 309.9 19.8 320L160 378v102c0 30.2 37.8 43.3 56.7 20.3l60.7-73.8 126.4 52.2c19.1 7.9 40.7-4.2 43.8-24.7l64-417.1C515.7 10.2 487-9 464 4.3zM192 480v-88.8l54.5 22.5L192 480zm224-30.9l-206.2-85.2 199.5-235.8c4.8-5.6-2.9-13.2-8.5-8.4L145.5 337.3 32 290.5 480 32l-64 417.1z'/%3E%3C/svg%3E") no-repeat center / contain;
}

/* Cancel and Delete only render for an editor working on an existing record. */
#form-contact .dnnActions a.dnnSecondaryAction {
    display: inline-flex;
    align-items: center;
    margin-top: 1rem;
    padding: .72em 1.6em;
    border: 2px solid var(--ladies-line-strong);
    border-radius: var(--ladies-radius-pill);
    color: var(--ladies-ink);
    background: transparent;
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    font-size: var(--ladies-text-base);
    line-height: 1.25;
    text-decoration: none;
    box-shadow: none;
}

#form-contact .dnnActions a.dnnSecondaryAction:hover {
    border-color: var(--ladies-pink);
    color: var(--ladies-pink);
}

#form-contact .recaptcha-container:not(:empty) {
    margin-top: 1rem;
}

/* ------------------------------------------------------------ submit message */

/*
 * .valSum is the design's fixed toast at the top of the viewport. Empty, it must not
 * exist: it is 300px wide and would sit over the navbar swallowing clicks.
 */
#form-contact .valSum:empty {
    display: none;
}

#form-contact .valSum {
    pointer-events: none;
}

#form-contact .valSum > * {
    pointer-events: auto;
    padding: .9rem 1.35rem;
    border: 1px solid var(--ladies-line);
    border-left: 4px solid var(--ladies-pink);
    border-radius: var(--ladies-radius);
    background: #fff;
    box-shadow: 0 4px 8px rgba(22, 18, 26, .05), 0 16px 40px rgba(22, 18, 26, .12);
    color: var(--ladies-ink);
}

/* ------------------------------------------------ submissions (?show=records) */

/*
 * The list side of the module, rendered by FormAndList/ContactForm/list-template.xsl.
 * With "Usage: form only" this is staff facing: it is reached through the module's
 * Show records action and needs the SHOWLIST permission.
 */
.fnl-records {
    max-width: 800px;
    margin: 0 auto;
    padding: 2rem 15px;
}

.fnl-record {
    margin-bottom: 1.5rem;
    padding: 1.5rem;
    border: 1px solid var(--ladies-line);
    border-radius: var(--ladies-radius-lg);
    background: #fff;
    box-shadow: 0 1px 2px rgba(22, 18, 26, .06), 0 2px 8px rgba(22, 18, 26, .05);
}

.fnl-record-head {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem 1rem;
    align-items: baseline;
    margin-bottom: .75rem;
    padding-bottom: .5rem;
    border-bottom: 2px solid var(--ladies-pink);
}

.fnl-record-title {
    margin: 0;
    font-size: 1.4rem;
}

.fnl-record-date {
    color: var(--ladies-ink-3);
}

.fnl-record-edit {
    margin-left: auto;
    text-decoration: underline;
}

.fnl-record-meta {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: .25rem 1rem;
    margin: 0 0 .75rem;
}

.fnl-record-meta dt {
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    color: var(--ladies-ink);
}

.fnl-record-meta dd {
    margin: 0;
    overflow-wrap: break-word;
}

.fnl-record-body {
    white-space: pre-wrap;
}

.fnl-records-empty {
    text-align: center;
}

/* ---------------------------------------------------------------- edit mode */

/*
 * Empty panes are invisible by design on the live site. While editing, outline
 * them and print their name so the pane structure is discoverable.
 */
body.dnnEditState .skin-pane:empty,
body.dnnEditState .skin-row [class^="col-"]:empty {
    display: block;
    position: relative;
    min-height: 72px;
    margin-bottom: .5rem;
    border: 2px dashed rgba(192, 76, 139, .55);
    border-radius: var(--ladies-radius);
    background-color: rgba(192, 76, 139, .05);
}

body.dnnEditState .skin-pane:empty::after,
body.dnnEditState .skin-row [class^="col-"]:empty::after {
    content: attr(id);
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: var(--ladies-pink);
    font-family: var(--ladies-font-heading, 'paralucent condensed demi bold', Arial, sans-serif);
    font-size: 14px;
    letter-spacing: 1px;
    text-transform: uppercase;
}

/*
 * .hero-image keeps `overflow: hidden` so the cover image cannot spill out of a
 * frame that is shorter than the picture. It no longer HAS to: the 2300px skewed
 * pseudo-element that used to make the clip mandatory is gone.
 */

/* ---------------------------------------------------------- DNN admin markup */

/*
 * ladies.css zeroes margin and padding globally. It no longer strips list
 * markers globally - that reset used to take the bullets off every list an
 * editor wrote - but DNN's own forms, grids and rich text output still need the
 * browser defaults back, so these regions revert them explicitly.
 */
.dnnForm,
.dnnFormItem,
.dnnGrid,
.dnnPanel,
.dnnClear .Normal,
.dnnGrid td,
.dnnGrid th {
    box-sizing: border-box;
}

.dnnForm ul,
.dnnForm ol,
.dnnPanel ul,
.dnnPanel ol,
.ContainerPane ol,
.ContainerPane ul.list-default {
    margin: revert;
    padding: revert;
    list-style-type: revert;
}

.dnnForm li,
.dnnPanel li,
.ContainerPane ol li {
    margin: revert;
    list-style-type: revert;
}

/* DNN action buttons pick up the theme's pink. */
a.dnnPrimaryAction,
button.dnnPrimaryAction,
.dnnPrimaryAction {
    display: inline-block;
    padding: .6em 1.4em;
    background: var(--ladies-pink);
    border: 2px solid var(--ladies-pink);
    border-radius: var(--ladies-radius-pill);
    color: #fff;
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    text-shadow: none;
}

a.dnnPrimaryAction:hover,
button.dnnPrimaryAction:hover,
.dnnPrimaryAction:hover {
    background: var(--ladies-pink-hover);
    border-color: var(--ladies-pink-hover);
    color: #fff;
}

a.dnnSecondaryAction,
button.dnnSecondaryAction,
.dnnSecondaryAction {
    display: inline-block;
    padding: .6em 1.4em;
    border-radius: var(--ladies-radius-pill);
    font-family: var(--ladies-font-ui, 'paralucent medium', Arial, sans-serif);
    color: var(--ladies-pink);
}

/* Search and login links in the footer strip. */
.SkinLink,
.SkinLink a,
.SkinLink span {
    color: rgba(255, 255, 255, .7);
    font-size: 15px;
}

.SkinLink a:hover {
    color: #fff;
}

.footer-copyright .SkinLink > * {
    margin: 0 .35rem;
}

/* ------------------------------------------------------------ auth screens */

/*
 * Login, password reset, registration and "send password" are DNN core modules.
 * They ship their own float layout in DNN's default.css - .dnnFormLabel floats
 * left at a fixed 132px with text-align: right, and the input next to it is a
 * fixed 200px - which lands on this theme as a label wrapping onto two lines and
 * an input bleeding off the left edge of its column.
 *
 * Everything below is scoped to the four auth modules by class, never to
 * .dnnForm on its own: that class is also on every module settings and admin
 * screen in DNN, and those want to keep the float layout they were built for.
 *
 * Specificity note: DNN's own rules are .dnnForm .dnnFormItem input[type="text"]
 * (0,2,2), which a plain .dnnLogin .dnnFormItem input[type="text"] only TIES.
 * A tie is settled by load order, and load order is not something a theme should
 * bet on - DNN's client resource manager bundles and reorders. Every selector
 * below therefore leads with .dnnForm.dnnLogin (both classes sit on the same
 * div), which is (0,3,2) and wins outright.
 */

.dnnForm.dnnLogin,
.dnnForm.dnnSendPassword,
.dnnForm.dnnPasswordReset,
.dnnForm.dnnRegistrationForm {
    box-sizing: border-box;
    width: 100%;
    max-width: 30rem;
    margin: var(--ladies-space-9) auto;
    padding: var(--ladies-space-7);
    border: 1px solid var(--ladies-line);
    /* The same pink edge the contact card carries, so the two read as a pair. */
    border-top: 4px solid var(--ladies-pink);
    border-radius: var(--ladies-radius-xl);
    background: #fff;
    box-shadow: 0 4px 8px rgba(22, 18, 26, .05), 0 16px 40px rgba(22, 18, 26, .12);
}

/* The nested wrappers DNN emits carry no layout of their own. */
.dnnForm.dnnLogin .loginContent,
.dnnForm.dnnLogin .LoginPanel,
.dnnForm.dnnLogin .dnnLoginService,
.dnnForm.dnnSendPassword .dnnFormItem,
.dnnForm.dnnPasswordReset .dnnFormItem {
    width: auto;
    margin: 0;
    padding: 0;
    border: 0;
    background: none;
}

/* A second authentication provider renders as another .dnnLoginService. */
.dnnForm.dnnLogin .dnnLoginService + .dnnLoginService {
    margin-top: var(--ladies-space-6);
    padding-top: var(--ladies-space-6);
    border-top: 1px solid var(--ladies-line);
}

/* --------------------------------------------------------------- one row */

.dnnForm.dnnLogin .dnnFormItem,
.dnnForm.dnnSendPassword .dnnFormItem,
.dnnForm.dnnPasswordReset .dnnFormItem,
.dnnForm.dnnRegistrationForm .dnnFormItem {
    display: block;
    width: auto;
    margin: 0 0 var(--ladies-space-5);
    padding: 0;
    overflow: visible;
}

.dnnForm.dnnLogin .dnnFormItem::after,
.dnnForm.dnnSendPassword .dnnFormItem::after,
.dnnForm.dnnPasswordReset .dnnFormItem::after,
.dnnForm.dnnRegistrationForm .dnnFormItem::after {
    content: "";
    display: block;
    clear: both;
}

/* The label sits above its field instead of floating beside it. */
.dnnForm.dnnLogin .dnnLabel,
.dnnForm.dnnLogin label.dnnFormLabel,
.dnnForm.dnnSendPassword .dnnLabel,
.dnnForm.dnnSendPassword label.dnnFormLabel,
.dnnForm.dnnPasswordReset .dnnLabel,
.dnnForm.dnnPasswordReset label.dnnFormLabel,
.dnnForm.dnnRegistrationForm .dnnLabel,
.dnnForm.dnnRegistrationForm label.dnnFormLabel {
    float: none;
    display: block;
    width: auto;
    min-height: 0;
    margin: 0 0 .4rem;
    padding: 0;
    font-family: var(--ladies-font-ui, 'paralucent text bold', Arial, sans-serif);
    font-size: 15px;
    line-height: 1.4;
    text-align: left;
    color: var(--ladies-ink);
}

/*
 * The login form uses <span class="dnnFormLabel"> as a spacer in front of the
 * remember-me row and the button row - it holds nothing but a non-breaking
 * space. Scoped to .dnnLoginService so a real span label elsewhere survives.
 */
.dnnLoginService .dnnFormItem > span.dnnFormLabel {
    display: none;
}

/* ------------------------------------------------------------- the fields */

.dnnForm.dnnLogin .dnnFormItem input[type="text"],
.dnnForm.dnnLogin .dnnFormItem input[type="password"],
.dnnForm.dnnLogin .dnnFormItem input[type="email"],
.dnnForm.dnnSendPassword .dnnFormItem input[type="text"],
.dnnForm.dnnSendPassword .dnnFormItem input[type="email"],
.dnnForm.dnnPasswordReset .dnnFormItem input[type="text"],
.dnnForm.dnnPasswordReset .dnnFormItem input[type="password"],
.dnnForm.dnnRegistrationForm .dnnFormItem input[type="text"],
.dnnForm.dnnRegistrationForm .dnnFormItem input[type="password"],
.dnnForm.dnnRegistrationForm .dnnFormItem input[type="email"] {
    box-sizing: border-box;
    float: none;
    width: 100%;
    height: auto;
    padding: .95rem 1.1rem;
    border: 1.5px solid var(--ladies-line-strong);
    border-radius: var(--ladies-radius);
    background: #fff;
    color: var(--ladies-ink);
    font-family: inherit;
    font-size: 16px; /* under 16px iOS zooms the page on focus */
    line-height: 1.4;
    transition: border-color .25s var(--ladies-ease), box-shadow .25s var(--ladies-ease);
}

.dnnForm.dnnLogin .dnnFormItem input:hover,
.dnnForm.dnnSendPassword .dnnFormItem input:hover,
.dnnForm.dnnPasswordReset .dnnFormItem input:hover,
.dnnForm.dnnRegistrationForm .dnnFormItem input:hover {
    border-color: var(--ladies-ink-3);
}

.dnnForm.dnnLogin .dnnFormItem input:focus,
.dnnForm.dnnSendPassword .dnnFormItem input:focus,
.dnnForm.dnnPasswordReset .dnnFormItem input:focus,
.dnnForm.dnnRegistrationForm .dnnFormItem input:focus {
    outline: 0;
    border-color: var(--ladies-pink);
    box-shadow: 0 0 0 3px rgba(192, 76, 139, .38);
}

/* ------------------------------------------------------- "stay signed in" */

/*
 * DNN hides the real checkbox off-screen and paints .dnnCheckbox > .mark with a
 * sprite from its own stylesheet. That sprite is a 1x1 transparent pixel here,
 * so the control was invisible. The box is drawn in CSS instead and the real
 * input is brought back as a 24x24 target sitting on top of it.
 */
.dnnLoginRememberMe {
    position: relative;
    display: flex;
    align-items: center;
    gap: .6rem;
}

.dnnLoginRememberMe input[type="checkbox"] {
    position: static !important;
    z-index: auto !important;
    width: 1.5rem !important;
    height: 1.5rem !important;
    margin: 0 !important;
    opacity: 1 !important;
    accent-color: var(--ladies-pink);
    cursor: pointer;
}

/* DNN's sprite stand-in is now redundant. */
.dnnLoginRememberMe .dnnCheckbox {
    display: none;
}

.dnnLoginRememberMe .dnnBoxLabel,
.dnnForm.dnnLogin label.dnnBoxLabel {
    margin: 0;
    padding: .25rem 0;
    font-family: var(--ladies-font-body, 'paralucent text book', Arial, sans-serif);
    font-size: 15px;
    color: var(--ladies-ink-2);
    cursor: pointer;
}

/* ------------------------------------------------------------- the actions */

/*
 * The submit is the one thing on this screen, so it spans the card. Cancel and
 * the password link drop to a quiet row underneath.
 */
.dnnForm.dnnLogin .dnnFormItem a.dnnPrimaryAction,
.dnnForm.dnnSendPassword a.dnnPrimaryAction,
.dnnForm.dnnPasswordReset a.dnnPrimaryAction,
.dnnForm.dnnRegistrationForm a.dnnPrimaryAction {
    display: block;
    width: 100%;
    margin: 0 0 var(--ladies-space-3);
    padding: .85em 1.6em;
    text-align: center;
}

.dnnForm.dnnLogin .dnnFormItem a.dnnSecondaryAction,
.dnnForm.dnnSendPassword a.dnnSecondaryAction,
.dnnForm.dnnPasswordReset a.dnnSecondaryAction {
    display: inline-block;
    padding: .5em 0;
    border: 0;
    background: none;
    color: var(--ladies-ink-3);
    font-size: 15px;
    text-decoration: underline;
    text-underline-offset: .18em;
}

.dnnForm.dnnLogin .dnnFormItem a.dnnSecondaryAction:hover,
.dnnForm.dnnSendPassword a.dnnSecondaryAction:hover,
.dnnForm.dnnPasswordReset a.dnnSecondaryAction:hover {
    color: var(--ladies-pink);
}

.dnnLoginActions {
    margin: 0;
}

.dnnLoginActions ul.dnnActions {
    display: flex;
    flex-wrap: wrap;
    gap: 0 var(--ladies-space-4);
    margin: 0;
    padding: 0;
    list-style: none;
}

.dnnLoginActions ul.dnnActions li {
    margin: 0;
    list-style: none;
}

/* ---------------------------------------------------------- messages */

.dnnForm.dnnLogin .dnnFormMessage,
.dnnForm.dnnLogin .dnnFormValidationSummary,
.dnnForm.dnnSendPassword .dnnFormMessage,
.dnnForm.dnnPasswordReset .dnnFormMessage,
.dnnForm.dnnRegistrationForm .dnnFormMessage {
    box-sizing: border-box;
    width: 100%;
    margin: 0 0 var(--ladies-space-5);
    padding: .9rem 1.1rem;
    border: 1px solid var(--ladies-line);
    border-left: 4px solid var(--ladies-pink);
    border-radius: var(--ladies-radius);
    background: var(--ladies-surface-3);
    color: var(--ladies-ink);
    font-size: 15px;
}

.dnnForm.dnnLogin .dnnFormError,
.dnnForm.dnnSendPassword .dnnFormError,
.dnnForm.dnnPasswordReset .dnnFormError,
.dnnForm.dnnRegistrationForm .dnnFormError {
    border-left-color: var(--ladies-red);
    background: rgba(199, 53, 53, .06);
    color: var(--ladies-red);
}

/* An empty social-login strip must not reserve space. */
.dnnSocialRegistration:has(ul.buttonList:empty),
.dnnForm.dnnLogin #socialControls:has(ul.buttonList:empty) {
    display: none;
}

.dnnSocialRegistration ul.buttonList {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ladies-space-3);
    margin: var(--ladies-space-5) 0 0;
    padding: 0;
    list-style: none;
}

/* The login link in the footer strip is not part of this card. */
.SkinLink a.dnnSecondaryAction {
    padding: 0;
    border: 0;
    background: none;
}

/* ------------------------------------------------------------- breadcrumb */

.skin-breadcrumb {
    margin-bottom: 1rem;
}

.skin-breadcrumb .breadcrumb,
.skin-breadcrumb a {
    color: var(--ladies-ink-3);
    font-family: var(--ladies-font-body, 'paralucent text book', Arial, sans-serif);
    font-size: 15px;
}

/*
 * A breadcrumb link is a 40x18 box as plain inline text, under the 24x24 WCAG 2.2
 * asks for. Vertical padding with a cancelling negative margin, so the trail keeps
 * its height on the page and gains a target that a thumb can hit.
 */
.skin-breadcrumb a {
    display: inline-block;
    padding: .45rem .15rem;
    margin: -.45rem 0;
}

.skin-breadcrumb a:hover {
    color: var(--ladies-pink);
}

/* ---------------------------------------------------------------- consent */

/*
 * Skinning for the shared consent module (consent/wicoda-consent.*). Only tokens
 * are set here - no selector from that file is overridden, which is what keeps the
 * module reusable across the other Wicoda.Themes skins.
 *
 * --wc-accent sits behind white button text, so it uses the ACCESSIBLE pink
 * (4.52:1), not the brand pink (2.99:1).
 */
.wc-root {
    --wc-accent: var(--ladies-pink);
    --wc-accent-hover: var(--ladies-pink-hover);
    --wc-accent-fg: #fff;
    --wc-fg: var(--ladies-ink);
    --wc-muted: var(--ladies-ink-3);
    --wc-line: var(--ladies-line);
    --wc-radius: var(--ladies-radius);
    --wc-font: var(--ladies-font-body, 'paralucent text book', Arial, sans-serif);
    --wc-font-heading: var(--ladies-font-display, 'paralucent condensed heavy', 'Arial Narrow', sans-serif);
    --wc-title-size: 1.5rem;
    --wc-max-width: 1240px;
}

/* The banner sits above the fixed navbar's stacking context. */
.wc-root { --wc-z: 2147483000; }

/* ----------------------------------------------------------------- popups */

/*
 * Popup pages (module settings, page settings) deliberately do not load
 * ladies.css, so they keep DNN's own spacing. Only the typography is themed.
 */
.skin-popup {
    padding: 1rem;
}

.skin-popup h1,
.skin-popup h2,
.skin-popup h3 {
    font-family: var(--ladies-font-display, 'paralucent condensed heavy', Arial, sans-serif);
}

/* ------------------------------------------------------------ edit layout */

.skin-edit .container {
    padding-bottom: 3rem;
}

.skin-edit .dnnForm {
    margin-top: 1rem;
}
