/*
 * Public business signup - resources/views/platform/signup.blade.php
 *
 * ---------------------------------------------------------------------------
 * SCOPED UNDER .signup, every rule of it
 * ---------------------------------------------------------------------------
 * The page renders inside layouts.auth2, which carries the ERP's skin classes on
 * <body> and loads app.css, vendor.css (Bootstrap 3) and the BS3->4 bridge. An
 * unscoped rule here would follow the visitor into the ERP on any page that happens
 * to load this file.
 *
 * The flip side is that every rule must OUT-SPECIFY that stack. `.signup .form-control`
 * is (0,2,0) against Bootstrap's (0,1,0), which is why the controls below are written
 * as descendants rather than as bare classes. Where the theme used !important, so does
 * this file - and each of those is commented with what it is beating.
 *
 * ---------------------------------------------------------------------------
 * The outer split is CSS grid, and that is a BUG FIX
 * ---------------------------------------------------------------------------
 * It used to be `.row.no-gutters` with `.col-lg-5`/`.col-lg-7`. `.no-gutters` is
 * defined in public/assets/css/all.css; public/css/vendor.css (Bootstrap 3) loads
 * AFTER it and redefines `.row { margin: 0 -15px }` at the same specificity, so the
 * later rule won and the panel hung 15px past the viewport at EVERY width - desktop
 * included. Two columns do not need a 12-column grid, and a grid has no margins to
 * lose. The form's own two-up rows are `.signup-row` for the same reason.
 *
 * ---------------------------------------------------------------------------
 * Type
 * ---------------------------------------------------------------------------
 * Poppins throughout, from the ERP's own self-hosted copy (public/fonts/poppins,
 * loaded by include.head and already applied globally by assets/css/all.css).
 *
 * IN PIXELS, NOT REM, AND THAT IS DELIBERATE. public/css/vendor.css pins the root:
 *
 *     html { font-size: 10px; }
 *
 * so every rem on this page resolves against 10px, not 16px. Written as rem the scale
 * rendered at 62.5% of its intended size - measured, not guessed: labels came out at
 * 8.75px and the inputs at 10px, which is under the 16px threshold that makes iOS
 * Safari zoom on focus. Because that root is an absolute pin rather than a percentage,
 * rem also buys no user-font-size scaling here, so px costs nothing and cannot be
 * silently rescaled by a stylesheet this page does not own.
 */

.signup {
    /*
     * ---- palette: the ERP admin's, not the operator panel's ----
     *
     * Read off the running ERP rather than invented. A tenant's staff sign in at
     * /admin/login on their own hostname, and this page is the step before that -
     * so it belongs to the ERP's world, and looking like the platform's private
     * operator panel would make the two feel like different products.
     *
     *   #ecf0f5  content background   .content-wrapper (vendor.css)
     *   #525f7f  body text            computed <body> colour
     *   #1572e8  primary / links      .text-primary on the login screen
     *   #3c8dbc  primary button       the login screen's own CTA
     *   #d2d6de  control borders      the ERP's input border
     */
    --su-ink: #3b3f5c;
    --su-ink-2: #525f7f;
    --su-ink-soft: #888ea8;
    --su-line: #e0e6ed;
    --su-line-strong: #d2d6de;
    --su-bg: #ecf0f5;
    --su-surface: #ffffff;
    --su-surface-2: #f7f9fc;

    --su-brand: #1572e8;
    --su-brand-tint: rgba(21, 114, 232, .08);

    /* The button blue is the login screen's, which is the next page these people
     * see. Hover/active are AdminLTE's own steps down from it. */
    --su-btn: #3c8dbc;
    --su-btn-dark: #367fa9;
    --su-btn-darker: #2b6a8f;

    --su-banner-from: #3c8dbc;
    --su-banner-to: #1b3a52;

    --su-ok: #1a9e5c;
    --su-ok-tint: rgba(26, 158, 92, .1);
    --su-error: #e7515a;
    --su-error-tint: rgba(231, 81, 90, .08);

    /* ---- type scale: 1.200 on a 16px base ---- */
    --su-fs-display: 34px; /* banner heading */
    --su-fs-h1: 26px;      /* panel heading */
    --su-fs-h2: 17px;      /* card title */
    --su-fs-base: 16px;    /* inputs - the iOS no-zoom floor, held deliberately */
    --su-fs-body: 15px;    /* the ERP's own body size */
    --su-fs-sm: 14px;      /* labels */
    --su-fs-xs: 13px;      /* help text, captions */

    /* ---- spacing: 4px base, nothing off-scale ---- */
    --su-s1: 4px;
    --su-s2: 8px;
    --su-s3: 12px;
    --su-s4: 16px;
    --su-s5: 20px;
    --su-s6: 24px;
    --su-s8: 32px;
    --su-s10: 40px;
    --su-s12: 48px;

    /* The ERP is flat - its inputs and buttons compute to a 1.7px radius. 4px keeps
     * that character without the hard corner reading as unfinished. */
    --su-radius: 4px;
    --su-radius-sm: 3px;

    /* AdminLTE's box shadow, which is what every card in this ERP already wears. */
    --su-shadow-sm: 0 1px 1px rgba(0, 0, 0, .1);
    --su-shadow-md: 0 2px 6px rgba(0, 0, 0, .12);

    /* Every interactive element gets this. outline:none with no replacement is a
     * defect, not a style. */
    --su-focus: 0 0 0 2px var(--su-surface), 0 0 0 4px var(--su-brand);

    background: var(--su-bg);
    color: var(--su-ink);
    font-size: var(--su-fs-base);
    line-height: 1.55;
    min-height: 100vh;
}

/*
 * The split. `minmax(0, …)` on both tracks rather than bare fractions: a grid item's
 * default min-width is auto, so one long unbreakable string (a hostname) would push
 * the track wider than its share and reintroduce the sideways scroll this replaced.
 */
.signup .signup-split {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    min-height: 100vh;
}

/* ==========================================================================
 * Left: the banner
 * ========================================================================== */

/*
 * Three zones stacked: the brand row, the pitch (which takes the slack), and the
 * module list along the bottom. space-between rather than absolute positioning -
 * an earlier attempt pinned the brand and it resolved against the centred inner
 * block, landing on top of the heading.
 */
