/*!
 * BestProsInTown Design System
 * ----------------------------------------------------------------------------
 * Distilled from the V3 home page (/views/new_home_page.php) so the same visual
 * language can be reused on redesigned pages and on new ones.
 *
 * HOW TO USE
 *   1. Load Inter (weights 400,500,700,800,900) — see /design-system/ for the tag.
 *   2. Load this file AFTER any legacy stylesheet:
 *        <link rel="stylesheet" href="/css_main/bestpros-ds.css">
 *   3. Put `bp-scope` on the element that owns the redesigned area — usually
 *      <body>, or a single <section> when a page is migrated piece by piece.
 *      Nothing here styles a bare element outside `.bp-scope`, so a legacy page
 *      keeps rendering exactly as before until you add that class.
 *
 * WHY EVERYTHING IS PREFIXED
 *   Legacy pages load bootstrap.min.css + style.css + vendors.css, which between
 *   them define `.btn` 684 times, `.feature` 208, `.container` 182, `.card` 69,
 *   `.arrow` 62 and `.small` 58. The reference page could use bare names because
 *   it loads none of them; a shared system cannot. Every class here is `bp-*` and
 *   every custom property is `--bp-*`.
 *
 * DO NOT wrap this file in @layer — unlayered legacy CSS would then outrank it.
 *
 * Living reference: /design-system/   ·   Brandbook: /docs/brandbook.md
 */

/* ==========================================================================
   1. TOKENS
   The only place a raw value is allowed to appear.
   ========================================================================== */

:root {
    /* --- Brand ------------------------------------------------------------
       --bp-brand is the logo indigo. It belongs to the mark only: it is not a
       UI colour and never fills a button or a link. --bp-blue is the interface
       accent, --bp-navy the heading/authority colour. */
    --bp-brand: #2e3192;
    --bp-navy: #102a66;
    --bp-blue: #185bd9;
    --bp-blue-hover: #0e51c9;
    --bp-blue-deep: #1651c2;
    /* gradient end that keeps white copy >= 5:1 */
    --bp-blue-soft: #2e6eea;
    /* decoration and gradients ONLY — 4.63:1, never for text */
    --bp-blue-50: #f3f7ff;
    --bp-blue-100: #e8f0ff;

    /* --- Neutrals ---------------------------------------------------------
       --bp-muted is one step darker than the reference #65728a so it clears AA
       on every surface below (4.24:1 -> 4.97:1 on --bp-blue-100). */
    --bp-ink: #172033;
    --bp-body: #3f4e66;
    --bp-muted: #5c677d;
    --bp-white: #fff;
    --bp-surface: #f7f9fc;
    --bp-surface-tint: #fbfdff;

    /* --- Lines ------------------------------------------------------------
       --bp-line / --bp-line-strong are DECORATIVE (1.25:1 / 1.47:1): card
       edges and dividers. Anything a user can operate gets --bp-line-control,
       which is the lightest blue-grey that still clears 3:1 on every surface
       in this palette (worst case 3.09:1 on --bp-blue-100). */
    --bp-line: #dfe7f3;
    --bp-line-strong: #c9d6ea;
    --bp-line-control: #7389b0;

    /* --- Status -----------------------------------------------------------
       Each text colour is AA on its own tint and on white. */
    --bp-success: #14804a;
    --bp-success-bg: #ecfdf5;
    --bp-warning: #9a5b0c;
    --bp-warning-bg: #fffbeb;
    --bp-danger: #b42318;
    --bp-danger-bg: #fef3f2;
    --bp-info: var(--bp-blue);
    --bp-info-bg: var(--bp-blue-100);

    /* --- Amber ------------------------------------------------------------
       --bp-amber is 2.15:1 on white: a decorative fill, never a text colour and
       never the sole carrier of meaning. Star glyphs are always accompanied by
       the rating as text (see .bp-rating). --bp-amber-ink is the readable one. */
    --bp-amber: #f59e0b;
    --bp-amber-ink: #9a5b0c;

    /* --- Type -------------------------------------------------------------
       Inter is loaded at 400/500/700/800/900. Anything between snaps to a
       neighbour — 760, 780 and 800 render identically, so do 850 and 900.
       Use these five and nothing else. */
    --bp-font: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    --bp-weight-regular: 400;
    --bp-weight-medium: 500;
    --bp-weight-bold: 700;
    --bp-weight-strong: 800;
    --bp-weight-black: 900;

    --bp-text-2xs: 11px;
    /* micro meta: addresses, captions */
    --bp-text-xs: 12px;
    /* meta, labels, eyebrow */
    --bp-text-sm: 13px;
    /* dense UI, card links */
    --bp-text-base: 14px;
    /* default UI size */
    --bp-text-md: 16px;
    /* body copy */
    --bp-text-lg: 17px;
    /* card titles */
    --bp-text-xl: 19px;
    /* small headings */
    --bp-text-2xl: 24px;
    --bp-text-3xl: 28px;

    --bp-display-1: clamp(50px, 6vw, 78px);
    --bp-display-2: clamp(34px, 4vw, 52px);
    --bp-display-3: clamp(32px, 4vw, 48px);
    --bp-lead: clamp(17px, 2vw, 20px);

    --bp-leading-tight: 1.05;
    --bp-leading-snug: 1.3;
    --bp-leading-normal: 1.55;
    --bp-leading-relaxed: 1.68;
    --bp-tracking-tight: -.04em;
    --bp-tracking-wide: .13em;

    /* --- Space ------------------------------------------------------------ */
    --bp-space-3xs: 4px;
    --bp-space-2xs: 8px;
    --bp-space-xs: 12px;
    --bp-space-sm: 16px;
    --bp-space-md: 24px;
    --bp-space-lg: 32px;
    --bp-space-xl: 48px;
    --bp-space-2xl: 64px;
    --bp-section-y: 82px;
    /* vertical rhythm between page bands */

    /* --- Radii ------------------------------------------------------------ */
    --bp-radius-xs: 10px;
    --bp-radius-sm: 12px;
    /* buttons, inputs */
    --bp-radius-md: 16px;
    /* inner tiles */
    --bp-radius-lg: 18px;
    /* cards */
    --bp-radius-xl: 20px;
    --bp-radius-2xl: 28px;
    /* feature panels */
    --bp-radius-pill: 999px;

    /* --- Elevation --------------------------------------------------------
       One shadow hue (a cool navy) at four depths, plus the blue glow that
       marks the single primary action on a screen. */
    --bp-shadow-sm: 0 8px 24px rgba(26, 48, 89, .05);
    --bp-shadow-md: 0 10px 26px rgba(26, 48, 89, .06);
    --bp-shadow-lg: 0 20px 50px rgba(26, 48, 89, .12);
    --bp-shadow-xl: 0 28px 80px rgba(18, 43, 99, .16);
    --bp-shadow-accent: 0 12px 26px rgba(24, 91, 217, .22);

    /* --- Motion ----------------------------------------------------------- */
    --bp-transition: .16s ease;
    --bp-transition-slow: .3s ease;

    /* --- Layout ------------------------------------------------------------ */
    --bp-container: 1200px;
    --bp-gutter: 20px;
    --bp-z-header: 50;
    --bp-z-dropdown: 900;
    --bp-z-dialog: 1000;
    --bp-z-skip: 1100;
    /* The z-scale had no slot for a bottom bar; it sits below the header. */
    --bp-z-actionbar: 40;

    /* The profile rail, and the offset a sticky header needs so it does not
       swallow every anchor target: 72px of header plus 24px. */
    --bp-rail: 344px;
    --bp-stick: 96px;

    /* --- Focus -------------------------------------------------------------
       One ring for the whole system. Never remove it without a replacement. */
    --bp-focus-ring: 0 0 0 3px rgba(24, 91, 217, .38);
    --bp-focus-color: var(--bp-blue);
}

/* Backgrounds that carry the brand. Declared as tokens so a band never
   hand-rolls its own gradient. */
:root {
    --bp-gradient-hero:
        radial-gradient(circle at 16% 10%, rgba(46, 110, 234, .09), transparent 25rem),
        radial-gradient(circle at 84% 18%, rgba(24, 91, 217, .10), transparent 28rem),
        linear-gradient(180deg, #f8fbff 0%, #edf4ff 72%, #fff 100%);
    --bp-gradient-soft: linear-gradient(180deg, #f9fbff, #eef5ff);
    --bp-gradient-brand: linear-gradient(135deg, var(--bp-navy), var(--bp-blue-deep));
    --bp-gradient-media: linear-gradient(135deg, var(--bp-navy), var(--bp-blue-soft));
}

/* ==========================================================================
   2. SCOPE
   Opt in with `class="bp-scope"`. Everything below is a descendant of it, so
   this file is inert on a page that has not opted in.
   ========================================================================== */

.bp-scope {
    color: var(--bp-ink);
    font-family: var(--bp-font);
    font-size: var(--bp-text-md);
    line-height: var(--bp-leading-normal);
    -webkit-font-smoothing: antialiased;
}

.bp-scope *,
.bp-scope *::before,
.bp-scope *::after {
    box-sizing: border-box;
}

.bp-scope h1,
.bp-scope h2,
.bp-scope h3,
.bp-scope h4,
.bp-scope h5,
.bp-scope h6 {
    margin-top: 0;
    color: var(--bp-navy);
    font-family: var(--bp-font);
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
}

.bp-scope svg {
    display: block;
    max-width: 100%;
}

.bp-scope button,
.bp-scope input,
.bp-scope select,
.bp-scope textarea {
    font: inherit;
}

/* The one global rule the reference design is missing entirely: it has no
   :focus-visible anywhere, and the hero search actively deletes the browser
   default. Keyboard users get a ring on everything inside the scope. */
.bp-scope :focus-visible {
    outline: 3px solid var(--bp-focus-color);
    outline-offset: 2px;
    border-radius: var(--bp-radius-xs);
}

/* ==========================================================================
   3. LAYOUT
   ========================================================================== */

.bp-container {
    width: min(calc(100% - var(--bp-gutter) * 2), var(--bp-container));
    margin-inline: auto;
}

.bp-section {
    padding-block: var(--bp-section-y);
}

.bp-section--soft {
    background: var(--bp-surface);
}

.bp-section--gradient {
    background: var(--bp-gradient-soft);
}

.bp-section--flush {
    padding-block: 0;
}

/* Heading block + trailing actions. Collapses to a column on small screens so
   the actions never squeeze the copy. */
.bp-section-head {
    margin-bottom: 30px;
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: var(--bp-space-md);
}

.bp-section-head>div {
    max-width: 760px;
}

.bp-section-head h2 {
    margin-bottom: var(--bp-space-2xs);
    font-size: var(--bp-display-3);
    line-height: 1.08;
}

.bp-section-head p {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-md);
}

.bp-section-actions {
    display: flex;
    align-items: center;
    gap: var(--bp-space-sm);
    flex: 0 0 auto;
}

/* Generic responsive grid: set --bp-cols, it drops to one column on phones. */
.bp-grid {
    --bp-cols: 3;
    display: grid;
    grid-template-columns: repeat(var(--bp-cols), minmax(0, 1fr));
    gap: var(--bp-space-sm) var(--bp-space-md);
}

.bp-split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--bp-space-xl);
    align-items: center;
}