.signup .signup-banner {
    position: relative;
    display: flex;
    flex-direction: column;
    background:
        radial-gradient(120% 80% at 12% 0%, rgba(93, 173, 216, .45) 0%, transparent 62%),
        linear-gradient(160deg, var(--su-banner-from) 0%, var(--su-banner-to) 100%);
    padding: var(--su-s8) var(--su-s10) var(--su-s6);
    overflow: hidden;
}

/*
 * COLOUR IS STATED, NOT INHERITED, on every text node in this panel.
 *
 * app.css sets a dark colour on `p`, `span`, `strong` and `li` DIRECTLY. A direct
 * rule beats an inherited one whatever the parent's specificity, so `color: #fff` on
 * the banner alone left the lede and the bullets rendering dark navy on dark blue -
 * present, and invisible. Opacity varies the emphasis; the colour is repeated.
 */
.signup .signup-banner,
.signup .signup-banner h1,
.signup .signup-banner p,
.signup .signup-banner li,
.signup .signup-banner span,
.signup .signup-banner strong,
.signup .signup-banner i {
    color: #fff;
}

.signup .signup-banner-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--su-s4);
    flex: 0 0 auto;
}

.signup .signup-banner-inner {
    /* Takes the slack, and centres the pitch inside it. */
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    justify-content: center;
    width: 100%;
    max-width: 460px;
    margin: 0 auto;
    padding: var(--su-s8) 0;
}

/* ---- brand + pill ---- */

.signup .signup-brand {
    display: flex;
    align-items: center;
    gap: var(--su-s3);
}

/* A white plate behind the mark, as a real logo would sit on. It also means a future
 * logo file with its own colours drops straight in without fighting the gradient. */
.signup .signup-brand-mark {
    width: 42px;
    height: 42px;
    flex: 0 0 auto;
    display: block;
}

.signup .signup-brand-mark-bg {
    fill: rgba(255, 255, 255, .95);
    stroke: none;
}

.signup .signup-brand-mark-text {
    fill: #1b3a52;
    font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    font-size: 16px;
    font-weight: 700;
    letter-spacing: .01em;
}

.signup .signup-brand-word {
    font-size: 17px;
    font-weight: 600;
}

.signup .signup-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex: 0 0 auto;
    padding: 6px 14px;
    border-radius: 99px;
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .2);
    font-size: var(--su-fs-xs);
    font-weight: 500;
    white-space: nowrap;
}

/* ---- pitch ---- */

.signup .signup-banner-heading {
    font-size: var(--su-fs-display);
    line-height: 1.22;
    font-weight: 600;
    margin: 0 0 var(--su-s4);
}

.signup .signup-banner-lede {
    font-size: var(--su-fs-body);
    line-height: 1.65;
    margin: 0 0 var(--su-s6);
    opacity: .82;
}

/* ---- the ERP workspace miniature ----
 *
 * Replaces a revenue card that was a big invented figure over a bar chart - the same
 * picture every SaaS signup page shows, saying nothing about what is being sold. This
 * is a small honest likeness of the admin the buyer actually lands in, and it needs no
 * "Sample" disclaimer because it claims nothing: abstract bars and rows, and the only
 * words on it are real module names.
 */

.signup .signup-art {
    background: rgba(255, 255, 255, .1);
    border: 1px solid rgba(255, 255, 255, .16);
    border-radius: 10px;
    overflow: hidden;
    margin-bottom: var(--su-s6);
    box-shadow: 0 18px 40px rgba(0, 0, 0, .18);
}

.signup .signup-art-top {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 10px var(--su-s4);
    background: rgba(255, 255, 255, .12);
    border-bottom: 1px solid rgba(255, 255, 255, .12);
}

.signup .signup-art-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .4);
    flex: 0 0 auto;
}

/* The breadcrumb stub, pushed right so the bar reads as a window chrome. */
.signup .signup-art-crumb {
    margin-left: auto;
    width: 76px;
    height: 8px;
    border-radius: 99px;
    background: rgba(255, 255, 255, .22);
}

.signup .signup-art-body {
    display: flex;
    min-height: 172px;
}

/* The icon rail - the ERP's sidebar, reduced to what makes it recognisable. */
.signup .signup-art-rail {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    gap: var(--su-s2);
    padding: var(--su-s3) var(--su-s2);
    background: rgba(0, 0, 0, .12);
    border-right: 1px solid rgba(255, 255, 255, .08);
}

.signup .signup-art-railitem {
    width: 28px;
    height: 28px;
    border-radius: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 15px;
    color: rgba(255, 255, 255, .55);
}

.signup .signup-art-railitem.is-active {
    background: rgba(255, 255, 255, .9);
    color: #1b3a52;
}

.signup .signup-art-main {
    flex: 1 1 auto;
    min-width: 0;
    padding: var(--su-s4);
}

.signup .signup-art-tiles {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--su-s3);
    margin-bottom: var(--su-s4);
}

.signup .signup-art-tile {
    background: rgba(255, 255, 255, .1);
    border-radius: 6px;
    padding: var(--su-s2) 10px 10px;
    min-width: 0;
}

.signup .signup-art-tilelabel {
    display: block;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    opacity: .72;
    margin-bottom: 8px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.signup .signup-art-tiletrack {
    display: block;
    height: 6px;
    border-radius: 99px;
    background: rgba(255, 255, 255, .16);
    overflow: hidden;
}

.signup .signup-art-tilefill {
    display: block;
    height: 100%;
    border-radius: 99px;
    background: rgba(255, 255, 255, .8);
}

.signup .signup-art-rows {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.signup .signup-art-row {
    display: flex;
    align-items: center;
    gap: 10px;
}

.signup .signup-art-avatar {
    width: 22px;
    height: 22px;
    flex: 0 0 auto;
    border-radius: 50%;
    background: rgba(255, 255, 255, .24);
}

.signup .signup-art-lines {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 5px;
}

.signup .signup-art-line {
    display: block;
    height: 6px;
    border-radius: 99px;
    background: rgba(255, 255, 255, .26);
}

.signup .signup-art-line.is-short {
    background: rgba(255, 255, 255, .14);
}

.signup .signup-art-chip {
    width: 34px;
    height: 14px;
    flex: 0 0 auto;
    border-radius: 99px;
    background: rgba(255, 255, 255, .2);
}

/* ---- points ---- */

.signup .signup-points {
    list-style: none;
    padding: 0;
    margin: 0;
}

.signup .signup-points li {
    position: relative;
    padding-left: 40px;
    margin-bottom: var(--su-s4);
}

.signup .signup-points li:last-child {
    margin-bottom: 0;
}

.signup .signup-point-icon {
    position: absolute;
    left: 0;
    top: 0;
    width: 28px;
    height: 28px;
    border-radius: var(--su-radius-sm);
    background: rgba(255, 255, 255, .14);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 15px;
}

.signup .signup-points strong {
    display: block;
    font-size: var(--su-fs-sm);
    font-weight: 600;
    margin-bottom: 2px;
}

.signup .signup-point-body {
    display: block;
    font-size: var(--su-fs-xs);
    line-height: 1.55;
    opacity: .74;
}

/* ---- the module list along the foot ---- */

.signup .signup-banner-modules {
    flex: 0 0 auto;
    margin: 0;
    padding-top: var(--su-s5);
    border-top: 1px solid rgba(255, 255, 255, .14);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    opacity: .62;
}

/* ==========================================================================
 * Right: the form panel
 * ========================================================================== */

.signup .signup-panel {
    background: var(--su-bg);
    padding: var(--su-s10);
    min-width: 0; /* see grid-template-columns */
}

.signup .signup-panel-inner {
    width: 100%;
    max-width: 620px;
    margin: 0 auto;
}

.signup .signup-head {
    margin-bottom: var(--su-s5);
}

/* Blue, weight 500 - the ERP login screen's own "Log In" heading, which is the page
 * these people see next. */
.signup .signup-head h2 {
    font-size: var(--su-fs-h1);
    font-weight: 500;
    margin: 0 0 var(--su-s2);
    color: var(--su-brand);
}

.signup .signup-head p {
    color: var(--su-ink-soft);
    font-size: var(--su-fs-body);
    margin: 0;
}

/* ---- the stepper ---- */

.signup .signup-steps {
    display: flex;
    align-items: center;
    gap: var(--su-s3);
    list-style: none;
    padding: 0;
    margin: 0 0 var(--su-s5);
}

.signup .signup-stepitem {
    display: flex;
    align-items: center;
    gap: var(--su-s2);
    flex: 0 0 auto;
    min-width: 0;
}

/* The connector. flex:1 so it eats the space between the two markers and the pair
 * sit at the ends, which is what makes it read as a track rather than a divider. */
.signup .signup-stepline {
    flex: 1 1 auto;
    height: 2px;
    min-width: var(--su-s6);
    background: var(--su-line-strong);
    border-radius: 2px;
}

.signup .signup-stepdot {
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
    border-radius: 50%;
    border: 2px solid var(--su-line-strong);
    background: var(--su-surface);
    color: var(--su-ink-soft);
    font-size: var(--su-fs-xs);
    font-weight: 600;
    display: flex;
    align-items: center;
    justify-content: center;
}

.signup .signup-steplabel {
    font-size: var(--su-fs-sm);
    font-weight: 500;
    color: var(--su-ink-soft);
    white-space: nowrap;
}

.signup .signup-stepitem.is-current .signup-stepdot {
    border-color: var(--su-brand);
    background: var(--su-brand);
    color: #fff;
}

.signup .signup-stepitem.is-current .signup-steplabel {
    color: var(--su-ink);
    font-weight: 600;
}

.signup .signup-stepitem.is-done .signup-stepdot {
    border-color: var(--su-brand);
    color: var(--su-brand);
    background: var(--su-brand-tint);
}

.signup .signup-stepitem.is-done .signup-steplabel {
    color: var(--su-ink-2);
}

/* ---- cards ----
 *
 * The ERP's `.box`: white, flat, a 3px coloured rule along the top and AdminLTE's 1px
 * shadow. That top rule is the single most recognisable thing about a panel in this
 * ERP, which is the point - somebody who signs up here and then lands in the admin
 * should recognise the furniture. */
.signup .signup-card {
    background: var(--su-surface);
    border: 1px solid var(--su-line);
    border-top: 3px solid var(--su-btn);
    border-radius: var(--su-radius);
    box-shadow: var(--su-shadow-sm);
    padding: var(--su-s5) var(--su-s6) var(--su-s6);
    margin-bottom: var(--su-s4);
}

.signup .signup-card-head {
    margin-bottom: var(--su-s5);
    padding-bottom: var(--su-s3);
    border-bottom: 1px solid var(--su-line);
}

.signup .signup-card-title {
    font-size: var(--su-fs-h2);
    /* 500, not 600: the ERP's own .box-title is a light weight, and a heavier one
     * here made the section headings shout over the fields. */
    font-weight: 500;
    color: var(--su-ink);
    margin: 0;
}

.signup .signup-card-sub {
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);
    margin: 2px 0 0;
}

/* ---- the form grid ----
 *
 * Not .form-row/.col-md-*: those carry the same negative side margins that put the
 * outer split 15px off-viewport. One grid, one gap, nothing to overflow. */
.signup .signup-row {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
    gap: 0 var(--su-s4);
}

.signup .signup-col-5 { grid-column: span 5; }
.signup .signup-col-6 { grid-column: span 6; }
.signup .signup-col-7 { grid-column: span 7; }

.signup .form-group {
    margin-bottom: var(--su-s5);
}

.signup .form-group:last-child,
.signup .signup-group-last {
    margin-bottom: 0;
}

/*
 * The ERP theme title-cases every label, app-wide and with !important:
 *     label { text-transform: capitalize !important; }   (public/css/app.css)
 * Right for one- and two-word admin field names, wrong for a sentence - it turned the
 * terms line into "I Agree To The Terms And Conditions". Matching !important is the
 * only thing that beats it, and it is confined to .signup.
 */
.signup label,
.signup label span,
.signup .form-text,
.signup .signup-card-title,
.signup .signup-steplabel {
    text-transform: none !important;
}

.signup .form-group label {
    display: block;
    font-size: var(--su-fs-sm);
    font-weight: 500;
    color: var(--su-ink-2);
    margin-bottom: 6px;
}

.signup .signup-req {
    color: var(--su-error);
    font-weight: 400;
}

/* ---- controls ----
 *
 * TOUCH AND ZOOM, on every field rather than only the selects.
 *
 * 48px min-height clears the 44px target minimum with room for a border, and 16px
 * text is the threshold below which iOS Safari ZOOMS THE PAGE on focus - a signup
 * form that jumps and reflows the moment somebody taps the first field.
 *
 * height:auto is required because Bootstrap 3 (vendor.css) fixes .form-control at
 * 34px; min-height alone would be overridden by that explicit height.
 */
.signup .form-control {
    display: block;
    width: 100%;
    height: auto;
    min-height: 48px;
    padding: 11px 14px;
    font-size: var(--su-fs-base);
    line-height: 1.5;
    color: var(--su-ink);
    background-color: var(--su-surface);
    border: 1px solid var(--su-line-strong);
    border-radius: var(--su-radius-sm);
    box-shadow: none;
    transition: border-color .15s ease, box-shadow .15s ease;
}

.signup select.form-control {
    /* A select renders its own arrow; the extra right padding keeps a long plan name
     * from running under it. */
    padding-right: var(--su-s8);
}

.signup .form-control::placeholder {
    color: #a9b3c4;
}

.signup .form-control:hover {
    border-color: #b6bfcc;
}

.signup .form-control:focus {
    outline: none;
    border-color: var(--su-brand);
    box-shadow: 0 0 0 2px var(--su-brand-tint);
}

.signup .form-control.is-invalid {
    border-color: var(--su-error);
}

.signup .form-control.is-invalid:focus {
    box-shadow: 0 0 0 2px var(--su-error-tint);
}

/*
 * The password boxes' show/hide eye.
 *
 * The behaviour and the base styling come from the ERP's own
 * manage_user/partials/password_field - this only re-fits it to a 48px control.
 *
 * THE PADDING IS RE-STATED BECAUSE OF LOAD ORDER, not because the partial is wrong.
 * Its `.password-input-wrap .form-control { padding-right: 36px }` and this file's
 * `.signup .form-control { padding: 11px 14px }` have the SAME specificity (0,2,0),
 * and signup.css is loaded from @section('css'), which include.head renders AFTER
 * @stack('plugin-styles') - so the shorthand won and reset the right padding to 14px,
 * putting the eye on top of whatever had been typed. Three classes settles it.
 */
.signup .password-input-wrap .form-control {
    padding-right: 42px;
}

.signup .password-input-wrap .toggle-password {
    right: 14px;
    font-size: 19px;
    color: var(--su-ink-soft);
}

.signup .password-input-wrap .toggle-password:hover {
    color: var(--su-brand);
}

/* Keyboard reachable, because the icon carries role="button" and tabindex="0". */
.signup .password-input-wrap .toggle-password:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
    border-radius: var(--su-radius-sm);
}