.bp-divider {
    height: 1px;
    margin-block: var(--bp-space-md);
    border: 0;
    background: var(--bp-line);
}

/* ==========================================================================
   4. TYPOGRAPHY
   ========================================================================== */

.bp-display-1 {
    margin: 0 0 22px;
    color: var(--bp-navy);
    font-size: var(--bp-display-1);
    font-weight: var(--bp-weight-black);
    line-height: .98;
    letter-spacing: var(--bp-tracking-tight);
    text-wrap: balance;
}

.bp-display-2 {
    margin: 0 0 var(--bp-space-sm);
    color: var(--bp-navy);
    font-size: var(--bp-display-2);
    font-weight: var(--bp-weight-black);
    line-height: var(--bp-leading-tight);
    letter-spacing: var(--bp-tracking-tight);
}

.bp-display-3 {
    margin: 0 0 var(--bp-space-2xs);
    color: var(--bp-navy);
    font-size: var(--bp-display-3);
    font-weight: var(--bp-weight-black);
    line-height: 1.08;
    letter-spacing: var(--bp-tracking-tight);
}

.bp-heading {
    margin: 0 0 var(--bp-space-xs);
    color: var(--bp-navy);
    font-size: var(--bp-text-3xl);
    font-weight: var(--bp-weight-black);
    letter-spacing: -.03em;
}

.bp-subheading {
    margin: 0 0 var(--bp-space-3xs);
    color: var(--bp-navy);
    font-size: var(--bp-text-xl);
    font-weight: var(--bp-weight-black);
}

/* The kicker above a heading. Always uppercase, always ends up as the smallest
   blue thing on the band. */
.bp-eyebrow {
    margin-bottom: 14px;
    display: inline-flex;
    align-items: center;
    gap: 9px;
    color: var(--bp-blue);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-wide);
    text-transform: uppercase;
}

.bp-eyebrow::before {
    content: "";
    width: 8px;
    height: 8px;
    flex: 0 0 8px;
    border-radius: 50%;
    background: var(--bp-amber);
    box-shadow: 0 0 0 5px rgba(245, 158, 11, .14);
}

.bp-lead {
    margin: 0 0 28px;
    color: var(--bp-body);
    font-size: var(--bp-lead);
    line-height: var(--bp-leading-relaxed);
}

.bp-text {
    margin: 0 0 var(--bp-space-sm);
    color: var(--bp-muted);
    font-size: var(--bp-text-md);
}

.bp-text--ink {
    color: var(--bp-body);
}

.bp-emphasis {
    margin: 18px 0 0;
    color: var(--bp-navy);
    font-size: var(--bp-text-xl);
    font-weight: var(--bp-weight-black);
}

.bp-meta {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
    line-height: 1.45;
}

.bp-meta--tiny {
    font-size: var(--bp-text-2xs);
}

/* Link colours are repeated across :link/:visited/:hover/:focus/:active on
   purpose. On a legacy page an `a { color: … }` rule can otherwise outrank a
   single-state declaration and silently repaint the label. */
.bp-link,
.bp-link:link,
.bp-link:visited {
    color: var(--bp-blue);
    text-decoration: none;
}

.bp-link:hover,
.bp-link:focus,
.bp-link:active {
    color: var(--bp-blue-hover);
    text-decoration: underline;
    text-underline-offset: 3px;
}

.bp-text-link,
.bp-text-link:link,
.bp-text-link:visited,
.bp-text-link:hover,
.bp-text-link:focus,
.bp-text-link:active {
    color: var(--bp-blue);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-black);
    text-decoration: none;
}

.bp-text-link:hover {
    color: var(--bp-blue-hover);
}

/* ==========================================================================
   5. BUTTONS
   One primary action per view. Secondary is the outlined default; ghost is for
   dense toolbars; --on-dark is the pair used on the CTA band.
   ========================================================================== */

.bp-btn,
.bp-btn:link,
.bp-btn:visited {
    min-height: 48px;
    padding: 0 20px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--bp-space-2xs);
    border: 1px solid transparent;
    border-radius: var(--bp-radius-sm);
    color: var(--bp-white);
    background: var(--bp-blue);
    box-shadow: var(--bp-shadow-accent);
    font-family: var(--bp-font);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
    line-height: 1;
    text-align: center;
    text-decoration: none;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-btn:hover,
.bp-btn:focus,
.bp-btn:active {
    color: var(--bp-white);
    background: var(--bp-blue-hover);
    text-decoration: none;
}

.bp-btn:hover {
    transform: translateY(-1px);
}

.bp-btn svg {
    width: 18px;
    flex: 0 0 18px;
}

.bp-btn--secondary,
.bp-btn--secondary:link,
.bp-btn--secondary:visited,
.bp-btn--secondary:hover,
.bp-btn--secondary:focus,
.bp-btn--secondary:active {
    color: var(--bp-navy);
    background: var(--bp-white);
    /* --bp-line-control, not --bp-line-strong: this border is the button's
       whole shape, so it has to clear 3:1 on the band behind it. */
    border-color: var(--bp-line-control);
    box-shadow: none;
}

.bp-btn--secondary:hover {
    background: var(--bp-blue-50);
}

.bp-btn--ghost,
.bp-btn--ghost:link,
.bp-btn--ghost:visited,
.bp-btn--ghost:hover,
.bp-btn--ghost:focus,
.bp-btn--ghost:active {
    color: var(--bp-blue);
    background: transparent;
    border-color: var(--bp-line-control);
    box-shadow: none;
}

.bp-btn--ghost:hover {
    background: var(--bp-blue-50);
}

/* Inverted pair for use on --bp-gradient-brand. */
.bp-btn--on-dark,
.bp-btn--on-dark:link,
.bp-btn--on-dark:visited,
.bp-btn--on-dark:hover,
.bp-btn--on-dark:focus,
.bp-btn--on-dark:active {
    color: var(--bp-navy);
    background: var(--bp-white);
    border-color: transparent;
    box-shadow: none;
}

.bp-btn--on-dark-outline,
.bp-btn--on-dark-outline:link,
.bp-btn--on-dark-outline:visited,
.bp-btn--on-dark-outline:hover,
.bp-btn--on-dark-outline:focus,
.bp-btn--on-dark-outline:active {
    color: var(--bp-white);
    background: transparent;
    /* .7 alpha, not the reference .4: at .4 the border is 2.19:1 against the
       blue end of the gradient and the button loses its only edge. */
    border-color: rgba(255, 255, 255, .7);
    box-shadow: none;
}

.bp-btn--on-dark-outline:hover {
    background: rgba(255, 255, 255, .12);
}

.bp-btn--sm {
    min-height: 40px;
    padding: 0 14px;
    font-size: var(--bp-text-sm);
}

.bp-btn--lg {
    min-height: 56px;
    padding: 0 28px;
    font-size: var(--bp-text-md);
}

.bp-btn--block {
    width: 100%;
}

.bp-btn:disabled,
.bp-btn[aria-disabled="true"] {
    color: #6b7280;
    background: #e5e9f0;
    border-color: transparent;
    box-shadow: none;
    transform: none;
    cursor: not-allowed;
}

/* Round icon button: sliders, disclosure toggles, close buttons. */
.bp-icon-btn {
    width: 42px;
    height: 42px;
    flex: 0 0 42px;
    display: grid;
    place-items: center;
    padding: 0;
    border: 1px solid var(--bp-line-control);
    border-radius: 50%;
    color: var(--bp-navy);
    background: var(--bp-white);
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-icon-btn svg {
    width: 20px;
}

.bp-icon-btn:hover:not(:disabled) {
    color: var(--bp-white);
    border-color: var(--bp-blue);
    background: var(--bp-blue);
}

/* An explicit disabled pair beats opacity: at .35 the reference chevron falls
   to 2.08:1 and its border to 1.13:1, which is not a state anyone chose. */
.bp-icon-btn:disabled {
    color: #9aa5b8;
    border-color: var(--bp-line-strong);
    background: var(--bp-surface);
    cursor: default;
}

.bp-icon-btn--sm {
    width: 26px;
    height: 26px;
    flex: 0 0 26px;
}

.bp-icon-btn--sm svg {
    width: 14px;
}

/* ==========================================================================
   6. FORMS
   Absent from the reference design — it only ever shows the shared search
   widget — but every page being redesigned (add business, contact, payment)
   needs them, so they are built here from the same tokens.
   ========================================================================== */

.bp-field {
    display: grid;
    gap: 6px;
    margin-bottom: var(--bp-space-sm);
}

/* The label is always rendered and always associated with the control.
   A placeholder is a hint, never a label. */
.bp-label {
    color: #35445b;
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-strong);
    line-height: var(--bp-leading-snug);
}

.bp-label .bp-required {
    color: var(--bp-danger);
}

.bp-input,
.bp-select,
.bp-textarea {
    width: 100%;
    min-height: 48px;
    padding: 12px 14px;
    border: 1px solid var(--bp-line-control);
    border-radius: var(--bp-radius-sm);
    color: var(--bp-ink);
    background: var(--bp-white);
    font-family: var(--bp-font);
    font-size: var(--bp-text-base);
    transition: var(--bp-transition);
}

.bp-textarea {
    min-height: 120px;
    padding-block: 12px;
    line-height: var(--bp-leading-normal);
    resize: vertical;
}

.bp-select {
    padding-right: 40px;
    appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23102a66' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
    background-size: 18px;
}

/* Placeholder uses --bp-muted (5.69:1). The reference #8b96a8 is 2.99:1, and
   because its label is not wired up the placeholder is doing the labelling. */
.bp-input::placeholder,
.bp-textarea::placeholder {
    color: var(--bp-muted);
    opacity: 1;
}

.bp-input:hover,
.bp-select:hover,
.bp-textarea:hover {
    border-color: var(--bp-navy);
}

.bp-input:focus,
.bp-select:focus,
.bp-textarea:focus {
    border-color: var(--bp-blue);
    box-shadow: var(--bp-focus-ring);
    outline: none;
}

.bp-input[aria-invalid="true"],
.bp-select[aria-invalid="true"],
.bp-textarea[aria-invalid="true"] {
    border-color: var(--bp-danger);
}

.bp-input:disabled,
.bp-select:disabled,
.bp-textarea:disabled {
    color: #6b7280;
    background: var(--bp-surface);
    cursor: not-allowed;
}

.bp-help {
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

.bp-error {
    display: flex;
    align-items: center;
    gap: 6px;
    color: var(--bp-danger);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-bold);
}

/* Checkbox / radio: native control, sized up to the 20px the rest of the
   system's hit areas imply, with the label as the click target. */