/* The confirm-match line the partial writes into. Its own .password-hint is 12px;
 * this page's caption size is 13px, and the two sitting together looked accidental. */
.signup .password-hint {
    font-size: var(--su-fs-xs) !important;
    margin-top: 6px;
    line-height: 1.5;
}

/* The hostname is a machine value read character by character; a monospaced face is
 * what makes a typo in it visible. */
.signup .signup-input-mono {
    font-family: SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace;
    letter-spacing: .01em;
}

/*
 * The web-address field's optional base-domain suffix.
 *
 * A CUSTOM class rather than Bootstrap's `.input-group` - see the field's own comment
 * in signup.blade.php for why the real one detaches its addon on this page. Named
 * after the operator panel's `.sa-input-group`/`.sa-input-addon` because it does the
 * same job with the same look, not because it is shared with it: Modules/SuperAdmin
 * owns nothing this page loads.
 */
.signup .signup-input-group {
    display: flex;
    align-items: stretch;
}

.signup .signup-input-group .form-control {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
    min-width: 0;
}

.signup .signup-input-group .form-control:focus {
    position: relative;
    z-index: 1;
}

.signup .signup-input-addon {
    display: inline-flex;
    align-items: center;
    padding: 0 var(--su-s4);
    border: 1px solid var(--su-line-strong);
    border-left: none;
    border-top-right-radius: var(--su-radius-sm);
    border-bottom-right-radius: var(--su-radius-sm);
    background: var(--su-surface-2);
    color: var(--su-ink-soft);
    font-family: SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace;
    font-size: var(--su-fs-sm);
    white-space: nowrap;
}

/* The composed address, printed once the field's own live check has an answer.
 * Sits with the same rhythm as .form-text rather than the coloured verdict above it -
 * it states a fact, not a judgement. */
.signup .signup-host-preview {
    margin: 6px 0 0;
    font-size: var(--su-fs-xs);
    line-height: 1.5;
    color: var(--su-ink-soft);
}

.signup .signup-host-preview:empty {
    display: none;
}

.signup .form-text {
    display: block;
    margin-top: 6px;
    font-size: var(--su-fs-xs);
    line-height: 1.5;
    color: var(--su-ink-soft);
}

.signup .signup-field-error {
    display: block;
    margin-top: 6px;
    font-size: var(--su-fs-xs);
    font-weight: 500;
    color: var(--su-error);
}

/* ---- the chosen plan's summary ----
 *
 * Sits directly under the plan <select>. It replaced a card-per-plan grid, which
 * compared better but cost ~600px of form on a step that already asks for four other
 * things - and length is what makes a signup form feel long.
 *
 * So this is deliberately THREE LINES: price and trial on one, the description on the
 * next, the quotas inline on the last. The accent rule down its left edge is what ties
 * it to the control above rather than letting it read as another card.
 */

.signup .signup-plansummary {
    background: var(--su-surface-2);
    border: 1px solid var(--su-line);
    border-left: 3px solid var(--su-btn);
    border-radius: var(--su-radius-sm);
    padding: var(--su-s3) var(--su-s4);
    margin-top: var(--su-s3);
}

.signup .signup-plansummary-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--su-s3);
    flex-wrap: wrap;
}

.signup .signup-plansummary-price {
    display: flex;
    align-items: baseline;
    gap: 5px;
    min-width: 0;
}

.signup .signup-plansummary-amount {
    font-size: 22px;
    font-weight: 600;
    line-height: 1.2;
    color: var(--su-brand);
}

.signup .signup-plansummary-per {
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);
}

.signup .signup-plansummary-trial {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    flex: 0 0 auto;
    font-size: 12px;
    font-weight: 600;
    color: var(--su-ok);
    background: var(--su-ok-tint);
    border-radius: 99px;
    padding: 3px 10px;
}

.signup .signup-plansummary-desc {
    font-size: var(--su-fs-xs);
    line-height: 1.55;
    color: var(--su-ink-soft);
    margin: 6px 0 0;
}

/*
 * The quotas on ONE line, dot separated.
 *
 * The four-column grid this replaced was two lines tall and read as a table of
 * unrelated numbers. Inline, each figure keeps its own word beside it and the whole
 * set costs one line. The separators are pseudo-elements so they cannot be selected
 * or read out as content.
 */
.signup .signup-plansummary-limits {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 2px var(--su-s3);
    list-style: none;
    padding: var(--su-s3) 0 0;
    margin: var(--su-s3) 0 0;
    border-top: 1px solid var(--su-line);
}

.signup .signup-plansummary-limits li {
    position: relative;
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);
    white-space: nowrap;
}

.signup .signup-plansummary-limits li + li::before {
    content: "";
    position: absolute;
    left: calc(var(--su-s3) / -2 - 1px);
    top: 50%;
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--su-line-strong);
    transform: translateY(-50%);
}

.signup .signup-plansummary-limits strong {
    font-weight: 600;
    color: var(--su-ink);
}

/* ---- the live address verdict ----
 *
 * Hidden while empty, so it takes no vertical space on a form nobody has touched. */
.signup .signup-host-feedback {
    font-size: var(--su-fs-xs);
    font-weight: 500;
    margin: 6px 0 0;
    display: flex;
    align-items: center;
    gap: 6px;
}

.signup .signup-host-feedback[data-state=""]         { display: none; }
.signup .signup-host-feedback[data-state="checking"] { color: var(--su-ink-soft); }
.signup .signup-host-feedback[data-state="ok"]       { color: var(--su-ok); }
.signup .signup-host-feedback[data-state="error"]    { color: var(--su-error); }

/* A dot rather than an icon font: it is one pseudo-element, it cannot fail to load,
 * and it carries the state colour for free. */
.signup .signup-host-feedback[data-state]:not([data-state=""])::before {
    content: "";
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: currentColor;
    flex: 0 0 auto;
}

/* ---- terms ---- */

.signup .signup-terms {
    background: var(--su-surface-2);
    border: 1px solid var(--su-line);
    border-radius: var(--su-radius-sm);
    padding: var(--su-s3) var(--su-s4);
}

/* Flex rather than a floated box, so a wrapped sentence stays aligned under itself
 * instead of under the checkbox. The label is the hit area, which is what gives an
 * 18px box a target well past 44px. */
.signup .signup-terms-label {
    display: flex;
    align-items: flex-start;
    gap: var(--su-s3);
    font-weight: 400 !important; /* app.css bolds every label */
    font-size: var(--su-fs-sm);
    line-height: 1.6;
    color: var(--su-ink-2);
    margin: 0;
    padding: var(--su-s2) 0;
    cursor: pointer;
}

.signup .signup-terms-label input[type="checkbox"] {
    width: 18px;
    height: 18px;
    margin: 2px 0 0;
    flex: 0 0 auto;
    accent-color: var(--su-brand);
    cursor: pointer;
}

.signup .signup-terms-label input[type="checkbox"]:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
    border-radius: 4px;
}

/*
 * The trigger inside the consent sentence.
 *
 * A <button> painted as a link, because that is what it is - it opens a dialog and
 * goes nowhere. `font: inherit` is load-bearing: app.css and vendor.css both set a
 * font on `button`, and without it the words would break out of the sentence they
 * sit in.
 */
.signup .signup-terms-link {
    padding: 0;
    border: 0;
    background: none;
    font: inherit;
    font-weight: 600;
    color: var(--su-brand);
    text-decoration: underline;
    cursor: pointer;
}

.signup .signup-terms-link:hover,
.signup .signup-terms-link:focus {
    color: var(--su-btn-darker);
}

.signup .signup-terms-link:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
    border-radius: var(--su-radius-sm);
}

/* ---- the terms dialog ---- */

/*
 * Fixed to the viewport, so the length of the terms is the dialog's problem and never
 * the form's. z-index 1050 is Bootstrap's own modal layer: this page loads vendor.css,
 * and sitting at the same height keeps it above the same things.
 */
.signup .signup-modal {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1050;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--su-s5);
}

/*
 * `display: flex` above is an AUTHOR rule and beats the UA sheet's `[hidden]`, which
 * is the same trap the <details> panel fell into before it. Closed means closed: this
 * restores it.
 */
.signup .signup-modal[hidden] {
    display: none;
}

/* Its own element rather than a shadow on the dialog: it is the click target that
 * closes, and a pseudo-element cannot be one. */
.signup .signup-modal-backdrop {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: rgba(27, 58, 82, .55);
}

/* A column with a scrolling middle: the head and the close button stay reachable
 * however long the operator's terms are. */
.signup .signup-modal-dialog {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    max-width: 640px;
    max-height: calc(100vh - var(--su-s10));
    background: var(--su-surface);
    border-radius: var(--su-radius);
    box-shadow: 0 18px 40px rgba(0, 0, 0, .25);
    overflow: hidden;
}

/* It takes focus on open so the dialog is where the keyboard lands; the ring belongs
 * on the controls inside it, not on the box. */
.signup .signup-modal-dialog:focus {
    outline: none;
}

.signup .signup-modal-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--su-s3);
    padding: var(--su-s4) var(--su-s5);
    border-bottom: 1px solid var(--su-line);
}

.signup .signup-modal-head h2 {
    margin: 0;
    font-size: var(--su-fs-h2);
    font-weight: 600;
    color: var(--su-ink);
}

.signup .signup-modal-x {
    flex: 0 0 auto;
    padding: var(--su-s2);
    border: 0;
    background: none;
    color: var(--su-ink-soft);
    font-size: 20px;
    line-height: 1;
    border-radius: var(--su-radius-sm);
    cursor: pointer;
}

.signup .signup-modal-x:hover,
.signup .signup-modal-x:focus {
    background: var(--su-surface-2);
    color: var(--su-ink);
}