.bp-choice {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding-block: 6px;
    color: var(--bp-body);
    font-size: var(--bp-text-base);
    cursor: pointer;
}

.bp-choice input {
    width: 20px;
    height: 20px;
    flex: 0 0 20px;
    margin: 1px 0 0;
    accent-color: var(--bp-blue);
    cursor: pointer;
}

.bp-fieldset {
    margin: 0 0 var(--bp-space-md);
    padding: 0;
    border: 0;
}

.bp-fieldset legend {
    padding: 0;
    margin-bottom: var(--bp-space-2xs);
    color: var(--bp-navy);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
}

/* Search bar: the shared /views/layout/search.php widget restyled to the
   system. Wrap the include in <div class="bp-searchbar">. */
.bp-searchbar {
    position: relative;
    z-index: 3;
    width: 100%;
    max-width: 1060px;
    margin-inline: auto;
    padding: 11px;
    border: 1px solid var(--bp-line-strong);
    border-radius: var(--bp-radius-lg);
    background: rgba(255, 255, 255, .95);
    box-shadow: 0 30px 80px rgba(18, 43, 99, .19);
}

.bp-searchbar .search-container {
    grid-template-columns: minmax(0, 1.16fr) minmax(0, .84fr) 146px;
    gap: 10px;
    font-family: var(--bp-font);
}

.bp-searchbar .field-group {
    min-width: 0;
    padding: 0 14px;
    border-right: 1px solid var(--bp-line);
    text-align: left;
}

.bp-searchbar .field-group+.field-group {
    border-right: 0;
}

.bp-searchbar .input-wrapper {
    min-height: 50px;
    grid-template-columns: 24px minmax(0, 1fr) auto;
    gap: 11px;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
}

/* The component removes its own focus ring; put one back on the whole field. */
.bp-searchbar .input-wrapper:focus-within {
    border: 0;
    border-radius: var(--bp-radius-xs);
    box-shadow: var(--bp-focus-ring);
}

.bp-searchbar .absolute-label {
    position: static;
    max-width: none;
    padding: 0;
    transform: none;
    background: transparent;
    color: #35445b;
    font-family: var(--bp-font);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-strong);
    line-height: var(--bp-leading-snug);
}

.bp-searchbar .search-input {
    width: 100%;
    height: 24px;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--bp-ink);
    font-family: var(--bp-font);
    font-size: var(--bp-text-base);
}

.bp-searchbar .search-input::placeholder {
    color: var(--bp-muted);
}

.bp-searchbar .search-button {
    min-width: 146px;
    min-height: 46px;
    padding: 0 20px;
    border-radius: var(--bp-radius-sm);
    background: var(--bp-blue);
    box-shadow: var(--bp-shadow-accent);
    font-family: var(--bp-font);
    font-size: 15px;
    font-weight: var(--bp-weight-black);
    letter-spacing: .02em;
}

.bp-searchbar .search-button:hover {
    background: var(--bp-blue-hover);
}

.bp-searchbar .suggestions-container {
    left: 0;
    z-index: var(--bp-z-dropdown);
    border-color: var(--bp-line);
    border-radius: var(--bp-radius-sm);
    box-shadow: 0 18px 44px rgba(18, 43, 99, .16);
    text-align: left;
}

/* ==========================================================================
   7. SURFACES
   ========================================================================== */

/* The white box a section's content sits in. */
.bp-panel {
    padding: 28px;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-xl);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-md);
}

.bp-panel--wide {
    padding: 34px;
}

/* The large two-column band: copy on one side, a visual on the other. */
.bp-feature {
    padding: 46px;
    display: grid;
    grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr);
    gap: var(--bp-space-xl);
    align-items: center;
    border: 1px solid #d5e2f5;
    border-radius: var(--bp-radius-2xl);
    background: rgba(255, 255, 255, .9);
    box-shadow: var(--bp-shadow-xl);
}

.bp-feature h2 {
    margin-bottom: var(--bp-space-sm);
    font-size: var(--bp-display-2);
    line-height: var(--bp-leading-tight);
}

.bp-feature p {
    margin: 0 0 15px;
    color: var(--bp-muted);
    font-size: var(--bp-text-md);
}

/* Full-bleed closing call to action. */
.bp-cta {
    padding-block: 72px;
    color: var(--bp-white);
    background:
        radial-gradient(circle at 85% 20%, rgba(255, 255, 255, .14), transparent 22rem),
        var(--bp-gradient-brand);
}

.bp-cta__inner {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 50px;
    align-items: center;
}

.bp-cta h2 {
    max-width: 760px;
    margin-bottom: 14px;
    color: var(--bp-white);
    font-size: clamp(36px, 4vw, 54px);
    line-height: 1.06;
}

/* rgba(255,255,255,.8) drops to 4.38:1 on the blue end once the band stacks on
   phones; a solid tint holds above 5:1 across the whole gradient. */
.bp-cta p {
    max-width: 760px;
    margin: 0;
    color: #dbe4f7;
    font-size: var(--bp-text-md);
}

.bp-cta .bp-eyebrow {
    color: var(--bp-white);
}

.bp-cta__actions {
    display: flex;
    flex-direction: column;
    gap: var(--bp-space-xs);
}

.bp-cta__actions .bp-btn {
    min-width: 190px;
}

/* Row of reassurance statements under a hero. */
.bp-trustbar {
    position: relative;
    z-index: 2;
    border-block: 1px solid rgba(201, 214, 234, .8);
    background: rgba(255, 255, 255, .88);
}

.bp-trustbar__grid {
    min-height: 92px;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 28px;
    align-items: center;
}

.bp-trustbar__item {
    display: flex;
    align-items: center;
    gap: 13px;
    color: #40506a;
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-bold);
}

/* ==========================================================================
   8. ICON TILES
   Inline SVG only: 24x24 viewBox, fill="none", stroke="currentColor",
   stroke-width="2". Never a raster icon, never an icon font.
   ========================================================================== */

.bp-icon-tile {
    width: 38px;
    height: 38px;
    flex: 0 0 38px;
    display: grid;
    place-items: center;
    border-radius: var(--bp-radius-sm);
    color: var(--bp-blue);
    background: var(--bp-blue-100);
}

.bp-icon-tile svg {
    width: 20px;
}

.bp-icon-tile--md {
    width: 44px;
    height: 44px;
    flex-basis: 44px;
    border-radius: 14px;
}

.bp-icon-tile--md svg {
    width: 23px;
}

.bp-icon-tile--lg {
    width: 54px;
    height: 54px;
    flex-basis: 54px;
    border-radius: var(--bp-radius-md);
}

.bp-icon-tile--lg svg {
    width: 28px;
}

.bp-icon-tile--solid {
    color: var(--bp-white);
    background: linear-gradient(145deg, var(--bp-blue), var(--bp-navy));
}

/* ==========================================================================
   9. CARDS
   A row of cards is as tall as its tallest card, so every block that can wrap
   gets a fixed line budget. That way the cards come out the same height on
   their own and every footer lands on one baseline.
   ========================================================================== */

.bp-card {
    overflow: hidden;
    display: flex;
    flex-direction: column;
    height: 100%;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-lg);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-md);
    transition: .18s;
}

.bp-card:hover {
    transform: translateY(-4px);
    border-color: #b9cae1;
    box-shadow: var(--bp-shadow-lg);
}

.bp-card__media {
    height: 150px;
    flex: 0 0 150px;
    overflow: hidden;
    background: var(--bp-gradient-media);
}

.bp-card__media a {
    display: block;
    width: 100%;
    height: 100%;
}

.bp-card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.bp-card__body {
    padding: 18px;
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
}

.bp-card__title {
    margin: 0;
    display: -webkit-box;
    min-height: 2.6em;
    overflow: hidden;
    color: var(--bp-navy);
    font-size: var(--bp-text-lg);
    font-weight: var(--bp-weight-black);
    line-height: var(--bp-leading-snug);
    letter-spacing: normal;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

.bp-card__title a,
.bp-card__title a:link,
.bp-card__title a:visited {
    color: inherit;
    text-decoration: none;
}

.bp-card__title a:hover,
.bp-card__title a:focus {
    color: var(--bp-blue);
}

/* One line, ellipsis. */
.bp-card__meta {
    margin: 3px 0 0;
    overflow: hidden;
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
    line-height: 1.45;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Two lines, always occupies two so the cards stay aligned. */
.bp-card__meta--2line {
    display: -webkit-box;
    min-height: 2.9em;
    white-space: normal;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

.bp-card__excerpt {
    margin: var(--bp-space-xs) 0 0;
    display: -webkit-box;
    min-height: 4.65em;
    overflow: hidden;
    color: #4b5a70;
    font-size: var(--bp-text-sm);
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
}

/* Whatever slack a stretched card still has collects above the divider, so the
   footer keeps its own gap and stays flush with the card bottom. */
.bp-card__body>*:nth-last-child(2) {
    margin-bottom: auto;
}

.bp-card__footer {
    margin-top: var(--bp-space-sm);
    padding-top: 14px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-xs);
    border-top: 1px solid var(--bp-line);
}

.bp-card__action,
.bp-card__action:link,
.bp-card__action:visited,
.bp-card__action:hover,
.bp-card__action:focus,
.bp-card__action:active {
    color: var(--bp-blue);
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-black);
    text-decoration: none;
}

.bp-card__aside,
.bp-card__aside:link,
.bp-card__aside:visited {
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-bold);
    text-decoration: none;
    white-space: nowrap;
}

.bp-card__aside:hover,
.bp-card__aside:focus {
    color: var(--bp-blue);
}

/* Compact horizontal tile: thumbnail + title, used for stories and related
   links. */
.bp-tile {
    padding: var(--bp-space-xs);
    display: grid;
    grid-template-columns: 86px minmax(0, 1fr);
    gap: var(--bp-space-xs);
    align-items: center;
    min-height: 118px;
    border: 1px solid var(--bp-line);
    border-radius: 14px;
    background: var(--bp-white);
}

.bp-tile__thumb {
    height: 74px;
    overflow: hidden;
    border-radius: var(--bp-radius-xs);
    background: var(--bp-gradient-media);
}

.bp-tile__thumb a,
.bp-tile__thumb img {
    display: block;
    width: 100%;
    height: 100%;
}

.bp-tile__thumb img {
    object-fit: cover;
}

.bp-tile h3 {
    margin: 0 0 6px;
    display: -webkit-box;
    overflow: hidden;
    font-size: var(--bp-text-base);
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

.bp-tile h3 a,
.bp-tile h3 a:link,
.bp-tile h3 a:visited {
    color: inherit;
    text-decoration: none;
}

.bp-tile h3 a:hover,
.bp-tile h3 a:focus {
    color: var(--bp-blue);
}

.bp-tile__link,
.bp-tile__link:link,
.bp-tile__link:visited,
.bp-tile__link:hover,
.bp-tile__link:focus {
    color: var(--bp-blue);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-black);
    text-decoration: none;
}

/* Bordered tile with a centred icon over a label. */
.bp-info-tile {
    min-height: 150px;
    padding: 18px 14px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-md);
    background: var(--bp-white);
}

.bp-info-tile .bp-icon-tile {
    margin-bottom: var(--bp-space-xs);
}

.bp-info-tile h3 {
    margin: 0 0 5px;
    font-size: var(--bp-text-base);
}

.bp-info-tile p {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-2xs);
}

/* Wide callout: icon, heading, one line of explanation. */
.bp-callout {
    padding: 22px;
    display: grid;
    grid-template-columns: 54px 1fr;
    gap: var(--bp-space-sm);
    align-items: center;
    border: 1px solid #b9cae4;
    border-radius: var(--bp-radius-lg);
    background: var(--bp-white);
    box-shadow: 0 10px 24px rgba(26, 48, 89, .08);
}

.bp-callout h3 {
    margin: 0 0 var(--bp-space-3xs);
    font-size: var(--bp-text-xl);
}

.bp-callout p {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-sm);
}

/* ==========================================================================
   10. RATING
   The stars are decoration. The rating value is text, always, so the amber
   glyphs (2.15:1) never carry the meaning on their own.
     <div class="bp-rating">
       <span class="bp-rating__value">4.9</span>
       <span class="bp-stars" aria-hidden="true">★★★★★</span>
       <span class="bp-rating__count">(82)</span>
     </div>
   ========================================================================== */

.bp-rating {
    margin-top: var(--bp-space-xs);
    display: flex;
    align-items: center;
    gap: 7px;
    color: #526078;
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-bold);
}

.bp-stars {
    color: var(--bp-amber);
    letter-spacing: 2px;
}

.bp-rating__value {
    color: var(--bp-navy);
    font-weight: var(--bp-weight-strong);
}

.bp-rating__count {
    color: var(--bp-muted);
}

/* ==========================================================================
   11. REVIEW CARD
   ========================================================================== */

.bp-review {
    min-width: 0;
    padding: 20px;
    display: flex;
    flex-direction: column;
    min-height: 100%;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-md);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-sm);
}

.bp-review .bp-rating {
    margin: 0 0 9px;
}

.bp-review blockquote {
    margin: 0;
    display: -webkit-box;
    overflow: hidden;
    color: var(--bp-body);
    font-size: var(--bp-text-base);
    line-height: 1.62;
    -webkit-line-clamp: 6;
    -webkit-box-orient: vertical;
}

.bp-review__business {
    margin-top: auto;
    padding-top: 14px;
    display: grid;
    gap: var(--bp-space-3xs);
}

.bp-review__business strong {
    color: var(--bp-navy);
    font-size: var(--bp-text-sm);
}

.bp-review__business strong a,
.bp-review__business strong a:link,
.bp-review__business strong a:visited {
    color: inherit;
    text-decoration: none;
}

.bp-review__business strong a:hover,
.bp-review__business strong a:focus {
    color: var(--bp-blue);
}

.bp-review__business address {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-2xs);
    font-style: normal;
    line-height: 1.45;
}

/* Direct child only: the phone link. The business-name link sits inside the
   <strong> above and keeps that element's navy, so an unscoped descendant
   selector would flatten the name to phone-link styling. */
.bp-review__business>a,
.bp-review__business>a:link,
.bp-review__business>a:visited,
.bp-review__business>a:hover,
.bp-review__business>a:focus {
    width: max-content;
    color: var(--bp-blue);
    font-size: var(--bp-text-2xs);
    font-weight: var(--bp-weight-strong);
    text-decoration: none;
}

/* ==========================================================================
   12. SLIDER
   Scroll-snap track driven by two arrows; the scrollbar is hidden but the
   track still scrolls with a wheel, a trackpad or a keyboard.
   ========================================================================== */

.bp-slider {
    --bp-per: 4;
    --bp-slider-gap: 18px;
    position: relative;
}

.bp-slider__track {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: calc((100% - var(--bp-slider-gap) * (var(--bp-per) - 1)) / var(--bp-per));
    gap: var(--bp-slider-gap);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    padding: 6px 0 var(--bp-space-sm);
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.bp-slider__track::-webkit-scrollbar {
    width: 0;
    height: 0;
    display: none;
}

.bp-slider__track>* {
    min-width: 0;
    scroll-snap-align: start;
}

.bp-slider__nav {
    display: flex;
    align-items: center;
    gap: var(--bp-space-2xs);
    flex: 0 0 auto;
}

.bp-slider--3 {
    --bp-per: 3;
    --bp-slider-gap: 16px;
}

.bp-slider--2 {
    --bp-per: 2;
}

/* ==========================================================================
   13. DIRECTORY
   Link-dense listing (states -> cities, categories -> subcategories) where each
   group keeps one visible row and a chevron reveals the rest.
   ========================================================================== */

.bp-directory__group+.bp-directory__group {
    margin-top: 36px;
    padding-top: 34px;
    border-top: 1px solid var(--bp-line);
}

.bp-directory__heading {
    margin: 0 0 22px;
    color: var(--bp-navy);
    font-size: var(--bp-text-3xl);
    letter-spacing: -.03em;
}

.bp-directory__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 18px 30px;
}

.bp-region {
    padding-bottom: 13px;
    border-bottom: 1px solid #edf1f7;
}

.bp-region__head {
    min-height: 22px;
    margin-bottom: 7px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-2xs);
}

.bp-region__name {
    margin: 0;
    color: var(--bp-ink);
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-black);
    letter-spacing: -.01em;
}

.bp-region__name a,
.bp-region__name a:link,
.bp-region__name a:visited {
    color: inherit;
    text-decoration: none;
}

.bp-region__name a:hover,
.bp-region__name a:focus {
    color: var(--bp-blue);
}

.bp-region__toggle {
    display: none;
}

.bp-region.is-collapsible .bp-region__toggle {
    display: grid;
}

.bp-region__toggle svg {
    transition: transform var(--bp-transition);
}

.bp-region.is-open .bp-region__toggle svg {
    transform: rotate(180deg);
}

.bp-region__links {
    display: flex;
    flex-wrap: wrap;
    gap: 5px 11px;
}

/* Collapsed: one row. `visibility` matters — clipping with overflow alone
   leaves the hidden links in the tab order while the toggle still reports
   aria-expanded="false". */
.bp-region.is-collapsible .bp-region__links {
    max-height: 18px;
    overflow: hidden;
}

.bp-region.is-collapsible .bp-region__links>*:not(:first-child) {
    visibility: hidden;
}

.bp-region.is-collapsible.is-open .bp-region__links {
    max-height: none;
    overflow: visible;
}

.bp-region.is-collapsible.is-open .bp-region__links>* {
    visibility: visible;
}

.bp-region__links a,
.bp-region__links a:link,
.bp-region__links a:visited {
    color: var(--bp-blue);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-bold);
    line-height: 1.45;
    text-decoration: none;
    /* keeps a city on one line so the collapsed row height is predictable */
    white-space: nowrap;
}

.bp-region__links a:hover,
.bp-region__links a:focus {
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* ==========================================================================
   14. BADGES, PILLS, ALERTS
   ========================================================================== */

.bp-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: var(--bp-radius-pill);
    color: var(--bp-navy);
    background: var(--bp-blue-100);
    font-size: var(--bp-text-2xs);
    font-weight: var(--bp-weight-strong);
    letter-spacing: .02em;
    line-height: 1.4;
    white-space: nowrap;
}

.bp-badge svg {
    width: 13px;
    flex: 0 0 13px;
}

.bp-badge--success {
    color: var(--bp-success);
    background: var(--bp-success-bg);
}

.bp-badge--warning {
    color: var(--bp-warning);
    background: var(--bp-warning-bg);
}

.bp-badge--danger {
    color: var(--bp-danger);
    background: var(--bp-danger-bg);
}

.bp-badge--neutral {
    color: var(--bp-body);
    background: var(--bp-surface);
}

/* Award / verified badge: the one place amber is allowed to carry a label,
   and it does so as --bp-amber-ink on a pale tint, never white on amber. */
.bp-badge--award {
    color: var(--bp-amber-ink);
    background: var(--bp-warning-bg);
}

/* Selectable filter chip. */
.bp-pill,
.bp-pill:link,
.bp-pill:visited {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    min-height: 34px;
    padding: 0 14px;
    border: 1px solid var(--bp-line-control);
    border-radius: var(--bp-radius-pill);
    color: var(--bp-body);
    background: var(--bp-white);
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-bold);
    text-decoration: none;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-pill:hover,
.bp-pill:focus {
    color: var(--bp-navy);
    background: var(--bp-blue-50);
    text-decoration: none;
}

.bp-pill[aria-pressed="true"],
.bp-pill.is-active {
    color: var(--bp-white);
    border-color: var(--bp-blue);
    background: var(--bp-blue);
}

.bp-alert {
    display: flex;
    align-items: flex-start;
    gap: var(--bp-space-xs);
    padding: 14px 16px;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-sm);
    color: var(--bp-body);
    background: var(--bp-surface);
    font-size: var(--bp-text-base);
}

.bp-alert svg {
    width: 20px;
    flex: 0 0 20px;
    margin-top: 1px;
}

.bp-alert--info {
    color: var(--bp-navy);
    border-color: #bcd2f7;
    background: var(--bp-info-bg);
}

.bp-alert--success {
    color: var(--bp-success);
    border-color: #a7e0c4;
    background: var(--bp-success-bg);
}

.bp-alert--warning {
    color: var(--bp-warning);
    border-color: #f3d9a3;
    background: var(--bp-warning-bg);
}

.bp-alert--danger {
    color: var(--bp-danger);
    border-color: #f2b8b3;
    background: var(--bp-danger-bg);
}

/* ==========================================================================
   15. NAVIGATION PATTERNS
   ========================================================================== */

.bp-breadcrumbs {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin: 0 0 var(--bp-space-sm);
    padding: 0;
    list-style: none;
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

.bp-breadcrumbs li {
    display: flex;
    align-items: center;
    gap: 6px;
}

.bp-breadcrumbs li+li::before {
    content: "/";
    color: var(--bp-line-control);
}

.bp-breadcrumbs a,
.bp-breadcrumbs a:link,
.bp-breadcrumbs a:visited {
    color: var(--bp-blue);
    font-weight: var(--bp-weight-bold);
    text-decoration: none;
}

.bp-breadcrumbs a:hover,
.bp-breadcrumbs a:focus {
    text-decoration: underline;
    text-underline-offset: 3px;
}

.bp-breadcrumbs [aria-current="page"] {
    color: var(--bp-muted);
}

.bp-pagination {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin: var(--bp-space-md) 0 0;
    padding: 0;
    list-style: none;
}

.bp-pagination a,
.bp-pagination a:link,
.bp-pagination a:visited,
.bp-pagination span {
    min-width: 42px;
    min-height: 42px;
    padding: 0 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--bp-line-control);
    border-radius: var(--bp-radius-xs);
    color: var(--bp-navy);
    background: var(--bp-white);
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-bold);
    text-decoration: none;
    transition: var(--bp-transition);
}