.signup .signup-modal-x:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
}

/* The one part that scrolls. The terms are operator-supplied and could be any
 * length. */
.signup .signup-modal-body {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: var(--su-s5);
    font-size: var(--su-fs-sm);
    line-height: 1.7;
    color: var(--su-ink-2);
}

.signup .signup-modal-body :last-child {
    margin-bottom: 0;
}

.signup .signup-modal-foot {
    display: flex;
    justify-content: flex-end;
    padding: var(--su-s3) var(--su-s5) var(--su-s4);
    border-top: 1px solid var(--su-line);
}

/*
 * The page behind the dialog must not scroll under it. UNSCOPED BY NECESSITY - the
 * class goes on <body>, which is outside `.signup` - and safe because signup.js is
 * the only thing that ever adds it, and it loads on this page alone.
 */
body.signup-modal-open {
    overflow: hidden;
}

/* ---- buttons and the actions row ---- */

.signup .signup-actions {
    display: flex;
    align-items: center;
    gap: var(--su-s3);
    margin-top: var(--su-s5);
}

.signup .signup-actions-spacer {
    flex: 1 1 auto;
}

.signup .signup-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--su-s2);
    min-height: 48px;
    padding: 0 var(--su-s6);
    border: 1px solid transparent;
    border-radius: var(--su-radius-sm);
    font-family: inherit;
    font-size: var(--su-fs-body);
    font-weight: 600;
    line-height: 1.2;
    text-align: center;
    text-decoration: none;
    cursor: pointer;
    transition: background-color .15s ease, box-shadow .15s ease, transform .06s ease;
}

.signup .signup-btn[hidden] {
    display: none;
}

.signup .signup-btn-primary {
    background: var(--su-btn);
    color: #fff;
    box-shadow: var(--su-shadow-sm);
}

.signup .signup-btn-primary:hover,
.signup .signup-btn-primary:focus {
    background: var(--su-btn-dark);
    color: #fff;
    text-decoration: none;
    box-shadow: var(--su-shadow-md);
}

/* Pressed state, not just hover: on touch there is no hover, and a 1px dip is the
 * only feedback between tap and page load. */
.signup .signup-btn-primary:active {
    background: var(--su-btn-darker);
    transform: translateY(1px);
    box-shadow: none;
}

.signup .signup-btn-ghost {
    background: transparent;
    border-color: var(--su-line-strong);
    color: var(--su-ink-2);
}

.signup .signup-btn-ghost:hover,
.signup .signup-btn-ghost:focus {
    background: var(--su-surface);
    color: var(--su-ink);
    text-decoration: none;
}

.signup .signup-btn:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
}

.signup .signup-foot {
    text-align: center;
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);
    margin: var(--su-s5) 0 0;
}

.signup .signup-foot strong {
    color: var(--su-ink-2);
}

/* ---- the error summary ---- */

.signup .signup-alert {
    display: flex;
    gap: var(--su-s3);
    background: var(--su-error-tint);
    border: 1px solid rgba(231, 81, 90, .25);
    border-radius: var(--su-radius-sm);
    padding: var(--su-s4);
    margin-bottom: var(--su-s4);
    color: #b3323a;
    font-size: var(--su-fs-sm);
}

.signup .signup-alert i {
    margin-top: 2px;
    flex: 0 0 auto;
    font-size: 18px;
}

.signup .signup-alert ul {
    padding-left: var(--su-s5);
    margin: 0;
}

/* ==========================================================================
 * The closed and success states
 * ========================================================================== */

.signup .signup-outcome {
    background: var(--su-surface);
    border: 1px solid var(--su-line);
    border-top: 3px solid var(--su-btn);
    border-radius: var(--su-radius);
    box-shadow: var(--su-shadow-sm);
    text-align: center;
    padding: var(--su-s12) var(--su-s6);
}

.signup .signup-outcome-icon {
    width: 64px;
    height: 64px;
    border-radius: 50%;
    margin: 0 auto var(--su-s5);
    font-size: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.signup .signup-outcome-ok .signup-outcome-icon {
    background: var(--su-ok-tint);
    color: var(--su-ok);
}

.signup .signup-outcome-closed .signup-outcome-icon {
    background: var(--su-bg);
    color: var(--su-ink-soft);
}

.signup .signup-outcome h2 {
    font-size: var(--su-fs-h1);
    font-weight: 500;
    margin: 0 0 var(--su-s3);
}

.signup .signup-outcome p {
    color: var(--su-ink-soft);
    font-size: var(--su-fs-sm);
    line-height: 1.65;
    max-width: 420px;
    margin: 0 auto var(--su-s5);
}

/* The new address, as text as well as behind the button: it is the one thing they
 * have to keep, and a link they can only click is a link they cannot write down.
 * Flex rather than the plain block of text this used to be - the copy button sits
 * inside the same box so the two read as one control, not as a caption with an
 * afterthought button under it. */
.signup .signup-outcome-url {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--su-s3);
    background: var(--su-surface-2);
    border: 1px solid var(--su-line);
    border-radius: var(--su-radius-sm);
    padding: 8px 8px 8px 14px;
    margin: var(--su-s5) auto var(--su-s3);
    max-width: 100%;
    text-align: left;
}

.signup .signup-outcome-url-text {
    font-family: SFMono-Regular, Menlo, Consolas, monospace;
    font-size: var(--su-fs-xs);
    color: var(--su-ink);
    word-break: break-all;
}

/* Ghost, not filled - this sits next to a primary CTA below it, and a second
 * strong button on the same panel would compete with the one that matters. */
.signup .signup-copy-btn {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    border: 1px solid var(--su-line-strong);
    background: var(--su-surface);
    color: var(--su-ink-soft);
    font-family: inherit;
    font-size: 12px;
    font-weight: 500;
    line-height: 1;
    padding: 7px 10px;
    border-radius: var(--su-radius-sm);
    cursor: pointer;
    transition: color .15s ease, border-color .15s ease;
}

.signup .signup-copy-btn:hover,
.signup .signup-copy-btn:focus {
    color: var(--su-brand);
    border-color: var(--su-brand);
}

.signup .signup-copy-btn:focus-visible {
    outline: none;
    box-shadow: var(--su-focus);
}