.bp-pagination a:hover,
.bp-pagination a:focus {
    color: var(--bp-white);
    border-color: var(--bp-blue);
    background: var(--bp-blue);
}

.bp-pagination [aria-current="page"] {
    color: var(--bp-white);
    border-color: var(--bp-blue);
    background: var(--bp-blue);
}

.bp-pagination .bp-pagination__gap {
    min-width: auto;
    border: 0;
    background: transparent;
    color: var(--bp-muted);
}

.bp-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bp-space-md);
    margin-bottom: var(--bp-space-md);
    border-bottom: 1px solid var(--bp-line);
}

.bp-tabs button,
.bp-tabs a {
    padding: 0 2px 12px;
    border: 0;
    border-bottom: 2px solid transparent;
    color: var(--bp-muted);
    background: none;
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
    text-decoration: none;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-tabs button:hover,
.bp-tabs a:hover {
    color: var(--bp-navy);
}

.bp-tabs [aria-selected="true"],
.bp-tabs [aria-current="page"] {
    color: var(--bp-navy);
    border-bottom-color: var(--bp-blue);
}

/* Disclosure. The panel is toggled with the `hidden` attribute rather than a
   height animation, so collapsed content leaves the tab order with it. */
.bp-accordion__item {
    border-bottom: 1px solid var(--bp-line);
}

.bp-accordion__trigger {
    width: 100%;
    padding: 17px 2px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-xs);
    border: 0;
    color: var(--bp-navy);
    background: none;
    font-size: var(--bp-text-md);
    font-weight: var(--bp-weight-strong);
    text-align: left;
    cursor: pointer;
}

.bp-accordion__trigger svg {
    width: 18px;
    flex: 0 0 18px;
    transition: transform var(--bp-transition);
}

.bp-accordion__trigger[aria-expanded="true"] svg {
    transform: rotate(180deg);
}

.bp-accordion__panel {
    padding: 0 2px 18px;
    color: var(--bp-body);
    font-size: var(--bp-text-base);
}

.bp-accordion__panel[hidden] {
    display: none;
}

/* ==========================================================================
   16. TABLE
   ========================================================================== */

.bp-table-wrap {
    overflow-x: auto;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-md);
}

.bp-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--bp-text-base);
}

.bp-table th,
.bp-table td {
    padding: 13px 16px;
    text-align: left;
    border-bottom: 1px solid var(--bp-line);
}

.bp-table th {
    color: var(--bp-navy);
    background: var(--bp-surface);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-strong);
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
}

.bp-table td {
    color: var(--bp-body);
}

.bp-table tbody tr:last-child td {
    border-bottom: 0;
}

.bp-table tbody tr:hover td {
    background: var(--bp-blue-50);
}

/* ==========================================================================
   17. PRICING
   ========================================================================== */

.bp-price {
    position: relative;
    padding: 28px;
    display: flex;
    flex-direction: column;
    height: 100%;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-xl);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-md);
}

/* Exactly one plan per page may be featured. */
.bp-price--featured {
    border-color: var(--bp-blue);
    box-shadow: var(--bp-shadow-lg);
}

.bp-price__name {
    margin: 0 0 var(--bp-space-3xs);
    color: var(--bp-navy);
    font-size: var(--bp-text-xl);
    font-weight: var(--bp-weight-black);
}

.bp-price__amount {
    display: flex;
    align-items: baseline;
    gap: 6px;
    margin: var(--bp-space-2xs) 0 var(--bp-space-sm);
    color: var(--bp-navy);
    font-size: 44px;
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
    line-height: 1;
}

.bp-price__period {
    color: var(--bp-muted);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-bold);
    letter-spacing: normal;
}

.bp-price__features {
    margin: 0 0 var(--bp-space-md);
    padding: 0;
    list-style: none;
    display: grid;
    gap: var(--bp-space-2xs);
    color: var(--bp-body);
    font-size: var(--bp-text-base);
}

.bp-price__features li {
    display: flex;
    align-items: flex-start;
    gap: var(--bp-space-2xs);
}

.bp-price__features svg {
    width: 18px;
    flex: 0 0 18px;
    margin-top: 2px;
    color: var(--bp-success);
}

.bp-price .bp-btn {
    margin-top: auto;
}

/* ==========================================================================
   18. STATES
   ========================================================================== */

.bp-empty {
    padding: 48px 24px;
    display: grid;
    justify-items: center;
    gap: var(--bp-space-xs);
    text-align: center;
    border: 1px dashed var(--bp-line-strong);
    border-radius: var(--bp-radius-lg);
    background: var(--bp-surface-tint);
}

.bp-empty h3 {
    margin: 0;
    font-size: var(--bp-text-xl);
}

.bp-empty p {
    margin: 0;
    max-width: 46ch;
    color: var(--bp-muted);
    font-size: var(--bp-text-base);
}

.bp-skeleton {
    border-radius: var(--bp-radius-xs);
    background: linear-gradient(90deg, #eef2f8 25%, #f7f9fc 37%, #eef2f8 63%);
    background-size: 400% 100%;
    animation: bp-skeleton 1.4s ease infinite;
}

@keyframes bp-skeleton {
    0% {
        background-position: 100% 50%;
    }

    100% {
        background-position: 0 50%;
    }
}

.bp-skeleton--text {
    height: 12px;
    margin-bottom: var(--bp-space-2xs);
}

.bp-skeleton--title {
    height: 20px;
    width: 60%;
    margin-bottom: var(--bp-space-xs);
}

.bp-skeleton--media {
    height: 150px;
    border-radius: var(--bp-radius-lg) var(--bp-radius-lg) 0 0;
}

/* ==========================================================================
   19. DIALOG
   Built for the native <dialog> element so focus trapping, Esc and the
   top layer come from the browser instead of a script.
   ========================================================================== */

.bp-dialog {
    width: min(calc(100% - 32px), 560px);
    padding: 28px;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-xl);
    color: var(--bp-ink);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-xl);
}

.bp-dialog::backdrop {
    background: rgba(16, 42, 102, .45);
}

.bp-dialog__head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--bp-space-sm);
    margin-bottom: var(--bp-space-xs);
}

.bp-dialog__head h2 {
    margin: 0;
    font-size: var(--bp-text-2xl);
}

.bp-dialog__actions {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: var(--bp-space-2xs);
    margin-top: var(--bp-space-md);
}

/* ==========================================================================
   20. UTILITIES
   ========================================================================== */

.bp-skip {
    position: fixed;
    top: 8px;
    left: 8px;
    z-index: var(--bp-z-skip);
    padding: 10px 14px;
    color: var(--bp-white);
    background: var(--bp-navy);
    border-radius: var(--bp-radius-xs);
    text-decoration: none;
    transform: translateY(-160%);
}

.bp-skip:focus {
    color: var(--bp-white);
    transform: none;
}

.bp-visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

.bp-stack {
    display: grid;
    gap: var(--bp-space-sm);
}

.bp-stack--tight {
    gap: var(--bp-space-2xs);
}

.bp-stack--loose {
    gap: var(--bp-space-md);
}

.bp-cluster {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--bp-space-xs);
}

.bp-actions {
    margin-top: var(--bp-space-md);
    display: flex;
    flex-wrap: wrap;
    gap: var(--bp-space-xs);
}

.bp-truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.bp-clamp-2,
.bp-clamp-3 {
    display: -webkit-box;
    overflow: hidden;
    -webkit-box-orient: vertical;
}

.bp-clamp-2 {
    -webkit-line-clamp: 2;
}

.bp-clamp-3 {
    -webkit-line-clamp: 3;
}

/* ==========================================================================
   21. RESPONSIVE
   Three breakpoints, matching the reference: 1060 (two columns collapse),
   820 (tablet/phone split, nav collapses) and 580 (phone).
   ========================================================================== */

@media (max-width: 1060px) {

    /* minmax(0, 1fr), never a bare 1fr: a grid item defaults to min-width:auto,
       so one long unbreakable child (a nowrap city link, a wide table) would
       stretch the track past the viewport instead of being contained. */
    .bp-split,
    .bp-feature {
        grid-template-columns: minmax(0, 1fr);
    }

    .bp-grid {
        --bp-cols: 2;
    }

    .bp-directory__grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .bp-slider {
        --bp-per: 2;
    }

    .bp-slider--3 {
        --bp-per: 2;
    }
}

@media (max-width: 820px) {

    .bp-section-head,
    .bp-cta__inner {
        display: flex;
        align-items: flex-start;
        flex-direction: column;
    }

    .bp-section-actions {
        margin-top: 18px;
    }

    .bp-trustbar__grid {
        grid-template-columns: 1fr;
        padding-block: var(--bp-space-sm);
    }

    .bp-cta__actions {
        width: 100%;
        flex-direction: row;
    }

    .bp-cta__actions .bp-btn {
        flex: 1;
    }

    .bp-searchbar .search-container {
        grid-template-columns: 1fr;
    }

    .bp-searchbar .field-group {
        border-right: 0;
        border-bottom: 1px solid var(--bp-line);
    }

    .bp-searchbar .field-group+.field-group {
        border-bottom: 0;
    }

    .bp-searchbar .search-button {
        width: 100%;
    }
}

@media (max-width: 580px) {
    :root {
        --bp-gutter: 14px;
        --bp-section-y: 64px;
    }

    .bp-grid,
    .bp-directory__grid {
        --bp-cols: 1;
        grid-template-columns: minmax(0, 1fr);
    }

    .bp-slider,
    .bp-slider--3 {
        --bp-per: 1;
    }

    .bp-feature {
        padding: var(--bp-space-md);
        border-radius: var(--bp-radius-xl);
    }

    .bp-panel,
    .bp-panel--wide {
        padding: var(--bp-space-sm);
    }

    .bp-callout {
        grid-template-columns: minmax(0, 1fr);
        text-align: center;
    }

    .bp-callout .bp-icon-tile {
        margin-inline: auto;
    }

    .bp-cta__actions {
        flex-direction: column;
    }
}

@media (prefers-reduced-motion: reduce) {
    .bp-scope * {
        transition-duration: .01ms !important;
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
    }
}

/* ==========================================================================
   21. BUSINESS PROFILE
   The profile page: masthead and verdict card, the panels the body is built
   from, the photo collage, the mobile action bar, and the two form dialogs
   it opens. Everything here arrived with the profile redesign and was
   reviewed as /design-system/business-profile.php before it moved in.
   ========================================================================== */

html {
    scroll-padding-top: var(--bp-stick);
}

/* The system resets nothing on <body>, so the user agent's 8px margin
   survives and every full-bleed band gets a white gutter. Legacy pages
   hide this because bootstrap zeroes it; a page on the system alone
   does not. */