/* Attribute selector rather than `.la-copy` - JS swaps that class for
 * `.la-check` on a successful copy, and the size must hold across both. */
.signup .signup-copy-btn [data-signup-copy-icon] {
    font-size: 15px;
}

/* The state JS leaves behind for a couple of seconds once the copy succeeds -
 * same "colour says what happened" idea as the host feedback line above. */
.signup .signup-copy-btn[data-state="copied"] {
    color: var(--su-ok);
    border-color: var(--su-ok);
}

.signup .signup-outcome-note {
    font-size: var(--su-fs-xs);
}

/* Screen-reader only. `.signup-outcome-url`'s own colour change is silent to
 * anyone who cannot see it, so the copy confirmation is also announced through
 * this - visually hidden rather than `display:none`, which VoiceOver and
 * NVDA both ignore. */
.signup .signup-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;
}

/* --------------------------------------------------------------------------
 * The Pay button, and the marks under it
 *
 * This is the only button on the site that asks a stranger for money, and it
 * appears seconds after they finished a signup form. Everything below exists to
 * make it read as a CHECKOUT rather than as one more step of that form:
 *
 *   the card glyph      says what kind of action this is before the label is read
 *   the arrow           says the button LEAVES this page, which it does - the
 *                       processor hosts the card form, and a redirect nobody
 *                       expected is where people abandon a payment
 *   the scheme marks    answer "will it take my card" without a click
 *   the padlock line    answers "who gets my card number" - and the answer, that
 *                       it never reaches this site, is literally true of a hosted
 *                       checkout and is the reassurance that actually matters
 *
 * All of it is drawn with the Line Awesome font the page already loads. No image
 * is fetched, so there is nothing here to slow the panel down or to fail to load
 * behind a proxy.
 * -------------------------------------------------------------------------- */

.signup .signup-btn-pay {
    padding-left: var(--su-s5);
    padding-right: var(--su-s5);
}

.signup .signup-btn-pay .la-credit-card {
    font-size: 20px;
}

/* Nudged on hover, and ONLY on hover: a permanently offset arrow is a chevron,
 * and a moving one is a hint that something happens when you press it. */
.signup .signup-btn-pay .signup-btn-arrow {
    font-size: 18px;
    transition: transform .15s ease;
}

.signup .signup-btn-pay:hover .signup-btn-arrow,
.signup .signup-btn-pay:focus .signup-btn-arrow {
    transform: translateX(3px);
}

.signup .signup-paymarks {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--su-s3);
    margin: var(--su-s5) 0 var(--su-s2);

    /* Larger than body text because these are read as SHAPES, not as glyphs -
     * a card mark small enough to be mistaken for a bullet does no reassuring. */
    font-size: 30px;
    line-height: 1;

    /* Monochrome and muted on purpose. These are a statement of fact about what
     * is accepted, not four logos competing with the button above them; full
     * colour here would out-shout the one thing the panel wants pressed. */
    color: var(--su-ink-soft);
}

/* `.signup-outcome` is in the selector to WIN, not to describe where this lives.
 * The rule it has to beat is `.signup .signup-outcome p`, which is two classes
 * and an element - more specific than two classes - so a shorter selector here
 * would leave this line at body size inside a 420px column and the override
 * would look like it had simply been ignored. */
.signup .signup-outcome .signup-paysecure {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);

    /* Slightly wider than the 420px the outcome paragraphs use, so the sentence
     * sets on two lines rather than three, and tighter beneath - this line
     * belongs to the marks above it, not to the address below. */
    max-width: 460px;
    margin: 0 auto var(--su-s5);
}

.signup .signup-outcome .signup-paysecure .la-lock {
    font-size: 15px;
    flex-shrink: 0;
}

/* --------------------------------------------------------------------------
 * The receipt strip
 *
 * Drawn only on the panel a customer is returned to after a settled payment.
 * It exists because the alternative is what this page used to do: hand back an
 * unchanged success panel, minus a button, seconds after somebody authorised a
 * charge. Nothing on it said the money had arrived, and a payment that produces
 * no acknowledgement is one the payer goes and checks their statement over - or
 * pays a second time.
 *
 * Green, and the SAME green as the tick above it, because both are saying the
 * same thing about the same event. A second accent colour here would read as a
 * separate status the reader then has to interpret.
 * -------------------------------------------------------------------------- */

.signup .signup-receipt {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    gap: var(--su-s2);

    background: var(--su-ok-tint);
    border-radius: var(--su-radius-sm);
    padding: var(--su-s3) var(--su-s4);
    margin: 0 auto var(--su-s3);
    max-width: 420px;
}

.signup .signup-receipt .la-check-circle {
    font-size: 18px;
    color: var(--su-ok);
    flex-shrink: 0;
}

.signup .signup-receipt-head {
    font-size: var(--su-fs-sm);
    font-weight: 600;
    color: var(--su-ok);
}

/* The amount is the fact worth reading twice - it is what a card statement will
 * be checked against days from now - so it carries the panel's ink colour while
 * everything around it stays soft. */
.signup .signup-receipt-amount {
    font-size: var(--su-fs-body);
    font-weight: 600;
    color: var(--su-ink);
}

.signup .signup-receipt-plan {
    font-size: var(--su-fs-xs);
    color: var(--su-ink-soft);
}

/* `.signup-outcome` is in the selector to beat `.signup .signup-outcome p`,
 * which is two classes and an element - see the security line above. */
.signup .signup-outcome .signup-receipt-note {
    margin-bottom: var(--su-s5);
}

/* The secondary "pay now" on a panel whose primary action is signing in. Sized
 * down from the button above it so the order of the two is never in question. */
.signup .signup-btn-paylater {
    min-height: 40px;
    margin-top: var(--su-s4);
    font-size: var(--su-fs-sm);
}

.signup .signup-btn-paylater .la-credit-card {
    font-size: 17px;
}

/* ==========================================================================
 * Responsive
 *
 * Breakpoints are Bootstrap 4's - 576 / 768 / 992 - which are the ones the operator
 * panel uses too. 1024 was considered and rejected: it is not a Bootstrap boundary,
 * so the split would collapse 32px away from where every column inside the form
 * flips, leaving a 992-1024 band with the grid in one mode and this file in another.
 *
 * 320px is not a breakpoint, it is the narrowest width supported.
 * ========================================================================== */