body.bp-scope {
    margin: 0;
}

/* .bp-scope resets no images at all, while the legacy theme sets
   img{margin-bottom:1.857em} and .feature img{max-width:20px}. */
.bp-scope img {
    max-width: 100%;
    margin-bottom: 0;
}

/* --- Layout: main column + rail ---------------------------------- */
.bp-layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) var(--bp-rail);
    gap: var(--bp-space-lg);
    align-items: start;
}

/* Both columns are single-column grids, and an implicit track is sized to
   its contents: an ad whose creative came back wider than the column grew
   the track, and the column and the page with it. minmax(0, 1fr) holds the
   track to the column, so nothing inside one can widen it. */
.bp-layout__main,
.bp-rail {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--bp-space-sm);
    min-width: 0;
}

/* A rail taller than the viewport is worse than no sticky at all: once
   it pins, its lower half is unreachable until the whole page has been
   scrolled. So the rail is kept short — actions and status only, with
   the ad slot moved into the main column — and it only pins on screens
   with room for it. Below that it is an ordinary column. */
@media (min-width: 1061px) and (min-height: 740px) {
    .bp-rail--sticky {
        position: sticky;
        top: var(--bp-stick);
    }
}

@media (max-width: 1060px) {
    .bp-layout {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* --- Profile head -------------------------------------------------
   There is no hero in the system: --bp-gradient-hero is declared and
   used nowhere, .bp-cta is a closing band and .bp-section-head caps
   its copy at 760px. This is the masthead. */
.bp-profile-head {
    padding-block: var(--bp-space-sm) var(--bp-space-lg);
    border-bottom: 1px solid var(--bp-line);
    background: var(--bp-gradient-hero);
}

.bp-profile-head__grid {
    margin-top: var(--bp-space-sm);
    display: grid;
    /* The card is a summary of the reviews now, not a score in a box, so
       it gets room to be one. It no longer lines up with the rail below —
       that alignment is worth less than the bars fitting on one line. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 560px);
    gap: var(--bp-space-lg);
    align-items: center;
}

/* The panels below inset their text by their own padding and border; the
   masthead has no card to do that for it, so its text column takes the
   same inset and the page gets one left edge instead of two. The verdict
   card is left out on purpose: it is a card like the ones below, so its
   edge belongs on the container edge, not on the text line. */
.bp-profile-head nav,
.bp-profile-head__main {
    padding-left: calc(28px + 1px);
}

.bp-profile-head h1 {
    margin: var(--bp-space-2xs) 0 var(--bp-space-xs);
    color: var(--bp-navy);
    font-size: clamp(30px, 3.4vw, 44px);
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
    line-height: 1.06;
}

.bp-profile-head__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--bp-space-2xs) var(--bp-space-sm);
    color: var(--bp-muted);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-medium);
}

/* Two rows of this: what the business is and what it costs, then where
   it is and how to reach it. The row gap is the one the flex wrap would
   have used anyway, so a wrapped row and a split row read alike. */
.bp-profile-head__meta+.bp-profile-head__meta {
    margin-top: var(--bp-space-2xs);
}

/* Direct children only: an inner wrapper must not become a flex box of
   its own, or the comma between two category links gets the gap too. */
.bp-profile-head__meta>span {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.bp-profile-head__meta svg {
    width: 16px;
    height: 16px;
    color: var(--bp-line-control);
}

/* .bp-panel drops to --bp-space-sm down here, so the inset follows it. */
@media (max-width: 580px) {

    .bp-profile-head nav,
    .bp-profile-head__main {
        padding-left: calc(var(--bp-space-sm) + 1px);
    }
}

@media (max-width: 1060px) {
    .bp-profile-head__grid {
        grid-template-columns: minmax(0, 1fr);
        align-items: start;
        gap: var(--bp-space-sm);
    }
}

/* --- Verdict card: the score, how it is distributed, and what the
   reviews agree on. Three registers in one card, so each gets its own
   band: the numbers, then the provenance line, then the three chips. */
.bp-verdict {
    padding: 20px;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-xl);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-lg);
}

/* auto / 1fr, not two equal halves: the score column is as wide as "out
   of 5" needs and every pixel left over goes to the bars, which are the
   part that gets unreadable when it is squeezed. */
.bp-verdict__grid {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: var(--bp-space-lg);
    align-items: center;
}

.bp-verdict__score {
    text-align: center;
}

.bp-verdict__count {
    margin-top: var(--bp-space-3xs);
    color: var(--bp-body);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
}

.bp-verdict .bp-divider {
    margin-block: var(--bp-space-sm);
}

.bp-verdict__trust {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-2xs);
}

.bp-verdict__trust .bp-source {
    margin: 0;
}

.bp-verdict__more {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    font-size: var(--bp-text-xs);
}

.bp-verdict__more svg {
    width: 14px;
    height: 14px;
}

/* --- Score distribution: label, track, share ----------------------- */
.bp-histogram {
    display: grid;
    gap: 6px;
}

.bp-histogram__row {
    display: grid;
    grid-template-columns: 42px minmax(0, 1fr) 32px;
    align-items: center;
    gap: var(--bp-space-2xs);
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-bold);
}

.bp-histogram__track {
    height: 8px;
    border-radius: 999px;
    background: var(--bp-line);
}

.bp-histogram__bar {
    display: block;
    height: 100%;
    min-width: 8px;
    border-radius: inherit;
    background: var(--bp-amber);
}

.bp-histogram__value {
    color: var(--bp-body);
    text-align: right;
}

/* --- What the reviews agree on ------------------------------------ */
.bp-verdict__highlights {
    margin-top: var(--bp-space-sm);
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--bp-space-2xs);
}

.bp-highlight {
    display: flex;
    align-items: center;
    gap: var(--bp-space-2xs);
    padding: 10px 12px;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-md);
    background: var(--bp-surface);
}

.bp-highlight svg {
    width: 18px;
    height: 18px;
    flex: 0 0 18px;
    color: var(--bp-blue);
}

.bp-highlight__text {
    display: grid;
    min-width: 0;
}

.bp-highlight__label {
    color: var(--bp-navy);
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-strong);
}

.bp-highlight__note {
    color: var(--bp-muted);
    font-size: var(--bp-text-2xs);
    font-weight: var(--bp-weight-medium);
}

/* Stacked, the card would be a white slab under the name for three
   short lines, so below the breakpoint the score goes back to being a
   line and the card steps out. */
.bp-profile-head__rating {
    display: none;
}

@media (max-width: 1060px) {
    .bp-verdict {
        display: none;
    }

    .bp-profile-head__rating {
        display: flex;
        margin-bottom: var(--bp-space-xs);
    }
}

.bp-score__value {
    color: var(--bp-navy);
    font-size: 52px;
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
    line-height: 1;
}

.bp-score__scale {
    margin-bottom: var(--bp-space-2xs);
    color: var(--bp-muted);
    font-size: var(--bp-text-md);
    font-weight: var(--bp-weight-bold);
}

/* Two identical star rows on top of each other; the amber one is clipped
   to --bp-star-fill, so 4.6 shows as 4.6 and not as a rounded 5. */
.bp-stars-frac {
    position: relative;
    display: inline-block;
    font-size: var(--bp-text-xl);
    letter-spacing: 2px;
    line-height: 1;
    white-space: nowrap;
}

.bp-stars-frac__base {
    color: var(--bp-line-strong);
}

.bp-stars-frac__fill {
    position: absolute;
    inset: 0;
    width: var(--bp-star-fill);
    overflow: hidden;
    color: var(--bp-amber);
    /* The row is on screen twice; without this, copying the card copies
       ten stars. */
    user-select: none;
}

/* .bp-rating is hard-locked to 12px with no size modifier. */
.bp-rating--lg {
    margin-top: var(--bp-space-2xs);
    font-size: var(--bp-text-base);
}

.bp-rating--lg .bp-stars {
    font-size: var(--bp-text-xl);
}

/* Secondary affordances that must stay reachable: they sit in the first
   rail card, under a rule, rather than at the foot of the column. */
.bp-rail__foot {
    margin-top: var(--bp-space-sm);
    padding-top: 14px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-xs);
    border-top: 1px solid var(--bp-line);
}

/* --- Approved badge --------------------------------------------------
   The platform's own mark, so it is the one badge that is filled
   rather than tinted: among the tinted status chips it reads as the
   statement BestProsInTown is making itself. White on the brand
   gradient stays above 7:1 along its whole length. Amber is not
   available here — it belongs to the award seal. */
/* The masthead pair sits on one line and must read as one line. The DS
   badge is 11px on 4px of padding and the approved one 12px on 5px;
   side by side that half-step reads as a mistake, so up here both pills
   are cut to the same size. */
.bp-profile-head .bp-badge {
    padding: 5px 12px;
    font-size: var(--bp-text-xs);
}

/* Status as a dot, not only as text colour: --bp-success on pale green
   is legible but it takes reading to notice. currentColor means the
   closed variant gets its red for free. */
.bp-badge--dot::before {
    content: "";
    width: 8px;
    height: 8px;
    flex: 0 0 8px;
    border-radius: var(--bp-radius-pill);
    background: currentColor;
}

.bp-badge--approved {
    padding: 5px 12px;
    color: var(--bp-white);
    background: var(--bp-gradient-brand);
    box-shadow: var(--bp-shadow-sm);
    font-size: var(--bp-text-xs);
}

.bp-badge--approved svg {
    width: 14px;
    flex: 0 0 14px;
}

/* --- Award seal ------------------------------------------------------
   Rendered as it is issued today: the seal itself, no year, no category
   and no caption, opening the certificate modal that BestTops_form.js
   already builds. */
.bp-award {
    margin-top: var(--bp-space-sm);
    display: grid;
    justify-items: center;
}

.bp-rail__card {
    padding: 20px;
}

.bp-rail__card .bp-divider {
    margin-block: var(--bp-space-sm);
}

.bp-award__seal {
    --bp-seal: 116px;
    /* No ring around the seal, so the disc is the full width and the
       crop below has no border to discount. */
    --bp-seal-ring: var(--bp-seal);
    width: var(--bp-seal);
    height: var(--bp-seal);
    padding: 0;
    display: grid;
    place-items: center;
    border: 0;
    border-radius: var(--bp-radius-pill);
    background: var(--bp-white);
    cursor: pointer;
    transition: var(--bp-transition);
}

/* The ring used to carry the hover state. The shadow carries it now. */
.bp-award__seal:hover {
    box-shadow: var(--bp-shadow-md);
}

/* badgeBestPros.jpg is a 1080x960 canvas carrying an 801px seal disc
   pinned at (160, 90). Its centre is therefore (560.5, 490.5) and not
   the canvas centre (540, 480), so centring the file hung the disc off
   the ring — and height:auto squashed it into an ellipse on the way
   there. Together, the badge that was not centred.

   cover crops the canvas to a square so the disc stays a circle, at
   ring/960 per source pixel. Placing it by the disc rather than by the
   canvas means offsetting the image's corner to (ring/2 - 560.5 x
   ring/960, ring/2 - 490.5 x ring/960), which is the ring scaled by
   (480 - 560.5)/960 and (480 - 490.5)/960 below. Percentages cannot do
   the vertical half: cover leaves no slack on the axis it fitted, so
   50% there resolves to no shift at all. */
.bp-award__seal img {
    /* Sized outright rather than in percentages: a percentage height
       inside a <button> has no definite box to resolve against, and
       leaving height to the img's own height attribute would drop the
       square this crop depends on. */
    width: var(--bp-seal-ring);
    height: var(--bp-seal-ring);
    display: block;
    object-fit: cover;
    object-position:
        calc(var(--bp-seal-ring) * -80.5 / 960) calc(var(--bp-seal-ring) * -10.5 / 960);
    border-radius: var(--bp-radius-pill);
}

/* --- Provenance line ---------------------------------------------- */
.bp-source {
    display: flex;
    align-items: center;
    gap: 7px;
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

.bp-source svg {
    width: 14px;
    height: 14px;
    flex: 0 0 14px;
}

/* Multi-line provenance: the icon belongs on the first line, not
   centred against the whole block. */
.bp-source--block {
    align-items: flex-start;
}

.bp-source--block svg {
    margin-top: 3px;
}

/* .bp-btn sizes its own svg; .bp-text-link does not, so an inline icon
   inflates to the container width. */
.bp-scope .bp-text-link {
    display: inline-flex;
    align-items: center;
    gap: 7px;
}

.bp-scope .bp-text-link svg {
    width: 16px;
    height: 16px;
    flex: 0 0 16px;
}

/* --- Panel head ---------------------------------------------------- */
.bp-panel__head {
    margin-bottom: var(--bp-space-sm);
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--bp-space-sm);
}

.bp-panel__head h2 {
    margin: 0;
    color: var(--bp-navy);
    font-size: var(--bp-text-2xl);
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
}

/* --- Prose wrapper for the opaque reviews_summaries blob ----------- */
.bp-prose {
    color: var(--bp-body);
    font-size: var(--bp-text-md);
    line-height: var(--bp-leading-relaxed);
}

.bp-prose p {
    margin: 0 0 var(--bp-space-xs);
}

.bp-prose> :last-child {
    margin-bottom: 0;
}

/* --- Review card, profile variant ---------------------------------
   .bp-review carries the BUSINESS identity — redundant on that
   business's own profile. This one is unattributed: a date and a
   score above the text, and nothing that names anybody. */
.bp-review--profile {
    display: grid;
    gap: var(--bp-space-xs);
}

.bp-review--profile blockquote {
    -webkit-line-clamp: unset;
    display: block;
    overflow: visible;
    font-size: var(--bp-text-md);
}

.bp-review__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-xs);
}

.bp-review__date {
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

/* .bp-rating carries a margin-top for the stacked case; on this row it
   is the second half of a baseline pair and must not drop below it. */
.bp-review__head .bp-rating {
    margin: 0;
}

/* --- Hours --------------------------------------------------------- */
.bp-hours {
    display: grid;
    gap: 2px;
}

.bp-hours__row {
    padding: 9px var(--bp-space-xs);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-sm);
    border-radius: var(--bp-radius-xs);
    font-size: var(--bp-text-base);
}

.bp-hours__day {
    color: var(--bp-body);
}

.bp-hours__time {
    color: var(--bp-ink);
    font-weight: var(--bp-weight-medium);
    font-variant-numeric: tabular-nums;
}

.bp-hours__row.is-today {
    background: var(--bp-blue-50);
}

.bp-hours__row.is-today .bp-hours__day,
.bp-hours__row.is-today .bp-hours__time {
    color: var(--bp-navy);
    font-weight: var(--bp-weight-strong);
}

.bp-hours__row.is-closed .bp-hours__time {
    color: var(--bp-muted);
}

/* --- Checklist ------------------------------------------------------
   .bp-scope applies no list reset, and the only checklist in the
   system is hard-scoped inside .bp-price. */
.bp-checklist {
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 10px var(--bp-space-md);
    list-style: none;
}

.bp-checklist li {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    color: var(--bp-body);
    font-size: var(--bp-text-base);
}

.bp-checklist svg {
    width: 18px;
    height: 18px;
    flex: 0 0 18px;
    margin-top: 2px;
    color: var(--bp-success);
}

/* --- Ratio-locked media --------------------------------------------
   Every media surface in the system is a fixed pixel height. */
.bp-media {
    position: relative;
    display: block;
    overflow: hidden;
    border-radius: var(--bp-radius-md);
    background: var(--bp-gradient-media);
}

.bp-media--1x1 {
    aspect-ratio: 1 / 1;
}

.bp-media--16x9 {
    aspect-ratio: 16 / 9;
}

.bp-media img,
.bp-media iframe {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
    border: 0;
}

/* --- Photo collage ---------------------------------------------------
   The profile photo block is one generated collage image with an
   <area> per photo, so a click lands on that exact photo in the
   gallery. The image therefore must scale PROPORTIONALLY: resizeMap()
   rescales every area's coords from the rendered width against
   data-original-width, so object-fit:cover or a max-height would move
   the hit areas away from what they sit on. width:100%/height:auto and
   nothing else. */
.bp-collage {
    position: relative;
    overflow: hidden;
    border-radius: var(--bp-radius-md);
    background: var(--bp-gradient-media);
}

.bp-collage img {
    width: 100%;
    height: auto;
    display: block;
}

.bp-collage area {
    cursor: zoom-in;
}

/* Sits over the collage, so it must not intercept clicks meant for the
   image map — only the button itself is clickable. */
.bp-collage__overlay {
    position: absolute;
    inset: auto 0 0 0;
    padding: var(--bp-space-sm);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-2xs);
    background: linear-gradient(180deg, transparent, rgba(13, 34, 79, .72));
    pointer-events: none;
}

.bp-collage__overlay>* {
    pointer-events: auto;
}

.bp-collage__btn {
    min-height: 38px;
    padding: 0 14px;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    border: 1px solid rgba(255, 255, 255, .7);
    border-radius: var(--bp-radius-sm);
    color: var(--bp-white);
    background: rgba(16, 42, 102, .5);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    font: inherit;
    font-size: var(--bp-text-sm);
    font-weight: var(--bp-weight-strong);
    text-decoration: none;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-collage__btn:hover {
    color: var(--bp-white);
    background: rgba(16, 42, 102, .78);
}

.bp-collage__btn svg {
    width: 16px;
    height: 16px;
    flex: 0 0 16px;
}

/* --- Link row (nearby businesses) ----------------------------------- */
.bp-linkrow {
    padding: var(--bp-space-xs);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-sm);
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-md);
    background: var(--bp-white);
    text-decoration: none;
    transition: var(--bp-transition);
}

.bp-linkrow:hover {
    border-color: var(--bp-line-strong);
    background: var(--bp-blue-50);
}

.bp-linkrow strong {
    display: block;
    color: var(--bp-navy);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
}

.bp-linkrow span {
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

.bp-linkrow .bp-rating {
    margin: 6px 0 0;
}

.bp-linkrow svg {
    width: 20px;
    height: 20px;
    flex: 0 0 20px;
    color: var(--bp-line-control);
}

/* --- Fixed mobile action bar ----------------------------------------- */
.bp-actionbar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--bp-z-actionbar);
    display: none;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--bp-space-2xs);
    padding: 10px var(--bp-space-sm) calc(10px + env(safe-area-inset-bottom, 0px));
    border-top: 1px solid var(--bp-line);
    background: rgba(255, 255, 255, .96);
    -webkit-backdrop-filter: blur(18px);
    backdrop-filter: blur(18px);
}

@media (max-width: 1060px) {
    .bp-actionbar {
        display: grid;
    }

    .bp-page {
        padding-bottom: 84px;
    }
}

/* --- Page band ------------------------------------------------------- */
.bp-page {
    padding-block: var(--bp-space-lg) var(--bp-space-xl);
    background: var(--bp-surface);
}

.bp-anchor {
    scroll-margin-top: var(--bp-stick);
}



/* --- Dialogs ---------------------------------------------------------
   .bp-dialog ships without a height cap. A review form with a photo
   list is the first thing in the system tall enough to need one, so
   this is proposed as an addition to the component, not a local patch.
   <dialog> handles Esc, focus trapping and the top layer itself. */
.bp-dialog {
    max-height: min(88vh, 760px);
    overflow: auto;
}

.bp-dialog__head .bp-help {
    margin: 4px 0 0;
}

.bp-dialog__sub {
    margin: 0 0 var(--bp-space-sm);
}

/* The browser's own rule for [hidden] is display:none at element weight, so any
   component that declares a display of its own outranks it and a script hiding
   that element achieves nothing. It has caught the review error and the photo
   picker's drop target already, and .bp-accordion__panel above carries its own
   patch for the same reason. Hence the one !important in this file: hidden has
   to mean hidden whatever a component says. */
[hidden] {
    display: none !important;
}

/* A qualifier inside a label is not part of the label. */
.bp-label .bp-help {
    font-weight: var(--bp-weight-medium);
}

/* --- Star rating input -----------------------------------------------
   The radios are in DOM order 5 to 1 so a plain sibling selector can
   fill every star below the one being pointed at; row-reverse puts 1 on
   the left again on screen. The input is hidden, never display:none,
   or the keyboard loses it. */
.bp-rating-input {
    display: inline-flex;
    flex-direction: row-reverse;
    justify-content: flex-end;
    gap: 4px;
}

.bp-rating-input__radio {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
}

.bp-rating-input__star {
    color: var(--bp-line-strong);
    font-size: 34px;
    line-height: 1;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-rating-input__star::before {
    content: "\2605";
}

.bp-rating-input__radio:checked~.bp-rating-input__star {
    color: var(--bp-amber);
}

/* Pointing at a star previews that score, so the committed one clears out
   of the way while the pointer is over the row. Both rules below are then
   scoped to that same hover: .bp-rating-input:hover .bp-rating-input__star
   is three components, and .bp-rating-input__star:hover on its own is two,
   so the reset would outweigh it and the star under the pointer would be
   the one star that stayed grey. */
.bp-rating-input:hover .bp-rating-input__star {
    color: var(--bp-line-strong);
}

.bp-rating-input:hover .bp-rating-input__star:hover,
.bp-rating-input:hover .bp-rating-input__star:hover~.bp-rating-input__star {
    color: var(--bp-amber);
}

.bp-rating-input__radio:focus-visible+.bp-rating-input__star {
    outline: 2px solid var(--bp-blue);
    outline-offset: 3px;
    border-radius: 4px;
}

/* --- Photo picker ----------------------------------------------------
   One drop target over one input that takes several files at once. What
   has been picked shows as a row of thumbnails, each with its own remove
   control; the page script holds the list and puts the file_1..file_5
   names on the request at submit. The drop target is hidden once the cap
   is reached and comes back as soon as something is removed. */
.bp-uploader {
    display: grid;
    gap: var(--bp-space-2xs);
}

.bp-uploader__input {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
}

.bp-uploader__drop {
    display: grid;
    justify-items: center;
    gap: 2px;
    padding: 18px;
    border: 1px dashed var(--bp-line-control);
    border-radius: var(--bp-radius-md);
    color: var(--bp-navy);
    background: var(--bp-surface);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-strong);
    text-align: center;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-uploader__drop:hover {
    border-color: var(--bp-blue);
    background: var(--bp-blue-50);
}

.bp-uploader__drop svg {
    width: 22px;
    height: 22px;
    color: var(--bp-blue);
}

.bp-uploader:has(.bp-uploader__input:focus-visible) .bp-uploader__drop {
    outline: 2px solid var(--bp-blue);
    outline-offset: 2px;
}

.bp-uploader__thumbs {
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--bp-space-2xs);
    list-style: none;
}