/* ---- 992-1199: the split exists but the banner column is only ~5/12 of it. ---- */
@media (min-width: 992px) and (max-width: 1199.98px) {
    .signup {
        --su-fs-display: 28px;
    }

    .signup .signup-banner,
    .signup .signup-panel {
        padding-left: var(--su-s6);
        padding-right: var(--su-s6);
    }

    /* The workspace miniature is the first thing to go when the column narrows: it
     * illustrates, and the pitch and the promise do the work. */
    .signup .signup-art {
        display: none;
    }
}

/* ---- < 992: stacked. The banner becomes a top band. ---- */
@media (max-width: 991.98px) {
    .signup .signup-split {
        grid-template-columns: minmax(0, 1fr);
        min-height: 0;
    }

    .signup .signup-banner {
        padding: var(--su-s5) var(--su-s6);
    }

    .signup .signup-banner-inner {
        max-width: 620px;
        padding: var(--su-s5) 0 0;
    }

    .signup .signup-banner-heading {
        font-size: 24px;
        margin-bottom: var(--su-s3);
    }

    .signup .signup-banner-lede {
        font-size: var(--su-fs-sm);
        margin-bottom: 0;
    }

    /* The miniature, the bullet list and the module strip all go. They are the
     * half of the banner that costs vertical space a phone does not have; the
     * identity and the promise - the half that earns its place above a form - stay.
     * Deliberately NOT a toggle: a disclosure over marketing copy is a control
     * nobody opens. */
    .signup .signup-art,
    .signup .signup-points,
    .signup .signup-banner-modules {
        display: none;
    }

    .signup .signup-panel {
        padding: var(--su-s6);
    }
}

/* ---- < 768: single column fields, tighter chrome. ---- */
@media (max-width: 767.98px) {
    .signup .signup-banner {
        padding: var(--su-s4) var(--su-s4);
    }

    .signup .signup-banner-heading {
        font-size: 21px;
    }

    /* Below this width the band competes with the form for the first screen.
     * Brand, pill and heading are enough to say whose page this is. */
    .signup .signup-banner-lede {
        display: none;
    }

    .signup .signup-panel {
        padding: var(--su-s5) var(--su-s4) var(--su-s10);
    }

    .signup .signup-card {
        padding: var(--su-s4);
    }

    /* One column. A 6/6 split at this width gives each field ~160px, which is not
     * enough for a name, a month or a password. */
    .signup .signup-col-5,
    .signup .signup-col-6,
    .signup .signup-col-7 {
        grid-column: span 12;
    }

    /* The price and the trial pill stop sharing a line, because at this width the pill
     * would otherwise crowd the figure. */
    .signup .signup-plansummary-top {
        align-items: flex-start;
        flex-direction: column;
        gap: var(--su-s2);
    }

    /*
     * Two columns instead of one dot-separated line.
     *
     * Inline, the four quotas wrap here - and a wrapped separator lands at the START of
     * the new line, so the second row opened with a stray dot. A grid has no separators
     * to misplace, and at this width two columns is what the space affords anyway.
     */
    .signup .signup-plansummary-limits {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--su-s2) var(--su-s3);
    }

    .signup .signup-plansummary-limits li + li::before {
        content: none;
    }

    /* The step LABELS go, the markers and the track stay. "1 —— 2" still says how
     * far along you are, and it is the words that will not fit. */
    .signup .signup-steplabel {
        display: none;
    }

    .signup .signup-steps {
        gap: var(--su-s2);
    }
}

/* ---- < 576: the narrow phone. ---- */
@media (max-width: 575.98px) {
    .signup .signup-banner-top {
        gap: var(--su-s2);
    }

    .signup .signup-brand-mark {
        width: 36px;
        height: 36px;
    }

    .signup .signup-brand-word {
        font-size: 15px;
    }

    /* The pill is decoration, and at this width it is decoration that pushes the
     * wordmark onto a second line. */
    .signup .signup-pill {
        display: none;
    }

    .signup .signup-banner-heading {
        font-size: 19px;
    }

    .signup .signup-head h2 {
        font-size: 22px;
    }

    .signup .signup-panel {
        padding: var(--su-s4) var(--su-s3) var(--su-s8);
    }

    .signup .signup-card {
        padding: var(--su-s4) var(--su-s3);
    }

    .signup .signup-outcome {
        padding: var(--su-s8) var(--su-s3);
    }

    /* The address is the wide part; at this width it and the button no longer
     * share a row without the address text shrinking to nothing. */
    .signup .signup-outcome-url {
        flex-direction: column;
        align-items: stretch;
    }

    .signup .signup-copy-btn {
        justify-content: center;
    }

    /* Full-width, stacked, primary on top: the thumb reaches the bottom of the
     * screen first, and Back is the rarer of the two. */
    .signup .signup-actions {
        flex-direction: column-reverse;
        align-items: stretch;
        gap: var(--su-s2);
    }

    .signup .signup-actions-spacer {
        display: none;
    }

    .signup .signup-btn {
        width: 100%;
        min-height: 52px;
    }

    /* A sheet, not a card: at this width a centred box with a margin wastes the only
     * screen there is, and the terms are the thing being read. */
    .signup .signup-modal {
        padding: 0;
    }

    .signup .signup-modal-dialog {
        max-width: none;
        height: 100%;
        max-height: 100%;
        border-radius: 0;
    }

    .signup .signup-modal-head,
    .signup .signup-modal-body {
        padding-left: var(--su-s4);
        padding-right: var(--su-s4);
    }

    .signup .signup-modal-foot {
        padding: var(--su-s3) var(--su-s4) var(--su-s4);
    }
}

/* Honour the OS setting. The only motion here is a 1px button dip, two colour fades
 * and the step scroll, but a preference stated is a preference obeyed. */
@media (prefers-reduced-motion: reduce) {
    .signup .form-control,
    .signup .signup-btn,
    .signup .signup-copy-btn {
        transition: none;
    }

    .signup .signup-btn-primary:active {
        transform: none;
    }

    .signup .signup-btn-pay .signup-btn-arrow,
    .signup .signup-btn-pay:hover .signup-btn-arrow,
    .signup .signup-btn-pay:focus .signup-btn-arrow {
        transition: none;
        transform: none;
    }
}