.bp-uploader__thumb {
    position: relative;
    width: 64px;
    height: 64px;
    overflow: hidden;
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-sm);
}

.bp-uploader__thumb img {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
}

/* Sits on the picture, which is why it carries its own dark ground rather
   than borrowing a surface token: it has to hold against any photo. */
.bp-uploader__remove {
    position: absolute;
    top: 3px;
    right: 3px;
    width: 22px;
    height: 22px;
    padding: 0;
    display: grid;
    place-items: center;
    color: var(--bp-white);
    background: rgba(16, 42, 102, .72);
    border: 0;
    border-radius: 50%;
    cursor: pointer;
    transition: var(--bp-transition);
}

.bp-uploader__remove svg {
    width: 14px;
    height: 14px;
}

.bp-uploader__remove:hover {
    background: var(--bp-danger);
}

.bp-uploader__remove:focus-visible {
    outline: 2px solid var(--bp-white);
    outline-offset: -3px;
}

.bp-fieldset legend .bp-required {
    color: var(--bp-danger);
}

/* --- Spacing modifiers ------------------------------------------------
   The proposal carried these as style attributes. They are one-property
   rules, but a one-property rule is still the stylesheet's business. */
.bp-actions--spaced {
    margin-top: var(--bp-space-sm);
}

.bp-stack--spaced {
    margin-top: var(--bp-space-xs);
}

.bp-text--spaced {
    margin: var(--bp-space-sm) 0 0;
}

.bp-meta--spaced {
    margin: 6px 0 0;
}

.bp-source__lead {
    color: var(--bp-ink);
}

/* A badge can be a link — today's hours jump to the hours table — and the
   link reset in the theme would otherwise underline it. */
a.bp-badge,
a.bp-badge:link,
a.bp-badge:visited,
a.bp-badge:hover {
    text-decoration: none;
}

/* --- Photo grid -------------------------------------------------------
   What the Photos panel falls back to when no collage was generated for
   this business. auto-fill rather than a fixed count: the panel is the
   full width on a phone and two thirds of it on a desktop. */
.bp-photo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: var(--bp-space-2xs);
}

.bp-photo-grid__item {
    aspect-ratio: 4 / 3;
    overflow: hidden;
    border-radius: var(--bp-radius-md);
    background: var(--bp-surface);
}

.bp-photo-grid__item img {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
    transition: var(--bp-transition);
}

.bp-photo-grid__item:hover img {
    transform: scale(1.03);
}

/* --- Cookie banner ----------------------------------------------------
   popup.js toggles .active on #checkUPcookies and reads it back to decide
   whether consent is still outstanding, so the class is the switch: the
   banner is not in the layout until it is added. */
.footer_banner {
    position: fixed;
    left: 50%;
    bottom: var(--bp-space-sm);
    z-index: var(--bp-z-dialog);
    width: min(calc(100% - 32px), 560px);
    padding: var(--bp-space-sm);
    display: none;
    align-items: center;
    justify-content: space-between;
    gap: var(--bp-space-sm);
    transform: translateX(-50%);
    border: 1px solid var(--bp-line);
    border-radius: var(--bp-radius-xl);
    background: var(--bp-white);
    box-shadow: var(--bp-shadow-xl);
}

.footer_banner.active {
    display: flex;
}

.footer_banner__text {
    margin: 0;
    color: var(--bp-body);
    font-size: var(--bp-text-xs);
}

@media (max-width: 580px) {
    .footer_banner {
        flex-direction: column;
        align-items: stretch;
    }

    /* The bar is pinned to the same edge; above it, not under it. */
    .bp-actionbar~.footer_banner {
        bottom: 84px;
    }
}

/* --- Ad slot ----------------------------------------------------------
   Carried over from the page as it shipped, unchanged: the two heights are
   what the units are booked at and are not this stylesheet's to revise. Two
   of the slots sit in .bp-layout__main and the third in .bp-rail, and both
   columns space them like any other block.

   ads.js writes an <ins class="adsbygoogle ads|ads2"> into each slot, and
   the first of the three carries no data-ad-format, so AdSense sizes it from
   whatever CSS gives the <ins>. Every other page that runs ads.js carries a
   .ads rule of its own — the legacy views inline it, cssTmp/theme.css has the
   same one — and this page loads none of them, so that unit measured zero
   wide and AdSense filled it with its smallest fallback. The size those
   sheets give the two classes therefore has to live here too: same numbers,
   same breakpoint. */
.google-ads,
.google-ads iframe {
    min-height: 250px;
}

/* AdSense sizes a responsive unit from the viewport rather than from the
   box it was given, so a creative can come back wider than the slot. The
   frame it arrives in is held to the slot's width; the <ins> is left alone,
   because a full-width responsive unit sets its own width and pulls itself
   to the edge of the screen with a negative margin, and that one is meant
   to be wider than the column. */
.google-ads {
    max-width: 100%;
}

.google-ads iframe {
    max-width: 100%;
}

/* Nothing came back for this slot: AdSense marks it and hides the <ins>,
   and without this the height reserved for the unit stays behind as a
   blank band — 250px of it on a phone, per slot. */
.google-ads:has(ins[data-ad-status="unfilled"]) {
    min-height: 0;
}

.google-ads .ads,
.google-ads .ads2 {
    display: block;
    width: 100%;
    height: 250px;
}

@media (min-width: 768px) {

    .google-ads,
    .google-ads iframe {
        min-height: 90px;
    }

    .google-ads .ads,
    .google-ads .ads2 {
        height: 90px;
    }
}

/* --- Script-built modals ----------------------------------------------
   BestTops_form.js inserts the report form and the certificate form after
   <footer> on load, and popup.js drops its "Thank You" box in the same
   way. All three are .modal, all three used to be dressed by
   cssTmp/modal.css, and this page does not load that file any more, so
   the certificate form rendered as a plain block under the footer.

   The markup belongs to those scripts and is not this stylesheet's to
   change; everything here is scoped under .modal and does the two things
   the scripts assume: hidden until one of them sets display, and a dialog
   when they do. #set_report ships with display:none of its own and is not
   opened from the profile, so its date and time controls are left as the
   browser renders them. */
.modal {
    position: fixed;
    inset: 0;
    z-index: var(--bp-z-dialog);
    display: none;
    align-items: center;
    justify-content: center;
    padding: var(--bp-space-sm);
    overflow: auto;
    background: rgba(16, 42, 102, .45);
}

.modal .set_report,
.modal .set_report_badge,
.modal .thxBadge,
.modal .popup {
    position: relative;
    width: min(100%, 560px);
    max-height: calc(100vh - 32px);
    padding: 28px;
    overflow: auto;
    color: var(--bp-ink);
    background: var(--bp-white);
    border-radius: var(--bp-radius-xl);
    box-shadow: var(--bp-shadow-xl);
    font-family: var(--bp-font);
}

/* Shown by the script once the form has been sent. */
.modal .thxBadge {
    display: none;
    color: var(--bp-navy);
    font-weight: var(--bp-weight-bold);
    text-align: center;
}

.modal .reviev_title h3 {
    margin: 0 0 4px;
    color: var(--bp-navy);
    font-size: var(--bp-text-2xl);
    font-weight: var(--bp-weight-black);
    letter-spacing: var(--bp-tracking-tight);
}

.modal .reviev_title p {
    margin: 0;
    color: var(--bp-muted);
    font-size: var(--bp-text-xs);
}

.modal .congrats {
    display: block;
    color: var(--bp-navy);
    font-size: var(--bp-text-md);
    font-weight: var(--bp-weight-strong);
}

.modal .groupe-report {
    margin-top: var(--bp-space-sm);
    display: grid;
    gap: 6px;
}

.modal .groupe-report_left span {
    color: #35445b;
    font-size: var(--bp-text-xs);
    font-weight: var(--bp-weight-strong);
}

.modal input[type="text"],
.modal input[type="email"],
.modal textarea {
    width: 100%;
    min-height: 48px;
    padding: 12px 14px;
    color: var(--bp-ink);
    background: var(--bp-white);
    border: 1px solid var(--bp-line-control);
    border-radius: var(--bp-radius-sm);
    font-family: var(--bp-font);
    font-size: var(--bp-text-base);
}

.modal textarea {
    min-height: 110px;
    resize: vertical;
}

.modal input[type="text"]:focus,
.modal input[type="email"]:focus,
.modal textarea:focus {
    outline: none;
    border-color: var(--bp-focus-color);
    box-shadow: var(--bp-focus-ring);
}

.modal .permanentli {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--bp-body);
    font-size: var(--bp-text-base);
}

.modal .permanentli input {
    width: 20px;
    height: 20px;
    margin: 0;
    accent-color: var(--bp-blue);
}

.modal .send-wrap {
    margin-top: var(--bp-space-md);
    display: flex;
    justify-content: flex-end;
}

.modal .btn {
    min-height: 44px;
    padding: 0 22px;
    color: var(--bp-white);
    background: var(--bp-blue);
    border: 0;
    border-radius: var(--bp-radius-pill);
    font-family: var(--bp-font);
    font-size: var(--bp-text-base);
    font-weight: var(--bp-weight-black);
    cursor: pointer;
    transition: var(--bp-transition);
}

.modal .btn:hover {
    background: var(--bp-blue-hover);
}

/* The close control is two bare spans; the cross is made here. */
.modal .close-modal {
    position: absolute;
    top: 18px;
    right: 18px;
    width: 32px;
    height: 32px;
    cursor: pointer;
}

.modal .close-modal span {
    position: absolute;
    top: 15px;
    left: 6px;
    width: 20px;
    height: 2px;
    background: var(--bp-muted);
    border-radius: 2px;
}

.modal .cris {
    transform: rotate(45deg);
}

.modal .cros {
    transform: rotate(-45deg);
}
